diff --git a/compiler/ngenutil.pas b/compiler/ngenutil.pas index 4b964d3225..1bb9596af7 100644 --- a/compiler/ngenutil.pas +++ b/compiler/ngenutil.pas @@ -723,38 +723,52 @@ implementation class procedure tnodeutils.InsertThreadvarTablesTable; var hp : tused_unit; - ltvTables : TAsmList; - count : longint; + tcb: ttai_typedconstbuilder; + count: longint; + sym: tasmsymbol; + placeholder: ttypedconstplaceholder; begin if (tf_section_threadvars in target_info.flags) then exit; - ltvTables:=TAsmList.Create; count:=0; + tcb:=ctai_typedconstbuilder.create([tcalo_make_dead_strippable,tcalo_new_section]); + tcb.begin_anonymous_record('',1,sizeof(pint), + targetinfos[target_info.system]^.alignment.recordalignmin, + targetinfos[target_info.system]^.alignment.maxCrecordalign + ); + placeholder:=tcb.emit_placeholder(u32inttype); + hp:=tused_unit(usedunits.first); while assigned(hp) do begin - If (hp.u.flags and uf_threadvars)=uf_threadvars then - begin - ltvTables.concat(Tai_const.Createname(make_mangledname('THREADVARLIST',hp.u.globalsymtable,''),0)); - inc(count); - end; + if (hp.u.flags and uf_threadvars)=uf_threadvars then + begin + tcb.emit_tai( + tai_const.Createname(make_mangledname('THREADVARLIST',hp.u.globalsymtable,''),0), + voidpointertype); + inc(count); + end; hp:=tused_unit(hp.next); end; { Add program threadvars, if any } - If (current_module.flags and uf_threadvars)=uf_threadvars then - begin - ltvTables.concat(Tai_const.Createname(make_mangledname('THREADVARLIST',current_module.localsymtable,''),0)); - inc(count); - end; - { Insert TableCount at start } - ltvTables.insert(Tai_const.Create_32bit(count)); + if (current_module.flags and uf_threadvars)=uf_threadvars then + begin + tcb.emit_tai( + Tai_const.Createname(make_mangledname('THREADVARLIST',current_module.localsymtable,''),0), + voidpointertype); + inc(count); + end; + { set the count at the start } + placeholder.replace(tai_const.Create_32bit_unaligned(count),u32inttype); + placeholder.free; { insert in data segment } - maybe_new_object_file(current_asmdata.asmlists[al_globals]); - new_section(current_asmdata.asmlists[al_globals],sec_data,'FPC_THREADVARTABLES',const_align(sizeof(pint))); - current_asmdata.asmlists[al_globals].concat(Tai_symbol.Createname_global('FPC_THREADVARTABLES',AT_DATA,0)); - current_asmdata.asmlists[al_globals].concatlist(ltvTables); - current_asmdata.asmlists[al_globals].concat(Tai_symbol_end.Createname('FPC_THREADVARTABLES')); - ltvTables.free; + sym:=current_asmdata.DefineAsmSymbol('FPC_THREADVARTABLES',AB_GLOBAL,AT_DATA); + current_asmdata.asmlists[al_globals].concatlist( + tcb.get_final_asmlist( + sym,tcb.end_anonymous_record,sec_data,'FPC_THREADVARTABLES',sizeof(pint) + ) + ); + tcb.free; end;