From 140f5b5f9468fe1f7ff9ecf91c6bd41e2e7990ef Mon Sep 17 00:00:00 2001 From: svenbarth Date: Fri, 8 Apr 2016 13:39:04 +0000 Subject: [PATCH] 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 - --- compiler/ncgrtti.pas | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/compiler/ncgrtti.pas b/compiler/ncgrtti.pas index 12a3bf405e..56cf6f022e 100644 --- a/compiler/ncgrtti.pas +++ b/compiler/ncgrtti.pas @@ -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;