/* tc-hppa.h -- Header file for the PA
Copyright 1989, 1993, 1994, 1995, 1997, 1998, 1999, 2000, 2001, 2002,
- 2003, 2004, 2005 Free Software Foundation, Inc.
+ 2003, 2004, 2005, 2006, 2007, 2008, 2009 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,
#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)
extern const char hppa_symbol_chars[];
#define tc_symbol_chars hppa_symbol_chars
-/* The PA does not need support for either of these. */
-#define tc_crawl_symbol_chain(headers) {;}
-#define tc_headers_hook(headers) {;}
-
#define RELOC_EXPANSION_POSSIBLE
#define MAX_RELOC_EXPANSION 6
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
normally appear safe to handle it completely within GAS. */
#define TC_FORCE_RELOCATION(FIX) hppa_force_relocation (FIX)
-/* Values passed to md_apply_fix3 don't include the symbol value. */
+/* Values passed to md_apply_fix don't include the symbol value. */
#define MD_APPLY_SYM_VALUE(FIX) 0
#ifdef OBJ_SOM
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
#define tc_frob_symbol(sym,punt) \
{ \
- if ((S_GET_SEGMENT (sym) == &bfd_und_section && ! symbol_used_p (sym) && \
- ELF_ST_VISIBILITY (S_GET_OTHER (sym)) == STV_DEFAULT) \
- || (S_GET_SEGMENT (sym) == &bfd_abs_section \
- && ! S_IS_EXTERNAL (sym)) \
+ if ((S_GET_SEGMENT (sym) == &bfd_und_section \
+ && ! 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)
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 */