Explorar el Código

* generate correctly aligned string RTTI, fixes trtti7 on ARM

git-svn-id: trunk@42488 -
svenbarth hace 6 años
padre
commit
4c338b1f70
Se han modificado 2 ficheros con 27 adiciones y 23 borrados
  1. 23 23
      compiler/ncgrtti.pas
  2. 4 0
      compiler/symconst.pas

+ 23 - 23
compiler/ncgrtti.pas

@@ -932,46 +932,46 @@ implementation
         end;
 
         procedure stringdef_rtti(def:tstringdef);
+        const
+          string_typekinds: array[tstringtype] of byte = (
+            tkSString,tkLString,tkAString,tkWString,tkUString
+          );
         begin
+          write_header(tcb,def,string_typekinds[def.stringtype]);
+          tcb.begin_anonymous_record(
+            internaltypeprefixName[itp_rtti_outer]+tostr(string_typekinds[def.stringtype]),
+            defaultpacking,reqalign,
+            targetinfos[target_info.system]^.alignment.recordalignmin);
+          write_common_rtti_data(tcb,def,rt);
           case def.stringtype of
             st_ansistring:
               begin
-                write_header(tcb,def,tkAString);
-                { align }
                 tcb.begin_anonymous_record(
-                  internaltypeprefixName[itp_rtti_ansistr],
+                  internaltypeprefixName[itp_rtti_case]+tostr(string_typekinds[def.stringtype]),
                   defaultpacking,reqalign,
                   targetinfos[target_info.system]^.alignment.recordalignmin);
-                write_common_rtti_data(tcb,def,rt);
                 tcb.emit_ord_const(def.encoding,u16inttype);
                 tcb.end_anonymous_record;
               end;
 
-            st_widestring:
-              begin
-                write_header(tcb,def,tkWString);
-                write_common_rtti_data(tcb,def,rt);
-              end;
-
-            st_unicodestring:
+            st_shortstring:
               begin
-                write_header(tcb,def,tkUString);
-                write_common_rtti_data(tcb,def,rt);
+                tcb.begin_anonymous_record(
+                  internaltypeprefixName[itp_rtti_case]+tostr(string_typekinds[def.stringtype]),
+                  defaultpacking,reqalign,
+                  targetinfos[target_info.system]^.alignment.recordalignmin);
+                tcb.emit_ord_const(def.len,u8inttype);
+                tcb.end_anonymous_record;
               end;
 
+            st_widestring,
+            st_unicodestring,
             st_longstring:
-              begin
-                write_header(tcb,def,tkLString);
-                write_common_rtti_data(tcb,def,rt);
-              end;
+              { nothing }
+              ;
 
-            st_shortstring:
-              begin
-                 write_header(tcb,def,tkSString);
-                 write_common_rtti_data(tcb,def,rt);
-                 tcb.emit_ord_const(def.len,u8inttype);
-              end;
           end;
+          tcb.end_anonymous_record;
         end;
 
         procedure enumdef_rtti(def: tenumdef);

+ 4 - 0
compiler/symconst.pas

@@ -729,6 +729,8 @@ type
     itp_vmt_afterconstruction_local,
     itp_rttidef,
     itp_rtti_header,
+    itp_rtti_outer,
+    itp_rtti_case,
     itp_rtti_common_data,
     itp_rtti_prop,
     itp_rtti_ansistr,
@@ -882,6 +884,8 @@ inherited_objectoptions : tobjectoptions = [oo_has_virtual,oo_has_private,oo_has
        '$vmt_afterconstruction_local',
        '$rttidef$',
        '$rtti_header$',
+       '$rtti_outer$',
+       '$rtti_case$',
        '$rtti_common_data$',
        '$rtti_prop$',
        '$rtti_ansistr$',