OSDN Git Service

2009-01-19 Andrew Stubbs <ams@codesourcery.com>
authorams <ams>
Mon, 19 Jan 2009 11:50:30 +0000 (11:50 +0000)
committerams <ams>
Mon, 19 Jan 2009 11:50:30 +0000 (11:50 +0000)
bfd/
* elf-attrs.c (is_default_attr): Support defaultless attributes.
(bfd_elf_add_obj_attr_int): Get type from _bfd_elf_obj_attrs_arg_type.
(bfd_elf_add_obj_attr_string): Likewise.
(bfd_elf_add_obj_attr_int_string): Likewise.
(_bfd_elf_parse_attributes): Allow for unknown flag bits in type.
* elf-bfd.h (struct obj_attribute): Document new flag bit.
* elf32-arm.c (elf32_arm_obj_attrs_arg_type): Specify that
Tag_nodefaults has no default value.
(elf32_arm_merge_eabi_attributes): Modify the Tag_nodefaults
comment to reflect the new state.

gas/
* read.c (s_vendor_attribute): Allow for unknown flag bits in type.

bfd/ChangeLog
bfd/elf-attrs.c
bfd/elf-bfd.h
bfd/elf32-arm.c
gas/ChangeLog
gas/read.c

index a65ee31..683540b 100644 (file)
@@ -1,3 +1,16 @@
+2009-01-19  Andrew Stubbs  <ams@codesourcery.com>
+
+       * elf-attrs.c (is_default_attr): Support defaultless attributes.
+       (bfd_elf_add_obj_attr_int): Get type from _bfd_elf_obj_attrs_arg_type.
+       (bfd_elf_add_obj_attr_string): Likewise.
+       (bfd_elf_add_obj_attr_int_string): Likewise.
+       (_bfd_elf_parse_attributes): Allow for unknown flag bits in type.
+       * elf-bfd.h (struct obj_attribute): Document new flag bit.
+       * elf32-arm.c (elf32_arm_obj_attrs_arg_type): Specify that
+       Tag_nodefaults has no default value.
+       (elf32_arm_merge_eabi_attributes): Modify the Tag_nodefaults
+       comment to reflect the new state.
+
 2009-01-19  Alan Modra  <amodra@bigpond.net.au>
 
        PR 9695
index 4019535..dc26056 100644 (file)
@@ -47,6 +47,8 @@ is_default_attr (obj_attribute *attr)
     return FALSE;
   if ((attr->type & 2) && attr->s && *attr->s)
     return FALSE;
+  if (attr->type & 4)
+    return FALSE;
 
   return TRUE;
 }
@@ -290,7 +292,7 @@ bfd_elf_add_obj_attr_int (bfd *abfd, int vendor, int tag, unsigned int i)
   obj_attribute *attr;
 
   attr = elf_new_obj_attr (abfd, vendor, tag);
-  attr->type = 1;
+  attr->type = _bfd_elf_obj_attrs_arg_type (abfd, vendor, tag);
   attr->i = i;
 }
 
@@ -313,7 +315,7 @@ bfd_elf_add_obj_attr_string (bfd *abfd, int vendor, int tag, const char *s)
   obj_attribute *attr;
 
   attr = elf_new_obj_attr (abfd, vendor, tag);
-  attr->type = 2;
+  attr->type = _bfd_elf_obj_attrs_arg_type (abfd, vendor, tag);
   attr->s = _bfd_elf_attr_strdup (abfd, s);
 }
 
@@ -325,7 +327,7 @@ bfd_elf_add_obj_attr_int_string (bfd *abfd, int vendor, int tag,
   obj_attribute *attr;
 
   attr = elf_new_obj_attr (abfd, vendor, tag);
-  attr->type = 3;
+  attr->type = _bfd_elf_obj_attrs_arg_type (abfd, vendor, tag);
   attr->i = i;
   attr->s = _bfd_elf_attr_strdup (abfd, s);
 }
@@ -487,7 +489,7 @@ _bfd_elf_parse_attributes (bfd *abfd, Elf_Internal_Shdr * hdr)
                      tag = read_unsigned_leb128 (abfd, p, &n);
                      p += n;
                      type = _bfd_elf_obj_attrs_arg_type (abfd, vendor, tag);
-                     switch (type)
+                     switch (type & 3)
                        {
                        case 3:
                          val = read_unsigned_leb128 (abfd, p, &n);
index 14825a4..267b4b4 100644 (file)
@@ -1373,7 +1373,8 @@ struct elf_find_verdep_info
 
 /* The value of an object attribute.  type & 1 indicates whether there
    is an integer value; type & 2 indicates whether there is a string
-   value.  */
+   value; type & 4 indicates whether the type has a default value
+   (i.e. is there a value that need not be written to file).  */
 
 typedef struct obj_attribute
 {
index ece1a56..a047c5f 100644 (file)
@@ -8139,6 +8139,8 @@ elf32_arm_obj_attrs_arg_type (int tag)
 {
   if (tag == Tag_compatibility)
     return 3;
+  else if (tag == Tag_nodefaults)
+    return 5;
   else if (tag == 4 || tag == 5)
     return 2;
   else if (tag < 32)
@@ -8675,11 +8677,10 @@ elf32_arm_merge_eabi_attributes (bfd *ibfd, bfd *obfd)
          break;
 
        case Tag_nodefaults:
-         /* This tag is set if it exists, but the value is unused.
-            Unfortunately, we don't record whether each attribute is zero
-            initialized, or read from the file, so the information has been
-            lost.  In any case, we don't write attributes with zero values.
-            Do nothing. */
+         /* This tag is set if it exists, but the value is unused (and is
+            typically zero).  We don't actually need to do anything here -
+            the merge happens automatically when the type flags are merged
+            below.  */
          break;
        case Tag_also_compatible_with:
          /* Already done in Tag_CPU_arch.  */
index 715614e..d1b9399 100644 (file)
@@ -1,3 +1,7 @@
+2009-01-19  Andrew Stubbs  <ams@codesourcery.com>
+
+       * read.c (s_vendor_attribute): Allow for unknown flag bits in type.
+
 2009-01-16  Mark Shinwell  <shinwell@codesourcery.com>
 
        * config/te-armeabi.h (EABI_DEFAULT): Use EF_ARM_EABI_VER5.
index 502e258..db0cc87 100644 (file)
@@ -2123,7 +2123,7 @@ s_vendor_attribute (int vendor)
        }
       i = exp.X_add_number;
     }
-  if (type == 3
+  if ((type & 3) == 3
       && skip_past_comma (&input_line_pointer) == -1)
     {
       as_bad (_("expected comma"));
@@ -2140,7 +2140,7 @@ s_vendor_attribute (int vendor)
       s = demand_copy_C_string (&len);
     }
 
-  switch (type)
+  switch (type & 3)
     {
     case 3:
       bfd_elf_add_obj_attr_int_string (stdoutput, vendor, tag, i, s);