Browse Source

* first bunch of fixes for rtti for arm after attribute commits, fixes mostly alignment issues

git-svn-id: trunk@42446 -
florian 6 years ago
parent
commit
c932dfaf70
3 changed files with 58 additions and 42 deletions
  1. 35 29
      compiler/ncgrtti.pas
  2. 4 0
      compiler/symconst.pas
  3. 19 13
      rtl/inc/sstrings.inc

+ 35 - 29
compiler/ncgrtti.pas

@@ -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]

+ 4 - 0
compiler/symconst.pas

@@ -741,10 +741,12 @@ type
     itp_rtti_dyn_array,
     itp_rtti_dyn_array,
     itp_rtti_proc_param,
     itp_rtti_proc_param,
     itp_rtti_enum_size_start_rec,
     itp_rtti_enum_size_start_rec,
+    itp_rtti_enum_size_start_rec2,
     itp_rtti_enum_min_max_rec,
     itp_rtti_enum_min_max_rec,
     itp_rtti_enum_basetype_array_rec,
     itp_rtti_enum_basetype_array_rec,
     itp_rtti_ref,
     itp_rtti_ref,
     itp_rtti_set_outer,
     itp_rtti_set_outer,
+    itp_rtti_set_middle,
     itp_rtti_set_inner,
     itp_rtti_set_inner,
     itp_init_record_operators,
     itp_init_record_operators,
     itp_init_mop_offset_entry,
     itp_init_mop_offset_entry,
@@ -884,10 +886,12 @@ inherited_objectoptions : tobjectoptions = [oo_has_virtual,oo_has_private,oo_has
        '$rtti_dyn_array$',
        '$rtti_dyn_array$',
        '$rtti_proc_param$',
        '$rtti_proc_param$',
        '$rtti_enum_size_start_rec$',
        '$rtti_enum_size_start_rec$',
+       '$rtti_enum_size_start_rec2$',
        '$rtti_enum_min_max_rec$',
        '$rtti_enum_min_max_rec$',
        '$rtti_enum_basetype_array_rec$',
        '$rtti_enum_basetype_array_rec$',
        '$rtti_ref$',
        '$rtti_ref$',
        '$rtti_set_outer$',
        '$rtti_set_outer$',
+       '$rtti_set_middle$',
        '$rtti_set_inner$',
        '$rtti_set_inner$',
        '$init_record_operators$',
        '$init_record_operators$',
        '$init_mop_offset_entry$',
        '$init_mop_offset_entry$',

+ 19 - 13
rtl/inc/sstrings.inc

@@ -526,22 +526,28 @@ type
 {$if declared(TRttiDataCommon)}
 {$if declared(TRttiDataCommon)}
     Common: TRttiDataCommon;
     Common: TRttiDataCommon;
 {$endif}
 {$endif}
-    ordtype:byte;
     case TTypeKind of
     case TTypeKind of
-      tkInteger,tkChar,tkEnumeration,tkBool,tkWChar,tkSet: (
-        MinValue,MaxValue : Longint;
-        case byte of
-          tkEnumeration: (
-            BaseTypeRef : pointer
-            );
 {$ifndef VER3_0}
 {$ifndef VER3_0}
-        {tkBool with OrdType=otSQWord }
-        tkInt64:
-          (MinInt64Value, MaxInt64Value: Int64);
-        {tkBool with OrdType=otUQWord }
-        tkQWord:
-          (MinQWordValue, MaxQWordValue: QWord);
+      tkInt64,tkQWord,
 {$endif VER3_0}
 {$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 }
     { more data here, but not needed }
   end;
   end;