mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-11 18:08:15 +02:00
* 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:
parent
ed09b4fcaa
commit
dd9e5ea6f6
@ -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;
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user