* elf-bfd.h: Remove PARAMS macro. Replace PTR with void *.

(NAME): Use ## rather than CONCAT4 macro.
	* elfcode.h: Remove one remaining PARAMS macro.
	* elf-eh-frame.c: Convert to C90, remove unneeded casts and prototypes.
	* elf-strtab.c: Likewise.
	* elf-hppa.h: Likewise.
	* elf32-hppa.h: Likewise.
	* elf32-hppa.c: Likewise.
	(elf32_hppa_add_symbol_hook): Delete.
	(elf_backend_add_symbol_hook): Don't define.
	* libhppa.h: Convert to C90.  Replace INLINE with inline.
This commit is contained in:
Alan Modra 2003-08-07 07:25:34 +00:00
parent 29ceeffbde
commit c39a58e6ff
9 changed files with 641 additions and 1016 deletions

View File

@ -1,3 +1,17 @@
2003-08-07 Alan Modra <amodra@bigpond.net.au>
* elf-bfd.h: Remove PARAMS macro. Replace PTR with void *.
(NAME): Use ## rather than CONCAT4 macro.
* elfcode.h: Remove one remaining PARAMS macro.
* elf-eh-frame.c: Convert to C90, remove unneeded casts and prototypes.
* elf-strtab.c: Likewise.
* elf-hppa.h: Likewise.
* elf32-hppa.h: Likewise.
* elf32-hppa.c: Likewise.
(elf32_hppa_add_symbol_hook): Delete.
(elf_backend_add_symbol_hook): Don't define.
* libhppa.h: Convert to C90. Replace INLINE with inline.
2003-08-06 Alan Modra <amodra@bigpond.net.au> 2003-08-06 Alan Modra <amodra@bigpond.net.au>
* elf64-ppc.c (ppc_stub_name): Tweak names for better readability. * elf64-ppc.c (ppc_stub_name): Tweak names for better readability.

File diff suppressed because it is too large Load Diff

View File

