From 7e2014e09279cf5a705995c16ab32e4915eb8192 Mon Sep 17 00:00:00 2001 From: Catherine Moore Date: Tue, 20 Oct 1998 01:26:55 +0000 Subject: [PATCH] * config/tc-sh.h (obj_fix_adjustable): Define. * config/tc-sh.c (sh_force_relocation): Handle VT relocs. (md_apply_fix): Likewise. (tc_gen_reloc): Likewise. (sh_fix_adjustable): New. --- gas/ChangeLog | 8 ++++ gas/config/tc-sh.c | 34 ++++++++++++++ gas/config/tc-sh.h | 115 ++++++++++++++++++++++++++++++++++++--------- 3 files changed, 134 insertions(+), 23 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index b9cd9d36eb6..6ca130691c1 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +Mon Oct 19 20:20:42 1998 Catherine Moore + + * config/tc-sh.h (obj_fix_adjustable): Define. + * config/tc-sh.c (sh_force_relocation): Handle VT relocs. + (md_apply_fix): Likewise. + (tc_gen_reloc): Likewise. + (sh_fix_adjustable): New. + Mon Oct 19 12:35:43 1998 Doug Evans * cgen.c (gas_cgen_finish_insn): Update handling of CGEN_INT_INSN_P. diff --git a/gas/config/tc-sh.c b/gas/config/tc-sh.c index 9390b9b3b53..b3b03b40bbd 100644 --- a/gas/config/tc-sh.c +++ b/gas/config/tc-sh.c @@ -1842,6 +1842,11 @@ int sh_force_relocation (fix) fixS *fix; { + + if (fix->fx_r_type == BFD_RELOC_VTABLE_INHERIT + || fix->fx_r_type == BFD_RELOC_VTABLE_ENTRY) + return 1; + if (! sh_relax) return 0; @@ -1853,6 +1858,27 @@ sh_force_relocation (fix) || fix->fx_r_type == BFD_RELOC_SH_DATA || fix->fx_r_type == BFD_RELOC_SH_LABEL); } +boolean +sh_fix_adjustable (fixP) + fixS *fixP; +{ + + if (fixP->fx_addsy == NULL) + return 1; + + /* Prevent all adjustments to global symbols. */ + if (S_IS_EXTERN (fixP->fx_addsy)) + return 0; + if (S_IS_WEAK (fixP->fx_addsy)) + return 0; + + /* We need the symbol name for the VTABLE entries */ + if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT + || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY) + return 0; + + return 1; +} /* Apply a fixup to the object file. */ @@ -2030,6 +2056,11 @@ md_apply_fix (fixP, val) /* Nothing to do here. */ break; + case BFD_RELOC_VTABLE_INHERIT: + case BFD_RELOC_VTABLE_ENTRY: + fixP->fx_done = 0; + return 1; + default: abort (); } @@ -2372,6 +2403,9 @@ tc_gen_reloc (section, fixp) rel->addend = fixp->fx_offset; else if (r_type == BFD_RELOC_SH_ALIGN) rel->addend = fixp->fx_offset; + else if (r_type == BFD_RELOC_VTABLE_INHERIT + || r_type == BFD_RELOC_VTABLE_ENTRY) + rel->addend = fixp->fx_offset; else if (fixp->fx_pcrel) rel->addend = fixp->fx_addnumber; else diff --git a/gas/config/tc-sh.h b/gas/config/tc-sh.h index 2452444e670..df41a0fcd6c 100644 --- a/gas/config/tc-sh.h +++ b/gas/config/tc-sh.h @@ -1,6 +1,5 @@ /* This file is tc-sh.h - - Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc. + Copyright (C) 1993, 94, 95, 96, 97, 1998 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -21,18 +20,31 @@ #define TC_SH -/* This macro translates between an internal fix and an coff reloc type */ -#define TC_COFF_FIX2RTYPE(fix) ((fix)->fx_r_type) +#define TARGET_BYTES_BIG_ENDIAN 0 -#define BFD_ARCH bfd_arch_sh +#define TARGET_ARCH bfd_arch_sh -extern int shl; +#if ANSI_PROTOTYPES +struct segment_info_struct; +struct internal_reloc; +#endif -#define COFF_MAGIC (shl ? SH_ARCH_MAGIC_LITTLE : SH_ARCH_MAGIC_BIG) +/* Whether in little endian mode. */ +extern int shl; /* Whether -relax was used. */ extern int sh_relax; +/* Whether -small was used. */ +extern int sh_small; + +/* Don't try to break words. */ +#define WORKING_DOT_WORD + +/* We require .long, et. al., to be aligned correctly. */ +#define md_cons_align(nbytes) sh_cons_align (nbytes) +extern void sh_cons_align PARAMS ((int)); + /* When relaxing, we need to generate relocations for alignment directives. */ #define HANDLE_ALIGN(frag) sh_handle_align (frag) @@ -41,40 +53,97 @@ extern void sh_handle_align PARAMS ((fragS *)); /* We need to force out some relocations when relaxing. */ #define TC_FORCE_RELOCATION(fix) sh_force_relocation (fix) extern int sh_force_relocation (); +#define obj_fix_adjustable(fixP) sh_fix_adjustable(fixP) + +#define IGNORE_NONSTANDARD_ESCAPES + +#define LISTING_HEADER (shl ? "Hitachi Super-H GAS Little Endian" : "Hitachi Super-H GAS Big Endian") + +#define md_operand(x) + +extern const struct relax_type md_relax_table[]; +#define TC_GENERIC_RELAX_TABLE md_relax_table + +/* We use a special alignment function to insert the correct nop + pattern. */ +extern int sh_do_align PARAMS ((int, const char *, int, int)); +#define md_do_align(n,fill,len,max,l) if (sh_do_align (n,fill,len,max)) goto l + +/* We record, for each section, whether we have most recently output a + CODE reloc or a DATA reloc. */ +struct sh_segment_info_type +{ + int in_code : 1; +}; +#define TC_SEGMENT_INFO_TYPE struct sh_segment_info_type + +/* We call a routine to emit a reloc for a label, so that the linker + can align loads and stores without crossing a label. */ +extern void sh_frob_label PARAMS ((void)); +#define tc_frob_label(sym) sh_frob_label () + +/* We call a routine to flush pending output in order to output a DATA + reloc when required. */ +extern void sh_flush_pending_output PARAMS ((void)); +#define md_flush_pending_output() sh_flush_pending_output () + +#ifdef BFD_ASSEMBLER +#define tc_frob_file_before_adjust sh_frob_file +#else +#define tc_frob_file sh_frob_file +#endif +extern void sh_frob_file PARAMS ((void)); + +#ifdef OBJ_COFF +/* COFF specific definitions. */ + +#define DO_NOT_STRIP 0 + +/* This macro translates between an internal fix and an coff reloc type */ +#define TC_COFF_FIX2RTYPE(fix) ((fix)->fx_r_type) + +#define BFD_ARCH TARGET_ARCH + +#define COFF_MAGIC (shl ? SH_ARCH_MAGIC_LITTLE : SH_ARCH_MAGIC_BIG) /* We need to write out relocs which have not been completed. */ #define TC_COUNT_RELOC(fix) ((fix)->fx_addsy != NULL) #define TC_RELOC_MANGLE(seg, fix, int, paddr) \ sh_coff_reloc_mangle ((seg), (fix), (int), (paddr)) -extern void sh_coff_reloc_mangle (); - -#define IGNORE_NONSTANDARD_ESCAPES +extern void sh_coff_reloc_mangle + PARAMS ((struct segment_info_struct *, struct fix *, + struct internal_reloc *, unsigned int)); #define tc_coff_symbol_emit_hook(a) ; /* not used */ -#define DO_NOT_STRIP 0 -#define DO_STRIP 0 -#define LISTING_HEADER (shl ? "Hitachi Super-H GAS Little Endian" : "Hitachi Super-H GAS Big Endian") #define NEED_FX_R_TYPE 1 -#define RELOC_32 1234 #define TC_KEEP_FX_OFFSET 1 #define TC_COFF_SIZEMACHDEP(frag) tc_coff_sizemachdep(frag) extern int tc_coff_sizemachdep PARAMS ((fragS *)); -#define md_operand(x) +/* We align most sections to a 16 byte boundary. */ +#define SUB_SEGMENT_ALIGN(SEG) \ + (strncmp (obj_segment_name (SEG), ".stabstr", 8) == 0 \ + ? 0 \ + : ((strncmp (obj_segment_name (SEG), ".stab", 5) == 0 \ + || strcmp (obj_segment_name (SEG), ".ctors") == 0 \ + || strcmp (obj_segment_name (SEG), ".dtors") == 0) \ + ? 2 \ + : (sh_small ? 2 : 4))) -extern const struct relax_type md_relax_table[]; -#define TC_GENERIC_RELAX_TABLE md_relax_table +#endif /* OBJ_COFF */ -#define tc_frob_file sh_coff_frob_file -extern void sh_coff_frob_file PARAMS (()); +#ifdef OBJ_ELF +/* ELF specific definitions. */ -/* We use a special alignment function to insert the correct nop - pattern. */ -extern int sh_do_align PARAMS ((int, const char *)); -#define md_do_align(n,fill,l) if (sh_do_align (n,fill)) goto l +/* Whether or not the target is big endian */ +extern int target_big_endian; + +#define TARGET_FORMAT (shl ? "elf32-shl" : "elf32-sh") + +#endif /* OBJ_ELF */ /* end of tc-sh.h */ -- 2.30.2