* config/tc-ppc.h (struct _ppc_fix_extra): New.
[deliverable/binutils-gdb.git] / gas / config / tc-ppc.h
index bc3b75d8e3f1572578fb11dd70fc08e0953f0fe7..5f6f7f23d4373c910330ebed077ed66c363534d0 100644 (file)
@@ -1,12 +1,13 @@
 /* tc-ppc.h -- Header file for tc-ppc.c.
-   Copyright (C) 1994 Free Software Foundation, Inc.
+   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
+   2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
 
    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 2, 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,
    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, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+   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.  */
 
 #define TC_PPC
 
-#ifndef BFD_ASSEMBLER
- #error PowerPC support requires BFD_ASSEMBLER
+struct fix;
+
+/* Set the endianness we are using.  Default to big endian.  */
+#ifndef TARGET_BYTES_BIG_ENDIAN
+#define TARGET_BYTES_BIG_ENDIAN 1
 #endif
 
 /* If OBJ_COFF is defined, and TE_PE is not defined, we are assembling
 
 /* The target BFD architecture.  */
 #define TARGET_ARCH (ppc_arch ())
-extern enum bfd_architecture ppc_arch PARAMS ((void));
+#define TARGET_MACH (ppc_mach ())
+extern enum bfd_architecture ppc_arch (void);
+extern unsigned long ppc_mach (void);
 
 /* Whether or not the target is big endian */
 extern int target_big_endian;
 
 /* The target BFD format.  */
-#ifdef OBJ_COFF
-#ifdef TE_PE
-#define TARGET_FORMAT (target_big_endian ? "pe-powerpc" : "pe-powerpcle")
-#else
-#define TARGET_FORMAT "aixcoff-rs6000"
-#endif
-#endif
-
-/* PowerMac has a BFD slightly different from AIX's.  */
-#ifdef TE_POWERMAC
-#ifdef TARGET_FORMAT
-#undef TARGET_FORMAT
-#endif
-#define TARGET_FORMAT "xcoff-powermac"
-#endif
-
-#ifdef OBJ_ELF
-#define TARGET_FORMAT (target_big_endian ? "elf32-powerpc" : "elf32-powerpcle")
-#endif
+#define TARGET_FORMAT (ppc_target_format ())
+extern char *ppc_target_format (void);
 
 /* Permit temporary numeric labels.  */
 #define LOCAL_LABELS_FB 1
@@ -73,27 +63,11 @@ extern int target_big_endian;
 #define NO_STRING_ESCAPES
 #endif
 
-/* When using COFF, we determine whether or not to output a symbol
-   based on sy_tc.output, not on the name.  */
-#ifdef OBJ_XCOFF
-#define LOCAL_LABEL(name) 0
-#endif
 #ifdef OBJ_ELF
-/* When using ELF, local labels start with '.'.  */
-#define LOCAL_LABEL(name) (name[0] == '.' \
-                          && (name[1] == 'L' || name[1] == '.'))
-#define FAKE_LABEL_NAME ".L0\001"
-#define DIFF_EXPR_OK           /* .-foo gets turned into PC relative relocs */
-#endif
-
-/* Set the endianness we are using.  Default to big endian.  */
-#ifndef TARGET_BYTES_BIG_ENDIAN
-#ifndef TARGET_BYTES_LITTLE_ENDIAN
-#define TARGET_BYTES_BIG_ENDIAN 1
-#endif
+#define DIFF_EXPR_OK           /* foo-. gets turned into PC relative relocs */
 #endif
 
-#ifdef TARGET_BYTES_BIG_ENDIAN
+#if TARGET_BYTES_BIG_ENDIAN
 #define PPC_BIG_ENDIAN 1
 #else
 #define PPC_BIG_ENDIAN 0
@@ -102,8 +76,33 @@ extern int target_big_endian;
 /* We don't need to handle .word strangely.  */
 #define WORKING_DOT_WORD
 
-/* We set the fx_done field appropriately in md_apply_fix.  */
-#define TC_HANDLES_FX_DONE
+#define MAX_MEM_FOR_RS_ALIGN_CODE 4
+#define HANDLE_ALIGN(FRAGP)                                            \
+  if ((FRAGP)->fr_type == rs_align_code)                               \
+    ppc_handle_align (FRAGP);
+
+extern void ppc_handle_align (struct frag *);
+
+#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
+
+#define md_frag_check(FRAGP) \
+  if ((FRAGP)->has_code                                                        \
+      && (((FRAGP)->fr_address + (FRAGP)->insn_addr) & 3) != 0)                \
+    as_bad_where ((FRAGP)->fr_file, (FRAGP)->fr_line,                  \
+                 _("instruction address is not a multiple of 4"));
+
+/* Arrange to store the value of ppc_cpu at the site of a fixup
+   for later use in md_apply_fix.  */
+struct _ppc_fix_extra
+{
+  unsigned long ppc_cpu;
+};
+
+extern unsigned long ppc_cpu;
+
+#define TC_FIX_TYPE struct _ppc_fix_extra
+#define TC_INIT_FIX_DATA(FIXP) \
+  do { (FIXP)->tc_fix_data.ppc_cpu = ppc_cpu; } while (0)
 \f
 #ifdef TE_PE
 
