* 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:
Jonas Maebe 2016-07-14 15:26:40 +00:00
parent 6558d7a521
commit c7ea921066
8 changed files with 53 additions and 53 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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