@ -26,61 +26,44 @@
#define EH_FRAME_HDR_SIZE 8 #define EH_FRAME_HDR_SIZE 8
static bfd_vma read_unsigned_leb128
PARAMS ((bfd *, char *, unsigned int *));
static bfd_signed_vma read_signed_leb128
PARAMS ((bfd *, char *, unsigned int *));
static int get_DW_EH_PE_width
PARAMS ((int, int));
static bfd_vma read_value
PARAMS ((bfd *, bfd_byte *, int, int));
static void write_value
PARAMS ((bfd *, bfd_byte *, bfd_vma, int));
static int cie_compare
PARAMS ((struct cie *, struct cie *));
static int vma_compare
PARAMS ((const PTR, const PTR));
/* Helper function for reading uleb128 encoded data. */ /* Helper function for reading uleb128 encoded data. */
static bfd_vma static bfd_vma
read_unsigned_leb128 (abfd, buf, bytes_read_ptr) read_unsigned_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
bfd *abfd ATTRIBUTE_UNUSED; char *buf,
char *buf; unsigned int *bytes_read_ptr)
unsigned int *bytes_read_ptr;
{ {
bfd_vma result; bfd_vma result;
unsigned int num_read; unsigned int num_read;
int shift; int shift;
unsigned char byte; unsigned char byte;
result = 0; result = 0;
shift = 0; shift = 0;
num_read = 0; num_read = 0;
do do
{ {
byte = bfd_get_8 (abfd, (bfd_byte *) buf); byte = bfd_get_8 (abfd, (bfd_byte *) buf);
buf ++; buf++;
num_read ++; num_read++;
result |= (((bfd_vma) byte & 0x7f) << shift); result |= (((bfd_vma) byte & 0x7f) << shift);
shift += 7; shift += 7;
} }
while (byte & 0x80); while (byte & 0x80);
* bytes_read_ptr = num_read; *bytes_read_ptr = num_read;
return result; return result;
} }
/* Helper function for reading sleb128 encoded data. */ /* Helper function for reading sleb128 encoded data. */
static bfd_signed_vma static bfd_signed_vma
read_signed_leb128 (abfd, buf, bytes_read_ptr) read_signed_leb128 (bfd *abfd ATTRIBUTE_UNUSED,
bfd *abfd ATTRIBUTE_UNUSED; char *buf,
char *buf; unsigned int * bytes_read_ptr)
unsigned int * bytes_read_ptr;
{ {
bfd_vma result; bfd_vma result;
int shift; int shift;
int num_read; int num_read;
unsigned char byte; unsigned char byte;
result = 0; result = 0;
@ -97,7 +80,7 @@ read_signed_leb128 (abfd, buf, bytes_read_ptr)
while (byte & 0x80); while (byte & 0x80);
if (byte & 0x40) if (byte & 0x40)
result |= (((bfd_vma) -1) << (shift - 7)) << 7; result |= (((bfd_vma) -1) << (shift - 7)) << 7;
* bytes_read_ptr = num_read; *bytes_read_ptr = num_read;
return result; return result;
} }
@ -120,8 +103,7 @@ while (0)
/* Return 0 if either encoding is variable width, or not yet known to bfd. */ /* Return 0 if either encoding is variable width, or not yet known to bfd. */
static static
int get_DW_EH_PE_width (encoding, ptr_size) int get_DW_EH_PE_width (int encoding, int ptr_size)
int encoding, ptr_size;
{ {
/* DW_EH_PE_ values of 0x60 and 0x70 weren't defined at the time .eh_frame /* DW_EH_PE_ values of 0x60 and 0x70 weren't defined at the time .eh_frame
was added to bfd. */ was added to bfd. */
@ -146,11 +128,7 @@ int get_DW_EH_PE_width (encoding, ptr_size)
/* Read a width sized value from memory. */ /* Read a width sized value from memory. */
static bfd_vma static bfd_vma
read_value (abfd, buf, width, is_signed) read_value (bfd *abfd, bfd_byte *buf, int width, int is_signed)
bfd *abfd;
bfd_byte *buf;
int width;
int is_signed;
{ {
bfd_vma value; bfd_vma value;
@ -185,11 +163,7 @@ read_value (abfd, buf, width, is_signed)
/* Store a width sized value to memory. */ /* Store a width sized value to memory. */
static void static void
write_value (abfd, buf, value, width) write_value (bfd *abfd, bfd_byte *buf, bfd_vma value, int width)
bfd *abfd;
bfd_byte *buf;
bfd_vma value;
int width;
{ {
switch (width) switch (width)
{ {
@ -203,8 +177,7 @@ write_value (abfd, buf, value, width)
/* Return zero if C1 and C2 CIEs can be merged. */ /* Return zero if C1 and C2 CIEs can be merged. */
static static
int cie_compare (c1, c2) int cie_compare (struct cie *c1, struct cie *c2)
struct cie *c1, *c2;
{ {
if (c1->hdr.length == c2->hdr.length if (c1->hdr.length == c2->hdr.length
&& c1->version == c2->version && c1->version == c2->version
@ -218,8 +191,7 @@ int cie_compare (c1, c2)
&& c1->per_encoding == c2->per_encoding && c1->per_encoding == c2->per_encoding
&& c1->lsda_encoding == c2->lsda_encoding && c1->lsda_encoding == c2->lsda_encoding
&& c1->fde_encoding == c2->fde_encoding && c1->fde_encoding == c2->fde_encoding
&& (c1->initial_insn_length && c1->initial_insn_length == c2->initial_insn_length
== c2->initial_insn_length)
&& memcmp (c1->initial_instructions, && memcmp (c1->initial_instructions,
c2->initial_instructions, c2->initial_instructions,
c1->initial_insn_length) == 0) c1->initial_insn_length) == 0)
@ -234,13 +206,10 @@ int cie_compare (c1, c2)
deleted. */ deleted. */
bfd_boolean bfd_boolean
_bfd_elf_discard_section_eh_frame (abfd, info, sec, _bfd_elf_discard_section_eh_frame
reloc_symbol_deleted_p, cookie) (bfd *abfd, struct bfd_link_info *info, asection *sec,
bfd *abfd; bfd_boolean (*reloc_symbol_deleted_p) (bfd_vma, void *),
struct bfd_link_info *info; struct elf_reloc_cookie *cookie)
asection *sec;
bfd_boolean (*reloc_symbol_deleted_p) PARAMS ((bfd_vma, PTR));
struct elf_reloc_cookie *cookie;
{ {
bfd_byte *ehbuf = NULL, *buf; bfd_byte *ehbuf = NULL, *buf;
bfd_byte *last_cie, *last_fde; bfd_byte *last_cie, *last_fde;
@ -274,12 +243,11 @@ _bfd_elf_discard_section_eh_frame (abfd, info, sec,
/* Read the frame unwind information from abfd. */ /* Read the frame unwind information from abfd. */
ehbuf = (bfd_byte *) bfd_malloc (sec->_raw_size); ehbuf = bfd_malloc (sec->_raw_size);
if (ehbuf == NULL) if (ehbuf == NULL)
goto free_no_table; goto free_no_table;
if (! bfd_get_section_contents (abfd, sec, ehbuf, (bfd_vma) 0, if (! bfd_get_section_contents (abfd, sec, ehbuf, 0, sec->_raw_size))
sec->_raw_size))
goto free_no_table; goto free_no_table;
if (sec->_raw_size >= 4 if (sec->_raw_size >= 4
@ -693,9 +661,7 @@ free_no_table:
input sections. It finalizes the size of .eh_frame_hdr section. */ input sections. It finalizes the size of .eh_frame_hdr section. */
bfd_boolean bfd_boolean
_bfd_elf_discard_section_eh_frame_hdr (abfd, info) _bfd_elf_discard_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
bfd *abfd;
struct bfd_link_info *info;
{ {
struct elf_link_hash_table *htab; struct elf_link_hash_table *htab;
struct eh_frame_hdr_info *hdr_info; struct eh_frame_hdr_info *hdr_info;
@ -723,8 +689,7 @@ _bfd_elf_discard_section_eh_frame_hdr (abfd, info)
since dynamic symbol table has been sized. */ since dynamic symbol table has been sized. */
bfd_boolean bfd_boolean
_bfd_elf_maybe_strip_eh_frame_hdr (info) _bfd_elf_maybe_strip_eh_frame_hdr (struct bfd_link_info *info)
struct bfd_link_info *info;
{ {
asection *o; asection *o;
bfd *abfd; bfd *abfd;
@ -770,18 +735,16 @@ _bfd_elf_maybe_strip_eh_frame_hdr (info)
or to offset with dynamic relocation which is no longer needed. */ or to offset with dynamic relocation which is no longer needed. */
bfd_vma bfd_vma
_bfd_elf_eh_frame_section_offset (output_bfd, sec, offset) _bfd_elf_eh_frame_section_offset (bfd *output_bfd ATTRIBUTE_UNUSED,
bfd *output_bfd ATTRIBUTE_UNUSED; asection *sec,
asection *sec; bfd_vma offset)
bfd_vma offset;
{ {
struct eh_frame_sec_info *sec_info; struct eh_frame_sec_info *sec_info;
unsigned int lo, hi, mid; unsigned int lo, hi, mid;
if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME) if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
return offset; return offset;
sec_info = (struct eh_frame_sec_info *) sec_info = elf_section_data (sec)->sec_info;
elf_section_data (sec)->sec_info;
if (offset >= sec->_raw_size) if (offset >= sec->_raw_size)
return offset - (sec->_cooked_size - sec->_raw_size); return offset - (sec->_cooked_size - sec->_raw_size);
@ -830,11 +793,10 @@ _bfd_elf_eh_frame_section_offset (output_bfd, sec, offset)
contents. */ contents. */
bfd_boolean bfd_boolean
_bfd_elf_write_section_eh_frame (abfd, info, sec, contents) _bfd_elf_write_section_eh_frame (bfd *abfd,
bfd *abfd; struct bfd_link_info *info,
struct bfd_link_info *info; asection *sec,
asection *sec; bfd_byte *contents)
bfd_byte *contents;
{ {
struct eh_frame_sec_info *sec_info; struct eh_frame_sec_info *sec_info;
struct elf_link_hash_table *htab; struct elf_link_hash_table *htab;
@ -849,12 +811,9 @@ _bfd_elf_write_section_eh_frame (abfd, info, sec, contents)
== ELFCLASS64) ? 8 : 4; == ELFCLASS64) ? 8 : 4;
if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME) if (sec->sec_info_type != ELF_INFO_TYPE_EH_FRAME)
return bfd_set_section_contents (abfd, sec->output_section, return bfd_set_section_contents (abfd, sec->output_section, contents,
contents, sec->output_offset, sec->_raw_size);
(file_ptr) sec->output_offset, sec_info = elf_section_data (sec)->sec_info;
sec->_raw_size);
sec_info = (struct eh_frame_sec_info *)
elf_section_data (sec)->sec_info;
htab = elf_hash_table (info); htab = elf_hash_table (info);
hdr_info = &htab->eh_info; hdr_info = &htab->eh_info;
if (hdr_info->table && hdr_info->array == NULL) if (hdr_info->table && hdr_info->array == NULL)
@ -1079,12 +1038,10 @@ _bfd_elf_write_section_eh_frame (abfd, info, sec, contents)
VMA of FDE initial location. */ VMA of FDE initial location. */
static int static int
vma_compare (a, b) vma_compare (const void *a, const void *b)
const PTR a;
const PTR b;
{ {
struct eh_frame_array_ent *p = (struct eh_frame_array_ent *) a; const struct eh_frame_array_ent *p = a;
struct eh_frame_array_ent *q = (struct eh_frame_array_ent *) b; const struct eh_frame_array_ent *q = b;
if (p->initial_loc > q->initial_loc) if (p->initial_loc > q->initial_loc)
return 1; return 1;
if (p->initial_loc < q->initial_loc) if (p->initial_loc < q->initial_loc)
@ -1115,9 +1072,7 @@ vma_compare (a, b)
sorted by increasing initial_loc). */ sorted by increasing initial_loc). */
bfd_boolean bfd_boolean
_bfd_elf_write_section_eh_frame_hdr (abfd, info) _bfd_elf_write_section_eh_frame_hdr (bfd *abfd, struct bfd_link_info *info)
bfd *abfd;
struct bfd_link_info *info;
{ {
struct elf_link_hash_table *htab; struct elf_link_hash_table *htab;
struct eh_frame_hdr_info *hdr_info; struct eh_frame_hdr_info *hdr_info;

View File

@ -44,62 +44,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#define elf_hppa_final_link elf32_hppa_final_link #define elf_hppa_final_link elf32_hppa_final_link
#endif #endif
static void elf_hppa_info_to_howto
PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
static void elf_hppa_info_to_howto_rel
PARAMS ((bfd *, arelent *, Elf_Internal_Rela *));
static reloc_howto_type * elf_hppa_reloc_type_lookup
PARAMS ((bfd *, bfd_reloc_code_real_type));
static bfd_boolean elf_hppa_is_local_label_name
PARAMS ((bfd *, const char *));
static bfd_boolean elf_hppa_fake_sections
PARAMS ((bfd *abfd, Elf_Internal_Shdr *, asection *));
static void elf_hppa_final_write_processing
PARAMS ((bfd *, bfd_boolean));
static int hppa_unwind_entry_compare
PARAMS ((const PTR, const PTR));
static bfd_boolean elf_hppa_sort_unwind
PARAMS ((bfd *));
#if ARCH_SIZE == 64 #if ARCH_SIZE == 64
static bfd_boolean elf_hppa_add_symbol_hook
PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
const char **, flagword *, asection **, bfd_vma *));
static bfd_boolean elf_hppa_unmark_useless_dynamic_symbols
PARAMS ((struct elf_link_hash_entry *, PTR));
static bfd_boolean elf_hppa_remark_useless_dynamic_symbols
PARAMS ((struct elf_link_hash_entry *, PTR));
static bfd_boolean elf_hppa_is_dynamic_loader_symbol
PARAMS ((const char *));
static void elf_hppa_record_segment_addrs
PARAMS ((bfd *, asection *, PTR));
static bfd_boolean elf_hppa_final_link
PARAMS ((bfd *, struct bfd_link_info *));
static bfd_boolean elf_hppa_relocate_section
PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
static bfd_reloc_status_type elf_hppa_final_link_relocate static bfd_reloc_status_type elf_hppa_final_link_relocate
PARAMS ((Elf_Internal_Rela *, bfd *, bfd *, asection *, (Elf_Internal_Rela *, bfd *, bfd *, asection *, bfd_byte *, bfd_vma,
bfd_byte *, bfd_vma, struct bfd_link_info *, struct bfd_link_info *, asection *, struct elf_link_hash_entry *,
asection *, struct elf_link_hash_entry *, struct elf64_hppa_dyn_hash_entry *);
struct elf64_hppa_dyn_hash_entry *));
static int elf_hppa_relocate_insn static int elf_hppa_relocate_insn
PARAMS ((int, int, unsigned int)); (int, int, unsigned int);
#endif #endif
/* ELF/PA relocation howto entries. */ /* ELF/PA relocation howto entries. */
@ -615,11 +567,10 @@ static reloc_howto_type elf_hppa_howto_table[ELF_HOWTO_TABLE_SIZE] =
format, and field selector. */ format, and field selector. */
elf_hppa_reloc_type elf_hppa_reloc_type
elf_hppa_reloc_final_type (abfd, base_type, format, field) elf_hppa_reloc_final_type (bfd *abfd,
bfd *abfd; elf_hppa_reloc_type base_type,
elf_hppa_reloc_type base_type; int format,
int format; unsigned int field)
unsigned int field;
{ {
elf_hppa_reloc_type final_type = base_type; elf_hppa_reloc_type final_type = base_type;
@ -884,26 +835,25 @@ elf_hppa_reloc_final_type (abfd, base_type, format, field)
relocation with modifications based on format and field. */ relocation with modifications based on format and field. */
elf_hppa_reloc_type ** elf_hppa_reloc_type **
_bfd_elf_hppa_gen_reloc_type (abfd, base_type, format, field, ignore, sym) _bfd_elf_hppa_gen_reloc_type (bfd *abfd,
bfd *abfd; elf_hppa_reloc_type base_type,
elf_hppa_reloc_type base_type; int format,
int format; unsigned int field,
unsigned int field; int ignore ATTRIBUTE_UNUSED,
int ignore ATTRIBUTE_UNUSED; asymbol *sym ATTRIBUTE_UNUSED)
asymbol *sym ATTRIBUTE_UNUSED;
{ {
elf_hppa_reloc_type *finaltype; elf_hppa_reloc_type *finaltype;
elf_hppa_reloc_type **final_types; elf_hppa_reloc_type **final_types;
bfd_size_type amt = sizeof (elf_hppa_reloc_type *) * 2; bfd_size_type amt = sizeof (elf_hppa_reloc_type *) * 2;
/* Allocate slots for the BFD relocation. */ /* Allocate slots for the BFD relocation. */
final_types = (elf_hppa_reloc_type **) bfd_alloc (abfd, amt); final_types = bfd_alloc (abfd, amt);
if (final_types == NULL) if (final_types == NULL)
return NULL; return NULL;
/* Allocate space for the relocation itself. */ /* Allocate space for the relocation itself. */
amt = sizeof (elf_hppa_reloc_type); amt = sizeof (elf_hppa_reloc_type);
finaltype = (elf_hppa_reloc_type *) bfd_alloc (abfd, amt); finaltype = bfd_alloc (abfd, amt);
if (finaltype == NULL) if (finaltype == NULL)
return NULL; return NULL;
@ -919,12 +869,11 @@ _bfd_elf_hppa_gen_reloc_type (abfd, base_type, format, field, ignore, sym)
/* Translate from an elf into field into a howto relocation pointer. */ /* Translate from an elf into field into a howto relocation pointer. */
static void static void
elf_hppa_info_to_howto (abfd, bfd_reloc, elf_reloc) elf_hppa_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
bfd *abfd ATTRIBUTE_UNUSED; arelent *bfd_reloc,
arelent *bfd_reloc; Elf_Internal_Rela *elf_reloc)
Elf_Internal_Rela *elf_reloc;
{ {
BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info) BFD_ASSERT (ELF_R_TYPE (elf_reloc->r_info)
< (unsigned int) R_PARISC_UNIMPLEMENTED); < (unsigned int) R_PARISC_UNIMPLEMENTED);
bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)]; bfd_reloc->howto = &elf_hppa_howto_table[ELF_R_TYPE (elf_reloc->r_info)];
} }
@ -932,10 +881,9 @@ elf_hppa_info_to_howto (abfd, bfd_reloc, elf_reloc)
/* Translate from an elf into field into a howto relocation pointer. */ /* Translate from an elf into field into a howto relocation pointer. */
static void static void
elf_hppa_info_to_howto_rel (abfd, bfd_reloc, elf_reloc) elf_hppa_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
bfd *abfd ATTRIBUTE_UNUSED; arelent *bfd_reloc,
arelent *bfd_reloc; Elf_Internal_Rela *elf_reloc)
Elf_Internal_Rela *elf_reloc;
{ {
BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info) BFD_ASSERT (ELF_R_TYPE(elf_reloc->r_info)
< (unsigned int) R_PARISC_UNIMPLEMENTED); < (unsigned int) R_PARISC_UNIMPLEMENTED);
@ -946,9 +894,8 @@ elf_hppa_info_to_howto_rel (abfd, bfd_reloc, elf_reloc)
relocation for an ARCH machine. */ relocation for an ARCH machine. */
static reloc_howto_type * static reloc_howto_type *
elf_hppa_reloc_type_lookup (abfd, code) elf_hppa_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
bfd *abfd ATTRIBUTE_UNUSED; bfd_reloc_code_real_type code)
bfd_reloc_code_real_type code;
{ {
if ((int) code < (int) R_PARISC_UNIMPLEMENTED) if ((int) code < (int) R_PARISC_UNIMPLEMENTED)
{ {
@ -961,9 +908,7 @@ elf_hppa_reloc_type_lookup (abfd, code)
/* Return TRUE if SYM represents a local label symbol. */ /* Return TRUE if SYM represents a local label symbol. */
static bfd_boolean static bfd_boolean
elf_hppa_is_local_label_name (abfd, name) elf_hppa_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
bfd *abfd ATTRIBUTE_UNUSED;
const char *name;
{ {
if (name[0] == 'L' && name[1] == '$') if (name[0] == 'L' && name[1] == '$')
return 1; return 1;
@ -974,12 +919,9 @@ elf_hppa_is_local_label_name (abfd, name)
section name, which is a hack, but ought to work. */ section name, which is a hack, but ought to work. */
static bfd_boolean static bfd_boolean
elf_hppa_fake_sections (abfd, hdr, sec) elf_hppa_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr, asection *sec)
bfd *abfd;
Elf_Internal_Shdr *hdr;
asection *sec;
{ {
register const char *name; const char *name;
name = bfd_get_section_name (abfd, sec); name = bfd_get_section_name (abfd, sec);
@ -1017,9 +959,8 @@ elf_hppa_fake_sections (abfd, hdr, sec)
} }
static void static void
elf_hppa_final_write_processing (abfd, linker) elf_hppa_final_write_processing (bfd *abfd,
bfd *abfd; bfd_boolean linker ATTRIBUTE_UNUSED)
bfd_boolean linker ATTRIBUTE_UNUSED;
{ {
int mach = bfd_get_mach (abfd); int mach = bfd_get_mach (abfd);
@ -1048,20 +989,18 @@ elf_hppa_final_write_processing (abfd, linker)
final link. */ final link. */
static int static int
hppa_unwind_entry_compare (a, b) hppa_unwind_entry_compare (const void *a, const void *b)
const PTR a;
const PTR b;
{ {
const bfd_byte *ap, *bp; const bfd_byte *ap, *bp;
unsigned long av, bv; unsigned long av, bv;
ap = (const bfd_byte *) a; ap = a;
av = (unsigned long) ap[0] << 24; av = (unsigned long) ap[0] << 24;
av |= (unsigned long) ap[1] << 16; av |= (unsigned long) ap[1] << 16;
av |= (unsigned long) ap[2] << 8; av |= (unsigned long) ap[2] << 8;
av |= (unsigned long) ap[3]; av |= (unsigned long) ap[3];
bp = (const bfd_byte *) b; bp = b;
bv = (unsigned long) bp[0] << 24; bv = (unsigned long) bp[0] << 24;
bv |= (unsigned long) bp[1] << 16; bv |= (unsigned long) bp[1] << 16;
bv |= (unsigned long) bp[2] << 8; bv |= (unsigned long) bp[2] << 8;
@ -1070,8 +1009,7 @@ hppa_unwind_entry_compare (a, b)
return av < bv ? -1 : av > bv ? 1 : 0; return av < bv ? -1 : av > bv ? 1 : 0;
} }
static bfd_boolean elf_hppa_sort_unwind (abfd) static bfd_boolean elf_hppa_sort_unwind (bfd *abfd)
bfd *abfd;
{ {
asection *s; asection *s;
@ -1108,14 +1046,13 @@ static bfd_boolean elf_hppa_sort_unwind (abfd)
indices, which we have to handle. */ indices, which we have to handle. */
static bfd_boolean static bfd_boolean
elf_hppa_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp) elf_hppa_add_symbol_hook (bfd *abfd,
bfd *abfd; struct bfd_link_info *info ATTRIBUTE_UNUSED,
struct bfd_link_info *info ATTRIBUTE_UNUSED; const Elf_Internal_Sym *sym,
const Elf_Internal_Sym *sym; const char **namep ATTRIBUTE_UNUSED,
const char **namep ATTRIBUTE_UNUSED; flagword *flagsp ATTRIBUTE_UNUSED,
flagword *flagsp ATTRIBUTE_UNUSED; asection **secp,
asection **secp; bfd_vma *valp)
bfd_vma *valp;
{ {
int index = sym->st_shndx; int index = sym->st_shndx;
@ -1138,11 +1075,10 @@ elf_hppa_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
} }
static bfd_boolean static bfd_boolean
elf_hppa_unmark_useless_dynamic_symbols (h, data) elf_hppa_unmark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
struct elf_link_hash_entry *h; void *data)
PTR data;
{ {
struct bfd_link_info *info = (struct bfd_link_info *)data; struct bfd_link_info *info = data;
if (h->root.type == bfd_link_hash_warning) if (h->root.type == bfd_link_hash_warning)
h = (struct elf_link_hash_entry *) h->root.u.i.link; h = (struct elf_link_hash_entry *) h->root.u.i.link;
@ -1174,11 +1110,10 @@ elf_hppa_unmark_useless_dynamic_symbols (h, data)
} }
static bfd_boolean static bfd_boolean
elf_hppa_remark_useless_dynamic_symbols (h, data) elf_hppa_remark_useless_dynamic_symbols (struct elf_link_hash_entry *h,
struct elf_link_hash_entry *h; void *data)
PTR data;
{ {
struct bfd_link_info *info = (struct bfd_link_info *)data; struct bfd_link_info *info = data;
if (h->root.type == bfd_link_hash_warning) if (h->root.type == bfd_link_hash_warning)
h = (struct elf_link_hash_entry *) h->root.u.i.link; h = (struct elf_link_hash_entry *) h->root.u.i.link;
@ -1211,8 +1146,7 @@ elf_hppa_remark_useless_dynamic_symbols (h, data)
} }
static bfd_boolean static bfd_boolean
elf_hppa_is_dynamic_loader_symbol (name) elf_hppa_is_dynamic_loader_symbol (const char *name)
const char * name;
{ {
return (! strcmp (name, "__CPU_REVISION") return (! strcmp (name, "__CPU_REVISION")
|| ! strcmp (name, "__CPU_KEYBITS_1") || ! strcmp (name, "__CPU_KEYBITS_1")
@ -1229,15 +1163,14 @@ elf_hppa_is_dynamic_loader_symbol (name)
/* Record the lowest address for the data and text segments. */ /* Record the lowest address for the data and text segments. */
static void static void
elf_hppa_record_segment_addrs (abfd, section, data) elf_hppa_record_segment_addrs (bfd *abfd ATTRIBUTE_UNUSED,
bfd *abfd ATTRIBUTE_UNUSED; asection *section,
asection *section; void *data)
PTR data;
{ {
struct elf64_hppa_link_hash_table *hppa_info; struct elf64_hppa_link_hash_table *hppa_info;
bfd_vma value; bfd_vma value;
hppa_info = (struct elf64_hppa_link_hash_table *)data; hppa_info = data;
value = section->vma - section->filepos; value = section->vma - section->filepos;
@ -1258,9 +1191,7 @@ elf_hppa_record_segment_addrs (abfd, section, data)
fall back to the generic ELF final link routine. */ fall back to the generic ELF final link routine. */
static bfd_boolean static bfd_boolean
elf_hppa_final_link (abfd, info) elf_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
bfd *abfd;
struct bfd_link_info *info;
{ {
bfd_boolean retval; bfd_boolean retval;
struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info); struct elf64_hppa_link_hash_table *hppa_info = elf64_hppa_hash_table (info);
@ -1360,16 +1291,14 @@ elf_hppa_final_link (abfd, info)
/* Relocate an HPPA ELF section. */ /* Relocate an HPPA ELF section. */
static bfd_boolean static bfd_boolean
elf_hppa_relocate_section (output_bfd, info, input_bfd, input_section, elf_hppa_relocate_section (bfd *output_bfd,
contents, relocs, local_syms, local_sections) struct bfd_link_info *info,
bfd *output_bfd; bfd *input_bfd,
struct bfd_link_info *info; asection *input_section,
bfd *input_bfd; bfd_byte *contents,
asection *input_section; Elf_Internal_Rela *relocs,
bfd_byte *contents; Elf_Internal_Sym *local_syms,
Elf_Internal_Rela *relocs; asection **local_sections)
Elf_Internal_Sym *local_syms;
asection **local_sections;
{ {
Elf_Internal_Shdr *symtab_hdr; Elf_Internal_Shdr *symtab_hdr;
Elf_Internal_Rela *rel; Elf_Internal_Rela *rel;
@ -1578,19 +1507,16 @@ elf_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
function. */ function. */
static bfd_reloc_status_type static bfd_reloc_status_type
elf_hppa_final_link_relocate (rel, input_bfd, output_bfd, elf_hppa_final_link_relocate (Elf_Internal_Rela *rel,
input_section, contents, value, bfd *input_bfd,
info, sym_sec, h, dyn_h) bfd *output_bfd,
Elf_Internal_Rela *rel; asection *input_section,
bfd *input_bfd; bfd_byte *contents,
bfd *output_bfd; bfd_vma value,
asection *input_section; struct bfd_link_info *info,
bfd_byte *contents; asection *sym_sec,
bfd_vma value; struct elf_link_hash_entry *h ATTRIBUTE_UNUSED,
struct bfd_link_info *info; struct elf64_hppa_dyn_hash_entry *dyn_h)
asection *sym_sec;
struct elf_link_hash_entry *h ATTRIBUTE_UNUSED;
struct elf64_hppa_dyn_hash_entry *dyn_h;
{ {
int insn; int insn;
bfd_vma offset = rel->r_offset; bfd_vma offset = rel->r_offset;
@ -2136,10 +2062,7 @@ elf_hppa_final_link_relocate (rel, input_bfd, output_bfd,
to insert the relocation into the given instruction. */ to insert the relocation into the given instruction. */
static int static int
elf_hppa_relocate_insn (insn, sym_value, r_type) elf_hppa_relocate_insn (int insn, int sym_value, unsigned int r_type)
int insn;
int sym_value;
unsigned int r_type;
{ {
switch (r_type) switch (r_type)
{ {

View File

@ -57,53 +57,46 @@ struct elf_strtab_hash
struct elf_strtab_hash_entry **array; struct elf_strtab_hash_entry **array;
}; };
static struct bfd_hash_entry *elf_strtab_hash_newfunc
PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
static int cmplengthentry PARAMS ((const PTR, const PTR));
static int last4_eq PARAMS ((const PTR, const PTR));
/* Routine to create an entry in a section merge hashtab. */ /* Routine to create an entry in a section merge hashtab. */
static struct bfd_hash_entry * static struct bfd_hash_entry *
elf_strtab_hash_newfunc (entry, table, string) elf_strtab_hash_newfunc (struct bfd_hash_entry *entry,
struct bfd_hash_entry *entry; struct bfd_hash_table *table,
struct bfd_hash_table *table; const char *string)
const char *string;
{ {
struct elf_strtab_hash_entry *ret = (struct elf_strtab_hash_entry *) entry;
/* Allocate the structure if it has not already been allocated by a /* Allocate the structure if it has not already been allocated by a
subclass. */ subclass. */
if (ret == (struct elf_strtab_hash_entry *) NULL) if (entry == NULL)
ret = ((struct elf_strtab_hash_entry *) entry = bfd_hash_allocate (table, sizeof (struct elf_strtab_hash_entry));
bfd_hash_allocate (table, sizeof (struct elf_strtab_hash_entry))); if (entry == NULL)
if (ret == (struct elf_strtab_hash_entry *) NULL)
return NULL; return NULL;
/* Call the allocation method of the superclass. */ /* Call the allocation method of the superclass. */
ret = ((struct elf_strtab_hash_entry *) entry = bfd_hash_newfunc (entry, table, string);
bfd_hash_newfunc ((struct bfd_hash_entry *) ret, table, string));
if (ret) if (entry)
{ {
/* Initialize the local fields. */ /* Initialize the local fields. */
struct elf_strtab_hash_entry *ret;
ret = (struct elf_strtab_hash_entry *) entry;
ret->u.index = -1; ret->u.index = -1;
ret->refcount = 0; ret->refcount = 0;
ret->len = 0; ret->len = 0;
} }
return (struct bfd_hash_entry *)ret; return entry;
} }
/* Create a new hash table. */ /* Create a new hash table. */
struct elf_strtab_hash * struct elf_strtab_hash *
_bfd_elf_strtab_init () _bfd_elf_strtab_init (void)
{ {
struct elf_strtab_hash *table; struct elf_strtab_hash *table;
bfd_size_type amt = sizeof (struct elf_strtab_hash); bfd_size_type amt = sizeof (struct elf_strtab_hash);
table = (struct elf_strtab_hash *) bfd_malloc (amt); table = bfd_malloc (amt);
if (table == NULL) if (table == NULL)
return NULL; return NULL;
@ -117,8 +110,7 @@ _bfd_elf_strtab_init ()
table->size = 1; table->size = 1;
table->alloced = 64; table->alloced = 64;
amt = sizeof (struct elf_strtab_hasn_entry *); amt = sizeof (struct elf_strtab_hasn_entry *);
table->array = (struct elf_strtab_hash_entry **) table->array = bfd_malloc (table->alloced * amt);
bfd_malloc (table->alloced * amt);
if (table->array == NULL) if (table->array == NULL)
{ {
free (table); free (table);
@ -133,8 +125,7 @@ _bfd_elf_strtab_init ()
/* Free a strtab. */ /* Free a strtab. */
void void
_bfd_elf_strtab_free (tab) _bfd_elf_strtab_free (struct elf_strtab_hash *tab)
struct elf_strtab_hash *tab;
{ {
bfd_hash_table_free (&tab->table); bfd_hash_table_free (&tab->table);
free (tab->array); free (tab->array);
@ -145,10 +136,9 @@ _bfd_elf_strtab_free (tab)
already present. */ already present. */
bfd_size_type bfd_size_type
_bfd_elf_strtab_add (tab, str, copy) _bfd_elf_strtab_add (struct elf_strtab_hash *tab,
struct elf_strtab_hash *tab; const char *str,
const char *str; bfd_boolean copy)
bfd_boolean copy;
{ {
register struct elf_strtab_hash_entry *entry; register struct elf_strtab_hash_entry *entry;
@ -172,8 +162,7 @@ _bfd_elf_strtab_add (tab, str, copy)
{ {
bfd_size_type amt = sizeof (struct elf_strtab_hash_entry *); bfd_size_type amt = sizeof (struct elf_strtab_hash_entry *);
tab->alloced *= 2; tab->alloced *= 2;
tab->array = (struct elf_strtab_hash_entry **) tab->array = bfd_realloc (tab->array, tab->alloced * amt);
bfd_realloc (tab->array, tab->alloced * amt);
if (tab->array == NULL) if (tab->array == NULL)
return (bfd_size_type) -1; return (bfd_size_type) -1;
} }
@ -185,9 +174,7 @@ _bfd_elf_strtab_add (tab, str, copy)
} }
void void
_bfd_elf_strtab_addref (tab, idx) _bfd_elf_strtab_addref (struct elf_strtab_hash *tab, bfd_size_type idx)
struct elf_strtab_hash *tab;
bfd_size_type idx;
{ {
if (idx == 0 || idx == (bfd_size_type) -1) if (idx == 0 || idx == (bfd_size_type) -1)
return; return;
@ -197,9 +184,7 @@ _bfd_elf_strtab_addref (tab, idx)
} }
void void
_bfd_elf_strtab_delref (tab, idx) _bfd_elf_strtab_delref (struct elf_strtab_hash *tab, bfd_size_type idx)
struct elf_strtab_hash *tab;
bfd_size_type idx;
{ {
if (idx == 0 || idx == (bfd_size_type) -1) if (idx == 0 || idx == (bfd_size_type) -1)
return; return;
@ -210,8 +195,7 @@ _bfd_elf_strtab_delref (tab, idx)
} }
void void
_bfd_elf_strtab_clear_all_refs (tab) _bfd_elf_strtab_clear_all_refs (struct elf_strtab_hash *tab)
struct elf_strtab_hash *tab;
{ {
bfd_size_type idx; bfd_size_type idx;
@ -220,16 +204,13 @@ _bfd_elf_strtab_clear_all_refs (tab)
} }
bfd_size_type bfd_size_type
_bfd_elf_strtab_size (tab) _bfd_elf_strtab_size (struct elf_strtab_hash *tab)
struct elf_strtab_hash *tab;
{ {
return tab->sec_size ? tab->sec_size : tab->size; return tab->sec_size ? tab->sec_size : tab->size;
} }
bfd_size_type bfd_size_type
_bfd_elf_strtab_offset (tab, idx) _bfd_elf_strtab_offset (struct elf_strtab_hash *tab, bfd_size_type idx)
struct elf_strtab_hash *tab;
bfd_size_type idx;
{ {
struct elf_strtab_hash_entry *entry; struct elf_strtab_hash_entry *entry;
@ -244,9 +225,7 @@ _bfd_elf_strtab_offset (tab, idx)
} }
bfd_boolean bfd_boolean
_bfd_elf_strtab_emit (abfd, tab) _bfd_elf_strtab_emit (register bfd *abfd, struct elf_strtab_hash *tab)
register bfd *abfd;
struct elf_strtab_hash *tab;
{ {
bfd_size_type off = 1, i; bfd_size_type off = 1, i;
@ -264,7 +243,7 @@ _bfd_elf_strtab_emit (abfd, tab)
if (len == 0) if (len == 0)
continue; continue;
if (bfd_bwrite ((PTR) str, (bfd_size_type) len, abfd) != len) if (bfd_bwrite (str, len, abfd) != len)
return FALSE; return FALSE;
off += len; off += len;
@ -277,12 +256,10 @@ _bfd_elf_strtab_emit (abfd, tab)
/* Compare two elf_strtab_hash_entry structures. This is called via qsort. */ /* Compare two elf_strtab_hash_entry structures. This is called via qsort. */
static int static int
cmplengthentry (a, b) cmplengthentry (const void *a, const void *b)
const PTR a;
const PTR b;
{ {
struct elf_strtab_hash_entry * A = *(struct elf_strtab_hash_entry **) a; struct elf_strtab_hash_entry *A = *(struct elf_strtab_hash_entry **) a;
struct elf_strtab_hash_entry * B = *(struct elf_strtab_hash_entry **) b; struct elf_strtab_hash_entry *B = *(struct elf_strtab_hash_entry **) b;
if (A->len < B->len) if (A->len < B->len)
return 1; return 1;
@ -293,12 +270,10 @@ cmplengthentry (a, b)
} }
static int static int
last4_eq (a, b) last4_eq (const void *a, const void *b)
const PTR a;
const PTR b;
{ {
struct elf_strtab_hash_entry * A = (struct elf_strtab_hash_entry *) a; const struct elf_strtab_hash_entry *A = a;
struct elf_strtab_hash_entry * B = (struct elf_strtab_hash_entry *) b; const struct elf_strtab_hash_entry *B = b;
if (memcmp (A->root.string + A->len - 5, B->root.string + B->len - 5, 4) if (memcmp (A->root.string + A->len - 5, B->root.string + B->len - 5, 4)
!= 0) != 0)
@ -318,8 +293,7 @@ last4_eq (a, b)
merging strings matching suffixes of longer strings if possible. */ merging strings matching suffixes of longer strings if possible. */
void void
_bfd_elf_strtab_finalize (tab) _bfd_elf_strtab_finalize (struct elf_strtab_hash *tab)
struct elf_strtab_hash *tab;
{ {
struct elf_strtab_hash_entry **array, **a, **end, *e; struct elf_strtab_hash_entry **array, **a, **end, *e;
htab_t last4tab = NULL; htab_t last4tab = NULL;
@ -335,7 +309,7 @@ _bfd_elf_strtab_finalize (tab)
/* Now sort the strings by length, longest first. */ /* Now sort the strings by length, longest first. */
array = NULL; array = NULL;
amt = tab->size * sizeof (struct elf_strtab_hash_entry *); amt = tab->size * sizeof (struct elf_strtab_hash_entry *);
array = (struct elf_strtab_hash_entry **) bfd_malloc (amt); array = bfd_malloc (amt);
if (array == NULL) if (array == NULL)
goto alloc_failure; goto alloc_failure;
@ -365,7 +339,7 @@ _bfd_elf_strtab_finalize (tab)
unsigned int c; unsigned int c;
unsigned int j; unsigned int j;
const unsigned char *s; const unsigned char *s;
PTR *p; void **p;
e = *a; e = *a;
if (e->len > 4) if (e->len > 4)
@ -385,13 +359,13 @@ _bfd_elf_strtab_finalize (tab)
{ {
struct elf_strtab_hash_entry *ent; struct elf_strtab_hash_entry *ent;
ent = (struct elf_strtab_hash_entry *) *p; ent = *p;
e->u.suffix = ent; e->u.suffix = ent;
e->len = 0; e->len = 0;
continue; continue;
} }
else else
*p = (PTR) e; *p = e;
} }
else else
{ {

View File

@ -223,8 +223,8 @@ struct elf32_hppa_link_hash_table {
bfd *stub_bfd; bfd *stub_bfd;
/* Linker call-backs. */ /* Linker call-backs. */
asection * (*add_stub_section) PARAMS ((const char *, asection *)); asection * (*add_stub_section) (const char *, asection *);
void (*layout_sections_again) PARAMS ((void)); void (*layout_sections_again) (void);
/* Array to keep track of which stub sections have been created, and /* Array to keep track of which stub sections have been created, and
information on stub grouping. */ information on stub grouping. */
@ -279,139 +279,14 @@ struct elf32_hppa_link_hash_table {
((struct elf32_hppa_stub_hash_entry *) \ ((struct elf32_hppa_stub_hash_entry *) \
bfd_hash_lookup ((table), (string), (create), (copy))) bfd_hash_lookup ((table), (string), (create), (copy)))
static struct bfd_hash_entry *stub_hash_newfunc
PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
static struct bfd_hash_entry *hppa_link_hash_newfunc
PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
static struct bfd_link_hash_table *elf32_hppa_link_hash_table_create
PARAMS ((bfd *));
static void elf32_hppa_link_hash_table_free
PARAMS ((struct bfd_link_hash_table *));
/* Stub handling functions. */
static char *hppa_stub_name
PARAMS ((const asection *, const asection *,
const struct elf32_hppa_link_hash_entry *,
const Elf_Internal_Rela *));
static struct elf32_hppa_stub_hash_entry *hppa_get_stub_entry
PARAMS ((const asection *, const asection *,
struct elf32_hppa_link_hash_entry *,
const Elf_Internal_Rela *,
struct elf32_hppa_link_hash_table *));
static struct elf32_hppa_stub_hash_entry *hppa_add_stub
PARAMS ((const char *, asection *, struct elf32_hppa_link_hash_table *));
static enum elf32_hppa_stub_type hppa_type_of_stub
PARAMS ((asection *, const Elf_Internal_Rela *,
struct elf32_hppa_link_hash_entry *, bfd_vma));
static bfd_boolean hppa_build_one_stub
PARAMS ((struct bfd_hash_entry *, PTR));
static bfd_boolean hppa_size_one_stub
PARAMS ((struct bfd_hash_entry *, PTR));
/* BFD and elf backend functions. */
static bfd_boolean elf32_hppa_object_p PARAMS ((bfd *));
static bfd_boolean elf32_hppa_add_symbol_hook
PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
const char **, flagword *, asection **, bfd_vma *));
static bfd_boolean elf32_hppa_create_dynamic_sections
PARAMS ((bfd *, struct bfd_link_info *));
static void elf32_hppa_copy_indirect_symbol
PARAMS ((struct elf_backend_data *, struct elf_link_hash_entry *,
struct elf_link_hash_entry *));
static bfd_boolean elf32_hppa_check_relocs
PARAMS ((bfd *, struct bfd_link_info *,
asection *, const Elf_Internal_Rela *));
static asection *elf32_hppa_gc_mark_hook
PARAMS ((asection *, struct bfd_link_info *, Elf_Internal_Rela *,
struct elf_link_hash_entry *, Elf_Internal_Sym *));
static bfd_boolean elf32_hppa_gc_sweep_hook
PARAMS ((bfd *, struct bfd_link_info *,
asection *, const Elf_Internal_Rela *));
static void elf32_hppa_hide_symbol
PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *, bfd_boolean));
static bfd_boolean elf32_hppa_adjust_dynamic_symbol
PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
static bfd_boolean mark_PIC_calls
PARAMS ((struct elf_link_hash_entry *, PTR));
static bfd_boolean allocate_plt_static
PARAMS ((struct elf_link_hash_entry *, PTR));
static bfd_boolean allocate_dynrelocs
PARAMS ((struct elf_link_hash_entry *, PTR));
static bfd_boolean readonly_dynrelocs
PARAMS ((struct elf_link_hash_entry *, PTR));
static bfd_boolean clobber_millicode_symbols
PARAMS ((struct elf_link_hash_entry *, struct bfd_link_info *));
static bfd_boolean elf32_hppa_size_dynamic_sections
PARAMS ((bfd *, struct bfd_link_info *));
static void group_sections
PARAMS ((struct elf32_hppa_link_hash_table *, bfd_size_type, bfd_boolean));
static int get_local_syms
PARAMS ((bfd *, bfd *, struct bfd_link_info *));
static bfd_boolean elf32_hppa_final_link
PARAMS ((bfd *, struct bfd_link_info *));
static void hppa_record_segment_addr
PARAMS ((bfd *, asection *, PTR));
static bfd_reloc_status_type final_link_relocate
PARAMS ((asection *, bfd_byte *, const Elf_Internal_Rela *,
bfd_vma, struct elf32_hppa_link_hash_table *, asection *,
struct elf32_hppa_link_hash_entry *));
static bfd_boolean elf32_hppa_relocate_section
PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *,
bfd_byte *, Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
static bfd_boolean elf32_hppa_finish_dynamic_symbol
PARAMS ((bfd *, struct bfd_link_info *,
struct elf_link_hash_entry *, Elf_Internal_Sym *));
static enum elf_reloc_type_class elf32_hppa_reloc_type_class
PARAMS ((const Elf_Internal_Rela *));
static bfd_boolean elf32_hppa_finish_dynamic_sections
PARAMS ((bfd *, struct bfd_link_info *));
static void elf32_hppa_post_process_headers
PARAMS ((bfd *, struct bfd_link_info *));
static int elf32_hppa_elf_get_symbol_type
PARAMS ((Elf_Internal_Sym *, int));
/* Assorted hash table functions. */ /* Assorted hash table functions. */
/* Initialize an entry in the stub hash table. */ /* Initialize an entry in the stub hash table. */
static struct bfd_hash_entry * static struct bfd_hash_entry *
stub_hash_newfunc (entry, table, string) stub_hash_newfunc (struct bfd_hash_entry *entry,
struct bfd_hash_entry *entry; struct bfd_hash_table *table,
struct bfd_hash_table *table; const char *string)
const char *string;
{ {
/* Allocate the structure if it has not already been allocated by a /* Allocate the structure if it has not already been allocated by a
subclass. */ subclass. */
@ -446,10 +321,9 @@ stub_hash_newfunc (entry, table, string)
/* Initialize an entry in the link hash table. */ /* Initialize an entry in the link hash table. */
static struct bfd_hash_entry * static struct bfd_hash_entry *
hppa_link_hash_newfunc (entry, table, string) hppa_link_hash_newfunc (struct bfd_hash_entry *entry,
struct bfd_hash_entry *entry; struct bfd_hash_table *table,
struct bfd_hash_table *table; const char *string)
const char *string;
{ {
/* Allocate the structure if it has not already been allocated by a /* Allocate the structure if it has not already been allocated by a
subclass. */ subclass. */
@ -483,13 +357,12 @@ hppa_link_hash_newfunc (entry, table, string)
using static variables). */ using static variables). */
static struct bfd_link_hash_table * static struct bfd_link_hash_table *
elf32_hppa_link_hash_table_create (abfd) elf32_hppa_link_hash_table_create (bfd *abfd)
bfd *abfd;
{ {
struct elf32_hppa_link_hash_table *ret; struct elf32_hppa_link_hash_table *ret;
bfd_size_type amt = sizeof (*ret); bfd_size_type amt = sizeof (*ret);
ret = (struct elf32_hppa_link_hash_table *) bfd_malloc (amt); ret = bfd_malloc (amt);
if (ret == NULL) if (ret == NULL)
return NULL; return NULL;
@ -528,8 +401,7 @@ elf32_hppa_link_hash_table_create (abfd)
/* Free the derived linker hash table. */ /* Free the derived linker hash table. */
static void static void
elf32_hppa_link_hash_table_free (hash) elf32_hppa_link_hash_table_free (struct bfd_link_hash_table *hash)
struct bfd_link_hash_table *hash;
{ {
struct elf32_hppa_link_hash_table *ret struct elf32_hppa_link_hash_table *ret
= (struct elf32_hppa_link_hash_table *) hash; = (struct elf32_hppa_link_hash_table *) hash;
@ -541,11 +413,10 @@ elf32_hppa_link_hash_table_free (hash)
/* Build a name for an entry in the stub hash table. */ /* Build a name for an entry in the stub hash table. */
static char * static char *
hppa_stub_name (input_section, sym_sec, hash, rel) hppa_stub_name (const asection *input_section,
const asection *input_section; const asection *sym_sec,
const asection *sym_sec; const struct elf32_hppa_link_hash_entry *hash,
const struct elf32_hppa_link_hash_entry *hash; const Elf_Internal_Rela *rel)
const Elf_Internal_Rela *rel;
{ {
char *stub_name; char *stub_name;
bfd_size_type len; bfd_size_type len;
@ -582,12 +453,11 @@ hppa_stub_name (input_section, sym_sec, hash, rel)
creating the stub name takes a bit of time. */ creating the stub name takes a bit of time. */
static struct elf32_hppa_stub_hash_entry * static struct elf32_hppa_stub_hash_entry *
hppa_get_stub_entry (input_section, sym_sec, hash, rel, htab) hppa_get_stub_entry (const asection *input_section,
const asection *input_section; const asection *sym_sec,
const asection *sym_sec; struct elf32_hppa_link_hash_entry *hash,
struct elf32_hppa_link_hash_entry *hash; const Elf_Internal_Rela *rel,
const Elf_Internal_Rela *rel; struct elf32_hppa_link_hash_table *htab)
struct elf32_hppa_link_hash_table *htab;
{ {
struct elf32_hppa_stub_hash_entry *stub_entry; struct elf32_hppa_stub_hash_entry *stub_entry;
const asection *id_sec; const asection *id_sec;
@ -628,10 +498,9 @@ hppa_get_stub_entry (input_section, sym_sec, hash, rel, htab)
stub entry are initialised. */ stub entry are initialised. */
static struct elf32_hppa_stub_hash_entry * static struct elf32_hppa_stub_hash_entry *
hppa_add_stub (stub_name, section, htab) hppa_add_stub (const char *stub_name,
const char *stub_name; asection *section,
asection *section; struct elf32_hppa_link_hash_table *htab)
struct elf32_hppa_link_hash_table *htab;
{ {
asection *link_sec; asection *link_sec;
asection *stub_sec; asection *stub_sec;
@ -684,11 +553,10 @@ hppa_add_stub (stub_name, section, htab)
/* Determine the type of stub needed, if any, for a call. */ /* Determine the type of stub needed, if any, for a call. */
static enum elf32_hppa_stub_type static enum elf32_hppa_stub_type
hppa_type_of_stub (input_sec, rel, hash, destination) hppa_type_of_stub (asection *input_sec,
asection *input_sec; const Elf_Internal_Rela *rel,
const Elf_Internal_Rela *rel; struct elf32_hppa_link_hash_entry *hash,
struct elf32_hppa_link_hash_entry *hash; bfd_vma destination)
bfd_vma destination;
{ {
bfd_vma location; bfd_vma location;
bfd_vma branch_offset; bfd_vma branch_offset;
@ -777,9 +645,7 @@ hppa_type_of_stub (input_sec, rel, hash, destination)
#endif #endif
static bfd_boolean static bfd_boolean
hppa_build_one_stub (gen_entry, in_arg) hppa_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
struct bfd_hash_entry *gen_entry;
PTR in_arg;
{ {
struct elf32_hppa_stub_hash_entry *stub_entry; struct elf32_hppa_stub_hash_entry *stub_entry;
struct bfd_link_info *info; struct bfd_link_info *info;
@ -795,7 +661,7 @@ hppa_build_one_stub (gen_entry, in_arg)
/* Massage our args to the form they really have. */ /* Massage our args to the form they really have. */
stub_entry = (struct elf32_hppa_stub_hash_entry *) gen_entry; stub_entry = (struct elf32_hppa_stub_hash_entry *) gen_entry;
info = (struct bfd_link_info *) in_arg; info = in_arg;
htab = hppa_link_hash_table (info); htab = hppa_link_hash_table (info);
stub_sec = stub_entry->stub_sec; stub_sec = stub_entry->stub_sec;
@ -817,11 +683,11 @@ hppa_build_one_stub (gen_entry, in_arg)
+ stub_entry->target_section->output_offset + stub_entry->target_section->output_offset
+ stub_entry->target_section->output_section->vma); + stub_entry->target_section->output_section->vma);
val = hppa_field_adjust (sym_value, (bfd_signed_vma) 0, e_lrsel); val = hppa_field_adjust (sym_value, 0, e_lrsel);
insn = hppa_rebuild_insn ((int) LDIL_R1, val, 21); insn = hppa_rebuild_insn ((int) LDIL_R1, val, 21);
bfd_put_32 (stub_bfd, insn, loc); bfd_put_32 (stub_bfd, insn, loc);
val = hppa_field_adjust (sym_value, (bfd_signed_vma) 0, e_rrsel) >> 2; val = hppa_field_adjust (sym_value, 0, e_rrsel) >> 2;
insn = hppa_rebuild_insn ((int) BE_SR4_R1, val, 17); insn = hppa_rebuild_insn ((int) BE_SR4_R1, val, 17);
bfd_put_32 (stub_bfd, insn, loc + 4); bfd_put_32 (stub_bfd, insn, loc + 4);
@ -867,7 +733,7 @@ hppa_build_one_stub (gen_entry, in_arg)
if (stub_entry->stub_type == hppa_stub_import_shared) if (stub_entry->stub_type == hppa_stub_import_shared)
insn = ADDIL_R19; insn = ADDIL_R19;
#endif #endif
val = hppa_field_adjust (sym_value, (bfd_signed_vma) 0, e_lrsel), val = hppa_field_adjust (sym_value, 0, e_lrsel),
insn = hppa_rebuild_insn ((int) insn, val, 21); insn = hppa_rebuild_insn ((int) insn, val, 21);
bfd_put_32 (stub_bfd, insn, loc); bfd_put_32 (stub_bfd, insn, loc);
@ -876,7 +742,7 @@ hppa_build_one_stub (gen_entry, in_arg)
lsel/rsel then with unfortunate sym_values we will round lsel/rsel then with unfortunate sym_values we will round
sym_value+4 up to the next 2k block leading to a mis-match sym_value+4 up to the next 2k block leading to a mis-match
between the lsel and rsel value. */ between the lsel and rsel value. */
val = hppa_field_adjust (sym_value, (bfd_signed_vma) 0, e_rrsel); val = hppa_field_adjust (sym_value, 0, e_rrsel);
insn = hppa_rebuild_insn ((int) LDW_R1_R21, val, 14); insn = hppa_rebuild_insn ((int) LDW_R1_R21, val, 14);
bfd_put_32 (stub_bfd, insn, loc + 4); bfd_put_32 (stub_bfd, insn, loc + 4);
@ -1018,9 +884,7 @@ hppa_build_one_stub (gen_entry, in_arg)
we know stub section sizes. */ we know stub section sizes. */
static bfd_boolean static bfd_boolean
hppa_size_one_stub (gen_entry, in_arg) hppa_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
struct bfd_hash_entry *gen_entry;
PTR in_arg;
{ {
struct elf32_hppa_stub_hash_entry *stub_entry; struct elf32_hppa_stub_hash_entry *stub_entry;
struct elf32_hppa_link_hash_table *htab; struct elf32_hppa_link_hash_table *htab;
@ -1028,7 +892,7 @@ hppa_size_one_stub (gen_entry, in_arg)
/* Massage our args to the form they really have. */ /* Massage our args to the form they really have. */
stub_entry = (struct elf32_hppa_stub_hash_entry *) gen_entry; stub_entry = (struct elf32_hppa_stub_hash_entry *) gen_entry;
htab = (struct elf32_hppa_link_hash_table *) in_arg; htab = in_arg;
if (stub_entry->stub_type == hppa_stub_long_branch) if (stub_entry->stub_type == hppa_stub_long_branch)
size = 8; size = 8;
@ -1052,8 +916,7 @@ hppa_size_one_stub (gen_entry, in_arg)
Additionally we set the default architecture and machine. */ Additionally we set the default architecture and machine. */
static bfd_boolean static bfd_boolean
elf32_hppa_object_p (abfd) elf32_hppa_object_p (bfd *abfd)
bfd *abfd;
{ {
Elf_Internal_Ehdr * i_ehdrp; Elf_Internal_Ehdr * i_ehdrp;
unsigned int flags; unsigned int flags;
@ -1085,30 +948,11 @@ elf32_hppa_object_p (abfd)
return TRUE; return TRUE;
} }
/* Undo the generic ELF code's subtraction of section->vma from the
value of each external symbol. */
static bfd_boolean
elf32_hppa_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
bfd *abfd ATTRIBUTE_UNUSED;
struct bfd_link_info *info ATTRIBUTE_UNUSED;
const Elf_Internal_Sym *sym ATTRIBUTE_UNUSED;
const char **namep ATTRIBUTE_UNUSED;
flagword *flagsp ATTRIBUTE_UNUSED;
asection **secp;
bfd_vma *valp;
{
*valp += (*secp)->vma;
return TRUE;
}
/* Create the .plt and .got sections, and set up our hash table /* Create the .plt and .got sections, and set up our hash table
short-cuts to various dynamic sections. */ short-cuts to various dynamic sections. */
static bfd_boolean static bfd_boolean
elf32_hppa_create_dynamic_sections (abfd, info) elf32_hppa_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
bfd *abfd;
struct bfd_link_info *info;
{ {
struct elf32_hppa_link_hash_table *htab; struct elf32_hppa_link_hash_table *htab;
@ -1146,9 +990,9 @@ elf32_hppa_create_dynamic_sections (abfd, info)
/* Copy the extra info we tack onto an elf_link_hash_entry. */ /* Copy the extra info we tack onto an elf_link_hash_entry. */
static void static void
elf32_hppa_copy_indirect_symbol (bed, dir, ind) elf32_hppa_copy_indirect_symbol (struct elf_backend_data *bed,
struct elf_backend_data *bed; struct elf_link_hash_entry *dir,
struct elf_link_hash_entry *dir, *ind; struct elf_link_hash_entry *ind)
{ {
struct elf32_hppa_link_hash_entry *edir, *eind; struct elf32_hppa_link_hash_entry *edir, *eind;
@ -1200,11 +1044,10 @@ elf32_hppa_copy_indirect_symbol (bed, dir, ind)
necessarily read all the input files. */ necessarily read all the input files. */
static bfd_boolean static bfd_boolean
elf32_hppa_check_relocs (abfd, info, sec, relocs) elf32_hppa_check_relocs (bfd *abfd,
bfd *abfd; struct bfd_link_info *info,
struct bfd_link_info *info; asection *sec,
asection *sec; const Elf_Internal_Rela *relocs)
const Elf_Internal_Rela *relocs;
{ {
Elf_Internal_Shdr *symtab_hdr; Elf_Internal_Shdr *symtab_hdr;
struct elf_link_hash_entry **sym_hashes; struct elf_link_hash_entry **sym_hashes;
@ -1422,8 +1265,7 @@ elf32_hppa_check_relocs (abfd, info, sec, relocs)
pointer. */ pointer. */
size = symtab_hdr->sh_info; size = symtab_hdr->sh_info;
size *= 2 * sizeof (bfd_signed_vma); size *= 2 * sizeof (bfd_signed_vma);
local_got_refcounts = ((bfd_signed_vma *) local_got_refcounts = bfd_zalloc (abfd, size);
bfd_zalloc (abfd, size));
if (local_got_refcounts == NULL) if (local_got_refcounts == NULL)
return FALSE; return FALSE;
elf_local_got_refcounts (abfd) = local_got_refcounts; elf_local_got_refcounts (abfd) = local_got_refcounts;
@ -1469,8 +1311,7 @@ elf32_hppa_check_relocs (abfd, info, sec, relocs)
plt offsets. */ plt offsets. */
size = symtab_hdr->sh_info; size = symtab_hdr->sh_info;
size *= 2 * sizeof (bfd_signed_vma); size *= 2 * sizeof (bfd_signed_vma);
local_got_refcounts = ((bfd_signed_vma *) local_got_refcounts = bfd_zalloc (abfd, size);
bfd_zalloc (abfd, size));
if (local_got_refcounts == NULL) if (local_got_refcounts == NULL)
return FALSE; return FALSE;
elf_local_got_refcounts (abfd) = local_got_refcounts; elf_local_got_refcounts (abfd) = local_got_refcounts;
@ -1604,9 +1445,7 @@ elf32_hppa_check_relocs (abfd, info, sec, relocs)
p = *head; p = *head;
if (p == NULL || p->sec != sec) if (p == NULL || p->sec != sec)
{ {
p = ((struct elf32_hppa_dyn_reloc_entry *) p = bfd_alloc (htab->elf.dynobj, sizeof *p);
bfd_alloc (htab->elf.dynobj,
(bfd_size_type) sizeof *p));
if (p == NULL) if (p == NULL)
return FALSE; return FALSE;
p->next = *head; p->next = *head;
@ -1634,12 +1473,11 @@ elf32_hppa_check_relocs (abfd, info, sec, relocs)
for a given relocation. */ for a given relocation. */
static asection * static asection *
elf32_hppa_gc_mark_hook (sec, info, rel, h, sym) elf32_hppa_gc_mark_hook (asection *sec,
asection *sec; struct bfd_link_info *info ATTRIBUTE_UNUSED,
struct bfd_link_info *info ATTRIBUTE_UNUSED; Elf_Internal_Rela *rel,
Elf_Internal_Rela *rel; struct elf_link_hash_entry *h,
struct elf_link_hash_entry *h; Elf_Internal_Sym *sym)
Elf_Internal_Sym *sym;
{ {
if (h != NULL) if (h != NULL)
{ {
@ -1674,11 +1512,10 @@ elf32_hppa_gc_mark_hook (sec, info, rel, h, sym)
removed. */ removed. */
static bfd_boolean static bfd_boolean
elf32_hppa_gc_sweep_hook (abfd, info, sec, relocs) elf32_hppa_gc_sweep_hook (bfd *abfd,
bfd *abfd; struct bfd_link_info *info ATTRIBUTE_UNUSED,
struct bfd_link_info *info ATTRIBUTE_UNUSED; asection *sec,
asection *sec; const Elf_Internal_Rela *relocs)
const Elf_Internal_Rela *relocs;
{ {
Elf_Internal_Shdr *symtab_hdr; Elf_Internal_Shdr *symtab_hdr;
struct elf_link_hash_entry **sym_hashes; struct elf_link_hash_entry **sym_hashes;
@ -1777,10 +1614,9 @@ elf32_hppa_gc_sweep_hook (abfd, info, sec, relocs)
plabels. */ plabels. */
static void static void
elf32_hppa_hide_symbol (info, h, force_local) elf32_hppa_hide_symbol (struct bfd_link_info *info,
struct bfd_link_info *info; struct elf_link_hash_entry *h,
struct elf_link_hash_entry *h; bfd_boolean force_local)
bfd_boolean force_local;
{ {
if (force_local) if (force_local)
{ {
@ -1818,9 +1654,8 @@ elf32_hppa_hide_symbol (info, h, force_local)
understand. */ understand. */
static bfd_boolean static bfd_boolean
elf32_hppa_adjust_dynamic_symbol (info, h) elf32_hppa_adjust_dynamic_symbol (struct bfd_link_info *info,
struct bfd_link_info *info; struct elf_link_hash_entry *h)
struct elf_link_hash_entry *h;
{ {
struct elf32_hppa_link_hash_table *htab; struct elf32_hppa_link_hash_table *htab;
struct elf32_hppa_link_hash_entry *eh; struct elf32_hppa_link_hash_entry *eh;
@ -1963,9 +1798,7 @@ elf32_hppa_adjust_dynamic_symbol (info, h)
the first part of elf32_hppa_adjust_dynamic_symbol. */ the first part of elf32_hppa_adjust_dynamic_symbol. */
static bfd_boolean static bfd_boolean
mark_PIC_calls (h, inf) mark_PIC_calls (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
struct elf_link_hash_entry *h;
PTR inf ATTRIBUTE_UNUSED;
{ {
if (h->root.type == bfd_link_hash_warning) if (h->root.type == bfd_link_hash_warning)
h = (struct elf_link_hash_entry *) h->root.u.i.link; h = (struct elf_link_hash_entry *) h->root.u.i.link;
@ -1990,9 +1823,7 @@ mark_PIC_calls (h, inf)
ie. pic_call and plabel entries. */ ie. pic_call and plabel entries. */
static bfd_boolean static bfd_boolean
allocate_plt_static (h, inf) allocate_plt_static (struct elf_link_hash_entry *h, void *inf)
struct elf_link_hash_entry *h;
PTR inf;
{ {
struct bfd_link_info *info; struct bfd_link_info *info;
struct elf32_hppa_link_hash_table *htab; struct elf32_hppa_link_hash_table *htab;
@ -2004,7 +1835,7 @@ allocate_plt_static (h, inf)
if (h->root.type == bfd_link_hash_warning) if (h->root.type == bfd_link_hash_warning)
h = (struct elf_link_hash_entry *) h->root.u.i.link; h = (struct elf_link_hash_entry *) h->root.u.i.link;
info = (struct bfd_link_info *) inf; info = inf;
htab = hppa_link_hash_table (info); htab = hppa_link_hash_table (info);
if (((struct elf32_hppa_link_hash_entry *) h)->pic_call) if (((struct elf32_hppa_link_hash_entry *) h)->pic_call)
{ {
@ -2064,9 +1895,7 @@ allocate_plt_static (h, inf)
global syms. */ global syms. */
static bfd_boolean static bfd_boolean
allocate_dynrelocs (h, inf) allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
struct elf_link_hash_entry *h;
PTR inf;
{ {
struct bfd_link_info *info; struct bfd_link_info *info;
struct elf32_hppa_link_hash_table *htab; struct elf32_hppa_link_hash_table *htab;
@ -2080,7 +1909,7 @@ allocate_dynrelocs (h, inf)
if (h->root.type == bfd_link_hash_warning) if (h->root.type == bfd_link_hash_warning)
h = (struct elf_link_hash_entry *) h->root.u.i.link; h = (struct elf_link_hash_entry *) h->root.u.i.link;
info = (struct bfd_link_info *) inf; info = inf;
htab = hppa_link_hash_table (info); htab = hppa_link_hash_table (info);
if (htab->elf.dynamic_sections_created if (htab->elf.dynamic_sections_created
&& h->plt.offset != (bfd_vma) -1 && h->plt.offset != (bfd_vma) -1
@ -2205,9 +2034,8 @@ allocate_dynrelocs (h, inf)
elf_adjust_dynamic_symbol. */ elf_adjust_dynamic_symbol. */
static bfd_boolean static bfd_boolean
clobber_millicode_symbols (h, info) clobber_millicode_symbols (struct elf_link_hash_entry *h,
struct elf_link_hash_entry *h; struct bfd_link_info *info)
struct bfd_link_info *info;
{ {
if (h->root.type == bfd_link_hash_warning) if (h->root.type == bfd_link_hash_warning)
h = (struct elf_link_hash_entry *) h->root.u.i.link; h = (struct elf_link_hash_entry *) h->root.u.i.link;
@ -2223,9 +2051,7 @@ clobber_millicode_symbols (h, info)
/* Find any dynamic relocs that apply to read-only sections. */ /* Find any dynamic relocs that apply to read-only sections. */
static bfd_boolean static bfd_boolean
readonly_dynrelocs (h, inf) readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
struct elf_link_hash_entry *h;
PTR inf;
{ {
struct elf32_hppa_link_hash_entry *eh; struct elf32_hppa_link_hash_entry *eh;
struct elf32_hppa_dyn_reloc_entry *p; struct elf32_hppa_dyn_reloc_entry *p;
@ -2240,7 +2066,7 @@ readonly_dynrelocs (h, inf)
if (s != NULL && (s->flags & SEC_READONLY) != 0) if (s != NULL && (s->flags & SEC_READONLY) != 0)
{ {
struct bfd_link_info *info = (struct bfd_link_info *) inf; struct bfd_link_info *info = inf;
info->flags |= DF_TEXTREL; info->flags |= DF_TEXTREL;
@ -2254,9 +2080,8 @@ readonly_dynrelocs (h, inf)
/* Set the sizes of the dynamic sections. */ /* Set the sizes of the dynamic sections. */
static bfd_boolean static bfd_boolean
elf32_hppa_size_dynamic_sections (output_bfd, info) elf32_hppa_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
bfd *output_bfd ATTRIBUTE_UNUSED; struct bfd_link_info *info)
struct bfd_link_info *info;
{ {
struct elf32_hppa_link_hash_table *htab; struct elf32_hppa_link_hash_table *htab;
bfd *dynobj; bfd *dynobj;
@ -2292,7 +2117,7 @@ elf32_hppa_size_dynamic_sections (output_bfd, info)
PIC, and mark them as needing .plt entries so that %r19 will PIC, and mark them as needing .plt entries so that %r19 will
be set up. */ be set up. */
if (! info->shared) if (! info->shared)
elf_link_hash_traverse (&htab->elf, mark_PIC_calls, (PTR) info); elf_link_hash_traverse (&htab->elf, mark_PIC_calls, info);
} }
/* Set up .got and .plt offsets for local syms, and space for local /* Set up .got and .plt offsets for local syms, and space for local
@ -2389,11 +2214,11 @@ elf32_hppa_size_dynamic_sections (output_bfd, info)
/* Do all the .plt entries without relocs first. The dynamic linker /* Do all the .plt entries without relocs first. The dynamic linker
uses the last .plt reloc to find the end of the .plt (and hence uses the last .plt reloc to find the end of the .plt (and hence
the start of the .got) for lazy linking. */ the start of the .got) for lazy linking. */
elf_link_hash_traverse (&htab->elf, allocate_plt_static, (PTR) info); elf_link_hash_traverse (&htab->elf, allocate_plt_static, info);
/* Allocate global sym .plt and .got entries, and space for global /* Allocate global sym .plt and .got entries, and space for global
sym dynamic relocs. */ sym dynamic relocs. */
elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info); elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
/* The check_relocs and adjust_dynamic_symbol entry points have /* The check_relocs and adjust_dynamic_symbol entry points have
determined the sizes of the various dynamic sections. Allocate determined the sizes of the various dynamic sections. Allocate
@ -2460,7 +2285,7 @@ elf32_hppa_size_dynamic_sections (output_bfd, info)
/* Allocate memory for the section contents. Zero it, because /* Allocate memory for the section contents. Zero it, because
we may not fill in all the reloc sections. */ we may not fill in all the reloc sections. */
s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size); s->contents = bfd_zalloc (dynobj, s->_raw_size);
if (s->contents == NULL && s->_raw_size != 0) if (s->contents == NULL && s->_raw_size != 0)
return FALSE; return FALSE;
} }
@ -2506,8 +2331,7 @@ elf32_hppa_size_dynamic_sections (output_bfd, info)
/* If any dynamic relocs apply to a read-only section, /* If any dynamic relocs apply to a read-only section,
then we need a DT_TEXTREL entry. */ then we need a DT_TEXTREL entry. */
if ((info->flags & DF_TEXTREL) == 0) if ((info->flags & DF_TEXTREL) == 0)
elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, info);
(PTR) info);
if ((info->flags & DF_TEXTREL) != 0) if ((info->flags & DF_TEXTREL) != 0)
{ {
@ -2528,9 +2352,7 @@ elf32_hppa_size_dynamic_sections (output_bfd, info)
0 when no stubs will be needed, and 1 on success. */ 0 when no stubs will be needed, and 1 on success. */
int int
elf32_hppa_setup_section_lists (output_bfd, info) elf32_hppa_setup_section_lists (bfd *output_bfd, struct bfd_link_info *info)
bfd *output_bfd;
struct bfd_link_info *info;
{ {
bfd *input_bfd; bfd *input_bfd;
unsigned int bfd_count; unsigned int bfd_count;
@ -2560,7 +2382,7 @@ elf32_hppa_setup_section_lists (output_bfd, info)
htab->bfd_count = bfd_count; htab->bfd_count = bfd_count;
amt = sizeof (struct map_stub) * (top_id + 1); amt = sizeof (struct map_stub) * (top_id + 1);
htab->stub_group = (struct map_stub *) bfd_zmalloc (amt); htab->stub_group = bfd_zmalloc (amt);
if (htab->stub_group == NULL) if (htab->stub_group == NULL)
return -1; return -1;
@ -2577,7 +2399,7 @@ elf32_hppa_setup_section_lists (output_bfd, info)
htab->top_index = top_index; htab->top_index = top_index;
amt = sizeof (asection *) * (top_index + 1); amt = sizeof (asection *) * (top_index + 1);
input_list = (asection **) bfd_malloc (amt); input_list = bfd_malloc (amt);
htab->input_list = input_list; htab->input_list = input_list;
if (input_list == NULL) if (input_list == NULL)
return -1; return -1;
@ -2606,9 +2428,7 @@ elf32_hppa_setup_section_lists (output_bfd, info)
we may insert linker stubs. */ we may insert linker stubs. */
void void
elf32_hppa_next_input_section (info, isec) elf32_hppa_next_input_section (struct bfd_link_info *info, asection *isec)
struct bfd_link_info *info;
asection *isec;
{ {
struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info); struct elf32_hppa_link_hash_table *htab = hppa_link_hash_table (info);
@ -2635,10 +2455,9 @@ elf32_hppa_next_input_section (info, isec)
the middle of a function is not a good idea. */ the middle of a function is not a good idea. */
static void static void
group_sections (htab, stub_group_size, stubs_always_before_branch) group_sections (struct elf32_hppa_link_hash_table *htab,
struct elf32_hppa_link_hash_table *htab; bfd_size_type stub_group_size,
bfd_size_type stub_group_size; bfd_boolean stubs_always_before_branch)
bfd_boolean stubs_always_before_branch;
{ {
asection **list = htab->input_list + htab->top_index; asection **list = htab->input_list + htab->top_index;
do do
@ -2716,10 +2535,7 @@ group_sections (htab, stub_group_size, stubs_always_before_branch)
Returns -1 on error, 1 if export stubs created, 0 otherwise. */ Returns -1 on error, 1 if export stubs created, 0 otherwise. */
static int static int
get_local_syms (output_bfd, input_bfd, info) get_local_syms (bfd *output_bfd, bfd *input_bfd, struct bfd_link_info *info)
bfd *output_bfd;
bfd *input_bfd;
struct bfd_link_info *info;
{ {
unsigned int bfd_indx; unsigned int bfd_indx;
Elf_Internal_Sym *local_syms, **all_local_syms; Elf_Internal_Sym *local_syms, **all_local_syms;
@ -2730,7 +2546,7 @@ get_local_syms (output_bfd, input_bfd, info)
we need to read in the local symbols in parallel and save them for we need to read in the local symbols in parallel and save them for
later use; so hold pointers to the local symbols in an array. */ later use; so hold pointers to the local symbols in an array. */
bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count; bfd_size_type amt = sizeof (Elf_Internal_Sym *) * htab->bfd_count;
all_local_syms = (Elf_Internal_Sym **) bfd_zmalloc (amt); all_local_syms = bfd_zmalloc (amt);
htab->all_local_syms = all_local_syms; htab->all_local_syms = all_local_syms;
if (all_local_syms == NULL) if (all_local_syms == NULL)
return -1; return -1;
@ -2844,15 +2660,11 @@ get_local_syms (output_bfd, input_bfd, info)
instruction. */ instruction. */
bfd_boolean bfd_boolean
elf32_hppa_size_stubs (output_bfd, stub_bfd, info, multi_subspace, group_size, elf32_hppa_size_stubs
add_stub_section, layout_sections_again) (bfd *output_bfd, bfd *stub_bfd, struct bfd_link_info *info,
bfd *output_bfd; bfd_boolean multi_subspace, bfd_signed_vma group_size,
bfd *stub_bfd; asection * (*add_stub_section) (const char *, asection *),
struct bfd_link_info *info; void (*layout_sections_again) (void))
bfd_boolean multi_subspace;
bfd_signed_vma group_size;
asection * (*add_stub_section) PARAMS ((const char *, asection *));
void (*layout_sections_again) PARAMS ((void));
{ {
bfd_size_type stub_group_size; bfd_size_type stub_group_size;
bfd_boolean stubs_always_before_branch; bfd_boolean stubs_always_before_branch;
@ -2950,8 +2762,7 @@ elf32_hppa_size_stubs (output_bfd, stub_bfd, info, multi_subspace, group_size,
/* Get the relocs. */ /* Get the relocs. */
internal_relocs internal_relocs
= _bfd_elf_link_read_relocs (input_bfd, section, NULL, = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
(Elf_Internal_Rela *) NULL,
info->keep_memory); info->keep_memory);
if (internal_relocs == NULL) if (internal_relocs == NULL)
goto error_ret_free_local; goto error_ret_free_local;
@ -3138,9 +2949,7 @@ elf32_hppa_size_stubs (output_bfd, stub_bfd, info, multi_subspace, group_size,
stubs to provide a value for __gp. */ stubs to provide a value for __gp. */
bfd_boolean bfd_boolean
elf32_hppa_set_gp (abfd, info) elf32_hppa_set_gp (bfd *abfd, struct bfd_link_info *info)
bfd *abfd;
struct bfd_link_info *info;
{ {
struct bfd_link_hash_entry *h; struct bfd_link_hash_entry *h;
asection *sec = NULL; asection *sec = NULL;
@ -3234,8 +3043,7 @@ elf32_hppa_set_gp (abfd, info)
linker. */ linker. */
bfd_boolean bfd_boolean
elf32_hppa_build_stubs (info) elf32_hppa_build_stubs (struct bfd_link_info *info)
struct bfd_link_info *info;
{ {
asection *stub_sec; asection *stub_sec;
struct bfd_hash_table *table; struct bfd_hash_table *table;
@ -3251,7 +3059,7 @@ elf32_hppa_build_stubs (info)
/* Allocate memory to hold the linker stubs. */ /* Allocate memory to hold the linker stubs. */
size = stub_sec->_raw_size; size = stub_sec->_raw_size;
stub_sec->contents = (unsigned char *) bfd_zalloc (htab->stub_bfd, size); stub_sec->contents = bfd_zalloc (htab->stub_bfd, size);
if (stub_sec->contents == NULL && size != 0) if (stub_sec->contents == NULL && size != 0)
return FALSE; return FALSE;
stub_sec->_raw_size = 0; stub_sec->_raw_size = 0;
@ -3267,9 +3075,7 @@ elf32_hppa_build_stubs (info)
/* Perform a final link. */ /* Perform a final link. */
static bfd_boolean static bfd_boolean
elf32_hppa_final_link (abfd, info) elf32_hppa_final_link (bfd *abfd, struct bfd_link_info *info)
bfd *abfd;
struct bfd_link_info *info;
{ {
/* Invoke the regular ELF linker to do all the work. */ /* Invoke the regular ELF linker to do all the work. */
if (!bfd_elf32_bfd_final_link (abfd, info)) if (!bfd_elf32_bfd_final_link (abfd, info))
@ -3283,10 +3089,9 @@ elf32_hppa_final_link (abfd, info)
/* Record the lowest address for the data and text segments. */ /* Record the lowest address for the data and text segments. */
static void static void
hppa_record_segment_addr (abfd, section, data) hppa_record_segment_addr (bfd *abfd ATTRIBUTE_UNUSED,
bfd *abfd ATTRIBUTE_UNUSED; asection *section,
asection *section; void *data)
PTR data;
{ {
struct elf32_hppa_link_hash_table *htab; struct elf32_hppa_link_hash_table *htab;
@ -3312,14 +3117,13 @@ hppa_record_segment_addr (abfd, section, data)
/* Perform a relocation as part of a final link. */ /* Perform a relocation as part of a final link. */
static bfd_reloc_status_type static bfd_reloc_status_type
final_link_relocate (input_section, contents, rel, value, htab, sym_sec, h) final_link_relocate (asection *input_section,
asection *input_section; bfd_byte *contents,
bfd_byte *contents; const Elf_Internal_Rela *rel,
const Elf_Internal_Rela *rel; bfd_vma value,
bfd_vma value; struct elf32_hppa_link_hash_table *htab,
struct elf32_hppa_link_hash_table *htab; asection *sym_sec,
asection *sym_sec; struct elf32_hppa_link_hash_entry *h)
struct elf32_hppa_link_hash_entry *h;
{ {
int insn; int insn;
unsigned int r_type = ELF32_R_TYPE (rel->r_info); unsigned int r_type = ELF32_R_TYPE (rel->r_info);
@ -3576,16 +3380,14 @@ final_link_relocate (input_section, contents, rel, value, htab, sym_sec, h)
/* Relocate an HPPA ELF section. */ /* Relocate an HPPA ELF section. */
static bfd_boolean static bfd_boolean
elf32_hppa_relocate_section (output_bfd, info, input_bfd, input_section, elf32_hppa_relocate_section (bfd *output_bfd,
contents, relocs, local_syms, local_sections) struct bfd_link_info *info,
bfd *output_bfd; bfd *input_bfd,
struct bfd_link_info *info; asection *input_section,
bfd *input_bfd; bfd_byte *contents,
asection *input_section; Elf_Internal_Rela *relocs,
bfd_byte *contents; Elf_Internal_Sym *local_syms,
Elf_Internal_Rela *relocs; asection **local_sections)
Elf_Internal_Sym *local_syms;
asection **local_sections;
{ {
bfd_vma *local_got_offsets; bfd_vma *local_got_offsets;
struct elf32_hppa_link_hash_table *htab; struct elf32_hppa_link_hash_table *htab;
@ -4049,8 +3851,8 @@ elf32_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
else else
{ {
if (!((*info->callbacks->reloc_overflow) if (!((*info->callbacks->reloc_overflow)
(info, sym_name, howto->name, (bfd_vma) 0, (info, sym_name, howto->name, 0, input_bfd, input_section,
input_bfd, input_section, rel->r_offset))) rel->r_offset)))
return FALSE; return FALSE;
} }
} }
@ -4062,11 +3864,10 @@ elf32_hppa_relocate_section (output_bfd, info, input_bfd, input_section,
dynamic sections here. */ dynamic sections here. */
static bfd_boolean static bfd_boolean
elf32_hppa_finish_dynamic_symbol (output_bfd, info, h, sym) elf32_hppa_finish_dynamic_symbol (bfd *output_bfd,
bfd *output_bfd; struct bfd_link_info *info,
struct bfd_link_info *info; struct elf_link_hash_entry *h,
struct elf_link_hash_entry *h; Elf_Internal_Sym *sym)
Elf_Internal_Sym *sym;
{ {
struct elf32_hppa_link_hash_table *htab; struct elf32_hppa_link_hash_table *htab;
@ -4171,8 +3972,7 @@ elf32_hppa_finish_dynamic_symbol (output_bfd, info, h, sym)
{ {
if ((h->got.offset & 1) != 0) if ((h->got.offset & 1) != 0)
abort (); abort ();
bfd_put_32 (output_bfd, (bfd_vma) 0, bfd_put_32 (output_bfd, 0, htab->sgot->contents + h->got.offset);
htab->sgot->contents + h->got.offset);
rel.r_info = ELF32_R_INFO (h->dynindx, R_PARISC_DIR32); rel.r_info = ELF32_R_INFO (h->dynindx, R_PARISC_DIR32);
rel.r_addend = 0; rel.r_addend = 0;
} }
@ -4221,8 +4021,7 @@ elf32_hppa_finish_dynamic_symbol (output_bfd, info, h, sym)
dynamic linker, before writing them out. */ dynamic linker, before writing them out. */
static enum elf_reloc_type_class static enum elf_reloc_type_class
elf32_hppa_reloc_type_class (rela) elf32_hppa_reloc_type_class (const Elf_Internal_Rela *rela)
const Elf_Internal_Rela *rela;
{ {
if (ELF32_R_SYM (rela->r_info) == 0) if (ELF32_R_SYM (rela->r_info) == 0)
return reloc_class_relative; return reloc_class_relative;
@ -4241,9 +4040,8 @@ elf32_hppa_reloc_type_class (rela)
/* Finish up the dynamic sections. */ /* Finish up the dynamic sections. */
static bfd_boolean static bfd_boolean
elf32_hppa_finish_dynamic_sections (output_bfd, info) elf32_hppa_finish_dynamic_sections (bfd *output_bfd,
bfd *output_bfd; struct bfd_link_info *info)
struct bfd_link_info *info;
{ {
bfd *dynobj; bfd *dynobj;
struct elf32_hppa_link_hash_table *htab; struct elf32_hppa_link_hash_table *htab;
@ -4321,9 +4119,7 @@ elf32_hppa_finish_dynamic_sections (output_bfd, info)
/* Fill in the first entry in the global offset table. /* Fill in the first entry in the global offset table.
We use it to point to our dynamic section, if we have one. */ We use it to point to our dynamic section, if we have one. */
bfd_put_32 (output_bfd, bfd_put_32 (output_bfd,
(sdyn != NULL sdyn ? sdyn->output_section->vma + sdyn->output_offset : 0,
? sdyn->output_section->vma + sdyn->output_offset
: (bfd_vma) 0),
htab->sgot->contents); htab->sgot->contents);
/* The second entry is reserved for use by the dynamic linker. */ /* The second entry is reserved for use by the dynamic linker. */
@ -4366,9 +4162,8 @@ elf32_hppa_finish_dynamic_sections (output_bfd, info)
/* Tweak the OSABI field of the elf header. */ /* Tweak the OSABI field of the elf header. */
static void static void
elf32_hppa_post_process_headers (abfd, link_info) elf32_hppa_post_process_headers (bfd *abfd,
bfd *abfd; struct bfd_link_info *info ATTRIBUTE_UNUSED)
struct bfd_link_info *link_info ATTRIBUTE_UNUSED;
{ {
Elf_Internal_Ehdr * i_ehdrp; Elf_Internal_Ehdr * i_ehdrp;
@ -4387,9 +4182,7 @@ elf32_hppa_post_process_headers (abfd, link_info)
/* Called when writing out an object file to decide the type of a /* Called when writing out an object file to decide the type of a
symbol. */ symbol. */
static int static int
elf32_hppa_elf_get_symbol_type (elf_sym, type) elf32_hppa_elf_get_symbol_type (Elf_Internal_Sym *elf_sym, int type)
Elf_Internal_Sym *elf_sym;
int type;
{ {
if (ELF_ST_TYPE (elf_sym->st_info) == STT_PARISC_MILLI) if (ELF_ST_TYPE (elf_sym->st_info) == STT_PARISC_MILLI)
return STT_PARISC_MILLI; return STT_PARISC_MILLI;
@ -4407,7 +4200,6 @@ elf32_hppa_elf_get_symbol_type (elf_sym, type)
#define bfd_elf32_bfd_final_link elf32_hppa_final_link #define bfd_elf32_bfd_final_link elf32_hppa_final_link
#define bfd_elf32_bfd_link_hash_table_create elf32_hppa_link_hash_table_create #define bfd_elf32_bfd_link_hash_table_create elf32_hppa_link_hash_table_create
#define bfd_elf32_bfd_link_hash_table_free elf32_hppa_link_hash_table_free #define bfd_elf32_bfd_link_hash_table_free elf32_hppa_link_hash_table_free
#define elf_backend_add_symbol_hook elf32_hppa_add_symbol_hook
#define elf_backend_adjust_dynamic_symbol elf32_hppa_adjust_dynamic_symbol #define elf_backend_adjust_dynamic_symbol elf32_hppa_adjust_dynamic_symbol
#define elf_backend_copy_indirect_symbol elf32_hppa_copy_indirect_symbol #define elf_backend_copy_indirect_symbol elf32_hppa_copy_indirect_symbol
#define elf_backend_check_relocs elf32_hppa_check_relocs #define elf_backend_check_relocs elf32_hppa_check_relocs

View File

@ -5,7 +5,7 @@
February 1994. February 1994.
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000,
2002 Free Software Foundation, Inc. 2002, 2003 Free Software Foundation, Inc.
Written by: Written by:
@ -37,27 +37,26 @@
#include "elf/hppa.h" #include "elf/hppa.h"
int elf32_hppa_setup_section_lists int elf32_hppa_setup_section_lists
PARAMS ((bfd *, struct bfd_link_info *)); (bfd *, struct bfd_link_info *);
void elf32_hppa_next_input_section void elf32_hppa_next_input_section
PARAMS ((struct bfd_link_info *, asection *)); (struct bfd_link_info *, asection *);
bfd_boolean elf32_hppa_size_stubs bfd_boolean elf32_hppa_size_stubs
PARAMS ((bfd *, bfd *, struct bfd_link_info *, bfd_boolean, bfd_signed_vma, (bfd *, bfd *, struct bfd_link_info *, bfd_boolean, bfd_signed_vma,
asection * (*) PARAMS ((const char *, asection *)), asection * (*) (const char *, asection *), void (*) (void));
void (*) PARAMS ((void))));
bfd_boolean elf32_hppa_set_gp bfd_boolean elf32_hppa_set_gp
PARAMS ((bfd *, struct bfd_link_info *)); (bfd *, struct bfd_link_info *);
bfd_boolean elf32_hppa_build_stubs bfd_boolean elf32_hppa_build_stubs
PARAMS ((struct bfd_link_info *)); (struct bfd_link_info *);
elf_hppa_reloc_type elf32_hppa_reloc_final_type elf_hppa_reloc_type elf32_hppa_reloc_final_type
PARAMS ((bfd *, elf_hppa_reloc_type, int, unsigned int)); (bfd *, elf_hppa_reloc_type, int, unsigned int);
extern elf_hppa_reloc_type ** _bfd_elf32_hppa_gen_reloc_type extern elf_hppa_reloc_type ** _bfd_elf32_hppa_gen_reloc_type
PARAMS ((bfd *, elf_hppa_reloc_type, int, unsigned int, int, asymbol *)); (bfd *, elf_hppa_reloc_type, int, unsigned int, int, asymbol *);
/* Define groups of basic relocations. FIXME: These should /* Define groups of basic relocations. FIXME: These should
be the only basic relocations created by GAS. The rest be the only basic relocations created by GAS. The rest

View File

@ -818,7 +818,7 @@ elf_write_relocs (bfd *abfd, asection *sec, void *data)
bfd_boolean *failedp = data; bfd_boolean *failedp = data;
Elf_Internal_Shdr *rela_hdr; Elf_Internal_Shdr *rela_hdr;
bfd_vma addr_offset; bfd_vma addr_offset;
void (*swap_out) PARAMS ((bfd *, const Elf_Internal_Rela *, bfd_byte *)); void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
size_t extsize; size_t extsize;
bfd_byte *dst_rela; bfd_byte *dst_rela;
unsigned int idx; unsigned int idx;

View File

@ -1,6 +1,6 @@
/* HP PA-RISC SOM object file format: definitions internal to BFD. /* HP PA-RISC SOM object file format: definitions internal to BFD.
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000,
Free Software Foundation, Inc. 2003 Free Software Foundation, Inc.
Contributed by the Center for Software Science at the Contributed by the Center for Software Science at the
University of Utah (pa-gdb-bugs@cs.utah.edu). University of Utah (pa-gdb-bugs@cs.utah.edu).
@ -27,14 +27,6 @@
#define BYTES_IN_WORD 4 #define BYTES_IN_WORD 4
#define PA_PAGESIZE 0x1000 #define PA_PAGESIZE 0x1000
#ifndef INLINE
#ifdef __GNUC__
#define INLINE inline
#else
#define INLINE
#endif /* GNU C? */
#endif /* INLINE */
/* The PA instruction set variants. */ /* The PA instruction set variants. */
enum pa_arch {pa10 = 10, pa11 = 11, pa20 = 20, pa20w = 25}; enum pa_arch {pa10 = 10, pa11 = 11, pa20 = 20, pa20w = 25};
@ -164,40 +156,38 @@ enum hppa_reloc_expr_type_alt
/* Some functions to manipulate PA instructions. */ /* Some functions to manipulate PA instructions. */
/* Declare the functions with the unused attribute to avoid warnings. */ /* Declare the functions with the unused attribute to avoid warnings. */
static INLINE int sign_extend PARAMS ((int, int)) ATTRIBUTE_UNUSED; static inline int sign_extend (int, int) ATTRIBUTE_UNUSED;
static INLINE int low_sign_extend PARAMS ((int, int)) ATTRIBUTE_UNUSED; static inline int low_sign_extend (int, int) ATTRIBUTE_UNUSED;
static INLINE int sign_unext PARAMS ((int, int)) ATTRIBUTE_UNUSED; static inline int sign_unext (int, int) ATTRIBUTE_UNUSED;
static INLINE int low_sign_unext PARAMS ((int, int)) ATTRIBUTE_UNUSED; static inline int low_sign_unext (int, int) ATTRIBUTE_UNUSED;
static INLINE int re_assemble_3 PARAMS ((int)) ATTRIBUTE_UNUSED; static inline int re_assemble_3 (int) ATTRIBUTE_UNUSED;
static INLINE int re_assemble_12 PARAMS ((int)) ATTRIBUTE_UNUSED; static inline int re_assemble_12 (int) ATTRIBUTE_UNUSED;
static INLINE int re_assemble_14 PARAMS ((int)) ATTRIBUTE_UNUSED; static inline int re_assemble_14 (int) ATTRIBUTE_UNUSED;
static INLINE int re_assemble_16 PARAMS ((int)) ATTRIBUTE_UNUSED; static inline int re_assemble_16 (int) ATTRIBUTE_UNUSED;
static INLINE int re_assemble_17 PARAMS ((int)) ATTRIBUTE_UNUSED; static inline int re_assemble_17 (int) ATTRIBUTE_UNUSED;
static INLINE int re_assemble_21 PARAMS ((int)) ATTRIBUTE_UNUSED; static inline int re_assemble_21 (int) ATTRIBUTE_UNUSED;
static INLINE int re_assemble_22 PARAMS ((int)) ATTRIBUTE_UNUSED; static inline int re_assemble_22 (int) ATTRIBUTE_UNUSED;
static INLINE bfd_signed_vma hppa_field_adjust static inline bfd_signed_vma hppa_field_adjust
PARAMS ((bfd_vma, bfd_signed_vma, (bfd_vma, bfd_signed_vma, enum hppa_reloc_field_selector_type_alt)
enum hppa_reloc_field_selector_type_alt)) ATTRIBUTE_UNUSED; ATTRIBUTE_UNUSED;
static INLINE int bfd_hppa_insn2fmt PARAMS ((bfd *, int)) ATTRIBUTE_UNUSED; static inline int bfd_hppa_insn2fmt (bfd *, int) ATTRIBUTE_UNUSED;
static INLINE int hppa_rebuild_insn PARAMS ((int, int, int)) ATTRIBUTE_UNUSED; static inline int hppa_rebuild_insn (int, int, int) ATTRIBUTE_UNUSED;
/* The *sign_extend functions are used to assemble various bitfields /* The *sign_extend functions are used to assemble various bitfields
taken from an instruction and return the resulting immediate taken from an instruction and return the resulting immediate
value. */ value. */
static INLINE int static inline int
sign_extend (x, len) sign_extend (int x, int len)
int x, len;
{ {
int signbit = (1 << (len - 1)); int signbit = (1 << (len - 1));
int mask = (signbit << 1) - 1; int mask = (signbit << 1) - 1;
return ((x & mask) ^ signbit) - signbit; return ((x & mask) ^ signbit) - signbit;
} }
static INLINE int static inline int
low_sign_extend (x, len) low_sign_extend (int x, int len)
int x, len;
{ {
return (x >> 1) - ((x & 1) << (len - 1)); return (x >> 1) - ((x & 1) << (len - 1));
} }
@ -207,9 +197,8 @@ low_sign_extend (x, len)
insertion into an opcode. pa-risc uses all sorts of weird bitfields insertion into an opcode. pa-risc uses all sorts of weird bitfields
in the instruction to hold the value. */ in the instruction to hold the value. */
static INLINE int static inline int
sign_unext (x, len) sign_unext (int x, int len)
int x, len;
{ {
int len_ones; int len_ones;
@ -218,9 +207,8 @@ sign_unext (x, len)
return x & len_ones; return x & len_ones;
} }
static INLINE int static inline int
low_sign_unext (x, len) low_sign_unext (int x, int len)
int x, len;
{ {
int temp; int temp;
int sign; int sign;
@ -232,34 +220,30 @@ low_sign_unext (x, len)
return (temp << 1) | sign; return (temp << 1) | sign;
} }
static INLINE int static inline int
re_assemble_3 (as3) re_assemble_3 (int as3)
int as3;
{ {
return (( (as3 & 4) << (13-2)) return (( (as3 & 4) << (13-2))
| ((as3 & 3) << (13+1))); | ((as3 & 3) << (13+1)));
} }
static INLINE int static inline int
re_assemble_12 (as12) re_assemble_12 (int as12)
int as12;
{ {
return (( (as12 & 0x800) >> 11) return (( (as12 & 0x800) >> 11)
| ((as12 & 0x400) >> (10 - 2)) | ((as12 & 0x400) >> (10 - 2))
| ((as12 & 0x3ff) << (1 + 2))); | ((as12 & 0x3ff) << (1 + 2)));
} }
static INLINE int static inline int
re_assemble_14 (as14) re_assemble_14 (int as14)
int as14;
{ {
return (( (as14 & 0x1fff) << 1) return (( (as14 & 0x1fff) << 1)
| ((as14 & 0x2000) >> 13)); | ((as14 & 0x2000) >> 13));
} }
static INLINE int static inline int
re_assemble_16 (as16) re_assemble_16 (int as16)
int as16;
{ {
int s, t; int s, t;
@ -269,9 +253,8 @@ re_assemble_16 (as16)
return (t ^ s ^ (s >> 1)) | (s >> 15); return (t ^ s ^ (s >> 1)) | (s >> 15);
} }
static INLINE int static inline int
re_assemble_17 (as17) re_assemble_17 (int as17)
int as17;
{ {
return (( (as17 & 0x10000) >> 16) return (( (as17 & 0x10000) >> 16)
| ((as17 & 0x0f800) << (16 - 11)) | ((as17 & 0x0f800) << (16 - 11))
@ -279,9 +262,8 @@ re_assemble_17 (as17)
| ((as17 & 0x003ff) << (1 + 2))); | ((as17 & 0x003ff) << (1 + 2)));
} }
static INLINE int static inline int
re_assemble_21 (as21) re_assemble_21 (int as21)
int as21;
{ {
return (( (as21 & 0x100000) >> 20) return (( (as21 & 0x100000) >> 20)
| ((as21 & 0x0ffe00) >> 8) | ((as21 & 0x0ffe00) >> 8)
@ -290,9 +272,8 @@ re_assemble_21 (as21)
| ((as21 & 0x000003) << 12)); | ((as21 & 0x000003) << 12));
} }
static INLINE int static inline int
re_assemble_22 (as22) re_assemble_22 (int as22)
int as22;
{ {
return (( (as22 & 0x200000) >> 21) return (( (as22 & 0x200000) >> 21)
| ((as22 & 0x1f0000) << (21 - 16)) | ((as22 & 0x1f0000) << (21 - 16))
@ -312,11 +293,10 @@ re_assemble_22 (as22)
This function returns sign extended values in all cases. This function returns sign extended values in all cases.
*/ */
static INLINE bfd_signed_vma static inline bfd_signed_vma
hppa_field_adjust (sym_val, addend, r_field) hppa_field_adjust (bfd_vma sym_val,
bfd_vma sym_val; bfd_signed_vma addend,
bfd_signed_vma addend; enum hppa_reloc_field_selector_type_alt r_field)
enum hppa_reloc_field_selector_type_alt r_field;
{ {
bfd_signed_vma value; bfd_signed_vma value;
@ -479,10 +459,8 @@ enum hppa_opcode_type
/* Given a machine instruction, return its format. */ /* Given a machine instruction, return its format. */
static INLINE int static inline int
bfd_hppa_insn2fmt (abfd, insn) bfd_hppa_insn2fmt (bfd *abfd, int insn)
bfd *abfd;
int insn;
{ {
enum hppa_opcode_type op = get_opcode (insn); enum hppa_opcode_type op = get_opcode (insn);
@ -563,11 +541,8 @@ bfd_hppa_insn2fmt (abfd, insn)
/* Insert VALUE into INSN using R_FORMAT to determine exactly what /* Insert VALUE into INSN using R_FORMAT to determine exactly what
bits to change. */ bits to change. */
static INLINE int static inline int
hppa_rebuild_insn (insn, value, r_format) hppa_rebuild_insn (int insn, int value, int r_format)
int insn;
int value;
int r_format;
{ {
switch (r_format) switch (r_format)
{ {