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

proc's call model

git-svn-id: trunk@32193 -
This commit is contained in:
nickysn 2015-10-29 22:05:09 +00:00
parent ed09b4fcaa
commit dd9e5ea6f6
2 changed files with 17 additions and 3 deletions

View File

@ -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;

View File

@ -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