diff options
author | Ken Raeburn <raeburn@cygnus> | 1993-08-28 00:10:54 +0000 |
---|---|---|
committer | Ken Raeburn <raeburn@cygnus> | 1993-08-28 00:10:54 +0000 |
commit | d9ad93bce5cb9be821085233353cbf6baa7e1a2e (patch) | |
tree | 1d611bcef298efb57c2f27e3a732cfc571361985 /bfd/libhppa.h | |
parent | 78e1e6d95a89375bfcd2f01e963f9edbc67c8b85 (diff) | |
download | gdb-d9ad93bce5cb9be821085233353cbf6baa7e1a2e.zip gdb-d9ad93bce5cb9be821085233353cbf6baa7e1a2e.tar.gz gdb-d9ad93bce5cb9be821085233353cbf6baa7e1a2e.tar.bz2 |
More patches from Jeff Law, plus a little cleanup of my own.
These changes separate PA-SOM support from PA-ELF support.
A sun4-x-hppaosf assembler can now be built.
* elf32-hppa.c (elf_hppa_howto_table): Now static.
(symext_rootP, symext_lastP, global_value, GOT_value, global_symbol,
global_sym_defined, symextn_contents, symextn_contents_real_size,
elf_hppa_stub_rootP, elf32_hppa_symextn_map, elf32_hppa_symextn_map_size): Rely
on default initialization.
(hppa_elf_gen_reloc_type): Macro "UNDEFINED" doesn't need a trailing semicolon.
(hppa_look_for_stubs_in_section): Introduce temporaries to make code more
readable in 80 columns.
* libhppa.h (all functions): Now inline under GNU C.
* elf32-hppa.c (AR_WARN): Give argument which caused the invalid argument
relocation.
(AR_UNIMP): Delete unused macro.
(hppa_elf_set_section_contents): Always return a value.
(elf32_hppa_backend_table_processing): Likewise.
(elf32_hppa_backend_section_processing: Likewise.
* som.c: New file containing SOM specific code extracted from hppa.c
* som.h: New file containing SOM specific code extracted from libhppa.h
* hppa.c: Deleted.
* libhppa.h: Delete SOM specific code. Add generic PA code which can be shared
by both SOM and ELF backends.
* Makefile.in: Replace hppa.c with som.c. elf32-hppa.o depends on libhppa.h
now.
* configure.in (hppa_vec): Needs som.o module instead of hppa.o.
* elf32-hppa.c: Include libhppa.h. Do not define BYTES_IN_WORD.
* elf32-hppa.h (hppa_reloc_field_selector_type): Delete now lives in libhppa.h.
(hppa_reloc_field_selector_type_alt): Likewise.
* elf32-hppa.c (hppa_elf_relocate_unwind_table): Delete unused variables.
(elf_hppa_reloc_type_lookup): Likewise.
(elf_hppa_tc_make_sections): Likewise.
(hppa_elf_arg_reloc_needed_p): Likewise.
(hppa_elf_build_long_branch_stub): Likewise.
(elf_reloc_map): Delete, no longer used.
(elf_hppa_reloc_map): Likewise.
(elf32_hppa_symextn_map_max_size): Likewise.
(elf32_hppa_get_sym_extn): Abort if type is bogus.
* elf32-hppa.c (elf32_hppa_backend_fake_sections): Add processing
of the .hppa_unwind section.
Diffstat (limited to 'bfd/libhppa.h')
-rw-r--r-- | bfd/libhppa.h | 454 |
1 files changed, 280 insertions, 174 deletions
diff --git a/bfd/libhppa.h b/bfd/libhppa.h index cf69813..14c8899 100644 --- a/bfd/libhppa.h +++ b/bfd/libhppa.h @@ -4,213 +4,319 @@ Contributed by the Center for Software Science at the University of Utah (pa-gdb-bugs@cs.utah.edu). -This file is part of BFD, the Binary File Descriptor library. + This file is part of BFD, the Binary File Descriptor library. -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -#ifndef _LIBHPPA_H -#define _LIBHPPA_H +#ifndef _HPPA_H +#define _HPPA_H -#include "../bfd/sysdep.h" - -#ifdef HOST_HPPAHPUX - -#include <sys/core.h> -#include <sys/utsname.h> +#define BYTES_IN_WORD 4 -#endif /* HOST_HPPAHPUX */ +#ifndef INLINE +#ifdef __GNUC__ +#define INLINE inline +#else +#define INLINE +#endif /* GNU C? */ +#endif /* INLINE */ -#ifdef HOST_HPPABSD +/* HP PA-RISC relocation types */ -/* BSD uses a completely different scheme for object file identification. - so for now, define _PA_RISC_ID to accept any random value for a model - number. */ +enum hppa_reloc_field_selector_type + { + R_HPPA_FSEL = 0x0, + R_HPPA_LSSEL = 0x1, + R_HPPA_RSSEL = 0x2, + R_HPPA_LSEL = 0x3, + R_HPPA_RSEL = 0x4, + R_HPPA_LDSEL = 0x5, + R_HPPA_RDSEL = 0x6, + R_HPPA_LRSEL = 0x7, + R_HPPA_RRSEL = 0x8, + R_HPPA_PSEL = 0x9, + R_HPPA_LPSEL = 0xa, + R_HPPA_RPSEL = 0xb, + R_HPPA_TSEL = 0xc, + R_HPPA_LTSEL = 0xd, + R_HPPA_RTSEL = 0xe + }; -#include <a.out.h> +/* for compatibility */ +enum hppa_reloc_field_selector_type_alt + { + e_fsel = R_HPPA_FSEL, + e_lssel = R_HPPA_LSSEL, + e_rssel = R_HPPA_RSSEL, + e_lsel = R_HPPA_LSEL, + e_rsel = R_HPPA_RSEL, + e_ldsel = R_HPPA_LDSEL, + e_rdsel = R_HPPA_RDSEL, + e_lrsel = R_HPPA_LRSEL, + e_rrsel = R_HPPA_RRSEL, + e_psel = R_HPPA_PSEL, + e_lpsel = R_HPPA_LPSEL, + e_rpsel = R_HPPA_RPSEL, + e_tsel = R_HPPA_TSEL, + e_ltsel = R_HPPA_LTSEL, + e_rtsel = R_HPPA_RTSEL + }; -/* Not a very swift place to put it, but that's where the BSD port - puts them. */ -#include "/hpux/usr/include/sys/core.h" -#ifndef _PA_RISC_ID -#define _PA_RISC_ID(__m_num) 1 -#endif +enum hppa_reloc_expr_type + { + R_HPPA_E_ONE = 0, + R_HPPA_E_TWO = 1, + R_HPPA_E_PCREL = 2, + R_HPPA_E_CON = 3, + R_HPPA_E_PLABEL = 7, + R_HPPA_E_ABS = 18 + }; -#endif /* HOST_HPPABSD */ +/* for compatibility */ +enum hppa_reloc_expr_type_alt + { + e_one = R_HPPA_E_ONE, + e_two = R_HPPA_E_TWO, + e_pcrel = R_HPPA_E_PCREL, + e_con = R_HPPA_E_CON, + e_plabel = R_HPPA_E_PLABEL, + e_abs = R_HPPA_E_ABS + }; + + +/* Some functions to manipulate PA instructions. */ +static INLINE unsigned int +assemble_3 (x) + unsigned int x; +{ + return (((x & 1) << 2) | ((x & 6) >> 1)) & 7; +} -/* Defining MAXCOMLEN avoids bringing in several (7 or 8) otherwise - useless include files which tend to clutter up the namespace. */ +static INLINE void +dis_assemble_3 (x, r) + unsigned int x; + unsigned int *r; +{ + *r = (((x & 4) >> 2) | ((x & 3) << 1)) & 7; +} -#define MAXCOMLEN 16 +static INLINE unsigned int +assemble_12 (x, y) + unsigned int x, y; +{ + return (((y & 1) << 11) | ((x & 1) << 10) | ((x & 0x7fe) >> 1)) & 0xfff; +} -#define BYTES_IN_WORD 4 +static INLINE void +dis_assemble_12 (as12, x, y) + unsigned int as12; + unsigned int *x, *y; +{ + *y = (as12 & 0x800) >> 11; + *x = ((as12 & 0x3ff) << 1) | ((as12 & 0x400) >> 10); +} -struct header; -struct som_exec_auxhdr; -struct subspace_dictionary; +static INLINE unsigned long +assemble_17 (x, y, z) + unsigned int x, y, z; +{ + unsigned long temp; + + temp = ((z & 1) << 16) | + ((x & 0x1f) << 11) | + ((y & 1) << 10) | + ((y & 0x7fe) >> 1); + return temp & 0x1ffff; +} + +static INLINE void +dis_assemble_17 (as17, x, y, z) + unsigned int as17; + unsigned int *x, *y, *z; +{ -#define FILE_HDR_SIZE sizeof(struct header) -#define AUX_HDR_SIZE sizeof(struct som_exec_auxhdr) + *z = (as17 & 0x10000) >> 16; + *x = (as17 & 0x0f800) >> 11; + *y = (((as17 & 0x00400) >> 10) | ((as17 & 0x3ff) << 1)) & 0x7ff; +} -typedef struct hppa_symbol +static INLINE unsigned long +assemble_21 (x) + unsigned int x; { - asymbol symbol; - short desc; - char other; - unsigned char type; -} hppa_symbol_type; - -struct hppadata + unsigned long temp; + + temp = ((x & 1) << 20) | + ((x & 0xffe) << 8) | + ((x & 0xc000) >> 7) | + ((x & 0x1f0000) >> 14) | + ((x & 0x003000) >> 12); + return temp & 0x1fffff; +} + +static INLINE void +dis_assemble_21 (as21, x) + unsigned int as21, *x; { - struct header *file_hdr; - struct som_exec_auxhdr *aux_hdr; - hppa_symbol_type *symbols; + unsigned long temp; - /* We remember these offsets so that after check_file_format, we have - no dependencies on the particular format of the exec_hdr. */ - file_ptr sym_filepos; - file_ptr str_filepos; + temp = (as21 & 0x100000) >> 20; + temp |= (as21 & 0x0ffe00) >> 8; + temp |= (as21 & 0x000180) << 7; + temp |= (as21 & 0x00007c) << 14; + temp |= (as21 & 0x000003) << 12; + *x = temp; +} - unsigned stringtab_size; +static INLINE unsigned long +sign_ext (x, len) + unsigned int x, len; +{ + return (x << (32 - len)) >> (32 - len); +} - /* Size of a symbol table entry in external form */ - unsigned hp_symbol_entry_size; -}; +static INLINE unsigned int +ones (n) + int n; +{ + unsigned int len_ones; + int i; + + i = 0; + len_ones = 0; + while (i < n) + { + len_ones = (len_ones << 1) | 1; + i++; + } + + return len_ones; +} + +static INLINE void +sign_unext (x, len, result) + unsigned int x, len; + unsigned int *result; +{ + unsigned int len_ones; -struct hppa_data_struct { - struct hppadata a; -}; + len_ones = ones (len); -#define padata(bfd) ((bfd)->tdata.hppa_data->a) -#define obj_file_hdr(bfd) (padata(bfd).file_hdr) -#define obj_aux_hdr(bfd) (padata(bfd).aux_hdr) -#define obj_pa_symbols(bfd) (padata(bfd).symbols) -#define obj_sym_filepos(bfd) (padata(bfd).sym_filepos) -#define obj_str_filepos(bfd) (padata(bfd).str_filepos) -#define obj_stringtab_size(bfd) (padata(bfd).stringtab_size) + *result = x & len_ones; +} -/* We take the address of the first element of an asymbol to ensure that the - macro is only ever applied to an asymbol */ -#define hppa_symbol(asymbol) ((hppa_symbol_type *)(&(asymbol)->the_bfd)) +static INLINE unsigned long +low_sign_ext (x, len) + unsigned int x, len; +{ + unsigned int temp1, temp2; + unsigned int len_ones; + len_ones = ones (len); -/* These are stored in the bfd's tdata */ + temp1 = (x & 1) << (len - 1); + temp2 = ((x & 0xfffffffe) & len_ones) >> 1; + return sign_ext ((temp1 | temp2), len); +} -struct hppa_core_struct +static INLINE void +low_sign_unext (x, len, result) + unsigned int x, len; + unsigned int *result; { - int sig; - char cmd[MAXCOMLEN + 1]; - asection *data_section; - asection *stack_section; - asection *reg_section; -}; - -#define core_hdr(bfd) ((bfd)->tdata.hppa_core_data) -#define core_signal(bfd) (core_hdr(bfd)->sig) -#define core_command(bfd) (core_hdr(bfd)->cmd) -#define core_datasec(bfd) (core_hdr(bfd)->data_section) -#define core_stacksec(bfd) (core_hdr(bfd)->stack_section) -#define core_regsec(bfd) (core_hdr(bfd)->reg_section) + unsigned int temp; + unsigned int sign; + unsigned int rest; + unsigned int one_bit_at_len; + unsigned int len_ones; -/* HP PA-RISC relocation types */ + len_ones = ones (len); + one_bit_at_len = 1 << (len - 1); -enum hppa_reloc_field_selector_type -{ - R_HPPA_FSEL = 0x0, - R_HPPA_LSSEL = 0x1, - R_HPPA_RSSEL = 0x2, - R_HPPA_LSEL = 0x3, - R_HPPA_RSEL = 0x4, - R_HPPA_LDSEL = 0x5, - R_HPPA_RDSEL = 0x6, - R_HPPA_LRSEL = 0x7, - R_HPPA_RRSEL = 0x8, - R_HPPA_PSEL = 0x9, /* P' : procedure address for shlib's */ - R_HPPA_LPSEL = 0xa, /* LP' : L' for procedure addresses */ - R_HPPA_RPSEL = 0xb, /* RP' : R' for procedure addresses */ - - R_HPPA_TSEL = 0xc, /* T' : DLT-relative offset for shlib's */ - R_HPPA_LTSEL = 0xd, /* LT' : L' for DLT-relative offsets */ - R_HPPA_RTSEL = 0xe /* RT' : R' for DLT-relative offsets */ - -}; - -/* Need to undefine things defined in <machine/som.h> */ - -#undef e_fsel -#undef e_lssel -#undef e_rssel -#undef e_lsel -#undef e_rsel -#undef e_ldsel -#undef e_rdsel -#undef e_lrsel -#undef e_rrsel -#undef e_psel -#undef e_lpsel -#undef e_rpsel -#undef e_tsel -#undef e_ltsel -#undef e_rtsel -#undef e_one -#undef e_two -#undef e_pcrel -#undef e_con -#undef e_plabel -#undef e_abs + sign_unext (x, len, &temp); + sign = temp & one_bit_at_len; + sign >>= (len - 1); -/* for compatibility */ -enum hppa_reloc_field_selector_type_alt -{ - e_fsel = R_HPPA_FSEL, - e_lssel = R_HPPA_LSSEL, - e_rssel = R_HPPA_RSSEL, - e_lsel = R_HPPA_LSEL, - e_rsel = R_HPPA_RSEL, - e_ldsel = R_HPPA_LDSEL, - e_rdsel = R_HPPA_RDSEL, - e_lrsel = R_HPPA_LRSEL, - e_rrsel = R_HPPA_RRSEL, - e_psel = R_HPPA_PSEL, /* P' : procedure address for shlib's */ - e_lpsel = R_HPPA_LPSEL, /* LP' : L' for procedure addresses */ - e_rpsel = R_HPPA_RPSEL, /* RP' : R' for procedure addresses */ - - e_tsel = R_HPPA_TSEL, /* T' : DLT-relative offset for shlib's */ - e_ltsel = R_HPPA_LTSEL, /* LT' : L' for DLT-relative offsets */ - e_rtsel = R_HPPA_RTSEL /* RT' : R' for DLT-relative offsets */ -}; + rest = temp & (len_ones ^ one_bit_at_len); + rest <<= 1; -enum hppa_reloc_expr_type -{ - R_HPPA_E_ONE = 0, - R_HPPA_E_TWO = 1, - R_HPPA_E_PCREL = 2, - R_HPPA_E_CON = 3, - R_HPPA_E_PLABEL = 7, - R_HPPA_E_ABS = 18 -}; + *result = rest | sign; +} -/* for compatibility */ -enum hppa_reloc_expr_type_alt +/* Handle field selectors for PA instructions. */ + +static INLINE unsigned long +hppa_field_adjust (value, constant_value, r_field) + unsigned long value; + unsigned long constant_value; + unsigned short r_field; { - e_one = R_HPPA_E_ONE, - e_two = R_HPPA_E_TWO, - e_pcrel = R_HPPA_E_PCREL, - e_con = R_HPPA_E_CON, - e_plabel = R_HPPA_E_PLABEL, - e_abs = R_HPPA_E_ABS -}; - -#endif /* _LIBHPPA_H */ + unsigned long init_value = value; + value += constant_value; + switch (r_field) + { + case e_fsel: /* F : no change */ + break; + + case e_lssel: /* LS : if (bit 21) then add 0x800 + arithmetic shift right 11 bits */ + if (value & 0x00000400) + value += 0x800; + value = (value & 0xfffff800) >> 11; + break; + + case e_rssel: /* RS : Sign extend from bit 21 */ + if (value & 0x00000400) + value |= 0xfffff800; + else + value &= 0x7ff; + break; + + case e_lsel: /* L : Arithmetic shift right 11 bits */ + value = (value & 0xfffff800) >> 11; + break; + + case e_rsel: /* R : Set bits 0-20 to zero */ + value = value & 0x7ff; + break; + + case e_ldsel: /* LD : Add 0x800, arithmetic shift + right 11 bits */ + value += 0x800; + value = (value & 0xfffff800) >> 11; + break; + + case e_rdsel: /* RD : Set bits 0-20 to one */ + value |= 0xfffff800; + break; + + case e_lrsel: /* LR : L with "rounded" constant */ + value = value + ((constant_value + 0x1000) & 0xffffe000); + value = (value & 0xfffff800) >> 11; + break; + + case e_rrsel: /* RR : R with "rounded" constant */ + value = value + ((constant_value + 0x1000) & 0xffffe000); + value = (value & 0x7ff) + constant_value - ((constant_value + 0x1000) & 0xffffe000); + break; + + default: + abort (); + } + return value; + +} +#endif /* _HPPA_H */ |