* factored out the creation of start/end symbols of vectorized dead strippable

sections such as the resourcestring data

git-svn-id: trunk@32391 -
This commit is contained in:
Jonas Maebe 2015-11-21 12:35:56 +00:00
parent d5428ee210
commit 964f8c9f9b
3 changed files with 25 additions and 9 deletions

View File

@ -29,7 +29,7 @@ interface
uses
cclasses,globtype,constexp,
aasmbase,aasmdata,aasmtai,
symconst,symtype,symdef,symsym;
symconst,symbase,symtype,symdef,symsym;
type
{ typed const: integer/floating point/string/pointer/... const along with
@ -296,6 +296,10 @@ type
procedure mark_anon_aggregate_alignment; virtual; abstract;
procedure insert_marked_aggregate_alignment(def: tdef); virtual; abstract;
public
{ get the start/end symbol for a dead stripable vectorized section, such
as the resourcestring data of a unit }
class function get_vectorized_dead_strip_section_symbol(const basename: string; st: tsymtable; start: boolean): tasmsymbol; virtual;
class function get_dynstring_rec_name(typ: tstringtype; winlike: boolean; len: asizeint): string;
{ the datalist parameter specifies where the data for the string constant
will be emitted (via an internal data builder) }
@ -443,7 +447,7 @@ implementation
uses
verbose,globals,systems,widestr,
fmodule,
symbase,symtable,defutil;
symtable,defutil;
{****************************************************************************
taggregateinformation
@ -1256,6 +1260,15 @@ implementation
end;
class function ttai_typedconstbuilder.get_vectorized_dead_strip_section_symbol(const basename: string; st: tsymtable; start: boolean): tasmsymbol;
begin
if start then
result:=current_asmdata.DefineAsmSymbol(make_mangledname(basename,st,'START'),AB_GLOBAL,AT_DATA)
else
result:=current_asmdata.DefineAsmSymbol(make_mangledname(basename,st,'END'),AB_GLOBAL,AT_DATA);
end;
class function ttai_typedconstbuilder.get_dynstring_rec_name(typ: tstringtype; winlike: boolean; len: asizeint): string;
begin
case typ of

View File

@ -37,7 +37,7 @@ uses
{$endif}
cclasses,widestr,
cutils,globtype,globals,systems,
symbase,symconst,symtype,symdef,symsym,
symbase,symconst,symtype,symdef,symsym,symtable,
verbose,fmodule,ppu,
aasmbase,aasmtai,aasmdata,aasmcnst,
aasmcpu;
@ -147,9 +147,8 @@ uses
maybe_new_object_file(current_asmdata.asmlists[al_resourcestrings]);
new_section(current_asmdata.asmlists[al_resourcestrings],sec_data,make_mangledname('RESSTR',current_module.localsymtable,'1_START'),sizeof(pint));
current_asmdata.AsmLists[al_resourcestrings].concat(tai_symbol.createname_global(
make_mangledname('RESSTR',current_module.localsymtable,'START'),AT_DATA,0));
current_asmdata.AsmLists[al_resourcestrings].concat(tai_symbol.Create_Global(
ctai_typedconstbuilder.get_vectorized_dead_strip_section_symbol('RESSTR',current_module.localsymtable,true),0));
{ Write unitname entry }
namelab:=tcb.emit_ansistring_const(current_asmdata.asmlists[al_const],@current_module.localsymtable.name^[1],length(current_module.localsymtable.name^),getansistringcodepage);
current_asmdata.asmlists[al_resourcestrings].concat(tai_const.Create_sym_offset(namelab.lab,namelab.ofs));
@ -202,7 +201,7 @@ uses
{ nothing has been emited to the tcb itself }
tcb.free;
new_section(current_asmdata.asmlists[al_resourcestrings],sec_data,make_mangledname('RESSTR',current_module.localsymtable,'3_END'),sizeof(pint));
endsymlab:=current_asmdata.DefineAsmSymbol(make_mangledname('RESSTR',current_module.localsymtable,'END'),AB_GLOBAL,AT_DATA);
endsymlab:=ctai_typedconstbuilder.get_vectorized_dead_strip_section_symbol('RESSTR',current_module.localsymtable,false);
current_asmdata.AsmLists[al_resourcestrings].concat(tai_symbol.create_global(endsymlab,0));
{ The darwin/ppc64 assembler or linker seems to have trouble }
{ if a section ends with a global label without any data after it. }

View File

@ -970,8 +970,12 @@ implementation
begin
If (hp.flags and uf_has_resourcestrings)=uf_has_resourcestrings then
begin
ResourceStringTables.concat(Tai_const.Createname(make_mangledname('RESSTR',hp.localsymtable,'START'),AT_DATA,0));
ResourceStringTables.concat(Tai_const.Createname(make_mangledname('RESSTR',hp.localsymtable,'END'),AT_DATA,0));
ResourceStringTables.concat(Tai_const.Create_sym(
ctai_typedconstbuilder.get_vectorized_dead_strip_section_symbol('RESSTR',hp.localsymtable,true))
);
ResourceStringTables.concat(Tai_const.Create_sym(
ctai_typedconstbuilder.get_vectorized_dead_strip_section_symbol('RESSTR',hp.localsymtable,false))
);
inc(count);
end;
hp:=tmodule(hp.next);