Quellcode durchsuchen

* properly determine the operand size for inline assembler references to procvar
variables without a manually specified size override such as 'dword ptr'.
Mantis #29010.

git-svn-id: trunk@32379 -

nickysn vor 9 Jahren
Ursprung
Commit
ba66456bdb
5 geänderte Dateien mit 783 neuen und 0 gelöschten Zeilen
  1. 3 0
      .gitattributes
  2. 1 0
      compiler/rautils.pas
  3. 260 0
      tests/webtbs/tw29010a.pp
  4. 260 0
      tests/webtbs/tw29010b.pp
  5. 259 0
      tests/webtbs/tw29010c.pp

+ 3 - 0
.gitattributes

@@ -14840,6 +14840,9 @@ tests/webtbs/tw2892.pp svneol=native#text/plain
 tests/webtbs/tw28934.pp svneol=native#text/plain
 tests/webtbs/tw2897.pp svneol=native#text/plain
 tests/webtbs/tw2899.pp svneol=native#text/plain
+tests/webtbs/tw29010a.pp svneol=native#text/plain
+tests/webtbs/tw29010b.pp svneol=native#text/plain
+tests/webtbs/tw29010c.pp svneol=native#text/plain
 tests/webtbs/tw2904.pp svneol=native#text/plain
 tests/webtbs/tw29040.pp svneol=native#text/plain
 tests/webtbs/tw2908.pp svneol=native#text/plain

+ 1 - 0
compiler/rautils.pas

@@ -842,6 +842,7 @@ Begin
           orddef,
           enumdef,
           pointerdef,
+          procvardef,
           floatdef :
             SetSize(tabstractvarsym(sym).getsize,false);
           arraydef :

+ 260 - 0
tests/webtbs/tw29010a.pp

