This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch 4/6] ARM attributes: defaultless attributes


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.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]