X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-hppa.h;h=ab54b4d095197f70441761c8ad5a582c82d29fa6;hb=d69cd47e7e9884f7b3a319936f70b8d93347e9e0;hp=c3082a24ff315507a191222c7129bbba88c82d4f;hpb=5ead15d96a212c0d00a83f326a37bc2a99c61c95;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/config/tc-hppa.h b/gas/config/tc-hppa.h index c3082a24ff..ab54b4d095 100644 --- a/gas/config/tc-hppa.h +++ b/gas/config/tc-hppa.h @@ -1,6 +1,5 @@ /* tc-hppa.h -- Header file for the PA - Copyright 1989, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002, - 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 1989-2019 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -91,8 +90,8 @@ /* pa_define_label gets used outside of tc-hppa.c via tc_frob_label. */ 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 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 @@ -113,6 +112,8 @@ extern const char hppa_symbol_chars[]; #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 exclamation point can appear in an instruction. It is used in FP comparison instructions and as an end of line marker. @@ -137,8 +138,8 @@ int hppa_fix_adjustable (struct fix *); *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 @@ -146,17 +147,26 @@ int hppa_fix_adjustable (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 + +/* 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 +/* 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) \ @@ -167,13 +177,19 @@ int hppa_fix_adjustable (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 \ + if ((S_GET_SEGMENT (sym) == bfd_und_section_ptr \ && ! symbol_used_p (sym) \ && ELF_ST_VISIBILITY (S_GET_OTHER (sym)) == STV_DEFAULT) \ - || (S_GET_SEGMENT (sym) == &bfd_abs_section \ - && ! S_IS_EXTERNAL (sym)) \ || strcmp (S_GET_NAME (sym), "$global$") == 0 \ || strcmp (S_GET_NAME (sym), "$segrel$") == 0 \ || strcmp (S_GET_NAME (sym), "$PIC_pcrel$0") == 0 \ @@ -222,6 +238,10 @@ extern int hppa_regname_to_dw2regnum (char *regname); /* 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 */