Просмотр исходного кода

* converted tnodeutils.InsertThreadvars to the high level typed constant
builder

git-svn-id: trunk@31647 -

Jonas Maebe 10 лет назад
Родитель
Сommit
f49d6e5f26
1 измененных файлов с 32 добавлено и 23 удалено
  1. 32 23
      compiler/ngenutil.pas

+ 32 - 23
compiler/ngenutil.pas

@@ -116,7 +116,7 @@ implementation
     uses
       verbose,version,globals,cutils,constexp,
       scanner,systems,procinfo,fmodule,
-      aasmbase,aasmtai,
+      aasmbase,aasmtai,aasmcnst,
       symbase,symtable,defutil,
       nadd,ncal,ncnv,ncon,nflw,ninl,nld,nmem,nobj,nutils,
       ppu,
@@ -761,16 +761,21 @@ implementation
 
   procedure AddToThreadvarList(p:TObject;arg:pointer);
     var
-      ltvTable : TAsmList;
+      tcb: ttai_typedconstbuilder;
+      field1, field2: tsym;
     begin
-      ltvTable:=TAsmList(arg);
       if (tsym(p).typ=staticvarsym) and
          (vo_is_thread_var in tstaticvarsym(p).varoptions) then
        begin
+         tcb:=ttai_typedconstbuilder(arg);
          { address of threadvar }
-         ltvTable.concat(tai_const.Createname(tstaticvarsym(p).mangledname,0));
+         tcb.emit_tai(tai_const.Createname(tstaticvarsym(p).mangledname,0),
+           cpointerdef.getreusable(
+             get_threadvar_record(tstaticvarsym(p).vardef,field1,field2)
+           )
+         );
          { size of threadvar }
-         ltvTable.concat(tai_const.create_32bit(tstaticvarsym(p).getsize));
+         tcb.emit_ord_const(tstaticvarsym(p).getsize,u32inttype);
        end;
     end;
 
@@ -778,28 +783,32 @@ implementation
   class procedure tnodeutils.InsertThreadvars;
     var
       s : string;
-      ltvTable : TAsmList;
+      tcb: ttai_typedconstbuilder;
+      sym: tasmsymbol;
+      tabledef: trecorddef;
     begin
        if (tf_section_threadvars in target_info.flags) then
          exit;
-       ltvTable:=TAsmList.create;
+       tcb:=ctai_typedconstbuilder.create([tcalo_make_dead_strippable,tcalo_new_section]);
+       tabledef:=tcb.begin_anonymous_record('',1,sizeof(pint),
+         targetinfos[target_info.system]^.alignment.recordalignmin,
+         targetinfos[target_info.system]^.alignment.maxCrecordalign);
        if assigned(current_module.globalsymtable) then
-         current_module.globalsymtable.SymList.ForEachCall(@AddToThreadvarList,ltvTable);
-       current_module.localsymtable.SymList.ForEachCall(@AddToThreadvarList,ltvTable);
-       if not ltvTable.Empty then
-        begin
-          s:=make_mangledname('THREADVARLIST',current_module.localsymtable,'');
-          { end of the list marker }
-          ltvTable.concat(tai_const.create_sym(nil));
-          { add to datasegment }
-          maybe_new_object_file(current_asmdata.asmlists[al_globals]);
-          new_section(current_asmdata.asmlists[al_globals],sec_data,s,sizeof(pint));
-          current_asmdata.asmlists[al_globals].concat(Tai_symbol.Createname_global(s,AT_DATA,0));
-          current_asmdata.asmlists[al_globals].concatlist(ltvTable);
-          current_asmdata.asmlists[al_globals].concat(Tai_symbol_end.Createname(s));
-          current_module.flags:=current_module.flags or uf_threadvars;
-        end;
-       ltvTable.Free;
+         current_module.globalsymtable.SymList.ForEachCall(@AddToThreadvarList,tcb);
+       current_module.localsymtable.SymList.ForEachCall(@AddToThreadvarList,tcb);
+       if trecordsymtable(tabledef.symtable).datasize<>0 then
+         { terminator }
+         tcb.emit_tai(tai_const.Create_nil_dataptr,voidpointertype);
+       tcb.end_anonymous_record;
+       if trecordsymtable(tabledef.symtable).datasize<>0 then
+         begin
+           s:=make_mangledname('THREADVARLIST',current_module.localsymtable,'');
+           sym:=current_asmdata.DefineAsmSymbol(s,AB_GLOBAL,AT_DATA);
+           current_asmdata.asmlists[al_globals].concatlist(
+             tcb.get_final_asmlist(sym,tabledef,sec_data,s,sizeof(pint)));
+           current_module.flags:=current_module.flags or uf_threadvars;
+         end;
+       tcb.Free;
     end;