}
#endif /* TC_OBJ_ATTR_v2 */
-#if (TC_OBJ_ATTR_v1)
-/* Parse an attribute directive for VENDOR.
- Returns the attribute number read, or zero on error. */
-
-obj_attr_tag_t
-obj_attr_v1_process_attribute (obj_attr_vendor_t vendor)
-{
- expressionS exp;
- int type;
- int tag;
- unsigned int i = 0;
- char *s = NULL;
-
- /* Read the first number or name. */
- skip_whitespace (input_line_pointer);
- s = input_line_pointer;
- if (ISDIGIT (*input_line_pointer))
- {
- expression (& exp);
- if (exp.X_op != O_constant)
- goto bad;
- tag = exp.X_add_number;
- }
- else
- {
- char *name;
-
- /* A name may contain '_', but no other punctuation. */
- for (; ISALNUM (*input_line_pointer) || *input_line_pointer == '_';
- ++input_line_pointer)
- i++;
- if (i == 0)
- goto bad;
-
- name = xmemdup0 (s, i);
-
-#ifndef CONVERT_SYMBOLIC_ATTRIBUTE
-#define CONVERT_SYMBOLIC_ATTRIBUTE(a) -1
-#endif
-
- tag = CONVERT_SYMBOLIC_ATTRIBUTE (name);
- if (tag == -1)
- {
- as_bad (_("Attribute name not recognised: %s"), name);
- ignore_rest_of_line ();
- free (name);
- return 0;
- }
- free (name);
- }
-
- type = bfd_elf_obj_attrs_arg_type (stdoutput, vendor, tag);
-
- if (! skip_past_comma (&input_line_pointer))
- goto bad;
- if (type & 1)
- {
- expression (& exp);
- if (exp.X_op != O_constant)
- {
- as_bad (_("expected numeric constant"));
- ignore_rest_of_line ();
- return 0;
- }
- i = exp.X_add_number;
- }
- if ((type & 3) == 3
- && ! skip_past_comma (&input_line_pointer))
- {
- as_bad (_("expected comma"));
- ignore_rest_of_line ();
- return 0;
- }
- if (type & 2)
- {
- int len;
-
- skip_whitespace (input_line_pointer);
- if (*input_line_pointer != '"')
- goto bad_string;
- s = demand_copy_C_string (&len);
- }
-
- oav1_attr_record_seen (vendor, tag);
- bool ok = false;
- switch (type & 3)
- {
- case 3:
- ok = bfd_elf_add_obj_attr_int_string (stdoutput, vendor, tag, i, s);
- break;
- case 2:
- ok = bfd_elf_add_obj_attr_string (stdoutput, vendor, tag, s);
- break;
- case 1:
- ok = bfd_elf_add_obj_attr_int (stdoutput, vendor, tag, i);
- break;
- default:
- abort ();
- }
- if (!ok)
- as_fatal (_("error adding attribute: %s"),
- bfd_errmsg (bfd_get_error ()));
-
- demand_empty_rest_of_line ();
- return tag;
- bad_string:
- as_bad (_("bad string constant"));
- ignore_rest_of_line ();
- return 0;
- bad:
- as_bad (_("expected <tag> , <value>"));
- ignore_rest_of_line ();
- return 0;
-}
-#endif /* TC_OBJ_ATTR_v1 */
-
/* Parse a .gnu_attribute directive. */
void
obj_elf_gnu_attribute (int ignored ATTRIBUTE_UNUSED)
{
-#if (TC_OBJ_ATTR_v1 && !TC_OBJ_ATTR_v2)
- obj_attr_v1_process_attribute (OBJ_ATTR_GNU);
-#else
obj_attr_process_attribute (OBJ_ATTR_GNU);
-#endif
}
#endif /* TC_OBJ_ATTR */