|
@@ -1054,7 +1054,7 @@ implementation
|
|
if not is_objectpascal_helper(def) then
|
|
if not is_objectpascal_helper(def) then
|
|
if (oo_has_vmt in def.objectoptions) then
|
|
if (oo_has_vmt in def.objectoptions) then
|
|
tcb.emit_tai(
|
|
tcb.emit_tai(
|
|
- Tai_const.Createname(def.vmt_mangledname,AT_DATA,0),
|
|
|
|
|
|
+ Tai_const.Createname(def.vmt_mangledname,AT_DATA_FORCEINDIRECT,0),
|
|
cpointerdef.getreusable(def.vmt_def))
|
|
cpointerdef.getreusable(def.vmt_def))
|
|
else
|
|
else
|
|
tcb.emit_tai(Tai_const.Create_nil_dataptr,voidpointertype);
|
|
tcb.emit_tai(Tai_const.Create_nil_dataptr,voidpointertype);
|
|
@@ -1268,7 +1268,7 @@ implementation
|
|
in sstrings.inc. }
|
|
in sstrings.inc. }
|
|
procedure enumdef_rtti_ord2stringindex(rttidef: trecorddef; const syms: tfplist);
|
|
procedure enumdef_rtti_ord2stringindex(rttidef: trecorddef; const syms: tfplist);
|
|
|
|
|
|
- var rttilab,rttilabind:Tasmsymbol;
|
|
|
|
|
|
+ var rttilab:Tasmsymbol;
|
|
h,i,o,prev_value:longint;
|
|
h,i,o,prev_value:longint;
|
|
mode:(lookup,search); {Modify with care, ordinal value of enum is written.}
|
|
mode:(lookup,search); {Modify with care, ordinal value of enum is written.}
|
|
r:single; {Must be real type because of integer overflow risk.}
|
|
r:single; {Must be real type because of integer overflow risk.}
|
|
@@ -1366,19 +1366,11 @@ implementation
|
|
tcb.end_anonymous_record;
|
|
tcb.end_anonymous_record;
|
|
|
|
|
|
tabledef:=tcb.end_anonymous_record;
|
|
tabledef:=tcb.end_anonymous_record;
|
|
- rttilab:=current_asmdata.DefineAsmSymbol(Tstoreddef(def).rtti_mangledname(rt)+'_o2s',AB_GLOBAL,AT_DATA,tabledef);
|
|
|
|
|
|
+ rttilab:=current_asmdata.DefineAsmSymbol(Tstoreddef(def).rtti_mangledname(rt)+'_o2s',AB_GLOBAL,AT_DATA_FORCEINDIRECT,tabledef);
|
|
current_asmdata.asmlists[al_rtti].concatlist(tcb.get_final_asmlist(
|
|
current_asmdata.asmlists[al_rtti].concatlist(tcb.get_final_asmlist(
|
|
rttilab,tabledef,sec_rodata,
|
|
rttilab,tabledef,sec_rodata,
|
|
rttilab.name,const_align(sizeof(pint))));
|
|
rttilab.name,const_align(sizeof(pint))));
|
|
tcb.free;
|
|
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,cpointerdef.getreusable(tabledef));
|
|
|
|
- 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;
|
|
end;
|
|
|
|
|
|
|
|
|
|
@@ -1389,8 +1381,7 @@ implementation
|
|
|
|
|
|
var
|
|
var
|
|
tcb: ttai_typedconstbuilder;
|
|
tcb: ttai_typedconstbuilder;
|
|
- rttilab,
|
|
|
|
- rttilabind : Tasmsymbol;
|
|
|
|
|
|
+ rttilab: Tasmsymbol;
|
|
i:longint;
|
|
i:longint;
|
|
tabledef: tdef;
|
|
tabledef: tdef;
|
|
begin
|
|
begin
|
|
@@ -1420,18 +1411,11 @@ implementation
|
|
end;
|
|
end;
|
|
tcb.end_anonymous_record;
|
|
tcb.end_anonymous_record;
|
|
tabledef:=tcb.end_anonymous_record;
|
|
tabledef:=tcb.end_anonymous_record;
|
|
- rttilab:=current_asmdata.DefineAsmSymbol(Tstoreddef(def).rtti_mangledname(rt)+'_s2o',AB_GLOBAL,AT_DATA,tabledef);
|
|
|
|
|
|
+ rttilab:=current_asmdata.DefineAsmSymbol(Tstoreddef(def).rtti_mangledname(rt)+'_s2o',AB_GLOBAL,AT_DATA_FORCEINDIRECT,tabledef);
|
|
current_asmdata.asmlists[al_rtti].concatlist(tcb.get_final_asmlist(
|
|
current_asmdata.asmlists[al_rtti].concatlist(tcb.get_final_asmlist(
|
|
rttilab,tabledef,sec_rodata,
|
|
rttilab,tabledef,sec_rodata,
|
|
rttilab.name,const_align(sizeof(pint))));
|
|
rttilab.name,const_align(sizeof(pint))));
|
|
tcb.free;
|
|
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,cpointerdef.getreusable(tabledef));
|
|
|
|
- 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;
|
|
end;
|
|
|
|
|
|
procedure enumdef_rtti_extrasyms(def:Tenumdef);
|
|
procedure enumdef_rtti_extrasyms(def:Tenumdef);
|
|
@@ -1545,8 +1529,7 @@ implementation
|
|
procedure TRTTIWriter.write_rtti(def:tdef;rt:trttitype);
|
|
procedure TRTTIWriter.write_rtti(def:tdef;rt:trttitype);
|
|
var
|
|
var
|
|
tcb: ttai_typedconstbuilder;
|
|
tcb: ttai_typedconstbuilder;
|
|
- rttilab,
|
|
|
|
- rttilabind : tasmsymbol;
|
|
|
|
|
|
+ rttilab: tasmsymbol;
|
|
rttidef: tdef;
|
|
rttidef: tdef;
|
|
begin
|
|
begin
|
|
{ only write rtti of definitions from the current module }
|
|
{ only write rtti of definitions from the current module }
|
|
@@ -1571,17 +1554,10 @@ implementation
|
|
);
|
|
);
|
|
write_rtti_data(tcb,def,rt);
|
|
write_rtti_data(tcb,def,rt);
|
|
rttidef:=tcb.end_anonymous_record;
|
|
rttidef:=tcb.end_anonymous_record;
|
|
- rttilab:=current_asmdata.DefineAsmSymbol(tstoreddef(def).rtti_mangledname(rt),AB_GLOBAL,AT_DATA,rttidef);
|
|
|
|
|
|
+ rttilab:=current_asmdata.DefineAsmSymbol(tstoreddef(def).rtti_mangledname(rt),AB_GLOBAL,AT_DATA_FORCEINDIRECT,rttidef);
|
|
current_asmdata.AsmLists[al_rtti].concatList(
|
|
current_asmdata.AsmLists[al_rtti].concatList(
|
|
tcb.get_final_asmlist(rttilab,rttidef,sec_rodata,rttilab.name,const_align(sizeof(pint))));
|
|
tcb.get_final_asmlist(rttilab,rttidef,sec_rodata,rttilab.name,const_align(sizeof(pint))));
|
|
tcb.free;
|
|
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,cpointerdef.getreusable(rttidef));
|
|
|
|
- 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 additional data }
|
|
write_rtti_extrasyms(def,rt,rttilab);
|
|
write_rtti_extrasyms(def,rt,rttilab);
|
|
end;
|
|
end;
|