@@ -0,0 +1,260 @@
+{ %cpu=i386 }
+program tw29010a;
+
+{$ifdef fpc}
+  {$asmmode intel}
+{$else fpc}
+  {$apptype console}
+{$endif fpc}
+
+var
+  Error: Boolean;
+
+  esp_initial: longint;
+  esp_after_push: longint;
+  esp_final: longint;
+
+  global_proc: procedure;
+  global_word: word;
+  global_longint: longint;
+
+procedure check_esps(bytes: longint);
+begin
+  if (esp_initial - esp_after_push) <> bytes then
+  begin
+    Writeln('Wrong push size, expected ', bytes, ', got ', esp_initial - esp_after_push);
+    Error := True;
+  end;
+  if (esp_final - esp_after_push) <> bytes then
+  begin
+    Writeln('Wrong pop size, expected ', bytes, ', got ', esp_final - esp_after_push);
+    Error := True;
+  end;
+end;
+
+procedure check_word;
+begin
+  check_esps(2);
+end;
+
+procedure check_dword;
+begin
+  check_esps(4);
+end;
+
+procedure testproc;
+var
+  local_proc: procedure;
+  local_word: word;
+  local_longint: longint;
+begin
+  Writeln('testing push/pop global_proc');
+  asm
+    mov esp_initial, esp
+    push global_proc
+    mov esp_after_push, esp
+    pop global_proc
+    mov esp_final, esp
+    mov esp, esp_initial
+    call check_dword
+  end;
+
+  Writeln('testing push/pop word [global_proc]');
+  asm
+    mov esp_initial, esp
+    push word [global_proc]
+    mov esp_after_push, esp
+    pop word [global_proc]
+    mov esp_final, esp
+    mov esp, esp_initial
+    call check_word
+  end;
+  
+  Writeln('testing push/pop word ptr global_proc');
+  asm
+    mov esp_initial, esp
+    push word ptr global_proc
+    mov esp_after_push, esp
+    pop word ptr global_proc
+    mov esp_final, esp
+    mov esp, esp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr [global_proc]');
+  asm
+    mov esp_initial, esp
+    push word ptr [global_proc]
+    mov esp_after_push, esp
+    pop word ptr [global_proc]
+    mov esp_final, esp
+    mov esp, esp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop global_word');
+  asm
+    mov esp_initial, esp
+    push global_word
+    mov esp_after_push, esp
+    pop global_word
+    mov esp_final, esp
+    mov esp, esp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop global_longint');
+  asm
+    mov esp_initial, esp
+    push global_longint
+    mov esp_after_push, esp
+    pop global_longint
+    mov esp_final, esp
+    mov esp, esp_initial
+    call check_dword
+  end;
+
+  Writeln('testing push/pop word [global_longint]');
+  asm
+    mov esp_initial, esp
+    push word [global_longint]
+    mov esp_after_push, esp
+    pop word [global_longint]
+    mov esp_final, esp
+    mov esp, esp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr global_longint');
+  asm
+    mov esp_initial, esp
+    push word ptr global_longint
+    mov esp_after_push, esp
+    pop word ptr global_longint
+    mov esp_final, esp
+    mov esp, esp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr [global_longint]');
+  asm
+    mov esp_initial, esp
+    push word ptr [global_longint]
+    mov esp_after_push, esp
+    pop word ptr [global_longint]
+    mov esp_final, esp
+    mov esp, esp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop local_proc');
+  asm
+    mov esp_initial, esp
+    push local_proc
+    mov esp_after_push, esp
+    pop local_proc
+    mov esp_final, esp
+    mov esp, esp_initial
+    call check_dword
+  end;
+
+  Writeln('testing push/pop word [local_proc]');
+  asm
+    mov esp_initial, esp
+    push word [local_proc]
+    mov esp_after_push, esp
+    pop word [local_proc]
+    mov esp_final, esp
+    mov esp, esp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr local_proc');
+  asm
+    mov esp_initial, esp
+    push word ptr local_proc
+    mov esp_after_push, esp
+    pop word ptr local_proc
+    mov esp_final, esp
+    mov esp, esp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr [local_proc]');
+  asm
+    mov esp_initial, esp
+    push word ptr [local_proc]
+    mov esp_after_push, esp
+    pop word ptr [local_proc]
+    mov esp_final, esp
+    mov esp, esp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop local_word');
+  asm
+    mov esp_initial, esp
+    push local_word
+    mov esp_after_push, esp
+    pop local_word
+    mov esp_final, esp
+    mov esp, esp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop local_longint');
+  asm
+    mov esp_initial, esp
+    push local_longint
+    mov esp_after_push, esp
+    pop local_longint
+    mov esp_final, esp
+    mov esp, esp_initial
+    call check_dword
+  end;
+
+  Writeln('testing push/pop word [local_longint]');
+  asm
+    mov esp_initial, esp
+    push word [local_longint]
+    mov esp_after_push, esp
+    pop word [local_longint]
+    mov esp_final, esp
+    mov esp, esp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr local_longint');
+  asm
+    mov esp_initial, esp
+    push word ptr local_longint
+    mov esp_after_push, esp
+    pop word ptr local_longint
+    mov esp_final, esp
+    mov esp, esp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr [local_longint]');
+  asm
+    mov esp_initial, esp
+    push word ptr [local_longint]
+    mov esp_after_push, esp
+    pop word ptr [local_longint]
+    mov esp_final, esp
+    mov esp, esp_initial
+    call check_word
+  end;
+end;
+
+begin
+  Error := False;
+  testproc;
+  if Error then
+  begin
+    Writeln('Errors found!');
+    Halt(1);
+  end
+  else
+    Writeln('Ok!');
+end.

+ 260 - 0
tests/webtbs/tw29010b.pp

