Browse Source

* 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 years ago
parent
commit
50788e8b3b
2 changed files with 11 additions and 7 deletions
  1. 7 5
      compiler/ncgrtti.pas
  2. 4 2
      compiler/symconst.pas

+ 7 - 5
compiler/ncgrtti.pas

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

+ 4 - 2
compiler/symconst.pas

@@ -721,7 +721,8 @@ type
     itp_rtti_enum_min_max_rec,
     itp_rtti_enum_basetype_array_rec,
     itp_rtti_ref,
-    itp_rtti_set,
+    itp_rtti_set_outer,
+    itp_rtti_set_inner,
     itp_init_record_operators,
     itp_threadvar_record,
     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_basetype_array_rec$',
        '$rtti_ref$',
-       '$rtti_set$',
+       '$rtti_set_outer$',
+       '$rtti_set_inner$',
        '$init_record_operators$',
        '$threadvar_record$',
        '$objc_method_list$',