Merged in changes from Jeff Law and Pete Hoogenboom at Utah for PA ELF

support.  Compiles, not particularly well tested.  See ChangeLog for details.
This commit is contained in:
Ken Raeburn 1993-08-25 01:15:07 +00:00
parent 4346166b07
commit e2a422b84c
6 changed files with 175 additions and 4 deletions

View file

@ -1,3 +1,109 @@
Tue Aug 24 16:32:35 1993 Ken Raeburn (raeburn@cambridge.cygnus.com)
Merged changes from Jeff Law and Pete Hoogenboom at Utah:
* elfcode.h (elf_section_from_bfd_section): Add detection of
SHT_NOTE sections.
* elf32-hppa.c:
(hppa_elf_build_long_branch_stub,hppa_elf_long_branch_needed_p):
New functions for support of long branch stubs.
(hppa_elf_stub_check,hppa_look_for_stubs_in_section): Add
check for long branch stubs.
(hppa_look_for_stubs): Unused function. Removed.
(hppa_elf_set_section_contents): Implement a PA/ELF-specific
version of bfd_set_section_contents.
(hppa_elf_long_branch_needed_p): Only output debugging diagnostics
when BFD is configured for debugging.
* elf32-hppa.c: (elf32_hppa_get_symextn_chain): New function
to return a list of symbols that have non-zero argument
relocation bits.
(hppa_elf_stub_finish): Make sure stub generation is done only
once.
* elf32-hppa.c: (hppa_elf_stub_reloc): New function for
generation relocation entries within a stub.
(hppa_elf_build_arg_reloc_stub): Corrections to argument
relocation stubs.
* elf32-hppa.c: New #define's for argument relocation types.
(mismatches, retval_mismatches): Updated to reflect new
argument relocation types.
(CURRENT_STUB_OFFSET): New macro.
* elfcode.h (map_program_segments): Set the PF_X bit for data
segments.
* elf32-hppa.c: (elf_hppa_howto_table): Add
R_HPPA_STUB_CALL_17 for support of linker stub generation.
(hppa_elf_reloc): Add support of R_HPPA_STUB_CALL_17
relocation type.
* elf32-hppa.h: (elf32_hppa_reloc_type): Add
R_HPPA_STUB_CALL_17 for support of linker stub generation.
* hppa_stubs.h: Add new instructions that are used in linker
stub generation.
* elf32-hppa.c (hppa_elf_relocate_unwind_table): The offsets in an
unwind descriptor were incorrect.
* libelf.h (bfd_elf_find_section): Declare.
* elf32-hppa.c: (elf32_hppa_backend_symbol_processing): New
function in place of global_sym field in elf_backend_data
structure.
(elf32_hppa_backend_symbol_table_processing,
elf32_hppa_backend_section_processing,
elf32_hppa_backend_fake_sections,
elf32_hppa_backend_section_from_shdr,
elf32_hppa_backend_section_from_bfd_section): New functions to
provide support of symbol extension sections and argument
relocation stubs.
(elf_info_to_howto): Remove call to abort().
* elf32-target.h: Support for special processing by the backend.
(struct elf_backend_data): Added elf_backend_symbol_processing,
elf_backend_symbol_table_processing,
elf_backend_section_processing, elf_backend_section_from_shdr,
elf_backend_fake_sections, and
elf_backend_section_from_bfd_section fields.
* elfcode.h: (bfd_section_from_shdr): Add a check for
processor-specific section types.
(elf_fake_sections): Add a check for processor-specific
section types.
(bfd_elf32_write_object_contents): Add a check to see if
there is any final section processing to be done by the
backend.
(elf_section_from_bfd_section): Add a check for
processor-specific section types.
(elf_slurp_symbol_table): Remove reference to global_sym in the
elf_backend_data structure. Replace it with a call to
elf_backend_symbol_processing.
* libelf.h: Remove global_sym field in the elf_backend_data
structure. Replace it with a series of backend-specific
functions.
* elf32-hppa.c (hppa_elf_stub_branch_reloc): The formal argument
stub_sym should be called target_sym.
(hppa_elf_build_arg_reloc_stub): Refer to the stub bfd (abfd)
rather than the output bfd (output_bfd).
(hppa_elf_reloc): Get rid of references to the global_sym field in
the elf_backend_data structure.
* elfcode.h (elf_fake_sections): Check the correct condition for
.bss. Also, detect the existence of a .note section.
* elf32-hppa.c (hppa_elf_relocate_insn): r_format argument should
have been r_field.
* hosts/hppabsd.h (HOST_MACHINE_ARCH): Reference to bfd_arch_m68k
should be a reference to bfd_arch_hppa.
* hppa.c (hppa_vec): Replace bfd_false with _bfd_dummy_target in
the bfd_check_format structure to avoid a type mismatch.
Mon Aug 23 1993 Sean Fagan (sef@cygnus.com)
and Jim Kingdon (kingdon@cygnus.com)

View file

