Browse Source

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

git-svn-id: trunk@42446 -
florian 6 năm trước cách đây
mục cha
commit
c932dfaf70
3 tập tin đã thay đổi với 58 bổ sung42 xóa
  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);
       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]

+ 4 - 0
compiler/symconst.pas

@@ -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$',

+ 19 - 13
rtl/inc/sstrings.inc

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