/* Allocate/find an object attribute. */
static obj_attribute *
-elf_new_obj_attr (bfd *abfd, int vendor, unsigned int tag)
+elf_new_obj_attr (bfd *abfd, obj_attr_vendor_t vendor, obj_attr_tag_t tag)
{
obj_attribute *attr;
obj_attribute_list *list;
/* Return the value of an integer object attribute. */
int
-bfd_elf_get_obj_attr_int (bfd *abfd, int vendor, unsigned int tag)
+bfd_elf_get_obj_attr_int (bfd *abfd,
+ obj_attr_vendor_t vendor,
+ obj_attr_tag_t tag)
{
obj_attribute_list *p;
/* Add an integer object attribute. */
obj_attribute *
-bfd_elf_add_obj_attr_int (bfd *abfd, int vendor, unsigned int tag, unsigned int i)
+bfd_elf_add_obj_attr_int (bfd *abfd,
+ obj_attr_vendor_t vendor,
+ obj_attr_tag_t tag,
+ unsigned int value)
{
obj_attribute *attr;
if (attr != NULL)
{
attr->type = bfd_elf_obj_attrs_arg_type (abfd, vendor, tag);
- attr->i = i;
+ attr->i = value;
}
return attr;
}
/* Add a string object attribute. */
static obj_attribute *
-elf_add_obj_attr_string (bfd *abfd, int vendor, unsigned int tag,
+elf_add_obj_attr_string (bfd *abfd, obj_attr_vendor_t vendor, obj_attr_tag_t tag,
const char *s, const char *end)
{
obj_attribute *attr;
}
obj_attribute *
-bfd_elf_add_obj_attr_string (bfd *abfd, int vendor, unsigned int tag,
+bfd_elf_add_obj_attr_string (bfd *abfd,
+ obj_attr_vendor_t vendor,
+ obj_attr_tag_t tag,
const char *s)
{
return elf_add_obj_attr_string (abfd, vendor, tag, s, NULL);
/* Add a int+string object attribute. */
static obj_attribute *
-elf_add_obj_attr_int_string (bfd *abfd, int vendor, unsigned int tag,
- unsigned int i, const char *s, const char *end)
+elf_add_obj_attr_int_string (bfd *abfd,
+ obj_attr_vendor_t vendor,
+ obj_attr_tag_t tag,
+ unsigned int i,
+ const char *s,
+ const char *end)
{
obj_attribute *attr;
}
obj_attribute *
-bfd_elf_add_obj_attr_int_string (bfd *abfd, int vendor, unsigned int tag,
- unsigned int i, const char *s)
+bfd_elf_add_obj_attr_int_string (bfd *abfd,
+ obj_attr_vendor_t vendor,
+ obj_attr_tag_t tag,
+ unsigned int i,
+ const char *s)
{
return elf_add_obj_attr_int_string (abfd, vendor, tag, i, s, NULL);
}
obj_attribute *out_attr;
obj_attribute_list *list;
int i;
- int vendor;
+ obj_attr_vendor_t vendor;
if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
|| bfd_get_flavour (obfd) != bfd_target_elf_flavour)
/* Determine whether a GNU object attribute tag takes an integer, a
string or both. */
static int
-gnu_obj_attrs_arg_type (unsigned int tag)
+gnu_obj_attrs_arg_type (obj_attr_tag_t tag)
{
/* Except for Tag_compatibility, for GNU attributes we follow the
same rule ARM ones > 32 follow: odd-numbered tags take strings
/* Determine what arguments an attribute tag takes. */
int
-bfd_elf_obj_attrs_arg_type (bfd *abfd, int vendor, unsigned int tag)
+bfd_elf_obj_attrs_arg_type (bfd *abfd,
+ obj_attr_vendor_t vendor,
+ obj_attr_tag_t tag)
{
switch (vendor)
{
struct bfd_elf_section_reloc_data;
+typedef uint32_t obj_attr_tag_t;
+
struct elf_backend_data
{
/* The architecture for this backend. */
/* Return 1, 2 or 3 to indicate what type of arguments a
processor-specific tag takes. */
- int (*obj_attrs_arg_type) (int);
+ int (*obj_attrs_arg_type) (obj_attr_tag_t);
/* The section type to use for an attributes section. */
unsigned int obj_attrs_section_type;
typedef struct obj_attribute_list
{
struct obj_attribute_list *next;
- unsigned int tag;
+ obj_attr_tag_t tag;
obj_attribute attr;
} obj_attribute_list;
/* Object attributes may either be defined by the processor ABI, index
OBJ_ATTR_PROC in the *_obj_attributes arrays, or be GNU-specific
(and possibly also processor-specific), index OBJ_ATTR_GNU. */
-#define OBJ_ATTR_PROC 0
-#define OBJ_ATTR_GNU 1
+typedef enum {
+ OBJ_ATTR_PROC,
+ OBJ_ATTR_GNU,
+} obj_attr_vendor_t;
#define OBJ_ATTR_FIRST OBJ_ATTR_PROC
#define OBJ_ATTR_LAST OBJ_ATTR_GNU
extern bfd_vma bfd_elf_obj_attr_size (bfd *);
extern void bfd_elf_set_obj_attr_contents (bfd *, bfd_byte *, bfd_vma);
-extern int bfd_elf_get_obj_attr_int (bfd *, int, unsigned int);
+extern int bfd_elf_get_obj_attr_int (bfd *, obj_attr_vendor_t, obj_attr_tag_t);
extern obj_attribute *bfd_elf_add_obj_attr_int
- (bfd *, int, unsigned int, unsigned int);
+ (bfd *, obj_attr_vendor_t, obj_attr_tag_t, unsigned int);
#define bfd_elf_add_proc_attr_int(BFD, TAG, VALUE) \
bfd_elf_add_obj_attr_int ((BFD), OBJ_ATTR_PROC, (TAG), (VALUE))
extern obj_attribute *bfd_elf_add_obj_attr_string
- (bfd *, int, unsigned int, const char *);
+ (bfd *, obj_attr_vendor_t, obj_attr_tag_t, const char *);
#define bfd_elf_add_proc_attr_string(BFD, TAG, VALUE) \
bfd_elf_add_obj_attr_string ((BFD), OBJ_ATTR_PROC, (TAG), (VALUE))
extern obj_attribute *bfd_elf_add_obj_attr_int_string
- (bfd *, int, unsigned int, unsigned int, const char *);
+ (bfd *, obj_attr_vendor_t, obj_attr_tag_t, unsigned int, const char *);
#define bfd_elf_add_proc_attr_int_string(BFD, TAG, INTVAL, STRVAL) \
bfd_elf_add_obj_attr_int_string ((BFD), OBJ_ATTR_PROC, (TAG), \
(INTVAL), (STRVAL))
-extern bool _bfd_elf_write_section_build_attributes
+extern bool _bfd_elf_write_section_object_attributes
(bfd *, struct bfd_link_info *) ATTRIBUTE_HIDDEN;
extern char *_bfd_elf_attr_strdup
(bfd *, const char *) ATTRIBUTE_HIDDEN;
extern void _bfd_elf_copy_obj_attributes
(bfd *, bfd *) ATTRIBUTE_HIDDEN;
extern int bfd_elf_obj_attrs_arg_type
- (bfd *, int, unsigned int);
+ (bfd *, obj_attr_vendor_t, obj_attr_tag_t);
extern void _bfd_elf_parse_attributes
(bfd *, Elf_Internal_Shdr *) ATTRIBUTE_HIDDEN;
extern bool _bfd_elf_merge_object_attributes
string or both. */
static int
-elf32_arc_obj_attrs_arg_type (int tag)
+elf32_arc_obj_attrs_arg_type (obj_attr_tag_t tag)
{
if (tag == Tag_ARC_CPU_name
|| tag == Tag_ARC_ISA_config
string or both. */
static int
-elf32_arm_obj_attrs_arg_type (int tag)
+elf32_arm_obj_attrs_arg_type (obj_attr_tag_t tag)
{
if (tag == Tag_compatibility)
return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL;
string or both. */
static int
-elf32_csky_obj_attrs_arg_type (int tag)
+elf32_csky_obj_attrs_arg_type (obj_attr_tag_t tag)
{
switch (tag)
{
string or both. */
static int
-elf32_msp430_obj_attrs_arg_type (int tag)
+elf32_msp430_obj_attrs_arg_type (obj_attr_tag_t tag)
{
if (tag == Tag_compatibility)
return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL;
}
static int
-elf32_tic6x_obj_attrs_arg_type (int tag)
+elf32_tic6x_obj_attrs_arg_type (obj_attr_tag_t tag)
{
if (tag == Tag_ABI_compatibility)
return ATTR_TYPE_FLAG_INT_VAL | ATTR_TYPE_FLAG_STR_VAL;
string or both. */
static int
-riscv_elf_obj_attrs_arg_type (int tag)
+riscv_elf_obj_attrs_arg_type (obj_attr_tag_t tag)
{
return (tag & 1) != 0 ? ATTR_TYPE_FLAG_STR_VAL : ATTR_TYPE_FLAG_INT_VAL;
}
#define skip_whitespace(str) do { if (is_whitespace (*(str))) ++(str); } while (0)
static inline int
-skip_past_char (char ** str, char c)
+skip_past_char (char **str, char c)
{
if (**str == c)
{
/* A list of attributes that have been explicitly set by the assembly code.
VENDOR is the vendor id, BASE is the tag shifted right by the number
of bits in MASK, and bit N of MASK is set if tag BASE+N has been set. */
-struct recorded_attribute_info {
+typedef struct recorded_attribute_info {
struct recorded_attribute_info *next;
- int vendor;
+ obj_attr_vendor_t vendor;
unsigned int base;
unsigned long mask;
-};
-static struct recorded_attribute_info *recorded_attributes;
+} recorded_attribute_info_t;
+static recorded_attribute_info_t *recorded_attributes;
+
+static void
+oav1_attr_info_free (recorded_attribute_info_t *node)
+{
+ while (node != NULL)
+ {
+ recorded_attribute_info_t *next = node->next;
+ free (node);
+ node = next;
+ }
+}
+
+static void
+oav1_attr_info_init (void)
+{
+ /* Note: this "constructor" was added for symmetry with oav1_attr_info_exit.
+ recorded_attributes is a static variable which is automatically initialized
+ to NULL. There is no need to initialize it another time except for a
+ cosmetic reason and to possibly help fuzzing. */
+ recorded_attributes = NULL;
+}
+
+static void
+oav1_attr_info_exit (void)
+{
+ oav1_attr_info_free (recorded_attributes);
+}
/* Record that we have seen an explicit specification of attribute TAG
for vendor VENDOR. */
static void
-record_attribute (int vendor, unsigned int tag)
+oav1_attr_record_seen (obj_attr_vendor_t vendor, obj_attr_tag_t tag)
{
unsigned int base;
unsigned long mask;
- struct recorded_attribute_info *rai;
+ recorded_attribute_info_t *rai;
base = tag / (8 * sizeof (rai->mask));
mask = 1UL << (tag % (8 * sizeof (rai->mask)));
return;
}
- rai = XNEW (struct recorded_attribute_info);
+ rai = XNEW (recorded_attribute_info_t);
rai->next = recorded_attributes;
rai->vendor = vendor;
rai->base = base;
for vendor VENDOR. */
bool
-obj_elf_seen_attribute (int vendor, unsigned int tag)
+oav1_attr_seen (obj_attr_vendor_t vendor, obj_attr_tag_t tag)
{
unsigned int base;
unsigned long mask;
- struct recorded_attribute_info *rai;
+ recorded_attribute_info_t *rai;
base = tag / (8 * sizeof (rai->mask));
mask = 1UL << (tag % (8 * sizeof (rai->mask)));
/* Parse an attribute directive for VENDOR.
Returns the attribute number read, or zero on error. */
-int
-obj_elf_vendor_attribute (int vendor)
+obj_attr_tag_t
+obj_attr_v1_process_attribute (obj_attr_vendor_t vendor)
{
expressionS exp;
int type;
s = demand_copy_C_string (&len);
}
- record_attribute (vendor, tag);
+ oav1_attr_record_seen (vendor, tag);
bool ok = false;
switch (type & 3)
{
static void
obj_elf_gnu_attribute (int ignored ATTRIBUTE_UNUSED)
{
- obj_elf_vendor_attribute (OBJ_ATTR_GNU);
+ obj_attr_v1_process_attribute (OBJ_ATTR_GNU);
}
void
previous_subsection = 0;
comment_section = NULL;
memset (&groups, 0, sizeof (groups));
+
+ oav1_attr_info_init ();
}
void
section_stack = top->next;
free (top);
}
- while (recorded_attributes)
- {
- struct recorded_attribute_info *rai = recorded_attributes;
- recorded_attributes = rai->next;
- free (rai);
- }
if (groups.indexes)
{
htab_delete (groups.indexes);
free (groups.head);
}
+ oav1_attr_info_exit ();
}
#ifdef USE_EMULATIONS
extern void obj_elf_vtable_entry (int);
extern struct fix * obj_elf_get_vtable_inherit (void);
extern struct fix * obj_elf_get_vtable_entry (void);
-extern bool obj_elf_seen_attribute
- (int, unsigned int);
-extern int obj_elf_vendor_attribute (int);
+
+/* Object attributes v1. */
+extern bool oav1_attr_seen (obj_attr_vendor_t, obj_attr_tag_t);
+extern obj_attr_tag_t obj_attr_v1_process_attribute (obj_attr_vendor_t);
/* BFD wants to write the udata field, which is a no-no for the
predefined section symbols in bfd/section.c. They are read-only. */
static void
arc_attribute (int ignored ATTRIBUTE_UNUSED)
{
- int tag = obj_elf_vendor_attribute (OBJ_ATTR_PROC);
+ obj_attr_tag_t tag = obj_attr_v1_process_attribute (OBJ_ATTR_PROC);
if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
attributes_set_explicitly[tag] = true;
/* Set an attribute if it has not already been set by the user. */
static void
-arc_set_attribute_int (int tag, int value)
+arc_set_attribute_int (obj_attr_tag_t tag, int value)
{
if (tag < 1
|| tag >= NUM_KNOWN_OBJ_ATTRIBUTES
}
static void
-arc_set_attribute_string (int tag, const char *value)
+arc_set_attribute_string (obj_attr_tag_t tag, const char *value)
{
if (tag < 1
|| tag >= NUM_KNOWN_OBJ_ATTRIBUTES
static void
s_arm_eabi_attribute (int ignored ATTRIBUTE_UNUSED)
{
- int tag = obj_elf_vendor_attribute (OBJ_ATTR_PROC);
+ obj_attr_tag_t tag = obj_attr_v1_process_attribute (OBJ_ATTR_PROC);
- if (tag >= 0 && tag < NUM_KNOWN_OBJ_ATTRIBUTES)
+ if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
attributes_set_explicitly[tag] = 1;
}
/* Set an attribute if it has not already been set by the user. */
static void
-aeabi_set_attribute_int (int tag, int value)
+aeabi_set_attribute_int (obj_attr_tag_t tag, int value)
{
if (tag < 1
|| tag >= NUM_KNOWN_OBJ_ATTRIBUTES
}
static void
-aeabi_set_attribute_string (int tag, const char *value)
+aeabi_set_attribute_string (obj_attr_tag_t tag, const char *value)
{
if (tag < 1
|| tag >= NUM_KNOWN_OBJ_ATTRIBUTES
static void
m68k_elf_gnu_attribute (int ignored ATTRIBUTE_UNUSED)
{
- int tag = obj_elf_vendor_attribute (OBJ_ATTR_GNU);
+ obj_attr_tag_t tag = obj_attr_v1_process_attribute (OBJ_ATTR_GNU);
/* Check validity of defined m68k tags. */
if (tag == Tag_GNU_M68K_ABI_FP)
file_mips_check_options ();
/* Set a floating-point ABI if the user did not. */
- if (obj_elf_seen_attribute (OBJ_ATTR_GNU, Tag_GNU_MIPS_ABI_FP))
+ if (obj_attr_v1_rai_seen (OBJ_ATTR_GNU, Tag_GNU_MIPS_ABI_FP))
{
/* Perform consistency checks on the floating-point ABI. */
fpabi = bfd_elf_get_obj_attr_int (stdoutput, OBJ_ATTR_GNU,
static void
ppc_elf_gnu_attribute (int ignored ATTRIBUTE_UNUSED)
{
- int tag = obj_elf_vendor_attribute (OBJ_ATTR_GNU);
+ obj_attr_tag_t tag = obj_attr_v1_process_attribute (OBJ_ATTR_GNU);
/* Check validity of defined powerpc tags. */
if (tag == Tag_GNU_Power_ABI_FP
static const struct
{
const char *name;
- const int tag;
+ const obj_attr_tag_t tag;
}
attribute_table[] =
{
static void
s_riscv_attribute (int ignored ATTRIBUTE_UNUSED)
{
- int tag = obj_elf_vendor_attribute (OBJ_ATTR_PROC);
+ obj_attr_tag_t tag = obj_attr_v1_process_attribute (OBJ_ATTR_PROC);
unsigned old_xlen;
obj_attribute *attr;
static void
s_tic6x_c6xabi_attribute (int ignored ATTRIBUTE_UNUSED)
{
- int tag = obj_elf_vendor_attribute (OBJ_ATTR_PROC);
+ obj_attr_tag_t tag = obj_attr_v1_process_attribute (OBJ_ATTR_PROC);
if (tag < NUM_KNOWN_OBJ_ATTRIBUTES)
tic6x_attributes_set_explicitly[tag] = true;
typedef struct
{
const char *name;
- int tag;
+ obj_attr_tag_t tag;
} tic6x_attribute_table;
static const tic6x_attribute_table tic6x_attributes[] =
/* Set an attribute if it has not already been set by the user. */
static void
-tic6x_set_attribute_int (int tag, int value)
+tic6x_set_attribute_int (obj_attr_tag_t tag, int value)
{
if (tag < 1
|| tag >= NUM_KNOWN_OBJ_ATTRIBUTES)