@@ -0,0 +1,260 @@
+{ %cpu=x86_64 }
+program tw29010b;
+
+{$ifdef fpc}
+  {$asmmode intel}
+{$else fpc}
+  {$apptype console}
+{$endif}
+
+var
+  Error: Boolean;
+
+  rsp_initial: qword;
+  rsp_after_push: qword;
+  rsp_final: qword;
+
+  global_proc: procedure;
+  global_word: word;
+  global_int64: int64;
+
+procedure check_rsps(bytes: int64);
+begin
+  if (rsp_initial - rsp_after_push) <> bytes then
+  begin
+    Writeln('Wrong push size, expected ', bytes, ', got ', rsp_initial - rsp_after_push);
+    Error := True;
+  end;
+  if (rsp_final - rsp_after_push) <> bytes then
+  begin
+    Writeln('Wrong pop size, expected ', bytes, ', got ', rsp_final - rsp_after_push);
+    Error := True;
+  end;
+end;
+
+procedure check_word;
+begin
+  check_rsps(2);
+end;
+
+procedure check_qword;
+begin
+  check_rsps(8);
+end;
+
+procedure testproc;
+var
+  local_proc: procedure;
+  local_word: word;
+  local_int64: int64;
+begin
+  Writeln('testing push/pop global_proc');
+  asm
+    mov rsp_initial, rsp
+    push global_proc
+    mov rsp_after_push, rsp
+    pop global_proc
+    mov rsp_final, rsp
+    mov rsp, rsp_initial
+    call check_qword
+  end;
+
+  Writeln('testing push/pop word [global_proc]');
+  asm
+    mov rsp_initial, rsp
+    push word [global_proc]
+    mov rsp_after_push, rsp
+    pop word [global_proc]
+    mov rsp_final, rsp
+    mov rsp, rsp_initial
+    call check_word
+  end;
+  
+  Writeln('testing push/pop word ptr global_proc');
+  asm
+    mov rsp_initial, rsp
+    push word ptr global_proc
+    mov rsp_after_push, rsp
+    pop word ptr global_proc
+    mov rsp_final, rsp
+    mov rsp, rsp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr [global_proc]');
+  asm
+    mov rsp_initial, rsp
+    push word ptr [global_proc]
+    mov rsp_after_push, rsp
+    pop word ptr [global_proc]
+    mov rsp_final, rsp
+    mov rsp, rsp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop global_word');
+  asm
+    mov rsp_initial, rsp
+    push global_word
+    mov rsp_after_push, rsp
+    pop global_word
+    mov rsp_final, rsp
+    mov rsp, rsp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop global_int64');
+  asm
+    mov rsp_initial, rsp
+    push global_int64
+    mov rsp_after_push, rsp
+    pop global_int64
+    mov rsp_final, rsp
+    mov rsp, rsp_initial
+    call check_qword
+  end;
+
+  Writeln('testing push/pop word [global_int64]');
+  asm
+    mov rsp_initial, rsp
+    push word [global_int64]
+    mov rsp_after_push, rsp
+    pop word [global_int64]
+    mov rsp_final, rsp
+    mov rsp, rsp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr global_int64');
+  asm
+    mov rsp_initial, rsp
+    push word ptr global_int64
+    mov rsp_after_push, rsp
+    pop word ptr global_int64
+    mov rsp_final, rsp
+    mov rsp, rsp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr [global_int64]');
+  asm
+    mov rsp_initial, rsp
+    push word ptr [global_int64]
+    mov rsp_after_push, rsp
+    pop word ptr [global_int64]
+    mov rsp_final, rsp
+    mov rsp, rsp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop local_proc');
+  asm
+    mov rsp_initial, rsp
+    push local_proc
+    mov rsp_after_push, rsp
+    pop local_proc
+    mov rsp_final, rsp
+    mov rsp, rsp_initial
+    call check_qword
+  end;
+
+  Writeln('testing push/pop word [local_proc]');
+  asm
+    mov rsp_initial, rsp
+    push word [local_proc]
+    mov rsp_after_push, rsp
+    pop word [local_proc]
+    mov rsp_final, rsp
+    mov rsp, rsp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr local_proc');
+  asm
+    mov rsp_initial, rsp
+    push word ptr local_proc
+    mov rsp_after_push, rsp
+    pop word ptr local_proc
+    mov rsp_final, rsp
+    mov rsp, rsp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr [local_proc]');
+  asm
+    mov rsp_initial, rsp
+    push word ptr [local_proc]
+    mov rsp_after_push, rsp
+    pop word ptr [local_proc]
+    mov rsp_final, rsp
+    mov rsp, rsp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop local_word');
+  asm
+    mov rsp_initial, rsp
+    push local_word
+    mov rsp_after_push, rsp
+    pop local_word
+    mov rsp_final, rsp
+    mov rsp, rsp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop local_int64');
+  asm
+    mov rsp_initial, rsp
+    push local_int64
+    mov rsp_after_push, rsp
+    pop local_int64
+    mov rsp_final, rsp
+    mov rsp, rsp_initial
+    call check_qword
+  end;
+
+  Writeln('testing push/pop word [local_int64]');
+  asm
+    mov rsp_initial, rsp
+    push word [local_int64]
+    mov rsp_after_push, rsp
+    pop word [local_int64]
+    mov rsp_final, rsp
+    mov rsp, rsp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr local_int64');
+  asm
+    mov rsp_initial, rsp
+    push word ptr local_int64
+    mov rsp_after_push, rsp
+    pop word ptr local_int64
+    mov rsp_final, rsp
+    mov rsp, rsp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr [local_int64]');
+  asm
+    mov rsp_initial, rsp
+    push word ptr [local_int64]
+    mov rsp_after_push, rsp
+    pop word ptr [local_int64]
+    mov rsp_final, rsp
+    mov rsp, rsp_initial
+    call check_word
+  end;
+end;
+
+begin
+  Error := False;
+  testproc;
+  if Error then
+  begin
+    Writeln('Errors found!');
+    Halt(1);
+  end
+  else
+    Writeln('Ok!');
+end.

