/* tc-xtensa.h -- Header file for tc-xtensa.c.
- Copyright (C) 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
+ Copyright (C) 2003-2015 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
enum xtensa_relax_statesE
{
+ RELAX_XTENSA_NONE,
+
RELAX_ALIGN_NEXT_OPCODE,
/* Use the first opcode of the next fragment to determine the
alignment requirements. This is ONLY used for LOOPs currently. */
RELAX_LOOP_END_ADD_NOP,
/* When the code density option is available, this will generate a
NOP.N marked RELAX_NARROW. Otherwise, it will create an rs_fill
- fragment with a NOP in it. */
+ fragment with a NOP in it. Once a frag has been converted to
+ RELAX_LOOP_END_ADD_NOP, it should never be changed back to
+ RELAX_LOOP_END. */
RELAX_LITERAL,
/* Another fragment could generate an expansion here but has not yet. */
prevent the linker from changing the size of any frag between the
section start and the org frag. */
+ RELAX_TRAMPOLINE,
+ /* Every few thousand frags, we insert one of these, just in case we may
+ need some space for a trampoline (jump to a jump) because the function
+ has gotten too big. If not needed, it disappears. */
+
RELAX_NONE
};
int literal_expansion[MAX_SLOTS];
int unreported_expansion;
+ /* For slots that have a free register for relaxation, record that
+ register. */
+ expressionS free_reg[MAX_SLOTS];
+
/* For text fragments that can generate literals at relax time: */
fragS *literal_frags[MAX_SLOTS];
enum xtensa_relax_statesE slot_subtypes[MAX_SLOTS];
symbolS *slot_symbols[MAX_SLOTS];
offsetT slot_offsets[MAX_SLOTS];
- /* The global aligner needs to walk backward through the list of
- frags. This field is only valid after xtensa_end. */
- fragS *fr_prev;
+ /* When marking frags after this one in the chain as no transform,
+ cache the last one in the chain, so that we can skip to the
+ end of the chain. */
+ fragS *no_transform_end;
};
{
unsigned int is_loop_target : 1;
unsigned int is_branch_target : 1;
+ symbolS *next_expr_symbol;
} xtensa_symfield_type;
#define TC_FORCE_RELOCATION(fix) xtensa_force_relocation (fix)
#define TC_FORCE_RELOCATION_SUB_SAME(fix, seg) \
(! SEG_NORMAL (seg) || xtensa_force_relocation (fix))
-#define TC_VALIDATE_FIX_SUB(fix) xtensa_validate_fix_sub (fix)
+#define TC_VALIDATE_FIX_SUB(fix, seg) xtensa_validate_fix_sub (fix)
#define NO_PSEUDO_DOT xtensa_check_inside_bundle ()
#define tc_canonicalize_symbol_name(s) xtensa_section_rename (s)
#define tc_canonicalize_section_name(s) xtensa_section_rename (s)
#define tc_fix_adjustable(fix) xtensa_fix_adjustable (fix)
#define tc_frob_label(sym) xtensa_frob_label (sym)
#define tc_unrecognized_line(ch) xtensa_unrecognized_line (ch)
+#define tc_symbol_new_hook(sym) xtensa_symbol_new_hook (sym)
#define md_do_align(a,b,c,d,e) xtensa_flush_pending_output ()
#define md_elf_section_change_hook xtensa_elf_section_change_hook
#define md_end xtensa_end
#define md_relax_frag(segment, fragP, stretch) \
xtensa_relax_frag (fragP, stretch, &stretched)
+/* Only allow call frame debug info optimization when linker relaxation is
+ not enabled as otherwise we could generate the DWARF directives without
+ the relocs necessary to patch them up. */
+#define md_allow_eh_opt (linkrelax == 0)
#define LOCAL_LABELS_FB 1
#define WORKING_DOT_WORD 1