PR gas/13224
[deliverable/binutils-gdb.git] / gas / config / tc-cris.h
index d1d4b29bdfd57c8c89044896a0e98e8c460eb040..56584bfb837e61132b92eb7926a4a8cc1274e5d9 100644 (file)
@@ -1,5 +1,6 @@
 /* tc-cris.h -- Header file for tc-cris.c, the CRIS GAS port.
 /* tc-cris.h -- Header file for tc-cris.c, the CRIS GAS port.
-   Copyright 2000, 2001 Free Software Foundation, Inc.
+   Copyright 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2009
+   Free Software Foundation, Inc.
 
    Contributed by Axis Communications AB, Lund, Sweden.
    Originally written for GAS 1.38.1 by Mikael Asker.
 
    Contributed by Axis Communications AB, Lund, Sweden.
    Originally written for GAS 1.38.1 by Mikael Asker.
@@ -9,7 +10,7 @@
 
    GAS is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    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,
    any later version.
 
    GAS is distributed in the hope that it will be useful,
@@ -19,8 +20,8 @@
 
    You should have received a copy of the GNU General Public License
    along with GAS; see the file COPYING.  If not, write to the
 
    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.  */
+   Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
 
 /* See the GAS "internal" document for general documentation on this.
    It is called internals.texi (internals.info when makeinfo:d), but is
 
 /* See the GAS "internal" document for general documentation on this.
    It is called internals.texi (internals.info when makeinfo:d), but is
 #define TC_CRIS
 
 /* Multi-target support is always on.  */
 #define TC_CRIS
 
 /* Multi-target support is always on.  */
-extern const char *cris_target_format PARAMS ((void));
+extern const char *cris_target_format (void);
 #define TARGET_FORMAT cris_target_format ()
 
 #define TARGET_ARCH bfd_arch_cris
 
 #define TARGET_FORMAT cris_target_format ()
 
 #define TARGET_ARCH bfd_arch_cris
 
+extern unsigned int cris_mach (void);
+#define TARGET_MACH (cris_mach ())
+
 #define TARGET_BYTES_BIG_ENDIAN 0
 
 extern const char *md_shortopts;
 #define TARGET_BYTES_BIG_ENDIAN 0
 
 extern const char *md_shortopts;
@@ -64,55 +68,52 @@ extern const char FLT_CHARS[];
 #define md_operand(x)
 
 #define md_number_to_chars number_to_chars_littleendian
 #define md_operand(x)
 
 #define md_number_to_chars number_to_chars_littleendian
-
-extern const int md_short_jump_size;
-extern const int md_long_jump_size;
-
-/* There's no use having different functions for this; the sizes are the
-   same.  Note that we can't #define md_short_jump_size here.  */
-#define md_create_short_jump md_create_long_jump
-
 extern const struct relax_type md_cris_relax_table[];
 #define TC_GENERIC_RELAX_TABLE md_cris_relax_table
 
 extern const struct relax_type md_cris_relax_table[];
 #define TC_GENERIC_RELAX_TABLE md_cris_relax_table
 
