Ver código fonte

* 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 anos atrás
pai
commit
50788e8b3b
2 arquivos alterados com 11 adições e 7 exclusões
  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$',