mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-12 08:49:33 +02:00
* first bunch of fixes for rtti for arm after attribute commits, fixes mostly alignment issues
git-svn-id: trunk@42446 -
This commit is contained in:
parent
3cd000b939
commit
c932dfaf70
@ -571,22 +571,10 @@ implementation
|
||||
|
||||
procedure TRTTIWriter.write_common_rtti_data(tcb:ttai_typedconstbuilder;def:tdef;rt:trttitype);
|
||||
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
|
||||
begin
|
||||
write_attribute_data(tcb,nil);
|
||||
end
|
||||
write_attribute_data(tcb,nil)
|
||||
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;
|
||||
|
||||
|
||||
@ -958,13 +946,13 @@ implementation
|
||||
st_ansistring:
|
||||
begin
|
||||
write_header(tcb,def,tkAString);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
{ align }
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_rtti_ansistr],
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
tcb.emit_ord_const(def.encoding,u16inttype);
|
||||
tcb.end_anonymous_record;
|
||||
end;
|
||||
@ -983,8 +971,8 @@ implementation
|
||||
|
||||
st_longstring:
|
||||
begin
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
write_header(tcb,def,tkLString);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
end;
|
||||
|
||||
st_shortstring:
|
||||
@ -1002,7 +990,6 @@ implementation
|
||||
hp : tenumsym;
|
||||
begin
|
||||
write_header(tcb,def,tkEnumeration);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
{ align; the named fields are so that we can let the compiler
|
||||
calculate the string offsets later on }
|
||||
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,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
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
|
||||
1 :
|
||||
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;
|
||||
end;
|
||||
|
||||
procedure orddef_rtti(def:torddef);
|
||||
@ -1078,7 +1071,6 @@ implementation
|
||||
deftrans: byte;
|
||||
begin
|
||||
write_header(tcb,def,typekind);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
deftrans:=trans[def.ordtype];
|
||||
case deftrans of
|
||||
otUQWord,
|
||||
@ -1111,6 +1103,7 @@ implementation
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
tcb.emit_ord_const(byte(trans[def.ordtype]),u8inttype);
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_rtti_ord_inner]+elesize,
|
||||
@ -1170,12 +1163,12 @@ implementation
|
||||
scurrency:
|
||||
begin
|
||||
write_header(tcb,def,tkFloat);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_1byte],
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
tcb.emit_ord_const(ftCurr,u8inttype);
|
||||
tcb.end_anonymous_record;
|
||||
end;
|
||||
@ -1192,12 +1185,12 @@ implementation
|
||||
(ftSingle,ftDouble,ftExtended,ftExtended,ftComp,ftCurr,ftFloat128);
|
||||
begin
|
||||
write_header(tcb,def,tkFloat);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_1byte],
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
tcb.emit_ord_const(translate[def.floattype],u8inttype);
|
||||
tcb.end_anonymous_record;
|
||||
end;
|
||||
@ -1206,12 +1199,17 @@ implementation
|
||||
procedure setdef_rtti(def:tsetdef);
|
||||
begin
|
||||
write_header(tcb,def,tkSet);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_rtti_set_outer],
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
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
|
||||
1:
|
||||
tcb.emit_ord_const(otUByte,u8inttype);
|
||||
@ -1231,6 +1229,7 @@ implementation
|
||||
write_rtti_reference(tcb,def.elementdef,rt);
|
||||
tcb.end_anonymous_record;
|
||||
tcb.end_anonymous_record;
|
||||
tcb.end_anonymous_record;
|
||||
end;
|
||||
|
||||
|
||||
@ -1246,7 +1245,6 @@ implementation
|
||||
else
|
||||
tcb.emit_ord_const(tkArray,u8inttype);
|
||||
write_rtti_name(tcb,def);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
|
||||
if not(ado_IsDynamicArray in def.arrayoptions) then
|
||||
begin
|
||||
@ -1268,6 +1266,7 @@ implementation
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
{ total size = elecount * elesize of the first arraydef }
|
||||
tcb.emit_tai(Tai_const.Create_sizeint(def.elecount*def.elesize),sizeuinttype);
|
||||
{ total element count }
|
||||
@ -1299,6 +1298,7 @@ implementation
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
{ size of elements }
|
||||
tcb.emit_tai(Tai_const.Create_sizeint(def.elesize),sizeuinttype);
|
||||
{ element type }
|
||||
@ -1319,12 +1319,12 @@ implementation
|
||||
procedure classrefdef_rtti(def:tclassrefdef);
|
||||
begin
|
||||
write_header(tcb,def,tkClassRef);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_rtti_ref],
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
write_rtti_reference(tcb,def.pointeddef,rt);
|
||||
tcb.end_anonymous_record;
|
||||
end;
|
||||
@ -1332,12 +1332,12 @@ implementation
|
||||
procedure pointerdef_rtti(def:tpointerdef);
|
||||
begin
|
||||
write_header(tcb,def,tkPointer);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
tcb.begin_anonymous_record(
|
||||
internaltypeprefixName[itp_rtti_ref],
|
||||
defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
write_rtti_reference(tcb,def.pointeddef,rt);
|
||||
tcb.end_anonymous_record;
|
||||
end;
|
||||
@ -1390,7 +1390,6 @@ implementation
|
||||
|
||||
begin
|
||||
write_header(tcb,def,tkRecord);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
{ need extra reqalign record, because otherwise the u32 int will
|
||||
only be aligned to 4 even on 64 bit target (while the rtti code
|
||||
in typinfo expects alignments to sizeof(pointer)) }
|
||||
@ -1398,6 +1397,8 @@ implementation
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
|
||||
{ store special terminator for init table for more optimal rtl operations
|
||||
strictly related to RecordRTTI procedure in rtti.inc (directly
|
||||
related to RTTIRecordRttiInfoToInitInfo function) }
|
||||
@ -1474,11 +1475,12 @@ implementation
|
||||
begin
|
||||
{ write method id and name }
|
||||
write_header(tcb,def,tkMethod);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
tcb.begin_anonymous_record('',defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
|
||||
{ write kind of method }
|
||||
methodkind:=write_methodkind(tcb,def);
|
||||
|
||||
@ -1517,11 +1519,12 @@ implementation
|
||||
else
|
||||
begin
|
||||
write_header(tcb,def,tkProcvar);
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
tcb.begin_anonymous_record('',defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
|
||||
{ flags }
|
||||
tcb.emit_ord_const(0,u8inttype);
|
||||
{ write calling convention }
|
||||
@ -1700,12 +1703,12 @@ implementation
|
||||
{ generate the name }
|
||||
tcb.emit_shortstring_const(def.objrealname^);
|
||||
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
|
||||
tcb.begin_anonymous_record('',defaultpacking,reqalign,
|
||||
targetinfos[target_info.system]^.alignment.recordalignmin,
|
||||
targetinfos[target_info.system]^.alignment.maxCrecordalign);
|
||||
|
||||
write_common_rtti_data(tcb,def,rt);
|
||||
|
||||
case rt of
|
||||
initrtti :
|
||||
begin
|
||||
@ -1998,6 +2001,7 @@ implementation
|
||||
tcb.queue_init(voidpointertype);
|
||||
tcb.queue_subscriptn_multiple_by_name(rttidef,
|
||||
['size_start_rec',
|
||||
'typ_union_rec',
|
||||
'min_max_rec',
|
||||
'basetype_array_rec',
|
||||
tsym(syms[i]).Name]
|
||||
@ -2017,6 +2021,7 @@ implementation
|
||||
tcb.queue_init(voidpointertype);
|
||||
tcb.queue_subscriptn_multiple_by_name(rttidef,
|
||||
['size_start_rec',
|
||||
'typ_union_rec',
|
||||
'min_max_rec',
|
||||
'basetype_array_rec',
|
||||
tsym(syms[i]).Name]
|
||||
@ -2067,6 +2072,7 @@ implementation
|
||||
tcb.queue_init(voidpointertype);
|
||||
tcb.queue_subscriptn_multiple_by_name(rttidef,
|
||||
['size_start_rec',
|
||||
'typ_union_rec',
|
||||
'min_max_rec',
|
||||
'basetype_array_rec',
|
||||
tsym(syms[i]).Name]
|
||||
|
@ -741,10 +741,12 @@ type
|
||||
itp_rtti_dyn_array,
|
||||
itp_rtti_proc_param,
|
||||
itp_rtti_enum_size_start_rec,
|
||||
itp_rtti_enum_size_start_rec2,
|
||||
itp_rtti_enum_min_max_rec,
|
||||
itp_rtti_enum_basetype_array_rec,
|
||||
itp_rtti_ref,
|
||||
itp_rtti_set_outer,
|
||||
itp_rtti_set_middle,
|
||||
itp_rtti_set_inner,
|
||||
itp_init_record_operators,
|
||||
itp_init_mop_offset_entry,
|
||||
@ -884,10 +886,12 @@ inherited_objectoptions : tobjectoptions = [oo_has_virtual,oo_has_private,oo_has
|
||||
'$rtti_dyn_array$',
|
||||
'$rtti_proc_param$',
|
||||
'$rtti_enum_size_start_rec$',
|
||||
'$rtti_enum_size_start_rec2$',
|
||||
'$rtti_enum_min_max_rec$',
|
||||
'$rtti_enum_basetype_array_rec$',
|
||||
'$rtti_ref$',
|
||||
'$rtti_set_outer$',
|
||||
'$rtti_set_middle$',
|
||||
'$rtti_set_inner$',
|
||||
'$init_record_operators$',
|
||||
'$init_mop_offset_entry$',
|
||||
|
@ -526,22 +526,28 @@ type
|
||||
{$if declared(TRttiDataCommon)}
|
||||
Common: TRttiDataCommon;
|
||||
{$endif}
|
||||
ordtype:byte;
|
||||
case TTypeKind of
|
||||
tkInteger,tkChar,tkEnumeration,tkBool,tkWChar,tkSet: (
|
||||
MinValue,MaxValue : Longint;
|
||||
case byte of
|
||||
tkEnumeration: (
|
||||
BaseTypeRef : pointer
|
||||
);
|
||||
{$ifndef VER3_0}
|
||||
{tkBool with OrdType=otSQWord }
|
||||
tkInt64:
|
||||
(MinInt64Value, MaxInt64Value: Int64);
|
||||
{tkBool with OrdType=otUQWord }
|
||||
tkQWord:
|
||||
(MinQWordValue, MaxQWordValue: QWord);
|
||||
tkInt64,tkQWord,
|
||||
{$endif VER3_0}
|
||||
tkInteger,tkChar,tkEnumeration,tkBool,tkWChar: (
|
||||
OrdType : Byte;
|
||||
case TTypeKind of
|
||||
tkInteger,tkChar,tkEnumeration,tkBool,tkWChar: (
|
||||
MinValue,MaxValue : Longint;
|
||||
case byte of
|
||||
tkEnumeration: (
|
||||
BaseTypeRef : pointer
|
||||
);
|
||||
{$ifndef VER3_0}
|
||||
{tkBool with OrdType=otSQWord }
|
||||
tkInt64:
|
||||
(MinInt64Value, MaxInt64Value: Int64);
|
||||
{tkBool with OrdType=otUQWord }
|
||||
tkQWord:
|
||||
(MinQWordValue, MaxQWordValue: QWord);
|
||||
{$endif VER3_0}
|
||||
);
|
||||
);
|
||||
{ more data here, but not needed }
|
||||
end;
|
||||
|
Loading…
Reference in New Issue
Block a user