Write indirect symbols for the RTTI (basically a merge of r28238, but using the typed constant builder and the new indirect asmbinds)

ncgrtti.pas, TRTTIWriter:
  * write_rtti & write_rtti_extrasyms: generate an indirect symbol for each of the RTTI symbols (they are not used yet, but soon will be)
  * write_rtti: reorder operations a bit: first free the tcb (we don't need it anymore), then write the indirect symbol and only then write any extra symbols that might be needed (this way the RTTI data and the indirect symbol will be next to each other)
  

git-svn-id: trunk@33447 -
This commit is contained in:
svenbarth 2016-04-08 13:39:04 +00:00
parent 4e964c2ed7
commit 140f5b5f94

View File

@ -1268,7 +1268,7 @@ implementation
in sstrings.inc. }
procedure enumdef_rtti_ord2stringindex(rttidef: trecorddef; const syms: tfplist);
var rttilab:Tasmsymbol;
var rttilab,rttilabind:Tasmsymbol;
h,i,o,prev_value:longint;
mode:(lookup,search); {Modify with care, ordinal value of enum is written.}
r:single; {Must be real type because of integer overflow risk.}
@ -1369,6 +1369,14 @@ implementation
rttilab,tcb.end_anonymous_record,sec_rodata,
rttilab.name,const_align(sizeof(pint))));
tcb.free;
{ write indirect symbol }
tcb:=ctai_typedconstbuilder.create([tcalo_make_dead_strippable]);
rttilabind:=current_asmdata.DefineAsmSymbol(Tstoreddef(def).rtti_mangledname(rt)+'_o2s',AB_INDIRECT,AT_DATA);
tcb.emit_tai(Tai_const.Createname(rttilab.name,AT_DATA,0),voidpointertype);
current_asmdata.AsmLists[al_rtti].concatList(
tcb.get_final_asmlist(rttilabind,voidpointertype,sec_rodata,rttilabind.name,const_align(sizeof(pint))));
tcb.free;
end;
@ -1379,7 +1387,8 @@ implementation
var
tcb: ttai_typedconstbuilder;
rttilab:Tasmsymbol;
rttilab,
rttilabind : Tasmsymbol;
i:longint;
begin
{ write rtti data }
@ -1412,6 +1421,13 @@ implementation
rttilab,tcb.end_anonymous_record,sec_rodata,
rttilab.name,const_align(sizeof(pint))));
tcb.free;
{ write indirect symbol }
tcb:=ctai_typedconstbuilder.create([tcalo_make_dead_strippable]);
rttilabind:=current_asmdata.DefineAsmSymbol(Tstoreddef(def).rtti_mangledname(rt)+'_s2o',AB_INDIRECT,AT_DATA);
tcb.emit_tai(Tai_const.Createname(rttilab.name,AT_DATA,0),voidpointertype);
current_asmdata.AsmLists[al_rtti].concatList(
tcb.get_final_asmlist(rttilabind,voidpointertype,sec_rodata,rttilabind.name,const_align(sizeof(pint))));
tcb.free;
end;
procedure enumdef_rtti_extrasyms(def:Tenumdef);
@ -1525,7 +1541,8 @@ implementation
procedure TRTTIWriter.write_rtti(def:tdef;rt:trttitype);
var
tcb: ttai_typedconstbuilder;
rttilab: tasmsymbol;
rttilab,
rttilabind : tasmsymbol;
rttidef: tdef;
begin
{ only write rtti of definitions from the current module }
@ -1553,8 +1570,16 @@ implementation
rttidef:=tcb.end_anonymous_record;
current_asmdata.AsmLists[al_rtti].concatList(
tcb.get_final_asmlist(rttilab,rttidef,sec_rodata,rttilab.name,const_align(sizeof(pint))));
write_rtti_extrasyms(def,rt,rttilab);
tcb.free;
{ write indirect symbol }
tcb:=ctai_typedconstbuilder.create([tcalo_make_dead_strippable]);
rttilabind:=current_asmdata.DefineAsmSymbol(tstoreddef(def).rtti_mangledname(rt),AB_INDIRECT,AT_DATA);
tcb.emit_tai(Tai_const.Createname(rttilab.name,AT_DATA,0),voidpointertype);
current_asmdata.AsmLists[al_rtti].concatList(
tcb.get_final_asmlist(rttilabind,voidpointertype,sec_rodata,rttilabind.name,const_align(sizeof(pint))));
tcb.free;
{ write additional data }
write_rtti_extrasyms(def,rt,rttilab);
end;