Ver Fonte

* convert 'call/jmp [proc]' properly to a near or far call/jmp, depending on
proc's call model

git-svn-id: trunk@32193 -

nickysn há 9 anos atrás
pai
commit
dd9e5ea6f6
2 ficheiros alterados com 17 adições e 3 exclusões
  1. 14 2
      compiler/rautils.pas
  2. 3 1
      compiler/x86/rax86int.pas

+ 14 - 2
compiler/rautils.pas

@@ -50,7 +50,7 @@ type
       OPR_NONE      : ();
       OPR_CONSTANT  : (val:aint);
       OPR_SYMBOL    : (symbol:tasmsymbol;symofs:aint;symseg:boolean;sym_farproc_entry:boolean);
-      OPR_REFERENCE : (varsize:asizeint; constoffset: asizeint; ref:treference);
+      OPR_REFERENCE : (varsize:asizeint; constoffset: asizeint;ref_farproc_entry:boolean;ref:treference);
       OPR_LOCAL     : (localvarsize, localconstoffset: asizeint;localsym:tabstractnormalvarsym;localsymofs:aint;localindexreg:tregister;localscale:byte;localgetoffset,localforceref:boolean);
       OPR_REGISTER  : (reg:tregister);
 {$ifdef m68k}
@@ -905,7 +905,12 @@ Begin
           Message(asmr_w_calling_overload_func);
         case opr.typ of
           OPR_REFERENCE:
-            opr.ref.symbol:=current_asmdata.RefAsmSymbol(tprocdef(tprocsym(sym).ProcdefList[0]).mangledname);
+            begin
+              opr.ref.symbol:=current_asmdata.RefAsmSymbol(tprocdef(tprocsym(sym).ProcdefList[0]).mangledname);
+{$ifdef i8086}
+              opr.ref_farproc_entry:=is_proc_far(tprocdef(tprocsym(sym).ProcdefList[0]));
+{$endif i8086}
+            end;
           OPR_NONE:
             begin
               opr.typ:=OPR_SYMBOL;
@@ -965,6 +970,7 @@ var
   hsymofs : aint;
   hsymbol : tasmsymbol;
   reg : tregister;
+  hsym_farprocentry: Boolean;
 Begin
   case opr.typ of
     OPR_REFERENCE :
@@ -977,12 +983,14 @@ Begin
         opr.Ref.Offset:=l;
         opr.varsize:=0;
         opr.constoffset:=0;
+        opr.ref_farproc_entry:=false;
       end;
     OPR_NONE :
       begin
         opr.typ:=OPR_REFERENCE;
         opr.varsize:=0;
         opr.constoffset:=0;
+        opr.ref_farproc_entry:=false;
         Fillchar(opr.ref,sizeof(treference),0);
       end;
     OPR_REGISTER :
@@ -991,6 +999,7 @@ Begin
         opr.typ:=OPR_REFERENCE;
         opr.varsize:=0;
         opr.constoffset:=0;
+        opr.ref_farproc_entry:=false;
         Fillchar(opr.ref,sizeof(treference),0);
         opr.Ref.base:=reg;
       end;
@@ -998,12 +1007,14 @@ Begin
       begin
         hsymbol:=opr.symbol;
         hsymofs:=opr.symofs;
+        hsym_farprocentry:=opr.sym_farproc_entry;
         opr.typ:=OPR_REFERENCE;
         opr.varsize:=0;
         opr.constoffset:=0;
         Fillchar(opr.ref,sizeof(treference),0);
         opr.ref.symbol:=hsymbol;
         opr.ref.offset:=hsymofs;
+        opr.ref_farproc_entry:=hsym_farprocentry;
       end;
     else
       begin
@@ -1012,6 +1023,7 @@ Begin
         opr.typ:=OPR_REFERENCE;
         opr.varsize:=0;
         opr.constoffset:=0;
+        opr.ref_farproc_entry:=false;
         Fillchar(opr.ref,sizeof(treference),0);
       end;
   end;

+ 3 - 1
compiler/x86/rax86int.pas

@@ -2035,6 +2035,7 @@ Unit Rax86int;
 {$ifdef i8086}
         hsymbol: TAsmSymbol;
         hoffset: ASizeInt;
+        href_farproc_entry: Boolean;
 {$endif i8086}
       begin
         PrefixOp:=A_None;
@@ -2217,11 +2218,12 @@ Unit Rax86int;
                 begin
                   hsymbol:=ref.symbol;
                   hoffset:=ref.offset;
+                  href_farproc_entry:=ref_farproc_entry;
                   typ:=OPR_SYMBOL;
                   symbol:=hsymbol;
                   symofs:=hoffset;
                   symseg:=False;
-                  sym_farproc_entry:=False; { todo: set this correctly }
+                  sym_farproc_entry:=href_farproc_entry;
                 end;
               { convert 'call/jmp symbol' to 'call/jmp far symbol' for symbols that are an entry point of a far procedure }
               if (instr.opcode in [A_CALL,A_JMP]) and (instr.opsize=S_NO) and