-#define TC_FORCE_RELOCATION(fixp) md_cris_force_relocation (fixp)
-extern int md_cris_force_relocation PARAMS ((struct fix *));
-
-#define IS_CRIS_PIC_RELOC(X)                   \
-  ((X) == BFD_RELOC_CRIS_16_GOT                        \
-   || (X) == BFD_RELOC_CRIS_32_GOT             \
-   || (X) == BFD_RELOC_CRIS_16_GOTPLT          \
-   || (X) == BFD_RELOC_CRIS_32_GOTPLT          \
-   || (X) == BFD_RELOC_CRIS_32_GOTREL          \
-   || (X) == BFD_RELOC_CRIS_32_PLT_GOTREL      \
-   || (X) == BFD_RELOC_CRIS_32_PLT_PCREL)
-
-
-/* FIXME: Undocumented macro.  Make sure we don't resolve fixups for which
-   we want to emit dynamic relocations.  */
-
-#define TC_RELOC_RTSYM_LOC_FIXUP(FIX)                          \
-  ((FIX)->fx_addsy == NULL                                     \
-   || (! S_IS_EXTERNAL ((FIX)->fx_addsy)                       \
-       && ! S_IS_WEAK ((FIX)->fx_addsy)                                \
-       && S_IS_DEFINED ((FIX)->fx_addsy)                       \
-       && ! S_IS_COMMON ((FIX)->fx_addsy)                      \
-       /* FIXME: Set fx_plt instead of this check.  */         \
-       && ! IS_CRIS_PIC_RELOC ((FIX)->fx_r_type)))
-
-/* This is really a workaround for a bug in write.c that resolves relocs
-   for weak symbols - it should be postponed to the link stage or later.
-   Also don't adjust fixups for global symbols for ELF, and no relocs
-   where the original symbol name must be kept.  */
-#define tc_fix_adjustable(X)                                   \
- (((X)->fx_addsy == NULL                                       \
-   || (! S_IS_WEAK ((X)->fx_addsy)                             \
-       && ! (OUTPUT_FLAVOR == bfd_target_elf_flavour           \
-            && S_IS_EXTERNAL ((X)->fx_addsy))))                \
-  && (X)->fx_r_type != BFD_RELOC_VTABLE_INHERIT                        \
-  && (X)->fx_r_type != BFD_RELOC_VTABLE_ENTRY                  \
-  && (! IS_CRIS_PIC_RELOC ((X)->fx_r_type)                     \
-      || (X)->fx_r_type == BFD_RELOC_CRIS_32_GOTREL))
+long cris_relax_frag (segT, fragS *, long);
+
+/* GAS only handles relaxations for pc-relative data targeting addresses
+   in the same segment, so we have to handle the rest on our own.  */
+#define md_relax_frag(SEG, FRAGP, STRETCH)             \
+ ((FRAGP)->fr_symbol != NULL                           \
+  && S_GET_SEGMENT ((FRAGP)->fr_symbol) == (SEG)       \
+  ? relax_frag (SEG, FRAGP, STRETCH)                   \
+  : cris_relax_frag (SEG, FRAGP, STRETCH))
+
+#define TC_FORCE_RELOCATION(FIX) md_cris_force_relocation (FIX)
+extern int md_cris_force_relocation (struct fix *);
+
+#define IS_CRIS_PIC_RELOC(RTYPE)                       \
+  ((RTYPE) == BFD_RELOC_CRIS_16_GOT                    \
+   || (RTYPE) == BFD_RELOC_CRIS_32_GOT                 \
+   || (RTYPE) == BFD_RELOC_CRIS_16_GOTPLT              \
+   || (RTYPE) == BFD_RELOC_CRIS_32_GOTPLT              \
+   || (RTYPE) == BFD_RELOC_CRIS_32_GOTREL              \
+   || (RTYPE) == BFD_RELOC_CRIS_32_PLT_GOTREL          \
+   || (RTYPE) == BFD_RELOC_CRIS_32_PLT_PCREL)
+
+/* Make sure we don't resolve fixups for which we want to emit dynamic
+   relocations.  */
+#define TC_FORCE_RELOCATION_LOCAL(FIX)                 \
+  (!(FIX)->fx_pcrel                                    \
+   || IS_CRIS_PIC_RELOC ((FIX)->fx_r_type)             \
+   || TC_FORCE_RELOCATION (FIX))
+
+/* For some reloc types, don't adjust fixups by reducing to a section
+   symbol.  */
+#define tc_fix_adjustable(FIX)                         \
+ ((FIX)->fx_r_type != BFD_RELOC_VTABLE_INHERIT         \
+  && (FIX)->fx_r_type != BFD_RELOC_VTABLE_ENTRY                \
+  && (! IS_CRIS_PIC_RELOC ((FIX)->fx_r_type)           \
+      || (FIX)->fx_r_type == BFD_RELOC_CRIS_32_GOTREL))
+
+/* FIXME: This *should* be a redundant definition, as the
+   TC_FORCE_RELOCATION* definitions already told about the cases where
+   we *don't* want the symbol value calculated.  Here we seem to answer
+   the "are you sure" question.  It certainly has very little to do with
+   whether the symbol value is passed to md_apply_fix.  */
+#define MD_APPLY_SYM_VALUE(FIX) 0
 
 /* When we have fixups against constant expressions, we get a GAS-specific
    section symbol at no extra charge for obscure reasons in
 
 /* When we have fixups against constant expressions, we get a GAS-specific
    section symbol at no extra charge for obscure reasons in
@@ -146,19 +147,21 @@ extern int md_cris_force_relocation PARAMS ((struct fix *));
    it is only for use with WORKING_DOT_WORD and warns about most stuff.
    (still in 2.9.1).  */
 struct broken_word;
    it is only for use with WORKING_DOT_WORD and warns about most stuff.
    (still in 2.9.1).  */
 struct broken_word;
-extern void tc_cris_check_adjusted_broken_word PARAMS ((offsetT,
-                                                       struct
-                                                       broken_word *));
+extern void tc_cris_check_adjusted_broken_word (offsetT,
+                                               struct broken_word *);
 #define TC_CHECK_ADJUSTED_BROKEN_DOT_WORD(new_offset, brokw) \
  tc_cris_check_adjusted_broken_word ((offsetT) (new_offset), brokw)
 
 /* We don't want any implicit alignment, so we do nothing.  */
 #define TC_CHECK_ADJUSTED_BROKEN_DOT_WORD(new_offset, brokw) \
  tc_cris_check_adjusted_broken_word ((offsetT) (new_offset), brokw)
 
 /* We don't want any implicit alignment, so we do nothing.  */
-#define TC_IMPLICIT_LCOMM_ALIGNMENT(SIZE, P2VAR)
+#define TC_IMPLICIT_LCOMM_ALIGNMENT(SIZE, P2VAR) do { } while (0)
 
 /* CRIS instructions, with operands and prefixes included, are a multiple
    of two bytes long.  */
 #define DWARF2_LINE_MIN_INSN_LENGTH 2
 
 
 /* CRIS instructions, with operands and prefixes included, are a multiple
    of two bytes long.  */
 #define DWARF2_LINE_MIN_INSN_LENGTH 2
 
+/* Make port immune to unwanted difference in te-generic.h vs. te-linux.h.  */
+#define LOCAL_LABELS_DOLLAR 1
+
 #endif /* TC_CRIS */
 /*
  * Local variables:
 #endif /* TC_CRIS */
 /*
  * Local variables:
This page took 0.025282 seconds and 4 git commands to generate.