From 2d0bb7614be1a94ab9051c35fe95514b05fc0823 Mon Sep 17 00:00:00 2001 From: Andrew Stubbs Date: Mon, 19 Jan 2009 11:50:31 +0000 Subject: [PATCH] 2009-01-19 Andrew Stubbs 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 | 13 +++++++++++++ bfd/elf-attrs.c | 10 ++++++---- bfd/elf-bfd.h | 3 ++- bfd/elf32-arm.c | 11 ++++++----- gas/ChangeLog | 4 ++++ gas/read.c | 4 ++-- 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a65ee31784d..683540b0af5 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,16 @@ +2009-01-19 Andrew Stubbs + + * 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 PR 9695 diff --git a/bfd/elf-attrs.c b/bfd/elf-attrs.c index 4019535a648..dc2605669d4 100644 --- a/bfd/elf-attrs.c +++ b/bfd/elf-attrs.c @@ -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); diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 14825a45cd6..267b4b43a1b 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -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 { diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index ece1a56ccfc..a047c5f18b3 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -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. */ diff --git a/gas/ChangeLog b/gas/ChangeLog index 715614e2c6a..d1b93990e0d 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,7 @@ +2009-01-19 Andrew Stubbs + + * read.c (s_vendor_attribute): Allow for unknown flag bits in type. + 2009-01-16 Mark Shinwell * config/te-armeabi.h (EABI_DEFAULT): Use EF_ARM_EABI_VER5. diff --git a/gas/read.c b/gas/read.c index 502e2580881..db0cc876151 100644 --- a/gas/read.c +++ b/gas/read.c @@ -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); -- 2.30.2