Pārlūkot izejas kodu

* changed create_hlcodegen into a procvar, so that we don't have to insert
hlcgllvm in the uses clause of every unit that calls create_hlcodegen
o prevents dependency cycles that can cause llvm codegen units to init
before the cpu variants, which is bad since the llvm versions have to
override the cpu variants in their init code (+ added checks in the
init code that they are in fact initialised later)

git-svn-id: branches/debug_eh@40410 -

Jonas Maebe 6 gadi atpakaļ
vecāks
revīzija
4cd6f59bc3

+ 4 - 3
compiler/aarch64/hlcgcpu.pas

@@ -45,8 +45,6 @@ interface
       procedure a_load_regconst_subsetreg_intern(list: TAsmList; fromsize, subsetsize: tdef; fromreg: tregister; const sreg: tsubsetregister; slopt: tsubsetloadopt); override;
       procedure a_load_regconst_subsetreg_intern(list: TAsmList; fromsize, subsetsize: tdef; fromreg: tregister; const sreg: tsubsetregister; slopt: tsubsetloadopt); override;
     end;
     end;
 
 
-  procedure create_hlcodegen;
-
 implementation
 implementation
 
 
   uses
   uses
@@ -219,11 +217,14 @@ implementation
     end;
     end;
 
 
 
 
-  procedure create_hlcodegen;
+  procedure create_hlcodegen_cpu;
     begin
     begin
       hlcg:=thlcgaarch64.create;
       hlcg:=thlcgaarch64.create;
       create_codegen;
       create_codegen;
     end;
     end;
 
 
 
 
+begin
+  chlcgobj:=thlcgaarch64;
+  create_hlcodegen:=@create_hlcodegen_cpu;
 end.
 end.

+ 2 - 3
compiler/arm/hlcgcpu.pas

@@ -46,8 +46,6 @@ interface
       procedure a_jmp_external_name(list: TAsmList; const externalname: TSymStr); override;
       procedure a_jmp_external_name(list: TAsmList; const externalname: TSymStr); override;
     end;
     end;
 
 
-  procedure create_hlcodegen;
-
 implementation
 implementation
 
 
   uses
   uses
@@ -257,7 +255,7 @@ implementation
 
 
 
 
 
 
-  procedure create_hlcodegen;
+  procedure create_hlcodegen_cpu;
     begin
     begin
       if GenerateThumbCode then
       if GenerateThumbCode then
         hlcg:=tthumbhlcgcpu.create
         hlcg:=tthumbhlcgcpu.create
@@ -268,4 +266,5 @@ implementation
 
 
 begin
 begin
   chlcgobj:=tbasehlcgarm;
   chlcgobj:=tbasehlcgarm;
+  create_hlcodegen:=@create_hlcodegen_cpu;
 end.
 end.

+ 2 - 3
compiler/avr/hlcgcpu.pas

@@ -38,8 +38,6 @@ interface
       procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
       procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
     end;
     end;
 
 
-  procedure create_hlcodegen;
-
 implementation
 implementation
 
 
   uses
   uses
@@ -52,7 +50,7 @@ implementation
     end;
     end;
 
 
 
 
-  procedure create_hlcodegen;
+  procedure create_hlcodegen_cpu;
     begin
     begin
       hlcg:=thlcgcpu.create;
       hlcg:=thlcgcpu.create;
       create_codegen;
       create_codegen;
@@ -60,4 +58,5 @@ implementation
 
 
 begin
 begin
   chlcgobj:=thlcgcpu;
   chlcgobj:=thlcgcpu;
+  create_hlcodegen:=@create_hlcodegen_cpu;
 end.
 end.

+ 1 - 1
compiler/hlcgobj.pas

@@ -669,7 +669,7 @@ unit hlcgobj;
        { class type of high level code generator class (also valid when hlcg is
        { class type of high level code generator class (also valid when hlcg is
          nil, in order to be able to call its virtual class methods) }
          nil, in order to be able to call its virtual class methods) }
        chlcgobj: thlcgobjclass;
        chlcgobj: thlcgobjclass;
