Procházet zdrojové kódy

* 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 před 8 roky
rodič
revize
50788e8b3b
2 změnil soubory, kde provedl 11 přidání a 7 odebrání
  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$',