From 4cd6f59bc3badaaafe955ff601e937f969ec1635 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Thu, 29 Nov 2018 21:31:15 +0000 Subject: [PATCH] * 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 - --- compiler/aarch64/hlcgcpu.pas | 7 ++++--- compiler/arm/hlcgcpu.pas | 5 ++--- compiler/avr/hlcgcpu.pas | 5 ++--- compiler/hlcgobj.pas | 2 +- compiler/i386/hlcgcpu.pas | 5 ++--- compiler/i8086/hlcgcpu.pas | 5 ++--- compiler/jvm/hlcgcpu.pas | 5 ++--- compiler/llvm/hlcgllvm.pas | 19 ++++++++++++++----- compiler/llvm/llvmpara.pas | 5 +++++ compiler/llvm/llvmpi.pas | 5 +++++ compiler/llvm/tgllvm.pas | 5 +++++ compiler/m68k/hlcgcpu.pas | 5 ++--- compiler/mips/hlcgcpu.pas | 5 ++--- compiler/ncgutil.pas | 4 ---- compiler/powerpc/hlcgcpu.pas | 5 ++--- compiler/powerpc64/hlcgcpu.pas | 5 ++--- compiler/psub.pas | 4 ---- compiler/riscv/hlcgrv.pas | 11 +++++++++++ compiler/sparcgen/hlcgcpu.pas | 5 ++--- compiler/x86_64/hlcgcpu.pas | 5 ++--- 20 files changed, 67 insertions(+), 50 deletions(-) diff --git a/compiler/aarch64/hlcgcpu.pas b/compiler/aarch64/hlcgcpu.pas index d7a61331be..9bd5a530f1 100644 --- a/compiler/aarch64/hlcgcpu.pas +++ b/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; end; - procedure create_hlcodegen; - implementation uses @@ -219,11 +217,14 @@ implementation end; - procedure create_hlcodegen; + procedure create_hlcodegen_cpu; begin hlcg:=thlcgaarch64.create; create_codegen; end; +begin + chlcgobj:=thlcgaarch64; + create_hlcodegen:=@create_hlcodegen_cpu; end. diff --git a/compiler/arm/hlcgcpu.pas b/compiler/arm/hlcgcpu.pas index 993c2a2f90..fdab082566 100644 --- a/compiler/arm/hlcgcpu.pas +++ b/compiler/arm/hlcgcpu.pas @@ -46,8 +46,6 @@ interface procedure a_jmp_external_name(list: TAsmList; const externalname: TSymStr); override; end; - procedure create_hlcodegen; - implementation uses @@ -257,7 +255,7 @@ implementation - procedure create_hlcodegen; + procedure create_hlcodegen_cpu; begin if GenerateThumbCode then hlcg:=tthumbhlcgcpu.create @@ -268,4 +266,5 @@ implementation begin chlcgobj:=tbasehlcgarm; + create_hlcodegen:=@create_hlcodegen_cpu; end. diff --git a/compiler/avr/hlcgcpu.pas b/compiler/avr/hlcgcpu.pas index e69388e2a8..6a75a6c6ac 100644 --- a/compiler/avr/hlcgcpu.pas +++ b/compiler/avr/hlcgcpu.pas @@ -38,8 +38,6 @@ interface procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override; end; - procedure create_hlcodegen; - implementation uses @@ -52,7 +50,7 @@ implementation end; - procedure create_hlcodegen; + procedure create_hlcodegen_cpu; begin hlcg:=thlcgcpu.create; create_codegen; @@ -60,4 +58,5 @@ implementation begin chlcgobj:=thlcgcpu; + create_hlcodegen:=@create_hlcodegen_cpu; end. diff --git a/compiler/hlcgobj.pas b/compiler/hlcgobj.pas index 619336d814..8ae0de9633 100644 --- a/compiler/hlcgobj.pas +++ b/compiler/hlcgobj.pas @@ -669,7 +669,7 @@ unit hlcgobj; { 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) } chlcgobj: thlcgobjclass; - + create_hlcodegen: TProcedure; procedure destroy_hlcodegen; diff --git a/compiler/i386/hlcgcpu.pas b/compiler/i386/hlcgcpu.pas index e975600ca0..8001d41d95 100644 --- a/compiler/i386/hlcgcpu.pas +++ b/compiler/i386/hlcgcpu.pas @@ -52,8 +52,6 @@ interface procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override; end; - procedure create_hlcodegen; - implementation uses @@ -443,7 +441,7 @@ implementation end; - procedure create_hlcodegen; + procedure create_hlcodegen_cpu; begin hlcg:=thlcgcpu.create; create_codegen; @@ -453,4 +451,5 @@ implementation begin chlcgobj:=thlcgcpu; + create_hlcodegen:=@create_hlcodegen_cpu; end. diff --git a/compiler/i8086/hlcgcpu.pas b/compiler/i8086/hlcgcpu.pas index 43b104cd29..8e8b9852e7 100644 --- a/compiler/i8086/hlcgcpu.pas +++ b/compiler/i8086/hlcgcpu.pas @@ -89,8 +89,6 @@ interface procedure location_force_mem(list:TAsmList;var l:tlocation;size:tdef);override; end; - procedure create_hlcodegen; - implementation uses @@ -713,7 +711,7 @@ implementation end; - procedure create_hlcodegen; + procedure create_hlcodegen_cpu; begin hlcg:=thlcgcpu.create; create_codegen; @@ -722,4 +720,5 @@ implementation begin chlcgobj:=thlcgcpu; + create_hlcodegen:=@create_hlcodegen_cpu; end. diff --git a/compiler/jvm/hlcgcpu.pas b/compiler/jvm/hlcgcpu.pas index 487588d92b..9cb3add73f 100644 --- a/compiler/jvm/hlcgcpu.pas +++ b/compiler/jvm/hlcgcpu.pas @@ -234,8 +234,6 @@ uses end; - procedure create_hlcodegen; - const opcmp2if: array[topcmp] of tasmop = (A_None, @@ -2553,7 +2551,7 @@ implementation result:=get_call_result_cgpara(pd,forceresdef); end; - procedure create_hlcodegen; + procedure create_hlcodegen_cpu; begin hlcg:=thlcgjvm.create; create_codegen; @@ -2561,4 +2559,5 @@ implementation begin chlcgobj:=thlcgjvm; + create_hlcodegen:=@create_hlcodegen_cpu; end. diff --git a/compiler/llvm/hlcgllvm.pas b/compiler/llvm/hlcgllvm.pas index 734ef76ed8..6469c527b9 100644 --- a/compiler/llvm/hlcgllvm.pas +++ b/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); end; - procedure create_hlcodegen; - - implementation uses @@ -172,6 +169,9 @@ implementation pass_2,procinfo,llvmpi,cpuinfo,cgobj,cgllvm,cghlcpu, cgcpu,hlcgcpu; + var + create_hlcodegen_cpu: TProcedure = nil; + const topcg2llvmop: array[topcg] of tllvmop = { OP_NONE OP_MOVE OP_ADD OP_AND OP_DIV OP_IDIV OP_IMUL OP_MUL } @@ -2052,7 +2052,7 @@ implementation end; - procedure create_hlcodegen; + procedure create_hlcodegen_llvm; begin if not assigned(current_procinfo) or not(po_assembler in current_procinfo.procdef.procoptions) then @@ -2064,11 +2064,20 @@ implementation else begin tgobjclass:=orgtgclass; - hlcgcpu.create_hlcodegen; + create_hlcodegen_cpu; { todo: handle/remove chlcgobj } end; end; begin 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. diff --git a/compiler/llvm/llvmpara.pas b/compiler/llvm/llvmpara.pas index af1ce97cdd..2a6642ca32 100644 --- a/compiler/llvm/llvmpara.pas +++ b/compiler/llvm/llvmpara.pas @@ -231,6 +231,11 @@ unit llvmpara; end; 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 procedure like the creations of the code generators, but possibly not since we still call the original paramanager } diff --git a/compiler/llvm/llvmpi.pas b/compiler/llvm/llvmpi.pas index 8acba1a774..6bbc723ce7 100644 --- a/compiler/llvm/llvmpi.pas +++ b/compiler/llvm/llvmpi.pas @@ -98,6 +98,11 @@ implementation begin + if not assigned(cprocinfo) then + begin + writeln('Internalerror 2018052005'); + halt(1); + end; cprocinfo:=tllvmprocinfo; end. diff --git a/compiler/llvm/tgllvm.pas b/compiler/llvm/tgllvm.pas index b570bbb81f..96d564ba9e 100644 --- a/compiler/llvm/tgllvm.pas +++ b/compiler/llvm/tgllvm.pas @@ -183,6 +183,11 @@ implementation begin + if not assigned(tgobjclass) then + begin + writeln('Internalerror 2018052004'); + halt(1); + end; orgtgclass:=tgobjclass; tgobjclass:=ttgllvm; end. diff --git a/compiler/m68k/hlcgcpu.pas b/compiler/m68k/hlcgcpu.pas index 933df656ab..dfdb269760 100644 --- a/compiler/m68k/hlcgcpu.pas +++ b/compiler/m68k/hlcgcpu.pas @@ -47,8 +47,6 @@ interface procedure gen_load_loc_function_result(list: TAsmList; vardef: tdef; const l: tlocation);override; end; - procedure create_hlcodegen; - implementation uses @@ -264,7 +262,7 @@ implementation end; - procedure create_hlcodegen; + procedure create_hlcodegen_cpu; begin hlcg:=thlcgcpu.create; create_codegen; @@ -272,4 +270,5 @@ implementation begin chlcgobj:=thlcgcpu; + create_hlcodegen:=@create_hlcodegen_cpu; end. diff --git a/compiler/mips/hlcgcpu.pas b/compiler/mips/hlcgcpu.pas index 91c2d80c16..85d0298866 100644 --- a/compiler/mips/hlcgcpu.pas +++ b/compiler/mips/hlcgcpu.pas @@ -46,8 +46,6 @@ uses procedure a_jmp_external_name(list: TAsmList; const externalname: TSymStr);override; end; - procedure create_hlcodegen; - implementation uses @@ -275,7 +273,7 @@ implementation end; - procedure create_hlcodegen; + procedure create_hlcodegen_cpu; begin hlcg:=thlcgmips.create; create_codegen; @@ -283,4 +281,5 @@ implementation begin chlcgobj:=thlcgmips; + create_hlcodegen:=@create_hlcodegen_cpu; end. diff --git a/compiler/ncgutil.pas b/compiler/ncgutil.pas index fc9775a3ad..9297205080 100644 --- a/compiler/ncgutil.pas +++ b/compiler/ncgutil.pas @@ -111,10 +111,6 @@ implementation dbgbase, nbas,ncon,nld,nmem,nutils, tgobj,cgobj,hlcgobj,hlcgcpu -{$ifdef llvm} - { override create_hlcodegen from hlcgcpu } - , hlcgllvm -{$endif} {$ifdef powerpc} , cpupi {$endif} diff --git a/compiler/powerpc/hlcgcpu.pas b/compiler/powerpc/hlcgcpu.pas index 3abee7e44e..a7e5566cf0 100644 --- a/compiler/powerpc/hlcgcpu.pas +++ b/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; end; - procedure create_hlcodegen; - implementation uses @@ -111,7 +109,7 @@ implementation - procedure create_hlcodegen; + procedure create_hlcodegen_cpu; begin hlcg:=thlcgcpu.create; create_codegen; @@ -120,5 +118,6 @@ implementation begin chlcgobj:=thlcgcpu; + create_hlcodegen:=@create_hlcodegen_cpu; end. diff --git a/compiler/powerpc64/hlcgcpu.pas b/compiler/powerpc64/hlcgcpu.pas index 49883f73e5..0abf834742 100644 --- a/compiler/powerpc64/hlcgcpu.pas +++ b/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; end; - procedure create_hlcodegen; - implementation uses @@ -119,7 +117,7 @@ implementation end; - procedure create_hlcodegen; + procedure create_hlcodegen_cpu; begin hlcg:=thlcgcpu.create; create_codegen; @@ -129,4 +127,5 @@ implementation begin chlcgobj:=thlcgcpu; + create_hlcodegen:=@create_hlcodegen_cpu; end. diff --git a/compiler/psub.pas b/compiler/psub.pas index 83fbbe11c1..090003ab04 100644 --- a/compiler/psub.pas +++ b/compiler/psub.pas @@ -115,10 +115,6 @@ implementation pbase,pstatmnt,pdecl,pdecsub,pexports,pgenutil,pparautl, { codegen } tgobj,cgbase,cgobj,hlcgobj,hlcgcpu,dbgbase, -{$ifdef llvm} - { override create_hlcodegen from hlcgcpu } - hlcgllvm, -{$endif} ncgutil, optbase, opttail, diff --git a/compiler/riscv/hlcgrv.pas b/compiler/riscv/hlcgrv.pas index 30a1d66968..40bcaf92d8 100644 --- a/compiler/riscv/hlcgrv.pas +++ b/compiler/riscv/hlcgrv.pas @@ -256,5 +256,16 @@ implementation list.concat(Tai_symbol_end.Create(sym)); end; + + procedure create_hlcodegen_cpu; + begin + hlcg:=thlcgriscv.create; +// create_codegen; + end; + + +begin + chlcgobj:=thlcgriscv; + create_hlcodegen:=@create_hlcodegen_cpu; end. diff --git a/compiler/sparcgen/hlcgcpu.pas b/compiler/sparcgen/hlcgcpu.pas index e22e4e31c0..cedf7adee1 100644 --- a/compiler/sparcgen/hlcgcpu.pas +++ b/compiler/sparcgen/hlcgcpu.pas @@ -42,8 +42,6 @@ interface procedure a_jmp_external_name(list: TAsmList; const externalname: TSymStr);override; end; - procedure create_hlcodegen; - implementation uses @@ -135,7 +133,7 @@ implementation end; - procedure create_hlcodegen; + procedure create_hlcodegen_cpu; begin hlcg:=thlcgcpu.create; create_codegen; @@ -143,4 +141,5 @@ implementation begin chlcgobj:=thlcgcpu; + create_hlcodegen:=@create_hlcodegen_cpu; end. diff --git a/compiler/x86_64/hlcgcpu.pas b/compiler/x86_64/hlcgcpu.pas index 640214e954..096425300e 100644 --- a/compiler/x86_64/hlcgcpu.pas +++ b/compiler/x86_64/hlcgcpu.pas @@ -38,8 +38,6 @@ interface procedure g_intf_wrapper(list: TAsmList; procdef: tprocdef; const labelname: string; ioffset: longint);override; end; - procedure create_hlcodegen; - implementation uses @@ -113,7 +111,7 @@ implementation end; - procedure create_hlcodegen; + procedure create_hlcodegen_cpu; begin hlcg:=thlcgcpu.create; create_codegen; @@ -121,4 +119,5 @@ implementation begin chlcgobj:=thlcgcpu; + create_hlcodegen:=@create_hlcodegen_cpu; end.