/* This file is tc-arm.h
- Copyright (C) 1994-2015 Free Software Foundation, Inc.
+ Copyright (C) 1994-2023 Free Software Foundation, Inc.
Contributed by Richard Earnshaw (rwe@pegasus.esprit.ec.org)
Modified by David Taylor (dtaylor@armltd.co.uk)
struct fix;
-#if defined OBJ_AOUT
-# if defined TE_RISCIX
-# define TARGET_FORMAT "a.out-riscix"
-# elif defined TE_LINUX
-# define ARM_BI_ENDIAN
-# define TARGET_FORMAT "a.out-arm-linux"
-# elif defined TE_NetBSD
-# define TARGET_FORMAT "a.out-arm-netbsd"
-# else
-# define ARM_BI_ENDIAN
-# define TARGET_FORMAT (target_big_endian ? "a.out-arm-big" : "a.out-arm-little")
-# endif
-#elif defined OBJ_AIF
-# define TARGET_FORMAT "aif"
-#elif defined OBJ_COFF
+#if defined OBJ_COFF
# define ARM_BI_ENDIAN
# if defined TE_PE
-# if defined TE_EPOC
-# define TARGET_FORMAT (target_big_endian ? "epoc-pe-arm-big" : "epoc-pe-arm-little")
-# elif defined TE_WINCE
+# if defined TE_WINCE
# define TARGET_FORMAT (target_big_endian ? "pe-arm-wince-big" : "pe-arm-wince-little")
# else
# define TARGET_FORMAT (target_big_endian ? "pe-arm-big" : "pe-arm-little")
/* We conditionally support labels without a colon. */
#define LABELS_WITHOUT_COLONS codecomposer_syntax
-extern bfd_boolean codecomposer_syntax;
+extern bool codecomposer_syntax;
#define tc_symbol_chars arm_symbol_chars
extern const char arm_symbol_chars[];
extern int arm_relax_frag (asection *, struct frag *, long);
#define md_optimize_expr(l,o,r) arm_optimize_expr (l, o, r)
-extern int arm_optimize_expr (expressionS *, operatorT, expressionS *);
+extern bool arm_optimize_expr (expressionS *, operatorT, expressionS *);
#define md_cleanup() arm_cleanup ()
#define TC_START_LABEL_WITHOUT_COLON(NUL_CHAR, NEXT_CHAR) \
tc_start_label_without_colon ()
-extern bfd_boolean tc_start_label_without_colon (void);
+extern bool tc_start_label_without_colon (void);
#define tc_frob_label(S) arm_frob_label (S)
#define tc_frob_fake_label(S) arm_frob_label (S)
#ifdef OBJ_ELF
-#define md_end arm_md_end
-extern void arm_md_end (void);
-bfd_boolean arm_is_eabi (void);
+#define md_finish arm_md_finish
+extern void arm_md_finish (void);
+bool 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
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 \
}
#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_FRAG_INIT(fragp, max_bytes) arm_init_frag (fragp, max_bytes)
#define TC_ALIGN_ZERO_IS_DEFAULT 1
#define HANDLE_ALIGN(fragp) arm_handle_align (fragp)
-#define SUB_SEGMENT_ALIGN(SEG, FRCHAIN) \
+/* 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)) \
/* Registers are generally saved at negative offsets to the CFA. */
#define DWARF2_CIE_DATA_ALIGNMENT (-4)
-/* State variables for IT block handling. */
-enum it_state
+/* State variables for predication block handling. */
+enum pred_state
{
- OUTSIDE_IT_BLOCK, MANUAL_IT_BLOCK, AUTOMATIC_IT_BLOCK
+ OUTSIDE_PRED_BLOCK, MANUAL_PRED_BLOCK, AUTOMATIC_PRED_BLOCK
};
-struct current_it
+enum pred_type {
+ SCALAR_PRED, VECTOR_PRED
+};
+struct current_pred
{
int mask;
- enum it_state state;
+ enum pred_state state;
int cc;
int block_length;
char *insn;
int state_handled;
int warn_deprecated;
int insn_cond;
+ enum pred_type type;
};
#ifdef OBJ_ELF
emitted only once per section, to save unnecessary bloat. */
unsigned int marked_pr_dependency;
- struct current_it current_it;
+ struct current_pred current_pred;
};
/* We want .cfi_* pseudo-ops for generating unwind info. */
#define MD_PCREL_FROM_SECTION(F,S) md_pcrel_from_section(F,S)
-extern long md_pcrel_from_section (struct fix *, segT);
extern void arm_frag_align_code (int, int);
extern void arm_validate_fix (struct fix *);
extern const char * elf32_arm_target_format (void);
extern void arm_cleanup (void);
extern void arm_start_line_hook (void);
extern void arm_frob_label (symbolS *);
-extern int arm_data_in_code (void);
+extern bool arm_data_in_code (void);
extern char * arm_canonicalize_symbol_name (char *);
extern void arm_adjust_symtab (void);
extern void armelf_frob_symbol (symbolS *, int *);
bfd_reloc_code_real_type);
extern void arm_init_frag (struct frag *, int);
extern void arm_handle_align (struct frag *);
-extern bfd_boolean arm_fix_adjustable (struct fix *);
+extern bool arm_fix_adjustable (struct fix *);
extern int arm_elf_section_type (const char *, size_t);
extern int tc_arm_regname_to_dw2regnum (char *regname);
extern void tc_arm_frame_initial_instructions (void);
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 *);
+extern bool arm_tc_equal_in_insn (int, char *);
+
+#define TC_LARGEST_EXPONENT_IS_NORMAL(PRECISION) \
+ arm_is_largest_exponent_ok ((PRECISION))
+int arm_is_largest_exponent_ok (int precision);