diff options
author | Catherine Moore <clm@redhat.com> | 1998-10-20 01:26:55 +0000 |
---|---|---|
committer | Catherine Moore <clm@redhat.com> | 1998-10-20 01:26:55 +0000 |
commit | 7e2014e09279cf5a705995c16ab32e4915eb8192 (patch) | |
tree | 71f09c8c0da133dd58b4fcfba67bb5c1edc12b66 /gas | |
parent | 9c5da58d59debd09074cac2b1e89975edae38c35 (diff) | |
download | gdb-7e2014e09279cf5a705995c16ab32e4915eb8192.zip gdb-7e2014e09279cf5a705995c16ab32e4915eb8192.tar.gz gdb-7e2014e09279cf5a705995c16ab32e4915eb8192.tar.bz2 |
* 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.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 8 | ||||
-rw-r--r-- | gas/config/tc-sh.c | 34 | ||||
-rw-r--r-- | gas/config/tc-sh.h | 115 |
3 files changed, 134 insertions, 23 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index b9cd9d3..6ca1306 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +Mon Oct 19 20:20:42 1998 Catherine Moore <clm@cygnus.com> + + * 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 <devans@seba.cygnus.com> * 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 9390b9b..b3b03b4 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 2452444..df41a0f 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 */ |