MIPS/GAS: Relax branches to symbols resolved at link time
[deliverable/binutils-gdb.git] / gas / config / tc-ppc.h
index 2702988ede8f62a01de35ed6b3dafafdc72548d9..e64107ef28b42e4e94b9d84714d676bf7cfa91ad 100644 (file)
@@ -1,6 +1,5 @@
 /* tc-ppc.h -- Header file for tc-ppc.c.
 /* tc-ppc.h -- Header file for tc-ppc.c.
-   Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
-   2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+   Copyright (C) 1994-2016 Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
 
    This file is part of GAS, the GNU Assembler.
    Written by Ian Lance Taylor, Cygnus Support.
 
    This file is part of GAS, the GNU Assembler.
@@ -52,7 +51,7 @@ extern int target_big_endian;
 
 /* The target BFD format.  */
 #define TARGET_FORMAT (ppc_target_format ())
 
 /* The target BFD format.  */
 #define TARGET_FORMAT (ppc_target_format ())
-extern char *ppc_target_format (void);
+extern const char *ppc_target_format (void);
 
 /* Permit temporary numeric labels.  */
 #define LOCAL_LABELS_FB 1
 
 /* Permit temporary numeric labels.  */
 #define LOCAL_LABELS_FB 1
@@ -84,14 +83,13 @@ extern char *ppc_target_format (void);
     ppc_handle_align (FRAGP);
 
 extern void ppc_handle_align (struct frag *);
     ppc_handle_align (FRAGP);
 
 extern void ppc_handle_align (struct frag *);
+extern void ppc_frag_check (struct frag *);
 
 
+#ifdef OBJ_ELF
 #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
 #define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) 0
+#endif
 
 
-#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"));
+#define md_frag_check(FRAGP) ppc_frag_check (FRAGP)
 
 /* Arrange to store the value of ppc_cpu at the site of a fixup
    for later use in md_apply_fix.  */
 
 /* Arrange to store the value of ppc_cpu at the site of a fixup
    for later use in md_apply_fix.  */
@@ -129,26 +127,32 @@ struct ppc_tc_sy
 {
   /* We keep a few linked lists of symbols.  */
   symbolS *next;
 {
   /* We keep a few linked lists of symbols.  */
   symbolS *next;
+  /* The real name, if the symbol was renamed.  */
+  char *real_name;
   /* 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.  */
   /* 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.  */
-  int output;
+  unsigned char output;
   /* The symbol class.  */
   /* The symbol class.  */
-  int class;
-  /* The real name, if the symbol was renamed.  */
-  char *real_name;
+  short symbol_class;
+  /* For a csect or common symbol, the alignment to use.  */
+  unsigned char align;
   /* For a csect symbol, the subsegment we are using.  This is zero
      for symbols that are not csects.  */
   subsegT subseg;
   /* For a csect symbol, the subsegment we are using.  This is zero
      for symbols that are not csects.  */
   subsegT subseg;
-  /* For a csect or common symbol, the alignment to use.  */
-  int align;
-  /* For a function symbol, a symbol whose value is the size.  The
-     field is NULL if there is no size.  */
-  symbolS *size;
   /* For a csect symbol, the last symbol which has been defined in
   /* 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.  */
+     this csect, or NULL if none have been defined so far.
+     For a .bs symbol, the referenced csect symbol.
+     For a label, the enclosing csect.  */
   symbolS *within;
   symbolS *within;
+  union
+  {
+    /* For a function symbol, a symbol whose value is the size.  The
+       field is NULL if there is no size.  */
+    symbolS *size;
+    /* For a dwarf symbol, the corresponding dwarf subsection.  */
+    struct dw_subsection *dw;
+  } u;
 };
 
 #define TC_SYMFIELD_TYPE struct ppc_tc_sy
 };
 
 #define TC_SYMFIELD_TYPE struct ppc_tc_sy
@@ -193,12 +197,18 @@ extern void ppc_adjust_symtab (void);
 do {                                                           \
   if (SF_GET_GET_SEGMENT (dest))                               \
     S_SET_SEGMENT (dest, S_GET_SEGMENT (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)->u = symbol_get_tc (src)->u;            \
   symbol_get_tc (dest)->align = symbol_get_tc (src)->align;    \
   symbol_get_tc (dest)->align = symbol_get_tc (src)->align;    \
-  symbol_get_tc (dest)->class = symbol_get_tc (src)->class;    \
+  symbol_get_tc (dest)->symbol_class = symbol_get_tc (src)->symbol_class;      \
   symbol_get_tc (dest)->within = symbol_get_tc (src)->within;  \
 } while (0)
 
   symbol_get_tc (dest)->within = symbol_get_tc (src)->within;  \
 } while (0)
 
+extern void ppc_xcoff_end (void);
+#define md_end ppc_xcoff_end
+
+#define tc_new_dot_label(sym) ppc_new_dot_label (sym)
+extern void ppc_new_dot_label (symbolS *);
+
 #endif /* OBJ_XCOFF */
 
 extern const char       ppc_symbol_chars[];
 #endif /* OBJ_XCOFF */
 
 extern const char       ppc_symbol_chars[];
