Przeglądaj źródła

* converted the generation of cst_conststring and cst_shortstring string
constants to the typed constant builder

git-svn-id: branches/hlcgllvm@28210 -

Jonas Maebe 11 lat temu
rodzic
commit
ea9fbe381e
1 zmienionych plików z 24 dodań i 8 usunięć
  1. 24 8
      compiler/ncgcon.pas

+ 24 - 8
compiler/ncgcon.pas

@@ -267,6 +267,8 @@ implementation
          winlikewidestring: boolean;
          winlikewidestring: boolean;
          elementdef: tdef;
          elementdef: tdef;
          strpointerdef: tdef;
          strpointerdef: tdef;
+         datatcb: ttai_lowleveltypedconstbuilder;
+         datadef: tdef;
 
 
       const
       const
         PoolMap: array[tconststringtype] of TConstPoolType = (
         PoolMap: array[tconststringtype] of TConstPoolType = (
@@ -355,10 +357,8 @@ implementation
                       cst_shortstring:
                       cst_shortstring:
                         begin
                         begin
                           current_asmdata.getdatalabel(lastlabel.lab);
                           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 }
                           { truncate strings larger than 255 chars }
                           if len>255 then
                           if len>255 then
                            l:=255
                            l:=255
@@ -369,20 +369,36 @@ implementation
                           move(value_str^,pc[1],l);
                           move(value_str^,pc[1],l);
                           pc[0]:=chr(l);
                           pc[0]:=chr(l);
                           pc[l+1]:=#0;
                           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;
                         end;
                       cst_conststring:
                       cst_conststring:
                         begin
                         begin
                           current_asmdata.getdatalabel(lastlabel.lab);
                           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 }
                           { include terminating zero }
                           getmem(pc,len+1);
                           getmem(pc,len+1);
                           move(value_str^,pc[0],len);
                           move(value_str^,pc[0],len);
                           pc[len]:=#0;
                           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;
                         end;
                       else
                       else
                         internalerror(2013120103);
                         internalerror(2013120103);