@ -59,6 +59,25 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#define ELF_MAXPAGESIZE 1
#endif
#ifndef elf_backend_symbol_processing
#define elf_backend_symbol_processing 0 /* elf_backend_symbol_processing */
#endif
#ifndef elf_backend_symbol_table_processing
#define elf_backend_symbol_table_processing 0 /* elf_backend_symbol_table_processing */
#endif
#ifndef elf_backend_section_processing
#define elf_backend_section_processing 0 /* elf_backend_section_processing */
#endif
#ifndef elf_backend_section_from_shdr
#define elf_backend_section_from_shdr 0 /* elf_backend_section_from_shdr */
#endif
#ifndef elf_backend_fake_sections
#define elf_backend_fake_sections 0 /* elf_backend_fake_sections */
#endif
#ifndef elf_backend_section_from_bfd_section
#define elf_backend_section_from_bfd_section 0 /* elf_backend_section_from_bfd_section */
#endif
static CONST struct elf_backend_data elf32_bed =
{
#ifdef USE_REL
@ -72,6 +91,12 @@ static CONST struct elf_backend_data elf32_bed =
elf_info_to_howto_rel, /* elf_info_to_howto_rel */
ELF_MAXPAGESIZE, /* maxpagesize */
bfd_elf32__write_relocs, /* write_relocs */
elf_backend_symbol_processing, /* elf_backend_symbol_processing */
elf_backend_symbol_table_processing, /* elf_backend_symbol_table_processing */
elf_backend_section_processing, /* elf_backend_section_processing */
elf_backend_section_from_shdr, /* elf_backend_section_from_shdr */
elf_backend_fake_sections, /* elf_backend_fake_sections */
elf_backend_section_from_bfd_section, /* elf_backend_section_from_bfd_section */
};
#ifdef TARGET_BIG_SYM

View file

@ -26,7 +26,7 @@ extern void free PARAMS ((PTR));
#define HOST_PAGE_SIZE NBPG
#define HOST_SEGMENT_SIZE NBPG /* Data seg start addr rounds to NBPG */
#define HOST_MACHINE_ARCH bfd_arch_m68k
#define HOST_MACHINE_ARCH bfd_arch_hppa
/* #define HOST_MACHINE_MACHINE */
#define HOST_TEXT_START_ADDR UTEXTSEG

View file

