summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoost <joost@3ad0048d-3df7-0310-abae-a5850022a9f2>2013-08-06 19:34:51 +0000
committerjoost <joost@3ad0048d-3df7-0310-abae-a5850022a9f2>2013-08-06 19:34:51 +0000
commiteebfc0d0fc6718fa92d01e30cf7e175a6078dc96 (patch)
tree7b6190b2815c150b77b5da2a9775c48dea997b73
parent57d19c3f43c5aa151a59279f3d921bf023f6eefa (diff)
downloadfpc-eebfc0d0fc6718fa92d01e30cf7e175a6078dc96.tar.gz
* Placed the init-data in a separate assembly-list. This way it is possible
to iterate through the rtti type-data to get a list of all types, without any duplicates due to the init-data in the same list. git-svn-id: http://svn.freepascal.org/svn/fpc/branches/joost@25222 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--classattributes/compiler/aasmdata.pas2
-rw-r--r--classattributes/compiler/ncgrtti.pas221
2 files changed, 117 insertions, 106 deletions
diff --git a/classattributes/compiler/aasmdata.pas b/classattributes/compiler/aasmdata.pas
index cc3556e1cc..202318c2ee 100644
--- a/classattributes/compiler/aasmdata.pas
+++ b/classattributes/compiler/aasmdata.pas
@@ -57,6 +57,7 @@ interface
al_exports,
al_resources,
al_rtti,
+ al_init,
al_ext_rtti,
al_dwarf_frame,
al_dwarf_info,
@@ -108,6 +109,7 @@ interface
'al_exports',
'al_resources',
'al_rtti',
+ 'al_init',
'al_ext_rtti',
'al_dwarf_frame',
'al_dwarf_info',
diff --git a/classattributes/compiler/ncgrtti.pas b/classattributes/compiler/ncgrtti.pas
index e2f5f458b9..ec21c5c2cf 100644
--- a/classattributes/compiler/ncgrtti.pas
+++ b/classattributes/compiler/ncgrtti.pas
@@ -27,7 +27,7 @@ interface
uses
cclasses,constexp,
- aasmbase,
+ aasmbase,aasmdata,
ppu,
symbase,symconst,symtype,symdef;
@@ -44,16 +44,17 @@ interface
function published_properties_count(st:tsymtable):longint;
procedure published_properties_write_rtti_data(propnamelist:TFPHashObjectList;st:tsymtable);
procedure collect_propnamelist(propnamelist:TFPHashObjectList;objdef:tobjectdef);
- procedure write_rtti_name(def:tdef);
+ procedure write_rtti_name(def:tdef;rt:trttitype);
procedure write_rtti_data(def:tdef;rt:trttitype);
procedure write_attribute_data(def:tdef);
procedure write_child_rtti_data(def:tdef;rt:trttitype);
function ref_rtti(def:tdef;rt:trttitype):tasmsymbol;
- procedure write_header(def: tdef; typekind: byte);
- procedure write_string(const s: string);
- procedure maybe_write_align;
+ procedure write_header(def: tdef; typekind: byte;rt:trttitype);
+ procedure write_string(const s: string;rt:trttitype);
+ procedure maybe_write_align(rt:trttitype);
procedure write_unitinfo_reference;
procedure write_ext_rtti(def:tdef;rt:trttitype);
+ function rtti_asmlist(rt:trttitype):TAsmListType;
public
procedure write_rtti(def:tdef;rt:trttitype);
function get_rtti_label(def:tdef;rt:trttitype):tasmsymbol;
@@ -74,7 +75,7 @@ implementation
globals,globtype,verbose,systems,
fmodule,
symsym,
- aasmtai,aasmdata,
+ aasmtai,
defutil,
wpobase
;
@@ -100,10 +101,10 @@ implementation
TRTTIWriter
***************************************************************************}
- procedure TRTTIWriter.maybe_write_align;
+ procedure TRTTIWriter.maybe_write_align(rt: trttitype);
begin
if (tf_requires_proper_alignment in target_info.flags) then
- current_asmdata.asmlists[al_rtti].concat(cai_align.Create(sizeof(TConstPtrUInt)));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(cai_align.Create(sizeof(TConstPtrUInt)));
end;
procedure TRTTIWriter.write_unitinfo_reference;
@@ -118,24 +119,32 @@ implementation
current_asmdata.asmlists[al_ext_rtti].concat(Tai_const.Createname(tstoreddef(def).rtti_mangledname(fullrtti),0));
end;
- procedure TRTTIWriter.write_string(const s: string);
+ function TRTTIWriter.rtti_asmlist(rt: trttitype): TAsmListType;
+ begin
+ if rt=initrtti then
+ rtti_asmlist:=al_init
+ else
+ rtti_asmlist:=al_rtti;
+ end;
+
+ procedure TRTTIWriter.write_string(const s: string; rt: trttitype);
begin
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(length(s)));
- current_asmdata.asmlists[al_rtti].concat(Tai_string.Create(s));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_8bit(length(s)));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_string.Create(s));
end;
- procedure TRTTIWriter.write_header(def: tdef; typekind: byte);
+ procedure TRTTIWriter.write_header(def: tdef; typekind: byte; rt: trttitype);
begin
if def.typ=arraydef then
InternalError(201012211);
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(typekind));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_8bit(typekind));
if assigned(def.typesym) then
- write_string(ttypesym(def.typesym).realname)
+ write_string(ttypesym(def.typesym).realname, rt)
else
- current_asmdata.asmlists[al_rtti].concat(Tai_string.Create(#0));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_string.Create(#0));
end;
- procedure TRTTIWriter.write_rtti_name(def:tdef);
+ procedure TRTTIWriter.write_rtti_name(def: tdef; rt: trttitype);
var
hs : string;
begin
@@ -150,10 +159,10 @@ implementation
if assigned(def.typesym) then
begin
hs:=ttypesym(def.typesym).realname;
- current_asmdata.asmlists[al_rtti].concat(Tai_string.Create(chr(length(hs))+hs));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_string.Create(chr(length(hs))+hs));
end
else
- current_asmdata.asmlists[al_rtti].concat(Tai_string.Create(#0));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_string.Create(#0));
end;
{ writes a 32-bit count followed by array of field infos for given symtable }
@@ -168,7 +177,7 @@ implementation
fieldcnt:=0;
{ Count will be inserted at this location. It cannot be nil as we've just
written header for this symtable owner. But stay safe. }
- lastai:=current_asmdata.asmlists[al_rtti].last;
+ lastai:=current_asmdata.asmlists[rtti_asmlist(rt)].last;
if lastai=nil then
InternalError(201012212);
@@ -178,8 +187,8 @@ implementation
Assigned(tobjectdef(def).childof) and
((rt=fullrtti) or (tobjectdef(def).childof.needs_inittable)) then
begin
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_sym(ref_rtti(tobjectdef(def).childof,rt)));
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_32bit(0));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_sym(ref_rtti(tobjectdef(def).childof,rt)));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_32bit(0));
inc(fieldcnt);
end;
st:=def.symtable;
@@ -194,13 +203,13 @@ implementation
) and
not is_objc_class_or_protocol(tfieldvarsym(sym).vardef) then
begin
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_sym(ref_rtti(tfieldvarsym(sym).vardef,rt)));
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_32bit(tfieldvarsym(sym).fieldoffset));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_sym(ref_rtti(tfieldvarsym(sym).vardef,rt)));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_32bit(tfieldvarsym(sym).fieldoffset));
inc(fieldcnt);
end;
end;
{ insert field count before data }
- current_asmdata.asmlists[al_rtti].InsertAfter(Tai_const.Create_32bit(fieldcnt),lastai)
+ current_asmdata.asmlists[rtti_asmlist(rt)].InsertAfter(Tai_const.Create_32bit(fieldcnt),lastai)
end;
@@ -422,14 +431,14 @@ implementation
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(attributecount));
- write_string(tpropertysym(sym).realname);
- maybe_write_align;
+ write_string(tpropertysym(sym).realname, fullrtti);
+ maybe_write_align(fullrtti);
for attributeindex:=0 to attributecount-1 do
begin
current_asmdata.asmlists[al_rtti].concat(Tai_const.createname(trtti_attribute(tpropertysym(sym).rtti_attributesdef.rtti_attributes[attributeindex]).symbolname,0));
end;
- maybe_write_align;
+ maybe_write_align(fullrtti);
end;
end;
end;
@@ -439,35 +448,35 @@ implementation
procedure unknown_rtti(def:tstoreddef);
begin
- current_asmdata.asmlists[al_rtti].concat(tai_const.create_8bit(tkUnknown));
- write_rtti_name(def);
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(tai_const.create_8bit(tkUnknown));
+ write_rtti_name(def,rt);
end;
procedure variantdef_rtti(def:tvariantdef);
begin
- write_header(def,tkVariant);
+ write_header(def,tkVariant,rt);
end;
procedure stringdef_rtti(def:tstringdef);
begin
case def.stringtype of
st_ansistring:
- write_header(def,tkAString);
+ write_header(def,tkAString,rt);
st_widestring:
- write_header(def,tkWString);
+ write_header(def,tkWString,rt);
st_unicodestring:
- write_header(def,tkUString);
+ write_header(def,tkUString,rt);
st_longstring:
- write_header(def,tkLString);
+ write_header(def,tkLString,rt);
st_shortstring:
begin
- write_header(def,tkSString);
+ write_header(def,tkSString,rt);
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(def.len));
- maybe_write_align; // is align necessary here?
+ maybe_write_align(rt); // is align necessary here?
end;
end;
end;
@@ -477,8 +486,8 @@ implementation
i : integer;
hp : tenumsym;
begin
- write_header(def,tkEnumeration);
- maybe_write_align;
+ write_header(def,tkEnumeration,rt);
+ maybe_write_align(rt);
case longint(def.size) of
1 :
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(otUByte));
@@ -494,10 +503,10 @@ implementation
We need to adhere to this, otherwise things will break.
Note that other code (e.g. enumdef_rtti_calcstringtablestart()) relies on the
exact sequence too. }
- maybe_write_align;
+ maybe_write_align(rt);
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_32bit(def.min));
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_32bit(def.max));
- maybe_write_align; // is align necessary here?
+ maybe_write_align(rt); // is align necessary here?
{ write base type }
if assigned(def.basedef) then
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_sym(ref_rtti(def.basedef,rt)))
@@ -511,10 +520,10 @@ implementation
else
if hp.value>def.maxval then
break;
- write_string(hp.realname);
+ write_string(hp.realname,rt);
end;
{ write unit name }
- write_string(current_module.realmodulename^);
+ write_string(current_module.realmodulename^,rt);
{ write zero which is required by RTL }
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(0));
end;
@@ -531,10 +540,10 @@ implementation
otSByte,otSWord,otSLong,otSByte,
otUByte,otUWord,otUByte);
begin
- write_header(def,typekind);
- maybe_write_align;
+ write_header(def,typekind,rt);
+ maybe_write_align(rt);
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(byte(trans[def.ordtype])));
- maybe_write_align;
+ maybe_write_align(rt);
{Convert to longint to smuggle values in high(longint)+1..high(cardinal) into asmlist.}
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_32bit(longint(def.low.svalue)));
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_32bit(longint(def.high.svalue)));
@@ -544,8 +553,8 @@ implementation
case def.ordtype of
s64bit :
begin
- write_header(def,tkInt64);
- maybe_write_align;
+ write_header(def,tkInt64,rt);
+ maybe_write_align(rt);
{ low }
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_64bit(def.low.svalue));
{ high }
@@ -553,8 +562,8 @@ implementation
end;
u64bit :
begin
- write_header(def,tkQWord);
- maybe_write_align;
+ write_header(def,tkQWord,rt);
+ maybe_write_align(rt);
{use svalue because Create_64bit accepts int64, prevents range checks}
{ low }
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_64bit(def.low.svalue));
@@ -569,8 +578,8 @@ implementation
dointeger(tkWChar);
scurrency:
begin
- write_header(def,tkFloat);
- maybe_write_align;
+ write_header(def,tkFloat,rt);
+ maybe_write_align(rt);
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(ftCurr));
end;
else
@@ -585,16 +594,16 @@ implementation
translate : array[tfloattype] of byte =
(ftSingle,ftDouble,ftExtended,ftExtended,ftComp,ftCurr,ftFloat128);
begin
- write_header(def,tkFloat);
- maybe_write_align;
+ write_header(def,tkFloat,rt);
+ maybe_write_align(rt);
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(translate[def.floattype]));
end;
procedure setdef_rtti(def:tsetdef);
begin
- write_header(def,tkSet);
- maybe_write_align;
+ write_header(def,tkSet,rt);
+ maybe_write_align(rt);
case def.size of
1:
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(otUByte));
@@ -605,7 +614,7 @@ implementation
else
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(otUByte));
end;
- maybe_write_align;
+ maybe_write_align(rt);
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_sym(ref_rtti(def.elementdef,rt)));
end;
@@ -613,19 +622,19 @@ implementation
procedure arraydef_rtti(def:tarraydef);
begin
if ado_IsDynamicArray in def.arrayoptions then
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(tkdynarray))
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_8bit(tkdynarray))
else
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(tkarray));
- write_rtti_name(def);
- maybe_write_align;
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_8bit(tkarray));
+ write_rtti_name(def,rt);
+ maybe_write_align(rt);
{ size of elements }
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_pint(def.elesize));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_pint(def.elesize));
if not(ado_IsDynamicArray in def.arrayoptions) then
begin
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_pint(pint(def.elecount)));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_pint(pint(def.elecount)));
{ element type }
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_sym(ref_rtti(def.elementdef,rt)));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_sym(ref_rtti(def.elementdef,rt)));
end
else
{ write a delphi almost compatible dyn. array entry:
@@ -636,27 +645,27 @@ implementation
}
begin
{ element type }
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_sym(ref_rtti(def.elementdef,rt)));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_sym(ref_rtti(def.elementdef,rt)));
end;
{ variant type }
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_32bit(tstoreddef(def.elementdef).getvardef));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_32bit(tstoreddef(def.elementdef).getvardef));
if ado_IsDynamicArray in def.arrayoptions then
begin
{ element type }
if def.elementdef.needs_inittable then
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_sym(ref_rtti(def.elementdef,rt)))
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_sym(ref_rtti(def.elementdef,rt)))
else
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_pint(0));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_pint(0));
{ write unit name }
- write_string(current_module.realmodulename^);
+ write_string(current_module.realmodulename^,rt);
end;
end;
procedure recorddef_rtti(def:trecorddef);
begin
- write_header(def,tkRecord);
- maybe_write_align;
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_32bit(def.size));
+ write_header(def,tkRecord,rt);
+ maybe_write_align(rt);
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_32bit(def.size));
fields_write_rtti_data(def,rt);
end;
@@ -713,9 +722,9 @@ implementation
{ write flags for current parameter }
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(paraspec));
{ write name of current parameter }
- write_string(parasym.realname);
+ write_string(parasym.realname,rt);
{ write name of type of current parameter }
- write_rtti_name(parasym.vardef);
+ write_rtti_name(parasym.vardef,rt);
end;
end;
@@ -726,8 +735,8 @@ implementation
if po_methodpointer in def.procoptions then
begin
{ write method id and name }
- write_header(def,tkMethod);
- maybe_write_align;
+ write_header(def,tkMethod,rt);
+ maybe_write_align(rt);
{ write kind of method }
case def.proctypeoption of
@@ -766,8 +775,8 @@ implementation
if (methodkind=mkFunction) or (methodkind=mkClassFunction) then
begin
{ write name of result type }
- write_rtti_name(def.returndef);
- maybe_write_align;
+ write_rtti_name(def.returndef,rt);
+ maybe_write_align(rt);
{ write result typeinfo }
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_sym(ref_rtti(def.returndef,fullrtti)))
@@ -775,7 +784,7 @@ implementation
{ write calling convention }
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(ProcCallOptionToCallConv[def.proccalloption]));
- maybe_write_align;
+ maybe_write_align(rt);
{ write params typeinfo }
for i:=0 to def.paras.count-1 do
@@ -783,7 +792,7 @@ implementation
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_sym(ref_rtti(tparavarsym(def.paras[i]).vardef,fullrtti)));
end
else
- write_header(def,tkProcvar);
+ write_header(def,tkProcvar,rt);
end;
@@ -791,13 +800,13 @@ implementation
procedure objectdef_rtti_fields(def:tobjectdef);
begin
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_32bit(def.size));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_32bit(def.size));
fields_write_rtti_data(def,rt);
end;
procedure objectdef_rtti_interface_init(def:tobjectdef);
begin
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_32bit(def.size));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_32bit(def.size));
end;
procedure objectdef_rtti_class_full(def:tobjectdef);
@@ -838,13 +847,13 @@ implementation
{ TAttributeData }
if rmo_hasattributes in current_module.rtti_options then
begin
- maybe_write_align;
+ maybe_write_align(rt);
write_attribute_data(def);
end;
{ write published properties for this object }
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_16bit(published_properties_count(def.symtable)));
- maybe_write_align;
+ maybe_write_align(rt);
published_properties_write_rtti_data(propnamelist,def.symtable);
propnamelist.free;
@@ -882,7 +891,7 @@ implementation
{
ifDispatch, }
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(IntfFlags));
- maybe_write_align;
+ maybe_write_align(rt);
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_32bit(longint(def.iidguid^.D1)));
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_16bit(def.iidguid^.D2));
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_16bit(def.iidguid^.D3));
@@ -890,15 +899,15 @@ implementation
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(def.iidguid^.D4[i]));
{ write unit name }
- write_string(current_module.realmodulename^);
- maybe_write_align;
+ write_string(current_module.realmodulename^,rt);
+ maybe_write_align(rt);
{ write iidstr }
if assigned(def.iidstr) then
- write_string(def.iidstr^)
+ write_string(def.iidstr^,rt)
else
current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(0));
- maybe_write_align;
+ maybe_write_align(rt);
{ write published properties for this object }
published_properties_write_rtti_data(propnamelist,def.symtable);
@@ -909,23 +918,23 @@ implementation
begin
case def.objecttype of
odt_class:
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(tkclass));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_8bit(tkclass));
odt_object:
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(tkobject));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_8bit(tkobject));
odt_dispinterface,
odt_interfacecom:
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(tkinterface));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_8bit(tkinterface));
odt_interfacecorba:
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(tkinterfaceCorba));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_8bit(tkinterfaceCorba));
odt_helper:
- current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(tkhelper));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_const.Create_8bit(tkhelper));
else
internalerror(200611034);
end;
{ generate the name }
- write_string(def.objrealname^);
- maybe_write_align;
+ write_string(def.objrealname^,rt);
+ maybe_write_align(rt);
case rt of
initrtti :
@@ -1077,7 +1086,7 @@ implementation
asmlists[al_rtti].concat(Tai_const.create_32bit(longint(mode)));
if mode=lookup then
begin
- maybe_write_align;
+ maybe_write_align(rt);
o:=syms[0].value; {Start with min value.}
for i:=0 to sym_count-1 do
begin
@@ -1092,13 +1101,13 @@ implementation
end
else
begin
- maybe_write_align;
+ maybe_write_align(rt);
asmlists[al_rtti].concat(Tai_const.create_32bit(sym_count));
for i:=0 to sym_count-1 do
begin
- maybe_write_align;
+ maybe_write_align(rt);
asmlists[al_rtti].concat(Tai_const.create_32bit(syms[i].value));
- maybe_write_align;
+ maybe_write_align(rt);
asmlists[al_rtti].concat(Tai_const.create_sym_offset(mainrtti,st+offsets[i]));
end;
end;
@@ -1124,13 +1133,13 @@ implementation
asmlists[al_rtti].concat(Tai_symbol.create_global(rttilab,0));
asmlists[al_rtti].concat(Tai_const.create_32bit(sym_count));
{ need to align the entry record according to the largest member }
- maybe_write_align;
+ maybe_write_align(rt);
for i:=0 to sym_count-1 do
begin
if (tf_requires_proper_alignment in target_info.flags) then
current_asmdata.asmlists[al_rtti].concat(cai_align.Create(4)); // necessary?
asmlists[al_rtti].concat(Tai_const.create_32bit(syms[i].value));
- maybe_write_align;
+ maybe_write_align(rt);
asmlists[al_rtti].concat(Tai_const.create_sym_offset(mainrtti,st+offsets[i]));
end;
asmlists[al_rtti].concat(Tai_symbol_end.create(rttilab));
@@ -1289,14 +1298,14 @@ implementation
write_child_rtti_data(def,rt);
{ write rtti data }
rttilab:=current_asmdata.DefineAsmSymbol(tstoreddef(def).rtti_mangledname(rt),AB_GLOBAL,AT_DATA);
- maybe_new_object_file(current_asmdata.asmlists[al_rtti]);
- new_section(current_asmdata.asmlists[al_rtti],sec_rodata,rttilab.name,const_align(sizeof(pint)));
+ maybe_new_object_file(current_asmdata.asmlists[rtti_asmlist(rt)]);
+ new_section(current_asmdata.asmlists[rtti_asmlist(rt)],sec_rodata,rttilab.name,const_align(sizeof(pint)));
- current_asmdata.asmlists[al_rtti].concat(Tai_symbol.Create_global(rttilab,0));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_symbol.Create_global(rttilab,0));
write_rtti_data(def,rt);
if rt=fullrtti then
write_ext_rtti(def, rt);
- current_asmdata.asmlists[al_rtti].concat(Tai_symbol_end.Create(rttilab));
+ current_asmdata.asmlists[rtti_asmlist(rt)].concat(Tai_symbol_end.Create(rttilab));
write_rtti_extrasyms(def,rt,rttilab);
end;
@@ -1345,7 +1354,7 @@ implementation
current_asmdata.AsmLists[al_ext_rtti].Concat(Tai_const.Create_8bit(length(s)));
current_asmdata.AsmLists[al_ext_rtti].Concat(Tai_string.Create(s));
- maybe_write_align;
+ maybe_write_align(fullrtti);
current_asmdata.AsmLists[al_ext_rtti].Concat(Tai_symbol.Create_global(start_extrtti_symbollist,0));
end;