From 3483fe2e0bd83ee8dba72f73c6a309cae2d75e7e Mon Sep 17 00:00:00 2001 From: Andrew Stubbs Date: Mon, 19 Jan 2009 11:55:35 +0000 Subject: [PATCH] 2009-01-19 Andrew Stubbs bfd/ * elf-attrs.c (is_default_attr): Substitute magic numbers with macros. (obj_attr_size): Likewise. (write_obj_attribute): Likewise. (_bfd_elf_copy_obj_attributes): Likewise. (_bfd_elf_parse_attributes): Likewise. * elf-bfd.h (ATTR_TYPE_FLAG_INT_VAL): New define. (ATTR_TYPE_FLAG_STR_VAL, ATTR_TYPE_FLAG_NO_DEFAULT): New defines. (ATTR_TYPE_HAS_INT_VAL, ATTR_TYPE_HAS_STR_VAL): New defines. (ATTR_TYPE_HAS_NO_DEFAULT): New define. * elf32-arm.c (elf32_arm_obj_attrs_arg_type): Replace magic numbers with macros. --- bfd/ChangeLog | 14 ++++++++++++++ bfd/elf-attrs.c | 30 +++++++++++++++--------------- bfd/elf-bfd.h | 15 +++++++++++---- bfd/elf32-arm.c | 12 ++++++------ 4 files changed, 46 insertions(+), 25 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 683540b0af..65300c1e5f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,17 @@ +2009-01-19 Andrew Stubbs + + * elf-attrs.c (is_default_attr): Substitute magic numbers with macros. + (obj_attr_size): Likewise. + (write_obj_attribute): Likewise. + (_bfd_elf_copy_obj_attributes): Likewise. + (_bfd_elf_parse_attributes): Likewise. + * elf-bfd.h (ATTR_TYPE_FLAG_INT_VAL): New define. + (ATTR_TYPE_FLAG_STR_VAL, ATTR_TYPE_FLAG_NO_DEFAULT): New defines. + (ATTR_TYPE_HAS_INT_VAL, ATTR_TYPE_HAS_STR_VAL): New defines. + (ATTR_TYPE_HAS_NO_DEFAULT): New define. + * elf32-arm.c (elf32_arm_obj_attrs_arg_type): Replace magic numbers + with macros. + 2009-01-19 Andrew Stubbs * elf-attrs.c (is_default_attr): Support defaultless attributes. diff --git a/bfd/elf-attrs.c b/bfd/elf-attrs.c index dc2605669d..1e8076b743 100644 --- a/bfd/elf-attrs.c +++ b/bfd/elf-attrs.c @@ -43,11 +43,11 @@ uleb128_size (unsigned int i) static bfd_boolean is_default_attr (obj_attribute *attr) { - if ((attr->type & 1) && attr->i != 0) + if (ATTR_TYPE_HAS_INT_VAL (attr->type) && attr->i != 0) return FALSE; - if ((attr->type & 2) && attr->s && *attr->s) + if (ATTR_TYPE_HAS_STR_VAL (attr->type) && attr->s && *attr->s) return FALSE; - if (attr->type & 4) + if (ATTR_TYPE_HAS_NO_DEFAULT (attr->type)) return FALSE; return TRUE; @@ -63,9 +63,9 @@ obj_attr_size (int tag, obj_attribute *attr) return 0; size = uleb128_size (tag); - if (attr->type & 1) + if (ATTR_TYPE_HAS_INT_VAL (attr->type)) size += uleb128_size (attr->i); - if (attr->type & 2) + if (ATTR_TYPE_HAS_STR_VAL (attr->type)) size += strlen ((char *)attr->s) + 1; return size; } @@ -151,9 +151,9 @@ write_obj_attribute (bfd_byte *p, int tag, obj_attribute *attr) return p; p = write_uleb128 (p, tag); - if (attr->type & 1) + if (ATTR_TYPE_HAS_INT_VAL (attr->type)) p = write_uleb128 (p, attr->i); - if (attr->type & 2) + if (ATTR_TYPE_HAS_STR_VAL (attr->type)) { int len; @@ -361,16 +361,16 @@ _bfd_elf_copy_obj_attributes (bfd *ibfd, bfd *obfd) list = list->next) { in_attr = &list->attr; - switch (in_attr->type) + switch (in_attr->type & (ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL)) { - case 1: + case ATTR_TYPE_FLAG_INT_VAL: bfd_elf_add_obj_attr_int (obfd, vendor, list->tag, in_attr->i); break; - case 2: + case ATTR_TYPE_FLAG_STR_VAL: bfd_elf_add_obj_attr_string (obfd, vendor, list->tag, in_attr->s); break; - case 3: + case ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL: bfd_elf_add_obj_attr_int_string (obfd, vendor, list->tag, in_attr->i, in_attr->s); break; @@ -489,21 +489,21 @@ _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 & 3) + switch (type & (ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL)) { - case 3: + case ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL: val = read_unsigned_leb128 (abfd, p, &n); p += n; bfd_elf_add_obj_attr_int_string (abfd, vendor, tag, val, (char *)p); p += strlen ((char *)p) + 1; break; - case 2: + case ATTR_TYPE_FLAG_STR_VAL: bfd_elf_add_obj_attr_string (abfd, vendor, tag, (char *)p); p += strlen ((char *)p) + 1; break; - case 1: + case ATTR_TYPE_FLAG_INT_VAL: val = read_unsigned_leb128 (abfd, p, &n); p += n; bfd_elf_add_obj_attr_int (abfd, vendor, tag, val); diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index 267b4b43a1..c0d8c8a40e 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -1371,13 +1371,20 @@ struct elf_find_verdep_info /* The maximum number of known object attributes for any target. */ #define NUM_KNOWN_OBJ_ATTRIBUTES 71 -/* The value of an object attribute. type & 1 indicates whether there - is an integer value; type & 2 indicates whether there is a string - value; type & 4 indicates whether the type has a default value - (i.e. is there a value that need not be written to file). */ +/* The value of an object attribute. The type indicates whether the attribute + holds and integer, a string, or both. It can also indicate that there can + be no default (i.e. all values must be written to file, even zero). */ typedef struct obj_attribute { +#define ATTR_TYPE_FLAG_INT_VAL (1 << 0) +#define ATTR_TYPE_FLAG_STR_VAL (1 << 1) +#define ATTR_TYPE_FLAG_NO_DEFAULT (1 << 2) + +#define ATTR_TYPE_HAS_INT_VAL(TYPE) ((TYPE) & ATTR_TYPE_FLAG_INT_VAL) +#define ATTR_TYPE_HAS_STR_VAL(TYPE) ((TYPE) & ATTR_TYPE_FLAG_STR_VAL) +#define ATTR_TYPE_HAS_NO_DEFAULT(TYPE) ((TYPE) & ATTR_TYPE_FLAG_NO_DEFAULT) + int type; unsigned int i; char *s; diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index a047c5f18b..bf1f06f137 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -8138,15 +8138,15 @@ static int elf32_arm_obj_attrs_arg_type (int tag) { if (tag == Tag_compatibility) - return 3; + return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL; else if (tag == Tag_nodefaults) - return 5; - else if (tag == 4 || tag == 5) - return 2; + return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_NO_DEFAULT; + else if (tag == Tag_CPU_raw_name || tag == Tag_CPU_name) + return ATTR_TYPE_FLAG_STR_VAL; else if (tag < 32) - return 1; + return ATTR_TYPE_FLAG_INT_VAL; else - return (tag & 1) != 0 ? 2 : 1; + return (tag & 1) != 0 ? ATTR_TYPE_FLAG_STR_VAL : ATTR_TYPE_FLAG_INT_VAL; } /* Read the architecture from the Tag_also_compatible_with attribute, if any. -- 2.34.1