This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: [Patch 4/6] ARM attributes: defaultless attributes
- From: Andrew Stubbs <ams at codesourcery dot com>
- To: Nick Clifton <nickc at redhat dot com>
- Cc: binutils at sourceware dot org
- Date: Fri, 16 Jan 2009 12:46:25 +0000
- Subject: Re: [Patch 4/6] ARM attributes: defaultless attributes
- References: <496C6691.70001@codesourcery.com> <4970573A.9080804@redhat.com>
Nick Clifton wrote:
Would you mind doing some tidying of this code ?
How about the attached?
I've formed it as a separate patch to be applied on top of my previous
patch. Hopefully this isn't a problem.
Andrew
2009-01-16 Andrew Stubbs <ams@codesourcery.com>
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.
---
src/binutils-mainline/bfd/elf-attrs.c | 30 +++++++++++++++---------------
src/binutils-mainline/bfd/elf-bfd.h | 15 +++++++++++----
src/binutils-mainline/bfd/elf32-arm.c | 12 ++++++------
3 files changed, 32 insertions(+), 25 deletions(-)
Index: src/binutils-mainline/bfd/elf-attrs.c
===================================================================
--- src/binutils-mainline/bfd/elf-attrs.c.orig
+++ src/binutils-mainline/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 *a
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 ta
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,
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, El
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);
Index: src/binutils-mainline/bfd/elf-bfd.h
===================================================================
--- src/binutils-mainline/bfd/elf-bfd.h.orig
+++ src/binutils-mainline/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;
Index: src/binutils-mainline/bfd/elf32-arm.c
===================================================================
--- src/binutils-mainline/bfd/elf32-arm.c.orig
+++ src/binutils-mainline/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.