/* This file is tc-arm.h
- Copyright (C) 1994-2015 Free Software Foundation, Inc.
+ Copyright (C) 1994-2018 Free Software Foundation, Inc.
Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
Modified by David Taylor (dtaylor@armltd.co.uk)
#define md_start_line_hook() arm_start_line_hook ()
-#define TC_START_LABEL_WITHOUT_COLON(c, l) tc_start_label_without_colon (c, l)
-extern bfd_boolean tc_start_label_without_colon (char, const char *);
+#define TC_START_LABEL_WITHOUT_COLON(NUL_CHAR, NEXT_CHAR) \
+ tc_start_label_without_colon ()
+extern bfd_boolean tc_start_label_without_colon (void);
#define tc_frob_label(S) arm_frob_label (S)
extern void arm_md_end (void);
bfd_boolean arm_is_eabi (void);
-#define md_post_relax_hook aeabi_set_public_attributes ()
-extern void aeabi_set_public_attributes (void);
+#define md_post_relax_hook arm_md_post_relax ()
+extern void arm_md_post_relax (void);
#endif
/* NOTE: The fake label creation in stabs.c:s_stab_generic() has
(arm_copy_symbol_attributes (DEST, SRC))
#endif
-#define TC_START_LABEL(C,S,STR) (C == ':' || (C == '/' && arm_data_in_code ()))
+#define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR) \
+ (NEXT_CHAR == ':' || (NEXT_CHAR == '/' && arm_data_in_code ()))
#define tc_canonicalize_symbol_name(str) arm_canonicalize_symbol_name (str);
#define obj_adjust_symtab() arm_adjust_symtab ()
pcrel, but it is easier to be safe than sorry. */
#define TC_FORCE_RELOCATION_LOCAL(FIX) \
- (!(FIX)->fx_pcrel \
+ (GENERIC_FORCE_RELOCATION_LOCAL (FIX) \
|| (FIX)->fx_r_type == BFD_RELOC_ARM_GOT32 \
|| (FIX)->fx_r_type == BFD_RELOC_32 \
- || ((FIX)->fx_addsy != NULL && S_IS_WEAK ((FIX)->fx_addsy)) \
- || TC_FORCE_RELOCATION (FIX))
+ || ((FIX)->fx_addsy != NULL \
+ && S_IS_WEAK ((FIX)->fx_addsy)))
/* Force output of R_ARM_REL32 relocations against thumb function symbols.
This is needed to ensure the low bit is handled correctly. */
#define TC_FORCE_RELOCATION_SUB_SAME(FIX, SEG) \
- (THUMB_IS_FUNC ((FIX)->fx_addsy) \
- || !SEG_NORMAL (SEG))
+ (GENERIC_FORCE_RELOCATION_SUB_SAME (FIX, SEG) \
+ || THUMB_IS_FUNC ((FIX)->fx_addsy))
#define TC_FORCE_RELOCATION_ABS(FIX) \
(((FIX)->fx_pcrel \
#endif
};
+static inline int
+arm_min (int am_p1, int am_p2)
+{
+ return am_p1 < am_p2 ? am_p1 : am_p2;
+}
+
#define TC_FRAG_TYPE struct arm_frag_type
/* NOTE: max_chars is a local variable from frag_var / frag_variant. */
#define TC_FRAG_INIT(fragp) arm_init_frag (fragp, max_chars)
+#define TC_ALIGN_ZERO_IS_DEFAULT 1
#define HANDLE_ALIGN(fragp) arm_handle_align (fragp)
+/* PR gas/19276: COFF/PE segment alignment is already handled in coff_frob_section(). */
+#ifndef TE_PE
+#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) \
+ ((!(FRCHAIN)->frch_next && subseg_text_p (SEG)) \
+ ? arm_min (2, get_recorded_alignment (SEG)) : 0)
+#endif
#define md_do_align(N, FILL, LEN, MAX, LABEL) \
if (FILL == NULL && (N) != 0 && ! need_pass_2 && subseg_text_p (now_seg)) \
#define tc_line_separator_chars arm_line_separator_chars
extern char arm_line_separator_chars[];
+
+#define TC_EQUAL_IN_INSN(c, s) arm_tc_equal_in_insn ((c), (s))
+extern bfd_boolean arm_tc_equal_in_insn (int, char *);