class.c (build_utf8_ref): Pad initializer string to utf8const_type's alignment.
authorJakub Jelinek <jakub@redhat.com>
Tue, 29 Jul 2008 16:30:32 +0000 (18:30 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 29 Jul 2008 16:30:32 +0000 (18:30 +0200)
* class.c (build_utf8_ref): Pad initializer string to utf8const_type's
alignment.

From-SVN: r138251

gcc/java/ChangeLog
gcc/java/class.c

index 022cff0d0c5bb7af6ac61e60814a0aec272e93bc..9fad320913096856a96c85a81798d6df7f397c77 100644 (file)
@@ -1,3 +1,8 @@
+2008-07-29  Jakub Jelinek  <jakub@redhat.com>
+
+       * class.c (build_utf8_ref): Pad initializer string to utf8const_type's
+       alignment.
+
 2008-07-29  Jan Hubicka  <jh@suse.cz>
 
        * lang.c (java_post_options): Remove handling of flag_no_inline.
index ef5cc0f89565814b1361465a41fee9b416144f20..fecd962b8b657beccdfe6b508b3e4e5b67822b74 100644 (file)
@@ -930,8 +930,8 @@ static GTY(()) tree utf8_decl_list = NULL_TREE;
 tree
 build_utf8_ref (tree name)
 {
-  const char * name_ptr = IDENTIFIER_POINTER(name);
-  int name_len = IDENTIFIER_LENGTH(name);
+  const char * name_ptr = IDENTIFIER_POINTER (name);
+  int name_len = IDENTIFIER_LENGTH (name), name_pad;
   char buf[60];
   tree ctype, field = NULL_TREE, str_type, cinit, string;
   static int utf8_count = 0;
@@ -942,8 +942,11 @@ build_utf8_ref (tree name)
     return ref;
 
   ctype = make_node (RECORD_TYPE);
+  /* '\0' byte plus padding to utf8const_type's alignment.  */
+  name_pad = TYPE_ALIGN_UNIT (utf8const_type)
+            - (name_len & (TYPE_ALIGN_UNIT (utf8const_type) - 1));
   str_type = build_prim_array_type (unsigned_byte_type_node,
-                                   name_len + 1); /* Allow for final '\0'. */
+                                   name_len + name_pad);
   PUSH_FIELD (ctype, field, "hash", unsigned_short_type_node);
   PUSH_FIELD (ctype, field, "length", unsigned_short_type_node);
   PUSH_FIELD (ctype, field, "data", str_type);
@@ -973,8 +976,7 @@ build_utf8_ref (tree name)
     {
       int decl_size;
       /* Ensure decl_size is a multiple of utf8const_type's alignment. */
-      decl_size = (name_len + 5 + TYPE_ALIGN_UNIT (utf8const_type) - 1)
-       & ~(TYPE_ALIGN_UNIT (utf8const_type) - 1);
+      decl_size = name_len + 4 + name_pad;
       if (flag_merge_constants && decl_size < 256)
        {
          char buf[32];