+ 259 - 0
tests/webtbs/tw29010c.pp

@@ -0,0 +1,259 @@
+{ %cpu=i8086 }
+program tw29010c;
+
+var
+  Error: Boolean;
+
+  sp_initial: word;
+  sp_after_push: word;
+  sp_final: word;
+
+  global_proc: procedure;
+  global_word: word;
+  global_longint: longint;
+
+procedure check_esps(bytes: word);
+begin
+  if (sp_initial - sp_after_push) <> bytes then
+  begin
+    Writeln('Wrong push size, expected ', bytes, ', got ', sp_initial - sp_after_push);
+    Error := True;
+  end;
+  if (sp_final - sp_after_push) <> bytes then
+  begin
+    Writeln('Wrong pop size, expected ', bytes, ', got ', sp_final - sp_after_push);
+    Error := True;
+  end;
+end;
+
+procedure check_word;
+begin
+  check_esps(2);
+end;
+
+procedure check_dword;
+begin
+  check_esps(4);
+end;
+
+procedure check_proc;
+begin
+  check_esps(SizeOf(global_proc));
+end;
+
+procedure testproc;
+var
+  local_proc: procedure;
+  local_word: word;
+  local_longint: longint;
+begin
+  Writeln('testing push/pop global_proc');
+  asm
+    mov sp_initial, sp
+    push global_proc
+    mov sp_after_push, sp
+    pop global_proc
+    mov sp_final, sp
+    mov sp, sp_initial
+    call check_proc
+  end;
+
+  Writeln('testing push/pop word [global_proc]');
+  asm
+    mov sp_initial, sp
+    push word [global_proc]
+    mov sp_after_push, sp
+    pop word [global_proc]
+    mov sp_final, sp
+    mov sp, sp_initial
+    call check_word
+  end;
+  
+  Writeln('testing push/pop word ptr global_proc');
+  asm
+    mov sp_initial, sp
+    push word ptr global_proc
+    mov sp_after_push, sp
+    pop word ptr global_proc
+    mov sp_final, sp
+    mov sp, sp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr [global_proc]');
+  asm
+    mov sp_initial, sp
+    push word ptr [global_proc]
+    mov sp_after_push, sp
+    pop word ptr [global_proc]
+    mov sp_final, sp
+    mov sp, sp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop global_word');
+  asm
+    mov sp_initial, sp
+    push global_word
+    mov sp_after_push, sp
+    pop global_word
+    mov sp_final, sp
+    mov sp, sp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop global_longint');
+  asm
+    mov sp_initial, sp
+    push global_longint
+    mov sp_after_push, sp
+    pop global_longint
+    mov sp_final, sp
+    mov sp, sp_initial
+    call check_dword
+  end;
+
+  Writeln('testing push/pop word [global_longint]');
+  asm
+    mov sp_initial, sp
+    push word [global_longint]
+    mov sp_after_push, sp
+    pop word [global_longint]
+    mov sp_final, sp
+    mov sp, sp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr global_longint');
+  asm
+    mov sp_initial, sp
+    push word ptr global_longint
+    mov sp_after_push, sp
+    pop word ptr global_longint
+    mov sp_final, sp
+    mov sp, sp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr [global_longint]');
+  asm
+    mov sp_initial, sp
+    push word ptr [global_longint]
+    mov sp_after_push, sp
+    pop word ptr [global_longint]
+    mov sp_final, sp
+    mov sp, sp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop local_proc');
+  asm
+    mov sp_initial, sp
+    push local_proc
+    mov sp_after_push, sp
+    pop local_proc
+    mov sp_final, sp
+    mov sp, sp_initial
+    call check_proc
+  end;
+
+  Writeln('testing push/pop word [local_proc]');
+  asm
+    mov sp_initial, sp
+    push word [local_proc]
+    mov sp_after_push, sp
+    pop word [local_proc]
+    mov sp_final, sp
+    mov sp, sp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr local_proc');
+  asm
+    mov sp_initial, sp
+    push word ptr local_proc
+    mov sp_after_push, sp
+    pop word ptr local_proc
+    mov sp_final, sp
+    mov sp, sp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr [local_proc]');
+  asm
+    mov sp_initial, sp
+    push word ptr [local_proc]
+    mov sp_after_push, sp
+    pop word ptr [local_proc]
+    mov sp_final, sp
+    mov sp, sp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop local_word');
+  asm
+    mov sp_initial, sp
+    push local_word
+    mov sp_after_push, sp
+    pop local_word
+    mov sp_final, sp
+    mov sp, sp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop local_longint');
+  asm
+    mov sp_initial, sp
+    push local_longint
+    mov sp_after_push, sp
+    pop local_longint
+    mov sp_final, sp
+    mov sp, sp_initial
+    call check_dword
+  end;
+
+  Writeln('testing push/pop word [local_longint]');
+  asm
+    mov sp_initial, sp
+    push word [local_longint]
+    mov sp_after_push, sp
+    pop word [local_longint]
+    mov sp_final, sp
+    mov sp, sp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr local_longint');
+  asm
+    mov sp_initial, sp
+    push word ptr local_longint
+    mov sp_after_push, sp
+    pop word ptr local_longint
+    mov sp_final, sp
+    mov sp, sp_initial
+    call check_word
+  end;
+
+  Writeln('testing push/pop word ptr [local_longint]');
+  asm
+    mov sp_initial, sp
+    push word ptr [local_longint]
+    mov sp_after_push, sp
+    pop word ptr [local_longint]
+    mov sp_final, sp
+    mov sp, sp_initial
+    call check_word
+  end;
+end;
+
+begin
+  Error := False;
+  testproc;
+  if Error then
+  begin
+    Writeln('Errors found!');
+    Halt(1);
+  end
+  else
+    Writeln('Ok!');
+end.