X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-hppa.h;h=ab54b4d095197f70441761c8ad5a582c82d29fa6;hb=7e9ad3a35cde2342e07c34345d5ee671ea8aeeb4;hp=ea1ce9cc930a154f558f649b8c7e759533e596b8;hpb=502b19cb2a782d3d866874f4861a635d0706e938;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/config/tc-hppa.h b/gas/config/tc-hppa.h index ea1ce9cc93..ab54b4d095 100644 --- a/gas/config/tc-hppa.h +++ b/gas/config/tc-hppa.h @@ -1,12 +1,11 @@ /* tc-hppa.h -- Header file for the PA - Copyright 1989, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002 - Free Software Foundation, Inc. + Copyright (C) 1989-2019 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. GAS is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 1, or (at your option) + the Free Software Foundation; either version 3, or (at your option) any later version. GAS is distributed in the hope that it will be useful, @@ -16,8 +15,8 @@ You should have received a copy of the GNU General Public License along with GAS; see the file COPYING. If not, write to the Free - Software Foundation, 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA + 02110-1301, USA. */ /* HP PA-RISC support was contributed by the Center for Software Science at the University of Utah. */ @@ -48,20 +47,24 @@ #ifdef OBJ_ELF #if TARGET_ARCH_SIZE == 64 #include "bfd/elf64-hppa.h" -#ifdef TE_LINUX +#if defined (TE_LINUX) || defined (TE_NetBSD) #define TARGET_FORMAT "elf64-hppa-linux" #else #define TARGET_FORMAT "elf64-hppa" #endif #else /* TARGET_ARCH_SIZE == 32 */ #include "bfd/elf32-hppa.h" -#ifdef TE_LINUX +#if defined (TE_LINUX) #define TARGET_FORMAT "elf32-hppa-linux" #else +#if defined (TE_NetBSD) +#define TARGET_FORMAT "elf32-hppa-netbsd" +#else #define TARGET_FORMAT "elf32-hppa" #endif #endif #endif +#endif #ifdef OBJ_SOM #include "bfd/som.h" @@ -77,13 +80,6 @@ #define WARN_COMMENTS 1 #endif -#ifdef TE_NetBSD -/* XXX the original OpenBSD code has labels without colons, - so this is required, for now -- fredette@netbsd.org */ -/* Labels are not required to have a colon for a suffix. */ -#define LABELS_WITHOUT_COLONS 1 -#endif - /* FIXME. Why oh why aren't these defined somewhere globally? */ #ifndef FALSE #define FALSE (0) @@ -93,22 +89,20 @@ #define ASEC_NULL (asection *)0 /* pa_define_label gets used outside of tc-hppa.c via tc_frob_label. */ -extern void pa_define_label PARAMS ((symbolS *)); - -extern void parse_cons_expression_hppa PARAMS ((expressionS *)); -extern void cons_fix_new_hppa PARAMS ((fragS *, int, int, expressionS *)); -extern int hppa_force_relocation PARAMS ((struct fix *)); +extern void pa_define_label (symbolS *); +extern int parse_cons_expression_hppa (expressionS *); +extern void cons_fix_new_hppa (fragS *, int, int, expressionS *, int); +extern int hppa_force_relocation (struct fix *); /* This gets called before writing the object file to make sure things like entry/exit and proc/procend pairs match. */ -extern void pa_check_eof PARAMS ((void)); +extern void pa_check_eof (void); #define tc_frob_file pa_check_eof #define tc_frob_label(sym) pa_define_label (sym) -/* The PA does not need support for either of these. */ -#define tc_crawl_symbol_chain(headers) {;} -#define tc_headers_hook(headers) {;} +extern const char hppa_symbol_chars[]; +#define tc_symbol_chars hppa_symbol_chars #define RELOC_EXPANSION_POSSIBLE #define MAX_RELOC_EXPANSION 6 @@ -118,19 +112,15 @@ extern void pa_check_eof PARAMS ((void)); #define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \ parse_cons_expression_hppa (EXP) #define TC_CONS_FIX_NEW cons_fix_new_hppa +#define TC_PARSE_CONS_RETURN_TYPE int +#define TC_PARSE_CONS_RETURN_NONE e_fsel -/* On the PA, an equal sign often appears as a condition or nullification - completer in an instruction. This can be detected by checking the - previous character, if the character is a comma, then the equal is - being used as part of an instruction. */ -#define TC_EQUAL_IN_INSN(C, PTR) ((C) == ',') - -/* Similarly for an exclamation point. It is used in FP comparison - instructions and as an end of line marker. When used in an instruction - it will always follow a comma. */ +/* On the PA, an exclamation point can appear in an instruction. It is + used in FP comparison instructions and as an end of line marker. + When used in an instruction it will always follow a comma. */ #define TC_EOL_IN_INSN(PTR) (*(PTR) == '!' && (PTR)[-1] == ',') -int hppa_fix_adjustable PARAMS((struct fix *)); +int hppa_fix_adjustable (struct fix *); #define tc_fix_adjustable hppa_fix_adjustable #define EXTERN_FORCE_RELOC 1 @@ -140,13 +130,16 @@ int hppa_fix_adjustable PARAMS((struct fix *)); normally appear safe to handle it completely within GAS. */ #define TC_FORCE_RELOCATION(FIX) hppa_force_relocation (FIX) +/* Values passed to md_apply_fix don't include the symbol value. */ +#define MD_APPLY_SYM_VALUE(FIX) 0 + #ifdef OBJ_SOM /* If a symbol is imported, but never used, then the symbol should *not* end up in the symbol table. Likewise for absolute symbols with local scope. */ #define tc_frob_symbol(sym,punt) \ - if ((S_GET_SEGMENT (sym) == &bfd_und_section && ! symbol_used_p (sym)) \ - || (S_GET_SEGMENT (sym) == &bfd_abs_section \ + if ((S_GET_SEGMENT (sym) == bfd_und_section_ptr && ! symbol_used_p (sym)) \ + || (S_GET_SEGMENT (sym) == bfd_abs_section_ptr \ && ! S_IS_EXTERNAL (sym))) \ punt = 1 @@ -154,18 +147,26 @@ int hppa_fix_adjustable PARAMS((struct fix *)); two symbols. This includes the difference of two symbols when one of them is undefined (this comes up in PIC code generation). - We don't define DIFF_EXPR_OK because it does the wrong thing if - the add symbol is undefined and the sub symbol is a symbol in - the same section as the relocation. We also need some way to - specialize some code in adjust_reloc_syms. */ + We allow the difference of two symbols when the subtract symbol is + local to the relocation. This is implemented using R_HPPA_COMPLEX. + + This has some limitations. Difference expressions only work between + symbols in the same segment/quadrant of a module since the HP dynamic + loader relocates the text and data segments independently. Thus, a + difference expression can't be used between text and data symbols, + or between symbols in different executable modules. */ +#define DIFF_EXPR_OK 1 +#define TC_FORCE_RELOCATION_SUB_LOCAL(FIX, SEG) 1 #define UNDEFINED_DIFFERENCE_OK #endif -/* Values passed to md_apply_fix3 don't include the symbol value. */ -#define MD_APPLY_SYM_VALUE(FIX) 0 - #ifdef OBJ_ELF -/* Handle .type psuedo. Given a type string of `millicode', set the + +/* Difference expressions for the 64-bit HP-UX target have the same + limitations as those for the 32-bit SOM target. */ +#define DIFF_EXPR_OK 1 + +/* Handle .type pseudo. Given a type string of `millicode', set the internal elf symbol type to STT_PARISC_MILLI, and return BSF_FUNCTION for the BFD symbol type. */ #define md_elf_symbol_type(name, sym, elf) \ @@ -176,20 +177,32 @@ int hppa_fix_adjustable PARAMS((struct fix *)); ), BSF_FUNCTION) \ : -1) +/* Handle type change from .type pseudo: Zap STT_PARISC_MILLI when + switching to a non-function type. */ +#define md_elf_symbol_type_change(sym, elf, type) \ + ((type) != BSF_FUNCTION \ + && (((elf)->internal_elf_sym.st_info = \ + ELF_ST_INFO (ELF_ST_BIND ((elf)->internal_elf_sym.st_info), \ + STT_NOTYPE)), 0)) + #define tc_frob_symbol(sym,punt) \ { \ - if ((S_GET_SEGMENT (sym) == &bfd_und_section && ! symbol_used_p (sym)) \ - || (S_GET_SEGMENT (sym) == &bfd_abs_section \ - && ! S_IS_EXTERNAL (sym)) \ + if ((S_GET_SEGMENT (sym) == bfd_und_section_ptr \ + && ! symbol_used_p (sym) \ + && ELF_ST_VISIBILITY (S_GET_OTHER (sym)) == STV_DEFAULT) \ || strcmp (S_GET_NAME (sym), "$global$") == 0 \ - || strcmp (S_GET_NAME (sym), "$PIC_pcrel$0") == 0) \ + || strcmp (S_GET_NAME (sym), "$segrel$") == 0 \ + || strcmp (S_GET_NAME (sym), "$PIC_pcrel$0") == 0 \ + || strcmp (S_GET_NAME (sym), "$tls_gdidx$") == 0 \ + || strcmp (S_GET_NAME (sym), "$tls_ldidx$") == 0 \ + || strcmp (S_GET_NAME (sym), "$tls_dtpoff$") == 0 \ + || strcmp (S_GET_NAME (sym), "$tls_ieoff$") == 0 \ + || strcmp (S_GET_NAME (sym), "$tls_leoff$") == 0) \ punt = 1; \ } #define elf_tc_final_processing elf_hppa_final_processing -void elf_hppa_final_processing PARAMS ((void)); - -#define DWARF2_LINE_MIN_INSN_LENGTH 4 +void elf_hppa_final_processing (void); #endif /* OBJ_ELF */ #define md_operand(x) @@ -198,10 +211,38 @@ void elf_hppa_final_processing PARAMS ((void)); A silly fudge required for backwards compatibility. */ #define md_optimize_expr hppa_force_reg_syms_absolute -int hppa_force_reg_syms_absolute - PARAMS ((expressionS *, operatorT, expressionS *)); +int hppa_force_reg_syms_absolute (expressionS *, operatorT, expressionS *); -#define TC_FIX_TYPE PTR +#define TC_FIX_TYPE void * #define TC_INIT_FIX_DATA(FIX) ((FIX)->tc_fix_data = NULL) +#ifdef OBJ_ELF +#define TARGET_USE_CFIPOP 1 + +#define tc_cfi_frame_initial_instructions hppa_cfi_frame_initial_instructions +extern void hppa_cfi_frame_initial_instructions (void); + +#define tc_regname_to_dw2regnum hppa_regname_to_dw2regnum +extern int hppa_regname_to_dw2regnum (char *regname); + +#define DWARF2_LINE_MIN_INSN_LENGTH 4 +#define DWARF2_DEFAULT_RETURN_COLUMN 2 +#if TARGET_ARCH_SIZE == 64 +#define DWARF2_CIE_DATA_ALIGNMENT 8 +#define DWARF2_FDE_RELOC_SIZE 8 +#else +#define DWARF2_CIE_DATA_ALIGNMENT 4 +#endif + +#if !defined (TE_LINUX) && !defined (TE_NetBSD) +/* Due to the way dynamic linking to personality functions is handled + on HP-UX, we need to have a read-write .eh_frame section. */ +#define DWARF2_EH_FRAME_READ_ONLY 0 + +/* Because differences between text and data symbols don't work, we + can't use difference expressions during CFI generation. */ +#define CFI_DIFF_EXPR_OK 0 +#endif + +#endif /* OBJ_ELF */ #endif /* _TC_HPPA_H */