Similar to commit
c799eddb3512, but for mips-ecoff. mips-ecoff is
marked obsolete, but we still allow reading of these object files in
a number of mips targets.
* coff-mips.c (struct mips_hi, mips_refhi_list): Delete.
(mips_refhi_reloc, mips_reflo_reloc): Access mips_refhi_list
in ecoff_data.
* ecoff.c (_bfd_ecoff_close_and_cleanup): New function.
* libecoff.h (struct mips_hi): Moved from coff-mips.c.
(struct ecoff_tdata): Add mips_refhi_list.
(_bfd_ecoff_close_and_cleanup): Declare.
reloc. This extension permits gcc to output the HI and LO relocs
itself. */
-struct mips_hi
-{
- struct mips_hi *next;
- bfd_byte *addr;
- bfd_vma addend;
-};
-
-/* FIXME: This should not be a static variable. */
-
-static struct mips_hi *mips_refhi_list;
-
static bfd_reloc_status_type
-mips_refhi_reloc (bfd *abfd ATTRIBUTE_UNUSED,
+mips_refhi_reloc (bfd *abfd,
arelent *reloc_entry,
asymbol *symbol,
void * data,
return bfd_reloc_outofrange;
n->addr = (bfd_byte *) data + reloc_entry->address;
n->addend = relocation;
- n->next = mips_refhi_list;
- mips_refhi_list = n;
+ n->next = ecoff_data (abfd)->mips_refhi_list;
+ ecoff_data (abfd)->mips_refhi_list = n;
if (output_bfd != (bfd *) NULL)
reloc_entry->address += input_section->output_offset;
bfd *output_bfd,
char **error_message)
{
- if (mips_refhi_list != NULL)
+ if (ecoff_data (abfd)->mips_refhi_list != NULL)
{
struct mips_hi *l;
- l = mips_refhi_list;
+ l = ecoff_data (abfd)->mips_refhi_list;
while (l != NULL)
{
unsigned long insn;
l = next;
}
- mips_refhi_list = NULL;
+ ecoff_data (abfd)->mips_refhi_list = NULL;
}
/* Now do the REFLO reloc in the usual way. */
return (void *) ecoff;
}
+bool
+_bfd_ecoff_close_and_cleanup (bfd *abfd)
+{
+ struct ecoff_tdata *tdata = ecoff_data (abfd);
+
+ if (tdata != NULL && bfd_get_format (abfd) == bfd_object)
+ while (tdata->mips_refhi_list != NULL)
+ {
+ struct mips_hi *ref = tdata->mips_refhi_list;
+ tdata->mips_refhi_list = ref->next;
+ free (ref);
+ }
+ return _bfd_generic_close_and_cleanup (abfd);
+}
+
/* Initialize a new section. */
bool
members of the embedded bfd_coff_backend_data struct. */
#define ECOFF_NO_LONG_SECTION_NAMES (false), _bfd_ecoff_no_long_sections
+struct mips_hi
+{
+ struct mips_hi *next;
+ bfd_byte *addr;
+ bfd_vma addend;
+};
+
/* This is the target specific information kept for ECOFF files. */
#define ecoff_data(abfd) ((abfd)->tdata.ecoff_obj_data)
ecoff_compute_section_file_positions is called. */
bool rdata_in_text;
+ /* Used by coff-mips.c to track REFHI relocs for pairing with REFLO. */
+ struct mips_hi *mips_refhi_list;
} ecoff_data_type;
/* Each canonical asymbol really looks like this. */
extern bool _bfd_ecoff_write_object_contents (bfd *);
-#define _bfd_ecoff_close_and_cleanup _bfd_generic_close_and_cleanup
+extern bool _bfd_ecoff_close_and_cleanup (bfd *);
#define _bfd_ecoff_bfd_free_cached_info _bfd_generic_bfd_free_cached_info
extern bool _bfd_ecoff_new_section_hook
(bfd *, asection *);