mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 15:29:25 +02:00
* renamed thlcgobj.g_external_wrapper() into a_jmp_external_name(), and
moved the code to create the procedure start/end etc. that was at the call sites of g_external_wrapper() into the new g_external_wrapper() -> got rid of the x86-specific code in expunix, and fixed expunix for llvm (e.g. tests/test/tlib1{a,b}) git-svn-id: trunk@34131 -
This commit is contained in:
parent
6558d7a521
commit
c7ea921066
@ -29,6 +29,7 @@ unit hlcgcpu;
|
||||
interface
|
||||
|
||||
uses
|
||||
globtype,
|
||||
aasmdata,
|
||||
symdef,
|
||||
hlcg2ll;
|
||||
@ -42,7 +43,7 @@ interface
|
||||
end;
|
||||
|
||||
tthumbhlcgcpu = class(tbasehlcgarm)
|
||||
procedure g_external_wrapper(list : TAsmList; procdef : tprocdef; const externalname : string); override;
|
||||
procedure a_jmp_external_name(list: TAsmList; const externalname: TSymStr); override;
|
||||
end;
|
||||
|
||||
procedure create_hlcodegen;
|
||||
@ -50,7 +51,7 @@ interface
|
||||
implementation
|
||||
|
||||
uses
|
||||
globals,globtype,verbose,
|
||||
globals,verbose,
|
||||
procinfo,fmodule,
|
||||
symconst,
|
||||
aasmbase,aasmtai,aasmcpu, cpuinfo,
|
||||
@ -229,7 +230,7 @@ implementation
|
||||
|
||||
{ tthumbhlcgcpu }
|
||||
|
||||
procedure tthumbhlcgcpu.g_external_wrapper(list: TAsmList; procdef: tprocdef; const externalname: string);
|
||||
procedure tthumbhlcgcpu.a_jmp_external_name(list: TAsmList; const externalname: TSymStr);
|
||||
var
|
||||
tmpref : treference;
|
||||
l : tasmlabel;
|
||||
|
@ -60,6 +60,9 @@ uses
|
||||
fmodule,
|
||||
cgbase,cgutils,cpubase,cgobj,
|
||||
cgcpu,hlcgobj,hlcgcpu,
|
||||
{$ifdef llvm}
|
||||
hlcgllvm,
|
||||
{$endif llvm}
|
||||
ncgutil,
|
||||
verbose;
|
||||
|
||||
@ -161,28 +164,7 @@ begin
|
||||
break;
|
||||
end;
|
||||
if not anyhasalias then
|
||||
begin
|
||||
{ place jump in al_procedures }
|
||||
current_asmdata.asmlists[al_procedures].concat(tai_align.create(target_info.alignment.procalign));
|
||||
current_asmdata.asmlists[al_procedures].concat(Tai_symbol.Createname_global(hp2.name^,AT_FUNCTION,0));
|
||||
if (cs_create_pic in current_settings.moduleswitches) and
|
||||
{ other targets need to be checked how it works }
|
||||
(target_info.system in [system_i386_freebsd,system_x86_64_freebsd,system_x86_64_linux,system_i386_linux,system_x86_64_solaris,system_i386_solaris,system_i386_android,system_x86_64_dragonfly]) then
|
||||
begin
|
||||
{$ifdef x86}
|
||||
sym:=current_asmdata.RefAsmSymbol(pd.mangledname);
|
||||
reference_reset_symbol(r,sym,0,sizeof(pint));
|
||||
if cs_create_pic in current_settings.moduleswitches then
|
||||
r.refaddr:=addr_pic
|
||||
else
|
||||
r.refaddr:=addr_full;
|
||||
current_asmdata.asmlists[al_procedures].concat(taicpu.op_ref(A_JMP,S_NO,r));
|
||||
{$endif x86}
|
||||
end
|
||||
else
|
||||
hlcg.g_external_wrapper(current_asmdata.asmlists[al_procedures],pd,pd.mangledname);
|
||||
current_asmdata.asmlists[al_procedures].concat(Tai_symbol_end.Createname(hp2.name^));
|
||||
end;
|
||||
hlcg.g_external_wrapper(current_asmdata.asmlists[al_procedures],pd,hp2.name^,pd.mangledname,true);
|
||||
exportedsymnames.insert(hp2.name^);
|
||||
end
|
||||
else
|
||||
|
@ -513,11 +513,14 @@ unit hlcgobj;
|
||||
procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);virtual; abstract;
|
||||
procedure g_adjust_self_value(list:TAsmList;procdef: tprocdef;ioffset: aint);virtual; abstract;
|
||||
|
||||
protected
|
||||
procedure a_jmp_external_name(list: TAsmList; const externalname: TSymStr); virtual;
|
||||
public
|
||||
{ generate a stub which only purpose is to pass control the given external method,
|
||||
setting up any additional environment before doing so (if required).
|
||||
|
||||
The default implementation issues a jump instruction to the external name. }
|
||||
procedure g_external_wrapper(list : TAsmList; procdef: tprocdef; const externalname: string); virtual;
|
||||
procedure g_external_wrapper(list : TAsmList; procdef: tprocdef; const wrappername, externalname: string; global: boolean); virtual;
|
||||
|
||||
protected
|
||||
procedure g_allocload_reg_reg(list: TAsmList; regsize: tdef; const fromreg: tregister; out toreg: tregister; regtyp: tregistertype);
|
||||
@ -3772,11 +3775,31 @@ implementation
|
||||
begin
|
||||
end;
|
||||
|
||||
procedure thlcgobj.g_external_wrapper(list: TAsmList; procdef: tprocdef; const externalname: string);
|
||||
procedure thlcgobj.a_jmp_external_name(list: TAsmList; const externalname: TSymStr);
|
||||
begin
|
||||
cg.a_jmp_name(list,externalname);
|
||||
end;
|
||||
|
||||
procedure thlcgobj.g_external_wrapper(list: TAsmList; procdef: tprocdef; const wrappername, externalname: string; global: boolean);
|
||||
var
|
||||
sym: tasmsymbol;
|
||||
begin
|
||||
maybe_new_object_file(list);
|
||||
new_section(list,sec_code,wrappername,target_info.alignment.procalign);
|
||||
if global then
|
||||
begin
|
||||
sym:=current_asmdata.DefineAsmSymbol(wrappername,AB_GLOBAL,AT_FUNCTION);
|
||||
list.concat(Tai_symbol.Create_global(sym,0));
|
||||
end
|
||||
else
|
||||
begin
|
||||
sym:=current_asmdata.DefineAsmSymbol(wrappername,AB_LOCAL,AT_FUNCTION);
|
||||
list.concat(Tai_symbol.Create(sym,0));
|
||||
end;
|
||||
a_jmp_external_name(list,externalname);
|
||||
list.concat(Tai_symbol_end.Create(sym));
|
||||
end;
|
||||
|
||||
procedure thlcgobj.g_allocload_reg_reg(list: TAsmList; regsize: tdef; const fromreg: tregister; out toreg: tregister; regtyp: tregistertype);
|
||||
begin
|
||||
case regtyp of
|
||||
@ -4490,14 +4513,7 @@ implementation
|
||||
if importname<>'' then
|
||||
begin
|
||||
{ add the procedure to the al_procedures }
|
||||
maybe_new_object_file(list);
|
||||
new_section(list,sec_code,lower(pd.mangledname),current_settings.alignment.procalign);
|
||||
if (po_global in pd.procoptions) then
|
||||
list.concat(Tai_symbol.createname_global(pd.mangledname,AT_FUNCTION,0))
|
||||
else
|
||||
list.concat(Tai_symbol.createname(pd.mangledname,AT_FUNCTION,0));
|
||||
|
||||
g_external_wrapper(list,pd,importname);
|
||||
g_external_wrapper(list,pd,pd.mangledname,importname,true);
|
||||
end;
|
||||
{ remove the external stuff, so that the interface crc
|
||||
doesn't change. This makes the function calls less
|
||||
|
@ -145,7 +145,7 @@ uses
|
||||
procedure varsym_set_localloc(list: TAsmList; vs: tabstractnormalvarsym); override;
|
||||
procedure paravarsym_set_initialloc_to_paraloc(vs: tparavarsym); override;
|
||||
|
||||
procedure g_external_wrapper(list: TAsmList; procdef: tprocdef; const externalname: string); override;
|
||||
procedure g_external_wrapper(list: TAsmList; procdef: tprocdef; const wrappername, externalname: string; global: boolean); override;
|
||||
|
||||
{ def is a pointerdef or implicit pointer type (class, classref, procvar,
|
||||
dynamic array, ...). }
|
||||
@ -2002,14 +2002,14 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure thlcgllvm.g_external_wrapper(list: TAsmList; procdef: tprocdef; const externalname: string);
|
||||
procedure thlcgllvm.g_external_wrapper(list: TAsmList; procdef: tprocdef; const wrappername, externalname: string; global: boolean);
|
||||
var
|
||||
asmsym: TAsmSymbol;
|
||||
begin
|
||||
if po_external in procdef.procoptions then
|
||||
exit;
|
||||
asmsym:=current_asmdata.RefAsmSymbol(externalname,AT_FUNCTION);
|
||||
list.concat(taillvmalias.create(asmsym,procdef.mangledname,procdef,asmsym.bind));
|
||||
list.concat(taillvmalias.create(asmsym,wrappername,procdef,asmsym.bind));
|
||||
end;
|
||||
|
||||
|
||||
|
@ -43,7 +43,7 @@ uses
|
||||
procedure a_load_regconst_subsetreg_intern(list: TAsmList; fromsize, subsetsize: tdef; fromreg: tregister; const sreg: tsubsetregister; slopt: tsubsetloadopt); override;
|
||||
public
|
||||
procedure g_intf_wrapper(list: tasmlist; procdef: tprocdef; const labelname: string; ioffset: longint); override;
|
||||
procedure g_external_wrapper(list : TAsmList; procdef: tprocdef; const externalname: string);override;
|
||||
procedure a_jmp_external_name(list: TAsmList; const externalname: TSymStr);override;
|
||||
end;
|
||||
|
||||
procedure create_hlcodegen;
|
||||
@ -148,7 +148,7 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure thlcgmips.g_external_wrapper(list: TAsmList; procdef: tprocdef; const externalname: string);
|
||||
procedure thlcgmips.a_jmp_external_name(list: TAsmList; const externalname: TSymStr);
|
||||
var
|
||||
href: treference;
|
||||
begin
|
||||
|
@ -28,7 +28,7 @@ unit hlcgppc;
|
||||
interface
|
||||
|
||||
uses
|
||||
globals,
|
||||
globtype,globals,
|
||||
aasmdata,
|
||||
symtype,symdef,
|
||||
cgbase,cgutils,hlcgobj,hlcg2ll;
|
||||
@ -39,7 +39,7 @@ type
|
||||
procedure a_load_subsetref_regs_noindex(list: TAsmList; subsetsize: tdef; loadbitsize: byte; const sref: tsubsetreference; valuereg, extra_value_reg: tregister); override;
|
||||
public
|
||||
procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
|
||||
procedure g_external_wrapper(list: TAsmList; pd: TProcDef; const externalname: string); override;
|
||||
procedure a_jmp_external_name(list: TAsmList; const externalname: TSymStr); override;
|
||||
procedure gen_load_para_value(list: TAsmList); override;
|
||||
end;
|
||||
|
||||
@ -50,7 +50,7 @@ implementation
|
||||
systems,fmodule,
|
||||
symconst,
|
||||
aasmbase,aasmtai,aasmcpu,
|
||||
cpubase,globtype,
|
||||
cpubase,
|
||||
procinfo,cpupi,cgobj,cgppc,
|
||||
defutil;
|
||||
|
||||
@ -193,7 +193,7 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure thlcgppcgen.g_external_wrapper(list: TAsmList; pd: TProcDef; const externalname: string);
|
||||
procedure thlcgppcgen.a_jmp_external_name(list: TAsmList; const externalname: TSymStr);
|
||||
var
|
||||
href : treference;
|
||||
begin
|
||||
|
@ -29,6 +29,7 @@ unit hlcgcpu;
|
||||
interface
|
||||
|
||||
uses
|
||||
globtype,
|
||||
aasmdata,
|
||||
symdef,
|
||||
hlcg2ll;
|
||||
@ -36,7 +37,7 @@ interface
|
||||
type
|
||||
thlcgcpu = class(thlcg2ll)
|
||||
procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
|
||||
procedure g_external_wrapper(list : TAsmList; procdef: tprocdef; const externalname: string);override;
|
||||
procedure a_jmp_external_name(list: TAsmList; const externalname: TSymStr);override;
|
||||
end;
|
||||
|
||||
procedure create_hlcodegen;
|
||||
@ -44,7 +45,7 @@ interface
|
||||
implementation
|
||||
|
||||
uses
|
||||
verbose,globtype,fmodule,
|
||||
verbose,fmodule,
|
||||
aasmbase,aasmtai,aasmcpu,
|
||||
parabase,
|
||||
symconst,symtype,symsym,
|
||||
@ -118,12 +119,12 @@ implementation
|
||||
list.Concat(TAiCpu.Op_none(A_NOP));
|
||||
end
|
||||
else
|
||||
g_external_wrapper(list,procdef,procdef.mangledname);
|
||||
a_jmp_external_name(list,procdef.mangledname);
|
||||
List.concat(Tai_symbol_end.Createname(labelname));
|
||||
end;
|
||||
|
||||
|
||||
procedure thlcgcpu.g_external_wrapper(list : TAsmList; procdef: tprocdef; const externalname: string);
|
||||
procedure thlcgcpu.a_jmp_external_name(list: TAsmList; const externalname: TSymStr);
|
||||
begin
|
||||
{ CALL overwrites %o7 with its own address, we use delay slot to restore it. }
|
||||
list.concat(taicpu.op_reg_reg(A_MOV,NR_O7,NR_G1));
|
||||
|
@ -29,6 +29,7 @@ interface
|
||||
{$i fpcdefs.inc}
|
||||
|
||||
uses
|
||||
globtype,
|
||||
aasmdata,
|
||||
symtype,symdef,
|
||||
parabase,
|
||||
@ -41,14 +42,13 @@ interface
|
||||
thlcgx86 = class(thlcg2ll)
|
||||
protected
|
||||
procedure gen_load_uninitialized_function_result(list: TAsmList; pd: tprocdef; resdef: tdef; const resloc: tcgpara); override;
|
||||
public
|
||||
procedure g_external_wrapper(list: TAsmList; procdef: tprocdef; const externalname: string); override;
|
||||
procedure a_jmp_external_name(list: TAsmList; const externalname: TSymStr); override;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
globtype,globals,systems,
|
||||
globals,systems,
|
||||
aasmbase,
|
||||
cgbase,cgutils,
|
||||
cpubase,aasmcpu;
|
||||
@ -64,7 +64,7 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure thlcgx86.g_external_wrapper(list: TAsmList; procdef: tprocdef; const externalname: string);
|
||||
procedure thlcgx86.a_jmp_external_name(list: TAsmList; const externalname: TSymStr);
|
||||
var
|
||||
ref : treference;
|
||||
sym : tasmsymbol;
|
||||
@ -72,7 +72,7 @@ implementation
|
||||
if (target_info.system = system_i386_darwin) then
|
||||
begin
|
||||
{ a_jmp_name jumps to a stub which is always pic-safe on darwin }
|
||||
inherited g_external_wrapper(list,procdef,externalname);
|
||||
inherited;
|
||||
exit;
|
||||
end;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user