diff options
Diffstat (limited to 'binutils-2.25/gas/config/tc-hppa.h')
-rw-r--r-- | binutils-2.25/gas/config/tc-hppa.h | 240 |
1 files changed, 240 insertions, 0 deletions
diff --git a/binutils-2.25/gas/config/tc-hppa.h b/binutils-2.25/gas/config/tc-hppa.h new file mode 100644 index 00000000..78d9edfd --- /dev/null +++ b/binutils-2.25/gas/config/tc-hppa.h @@ -0,0 +1,240 @@ +/* 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, 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 3, or (at your option) + any later version. + + GAS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + 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, 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. */ + +/* Please refrain from exposing the world to the internals of tc-hppa.c + when this file is included. This means only declaring exported functions, + (please PARAMize them!) not exporting structures and data items which + are used solely within tc-hppa.c, etc. + + Also refrain from adding any more object file dependent code, there is + already far too much object file format dependent code in this file. + In theory this file should contain only exported functions, structures + and data declarations common to all PA assemblers. */ + +#ifndef _TC_HPPA_H +#define _TC_HPPA_H + +#ifndef TC_HPPA +#define TC_HPPA 1 +#endif + +#define TARGET_BYTES_BIG_ENDIAN 1 + +#define TARGET_ARCH bfd_arch_hppa + +#define WORKING_DOT_WORD + +#ifdef OBJ_ELF +#if TARGET_ARCH_SIZE == 64 +#include "bfd/elf64-hppa.h" +#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" +#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 + +#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 + statements. A semicolon is a line separator for most assemblers. + It's hard to find these lurking semicolons. Thus... */ +#define WARN_COMMENTS 1 +#endif + +/* FIXME. Why oh why aren't these defined somewhere globally? */ +#ifndef FALSE +#define FALSE (0) +#define TRUE (!FALSE) +#endif + +#define ASEC_NULL (asection *)0 + +/* 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 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 (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 + +#define RELOC_EXPANSION_POSSIBLE +#define MAX_RELOC_EXPANSION 6 + +/* The PA needs to parse field selectors in .byte, etc. */ + +#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \ + parse_cons_expression_hppa (EXP) +#define TC_CONS_FIX_NEW cons_fix_new_hppa + +/* 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 (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(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_ptr && ! symbol_used_p (sym)) \ + || (S_GET_SEGMENT (sym) == bfd_abs_section_ptr \ + && ! S_IS_EXTERNAL (sym))) \ + punt = 1 + +/* We need to be able to make relocations involving the difference of + two symbols. This includes the difference of two symbols when + one of them is undefined (this comes up in PIC code generation). + + 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 + 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) \ + ((strcmp ((name), "millicode") == 0 \ + || strcmp ((name), "STT_PARISC_MILLI") == 0) \ + ? (((elf)->internal_elf_sym.st_info = ELF_ST_INFO \ + (ELF_ST_BIND ((elf)->internal_elf_sym.st_info), STT_PARISC_MILLI)\ + ), BSF_FUNCTION) \ + : -1) + +#define tc_frob_symbol(sym,punt) \ + { \ + 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), "$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 (void); +#endif /* OBJ_ELF */ + +#define md_operand(x) + +/* Allow register expressions to be treated as absolute expressions. + A silly fudge required for backwards compatibility. */ +#define md_optimize_expr hppa_force_reg_syms_absolute + +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) + +#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 */ |