@ -940,7 +940,7 @@ bfd_target hppa_vec =
{_bfd_dummy_target,
hppa_object_p, /* bfd_check_format */
bfd_generic_archive_p,
bfd_false
_bfd_dummy_target
},
{
bfd_false,

View file

@ -10,20 +10,33 @@
#define STWS_ARG1_M8SP 0x0fd91291 /* stws arg1,-8(sp) */
#define STWS_ARG2_M8SP 0x0fd81291 /* stws arg2,-8(sp) */
#define STWS_ARG3_M8SP 0x0fd71291 /* stws arg3,-8(sp) */
#define STWS_ARG0_M4SP 0x0fda1299 /* stws arg0,-4(sp) */
#define STWS_ARG2_M4SP 0x0fd81299 /* stws arg2,-4(sp) */
#define FSTWS_FARG0_M8SP 0x27d11204 /* fstws farg0,-8(sp) */
#define FSTWS_FARG1_M8SP 0x27d11205 /* fstws farg1,-8(sp) */
#define FSTWS_FARG2_M8SP 0x27d11206 /* fstws farg2,-8(sp) */
#define FSTWS_FARG3_M8SP 0x27d11207 /* fstws farg3,-8(sp) */
#define FSTDS_FARG1_M8SP 0x2fd11205 /* fstds farg1,-8(sp) */
#define FSTDS_FARG3_M8SP 0x2fd11207 /* fstds farg3,-8(sp) */
#define STWS_RET0_M8SP 0x0fda1291 /* stws arg0,-8(sp) */
#define FSTWS_FRET0_M8SP 0x27d11204 /* fstws fret0,-8(sp) */
#define LDWS_M8SP_ARG0 0x0fd1109a /* ldws -8(sp),arg0 */
#define LDWS_M8SP_ARG1 0x0fd11099 /* ldws -8(sp),arg1 */
#define LDWS_M8SP_ARG2 0x0fd11098 /* ldws -8(sp),arg2 */
#define LDWS_M8SP_ARG3 0x0fd11097 /* ldws -8(sp),arg3 */
#define LDWS_M4SP_ARG0 0x0fd9109a /* ldws -4(sp),arg0 */
#define LDWS_M4SP_ARG1 0x0fd91099 /* ldws -4(sp),arg1 */
#define LDWS_M4SP_ARG2 0x0fd91098 /* ldws -4(sp),arg2 */
#define LDWS_M4SP_ARG3 0x0fd91097 /* ldws -4(sp),arg3 */
#define FLDWS_M8SP_FARG0 0x27d11004 /* fldws -8(sp),farg0 */
#define FLDWS_M8SP_FARG1 0x27d11005 /* fldws -8(sp),farg1 */
#define FLDWS_M8SP_FARG2 0x27d11006 /* fldws -8(sp),farg2 */
#define FLDWS_M8SP_FARG3 0x27d11007 /* fldws -8(sp),farg3 */
#define FLDDS_M8SP_FARG0 0x2fd11004 /* fldds -8(sp),farg0 */
#define FLDDS_M8SP_FARG1 0x2fd11005 /* fldds -8(sp),farg1 */
#define FLDDS_M8SP_FARG2 0x2fd11006 /* fldds -8(sp),farg2 */
#define FLDDS_M8SP_FARG3 0x2fd11007 /* fldds -8(sp),farg3 */
#define LDWS_M4SP_RET0 0x0fd9109c /* ldws -4(sp),ret0 */
#define LDWS_M8SP_RET0 0x0fd1109c /* ldws -8(sp),ret0 */
#define FLDWS_M8SP_FRET0 0x27d11004 /* fldws -8(sp),fret0 */
#define STWS_MA_ARG0_8SP 0x0fda12b0 /* stws,ma arg0,8(sp) */
@ -44,6 +57,26 @@
#define FLDWS_MB_M8SP_FARG3 0x27d13027 /* fldws,mb -8(sp),farg3 */
#define BL_XXX_RP 0xe8400000 /* bl 0,rp */
#define NOP 0x08000240 /* nop */
#define SUBI_8_SP 0x97de0010 /* subi 8,sp,sp */
#define STW_31_M24SP 0x6bdf3fd1 /* stw r31,-24(sr0,sp) */
#define LDW_M24SP_RP 0x4bc23fd1 /* ldw -24(sr0,sp),rp */
#define BE_XXX_0_0 0xe0000000 /* be 0(sr0,0) */
#define BE_N_XXX_0_0 0xe0000002 /* be,n 0(sr0,0) */
#define BLE_XXX_0_0 0xe4000000 /* ble 0(sr0,0) */
#define BLE_N_XXX_0_0 0xe4000002 /* ble,n 0(sr0,0) */
#define BLE_N_XXX_0_31 0xe7e00002 /* ble,n 0(sr0,r31) */
#define BLE_XXX_0_31 0xe7e00000 /* ble 0(sr0,r31) */
#define BE_N_XXX_0_31 0xe3e00002 /* be,n 0(sr0,r31) */
#define BE_N_XXX_0_RP 0xe0400002 /* be,n 0(sr0,rp) */
#define BE_XXX_0_RP 0xe0400000 /* be 0(sr0,rp) */
#define BLE_XXX_0_RP 0xe4400000 /* ble 0(sr0,rp) */
#define COPY_31_2 0x081f0242 /* copy r31,r2 */
#define LDIL_XXX_31 0x23e00000 /* ldil 0,r31 */
#define LDIL_XXX_RP 0x20400000 /* ldil 0,rp */
#define LDO_0_26_26 0x375a0000 /* ldo 0(r26),r26 */
#define LDSID_31_RP 0x03e010a2 /* ldsid (r31),rp */
#define MTSP_RP_SR0 0x00021820 /* mtsp rp,sr0 */
#define LDO_0_26_26 0x375a0000 /* ldo 0(r26),r26 */
#define ADDI_M8_SP 0xb7de07f1 /* addi -8,sp,sp */
#define LDW_M8SP_RP 0x4bc23ff1 /* ldw -8(sp),rp */
#define BV_N_0RP 0xe840c002 /* bv,n 0(rp) */
#define BV_N_0_26 0xeb40c002 /* bv,n 0(r26) */

View file

@ -95,7 +95,12 @@ struct elf_backend_data
the output BFD. If not, put a comment here explaining why. */
/* @@ Was pointer to elfNAME(symbol_type). This makes it size-
independent. */
PTR global_sym;
void (*elf_backend_symbol_processing) PARAMS ((bfd *, asymbol *));
boolean (*elf_backend_symbol_table_processing) PARAMS ((bfd *, elf32_symbol_type *, int));
boolean (*elf_backend_section_processing) PARAMS ((bfd *, Elf32_Internal_Shdr *));
boolean (*elf_backend_section_from_shdr) PARAMS ((bfd *, Elf32_Internal_Shdr *, char *));
boolean (*elf_backend_fake_sections) PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *));
boolean (*elf_backend_section_from_bfd_section) PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *));
};
struct elf_sym_extra
@ -193,6 +198,8 @@ extern bfd_reloc_status_type bfd_elf_generic_reloc PARAMS ((bfd *,
asection *,
bfd *));
extern boolean bfd_elf_mkobject PARAMS ((bfd *));
extern Elf_Internal_Shdr *bfd_elf_find_section PARAMS ((bfd *, char *));
extern boolean bfd_elf32_write_object_contents PARAMS ((bfd *));
extern boolean bfd_elf64_write_object_contents PARAMS ((bfd *));