From a4ee98226998838819da8cea3ebb9d45ba21831a Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Sat, 12 Sep 2015 23:33:35 +0000 Subject: [PATCH] * converted tnodeutils.InsertInitFinalTable to the high level typed const builder and enabled it for LLVM git-svn-id: trunk@31651 - --- compiler/llvm/nllvmutil.pas | 7 ---- compiler/ngenutil.pas | 68 ++++++++++++++++++++++++------------- 2 files changed, 44 insertions(+), 31 deletions(-) diff --git a/compiler/llvm/nllvmutil.pas b/compiler/llvm/nllvmutil.pas index dacb7b04f1..2348a7e1d5 100644 --- a/compiler/llvm/nllvmutil.pas +++ b/compiler/llvm/nllvmutil.pas @@ -36,7 +36,6 @@ interface strict protected class procedure insertbsssym(list: tasmlist; sym: tstaticvarsym; size: asizeint; varalign: shortint); override; public - class procedure InsertInitFinalTable; override; class procedure InsertWideInitsTablesTable; override; class procedure InsertWideInits; override; class procedure InsertResourceTablesTable; override; @@ -74,12 +73,6 @@ implementation end; - class procedure tllvmnodeutils.InsertInitFinalTable; - begin - { todo } - end; - - class procedure tllvmnodeutils.InsertWideInitsTablesTable; begin { not required } diff --git a/compiler/ngenutil.pas b/compiler/ngenutil.pas index 1bb9596af7..a17f33ec01 100644 --- a/compiler/ngenutil.pas +++ b/compiler/ngenutil.pas @@ -634,8 +634,9 @@ implementation class procedure tnodeutils.InsertInitFinalTable; var hp : tused_unit; - unitinits : TAsmList; + unitinits : ttai_typedconstbuilder; count : aint; + tablecountplaceholder: ttypedconstplaceholder; procedure write_struct_inits(u: tmodule); var @@ -648,25 +649,32 @@ implementation u.globalsymtable.DefList.ForEachCall(@AddToStructInits,structlist); u.localsymtable.DefList.ForEachCall(@AddToStructInits,structlist); { write structures } - for i := 0 to structlist.Count - 1 do + for i:=0 to structlist.Count-1 do begin - pd := tabstractrecorddef(structlist[i]).find_procdef_bytype(potype_class_constructor); + pd:=tabstractrecorddef(structlist[i]).find_procdef_bytype(potype_class_constructor); if assigned(pd) then - unitinits.concat(Tai_const.Createname(pd.mangledname,AT_FUNCTION,0)) + unitinits.emit_procdef_const(pd) else - unitinits.concat(Tai_const.Create_nil_codeptr); + unitinits.emit_tai(Tai_const.Create_nil_codeptr,voidcodepointertype); pd := tabstractrecorddef(structlist[i]).find_procdef_bytype(potype_class_destructor); if assigned(pd) then - unitinits.concat(Tai_const.Createname(pd.mangledname,AT_FUNCTION,0)) + unitinits.emit_procdef_const(pd) else - unitinits.concat(Tai_const.Create_nil_codeptr); + unitinits.emit_tai(Tai_const.Create_nil_codeptr,voidcodepointertype); inc(count); end; structlist.free; end; begin - unitinits:=TAsmList.Create; + unitinits:=ctai_typedconstbuilder.create([tcalo_make_dead_strippable,tcalo_new_section]); + unitinits.begin_anonymous_record('',default_settings.packrecords,sizeof(pint), + targetinfos[target_info.system]^.alignment.recordalignmin, + targetinfos[target_info.system]^.alignment.maxCrecordalign); + { placeholder for tablecount } + tablecountplaceholder:=unitinits.emit_placeholder(sinttype); + { initcount (initialised at run time } + unitinits.emit_ord_const(0,sinttype); count:=0; hp:=tused_unit(usedunits.first); while assigned(hp) do @@ -680,13 +688,17 @@ implementation if count=high(aint) then Message1(cg_f_max_units_reached,tostr(count)); if (hp.u.flags and uf_init)<>0 then - unitinits.concat(Tai_const.Createname(make_mangledname('INIT$',hp.u.globalsymtable,''),AT_FUNCTION,0)) + unitinits.emit_tai( + Tai_const.Createname(make_mangledname('INIT$',hp.u.globalsymtable,''),AT_FUNCTION,0), + voidcodepointertype) else - unitinits.concat(Tai_const.Create_nil_codeptr); + unitinits.emit_tai(Tai_const.Create_nil_codeptr,voidcodepointertype); if (hp.u.flags and uf_finalize)<>0 then - unitinits.concat(Tai_const.Createname(make_mangledname('FINALIZE$',hp.u.globalsymtable,''),AT_FUNCTION,0)) + unitinits.emit_tai( + Tai_const.Createname(make_mangledname('FINALIZE$',hp.u.globalsymtable,''),AT_FUNCTION,0), + voidcodepointertype) else - unitinits.concat(Tai_const.Create_nil_codeptr); + unitinits.emit_tai(Tai_const.Create_nil_codeptr,voidcodepointertype); inc(count); end; hp:=tused_unit(hp.next); @@ -698,24 +710,32 @@ implementation if (current_module.flags and (uf_init or uf_finalize))<>0 then begin if (current_module.flags and uf_init)<>0 then - unitinits.concat(Tai_const.Createname(make_mangledname('INIT$',current_module.localsymtable,''),AT_FUNCTION,0)) + unitinits.emit_tai( + Tai_const.Createname(make_mangledname('INIT$',current_module.localsymtable,''),AT_FUNCTION,0), + voidcodepointertype) else - unitinits.concat(Tai_const.Create_nil_codeptr); + unitinits.emit_tai(Tai_const.Create_nil_codeptr,voidcodepointertype); if (current_module.flags and uf_finalize)<>0 then - unitinits.concat(Tai_const.Createname(make_mangledname('FINALIZE$',current_module.localsymtable,''),AT_FUNCTION,0)) + unitinits.emit_tai( + Tai_const.Createname(make_mangledname('FINALIZE$',current_module.localsymtable,''),AT_FUNCTION,0), + voidcodepointertype) else - unitinits.concat(Tai_const.Create_nil_codeptr); + unitinits.emit_tai(Tai_const.Create_nil_codeptr,voidcodepointertype); inc(count); end; - { Insert TableCount,InitCount at start } - unitinits.insert(Tai_const.Create_aint(0)); - unitinits.insert(Tai_const.Create_aint(count)); + { fill in tablecount } + tablecountplaceholder.replace(tai_const.Create_aint(count),sinttype); + tablecountplaceholder.free; { Add to data segment } - maybe_new_object_file(current_asmdata.asmlists[al_globals]); - new_section(current_asmdata.asmlists[al_globals],sec_data,'INITFINAL',const_align(sizeof(pint))); - current_asmdata.asmlists[al_globals].concat(Tai_symbol.Createname_global('INITFINAL',AT_DATA,0)); - current_asmdata.asmlists[al_globals].concatlist(unitinits); - current_asmdata.asmlists[al_globals].concat(Tai_symbol_end.Createname('INITFINAL')); + + current_asmdata.asmlists[al_globals].concatlist( + unitinits.get_final_asmlist( + current_asmdata.DefineAsmSymbol('INITFINAL',AB_GLOBAL,AT_DATA), + unitinits.end_anonymous_record, + sec_data,'INITFINAL',sizeof(pint) + ) + ); + unitinits.free; end;