-
+       create_hlcodegen: TProcedure;
 
 
     procedure destroy_hlcodegen;
     procedure destroy_hlcodegen;
 
 

+ 2 - 3
compiler/i386/hlcgcpu.pas

@@ -52,8 +52,6 @@ interface
       procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
       procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
     end;
     end;
 
 
-  procedure create_hlcodegen;
-
 implementation
 implementation
 
 
   uses
   uses
@@ -443,7 +441,7 @@ implementation
     end;
     end;
 
 
 
 
-  procedure create_hlcodegen;
+  procedure create_hlcodegen_cpu;
     begin
     begin
       hlcg:=thlcgcpu.create;
       hlcg:=thlcgcpu.create;
       create_codegen;
       create_codegen;
@@ -453,4 +451,5 @@ implementation
 
 
 begin
 begin
   chlcgobj:=thlcgcpu;
   chlcgobj:=thlcgcpu;
+  create_hlcodegen:=@create_hlcodegen_cpu;
 end.
 end.

+ 2 - 3
compiler/i8086/hlcgcpu.pas

@@ -89,8 +89,6 @@ interface
       procedure location_force_mem(list:TAsmList;var l:tlocation;size:tdef);override;
       procedure location_force_mem(list:TAsmList;var l:tlocation;size:tdef);override;
     end;
     end;
 
 
-  procedure create_hlcodegen;
-
 implementation
 implementation
 
 
   uses
   uses
@@ -713,7 +711,7 @@ implementation
     end;
     end;
 
 
 
 
-  procedure create_hlcodegen;
+  procedure create_hlcodegen_cpu;
     begin
     begin
       hlcg:=thlcgcpu.create;
       hlcg:=thlcgcpu.create;
       create_codegen;
       create_codegen;
@@ -722,4 +720,5 @@ implementation
 
 
 begin
 begin
   chlcgobj:=thlcgcpu;
   chlcgobj:=thlcgcpu;
+  create_hlcodegen:=@create_hlcodegen_cpu;
 end.
 end.

+ 2 - 3
compiler/jvm/hlcgcpu.pas

@@ -234,8 +234,6 @@ uses
 
 
     end;
     end;
 
 
