* 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.
This commit is contained in:
Catherine Moore
1998-10-20 01:26:55 +00:00
parent 9c5da58d59
commit 7e2014e092
3 changed files with 141 additions and 30 deletions

View File

@ -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> 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. * cgen.c (gas_cgen_finish_insn): Update handling of CGEN_INT_INSN_P.

View File

@ -1842,6 +1842,11 @@ int
sh_force_relocation (fix) sh_force_relocation (fix)
fixS *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) if (! sh_relax)
return 0; 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_DATA
|| fix->fx_r_type == BFD_RELOC_SH_LABEL); || 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. */ /* Apply a fixup to the object file. */
@ -2030,6 +2056,11 @@ md_apply_fix (fixP, val)
/* Nothing to do here. */ /* Nothing to do here. */
break; break;
case BFD_RELOC_VTABLE_INHERIT:
case BFD_RELOC_VTABLE_ENTRY:
fixP->fx_done = 0;
return 1;
default: default:
abort (); abort ();
} }
@ -2372,6 +2403,9 @@ tc_gen_reloc (section, fixp)
rel->addend = fixp->fx_offset; rel->addend = fixp->fx_offset;
else if (r_type == BFD_RELOC_SH_ALIGN) else if (r_type == BFD_RELOC_SH_ALIGN)
rel->addend = fixp->fx_offset; 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) else if (fixp->fx_pcrel)
rel->addend = fixp->fx_addnumber; rel->addend = fixp->fx_addnumber;
else else

View File

@ -1,6 +1,5 @@
/* This file is tc-sh.h /* This file is tc-sh.h
Copyright (C) 1993, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
Copyright (C) 1993, 1994, 1995 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler. This file is part of GAS, the GNU Assembler.
@ -21,18 +20,31 @@
#define TC_SH #define TC_SH
/* This macro translates between an internal fix and an coff reloc type */ #define TARGET_BYTES_BIG_ENDIAN 0
#define TC_COFF_FIX2RTYPE(fix) ((fix)->fx_r_type)
#define BFD_ARCH bfd_arch_sh #define TARGET_ARCH bfd_arch_sh
#if ANSI_PROTOTYPES
struct segment_info_struct;
struct internal_reloc;
#endif
/* Whether in little endian mode. */
extern int shl; extern int shl;
#define COFF_MAGIC (shl ? SH_ARCH_MAGIC_LITTLE : SH_ARCH_MAGIC_BIG)
/* Whether -relax was used. */ /* Whether -relax was used. */
extern int sh_relax; 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 /* When relaxing, we need to generate relocations for alignment
directives. */ directives. */
#define HANDLE_ALIGN(frag) sh_handle_align (frag) #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. */ /* We need to force out some relocations when relaxing. */
#define TC_FORCE_RELOCATION(fix) sh_force_relocation (fix) #define TC_FORCE_RELOCATION(fix) sh_force_relocation (fix)
extern int sh_force_relocation (); extern int sh_force_relocation ();
#define obj_fix_adjustable(fixP) sh_fix_adjustable(fixP)
/* 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 #define IGNORE_NONSTANDARD_ESCAPES
#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 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) #define md_operand(x)
extern const struct relax_type md_relax_table[]; extern const struct relax_type md_relax_table[];
#define TC_GENERIC_RELAX_TABLE md_relax_table #define TC_GENERIC_RELAX_TABLE md_relax_table
#define tc_frob_file sh_coff_frob_file
extern void sh_coff_frob_file PARAMS (());
/* We use a special alignment function to insert the correct nop /* We use a special alignment function to insert the correct nop
pattern. */ pattern. */
extern int sh_do_align PARAMS ((int, const char *)); extern int sh_do_align PARAMS ((int, const char *, int, int));
#define md_do_align(n,fill,l) if (sh_do_align (n,fill)) goto l #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
PARAMS ((struct segment_info_struct *, struct fix *,
struct internal_reloc *, unsigned int));
#define tc_coff_symbol_emit_hook(a) ; /* not used */
#define NEED_FX_R_TYPE 1
#define TC_KEEP_FX_OFFSET 1
#define TC_COFF_SIZEMACHDEP(frag) tc_coff_sizemachdep(frag)
extern int tc_coff_sizemachdep PARAMS ((fragS *));
/* 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)))
#endif /* OBJ_COFF */
#ifdef OBJ_ELF
/* ELF specific definitions. */
/* 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 */ /* end of tc-sh.h */