diff options
Diffstat (limited to 'contrib/binutils/gas/config/tc-sparc.h')
-rw-r--r-- | contrib/binutils/gas/config/tc-sparc.h | 88 |
1 files changed, 69 insertions, 19 deletions
diff --git a/contrib/binutils/gas/config/tc-sparc.h b/contrib/binutils/gas/config/tc-sparc.h index bb09bd4..91fda22 100644 --- a/contrib/binutils/gas/config/tc-sparc.h +++ b/contrib/binutils/gas/config/tc-sparc.h @@ -1,5 +1,5 @@ /* tc-sparc.h - Macros and type defines for the sparc. - Copyright (C) 1989, 90-96, 97, 1998 Free Software Foundation, Inc. + Copyright (C) 1989, 90-96, 97, 98, 1999 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -35,19 +35,24 @@ struct frag; extern const char *sparc_target_format PARAMS ((void)); #define TARGET_FORMAT sparc_target_format () +#define RELOC_EXPANSION_POSSIBLE +#define MAX_RELOC_EXPANSION 2 + +#if 0 #ifdef TE_SPARCAOUT /* Bi-endian support may eventually be unconditional, but until things are working well it's only provided for targets that need it. */ #define SPARC_BIENDIAN #endif +#endif +/* Make it unconditional and check if -EL is valid after option parsing */ +#define SPARC_BIENDIAN #define WORKING_DOT_WORD -#define md_convert_frag(b,s,f) {as_fatal ("sparc convert_frag\n");} -#define md_create_long_jump(p,f,t,fr,s) as_fatal("sparc_create_long_jump") -#define md_create_short_jump(p,f,t,fr,s) as_fatal("sparc_create_short_jump") +#define md_convert_frag(b,s,f) {as_fatal (_("sparc convert_frag\n"));} #define md_estimate_size_before_relax(f,s) \ - (as_fatal("estimate_size_before_relax called"),1) + (as_fatal(_("estimate_size_before_relax called")),1) #define LISTING_HEADER "SPARC GAS " @@ -55,10 +60,10 @@ extern int sparc_pic_code; #define md_do_align(n, fill, len, max, around) \ if ((n) && (n) <= 10 && !need_pass_2 && !(fill) \ - && now_seg != data_section && now_seg != bss_section) \ + && subseg_text_p (now_seg)) \ { \ char *p; \ - p = frag_var (rs_align_code, 1024, 1, (relax_substateT) 1024, \ + p = frag_var (rs_align_code, 1 << n, 1, (relax_substateT) 1024, \ (symbolS *) 0, (offsetT) (n), (char *) 0); \ *p = 0x00; \ goto around; \ @@ -106,6 +111,11 @@ extern void sparc_handle_align PARAMS ((struct frag *)); #define RELOC_REQUIRES_SYMBOL #endif +#ifdef OBJ_ELF +#define TC_FORCE_RELOCATION(fixp) elf32_sparc_force_relocation(fixp) +extern int elf32_sparc_force_relocation PARAMS ((struct fix *)); +#endif + #define MD_APPLY_FIX3 #define TC_HANDLES_FX_DONE @@ -113,26 +123,45 @@ extern void sparc_handle_align PARAMS ((struct frag *)); /* Keep relocations against global symbols. Don't turn them into relocations against sections. This is required for the dynamic linker to operate properly. When generating PIC, we need to keep - any non PC relative reloc. */ + any non PC relative reloc. The PIC part of this test must be + parallel to the code in tc_gen_reloc which converts relocations to + GOT relocations. */ #define tc_fix_adjustable(FIX) \ (! S_IS_EXTERNAL ((FIX)->fx_addsy) \ && ! S_IS_WEAK ((FIX)->fx_addsy) \ + && (FIX)->fx_r_type != BFD_RELOC_VTABLE_INHERIT \ + && (FIX)->fx_r_type != BFD_RELOC_VTABLE_ENTRY \ && (! sparc_pic_code \ - || (FIX)->fx_pcrel \ - || ((FIX)->fx_subsy != NULL \ - && (S_GET_SEGMENT ((FIX)->fx_subsy) \ - == S_GET_SEGMENT ((FIX)->fx_addsy))) \ - || strchr (S_GET_NAME ((FIX)->fx_addsy), '\001') != NULL \ - || strchr (S_GET_NAME ((FIX)->fx_addsy), '\002') != NULL)) + || ((FIX)->fx_r_type != BFD_RELOC_HI22 \ + && (FIX)->fx_r_type != BFD_RELOC_LO10 \ + && (FIX)->fx_r_type != BFD_RELOC_SPARC13 \ + && ((FIX)->fx_r_type != BFD_RELOC_32_PCREL_S2 \ + || (S_IS_DEFINED ((FIX)->fx_addsy) \ + && ! S_IS_COMMON ((FIX)->fx_addsy) \ + && ! S_IS_EXTERNAL ((FIX)->fx_addsy) \ + && ! S_IS_WEAK ((FIX)->fx_addsy))) \ + && ((FIX)->fx_pcrel \ + || ((FIX)->fx_subsy != NULL \ + && (S_GET_SEGMENT ((FIX)->fx_subsy) \ + == S_GET_SEGMENT ((FIX)->fx_addsy))) \ + || S_IS_LOCAL ((FIX)->fx_addsy))))) + +/* Finish up the entire symtab. */ +#define tc_adjust_symtab() sparc_adjust_symtab () +extern void sparc_adjust_symtab PARAMS ((void)); #endif #ifdef OBJ_AOUT /* When generating PIC code, we must not adjust any reloc which will - turn into a reloc against the global offset table. */ -#define tc_fix_adjustable(FIX) \ - (! sparc_pic_code \ - || (FIX)->fx_pcrel \ - || (FIX)->fx_r_type == BFD_RELOC_16 \ + turn into a reloc against the global offset table, nor any reloc + which we will need if a symbol is overridden. */ +#define tc_fix_adjustable(FIX) \ + (! sparc_pic_code \ + || ((FIX)->fx_pcrel \ + && ((FIX)->fx_addsy == NULL \ + || (! S_IS_EXTERNAL ((FIX)->fx_addsy) \ + && ! S_IS_WEAK ((FIX)->fx_addsy)))) \ + || (FIX)->fx_r_type == BFD_RELOC_16 \ || (FIX)->fx_r_type == BFD_RELOC_32) #endif @@ -146,4 +175,25 @@ extern void sparc_md_end PARAMS ((void)); #endif +#define TC_CONS_FIX_NEW cons_fix_new_sparc +extern void cons_fix_new_sparc + PARAMS ((struct frag *, int, unsigned int, struct expressionS *)); + +#define TC_FIX_TYPE valueT + +#define TC_INIT_FIX_DATA(X) \ + do \ + { \ + (X)->tc_fix_data = 0; \ + } \ + while(0) + +#define TC_FIX_DATA_PRINT(FILE, FIXP) \ + do \ + { \ + fprintf((FILE), "addend2=%ld\n", \ + (unsigned long) (FIXP)->tc_fix_data); \ + } \ + while(0) + /* end of tc-sparc.h */ |