@@ -111,8 +110,8 @@ extern int target_big_endian;
 #define LEX_QM 1
 
 /* Don't adjust TOC relocs.  */
-#define tc_fix_adjustable(fixp) ppc_pe_fix_adjustable (fixp)
-extern int ppc_pe_fix_adjustable PARAMS ((struct fix *));
+#define tc_fix_adjustable(FIX) ppc_pe_fix_adjustable (FIX)
+extern int ppc_pe_fix_adjustable (struct fix *);
 
 #endif
 
@@ -127,7 +126,7 @@ extern int ppc_pe_fix_adjustable PARAMS ((struct fix *));
 struct ppc_tc_sy
 {
   /* We keep a few linked lists of symbols.  */
-  struct symbol *next;
+  symbolS *next;
   /* Non-zero if the symbol should be output.  The RS/6000 assembler
      only outputs symbols that are external or are mentioned in a
      .globl or .lglobl statement.  */
@@ -143,11 +142,11 @@ struct ppc_tc_sy
   int align;
   /* For a function symbol, a symbol whose value is the size.  The
      field is NULL if there is no size.  */
-  struct symbol *size;
+  symbolS *size;
   /* For a csect symbol, the last symbol which has been defined in
      this csect, or NULL if none have been defined so far.  For a .bs
      symbol, the referenced csect symbol.  */
-  struct symbol *within;
+  symbolS *within;
 };
 
 #define TC_SYMFIELD_TYPE struct ppc_tc_sy
@@ -160,70 +159,104 @@ struct ppc_tc_sy
 
 /* Canonicalize the symbol name.  */
 #define tc_canonicalize_symbol_name(name) ppc_canonicalize_symbol_name (name)
-extern char *ppc_canonicalize_symbol_name PARAMS ((char *));
+extern char *ppc_canonicalize_symbol_name (char *);
 
 /* Get the symbol class from the name.  */
 #define tc_symbol_new_hook(sym) ppc_symbol_new_hook (sym)
-extern void ppc_symbol_new_hook PARAMS ((struct symbol *));
+extern void ppc_symbol_new_hook (symbolS *);
 
 /* Set the symbol class of a label based on the csect.  */
 #define tc_frob_label(sym) ppc_frob_label (sym)
-extern void ppc_frob_label PARAMS ((struct symbol *));
+extern void ppc_frob_label (symbolS *);
 
 /* TOC relocs requires special handling.  */
-#define tc_fix_adjustable(fixp) ppc_fix_adjustable (fixp)
-extern int ppc_fix_adjustable PARAMS ((struct fix *));
+#define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX)
+extern int ppc_fix_adjustable (struct fix *);
 
 /* We need to set the section VMA.  */
 #define tc_frob_section(sec) ppc_frob_section (sec)
-extern void ppc_frob_section PARAMS ((asection *));
+extern void ppc_frob_section (asection *);
 
 /* Finish up the symbol.  */
 #define tc_frob_symbol(sym, punt) punt = ppc_frob_symbol (sym)
-extern int ppc_frob_symbol PARAMS ((struct symbol *));
+extern int ppc_frob_symbol (symbolS *);
 
 /* Finish up the entire symtab.  */
 #define tc_adjust_symtab() ppc_adjust_symtab ()
-extern void ppc_adjust_symtab PARAMS ((void));
-
-/* Niclas Andersson <nican@ida.liu.se> says this is needed.  */
-#define SUB_SEGMENT_ALIGN(SEG) 2
+extern void ppc_adjust_symtab (void);
+
+/* We also need to copy, in particular, the class of the symbol,
+   over what obj-coff would otherwise have copied.  */
+#define OBJ_COPY_SYMBOL_ATTRIBUTES(dest,src)                   \
+do {                                                           \
+  if (SF_GET_GET_SEGMENT (dest))                               \
+    S_SET_SEGMENT (dest, S_GET_SEGMENT (src));                 \
+  symbol_get_tc (dest)->size = symbol_get_tc (src)->size;      \
+  symbol_get_tc (dest)->align = symbol_get_tc (src)->align;    \
+  symbol_get_tc (dest)->class = symbol_get_tc (src)->class;    \
+  symbol_get_tc (dest)->within = symbol_get_tc (src)->within;  \
+} while (0)
 
 #endif /* OBJ_XCOFF */
 
