* converted the generation of cst_conststring and cst_shortstring string

constants to the typed constant builder

git-svn-id: branches/hlcgllvm@28210 -
This commit is contained in:
Jonas Maebe 2014-07-12 22:42:26 +00:00
parent bfe431913d
commit ea9fbe381e

View File

@ -267,6 +267,8 @@ implementation
winlikewidestring: boolean;
elementdef: tdef;
strpointerdef: tdef;
datatcb: ttai_lowleveltypedconstbuilder;
datadef: tdef;
const
PoolMap: array[tconststringtype] of TConstPoolType = (
@ -355,10 +357,8 @@ implementation
cst_shortstring:
begin
current_asmdata.getdatalabel(lastlabel.lab);
maybe_new_object_file(current_asmdata.asmlists[al_typedconsts]);
new_section(current_asmdata.asmlists[al_typedconsts],sec_rodata_norel,lastlabel.lab.name,const_align(sizeof(pint)));
current_asmdata.asmlists[al_typedconsts].concat(Tai_label.Create(lastlabel.lab));
datatcb:=ctai_typedconstbuilder.create;
{ truncate strings larger than 255 chars }
if len>255 then
l:=255
@ -369,20 +369,36 @@ implementation
move(value_str^,pc[1],l);
pc[0]:=chr(l);
pc[l+1]:=#0;
current_asmdata.asmlists[al_typedconsts].concat(Tai_string.Create_pchar(pc,l+2));
datadef:=getarraydef(cansichartype,l+1);
datatcb.maybe_begin_aggregate(datadef);
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.free;
end;
cst_conststring:
begin
current_asmdata.getdatalabel(lastlabel.lab);
maybe_new_object_file(current_asmdata.asmlists[al_typedconsts]);
new_section(current_asmdata.asmlists[al_typedconsts],sec_rodata_norel,lastlabel.lab.name,const_align(sizeof(pint)));
current_asmdata.asmlists[al_typedconsts].concat(Tai_label.Create(lastlabel.lab));
datatcb:=ctai_typedconstbuilder.create;
{ include terminating zero }
getmem(pc,len+1);
move(value_str^,pc[0],len);
pc[len]:=#0;
current_asmdata.asmlists[al_typedconsts].concat(Tai_string.Create_pchar(pc,len+1));
{ the data includes the terminating #0 because this
string can be used for pchar assignments (but it's
also used for array-of-char assignments, in which
case the terminating #0 is not part of the data) }
datadef:=getarraydef(cansichartype,len+1);
datatcb.maybe_begin_aggregate(datadef);
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.free;
end;
else
internalerror(2013120103);