mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-09 20:47:24 +02:00
* 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:
parent
bfe431913d
commit
ea9fbe381e
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user