* coff-h8300.c: Include libiberty.h.

(h8300_reloc16_extra_cases): Check the hash table creator before
	referencing h8300 specific fields.  Stash the hash table pointer
	in a local var.  Comment typo fixes.
	(h8300_bfd_link_add_symbols): Likewise.
This commit is contained in:
Alan Modra 2002-12-19 01:58:53 +00:00
parent 062b7c0c14
commit 0171ee92b2
2 changed files with 62 additions and 34 deletions

View file

@ -1,5 +1,11 @@
2002-12-19 Alan Modra <amodra@bigpond.net.au> 2002-12-19 Alan Modra <amodra@bigpond.net.au>
* coff-h8300.c: Include libiberty.h.
(h8300_reloc16_extra_cases): Check the hash table creator before
referencing h8300 specific fields. Stash the hash table pointer
in a local var. Comment typo fixes.
(h8300_bfd_link_add_symbols): Likewise.
* bfd/reloc.c (struct reloc_howto_struct): Revise src_mask and * bfd/reloc.c (struct reloc_howto_struct): Revise src_mask and
dst_mask comments. dst_mask comments.
* bfd-in2.h: Regenerate. * bfd-in2.h: Regenerate.

View file

@ -28,6 +28,7 @@
#include "coff/h8300.h" #include "coff/h8300.h"
#include "coff/internal.h" #include "coff/internal.h"
#include "libcoff.h" #include "libcoff.h"
#include "libiberty.h"
#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (1) #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (1)
@ -1091,7 +1092,25 @@ h8300_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
const char *name; const char *name;
struct funcvec_hash_table *ftab; struct funcvec_hash_table *ftab;
struct funcvec_hash_entry *h; struct funcvec_hash_entry *h;
asection *vectors_sec = h8300_coff_hash_table (link_info)->vectors_sec; struct h8300_coff_link_hash_table *htab;
asection *vectors_sec;
if (link_info->hash->creator != abfd->xvec)
{
(*_bfd_error_handler)
(_("cannot handle R_MEM_INDIRECT reloc when using %s output"),
link_info->hash->creator->name);
/* What else can we do? This function doesn't allow return
of an error, and we don't want to call abort as that
indicates an internal error. */
#ifndef EXIT_FAILURE
#define EXIT_FAILURE 1
#endif
xexit (EXIT_FAILURE);
}
htab = h8300_coff_hash_table (link_info);
vectors_sec = htab->vectors_sec;
/* First see if this is a reloc against the absolute symbol /* First see if this is a reloc against the absolute symbol
or against a symbol with a nonnegative value <= 0xff. */ or against a symbol with a nonnegative value <= 0xff. */
@ -1140,12 +1159,12 @@ h8300_reloc16_extra_cases (abfd, link_info, link_order, reloc, data, src_ptr,
name = new_name; name = new_name;
} }
ftab = h8300_coff_hash_table (link_info)->funcvec_hash_table; ftab = htab->funcvec_hash_table;
h = funcvec_hash_lookup (ftab, name, FALSE, FALSE); h = funcvec_hash_lookup (ftab, name, FALSE, FALSE);
/* This shouldn't ever happen. If it does that means we've got /* This shouldn't ever happen. If it does that means we've got
data corruption of some kind. Aborting seems like a reasonable data corruption of some kind. Aborting seems like a reasonable
think to do here. */ thing to do here. */
if (h == NULL || vectors_sec == NULL) if (h == NULL || vectors_sec == NULL)
abort (); abort ();
@ -1214,24 +1233,30 @@ h8300_bfd_link_add_symbols (abfd, info)
asection *sec; asection *sec;
struct funcvec_hash_table *funcvec_hash_table; struct funcvec_hash_table *funcvec_hash_table;
bfd_size_type amt; bfd_size_type amt;
struct h8300_coff_link_hash_table *htab;
/* Add the symbols using the generic code. */
_bfd_generic_link_add_symbols (abfd, info);
if (info->hash->creator != abfd->xvec)
return TRUE;
htab = h8300_coff_hash_table (info);
/* If we haven't created a vectors section, do so now. */ /* If we haven't created a vectors section, do so now. */
if (!h8300_coff_hash_table (info)->vectors_sec) if (!htab->vectors_sec)
{ {
flagword flags; flagword flags;
/* Make sure the appropriate flags are set, including SEC_IN_MEMORY. */ /* Make sure the appropriate flags are set, including SEC_IN_MEMORY. */
flags = (SEC_ALLOC | SEC_LOAD flags = (SEC_ALLOC | SEC_LOAD
| SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_READONLY); | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_READONLY);
h8300_coff_hash_table (info)->vectors_sec = bfd_make_section (abfd, htab->vectors_sec = bfd_make_section (abfd, ".vectors");
".vectors");
/* If the section wasn't created, or we couldn't set the flags, /* If the section wasn't created, or we couldn't set the flags,
quit quickly now, rather than dieing a painful death later. */ quit quickly now, rather than dying a painful death later. */
if (! h8300_coff_hash_table (info)->vectors_sec if (!htab->vectors_sec
|| ! bfd_set_section_flags (abfd, || !bfd_set_section_flags (abfd, htab->vectors_sec, flags))
h8300_coff_hash_table(info)->vectors_sec,
flags))
return FALSE; return FALSE;
/* Also create the vector hash table. */ /* Also create the vector hash table. */
@ -1250,14 +1275,11 @@ h8300_bfd_link_add_symbols (abfd, info)
} }
/* Store away a pointer to the funcvec hash table. */ /* Store away a pointer to the funcvec hash table. */
h8300_coff_hash_table (info)->funcvec_hash_table = funcvec_hash_table; htab->funcvec_hash_table = funcvec_hash_table;
} }
/* Load up the function vector hash table. */ /* Load up the function vector hash table. */
funcvec_hash_table = h8300_coff_hash_table (info)->funcvec_hash_table; funcvec_hash_table = htab->funcvec_hash_table;
/* Add the symbols using the generic code. */
_bfd_generic_link_add_symbols (abfd, info);
/* Now scan the relocs for all the sections in this bfd; create /* Now scan the relocs for all the sections in this bfd; create
additional space in the .vectors section as needed. */ additional space in the .vectors section as needed. */
@ -1322,7 +1344,7 @@ h8300_bfd_link_add_symbols (abfd, info)
} }
/* Look this symbol up in the function vector hash table. */ /* Look this symbol up in the function vector hash table. */
ftab = h8300_coff_hash_table (info)->funcvec_hash_table; ftab = htab->funcvec_hash_table;
h = funcvec_hash_lookup (ftab, name, FALSE, FALSE); h = funcvec_hash_lookup (ftab, name, FALSE, FALSE);
/* If this symbol isn't already in the hash table, add /* If this symbol isn't already in the hash table, add
@ -1339,10 +1361,10 @@ h8300_bfd_link_add_symbols (abfd, info)
/* Bump the size of the vectors section. Each vector /* Bump the size of the vectors section. Each vector
takes 2 bytes on the h8300 and 4 bytes on the h8300h. */ takes 2 bytes on the h8300 and 4 bytes on the h8300h. */
if (bfd_get_mach (abfd) == bfd_mach_h8300) if (bfd_get_mach (abfd) == bfd_mach_h8300)
h8300_coff_hash_table (info)->vectors_sec->_raw_size += 2; htab->vectors_sec->_raw_size += 2;
else if (bfd_get_mach (abfd) == bfd_mach_h8300h else if (bfd_get_mach (abfd) == bfd_mach_h8300h
|| bfd_get_mach (abfd) == bfd_mach_h8300s) || bfd_get_mach (abfd) == bfd_mach_h8300s)
h8300_coff_hash_table (info)->vectors_sec->_raw_size += 4; htab->vectors_sec->_raw_size += 4;
} }
} }
} }
@ -1353,7 +1375,7 @@ h8300_bfd_link_add_symbols (abfd, info)
/* Now actually allocate some space for the function vector. It's /* Now actually allocate some space for the function vector. It's
wasteful to do this more than once, but this is easier. */ wasteful to do this more than once, but this is easier. */
sec = h8300_coff_hash_table (info)->vectors_sec; sec = htab->vectors_sec;
if (sec->_raw_size != 0) if (sec->_raw_size != 0)
{ {
/* Free the old contents. */ /* Free the old contents. */