X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gas%2Fconfig%2Ftc-hppa.h;h=4f3a7cd9ad8e89b84c34a21343904a366cbd262d;hb=39d911fc3c6519799ca1af4365d4b56f9d71ca94;hp=6af5c057e40de05c2d7af7d3f512b841f258b4b4;hpb=3a0d49fcec8056b0b8595f805463e68d091b9cf2;p=deliverable%2Fbinutils-gdb.git diff --git a/gas/config/tc-hppa.h b/gas/config/tc-hppa.h index 6af5c057e4..4f3a7cd9ad 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 Free Software Foundation, Inc. + Copyright (C) 1989-2016 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,14 +147,23 @@ 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 @@ -169,12 +179,11 @@ int hppa_fix_adjustable (struct fix *); #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 \ || strcmp (S_GET_NAME (sym), "$tls_gdidx$") == 0 \ || strcmp (S_GET_NAME (sym), "$tls_ldidx$") == 0 \ @@ -186,8 +195,6 @@ int hppa_fix_adjustable (struct fix *); #define elf_tc_final_processing elf_hppa_final_processing void elf_hppa_final_processing (void); - -#define DWARF2_LINE_MIN_INSN_LENGTH 4 #endif /* OBJ_ELF */ #define md_operand(x) @@ -198,7 +205,7 @@ void elf_hppa_final_processing (void); 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 @@ -213,10 +220,21 @@ 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_CIE_DATA_ALIGNMENT 8 +#define DWARF2_FDE_RELOC_SIZE 8 #else -#define DWARF2_CIE_DATA_ALIGNMENT (-4) +#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 */