@@ -206,15 +216,11 @@ extern const char       ppc_symbol_chars[];
 
 #ifdef OBJ_ELF
 
 
 #ifdef OBJ_ELF
 
-/* Support for SHF_EXCLUDE and SHT_ORDERED */
-extern int ppc_section_letter (int, char **);
+/* Support for SHT_ORDERED */
 extern int ppc_section_type (char *, size_t);
 extern int ppc_section_type (char *, size_t);
-extern int ppc_section_word (char *, size_t);
-extern int ppc_section_flags (int, int, int);
+extern int ppc_section_flags (flagword, bfd_vma, int);
 
 
-#define md_elf_section_letter(LETTER, PTR_MSG) ppc_section_letter (LETTER, PTR_MSG)
 #define md_elf_section_type(STR, LEN)          ppc_section_type (STR, LEN)
 #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
 #define md_elf_section_flags(FLAGS, ATTR, TYPE)        ppc_section_flags (FLAGS, ATTR, TYPE)
 
 #define tc_comment_chars ppc_comment_chars
@@ -227,9 +233,23 @@ 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
 
 /* Values passed to md_apply_fix don't include symbol values.  */
 #define MD_APPLY_SYM_VALUE(FIX) 0
 
+#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) \
+  ppc_elf_parse_cons (EXP, NBYTES)
+extern bfd_reloc_code_real_type ppc_elf_parse_cons (expressionS *,
+                                                   unsigned int);
+#define TC_CONS_FIX_CHECK(EXP, NBYTES, FIX) \
+  ppc_elf_cons_fix_check (EXP, NBYTES, FIX)
+extern void ppc_elf_cons_fix_check (expressionS *, unsigned int, struct fix *);
+
 #define tc_frob_file_before_adjust ppc_frob_file_before_adjust
 extern void ppc_frob_file_before_adjust (void);
 
 #define tc_frob_file_before_adjust ppc_frob_file_before_adjust
 extern void ppc_frob_file_before_adjust (void);
 
+#define tc_adjust_symtab() ppc_elf_adjust_symtab ()
+extern void ppc_elf_adjust_symtab (void);
+
+extern void ppc_elf_end (void);
+#define md_end ppc_elf_end
+
 #endif /* OBJ_ELF */
 
 #if defined (OBJ_ELF) || defined (OBJ_XCOFF)
 #endif /* OBJ_ELF */
 
 #if defined (OBJ_ELF) || defined (OBJ_XCOFF)
@@ -249,6 +269,25 @@ extern int ppc_parse_name (const char *, struct expressionS *);
 #define md_cleanup() ppc_cleanup ()
 extern void ppc_cleanup (void);
 
 #define md_cleanup() ppc_cleanup ()
 extern void ppc_cleanup (void);
 
+#if (defined TE_AIX5 || defined TE_AIX                                 \
+     || defined TE_FreeBSD || defined TE_NetBSD || defined TE_LYNX)
+/* ppc uses different register numbers between .eh_frame and .debug_frame.
+   This macro translates the .eh_frame register numbers to .debug_frame
+   register numbers.  */
+#define md_reg_eh_frame_to_debug_frame(regno)                          \
+  ((regno) == 70 ? 64  /* cr2 */                                       \
+   : (regno) == 65 ? 108 /* lr */                                      \
+   : (regno) == 66 ? 109 /* ctr */                                     \
+   : (regno) >= 68 && (regno) <= 75 ? (regno) + 86 - 68 /* crN */      \
+   : (regno) == 76 ? 101 /* xer */                                     \
+   : (regno) >= 77 && (regno) <= 108 ? (regno) + 1124 - 77 /* vrN */   \
+   : (regno) == 109 ? 356 /* vrsave */                                 \
+   : (regno) == 110 ? 67 /* vscr */                                    \
+   : (regno) == 111 ? 99 /* spe_acc */                                 \
+   : (regno) == 112 ? 612 /* spefscr */                                        \
+   : (regno))
+#endif
+
 #define TARGET_USE_CFIPOP 1
 
 #define tc_cfi_frame_initial_instructions ppc_cfi_frame_initial_instructions
 #define TARGET_USE_CFIPOP 1
 
 #define tc_cfi_frame_initial_instructions ppc_cfi_frame_initial_instructions
@@ -259,6 +298,8 @@ extern int tc_ppc_regname_to_dw2regnum (char *);
 
 extern int ppc_cie_data_alignment;
 
 
 extern int ppc_cie_data_alignment;
 
-#define DWARF2_LINE_MIN_INSN_LENGTH     4
+extern int ppc_dwarf2_line_min_insn_length;
+
+#define DWARF2_LINE_MIN_INSN_LENGTH     ppc_dwarf2_line_min_insn_length
 #define DWARF2_DEFAULT_RETURN_COLUMN    0x41
 #define DWARF2_CIE_DATA_ALIGNMENT       ppc_cie_data_alignment
 #define DWARF2_DEFAULT_RETURN_COLUMN    0x41
 #define DWARF2_CIE_DATA_ALIGNMENT       ppc_cie_data_alignment
This page took 0.028635 seconds and 4 git commands to generate.