-#ifdef OBJ_ELF
-/* The name of the global offset table generated by the compiler. Allow
-   this to be overridden if need be. */
-#ifndef GLOBAL_OFFSET_TABLE_NAME
-#define GLOBAL_OFFSET_TABLE_NAME "_GLOBAL_OFFSET_TABLE_"
-#endif
+extern const char       ppc_symbol_chars[];
+#define tc_symbol_chars ppc_symbol_chars
 
-/* Branch prediction relocations must force relocation */
-#define TC_FORCE_RELOCATION_SECTION(FIXP,SEC)                          \
-((FIXP)->fx_r_type == BFD_RELOC_PPC_B16_BRTAKEN                                \
- || (FIXP)->fx_r_type == BFD_RELOC_PPC_B16_BRNTAKEN                    \
- || (FIXP)->fx_r_type == BFD_RELOC_PPC_BA16_BRTAKEN                    \
- || (FIXP)->fx_r_type == BFD_RELOC_PPC_BA16_BRNTAKEN                   \
- || ((FIXP)->fx_addsy && !(FIXP)->fx_subsy && (FIXP)->fx_addsy->bsym   \
-     && (FIXP)->fx_addsy->bsym->section != SEC))
+#ifdef OBJ_ELF
 
 /* Support for SHF_EXCLUDE and SHT_ORDERED */
-extern int ppc_section_letter PARAMS ((int, char **));
-extern int ppc_section_type PARAMS ((char **));
-extern int ppc_section_word PARAMS ((char **));
-extern int ppc_section_flags PARAMS ((int, int, int));
+extern int ppc_section_letter (int, char **);
+extern int ppc_section_type (char *, size_t);
+extern int ppc_section_word (char *, size_t);
+extern int ppc_section_flags (int, int, int);
 
 #define md_elf_section_letter(LETTER, PTR_MSG) ppc_section_letter (LETTER, PTR_MSG)
-#define md_elf_section_type(PTR_STR)           ppc_section_type (PTR_STR)
-#define md_elf_section_word(PTR_STR)           ppc_section_word (PTR_STR)
+#define md_elf_section_type(STR, LEN)          ppc_section_type (STR, LEN)
+#define md_elf_section_word(STR, LEN)          ppc_section_word (STR, LEN)
 #define md_elf_section_flags(FLAGS, ATTR, TYPE)        ppc_section_flags (FLAGS, ATTR, TYPE)
+
+#define tc_comment_chars ppc_comment_chars
+extern const char *ppc_comment_chars;
+
+/* Keep relocations relative to the GOT, or non-PC relative.  */
+#define tc_fix_adjustable(FIX) ppc_fix_adjustable (FIX)
+extern int ppc_fix_adjustable (struct fix *);
+
+/* Values passed to md_apply_fix don't include symbol values.  */
+#define MD_APPLY_SYM_VALUE(FIX) 0
+
+#define tc_frob_file_before_adjust ppc_frob_file_before_adjust
+extern void ppc_frob_file_before_adjust (void);
+
 #endif /* OBJ_ELF */
 
-/* call md_apply_fix3 with segment instead of md_apply_fix */
-#define MD_APPLY_FIX3
+#if defined (OBJ_ELF) || defined (OBJ_XCOFF)
+#define TC_FORCE_RELOCATION(FIX) ppc_force_relocation (FIX)
+extern int ppc_force_relocation (struct fix *);
+#endif
 
 /* call md_pcrel_from_section, not md_pcrel_from */
-#define MD_PCREL_FROM_SECTION(FIXP, SEC) md_pcrel_from_section(FIXP, SEC)
+#define MD_PCREL_FROM_SECTION(FIX, SEC) md_pcrel_from_section(FIX, SEC)
+extern long md_pcrel_from_section (struct fix *, segT);
+
+#define md_parse_name(name, exp, mode, c) ppc_parse_name (name, exp)
+extern int ppc_parse_name (const char *, struct expressionS *);
 
 #define md_operand(x)
 
+#define md_cleanup() ppc_cleanup ()
+extern void ppc_cleanup (void);
+
+#define TARGET_USE_CFIPOP 1
+
+#define tc_cfi_frame_initial_instructions ppc_cfi_frame_initial_instructions
+extern void ppc_cfi_frame_initial_instructions (void);
+
+#define tc_regname_to_dw2regnum tc_ppc_regname_to_dw2regnum
+extern int tc_ppc_regname_to_dw2regnum (char *);
+
+extern int ppc_cie_data_alignment;
+
+#define DWARF2_LINE_MIN_INSN_LENGTH     4
+#define DWARF2_DEFAULT_RETURN_COLUMN    0x41
+#define DWARF2_CIE_DATA_ALIGNMENT       ppc_cie_data_alignment
This page took 0.028273 seconds and 4 git commands to generate.