-  procedure create_hlcodegen;
-
 
 
   const
   const
     opcmp2if: array[topcmp] of tasmop = (A_None,
     opcmp2if: array[topcmp] of tasmop = (A_None,
@@ -2553,7 +2551,7 @@ implementation
       result:=get_call_result_cgpara(pd,forceresdef);
       result:=get_call_result_cgpara(pd,forceresdef);
     end;
     end;
 
 
-  procedure create_hlcodegen;
+  procedure create_hlcodegen_cpu;
     begin
     begin
       hlcg:=thlcgjvm.create;
       hlcg:=thlcgjvm.create;
       create_codegen;
       create_codegen;
@@ -2561,4 +2559,5 @@ implementation
 
 
 begin
 begin
   chlcgobj:=thlcgjvm;
   chlcgobj:=thlcgjvm;
+  create_hlcodegen:=@create_hlcodegen_cpu;
 end.
 end.

+ 14 - 5
compiler/llvm/hlcgllvm.pas

@@ -157,9 +157,6 @@ uses
       procedure set_call_function_result(const list: TAsmList; const pd: tabstractprocdef; const llvmretdef, hlretdef: tdef; const resval: tregister; var retpara: tcgpara);
       procedure set_call_function_result(const list: TAsmList; const pd: tabstractprocdef; const llvmretdef, hlretdef: tdef; const resval: tregister; var retpara: tcgpara);
     end;
     end;
 
 
-  procedure create_hlcodegen;
-
-
 implementation
 implementation
 
 
   uses
   uses
@@ -172,6 +169,9 @@ implementation
     pass_2,procinfo,llvmpi,cpuinfo,cgobj,cgllvm,cghlcpu,
     pass_2,procinfo,llvmpi,cpuinfo,cgobj,cgllvm,cghlcpu,
     cgcpu,hlcgcpu;
     cgcpu,hlcgcpu;
 
 
+  var
+    create_hlcodegen_cpu: TProcedure = nil;
+
   const
   const
     topcg2llvmop: array[topcg] of tllvmop =
     topcg2llvmop: array[topcg] of tllvmop =
      { OP_NONE  OP_MOVE     OP_ADD  OP_AND  OP_DIV   OP_IDIV  OP_IMUL OP_MUL }
      { OP_NONE  OP_MOVE     OP_ADD  OP_AND  OP_DIV   OP_IDIV  OP_IMUL OP_MUL }
@@ -2052,7 +2052,7 @@ implementation
     end;
     end;
 
 
 
 
-  procedure create_hlcodegen;
+  procedure create_hlcodegen_llvm;
     begin
     begin
       if not assigned(current_procinfo) or
       if not assigned(current_procinfo) or
          not(po_assembler in current_procinfo.procdef.procoptions) then
          not(po_assembler in current_procinfo.procdef.procoptions) then
@@ -2064,11 +2064,20 @@ implementation
       else
       else
         begin
         begin
           tgobjclass:=orgtgclass;
           tgobjclass:=orgtgclass;
-          hlcgcpu.create_hlcodegen;
+          create_hlcodegen_cpu;
           { todo: handle/remove chlcgobj }
           { todo: handle/remove chlcgobj }
         end;
         end;
     end;
     end;
 
 
 begin
 begin
   chlcgobj:=thlcgllvm;
   chlcgobj:=thlcgllvm;
+  { this unit must initialise after hlcgobj;
+    message system has not been initialised yet here }
+  if not assigned(create_hlcodegen) then
+    begin
+      writeln('Internalerror 2018052003');
+      halt(1);
+    end;
+  create_hlcodegen_cpu:=create_hlcodegen;
+  create_hlcodegen:=@create_hlcodegen_llvm;
 end.
 end.

+ 5 - 0
compiler/llvm/llvmpara.pas

@@ -231,6 +231,11 @@ unit llvmpara;
     end;
     end;
 
 
 begin
 begin
+  if not assigned(paramanager) then
+    begin
+      writeln('Internalerror 2018052006');
+      halt(1);
+    end;
   { replace the native parameter manager. Maybe this has to be moved to a
   { replace the native parameter manager. Maybe this has to be moved to a
     procedure like the creations of the code generators, but possibly not since
     procedure like the creations of the code generators, but possibly not since
     we still call the original paramanager }
     we still call the original paramanager }

+ 5 - 0
compiler/llvm/llvmpi.pas

@@ -98,6 +98,11 @@ implementation
 
 
 
 
 begin
 begin
+  if not assigned(cprocinfo) then
+    begin
+      writeln('Internalerror 2018052005');
+      halt(1);
+    end;
   cprocinfo:=tllvmprocinfo;
   cprocinfo:=tllvmprocinfo;
 end.
 end.
 
 

+ 5 - 0
compiler/llvm/tgllvm.pas

@@ -183,6 +183,11 @@ implementation
 
 
 
 
 begin
 begin
+  if not assigned(tgobjclass) then
+    begin
+      writeln('Internalerror 2018052004');
+      halt(1);
+    end;
   orgtgclass:=tgobjclass;
   orgtgclass:=tgobjclass;
   tgobjclass:=ttgllvm;
   tgobjclass:=ttgllvm;
 end.
 end.

+ 2 - 3
compiler/m68k/hlcgcpu.pas

@@ -47,8 +47,6 @@ interface
       procedure gen_load_loc_function_result(list: TAsmList; vardef: tdef; const l: tlocation);override;
       procedure gen_load_loc_function_result(list: TAsmList; vardef: tdef; const l: tlocation);override;
     end;
     end;
 
 
-  procedure create_hlcodegen;
-
 implementation
 implementation
 
 
   uses
   uses
@@ -264,7 +262,7 @@ implementation
     end;
     end;
 
 
 
 
-  procedure create_hlcodegen;
+  procedure create_hlcodegen_cpu;
     begin
     begin
       hlcg:=thlcgcpu.create;
       hlcg:=thlcgcpu.create;
       create_codegen;
       create_codegen;
@@ -272,4 +270,5 @@ implementation
 
 
 begin
 begin
   chlcgobj:=thlcgcpu;
   chlcgobj:=thlcgcpu;
+  create_hlcodegen:=@create_hlcodegen_cpu;
 end.
 end.

+ 2 - 3
compiler/mips/hlcgcpu.pas

@@ -46,8 +46,6 @@ uses
       procedure a_jmp_external_name(list: TAsmList; const externalname: TSymStr);override;
       procedure a_jmp_external_name(list: TAsmList; const externalname: TSymStr);override;
   end;
   end;
 
 
-  procedure create_hlcodegen;
-
 implementation
 implementation
 
 
   uses
   uses
@@ -275,7 +273,7 @@ implementation
   end;
   end;
 
 
 
 
-  procedure create_hlcodegen;
+  procedure create_hlcodegen_cpu;
     begin
     begin
       hlcg:=thlcgmips.create;
       hlcg:=thlcgmips.create;
       create_codegen;
       create_codegen;
@@ -283,4 +281,5 @@ implementation
 
 
 begin
 begin
   chlcgobj:=thlcgmips;
   chlcgobj:=thlcgmips;
+  create_hlcodegen:=@create_hlcodegen_cpu;
 end.
 end.

+ 0 - 4
compiler/ncgutil.pas

@@ -111,10 +111,6 @@ implementation
     dbgbase,
     dbgbase,
     nbas,ncon,nld,nmem,nutils,
     nbas,ncon,nld,nmem,nutils,
     tgobj,cgobj,hlcgobj,hlcgcpu
     tgobj,cgobj,hlcgobj,hlcgcpu
-{$ifdef llvm}
-    { override create_hlcodegen from hlcgcpu }
-    , hlcgllvm
-{$endif}
 {$ifdef powerpc}
 {$ifdef powerpc}
     , cpupi
     , cpupi
 {$endif}
 {$endif}

+ 2 - 3
compiler/powerpc/hlcgcpu.pas

@@ -40,8 +40,6 @@ interface
      procedure a_load_regconst_subsetreg_intern(list: TAsmList; fromsize, subsetsize: tdef; fromreg: tregister; const sreg: tsubsetregister; slopt: tsubsetloadopt); override;
      procedure a_load_regconst_subsetreg_intern(list: TAsmList; fromsize, subsetsize: tdef; fromreg: tregister; const sreg: tsubsetregister; slopt: tsubsetloadopt); override;
     end;
     end;
 
 
-  procedure create_hlcodegen;
-
 implementation
 implementation
 
 
   uses
   uses
@@ -111,7 +109,7 @@ implementation
 
 
 
 
 
 
-  procedure create_hlcodegen;
+  procedure create_hlcodegen_cpu;
     begin
     begin
       hlcg:=thlcgcpu.create;
       hlcg:=thlcgcpu.create;
       create_codegen;
       create_codegen;
@@ -120,5 +118,6 @@ implementation
 
 
 begin
 begin
   chlcgobj:=thlcgcpu;
   chlcgobj:=thlcgcpu;
+  create_hlcodegen:=@create_hlcodegen_cpu;
 end.
 end.
 
 

+ 2 - 3
compiler/powerpc64/hlcgcpu.pas

@@ -41,8 +41,6 @@ type
     procedure a_load_regconst_subsetreg_intern(list : TAsmList; fromsize, subsetsize: tdef; fromreg: tregister; const sreg: tsubsetregister; slopt: tsubsetloadopt); override;
     procedure a_load_regconst_subsetreg_intern(list : TAsmList; fromsize, subsetsize: tdef; fromreg: tregister; const sreg: tsubsetregister; slopt: tsubsetloadopt); override;
   end;
   end;
 
 
-   procedure create_hlcodegen;
-
 implementation
 implementation
 
 
   uses
   uses
@@ -119,7 +117,7 @@ implementation
     end;
     end;
 
 
 
 
-  procedure create_hlcodegen;
+  procedure create_hlcodegen_cpu;
     begin
     begin
       hlcg:=thlcgcpu.create;
       hlcg:=thlcgcpu.create;
       create_codegen;
       create_codegen;
@@ -129,4 +127,5 @@ implementation
 
 
 begin
 begin
   chlcgobj:=thlcgcpu;
   chlcgobj:=thlcgcpu;
+  create_hlcodegen:=@create_hlcodegen_cpu;
 end.
 end.

+ 0 - 4
compiler/psub.pas

@@ -115,10 +115,6 @@ implementation
        pbase,pstatmnt,pdecl,pdecsub,pexports,pgenutil,pparautl,
        pbase,pstatmnt,pdecl,pdecsub,pexports,pgenutil,pparautl,
        { codegen }
        { codegen }
        tgobj,cgbase,cgobj,hlcgobj,hlcgcpu,dbgbase,
        tgobj,cgbase,cgobj,hlcgobj,hlcgcpu,dbgbase,
-{$ifdef llvm}
-      { override create_hlcodegen from hlcgcpu }
-      hlcgllvm,
-{$endif}
        ncgutil,
        ncgutil,
        optbase,
        optbase,
        opttail,
        opttail,

+ 11 - 0
compiler/riscv/hlcgrv.pas

@@ -256,5 +256,16 @@ implementation
       list.concat(Tai_symbol_end.Create(sym));
       list.concat(Tai_symbol_end.Create(sym));
     end;
     end;
 
 
+
+  procedure create_hlcodegen_cpu;
+    begin
+      hlcg:=thlcgriscv.create;
+//      create_codegen;
+    end;
+
+
+begin
+  chlcgobj:=thlcgriscv;
+  create_hlcodegen:=@create_hlcodegen_cpu;
 end.
 end.
 
 

+ 2 - 3
compiler/sparcgen/hlcgcpu.pas

@@ -42,8 +42,6 @@ interface
      procedure a_jmp_external_name(list: TAsmList; const externalname: TSymStr);override;
      procedure a_jmp_external_name(list: TAsmList; const externalname: TSymStr);override;
     end;
     end;
 
 
-  procedure create_hlcodegen;
-
 implementation
 implementation
 
 
   uses
   uses
@@ -135,7 +133,7 @@ implementation
     end;
     end;
 
 
 
 
-  procedure create_hlcodegen;
+  procedure create_hlcodegen_cpu;
     begin
     begin
       hlcg:=thlcgcpu.create;
       hlcg:=thlcgcpu.create;
       create_codegen;
       create_codegen;
@@ -143,4 +141,5 @@ implementation
 
 
 begin
 begin
   chlcgobj:=thlcgcpu;
   chlcgobj:=thlcgcpu;
+  create_hlcodegen:=@create_hlcodegen_cpu;
 end.
 end.

+ 2 - 3
compiler/x86_64/hlcgcpu.pas

@@ -38,8 +38,6 @@ interface
      procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
      procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override;
     end;
     end;
 
 
-  procedure create_hlcodegen;
-
 implementation
 implementation
 
 
   uses
   uses
@@ -113,7 +111,7 @@ implementation
     end;
     end;
 
 
 
 
-  procedure create_hlcodegen;
+  procedure create_hlcodegen_cpu;
     begin
     begin
       hlcg:=thlcgcpu.create;
       hlcg:=thlcgcpu.create;
       create_codegen;
       create_codegen;
@@ -121,4 +119,5 @@ implementation
 
 
 begin
 begin
   chlcgobj:=thlcgcpu;
   chlcgobj:=thlcgcpu;
+  create_hlcodegen:=@create_hlcodegen_cpu;
 end.
 end.