Przeglądaj źródła

* correctly encapsulate the RTTI data for sets to avoid alignment problems with the new SetSize field (fixes compilation on Sparc and basically every other target that requires proper alignment with 64-bit values dictating an 8-Byte alignment)

git-svn-id: trunk@37201 -
svenbarth 8 lat temu
rodzic
commit
50788e8b3b
2 zmienionych plików z 11 dodań i 7 usunięć
  1. 7 5
      compiler/ncgrtti.pas
  2. 4 2
      compiler/symconst.pas

+ 7 - 5
compiler/ncgrtti.pas

@@ -998,7 +998,7 @@ implementation
         begin
         begin
            write_header(tcb,def,tkSet);
            write_header(tcb,def,tkSet);
            tcb.begin_anonymous_record(
            tcb.begin_anonymous_record(
-             internaltypeprefixName[itp_rtti_set],
+             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);
@@ -1012,13 +1012,15 @@ implementation
              else
              else
                tcb.emit_ord_const(otUByte,u8inttype);
                tcb.emit_ord_const(otUByte,u8inttype);
            end;
            end;
+           tcb.begin_anonymous_record(
+             internaltypeprefixName[itp_rtti_set_inner],
+             defaultpacking,reqalign,
+             targetinfos[target_info.system]^.alignment.recordalignmin,
+             targetinfos[target_info.system]^.alignment.maxCrecordalign);
            tcb.emit_ord_const(def.size,sizesinttype);
            tcb.emit_ord_const(def.size,sizesinttype);
-           tcb.end_anonymous_record;
-           tcb.begin_anonymous_record(internaltypeprefixName[itp_rtti_ref],defaultpacking,reqalign,
-            targetinfos[target_info.system]^.alignment.recordalignmin,
-            targetinfos[target_info.system]^.alignment.maxCrecordalign);
            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;
         end;
         end;
 
 
 
 

+ 4 - 2
compiler/symconst.pas

@@ -721,7 +721,8 @@ type
     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,
+    itp_rtti_set_outer,
+    itp_rtti_set_inner,
     itp_init_record_operators,
     itp_init_record_operators,
     itp_threadvar_record,
     itp_threadvar_record,
     itp_objc_method_list,
     itp_objc_method_list,
@@ -865,7 +866,8 @@ inherited_objectoptions : tobjectoptions = [oo_has_virtual,oo_has_private,oo_has
        '$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$',
+       '$rtti_set_outer$',
+       '$rtti_set_inner$',
        '$init_record_operators$',
        '$init_record_operators$',
        '$threadvar_record$',
        '$threadvar_record$',
        '$objc_method_list$',
        '$objc_method_list$',