From 210b532832d5435667102d061aca6cada98b62a2 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Mon, 6 Oct 2014 20:53:20 +0000 Subject: [PATCH] * split up specifying the type of the section of a typed constant and whether it should be put in a new section git-svn-id: branches/hlcgllvm@28753 - --- compiler/aasmcnst.pas | 34 +++++++++++++++++++++------------- compiler/llvm/nllvmtcon.pas | 4 ++-- compiler/ncgcon.pas | 4 ++-- compiler/ngtcon.pas | 6 +++--- 4 files changed, 28 insertions(+), 20 deletions(-) diff --git a/compiler/aasmcnst.pas b/compiler/aasmcnst.pas index ab3bd630b1..c78ce1018f 100644 --- a/compiler/aasmcnst.pas +++ b/compiler/aasmcnst.pas @@ -98,6 +98,15 @@ type ofs: asizeint; end; + { flags for the finalisation of the typed const builder asmlist } + ttcasmlistoption = ( + { the tasmsymbol is a tasmlabel } + tcalo_is_lab, + { start a new section } + tcalo_new_section + ); + ttcasmlistoptions = set of ttcasmlistoption; + { Warning: never directly create a ttai_typedconstbuilder instance, instead create a cai_typedconstbuilder (this class can be overridden) } ttai_lowleveltypedconstbuilder = class abstract @@ -115,7 +124,7 @@ type platform } function aggregate_kind(def: tdef): ttypedconstkind; virtual; { finalize the asmlist: add the necessary symbols etc } - procedure finalize_asmlist(sym: tasmsymbol; def: tdef; section: TAsmSectiontype; const secname: TSymStr; alignment: shortint; lab: boolean); virtual; + procedure finalize_asmlist(sym: tasmsymbol; def: tdef; section: TAsmSectiontype; const secname: TSymStr; alignment: shortint; const options: ttcasmlistoptions); virtual; public constructor create; virtual; destructor destroy; override; @@ -186,7 +195,7 @@ type This asmlist will be freed when the builder is destroyed, so add its contents to another list first. This property should only be accessed once all data has been added. } - function get_final_asmlist(sym: tasmsymbol; def: tdef; section: TAsmSectiontype; const secname: TSymStr; alignment: longint; lab: boolean): tasmlist; + function get_final_asmlist(sym: tasmsymbol; def: tdef; section: TAsmSectiontype; const secname: TSymStr; alignment: longint; const options: ttcasmlistoptions): tasmlist; { returns the offset of the string data relative to ansi/unicode/widestring constant labels. On most platforms, this is 0 (with the header at a @@ -413,19 +422,19 @@ implementation end; - procedure ttai_lowleveltypedconstbuilder.finalize_asmlist(sym: tasmsymbol; def: tdef; section: TAsmSectiontype; const secname: TSymStr; alignment: shortint; lab: boolean); + procedure ttai_lowleveltypedconstbuilder.finalize_asmlist(sym: tasmsymbol; def: tdef; section: TAsmSectiontype; const secname: TSymStr; alignment: shortint; const options: ttcasmlistoptions); var prelist: tasmlist; begin prelist:=tasmlist.create_without_marker; { only now add items based on the symbolname, because it may be modified by the "section" specifier in case of a typed constant } - if section<>sec_none then + if tcalo_new_section in options then begin maybe_new_object_file(prelist); new_section(prelist,section,secname,const_align(alignment)); end; - if not lab then + if not(tcalo_is_lab in options) then if sym.bind=AB_GLOBAL then prelist.concat(tai_symbol.Create_Global(sym,0)) else @@ -441,11 +450,11 @@ implementation end; - function ttai_lowleveltypedconstbuilder.get_final_asmlist(sym: tasmsymbol; def: tdef; section: TAsmSectiontype; const secname: TSymStr; alignment: longint; lab: boolean): tasmlist; + function ttai_lowleveltypedconstbuilder.get_final_asmlist(sym: tasmsymbol; def: tdef; section: TAsmSectiontype; const secname: TSymStr; alignment: longint; const options: ttcasmlistoptions): tasmlist; begin if not fasmlist_finalized then begin - finalize_asmlist(sym,def,section,secname,alignment,lab); + finalize_asmlist(sym,def,section,secname,alignment,options); fasmlist_finalized:=true; end; result:=fasmlist; @@ -605,10 +614,10 @@ implementation var s: PChar; startlab: tasmlabel; - sectype: TAsmSectiontype; ansistrrecdef: trecorddef; datadef: tdef; datatcb: ttai_lowleveltypedconstbuilder; + options: ttcasmlistoptions; begin datatcb:=self.create; result:=datatcb.emit_string_const_common(list,st_ansistring,len,encoding,startlab); @@ -622,11 +631,10 @@ implementation datatcb.emit_tai(tai_string.create_pchar(s,len+1),datadef); datatcb.maybe_end_aggregate(datadef); ansistrrecdef:=datatcb.end_anonymous_record; + options:=[tcalo_is_lab]; if NewSection then - sectype:=sec_rodata_norel - else - sectype:=sec_none; - list.concatlist(datatcb.get_final_asmlist(startlab,ansistrrecdef,sectype,startlab.name,const_align(sizeof(pint)),true)); + include(options,tcalo_new_section); + list.concatlist(datatcb.get_final_asmlist(startlab,ansistrrecdef,sec_rodata_norel,startlab.name,const_align(sizeof(pint)),options)); datatcb.free; end; @@ -677,7 +685,7 @@ implementation else { code generation for other sizes must be written } internalerror(200904271); - list.concatlist(datatcb.get_final_asmlist(startlab,uniwidestrrecdef,sec_rodata_norel,startlab.name,const_align(sizeof(pint)),true)); + list.concatlist(datatcb.get_final_asmlist(startlab,uniwidestrrecdef,sec_rodata_norel,startlab.name,const_align(sizeof(pint)),[tcalo_is_lab,tcalo_new_section])); datatcb.free; end; diff --git a/compiler/llvm/nllvmtcon.pas b/compiler/llvm/nllvmtcon.pas index a7d6187aac..a418e5ccad 100644 --- a/compiler/llvm/nllvmtcon.pas +++ b/compiler/llvm/nllvmtcon.pas @@ -43,7 +43,7 @@ interface flast_added_tai: tai; fqueued_tai_opidx: longint; - procedure finalize_asmlist(sym: tasmsymbol; def: tdef; section: TAsmSectiontype; const secname: TSymStr; alignment: shortint; lab: boolean); override; + procedure finalize_asmlist(sym: tasmsymbol; def: tdef; section: TAsmSectiontype; const secname: TSymStr; alignment: shortint; const options: ttcasmlistoptions); override; { outerai: the ai that should become fqueued_tai in case it's still nil, or that should be filled in the fqueued_tai_opidx of the current fqueued_tai if it's not nil @@ -87,7 +87,7 @@ implementation cpubase,llvmbase, symbase,symtable,llvmdef,defutil; - procedure tllvmtai_typedconstbuilder.finalize_asmlist(sym: tasmsymbol; def: tdef; section: TAsmSectiontype; const secname: TSymStr; alignment: shortint; lab: boolean); + procedure tllvmtai_typedconstbuilder.finalize_asmlist(sym: tasmsymbol; def: tdef; section: TAsmSectiontype; const secname: TSymStr; alignment: shortint; const options: ttcasmlistoptions); var newasmlist: tasmlist; begin diff --git a/compiler/ncgcon.pas b/compiler/ncgcon.pas index 64ded98177..1942850d4f 100644 --- a/compiler/ncgcon.pas +++ b/compiler/ncgcon.pas @@ -376,7 +376,7 @@ implementation datatcb.emit_tai(Tai_string.Create_pchar(pc,l+1),datadef); datatcb.maybe_end_aggregate(datadef); current_asmdata.asmlists[al_typedconsts].concatList( - datatcb.get_final_asmlist(lastlabel.lab,datadef,sec_rodata_norel,lastlabel.lab.name,const_align(sizeof(pint)),true) + datatcb.get_final_asmlist(lastlabel.lab,datadef,sec_rodata_norel,lastlabel.lab.name,const_align(sizeof(pint)),[tcalo_is_lab,tcalo_new_section]) ); datatcb.free; end; @@ -398,7 +398,7 @@ implementation datatcb.emit_tai(Tai_string.Create_pchar(pc,len+1),datadef); datatcb.maybe_end_aggregate(datadef); current_asmdata.asmlists[al_typedconsts].concatList( - datatcb.get_final_asmlist(lastlabel.lab,datadef,sec_rodata_norel,lastlabel.lab.name,const_align(sizeof(pint)),true) + datatcb.get_final_asmlist(lastlabel.lab,datadef,sec_rodata_norel,lastlabel.lab.name,const_align(sizeof(pint)),[tcalo_is_lab,tcalo_new_section]) ); datatcb.free; end; diff --git a/compiler/ngtcon.pas b/compiler/ngtcon.pas index f472c8585f..c39dedc4a4 100644 --- a/compiler/ngtcon.pas +++ b/compiler/ngtcon.pas @@ -875,7 +875,7 @@ function get_next_varsym(def: tabstractrecorddef; const SymList:TFPHashObjectLis IncompatibleTypes(node.resultdef, def); datadef:=getarraydef(cansichartype,1); end; - current_asmdata.asmlists[al_const].concatlist(datatcb.get_final_asmlist(ll,datadef,sec_rodata,ll.name,varalign,true)); + current_asmdata.asmlists[al_const].concatlist(datatcb.get_final_asmlist(ll,datadef,sec_rodata,ll.name,varalign,[tcalo_is_lab,tcalo_new_section])); datatcb.free; { we now emit the address of the first element of the array containing the string data } @@ -913,7 +913,7 @@ function get_next_varsym(def: tabstractrecorddef; const SymList:TFPHashObjectLis datatcb.emit_tai(Tai_const.Create_16bit(0),cwidechartype); datatcb.maybe_end_aggregate(datadef); { concat add the string data to the al_const asmlist } - current_asmdata.asmlists[al_const].concatlist(datatcb.get_final_asmlist(ll,datadef,sec_rodata,ll.name,const_align(sizeof(pint)),true)); + current_asmdata.asmlists[al_const].concatlist(datatcb.get_final_asmlist(ll,datadef,sec_rodata,ll.name,const_align(sizeof(pint)),[tcalo_is_lab,tcalo_new_section])); datatcb.free; { we now emit the address of the first element of the array containing the string data } @@ -1136,7 +1136,7 @@ function get_next_varsym(def: tabstractrecorddef; const SymList:TFPHashObjectLis sec:=sec_data; secname:=asmsym.Name; end; - result:=ftcb.get_final_asmlist(asmsym,fsym.vardef,sec,secname,fsym.vardef.alignment,false); + result:=ftcb.get_final_asmlist(asmsym,fsym.vardef,sec,secname,fsym.vardef.alignment,[tcalo_new_section]); if addstabx then begin { see same code in ncgutil.insertbssdata }