+ provide way to specify a custom section name for vectorized dead strippable

sections
   o does nothing by default, will be used by llvm

git-svn-id: trunk@32398 -
This commit is contained in:
Jonas Maebe 2015-11-21 12:36:20 +00:00
parent 416894f206
commit 4974201d7f

View File

@ -310,6 +310,7 @@ type
procedure insert_marked_aggregate_alignment(def: tdef); virtual; abstract; procedure insert_marked_aggregate_alignment(def: tdef); virtual; abstract;
class function get_vectorized_dead_strip_section_symbol(const basename: string; st: tsymtable; define, start: boolean): tasmsymbol; virtual; class function get_vectorized_dead_strip_section_symbol(const basename: string; st: tsymtable; define, start: boolean): tasmsymbol; virtual;
public public
class function get_vectorized_dead_strip_custom_section_name(const basename: TSymStr; st: tsymtable; out secname: TSymStr): boolean; virtual;
{ get the start/end symbol for a dead stripable vectorized section, such { get the start/end symbol for a dead stripable vectorized section, such
as the resourcestring data of a unit } as the resourcestring data of a unit }
class function get_vectorized_dead_strip_section_symbol_start(const basename: string; st: tsymtable; define: boolean): tasmsymbol; virtual; class function get_vectorized_dead_strip_section_symbol_start(const basename: string; st: tsymtable; define: boolean): tasmsymbol; virtual;
@ -943,17 +944,25 @@ implementation
var var
sym: tasmsymbol; sym: tasmsymbol;
secname: TSymStr; secname: TSymStr;
sectype: TAsmSectiontype;
customsecname,
secend: boolean; secend: boolean;
begin begin
fvectorized_finalize_called:=true; fvectorized_finalize_called:=true;
secend:=false; secend:=false;
customsecname:=get_vectorized_dead_strip_custom_section_name(basename,st,secname);
if customsecname then
sectype:=sec_user
else
sectype:=sec_data;
if tcalo_vectorized_dead_strip_start in options then if tcalo_vectorized_dead_strip_start in options then
begin begin
{ the start and end names are predefined } { the start and end names are predefined }
if itemname<>'' then if itemname<>'' then
internalerror(2015110801); internalerror(2015110801);
sym:=get_vectorized_dead_strip_section_symbol_start(basename,st,true); sym:=get_vectorized_dead_strip_section_symbol_start(basename,st,true);
secname:=make_mangledname(basename,st,'1_START'); if not customsecname then
secname:=make_mangledname(basename,st,'1_START');
end end
else if tcalo_vectorized_dead_strip_end in options then else if tcalo_vectorized_dead_strip_end in options then
begin begin
@ -961,16 +970,18 @@ implementation
if itemname<>'' then if itemname<>'' then
internalerror(2015110802); internalerror(2015110802);
sym:=get_vectorized_dead_strip_section_symbol_end(basename,st,true); sym:=get_vectorized_dead_strip_section_symbol_end(basename,st,true);
make_mangledname(basename,st,'3_END'); if not customsecname then
make_mangledname(basename,st,'3_END');
secend:=true; secend:=true;
end end
else if tcalo_vectorized_dead_strip_item in options then else if tcalo_vectorized_dead_strip_item in options then
begin begin
sym:=current_asmdata.DefineAsmSymbol(make_mangledname(basename,st,itemname),AB_GLOBAL,AT_DATA); sym:=current_asmdata.DefineAsmSymbol(make_mangledname(basename,st,itemname),AB_GLOBAL,AT_DATA);
secname:=make_mangledname(basename,st,'2_'+itemname); if not customsecname then
secname:=make_mangledname(basename,st,'2_'+itemname);
exclude(options,tcalo_vectorized_dead_strip_item); exclude(options,tcalo_vectorized_dead_strip_item);
end; end;
finalize_asmlist(sym,def,sec_data,secname,alignment,options); finalize_asmlist(sym,def,sectype,secname,alignment,options);
{ The darwin/ppc64 assembler or linker seems to have trouble } { The darwin/ppc64 assembler or linker seems to have trouble }
{ if a section ends with a global label without any data after it. } { if a section ends with a global label without any data after it. }
{ So for safety, just put a dummy value here. } { So for safety, just put a dummy value here. }
@ -1351,6 +1362,12 @@ implementation
end; end;
class function ttai_typedconstbuilder.get_vectorized_dead_strip_custom_section_name(const basename: TSymStr; st: tsymtable; out secname: TSymStr): boolean;
begin
result:=false;
end;
class function ttai_typedconstbuilder.get_vectorized_dead_strip_section_symbol_start(const basename: string; st: tsymtable; define: boolean): tasmsymbol; class function ttai_typedconstbuilder.get_vectorized_dead_strip_section_symbol_start(const basename: string; st: tsymtable; define: boolean): tasmsymbol;
begin begin
result:=get_vectorized_dead_strip_section_symbol(basename,st,define,true); result:=get_vectorized_dead_strip_section_symbol(basename,st,define,true);