X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-hppa.h;h=78d9edfda924efc8123fe6f9148d2a72a2c7d9bd;hb=b9c361e0ad33f2c841067fd4bf0959a72ad5a265;hp=013540c3f6daeaae8c0d201bd8be267953949b2a;hpb=fcfd49160866d2d7d6e1ed8ac3a728af5a3db8e2;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/config/tc-hppa.h b/gas/config/tc-hppa.h index 013540c3f6..78d9edfda9 100644 --- a/gas/config/tc-hppa.h +++ b/gas/config/tc-hppa.h @@ -1,12 +1,13 @@ /* tc-hppa.h -- Header file for the PA - Copyright 1989, 93, 94, 95, 96, 97, 98, 99, 2000, 2001 + Copyright 1989, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, + 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2012 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 +17,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,27 +49,31 @@ #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" #define TARGET_FORMAT "som" #endif -#ifdef TE_LINUX +#if defined(TE_LINUX) || defined(TE_NetBSD) /* Define to compile in an extra assembler option, -c, which enables a warning (once per file) when a comment is encountered. The hppa comment char is a `;' which tends to occur in random C asm @@ -86,22 +91,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 void parse_cons_expression_hppa (expressionS *); +extern void cons_fix_new_hppa (fragS *, int, int, expressionS *); +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 @@ -112,32 +115,31 @@ extern void pa_check_eof PARAMS ((void)); parse_cons_expression_hppa (EXP) #define TC_CONS_FIX_NEW cons_fix_new_hppa -/* 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 + /* Because of the strange PA calling conventions, it is sometimes necessary to emit a relocation for a call even though it would normally appear safe to handle it completely within GAS. */ -#define TC_FORCE_RELOCATION(FIXP) hppa_force_relocation (FIXP) +#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 @@ -145,17 +147,24 @@ 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 #ifdef OBJ_ELF -/* It's OK to subtract two symbols in the same section without - emitting a relocation. */ -#define TC_FORCE_RELOCATION_SECTION(FIXP, SEC) 0 + +/* 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 psuedo. Given a type string of `millicode', set the internal elf symbol type to STT_PARISC_MILLI, and return @@ -170,18 +179,22 @@ int hppa_fix_adjustable PARAMS((struct fix *)); #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) @@ -190,10 +203,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 void * +#define TC_INIT_FIX_DATA(FIX) ((FIX)->tc_fix_data = NULL) -#define TC_FIX_TYPE PTR -#define TC_INIT_FIX_DATA(FIXP) ((FIXP)->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 */