Quellcode durchsuchen

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

Jonas Maebe vor 9 Jahren
Ursprung
Commit
c7ea921066

+ 4 - 3
compiler/arm/hlcgcpu.pas

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

+ 4 - 22
compiler/expunix.pas

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

+ 26 - 10
compiler/hlcgobj.pas

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

+ 3 - 3
compiler/llvm/hlcgllvm.pas

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

+ 2 - 2
compiler/mips/hlcgcpu.pas

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

+ 4 - 4
compiler/ppcgen/hlcgppc.pas

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

+ 5 - 4
compiler/sparc/hlcgcpu.pas

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

+ 5 - 5
compiler/x86/hlcgx86.pas

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