|
@@ -571,22 +571,10 @@ implementation
|
|
|
|
|
|
procedure TRTTIWriter.write_common_rtti_data(tcb:ttai_typedconstbuilder;def:tdef;rt:trttitype);
|
|
procedure TRTTIWriter.write_common_rtti_data(tcb:ttai_typedconstbuilder;def:tdef;rt:trttitype);
|
|
begin
|
|
begin
|
|
- { important: we need to align this the same way as the type data itself
|
|
|
|
- is aligned }
|
|
|
|
- tcb.begin_anonymous_record(
|
|
|
|
- internaltypeprefixName[itp_rtti_common_data],
|
|
|
|
- defaultpacking,reqalign,
|
|
|
|
- targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
|
|
- targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
|
|
if rt<>fullrtti then
|
|
if rt<>fullrtti then
|
|
- begin
|
|
|
|
- write_attribute_data(tcb,nil);
|
|
|
|
- end
|
|
|
|
|
|
+ write_attribute_data(tcb,nil)
|
|
else
|
|
else
|
|
- begin
|
|
|
|
- write_attribute_data(tcb,tstoreddef(def).rtti_attribute_list);
|
|
|
|
- end;
|
|
|
|
- tcb.end_anonymous_record;
|
|
|
|
|
|
+ write_attribute_data(tcb,tstoreddef(def).rtti_attribute_list);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
@@ -958,13 +946,13 @@ implementation
|
|
st_ansistring:
|
|
st_ansistring:
|
|
begin
|
|
begin
|
|
write_header(tcb,def,tkAString);
|
|
write_header(tcb,def,tkAString);
|
|
- write_common_rtti_data(tcb,def,rt);
|
|
|
|
{ align }
|
|
{ align }
|
|
tcb.begin_anonymous_record(
|
|
tcb.begin_anonymous_record(
|
|
internaltypeprefixName[itp_rtti_ansistr],
|
|
internaltypeprefixName[itp_rtti_ansistr],
|
|
defaultpacking,reqalign,
|
|
defaultpacking,reqalign,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
|
|
+ write_common_rtti_data(tcb,def,rt);
|
|
tcb.emit_ord_const(def.encoding,u16inttype);
|
|
tcb.emit_ord_const(def.encoding,u16inttype);
|
|
tcb.end_anonymous_record;
|
|
tcb.end_anonymous_record;
|
|
end;
|
|
end;
|
|
@@ -983,8 +971,8 @@ implementation
|
|
|
|
|
|
st_longstring:
|
|
st_longstring:
|
|
begin
|
|
begin
|
|
- write_common_rtti_data(tcb,def,rt);
|
|
|
|
write_header(tcb,def,tkLString);
|
|
write_header(tcb,def,tkLString);
|
|
|
|
+ write_common_rtti_data(tcb,def,rt);
|
|
end;
|
|
end;
|
|
|
|
|
|
st_shortstring:
|
|
st_shortstring:
|
|
@@ -1002,7 +990,6 @@ implementation
|
|
hp : tenumsym;
|
|
hp : tenumsym;
|
|
begin
|
|
begin
|
|
write_header(tcb,def,tkEnumeration);
|
|
write_header(tcb,def,tkEnumeration);
|
|
- write_common_rtti_data(tcb,def,rt);
|
|
|
|
{ align; the named fields are so that we can let the compiler
|
|
{ align; the named fields are so that we can let the compiler
|
|
calculate the string offsets later on }
|
|
calculate the string offsets later on }
|
|
tcb.next_field_name:='size_start_rec';
|
|
tcb.next_field_name:='size_start_rec';
|
|
@@ -1012,6 +999,11 @@ implementation
|
|
tcb.begin_anonymous_record(internaltypeprefixName[itp_rtti_enum_size_start_rec]+def.unique_id_str,defaultpacking,reqalign,
|
|
tcb.begin_anonymous_record(internaltypeprefixName[itp_rtti_enum_size_start_rec]+def.unique_id_str,defaultpacking,reqalign,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
|
|
+ write_common_rtti_data(tcb,def,rt);
|
|
|
|
+ tcb.next_field_name:='typ_union_rec';
|
|
|
|
+ tcb.begin_anonymous_record(internaltypeprefixName[itp_rtti_enum_size_start_rec2]+def.unique_id_str,defaultpacking,reqalign,
|
|
|
|
+ targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
|
|
+ targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
case longint(def.size) of
|
|
case longint(def.size) of
|
|
1 :
|
|
1 :
|
|
tcb.emit_ord_const(otUByte,u8inttype);
|
|
tcb.emit_ord_const(otUByte,u8inttype);
|
|
@@ -1060,6 +1052,7 @@ implementation
|
|
tcb.end_anonymous_record;
|
|
tcb.end_anonymous_record;
|
|
tcb.end_anonymous_record;
|
|
tcb.end_anonymous_record;
|
|
tcb.end_anonymous_record;
|
|
tcb.end_anonymous_record;
|
|
|
|
+ tcb.end_anonymous_record;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure orddef_rtti(def:torddef);
|
|
procedure orddef_rtti(def:torddef);
|
|
@@ -1078,7 +1071,6 @@ implementation
|
|
deftrans: byte;
|
|
deftrans: byte;
|
|
begin
|
|
begin
|
|
write_header(tcb,def,typekind);
|
|
write_header(tcb,def,typekind);
|
|
- write_common_rtti_data(tcb,def,rt);
|
|
|
|
deftrans:=trans[def.ordtype];
|
|
deftrans:=trans[def.ordtype];
|
|
case deftrans of
|
|
case deftrans of
|
|
otUQWord,
|
|
otUQWord,
|
|
@@ -1111,6 +1103,7 @@ implementation
|
|
defaultpacking,reqalign,
|
|
defaultpacking,reqalign,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
|
|
+ write_common_rtti_data(tcb,def,rt);
|
|
tcb.emit_ord_const(byte(trans[def.ordtype]),u8inttype);
|
|
tcb.emit_ord_const(byte(trans[def.ordtype]),u8inttype);
|
|
tcb.begin_anonymous_record(
|
|
tcb.begin_anonymous_record(
|
|
internaltypeprefixName[itp_rtti_ord_inner]+elesize,
|
|
internaltypeprefixName[itp_rtti_ord_inner]+elesize,
|
|
@@ -1170,12 +1163,12 @@ implementation
|
|
scurrency:
|
|
scurrency:
|
|
begin
|
|
begin
|
|
write_header(tcb,def,tkFloat);
|
|
write_header(tcb,def,tkFloat);
|
|
- write_common_rtti_data(tcb,def,rt);
|
|
|
|
tcb.begin_anonymous_record(
|
|
tcb.begin_anonymous_record(
|
|
internaltypeprefixName[itp_1byte],
|
|
internaltypeprefixName[itp_1byte],
|
|
defaultpacking,reqalign,
|
|
defaultpacking,reqalign,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
|
|
+ write_common_rtti_data(tcb,def,rt);
|
|
tcb.emit_ord_const(ftCurr,u8inttype);
|
|
tcb.emit_ord_const(ftCurr,u8inttype);
|
|
tcb.end_anonymous_record;
|
|
tcb.end_anonymous_record;
|
|
end;
|
|
end;
|
|
@@ -1192,12 +1185,12 @@ implementation
|
|
(ftSingle,ftDouble,ftExtended,ftExtended,ftComp,ftCurr,ftFloat128);
|
|
(ftSingle,ftDouble,ftExtended,ftExtended,ftComp,ftCurr,ftFloat128);
|
|
begin
|
|
begin
|
|
write_header(tcb,def,tkFloat);
|
|
write_header(tcb,def,tkFloat);
|
|
- write_common_rtti_data(tcb,def,rt);
|
|
|
|
tcb.begin_anonymous_record(
|
|
tcb.begin_anonymous_record(
|
|
internaltypeprefixName[itp_1byte],
|
|
internaltypeprefixName[itp_1byte],
|
|
defaultpacking,reqalign,
|
|
defaultpacking,reqalign,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
|
|
+ write_common_rtti_data(tcb,def,rt);
|
|
tcb.emit_ord_const(translate[def.floattype],u8inttype);
|
|
tcb.emit_ord_const(translate[def.floattype],u8inttype);
|
|
tcb.end_anonymous_record;
|
|
tcb.end_anonymous_record;
|
|
end;
|
|
end;
|
|
@@ -1206,12 +1199,17 @@ implementation
|
|
procedure setdef_rtti(def:tsetdef);
|
|
procedure setdef_rtti(def:tsetdef);
|
|
begin
|
|
begin
|
|
write_header(tcb,def,tkSet);
|
|
write_header(tcb,def,tkSet);
|
|
- write_common_rtti_data(tcb,def,rt);
|
|
|
|
tcb.begin_anonymous_record(
|
|
tcb.begin_anonymous_record(
|
|
internaltypeprefixName[itp_rtti_set_outer],
|
|
internaltypeprefixName[itp_rtti_set_outer],
|
|
defaultpacking,reqalign,
|
|
defaultpacking,reqalign,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
|
|
+ write_common_rtti_data(tcb,def,rt);
|
|
|
|
+ tcb.begin_anonymous_record(
|
|
|
|
+ internaltypeprefixName[itp_rtti_set_middle],
|
|
|
|
+ defaultpacking,reqalign,
|
|
|
|
+ targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
|
|
+ targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
case def.size of
|
|
case def.size of
|
|
1:
|
|
1:
|
|
tcb.emit_ord_const(otUByte,u8inttype);
|
|
tcb.emit_ord_const(otUByte,u8inttype);
|
|
@@ -1231,6 +1229,7 @@ implementation
|
|
write_rtti_reference(tcb,def.elementdef,rt);
|
|
write_rtti_reference(tcb,def.elementdef,rt);
|
|
tcb.end_anonymous_record;
|
|
tcb.end_anonymous_record;
|
|
tcb.end_anonymous_record;
|
|
tcb.end_anonymous_record;
|
|
|
|
+ tcb.end_anonymous_record;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
@@ -1246,7 +1245,6 @@ implementation
|
|
else
|
|
else
|
|
tcb.emit_ord_const(tkArray,u8inttype);
|
|
tcb.emit_ord_const(tkArray,u8inttype);
|
|
write_rtti_name(tcb,def);
|
|
write_rtti_name(tcb,def);
|
|
- write_common_rtti_data(tcb,def,rt);
|
|
|
|
|
|
|
|
if not(ado_IsDynamicArray in def.arrayoptions) then
|
|
if not(ado_IsDynamicArray in def.arrayoptions) then
|
|
begin
|
|
begin
|
|
@@ -1268,6 +1266,7 @@ implementation
|
|
defaultpacking,reqalign,
|
|
defaultpacking,reqalign,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
|
|
+ write_common_rtti_data(tcb,def,rt);
|
|
{ total size = elecount * elesize of the first arraydef }
|
|
{ total size = elecount * elesize of the first arraydef }
|
|
tcb.emit_tai(Tai_const.Create_sizeint(def.elecount*def.elesize),sizeuinttype);
|
|
tcb.emit_tai(Tai_const.Create_sizeint(def.elecount*def.elesize),sizeuinttype);
|
|
{ total element count }
|
|
{ total element count }
|
|
@@ -1299,6 +1298,7 @@ implementation
|
|
defaultpacking,reqalign,
|
|
defaultpacking,reqalign,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
|
|
+ write_common_rtti_data(tcb,def,rt);
|
|
{ size of elements }
|
|
{ size of elements }
|
|
tcb.emit_tai(Tai_const.Create_sizeint(def.elesize),sizeuinttype);
|
|
tcb.emit_tai(Tai_const.Create_sizeint(def.elesize),sizeuinttype);
|
|
{ element type }
|
|
{ element type }
|
|
@@ -1319,12 +1319,12 @@ implementation
|
|
procedure classrefdef_rtti(def:tclassrefdef);
|
|
procedure classrefdef_rtti(def:tclassrefdef);
|
|
begin
|
|
begin
|
|
write_header(tcb,def,tkClassRef);
|
|
write_header(tcb,def,tkClassRef);
|
|
- write_common_rtti_data(tcb,def,rt);
|
|
|
|
tcb.begin_anonymous_record(
|
|
tcb.begin_anonymous_record(
|
|
internaltypeprefixName[itp_rtti_ref],
|
|
internaltypeprefixName[itp_rtti_ref],
|
|
defaultpacking,reqalign,
|
|
defaultpacking,reqalign,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
|
|
+ write_common_rtti_data(tcb,def,rt);
|
|
write_rtti_reference(tcb,def.pointeddef,rt);
|
|
write_rtti_reference(tcb,def.pointeddef,rt);
|
|
tcb.end_anonymous_record;
|
|
tcb.end_anonymous_record;
|
|
end;
|
|
end;
|
|
@@ -1332,12 +1332,12 @@ implementation
|
|
procedure pointerdef_rtti(def:tpointerdef);
|
|
procedure pointerdef_rtti(def:tpointerdef);
|
|
begin
|
|
begin
|
|
write_header(tcb,def,tkPointer);
|
|
write_header(tcb,def,tkPointer);
|
|
- write_common_rtti_data(tcb,def,rt);
|
|
|
|
tcb.begin_anonymous_record(
|
|
tcb.begin_anonymous_record(
|
|
internaltypeprefixName[itp_rtti_ref],
|
|
internaltypeprefixName[itp_rtti_ref],
|
|
defaultpacking,reqalign,
|
|
defaultpacking,reqalign,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
|
|
+ write_common_rtti_data(tcb,def,rt);
|
|
write_rtti_reference(tcb,def.pointeddef,rt);
|
|
write_rtti_reference(tcb,def.pointeddef,rt);
|
|
tcb.end_anonymous_record;
|
|
tcb.end_anonymous_record;
|
|
end;
|
|
end;
|
|
@@ -1390,7 +1390,6 @@ implementation
|
|
|
|
|
|
begin
|
|
begin
|
|
write_header(tcb,def,tkRecord);
|
|
write_header(tcb,def,tkRecord);
|
|
- write_common_rtti_data(tcb,def,rt);
|
|
|
|
{ need extra reqalign record, because otherwise the u32 int will
|
|
{ need extra reqalign record, because otherwise the u32 int will
|
|
only be aligned to 4 even on 64 bit target (while the rtti code
|
|
only be aligned to 4 even on 64 bit target (while the rtti code
|
|
in typinfo expects alignments to sizeof(pointer)) }
|
|
in typinfo expects alignments to sizeof(pointer)) }
|
|
@@ -1398,6 +1397,8 @@ implementation
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
|
|
|
|
|
|
+ write_common_rtti_data(tcb,def,rt);
|
|
|
|
+
|
|
{ store special terminator for init table for more optimal rtl operations
|
|
{ store special terminator for init table for more optimal rtl operations
|
|
strictly related to RecordRTTI procedure in rtti.inc (directly
|
|
strictly related to RecordRTTI procedure in rtti.inc (directly
|
|
related to RTTIRecordRttiInfoToInitInfo function) }
|
|
related to RTTIRecordRttiInfoToInitInfo function) }
|
|
@@ -1474,11 +1475,12 @@ implementation
|
|
begin
|
|
begin
|
|
{ write method id and name }
|
|
{ write method id and name }
|
|
write_header(tcb,def,tkMethod);
|
|
write_header(tcb,def,tkMethod);
|
|
- write_common_rtti_data(tcb,def,rt);
|
|
|
|
tcb.begin_anonymous_record('',defaultpacking,reqalign,
|
|
tcb.begin_anonymous_record('',defaultpacking,reqalign,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
|
|
|
|
|
|
+ write_common_rtti_data(tcb,def,rt);
|
|
|
|
+
|
|
{ write kind of method }
|
|
{ write kind of method }
|
|
methodkind:=write_methodkind(tcb,def);
|
|
methodkind:=write_methodkind(tcb,def);
|
|
|
|
|
|
@@ -1517,11 +1519,12 @@ implementation
|
|
else
|
|
else
|
|
begin
|
|
begin
|
|
write_header(tcb,def,tkProcvar);
|
|
write_header(tcb,def,tkProcvar);
|
|
- write_common_rtti_data(tcb,def,rt);
|
|
|
|
tcb.begin_anonymous_record('',defaultpacking,reqalign,
|
|
tcb.begin_anonymous_record('',defaultpacking,reqalign,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
|
|
|
|
|
|
+ write_common_rtti_data(tcb,def,rt);
|
|
|
|
+
|
|
{ flags }
|
|
{ flags }
|
|
tcb.emit_ord_const(0,u8inttype);
|
|
tcb.emit_ord_const(0,u8inttype);
|
|
{ write calling convention }
|
|
{ write calling convention }
|
|
@@ -1700,12 +1703,12 @@ implementation
|
|
{ generate the name }
|
|
{ generate the name }
|
|
tcb.emit_shortstring_const(def.objrealname^);
|
|
tcb.emit_shortstring_const(def.objrealname^);
|
|
|
|
|
|
- write_common_rtti_data(tcb,def,rt);
|
|
|
|
-
|
|
|
|
tcb.begin_anonymous_record('',defaultpacking,reqalign,
|
|
tcb.begin_anonymous_record('',defaultpacking,reqalign,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.recordalignmin,
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
|
|
|
|
|
|
|
+ write_common_rtti_data(tcb,def,rt);
|
|
|
|
+
|
|
case rt of
|
|
case rt of
|
|
initrtti :
|
|
initrtti :
|
|
begin
|
|
begin
|
|
@@ -1998,6 +2001,7 @@ implementation
|
|
tcb.queue_init(voidpointertype);
|
|
tcb.queue_init(voidpointertype);
|
|
tcb.queue_subscriptn_multiple_by_name(rttidef,
|
|
tcb.queue_subscriptn_multiple_by_name(rttidef,
|
|
['size_start_rec',
|
|
['size_start_rec',
|
|
|
|
+ 'typ_union_rec',
|
|
'min_max_rec',
|
|
'min_max_rec',
|
|
'basetype_array_rec',
|
|
'basetype_array_rec',
|
|
tsym(syms[i]).Name]
|
|
tsym(syms[i]).Name]
|
|
@@ -2017,6 +2021,7 @@ implementation
|
|
tcb.queue_init(voidpointertype);
|
|
tcb.queue_init(voidpointertype);
|
|
tcb.queue_subscriptn_multiple_by_name(rttidef,
|
|
tcb.queue_subscriptn_multiple_by_name(rttidef,
|
|
['size_start_rec',
|
|
['size_start_rec',
|
|
|
|
+ 'typ_union_rec',
|
|
'min_max_rec',
|
|
'min_max_rec',
|
|
'basetype_array_rec',
|
|
'basetype_array_rec',
|
|
tsym(syms[i]).Name]
|
|
tsym(syms[i]).Name]
|
|
@@ -2067,6 +2072,7 @@ implementation
|
|
tcb.queue_init(voidpointertype);
|
|
tcb.queue_init(voidpointertype);
|
|
tcb.queue_subscriptn_multiple_by_name(rttidef,
|
|
tcb.queue_subscriptn_multiple_by_name(rttidef,
|
|
['size_start_rec',
|
|
['size_start_rec',
|
|
|
|
+ 'typ_union_rec',
|
|
'min_max_rec',
|
|
'min_max_rec',
|
|
'basetype_array_rec',
|
|
'basetype_array_rec',
|
|
tsym(syms[i]).Name]
|
|
tsym(syms[i]).Name]
|