1/* tc-xtensa.c -- Assemble Xtensa instructions.
2   Copyright (C) 2003-2017 Free Software Foundation, Inc.
3
4   This file is part of GAS, the GNU Assembler.
5
6   GAS is free software; you can redistribute it and/or modify
7   it under the terms of the GNU General Public License as published by
8   the Free Software Foundation; either version 3, or (at your option)
9   any later version.
10
11   GAS is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   GNU General Public License for more details.
15
16   You should have received a copy of the GNU General Public License
17   along with GAS; see the file COPYING.  If not, write to
18   the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
19   MA 02110-1301, USA.  */
20
21#include "as.h"
22#include <limits.h>
23#include "sb.h"
24#include "safe-ctype.h"
25#include "tc-xtensa.h"
26#include "subsegs.h"
27#include "xtensa-relax.h"
28#include "dwarf2dbg.h"
29#include "xtensa-istack.h"
30#include "struc-symbol.h"
31#include "xtensa-config.h"
32#include "elf/xtensa.h"
33
34/* Provide default values for new configuration settings.  */
35#ifndef XSHAL_ABI
36#define XSHAL_ABI 0
37#endif
38
39#ifndef uint32
40#define uint32 unsigned int
41#endif
42#ifndef int32
43#define int32 signed int
44#endif
45
46/* Notes:
47
48   Naming conventions (used somewhat inconsistently):
49      The xtensa_ functions are exported
50      The xg_ functions are internal
51
52   We also have a couple of different extensibility mechanisms.
53   1) The idiom replacement:
54      This is used when a line is first parsed to
55      replace an instruction pattern with another instruction
56      It is currently limited to replacements of instructions
57      with constant operands.
58   2) The xtensa-relax.c mechanism that has stronger instruction
59      replacement patterns.  When an instruction's immediate field
60      does not fit the next instruction sequence is attempted.
61      In addition, "narrow" opcodes are supported this way.  */
62
63
64/* Define characters with special meanings to GAS.  */
65const char comment_chars[] = "#";
66const char line_comment_chars[] = "#";
67const char line_separator_chars[] = ";";
68const char EXP_CHARS[] = "eE";
69const char FLT_CHARS[] = "rRsSfFdDxXpP";
70
71
72/* Flags to indicate whether the hardware supports the density and
73   absolute literals options.  */
74
75bfd_boolean density_supported = XCHAL_HAVE_DENSITY;
76bfd_boolean absolute_literals_supported = XSHAL_USE_ABSOLUTE_LITERALS;
77
78static vliw_insn cur_vinsn;
79
80unsigned xtensa_num_pipe_stages;
81unsigned xtensa_fetch_width = XCHAL_INST_FETCH_WIDTH;
82
83static enum debug_info_type xt_saved_debug_type = DEBUG_NONE;
84
85/* Some functions are only valid in the front end.  This variable
86   allows us to assert that we haven't crossed over into the
87   back end.  */
88static bfd_boolean past_xtensa_end = FALSE;
89
90/* Flags for properties of the last instruction in a segment.  */
91#define FLAG_IS_A0_WRITER	0x1
92#define FLAG_IS_BAD_LOOPEND	0x2
93
94
95/* We define a special segment names ".literal" to place literals
96   into.  The .fini and .init sections are special because they
97   contain code that is moved together by the linker.  We give them
98   their own special .fini.literal and .init.literal sections.  */
99
100#define LITERAL_SECTION_NAME		xtensa_section_rename (".literal")
101#define LIT4_SECTION_NAME		xtensa_section_rename (".lit4")
102#define INIT_SECTION_NAME		xtensa_section_rename (".init")
103#define FINI_SECTION_NAME		xtensa_section_rename (".fini")
104
105
106/* This type is used for the directive_stack to keep track of the
107   state of the literal collection pools.  If lit_prefix is set, it is
108   used to determine the literal section names; otherwise, the literal
109   sections are determined based on the current text section.  The
110   lit_seg and lit4_seg fields cache these literal sections, with the
111   current_text_seg field used a tag to indicate whether the cached
112   values are valid.  */
113
114typedef struct lit_state_struct
115{
116  char *lit_prefix;
117  segT current_text_seg;
118  segT lit_seg;
119  segT lit4_seg;
120} lit_state;
121
122static lit_state default_lit_sections;
123
124
125/* We keep a list of literal segments.  The seg_list type is the node
126   for this list.  The literal_head pointer is the head of the list,
127   with the literal_head_h dummy node at the start.  */
128
129typedef struct seg_list_struct
130{
131  struct seg_list_struct *next;
132  segT seg;
133} seg_list;
134
135static seg_list literal_head_h;
136static seg_list *literal_head = &literal_head_h;
137
138
139/* Lists of symbols.  We keep a list of symbols that label the current
140   instruction, so that we can adjust the symbols when inserting alignment
141   for various instructions.  We also keep a list of all the symbols on
142   literals, so that we can fix up those symbols when the literals are
143   later moved into the text sections.  */
144
145typedef struct sym_list_struct
146{
147  struct sym_list_struct *next;
148  symbolS *sym;
149} sym_list;
150
151static sym_list *insn_labels = NULL;
152static sym_list *free_insn_labels = NULL;
153static sym_list *saved_insn_labels = NULL;
154
155static sym_list *literal_syms;
156
157
158/* Flags to determine whether to prefer const16 or l32r
159   if both options are available.  */
160int prefer_const16 = 0;
161int prefer_l32r = 0;
162
163/* Global flag to indicate when we are emitting literals.  */
164int generating_literals = 0;
165
166/* The following PROPERTY table definitions are copied from
167   <elf/xtensa.h> and must be kept in sync with the code there.  */
168
169/* Flags in the property tables to specify whether blocks of memory
170   are literals, instructions, data, or unreachable.  For
171   instructions, blocks that begin loop targets and branch targets are
172   designated.  Blocks that do not allow density, instruction
173   reordering or transformation are also specified.  Finally, for
174   branch targets, branch target alignment priority is included.
175   Alignment of the next block is specified in the current block
176   and the size of the current block does not include any fill required
177   to align to the next block.  */
178
179#define XTENSA_PROP_LITERAL		0x00000001
180#define XTENSA_PROP_INSN		0x00000002
181#define XTENSA_PROP_DATA		0x00000004
182#define XTENSA_PROP_UNREACHABLE		0x00000008
183/* Instruction only properties at beginning of code.  */
184#define XTENSA_PROP_INSN_LOOP_TARGET	0x00000010
185#define XTENSA_PROP_INSN_BRANCH_TARGET	0x00000020
186/* Instruction only properties about code.  */
187#define XTENSA_PROP_INSN_NO_DENSITY	0x00000040
188#define XTENSA_PROP_INSN_NO_REORDER	0x00000080
189/* Historically, NO_TRANSFORM was a property of instructions,
190   but it should apply to literals under certain circumstances.  */
191#define XTENSA_PROP_NO_TRANSFORM	0x00000100
192
193/*  Branch target alignment information.  This transmits information
194    to the linker optimization about the priority of aligning a
195    particular block for branch target alignment: None, low priority,
196    high priority, or required.  These only need to be checked in
197    instruction blocks marked as XTENSA_PROP_INSN_BRANCH_TARGET.
198    Common usage is
199
200    switch (GET_XTENSA_PROP_BT_ALIGN (flags))
201    case XTENSA_PROP_BT_ALIGN_NONE:
202    case XTENSA_PROP_BT_ALIGN_LOW:
203    case XTENSA_PROP_BT_ALIGN_HIGH:
204    case XTENSA_PROP_BT_ALIGN_REQUIRE:
205*/
206#define XTENSA_PROP_BT_ALIGN_MASK       0x00000600
207
208/* No branch target alignment.  */
209#define XTENSA_PROP_BT_ALIGN_NONE       0x0
210/* Low priority branch target alignment.  */
211#define XTENSA_PROP_BT_ALIGN_LOW        0x1
212/* High priority branch target alignment.  */
213#define XTENSA_PROP_BT_ALIGN_HIGH       0x2
214/* Required branch target alignment.  */
215#define XTENSA_PROP_BT_ALIGN_REQUIRE    0x3
216
217#define SET_XTENSA_PROP_BT_ALIGN(flag, align) \
218  (((flag) & (~XTENSA_PROP_BT_ALIGN_MASK)) | \
219    (((align) << 9) & XTENSA_PROP_BT_ALIGN_MASK))
220
221
222/* Alignment is specified in the block BEFORE the one that needs
223   alignment.  Up to 5 bits.  Use GET_XTENSA_PROP_ALIGNMENT(flags) to
224   get the required alignment specified as a power of 2.  Use
225   SET_XTENSA_PROP_ALIGNMENT(flags, pow2) to set the required
226   alignment.  Be careful of side effects since the SET will evaluate
227   flags twice.  Also, note that the SIZE of a block in the property
228   table does not include the alignment size, so the alignment fill
229   must be calculated to determine if two blocks are contiguous.
230   TEXT_ALIGN is not currently implemented but is a placeholder for a
231   possible future implementation.  */
232
233#define XTENSA_PROP_ALIGN		0x00000800
234
235#define XTENSA_PROP_ALIGNMENT_MASK      0x0001f000
236
237#define SET_XTENSA_PROP_ALIGNMENT(flag, align) \
238  (((flag) & (~XTENSA_PROP_ALIGNMENT_MASK)) | \
239    (((align) << 12) & XTENSA_PROP_ALIGNMENT_MASK))
240
241#define XTENSA_PROP_INSN_ABSLIT 0x00020000
242
243
244/* Structure for saving instruction and alignment per-fragment data
245   that will be written to the object file.  This structure is
246   equivalent to the actual data that will be written out to the file
247   but is easier to use.   We provide a conversion to file flags
248   in frag_flags_to_number.  */
249
250typedef struct frag_flags_struct frag_flags;
251
252struct frag_flags_struct
253{
254  /* is_literal should only be used after xtensa_move_literals.
255     If you need to check if you are generating a literal fragment,
256     then use the generating_literals global.  */
257
258  unsigned is_literal : 1;
259  unsigned is_insn : 1;
260  unsigned is_data : 1;
261  unsigned is_unreachable : 1;
262
263  /* is_specific_opcode implies no_transform.  */
264  unsigned is_no_transform : 1;
265
266  struct
267  {
268    unsigned is_loop_target : 1;
269    unsigned is_branch_target : 1; /* Branch targets have a priority.  */
270    unsigned bt_align_priority : 2;
271
272    unsigned is_no_density : 1;
273    /* no_longcalls flag does not need to be placed in the object file.  */
274
275    unsigned is_no_reorder : 1;
276
277    /* Uses absolute literal addressing for l32r.  */
278    unsigned is_abslit : 1;
279  } insn;
280  unsigned is_align : 1;
281  unsigned alignment : 5;
282};
283
284
285/* Structure for saving information about a block of property data
286   for frags that have the same flags.  */
287struct xtensa_block_info_struct
288{
289  segT sec;
290  bfd_vma offset;
291  size_t size;
292  frag_flags flags;
293  struct xtensa_block_info_struct *next;
294};
295
296
297/* Structure for saving the current state before emitting literals.  */
298typedef struct emit_state_struct
299{
300  const char *name;
301  segT now_seg;
302  subsegT now_subseg;
303  int generating_literals;
304} emit_state;
305
306
307/* Opcode placement information */
308
309typedef unsigned long long bitfield;
310#define bit_is_set(bit, bf)	((bf) & (0x01ll << (bit)))
311#define set_bit(bit, bf)	((bf) |= (0x01ll << (bit)))
312#define clear_bit(bit, bf)	((bf) &= ~(0x01ll << (bit)))
313
314#define MAX_FORMATS 32
315
316typedef struct op_placement_info_struct
317{
318  int num_formats;
319  /* A number describing how restrictive the issue is for this
320     opcode.  For example, an opcode that fits lots of different
321     formats has a high freedom, as does an opcode that fits
322     only one format but many slots in that format.  The most
323     restrictive is the opcode that fits only one slot in one
324     format.  */
325  int issuef;
326  xtensa_format narrowest;
327  char narrowest_size;
328  char narrowest_slot;
329
330  /* formats is a bitfield with the Nth bit set
331     if the opcode fits in the Nth xtensa_format.  */
332  bitfield formats;
333
334  /* slots[N]'s Mth bit is set if the op fits in the
335     Mth slot of the Nth xtensa_format.  */
336  bitfield slots[MAX_FORMATS];
337
338  /* A count of the number of slots in a given format
339     an op can fit (i.e., the bitcount of the slot field above).  */
340  char slots_in_format[MAX_FORMATS];
341
342} op_placement_info, *op_placement_info_table;
343
344op_placement_info_table op_placement_table;
345
346
347/* Extra expression types.  */
348
349#define O_pltrel	O_md1	/* like O_symbol but use a PLT reloc */
350#define O_hi16		O_md2	/* use high 16 bits of symbolic value */
351#define O_lo16		O_md3	/* use low 16 bits of symbolic value */
352#define O_pcrel		O_md4	/* value is a PC-relative offset */
353#define O_tlsfunc	O_md5	/* TLS_FUNC/TLSDESC_FN relocation */
354#define O_tlsarg	O_md6	/* TLS_ARG/TLSDESC_ARG relocation */
355#define O_tlscall	O_md7	/* TLS_CALL relocation */
356#define O_tpoff		O_md8	/* TPOFF relocation */
357#define O_dtpoff	O_md9	/* DTPOFF relocation */
358
359struct suffix_reloc_map
360{
361  const char *suffix;
362  int length;
363  bfd_reloc_code_real_type reloc;
364  operatorT operator;
365};
366
367#define SUFFIX_MAP(str, reloc, op) { str, sizeof (str) - 1, reloc, op }
368
369static struct suffix_reloc_map suffix_relocs[] =
370{
371  SUFFIX_MAP ("l",	BFD_RELOC_LO16,			O_lo16),
372  SUFFIX_MAP ("h",	BFD_RELOC_HI16,			O_hi16),
373  SUFFIX_MAP ("plt",	BFD_RELOC_XTENSA_PLT,		O_pltrel),
374  SUFFIX_MAP ("pcrel",	BFD_RELOC_32_PCREL,		O_pcrel),
375  SUFFIX_MAP ("tlsfunc", BFD_RELOC_XTENSA_TLS_FUNC,	O_tlsfunc),
376  SUFFIX_MAP ("tlsarg",	BFD_RELOC_XTENSA_TLS_ARG,	O_tlsarg),
377  SUFFIX_MAP ("tlscall", BFD_RELOC_XTENSA_TLS_CALL,	O_tlscall),
378  SUFFIX_MAP ("tpoff",	BFD_RELOC_XTENSA_TLS_TPOFF,	O_tpoff),
379  SUFFIX_MAP ("dtpoff",	BFD_RELOC_XTENSA_TLS_DTPOFF,	O_dtpoff),
380};
381
382
383/* Directives.  */
384
385typedef enum
386{
387  directive_none = 0,
388  directive_literal,
389  directive_density,
390  directive_transform,
391  directive_freeregs,
392  directive_longcalls,
393  directive_literal_prefix,
394  directive_schedule,
395  directive_absolute_literals,
396  directive_last_directive
397} directiveE;
398
399typedef struct
400{
401  const char *name;
402  bfd_boolean can_be_negated;
403} directive_infoS;
404
405const directive_infoS directive_info[] =
406{
407  { "none",		FALSE },
408  { "literal",		FALSE },
409  { "density",		TRUE },
410  { "transform",	TRUE },
411  { "freeregs",		FALSE },
412  { "longcalls",	TRUE },
413  { "literal_prefix",	FALSE },
414  { "schedule",		TRUE },
415  { "absolute-literals", TRUE }
416};
417
418bfd_boolean directive_state[] =
419{
420  FALSE,			/* none */
421  FALSE,			/* literal */
422#if !XCHAL_HAVE_DENSITY
423  FALSE,			/* density */
424#else
425  TRUE,				/* density */
426#endif
427  TRUE,				/* transform */
428  FALSE,			/* freeregs */
429  FALSE,			/* longcalls */
430  FALSE,			/* literal_prefix */
431  FALSE,			/* schedule */
432#if XSHAL_USE_ABSOLUTE_LITERALS
433  TRUE				/* absolute_literals */
434#else
435  FALSE				/* absolute_literals */
436#endif
437};
438
439/* A circular list of all potential and actual literal pool locations
440   in a segment.  */
441struct litpool_frag
442{
443  struct litpool_frag *next;
444  struct litpool_frag *prev;
445  fragS *fragP;
446  addressT addr;
447  short priority; /* 1, 2, or 3 -- 1 is highest  */
448  short original_priority;
449};
450
451/* Map a segment to its litpool_frag list.  */
452struct litpool_seg
453{
454  struct litpool_seg *next;
455  asection *seg;
456  struct litpool_frag frag_list;
457  int frag_count; /* since last litpool location  */
458};
459
460static struct litpool_seg litpool_seg_list;
461
462
463/* Directive functions.  */
464
465static void xtensa_begin_directive (int);
466static void xtensa_end_directive (int);
467static void xtensa_literal_prefix (void);
468static void xtensa_literal_position (int);
469static void xtensa_literal_pseudo (int);
470static void xtensa_frequency_pseudo (int);
471static void xtensa_elf_cons (int);
472static void xtensa_leb128 (int);
473
474/* Parsing and Idiom Translation.  */
475
476static bfd_reloc_code_real_type xtensa_elf_suffix (char **, expressionS *);
477
478/* Various Other Internal Functions.  */
479
480extern bfd_boolean xg_is_single_relaxable_insn (TInsn *, TInsn *, bfd_boolean);
481static bfd_boolean xg_build_to_insn (TInsn *, TInsn *, BuildInstr *);
482static void xtensa_mark_literal_pool_location (void);
483static addressT get_expanded_loop_offset (xtensa_opcode);
484static fragS *get_literal_pool_location (segT);
485static void set_literal_pool_location (segT, fragS *);
486static void xtensa_set_frag_assembly_state (fragS *);
487static void finish_vinsn (vliw_insn *);
488static bfd_boolean emit_single_op (TInsn *);
489static int total_frag_text_expansion (fragS *);
490static bfd_boolean use_trampolines = TRUE;
491static void xtensa_check_frag_count (void);
492static void xtensa_create_trampoline_frag (bfd_boolean);
493static void xtensa_maybe_create_trampoline_frag (void);
494struct trampoline_frag;
495static int init_trampoline_frag (struct trampoline_frag *);
496static void xtensa_maybe_create_literal_pool_frag (bfd_boolean, bfd_boolean);
497static bfd_boolean auto_litpools = FALSE;
498static int auto_litpool_limit = 10000;
499
500/* Alignment Functions.  */
501
502static int get_text_align_power (unsigned);
503static int get_text_align_max_fill_size (int, bfd_boolean, bfd_boolean);
504static int branch_align_power (segT);
505
506/* Helpers for xtensa_relax_frag().  */
507
508static long relax_frag_add_nop (fragS *);
509
510/* Accessors for additional per-subsegment information.  */
511
512static unsigned get_last_insn_flags (segT, subsegT);
513static void set_last_insn_flags (segT, subsegT, unsigned, bfd_boolean);
514static float get_subseg_total_freq (segT, subsegT);
515static float get_subseg_target_freq (segT, subsegT);
516static void set_subseg_freq (segT, subsegT, float, float);
517
518/* Segment list functions.  */
519
520static void xtensa_move_literals (void);
521static void xtensa_reorder_segments (void);
522static void xtensa_switch_to_literal_fragment (emit_state *);
523static void xtensa_switch_to_non_abs_literal_fragment (emit_state *);
524static void xtensa_switch_section_emit_state (emit_state *, segT, subsegT);
525static void xtensa_restore_emit_state (emit_state *);
526static segT cache_literal_section (bfd_boolean);
527
528/* op_placement_info functions.  */
529
530static void init_op_placement_info_table (void);
531extern bfd_boolean opcode_fits_format_slot (xtensa_opcode, xtensa_format, int);
532static int xg_get_single_size (xtensa_opcode);
533static xtensa_format xg_get_single_format (xtensa_opcode);
534static int xg_get_single_slot (xtensa_opcode);
535
536/* TInsn and IStack functions.  */
537
538static bfd_boolean tinsn_has_symbolic_operands (const TInsn *);
539static bfd_boolean tinsn_has_invalid_symbolic_operands (const TInsn *);
540static bfd_boolean tinsn_has_complex_operands (const TInsn *);
541static bfd_boolean tinsn_to_insnbuf (TInsn *, xtensa_insnbuf);
542static bfd_boolean tinsn_check_arguments (const TInsn *);
543static void tinsn_from_chars (TInsn *, char *, int);
544static void tinsn_immed_from_frag (TInsn *, fragS *, int);
545static int get_num_stack_text_bytes (IStack *);
546static int get_num_stack_literal_bytes (IStack *);
547static bfd_boolean tinsn_to_slotbuf (xtensa_format, int, TInsn *, xtensa_insnbuf);
548
549/* vliw_insn functions.  */
550
551static void xg_init_vinsn (vliw_insn *);
552static void xg_copy_vinsn (vliw_insn *, vliw_insn *);
553static void xg_clear_vinsn (vliw_insn *);
554static bfd_boolean vinsn_has_specific_opcodes (vliw_insn *);
555static void xg_free_vinsn (vliw_insn *);
556static bfd_boolean vinsn_to_insnbuf
557  (vliw_insn *, char *, fragS *, bfd_boolean);
558static void vinsn_from_chars (vliw_insn *, char *);
559
560/* Expression Utilities.  */
561
562bfd_boolean expr_is_const (const expressionS *);
563offsetT get_expr_const (const expressionS *);
564void set_expr_const (expressionS *, offsetT);
565bfd_boolean expr_is_register (const expressionS *);
566offsetT get_expr_register (const expressionS *);
567void set_expr_symbol_offset (expressionS *, symbolS *, offsetT);
568bfd_boolean expr_is_equal (expressionS *, expressionS *);
569static void copy_expr (expressionS *, const expressionS *);
570
571/* Section renaming.  */
572
573static void build_section_rename (const char *);
574
575
576/* ISA imported from bfd.  */
577extern xtensa_isa xtensa_default_isa;
578
579extern int target_big_endian;
580
581static xtensa_opcode xtensa_addi_opcode;
582static xtensa_opcode xtensa_addmi_opcode;
583static xtensa_opcode xtensa_call0_opcode;
584static xtensa_opcode xtensa_call4_opcode;
585static xtensa_opcode xtensa_call8_opcode;
586static xtensa_opcode xtensa_call12_opcode;
587static xtensa_opcode xtensa_callx0_opcode;
588static xtensa_opcode xtensa_callx4_opcode;
589static xtensa_opcode xtensa_callx8_opcode;
590static xtensa_opcode xtensa_callx12_opcode;
591static xtensa_opcode xtensa_const16_opcode;
592static xtensa_opcode xtensa_entry_opcode;
593static xtensa_opcode xtensa_extui_opcode;
594static xtensa_opcode xtensa_movi_opcode;
595static xtensa_opcode xtensa_movi_n_opcode;
596static xtensa_opcode xtensa_isync_opcode;
597static xtensa_opcode xtensa_j_opcode;
598static xtensa_opcode xtensa_jx_opcode;
599static xtensa_opcode xtensa_l32r_opcode;
600static xtensa_opcode xtensa_loop_opcode;
601static xtensa_opcode xtensa_loopnez_opcode;
602static xtensa_opcode xtensa_loopgtz_opcode;
603static xtensa_opcode xtensa_nop_opcode;
604static xtensa_opcode xtensa_nop_n_opcode;
605static xtensa_opcode xtensa_or_opcode;
606static xtensa_opcode xtensa_ret_opcode;
607static xtensa_opcode xtensa_ret_n_opcode;
608static xtensa_opcode xtensa_retw_opcode;
609static xtensa_opcode xtensa_retw_n_opcode;
610static xtensa_opcode xtensa_rsr_lcount_opcode;
611static xtensa_opcode xtensa_waiti_opcode;
612static int config_max_slots = 0;
613
614
615/* Command-line Options.  */
616
617bfd_boolean use_literal_section = TRUE;
618enum flix_level produce_flix = FLIX_ALL;
619static bfd_boolean align_targets = TRUE;
620static bfd_boolean warn_unaligned_branch_targets = FALSE;
621static bfd_boolean has_a0_b_retw = FALSE;
622static bfd_boolean workaround_a0_b_retw = FALSE;
623static bfd_boolean workaround_b_j_loop_end = FALSE;
624static bfd_boolean workaround_short_loop = FALSE;
625static bfd_boolean maybe_has_short_loop = FALSE;
626static bfd_boolean workaround_close_loop_end = FALSE;
627static bfd_boolean maybe_has_close_loop_end = FALSE;
628static bfd_boolean enforce_three_byte_loop_align = FALSE;
629
630/* When workaround_short_loops is TRUE, all loops with early exits must
631   have at least 3 instructions.  workaround_all_short_loops is a modifier
632   to the workaround_short_loop flag.  In addition to the
633   workaround_short_loop actions, all straightline loopgtz and loopnez
634   must have at least 3 instructions.  */
635
636static bfd_boolean workaround_all_short_loops = FALSE;
637
638
639static void
640xtensa_setup_hw_workarounds (int earliest, int latest)
641{
642  if (earliest > latest)
643    as_fatal (_("illegal range of target hardware versions"));
644
645  /* Enable all workarounds for pre-T1050.0 hardware.  */
646  if (earliest < 105000 || latest < 105000)
647    {
648      workaround_a0_b_retw |= TRUE;
649      workaround_b_j_loop_end |= TRUE;
650      workaround_short_loop |= TRUE;
651      workaround_close_loop_end |= TRUE;
652      workaround_all_short_loops |= TRUE;
653      enforce_three_byte_loop_align = TRUE;
654    }
655}
656
657
658enum
659{
660  option_density = OPTION_MD_BASE,
661  option_no_density,
662
663  option_flix,
664  option_no_generate_flix,
665  option_no_flix,
666
667  option_relax,
668  option_no_relax,
669
670  option_link_relax,
671  option_no_link_relax,
672
673  option_generics,
674  option_no_generics,
675
676  option_transform,
677  option_no_transform,
678
679  option_text_section_literals,
680  option_no_text_section_literals,
681
682  option_absolute_literals,
683  option_no_absolute_literals,
684
685  option_align_targets,
686  option_no_align_targets,
687
688  option_warn_unaligned_targets,
689
690  option_longcalls,
691  option_no_longcalls,
692
693  option_workaround_a0_b_retw,
694  option_no_workaround_a0_b_retw,
695
696  option_workaround_b_j_loop_end,
697  option_no_workaround_b_j_loop_end,
698
699  option_workaround_short_loop,
700  option_no_workaround_short_loop,
701
702  option_workaround_all_short_loops,
703  option_no_workaround_all_short_loops,
704
705  option_workaround_close_loop_end,
706  option_no_workaround_close_loop_end,
707
708  option_no_workarounds,
709
710  option_rename_section_name,
711
712  option_prefer_l32r,
713  option_prefer_const16,
714
715  option_target_hardware,
716
717  option_trampolines,
718  option_no_trampolines,
719
720  option_auto_litpools,
721  option_no_auto_litpools,
722  option_auto_litpool_limit,
723};
724
725const char *md_shortopts = "";
726
727struct option md_longopts[] =
728{
729  { "density", no_argument, NULL, option_density },
730  { "no-density", no_argument, NULL, option_no_density },
731
732  { "flix", no_argument, NULL, option_flix },
733  { "no-generate-flix", no_argument, NULL, option_no_generate_flix },
734  { "no-allow-flix", no_argument, NULL, option_no_flix },
735
736  /* Both "relax" and "generics" are deprecated and treated as equivalent
737     to the "transform" option.  */
738  { "relax", no_argument, NULL, option_relax },
739  { "no-relax", no_argument, NULL, option_no_relax },
740  { "generics", no_argument, NULL, option_generics },
741  { "no-generics", no_argument, NULL, option_no_generics },
742
743  { "transform", no_argument, NULL, option_transform },
744  { "no-transform", no_argument, NULL, option_no_transform },
745  { "text-section-literals", no_argument, NULL, option_text_section_literals },
746  { "no-text-section-literals", no_argument, NULL,
747    option_no_text_section_literals },
748  { "absolute-literals", no_argument, NULL, option_absolute_literals },
749  { "no-absolute-literals", no_argument, NULL, option_no_absolute_literals },
750  /* This option was changed from -align-target to -target-align
751     because it conflicted with the "-al" option.  */
752  { "target-align", no_argument, NULL, option_align_targets },
753  { "no-target-align", no_argument, NULL, option_no_align_targets },
754  { "warn-unaligned-targets", no_argument, NULL,
755    option_warn_unaligned_targets },
756  { "longcalls", no_argument, NULL, option_longcalls },
757  { "no-longcalls", no_argument, NULL, option_no_longcalls },
758
759  { "no-workaround-a0-b-retw", no_argument, NULL,
760    option_no_workaround_a0_b_retw },
761  { "workaround-a0-b-retw", no_argument, NULL, option_workaround_a0_b_retw },
762
763  { "no-workaround-b-j-loop-end", no_argument, NULL,
764    option_no_workaround_b_j_loop_end },
765  { "workaround-b-j-loop-end", no_argument, NULL,
766    option_workaround_b_j_loop_end },
767
768  { "no-workaround-short-loops", no_argument, NULL,
769    option_no_workaround_short_loop },
770  { "workaround-short-loops", no_argument, NULL,
771    option_workaround_short_loop },
772
773  { "no-workaround-all-short-loops", no_argument, NULL,
774    option_no_workaround_all_short_loops },
775  { "workaround-all-short-loop", no_argument, NULL,
776    option_workaround_all_short_loops },
777
778  { "prefer-l32r", no_argument, NULL, option_prefer_l32r },
779  { "prefer-const16", no_argument, NULL, option_prefer_const16 },
780
781  { "no-workarounds", no_argument, NULL, option_no_workarounds },
782
783  { "no-workaround-close-loop-end", no_argument, NULL,
784    option_no_workaround_close_loop_end },
785  { "workaround-close-loop-end", no_argument, NULL,
786    option_workaround_close_loop_end },
787
788  { "rename-section", required_argument, NULL, option_rename_section_name },
789
790  { "link-relax", no_argument, NULL, option_link_relax },
791  { "no-link-relax", no_argument, NULL, option_no_link_relax },
792
793  { "target-hardware", required_argument, NULL, option_target_hardware },
794
795  { "trampolines", no_argument, NULL, option_trampolines },
796  { "no-trampolines", no_argument, NULL, option_no_trampolines },
797
798  { "auto-litpools", no_argument, NULL, option_auto_litpools },
799  { "no-auto-litpools", no_argument, NULL, option_no_auto_litpools },
800  { "auto-litpool-limit", required_argument, NULL, option_auto_litpool_limit },
801
802  { NULL, no_argument, NULL, 0 }
803};
804
805size_t md_longopts_size = sizeof md_longopts;
806
807
808int
809md_parse_option (int c, const char *arg)
810{
811  switch (c)
812    {
813    case option_density:
814      as_warn (_("--density option is ignored"));
815      return 1;
816    case option_no_density:
817      as_warn (_("--no-density option is ignored"));
818      return 1;
819    case option_link_relax:
820      linkrelax = 1;
821      return 1;
822    case option_no_link_relax:
823      linkrelax = 0;
824      return 1;
825    case option_flix:
826      produce_flix = FLIX_ALL;
827      return 1;
828    case option_no_generate_flix:
829      produce_flix = FLIX_NO_GENERATE;
830      return 1;
831    case option_no_flix:
832      produce_flix = FLIX_NONE;
833      return 1;
834    case option_generics:
835      as_warn (_("--generics is deprecated; use --transform instead"));
836      return md_parse_option (option_transform, arg);
837    case option_no_generics:
838      as_warn (_("--no-generics is deprecated; use --no-transform instead"));
839      return md_parse_option (option_no_transform, arg);
840    case option_relax:
841      as_warn (_("--relax is deprecated; use --transform instead"));
842      return md_parse_option (option_transform, arg);
843    case option_no_relax:
844      as_warn (_("--no-relax is deprecated; use --no-transform instead"));
845      return md_parse_option (option_no_transform, arg);
846    case option_longcalls:
847      directive_state[directive_longcalls] = TRUE;
848      return 1;
849    case option_no_longcalls:
850      directive_state[directive_longcalls] = FALSE;
851      return 1;
852    case option_text_section_literals:
853      use_literal_section = FALSE;
854      return 1;
855    case option_no_text_section_literals:
856      use_literal_section = TRUE;
857      return 1;
858    case option_absolute_literals:
859      if (!absolute_literals_supported)
860	{
861	  as_fatal (_("--absolute-literals option not supported in this Xtensa configuration"));
862	  return 0;
863	}
864      directive_state[directive_absolute_literals] = TRUE;
865      return 1;
866    case option_no_absolute_literals:
867      directive_state[directive_absolute_literals] = FALSE;
868      return 1;
869
870    case option_workaround_a0_b_retw:
871      workaround_a0_b_retw = TRUE;
872      return 1;
873    case option_no_workaround_a0_b_retw:
874      workaround_a0_b_retw = FALSE;
875      return 1;
876    case option_workaround_b_j_loop_end:
877      workaround_b_j_loop_end = TRUE;
878      return 1;
879    case option_no_workaround_b_j_loop_end:
880      workaround_b_j_loop_end = FALSE;
881      return 1;
882
883    case option_workaround_short_loop:
884      workaround_short_loop = TRUE;
885      return 1;
886    case option_no_workaround_short_loop:
887      workaround_short_loop = FALSE;
888      return 1;
889
890    case option_workaround_all_short_loops:
891      workaround_all_short_loops = TRUE;
892      return 1;
893    case option_no_workaround_all_short_loops:
894      workaround_all_short_loops = FALSE;
895      return 1;
896
897    case option_workaround_close_loop_end:
898      workaround_close_loop_end = TRUE;
899      return 1;
900    case option_no_workaround_close_loop_end:
901      workaround_close_loop_end = FALSE;
902      return 1;
903
904    case option_no_workarounds:
905      workaround_a0_b_retw = FALSE;
906      workaround_b_j_loop_end = FALSE;
907      workaround_short_loop = FALSE;
908      workaround_all_short_loops = FALSE;
909      workaround_close_loop_end = FALSE;
910      return 1;
911
912    case option_align_targets:
913      align_targets = TRUE;
914      return 1;
915    case option_no_align_targets:
916      align_targets = FALSE;
917      return 1;
918
919    case option_warn_unaligned_targets:
920      warn_unaligned_branch_targets = TRUE;
921      return 1;
922
923    case option_rename_section_name:
924      build_section_rename (arg);
925      return 1;
926
927    case 'Q':
928      /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
929         should be emitted or not.  FIXME: Not implemented.  */
930      return 1;
931
932    case option_prefer_l32r:
933      if (prefer_const16)
934	as_fatal (_("prefer-l32r conflicts with prefer-const16"));
935      prefer_l32r = 1;
936      return 1;
937
938    case option_prefer_const16:
939      if (prefer_l32r)
940	as_fatal (_("prefer-const16 conflicts with prefer-l32r"));
941      prefer_const16 = 1;
942      return 1;
943
944    case option_target_hardware:
945      {
946	int earliest, latest = 0;
947	char *end;
948	if (*arg == 0 || *arg == '-')
949	  as_fatal (_("invalid target hardware version"));
950
951	earliest = strtol (arg, &end, 0);
952
953	if (*end == 0)
954	  latest = earliest;
955	else if (*end == '-')
956	  {
957	    if (*++end == 0)
958	      as_fatal (_("invalid target hardware version"));
959	    latest = strtol (end, &end, 0);
960	  }
961	if (*end != 0)
962	  as_fatal (_("invalid target hardware version"));
963
964	xtensa_setup_hw_workarounds (earliest, latest);
965	return 1;
966      }
967
968    case option_transform:
969      /* This option has no affect other than to use the defaults,
970	 which are already set.  */
971      return 1;
972
973    case option_no_transform:
974      /* This option turns off all transformations of any kind.
975	 However, because we want to preserve the state of other
976	 directives, we only change its own field.  Thus, before
977	 you perform any transformation, always check if transform
978	 is available.  If you use the functions we provide for this
979	 purpose, you will be ok.  */
980      directive_state[directive_transform] = FALSE;
981      return 1;
982
983    case option_trampolines:
984      use_trampolines = TRUE;
985      return 1;
986
987    case option_no_trampolines:
988      use_trampolines = FALSE;
989      return 1;
990
991    case option_auto_litpools:
992      auto_litpools = TRUE;
993      use_literal_section = FALSE;
994      return 1;
995
996    case option_no_auto_litpools:
997      auto_litpools = FALSE;
998      auto_litpool_limit = -1;
999      return 1;
1000
1001    case option_auto_litpool_limit:
1002      {
1003	int value = 0;
1004	char *end;
1005	if (auto_litpool_limit < 0)
1006	  as_fatal (_("no-auto-litpools is incompatible with auto-litpool-limit"));
1007	if (*arg == 0 || *arg == '-')
1008	  as_fatal (_("invalid auto-litpool-limit argument"));
1009	value = strtol (arg, &end, 10);
1010	if (*end != 0)
1011	  as_fatal (_("invalid auto-litpool-limit argument"));
1012	if (value < 100 || value > 10000)
1013	  as_fatal (_("invalid auto-litpool-limit argument (range is 100-10000)"));
1014	auto_litpool_limit = value;
1015	auto_litpools = TRUE;
1016	use_literal_section = FALSE;
1017	return 1;
1018      }
1019
1020    default:
1021      return 0;
1022    }
1023}
1024
1025
1026void
1027md_show_usage (FILE *stream)
1028{
1029  fputs ("\n\
1030Xtensa options:\n\
1031  --[no-]text-section-literals\n\
1032                          [Do not] put literals in the text section\n\
1033  --[no-]absolute-literals\n\
1034                          [Do not] default to use non-PC-relative literals\n\
1035  --[no-]target-align     [Do not] try to align branch targets\n\
1036  --[no-]longcalls        [Do not] emit 32-bit call sequences\n\
1037  --[no-]transform        [Do not] transform instructions\n\
1038  --flix                  both allow hand-written and generate flix bundles\n\
1039  --no-generate-flix      allow hand-written but do not generate\n\
1040                          flix bundles\n\
1041  --no-allow-flix         neither allow hand-written nor generate\n\
1042                          flix bundles\n\
1043  --rename-section old=new Rename section 'old' to 'new'\n\
1044  --[no-]trampolines      [Do not] generate trampolines (jumps to jumps)\n\
1045                          when jumps do not reach their targets\n\
1046  --[no-]auto-litpools    [Do not] automatically create literal pools\n\
1047  --auto-litpool-limit=<value>\n\
1048                          (range 100-10000) Maximum number of blocks of\n\
1049                          instructions to emit between literal pool\n\
1050                          locations; implies --auto-litpools flag\n", stream);
1051}
1052
1053
1054/* Functions related to the list of current label symbols.  */
1055
1056static void
1057xtensa_add_insn_label (symbolS *sym)
1058{
1059  sym_list *l;
1060
1061  if (!free_insn_labels)
1062    l = XNEW (sym_list);
1063  else
1064    {
1065      l = free_insn_labels;
1066      free_insn_labels = l->next;
1067    }
1068
1069  l->sym = sym;
1070  l->next = insn_labels;
1071  insn_labels = l;
1072}
1073
1074
1075static void
1076xtensa_clear_insn_labels (void)
1077{
1078  sym_list **pl;
1079
1080  for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1081    ;
1082  *pl = insn_labels;
1083  insn_labels = NULL;
1084}
1085
1086
1087static void
1088xtensa_move_labels (fragS *new_frag, valueT new_offset)
1089{
1090  sym_list *lit;
1091
1092  for (lit = insn_labels; lit; lit = lit->next)
1093    {
1094      symbolS *lit_sym = lit->sym;
1095      S_SET_VALUE (lit_sym, new_offset);
1096      symbol_set_frag (lit_sym, new_frag);
1097    }
1098}
1099
1100
1101/* Directive data and functions.  */
1102
1103typedef struct state_stackS_struct
1104{
1105  directiveE directive;
1106  bfd_boolean negated;
1107  bfd_boolean old_state;
1108  const char *file;
1109  unsigned int line;
1110  const void *datum;
1111  struct state_stackS_struct *prev;
1112} state_stackS;
1113
1114state_stackS *directive_state_stack;
1115
1116const pseudo_typeS md_pseudo_table[] =
1117{
1118  { "align", s_align_bytes, 0 }, /* Defaulting is invalid (0).  */
1119  { "literal_position", xtensa_literal_position, 0 },
1120  { "frame", s_ignore, 0 },	/* Formerly used for STABS debugging.  */
1121  { "long", xtensa_elf_cons, 4 },
1122  { "word", xtensa_elf_cons, 4 },
1123  { "4byte", xtensa_elf_cons, 4 },
1124  { "short", xtensa_elf_cons, 2 },
1125  { "2byte", xtensa_elf_cons, 2 },
1126  { "sleb128", xtensa_leb128, 1},
1127  { "uleb128", xtensa_leb128, 0},
1128  { "begin", xtensa_begin_directive, 0 },
1129  { "end", xtensa_end_directive, 0 },
1130  { "literal", xtensa_literal_pseudo, 0 },
1131  { "frequency", xtensa_frequency_pseudo, 0 },
1132  { NULL, 0, 0 },
1133};
1134
1135
1136static bfd_boolean
1137use_transform (void)
1138{
1139  /* After md_end, you should be checking frag by frag, rather
1140     than state directives.  */
1141  gas_assert (!past_xtensa_end);
1142  return directive_state[directive_transform];
1143}
1144
1145
1146static bfd_boolean
1147do_align_targets (void)
1148{
1149  /* Do not use this function after md_end; just look at align_targets
1150     instead.  There is no target-align directive, so alignment is either
1151     enabled for all frags or not done at all.  */
1152  gas_assert (!past_xtensa_end);
1153  return align_targets && use_transform ();
1154}
1155
1156
1157static void
1158directive_push (directiveE directive, bfd_boolean negated, const void *datum)
1159{
1160  const char *file;
1161  unsigned int line;
1162  state_stackS *stack = XNEW (state_stackS);
1163
1164  file = as_where (&line);
1165
1166  stack->directive = directive;
1167  stack->negated = negated;
1168  stack->old_state = directive_state[directive];
1169  stack->file = file;
1170  stack->line = line;
1171  stack->datum = datum;
1172  stack->prev = directive_state_stack;
1173  directive_state_stack = stack;
1174
1175  directive_state[directive] = !negated;
1176}
1177
1178
1179static void
1180directive_pop (directiveE *directive,
1181	       bfd_boolean *negated,
1182	       const char **file,
1183	       unsigned int *line,
1184	       const void **datum)
1185{
1186  state_stackS *top = directive_state_stack;
1187
1188  if (!directive_state_stack)
1189    {
1190      as_bad (_("unmatched end directive"));
1191      *directive = directive_none;
1192      return;
1193    }
1194
1195  directive_state[directive_state_stack->directive] = top->old_state;
1196  *directive = top->directive;
1197  *negated = top->negated;
1198  *file = top->file;
1199  *line = top->line;
1200  *datum = top->datum;
1201  directive_state_stack = top->prev;
1202  free (top);
1203}
1204
1205
1206static void
1207directive_balance (void)
1208{
1209  while (directive_state_stack)
1210    {
1211      directiveE directive;
1212      bfd_boolean negated;
1213      const char *file;
1214      unsigned int line;
1215      const void *datum;
1216
1217      directive_pop (&directive, &negated, &file, &line, &datum);
1218      as_warn_where ((char *) file, line,
1219		     _(".begin directive with no matching .end directive"));
1220    }
1221}
1222
1223
1224static bfd_boolean
1225inside_directive (directiveE dir)
1226{
1227  state_stackS *top = directive_state_stack;
1228
1229  while (top && top->directive != dir)
1230    top = top->prev;
1231
1232  return (top != NULL);
1233}
1234
1235
1236static void
1237get_directive (directiveE *directive, bfd_boolean *negated)
1238{
1239  int len;
1240  unsigned i;
1241  const char *directive_string;
1242
1243  if (strncmp (input_line_pointer, "no-", 3) != 0)
1244    *negated = FALSE;
1245  else
1246    {
1247      *negated = TRUE;
1248      input_line_pointer += 3;
1249    }
1250
1251  len = strspn (input_line_pointer,
1252		"abcdefghijklmnopqrstuvwxyz_-/0123456789.");
1253
1254  /* This code is a hack to make .begin [no-][generics|relax] exactly
1255     equivalent to .begin [no-]transform.  We should remove it when
1256     we stop accepting those options.  */
1257
1258  if (strncmp (input_line_pointer, "generics", strlen ("generics")) == 0)
1259    {
1260      as_warn (_("[no-]generics is deprecated; use [no-]transform instead"));
1261      directive_string = "transform";
1262    }
1263  else if (strncmp (input_line_pointer, "relax", strlen ("relax")) == 0)
1264    {
1265      as_warn (_("[no-]relax is deprecated; use [no-]transform instead"));
1266      directive_string = "transform";
1267    }
1268  else
1269    directive_string = input_line_pointer;
1270
1271  for (i = 0; i < sizeof (directive_info) / sizeof (*directive_info); ++i)
1272    {
1273      if (strncmp (directive_string, directive_info[i].name, len) == 0)
1274	{
1275	  input_line_pointer += len;
1276	  *directive = (directiveE) i;
1277	  if (*negated && !directive_info[i].can_be_negated)
1278	    as_bad (_("directive %s cannot be negated"),
1279		    directive_info[i].name);
1280	  return;
1281	}
1282    }
1283
1284  as_bad (_("unknown directive"));
1285  *directive = (directiveE) XTENSA_UNDEFINED;
1286}
1287
1288
1289static void
1290xtensa_begin_directive (int ignore ATTRIBUTE_UNUSED)
1291{
1292  directiveE directive;
1293  bfd_boolean negated;
1294  emit_state *state;
1295  lit_state *ls;
1296
1297  get_directive (&directive, &negated);
1298  if (directive == (directiveE) XTENSA_UNDEFINED)
1299    {
1300      discard_rest_of_line ();
1301      return;
1302    }
1303
1304  if (cur_vinsn.inside_bundle)
1305    as_bad (_("directives are not valid inside bundles"));
1306
1307  switch (directive)
1308    {
1309    case directive_literal:
1310      if (!inside_directive (directive_literal))
1311	{
1312	  /* Previous labels go with whatever follows this directive, not with
1313	     the literal, so save them now.  */
1314	  saved_insn_labels = insn_labels;
1315	  insn_labels = NULL;
1316	}
1317      as_warn (_(".begin literal is deprecated; use .literal instead"));
1318      state = XNEW (emit_state);
1319      xtensa_switch_to_literal_fragment (state);
1320      directive_push (directive_literal, negated, state);
1321      break;
1322
1323    case directive_literal_prefix:
1324      /* Have to flush pending output because a movi relaxed to an l32r
1325	 might produce a literal.  */
1326      md_flush_pending_output ();
1327      /* Check to see if the current fragment is a literal
1328	 fragment.  If it is, then this operation is not allowed.  */
1329      if (generating_literals)
1330	{
1331	  as_bad (_("cannot set literal_prefix inside literal fragment"));
1332	  return;
1333	}
1334
1335      /* Allocate the literal state for this section and push
1336	 onto the directive stack.  */
1337      ls = XNEW (lit_state);
1338      gas_assert (ls);
1339
1340      *ls = default_lit_sections;
1341      directive_push (directive_literal_prefix, negated, ls);
1342
1343      /* Process the new prefix.  */
1344      xtensa_literal_prefix ();
1345      break;
1346
1347    case directive_freeregs:
1348      /* This information is currently unused, but we'll accept the statement
1349         and just discard the rest of the line.  This won't check the syntax,
1350         but it will accept every correct freeregs directive.  */
1351      input_line_pointer += strcspn (input_line_pointer, "\n");
1352      directive_push (directive_freeregs, negated, 0);
1353      break;
1354
1355    case directive_schedule:
1356      md_flush_pending_output ();
1357      frag_var (rs_fill, 0, 0, frag_now->fr_subtype,
1358		frag_now->fr_symbol, frag_now->fr_offset, NULL);
1359      directive_push (directive_schedule, negated, 0);
1360      xtensa_set_frag_assembly_state (frag_now);
1361      break;
1362
1363    case directive_density:
1364      as_warn (_(".begin [no-]density is ignored"));
1365      break;
1366
1367    case directive_absolute_literals:
1368      md_flush_pending_output ();
1369      if (!absolute_literals_supported && !negated)
1370	{
1371	  as_warn (_("Xtensa absolute literals option not supported; ignored"));
1372	  break;
1373	}
1374      xtensa_set_frag_assembly_state (frag_now);
1375      directive_push (directive, negated, 0);
1376      break;
1377
1378    default:
1379      md_flush_pending_output ();
1380      xtensa_set_frag_assembly_state (frag_now);
1381      directive_push (directive, negated, 0);
1382      break;
1383    }
1384
1385  demand_empty_rest_of_line ();
1386}
1387
1388
1389static void
1390xtensa_end_directive (int ignore ATTRIBUTE_UNUSED)
1391{
1392  directiveE begin_directive, end_directive;
1393  bfd_boolean begin_negated, end_negated;
1394  const char *file;
1395  unsigned int line;
1396  emit_state *state;
1397  emit_state **state_ptr;
1398  lit_state *s;
1399
1400  if (cur_vinsn.inside_bundle)
1401    as_bad (_("directives are not valid inside bundles"));
1402
1403  get_directive (&end_directive, &end_negated);
1404
1405  md_flush_pending_output ();
1406
1407  switch ((int) end_directive)
1408    {
1409    case XTENSA_UNDEFINED:
1410      discard_rest_of_line ();
1411      return;
1412
1413    case (int) directive_density:
1414      as_warn (_(".end [no-]density is ignored"));
1415      demand_empty_rest_of_line ();
1416      break;
1417
1418    case (int) directive_absolute_literals:
1419      if (!absolute_literals_supported && !end_negated)
1420	{
1421	  as_warn (_("Xtensa absolute literals option not supported; ignored"));
1422	  demand_empty_rest_of_line ();
1423	  return;
1424	}
1425      break;
1426
1427    default:
1428      break;
1429    }
1430
1431  state_ptr = &state; /* use state_ptr to avoid type-punning warning */
1432  directive_pop (&begin_directive, &begin_negated, &file, &line,
1433		 (const void **) state_ptr);
1434
1435  if (begin_directive != directive_none)
1436    {
1437      if (begin_directive != end_directive || begin_negated != end_negated)
1438	{
1439	  as_bad (_("does not match begin %s%s at %s:%d"),
1440		  begin_negated ? "no-" : "",
1441		  directive_info[begin_directive].name, file, line);
1442	}
1443      else
1444	{
1445	  switch (end_directive)
1446	    {
1447	    case directive_literal:
1448	      frag_var (rs_fill, 0, 0, 0, NULL, 0, NULL);
1449	      xtensa_restore_emit_state (state);
1450	      xtensa_set_frag_assembly_state (frag_now);
1451	      free (state);
1452	      if (!inside_directive (directive_literal))
1453		{
1454		  /* Restore the list of current labels.  */
1455		  xtensa_clear_insn_labels ();
1456		  insn_labels = saved_insn_labels;
1457		}
1458	      break;
1459
1460	    case directive_literal_prefix:
1461	      /* Restore the default collection sections from saved state.  */
1462	      s = (lit_state *) state;
1463	      gas_assert (s);
1464	      default_lit_sections = *s;
1465
1466	      /* Free the state storage.  */
1467	      free (s->lit_prefix);
1468	      free (s);
1469	      break;
1470
1471	    case directive_schedule:
1472	    case directive_freeregs:
1473	      break;
1474
1475	    default:
1476	      xtensa_set_frag_assembly_state (frag_now);
1477	      break;
1478	    }
1479	}
1480    }
1481
1482  demand_empty_rest_of_line ();
1483}
1484
1485
1486/* Place an aligned literal fragment at the current location.  */
1487
1488static void
1489xtensa_literal_position (int ignore ATTRIBUTE_UNUSED)
1490{
1491  md_flush_pending_output ();
1492
1493  if (inside_directive (directive_literal))
1494    as_warn (_(".literal_position inside literal directive; ignoring"));
1495  xtensa_mark_literal_pool_location ();
1496
1497  demand_empty_rest_of_line ();
1498  xtensa_clear_insn_labels ();
1499}
1500
1501
1502/* Support .literal label, expr, ...  */
1503
1504static void
1505xtensa_literal_pseudo (int ignored ATTRIBUTE_UNUSED)
1506{
1507  emit_state state;
1508  char *p, *base_name;
1509  char c;
1510  segT dest_seg;
1511
1512  if (inside_directive (directive_literal))
1513    {
1514      as_bad (_(".literal not allowed inside .begin literal region"));
1515      ignore_rest_of_line ();
1516      return;
1517    }
1518
1519  md_flush_pending_output ();
1520
1521  /* Previous labels go with whatever follows this directive, not with
1522     the literal, so save them now.  */
1523  saved_insn_labels = insn_labels;
1524  insn_labels = NULL;
1525
1526  /* If we are using text-section literals, then this is the right value... */
1527  dest_seg = now_seg;
1528
1529  base_name = input_line_pointer;
1530
1531  xtensa_switch_to_literal_fragment (&state);
1532
1533  /* ...but if we aren't using text-section-literals, then we
1534     need to put them in the section we just switched to.  */
1535  if (use_literal_section || directive_state[directive_absolute_literals])
1536    dest_seg = now_seg;
1537
1538  /* FIXME, despite the previous comments, dest_seg is unused...  */
1539  (void) dest_seg;
1540
1541  /* All literals are aligned to four-byte boundaries.  */
1542  frag_align (2, 0, 0);
1543  record_alignment (now_seg, 2);
1544
1545  c = get_symbol_name (&base_name);
1546  /* Just after name is now '\0'.  */
1547  p = input_line_pointer;
1548  *p = c;
1549  SKIP_WHITESPACE_AFTER_NAME ();
1550
1551  if (*input_line_pointer != ',' && *input_line_pointer != ':')
1552    {
1553      as_bad (_("expected comma or colon after symbol name; "
1554		"rest of line ignored"));
1555      ignore_rest_of_line ();
1556      xtensa_restore_emit_state (&state);
1557      return;
1558    }
1559
1560  *p = 0;
1561  colon (base_name);
1562  *p = c;
1563
1564  input_line_pointer++;		/* skip ',' or ':' */
1565
1566  xtensa_elf_cons (4);
1567
1568  xtensa_restore_emit_state (&state);
1569
1570  /* Restore the list of current labels.  */
1571  xtensa_clear_insn_labels ();
1572  insn_labels = saved_insn_labels;
1573}
1574
1575
1576static void
1577xtensa_literal_prefix (void)
1578{
1579  char *name;
1580  int len;
1581
1582  /* Parse the new prefix from the input_line_pointer.  */
1583  SKIP_WHITESPACE ();
1584  len = strspn (input_line_pointer,
1585		"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
1586		"abcdefghijklmnopqrstuvwxyz_/0123456789.$");
1587
1588  /* Get a null-terminated copy of the name.  */
1589  name = xmemdup0 (input_line_pointer, len);
1590
1591  /* Skip the name in the input line.  */
1592  input_line_pointer += len;
1593
1594  default_lit_sections.lit_prefix = name;
1595
1596  /* Clear cached literal sections, since the prefix has changed.  */
1597  default_lit_sections.lit_seg = NULL;
1598  default_lit_sections.lit4_seg = NULL;
1599}
1600
1601
1602/* Support ".frequency branch_target_frequency fall_through_frequency".  */
1603
1604static void
1605xtensa_frequency_pseudo (int ignored ATTRIBUTE_UNUSED)
1606{
1607  float fall_through_f, target_f;
1608
1609  fall_through_f = (float) strtod (input_line_pointer, &input_line_pointer);
1610  if (fall_through_f < 0)
1611    {
1612      as_bad (_("fall through frequency must be greater than 0"));
1613      ignore_rest_of_line ();
1614      return;
1615    }
1616
1617  target_f = (float) strtod (input_line_pointer, &input_line_pointer);
1618  if (target_f < 0)
1619    {
1620      as_bad (_("branch target frequency must be greater than 0"));
1621      ignore_rest_of_line ();
1622      return;
1623    }
1624
1625  set_subseg_freq (now_seg, now_subseg, target_f + fall_through_f, target_f);
1626
1627  demand_empty_rest_of_line ();
1628}
1629
1630
1631/* Like normal .long/.short/.word, except support @plt, etc.
1632   Clobbers input_line_pointer, checks end-of-line.  */
1633
1634static void
1635xtensa_elf_cons (int nbytes)
1636{
1637  expressionS exp;
1638  bfd_reloc_code_real_type reloc;
1639
1640  md_flush_pending_output ();
1641
1642  if (cur_vinsn.inside_bundle)
1643    as_bad (_("directives are not valid inside bundles"));
1644
1645  if (is_it_end_of_statement ())
1646    {
1647      demand_empty_rest_of_line ();
1648      return;
1649    }
1650
1651  do
1652    {
1653      expression (&exp);
1654      if (exp.X_op == O_symbol
1655	  && *input_line_pointer == '@'
1656	  && ((reloc = xtensa_elf_suffix (&input_line_pointer, &exp))
1657	      != BFD_RELOC_NONE))
1658	{
1659	  reloc_howto_type *reloc_howto =
1660	    bfd_reloc_type_lookup (stdoutput, reloc);
1661
1662	  if (reloc == BFD_RELOC_UNUSED || !reloc_howto)
1663	    as_bad (_("unsupported relocation"));
1664	  else if ((reloc >= BFD_RELOC_XTENSA_SLOT0_OP
1665		    && reloc <= BFD_RELOC_XTENSA_SLOT14_OP)
1666		   || (reloc >= BFD_RELOC_XTENSA_SLOT0_ALT
1667		       && reloc <= BFD_RELOC_XTENSA_SLOT14_ALT))
1668	    as_bad (_("opcode-specific %s relocation used outside "
1669		      "an instruction"), reloc_howto->name);
1670	  else if (nbytes != (int) bfd_get_reloc_size (reloc_howto))
1671	    as_bad (_("%s relocations do not fit in %d bytes"),
1672		    reloc_howto->name, nbytes);
1673	  else if (reloc == BFD_RELOC_XTENSA_TLS_FUNC
1674		   || reloc == BFD_RELOC_XTENSA_TLS_ARG
1675		   || reloc == BFD_RELOC_XTENSA_TLS_CALL)
1676	    as_bad (_("invalid use of %s relocation"), reloc_howto->name);
1677	  else
1678	    {
1679	      char *p = frag_more ((int) nbytes);
1680	      xtensa_set_frag_assembly_state (frag_now);
1681	      fix_new_exp (frag_now, p - frag_now->fr_literal,
1682			   nbytes, &exp, reloc_howto->pc_relative, reloc);
1683	    }
1684	}
1685      else
1686	{
1687	  xtensa_set_frag_assembly_state (frag_now);
1688	  emit_expr (&exp, (unsigned int) nbytes);
1689	}
1690    }
1691  while (*input_line_pointer++ == ',');
1692
1693  input_line_pointer--;		/* Put terminator back into stream.  */
1694  demand_empty_rest_of_line ();
1695}
1696
1697static bfd_boolean is_leb128_expr;
1698
1699static void
1700xtensa_leb128 (int sign)
1701{
1702  is_leb128_expr = TRUE;
1703  s_leb128 (sign);
1704  is_leb128_expr = FALSE;
1705}
1706
1707
1708/* Parsing and Idiom Translation.  */
1709
1710/* Parse @plt, etc. and return the desired relocation.  */
1711static bfd_reloc_code_real_type
1712xtensa_elf_suffix (char **str_p, expressionS *exp_p)
1713{
1714  char ident[20];
1715  char *str = *str_p;
1716  char *str2;
1717  int ch;
1718  int len;
1719  unsigned int i;
1720
1721  if (*str++ != '@')
1722    return BFD_RELOC_NONE;
1723
1724  for (ch = *str, str2 = ident;
1725       (str2 < ident + sizeof (ident) - 1
1726	&& (ISALNUM (ch) || ch == '@'));
1727       ch = *++str)
1728    {
1729      *str2++ = (ISLOWER (ch)) ? ch : TOLOWER (ch);
1730    }
1731
1732  *str2 = '\0';
1733  len = str2 - ident;
1734
1735  ch = ident[0];
1736  for (i = 0; i < ARRAY_SIZE (suffix_relocs); i++)
1737    if (ch == suffix_relocs[i].suffix[0]
1738	&& len == suffix_relocs[i].length
1739	&& memcmp (ident, suffix_relocs[i].suffix, suffix_relocs[i].length) == 0)
1740      {
1741	/* Now check for "identifier@suffix+constant".  */
1742	if (*str == '-' || *str == '+')
1743	  {
1744	    char *orig_line = input_line_pointer;
1745	    expressionS new_exp;
1746
1747	    input_line_pointer = str;
1748	    expression (&new_exp);
1749	    if (new_exp.X_op == O_constant)
1750	      {
1751		exp_p->X_add_number += new_exp.X_add_number;
1752		str = input_line_pointer;
1753	      }
1754
1755	    if (&input_line_pointer != str_p)
1756	      input_line_pointer = orig_line;
1757	  }
1758
1759	*str_p = str;
1760	return suffix_relocs[i].reloc;
1761      }
1762
1763  return BFD_RELOC_UNUSED;
1764}
1765
1766
1767/* Find the matching operator type.  */
1768static operatorT
1769map_suffix_reloc_to_operator (bfd_reloc_code_real_type reloc)
1770{
1771  operatorT operator = O_illegal;
1772  unsigned int i;
1773
1774  for (i = 0; i < ARRAY_SIZE (suffix_relocs); i++)
1775    {
1776      if (suffix_relocs[i].reloc == reloc)
1777	{
1778	  operator = suffix_relocs[i].operator;
1779	  break;
1780	}
1781    }
1782  gas_assert (operator != O_illegal);
1783  return operator;
1784}
1785
1786
1787/* Find the matching reloc type.  */
1788static bfd_reloc_code_real_type
1789map_operator_to_reloc (unsigned char operator, bfd_boolean is_literal)
1790{
1791  unsigned int i;
1792  bfd_reloc_code_real_type reloc = BFD_RELOC_UNUSED;
1793
1794  for (i = 0; i < ARRAY_SIZE (suffix_relocs); i++)
1795    {
1796      if (suffix_relocs[i].operator == operator)
1797	{
1798	  reloc = suffix_relocs[i].reloc;
1799	  break;
1800	}
1801    }
1802
1803  if (is_literal)
1804    {
1805      if (reloc == BFD_RELOC_XTENSA_TLS_FUNC)
1806	return BFD_RELOC_XTENSA_TLSDESC_FN;
1807      else if (reloc == BFD_RELOC_XTENSA_TLS_ARG)
1808	return BFD_RELOC_XTENSA_TLSDESC_ARG;
1809    }
1810
1811  if (reloc == BFD_RELOC_UNUSED)
1812    return BFD_RELOC_32;
1813
1814  return reloc;
1815}
1816
1817
1818static const char *
1819expression_end (const char *name)
1820{
1821  while (1)
1822    {
1823      switch (*name)
1824	{
1825	case '}':
1826	case ';':
1827	case '\0':
1828	case ',':
1829	case ':':
1830	  return name;
1831	case ' ':
1832	case '\t':
1833	  ++name;
1834	  continue;
1835	default:
1836	  return 0;
1837	}
1838    }
1839}
1840
1841
1842#define ERROR_REG_NUM ((unsigned) -1)
1843
1844static unsigned
1845tc_get_register (const char *prefix)
1846{
1847  unsigned reg;
1848  const char *next_expr;
1849  const char *old_line_pointer;
1850
1851  SKIP_WHITESPACE ();
1852  old_line_pointer = input_line_pointer;
1853
1854  if (*input_line_pointer == '$')
1855    ++input_line_pointer;
1856
1857  /* Accept "sp" as a synonym for "a1".  */
1858  if (input_line_pointer[0] == 's' && input_line_pointer[1] == 'p'
1859      && expression_end (input_line_pointer + 2))
1860    {
1861      input_line_pointer += 2;
1862      return 1;  /* AR[1] */
1863    }
1864
1865  while (*input_line_pointer++ == *prefix++)
1866    ;
1867  --input_line_pointer;
1868  --prefix;
1869
1870  if (*prefix)
1871    {
1872      as_bad (_("bad register name: %s"), old_line_pointer);
1873      return ERROR_REG_NUM;
1874    }
1875
1876  if (!ISDIGIT ((unsigned char) *input_line_pointer))
1877    {
1878      as_bad (_("bad register number: %s"), input_line_pointer);
1879      return ERROR_REG_NUM;
1880    }
1881
1882  reg = 0;
1883
1884  while (ISDIGIT ((int) *input_line_pointer))
1885    reg = reg * 10 + *input_line_pointer++ - '0';
1886
1887  if (!(next_expr = expression_end (input_line_pointer)))
1888    {
1889      as_bad (_("bad register name: %s"), old_line_pointer);
1890      return ERROR_REG_NUM;
1891    }
1892
1893  input_line_pointer = (char *) next_expr;
1894
1895  return reg;
1896}
1897
1898
1899static void
1900expression_maybe_register (xtensa_opcode opc, int opnd, expressionS *tok)
1901{
1902  xtensa_isa isa = xtensa_default_isa;
1903
1904  /* Check if this is an immediate operand.  */
1905  if (xtensa_operand_is_register (isa, opc, opnd) == 0)
1906    {
1907      bfd_reloc_code_real_type reloc;
1908      segT t = expression (tok);
1909
1910      if (t == absolute_section
1911	  && xtensa_operand_is_PCrelative (isa, opc, opnd) == 1)
1912	{
1913	  gas_assert (tok->X_op == O_constant);
1914	  tok->X_op = O_symbol;
1915	  tok->X_add_symbol = &abs_symbol;
1916	}
1917
1918      if ((tok->X_op == O_constant || tok->X_op == O_symbol)
1919	  && ((reloc = xtensa_elf_suffix (&input_line_pointer, tok))
1920	      != BFD_RELOC_NONE))
1921	{
1922	  switch (reloc)
1923	    {
1924	    case BFD_RELOC_LO16:
1925	      if (tok->X_op == O_constant)
1926		{
1927		  tok->X_add_number &= 0xffff;
1928		  return;
1929		}
1930	      break;
1931	    case BFD_RELOC_HI16:
1932	      if (tok->X_op == O_constant)
1933		{
1934		  tok->X_add_number = ((unsigned) tok->X_add_number) >> 16;
1935		  return;
1936		}
1937	      break;
1938	    case BFD_RELOC_UNUSED:
1939	      as_bad (_("unsupported relocation"));
1940	      return;
1941	    case BFD_RELOC_32_PCREL:
1942	      as_bad (_("pcrel relocation not allowed in an instruction"));
1943	      return;
1944	    default:
1945	      break;
1946	    }
1947	  tok->X_op = map_suffix_reloc_to_operator (reloc);
1948	}
1949    }
1950  else
1951    {
1952      xtensa_regfile opnd_rf = xtensa_operand_regfile (isa, opc, opnd);
1953      unsigned reg = tc_get_register (xtensa_regfile_shortname (isa, opnd_rf));
1954
1955      if (reg != ERROR_REG_NUM)	/* Already errored */
1956	{
1957	  uint32 buf = reg;
1958	  if (xtensa_operand_encode (isa, opc, opnd, &buf))
1959	    as_bad (_("register number out of range"));
1960	}
1961
1962      tok->X_op = O_register;
1963      tok->X_add_symbol = 0;
1964      tok->X_add_number = reg;
1965    }
1966}
1967
1968
1969/* Split up the arguments for an opcode or pseudo-op.  */
1970
1971static int
1972tokenize_arguments (char **args, char *str)
1973{
1974  char *old_input_line_pointer;
1975  bfd_boolean saw_comma = FALSE;
1976  bfd_boolean saw_arg = FALSE;
1977  bfd_boolean saw_colon = FALSE;
1978  int num_args = 0;
1979  char *arg_end, *arg;
1980  int arg_len;
1981
1982  /* Save and restore input_line_pointer around this function.  */
1983  old_input_line_pointer = input_line_pointer;
1984  input_line_pointer = str;
1985
1986  while (*input_line_pointer)
1987    {
1988      SKIP_WHITESPACE ();
1989      switch (*input_line_pointer)
1990	{
1991	case '\0':
1992	case '}':
1993	  goto fini;
1994
1995	case ':':
1996	  input_line_pointer++;
1997	  if (saw_comma || saw_colon || !saw_arg)
1998	    goto err;
1999	  saw_colon = TRUE;
2000	  break;
2001
2002	case ',':
2003	  input_line_pointer++;
2004	  if (saw_comma || saw_colon || !saw_arg)
2005	    goto err;
2006	  saw_comma = TRUE;
2007	  break;
2008
2009	default:
2010	  if (!saw_comma && !saw_colon && saw_arg)
2011	    goto err;
2012
2013	  arg_end = input_line_pointer + 1;
2014	  while (!expression_end (arg_end))
2015	    arg_end += 1;
2016
2017	  arg_len = arg_end - input_line_pointer;
2018	  arg = XNEWVEC (char, (saw_colon ? 1 : 0) + arg_len + 1);
2019	  args[num_args] = arg;
2020
2021	  if (saw_colon)
2022	    *arg++ = ':';
2023	  strncpy (arg, input_line_pointer, arg_len);
2024	  arg[arg_len] = '\0';
2025
2026	  input_line_pointer = arg_end;
2027	  num_args += 1;
2028	  saw_comma = FALSE;
2029	  saw_colon = FALSE;
2030	  saw_arg = TRUE;
2031	  break;
2032	}
2033    }
2034
2035fini:
2036  if (saw_comma || saw_colon)
2037    goto err;
2038  input_line_pointer = old_input_line_pointer;
2039  return num_args;
2040
2041err:
2042  if (saw_comma)
2043    as_bad (_("extra comma"));
2044  else if (saw_colon)
2045    as_bad (_("extra colon"));
2046  else if (!saw_arg)
2047    as_bad (_("missing argument"));
2048  else
2049    as_bad (_("missing comma or colon"));
2050  input_line_pointer = old_input_line_pointer;
2051  return -1;
2052}
2053
2054
2055/* Parse the arguments to an opcode.  Return TRUE on error.  */
2056
2057static bfd_boolean
2058parse_arguments (TInsn *insn, int num_args, char **arg_strings)
2059{
2060  expressionS *tok, *last_tok;
2061  xtensa_opcode opcode = insn->opcode;
2062  bfd_boolean had_error = TRUE;
2063  xtensa_isa isa = xtensa_default_isa;
2064  int n, num_regs = 0;
2065  int opcode_operand_count;
2066  int opnd_cnt, last_opnd_cnt;
2067  unsigned int next_reg = 0;
2068  char *old_input_line_pointer;
2069
2070  if (insn->insn_type == ITYPE_LITERAL)
2071    opcode_operand_count = 1;
2072  else
2073    opcode_operand_count = xtensa_opcode_num_operands (isa, opcode);
2074
2075  tok = insn->tok;
2076  memset (tok, 0, sizeof (*tok) * MAX_INSN_ARGS);
2077
2078  /* Save and restore input_line_pointer around this function.  */
2079  old_input_line_pointer = input_line_pointer;
2080
2081  last_tok = 0;
2082  last_opnd_cnt = -1;
2083  opnd_cnt = 0;
2084
2085  /* Skip invisible operands.  */
2086  while (xtensa_operand_is_visible (isa, opcode, opnd_cnt) == 0)
2087    {
2088      opnd_cnt += 1;
2089      tok++;
2090    }
2091
2092  for (n = 0; n < num_args; n++)
2093    {
2094      input_line_pointer = arg_strings[n];
2095      if (*input_line_pointer == ':')
2096	{
2097	  xtensa_regfile opnd_rf;
2098	  input_line_pointer++;
2099	  if (num_regs == 0)
2100	    goto err;
2101	  gas_assert (opnd_cnt > 0);
2102	  num_regs--;
2103	  opnd_rf = xtensa_operand_regfile (isa, opcode, last_opnd_cnt);
2104	  if (next_reg
2105	      != tc_get_register (xtensa_regfile_shortname (isa, opnd_rf)))
2106	    as_warn (_("incorrect register number, ignoring"));
2107	  next_reg++;
2108	}
2109      else
2110	{
2111	  if (opnd_cnt >= opcode_operand_count)
2112	    {
2113	      as_warn (_("too many arguments"));
2114	      goto err;
2115	    }
2116	  gas_assert (opnd_cnt < MAX_INSN_ARGS);
2117
2118	  expression_maybe_register (opcode, opnd_cnt, tok);
2119	  next_reg = tok->X_add_number + 1;
2120
2121	  if (tok->X_op == O_illegal || tok->X_op == O_absent)
2122	    goto err;
2123	  if (xtensa_operand_is_register (isa, opcode, opnd_cnt) == 1)
2124	    {
2125	      num_regs = xtensa_operand_num_regs (isa, opcode, opnd_cnt) - 1;
2126	      /* minus 1 because we are seeing one right now */
2127	    }
2128	  else
2129	    num_regs = 0;
2130
2131	  last_tok = tok;
2132	  last_opnd_cnt = opnd_cnt;
2133	  demand_empty_rest_of_line ();
2134
2135	  do
2136	    {
2137	      opnd_cnt += 1;
2138	      tok++;
2139	    }
2140	  while (xtensa_operand_is_visible (isa, opcode, opnd_cnt) == 0);
2141	}
2142    }
2143
2144  if (num_regs > 0 && ((int) next_reg != last_tok->X_add_number + 1))
2145    goto err;
2146
2147  insn->ntok = tok - insn->tok;
2148  had_error = FALSE;
2149
2150 err:
2151  input_line_pointer = old_input_line_pointer;
2152  return had_error;
2153}
2154
2155
2156static int
2157get_invisible_operands (TInsn *insn)
2158{
2159  xtensa_isa isa = xtensa_default_isa;
2160  static xtensa_insnbuf slotbuf = NULL;
2161  xtensa_format fmt;
2162  xtensa_opcode opc = insn->opcode;
2163  int slot, opnd, fmt_found;
2164  unsigned val;
2165
2166  if (!slotbuf)
2167    slotbuf = xtensa_insnbuf_alloc (isa);
2168
2169  /* Find format/slot where this can be encoded.  */
2170  fmt_found = 0;
2171  slot = 0;
2172  for (fmt = 0; fmt < xtensa_isa_num_formats (isa); fmt++)
2173    {
2174      for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
2175	{
2176	  if (xtensa_opcode_encode (isa, fmt, slot, slotbuf, opc) == 0)
2177	    {
2178	      fmt_found = 1;
2179	      break;
2180	    }
2181	}
2182      if (fmt_found) break;
2183    }
2184
2185  if (!fmt_found)
2186    {
2187      as_bad (_("cannot encode opcode \"%s\""), xtensa_opcode_name (isa, opc));
2188      return -1;
2189    }
2190
2191  /* First encode all the visible operands
2192     (to deal with shared field operands).  */
2193  for (opnd = 0; opnd < insn->ntok; opnd++)
2194    {
2195      if (xtensa_operand_is_visible (isa, opc, opnd) == 1
2196	  && (insn->tok[opnd].X_op == O_register
2197	      || insn->tok[opnd].X_op == O_constant))
2198	{
2199	  val = insn->tok[opnd].X_add_number;
2200	  xtensa_operand_encode (isa, opc, opnd, &val);
2201	  xtensa_operand_set_field (isa, opc, opnd, fmt, slot, slotbuf, val);
2202	}
2203    }
2204
2205  /* Then pull out the values for the invisible ones.  */
2206  for (opnd = 0; opnd < insn->ntok; opnd++)
2207    {
2208      if (xtensa_operand_is_visible (isa, opc, opnd) == 0)
2209	{
2210	  xtensa_operand_get_field (isa, opc, opnd, fmt, slot, slotbuf, &val);
2211	  xtensa_operand_decode (isa, opc, opnd, &val);
2212	  insn->tok[opnd].X_add_number = val;
2213	  if (xtensa_operand_is_register (isa, opc, opnd) == 1)
2214	    insn->tok[opnd].X_op = O_register;
2215	  else
2216	    insn->tok[opnd].X_op = O_constant;
2217	}
2218    }
2219
2220  return 0;
2221}
2222
2223
2224static void
2225xg_reverse_shift_count (char **cnt_argp)
2226{
2227  char *cnt_arg, *new_arg;
2228  cnt_arg = *cnt_argp;
2229
2230  /* replace the argument with "31-(argument)" */
2231  new_arg = concat ("31-(", cnt_arg, ")", (char *) NULL);
2232
2233  free (cnt_arg);
2234  *cnt_argp = new_arg;
2235}
2236
2237
2238/* If "arg" is a constant expression, return non-zero with the value
2239   in *valp.  */
2240
2241static int
2242xg_arg_is_constant (char *arg, offsetT *valp)
2243{
2244  expressionS exp;
2245  char *save_ptr = input_line_pointer;
2246
2247  input_line_pointer = arg;
2248  expression (&exp);
2249  input_line_pointer = save_ptr;
2250
2251  if (exp.X_op == O_constant)
2252    {
2253      *valp = exp.X_add_number;
2254      return 1;
2255    }
2256
2257  return 0;
2258}
2259
2260
2261static void
2262xg_replace_opname (char **popname, const char *newop)
2263{
2264  free (*popname);
2265  *popname = xstrdup (newop);
2266}
2267
2268
2269static int
2270xg_check_num_args (int *pnum_args,
2271		   int expected_num,
2272		   char *opname,
2273		   char **arg_strings)
2274{
2275  int num_args = *pnum_args;
2276
2277  if (num_args < expected_num)
2278    {
2279      as_bad (_("not enough operands (%d) for '%s'; expected %d"),
2280	      num_args, opname, expected_num);
2281      return -1;
2282    }
2283
2284  if (num_args > expected_num)
2285    {
2286      as_warn (_("too many operands (%d) for '%s'; expected %d"),
2287	       num_args, opname, expected_num);
2288      while (num_args-- > expected_num)
2289	{
2290	  free (arg_strings[num_args]);
2291	  arg_strings[num_args] = 0;
2292	}
2293      *pnum_args = expected_num;
2294      return -1;
2295    }
2296
2297  return 0;
2298}
2299
2300
2301/* If the register is not specified as part of the opcode,
2302   then get it from the operand and move it to the opcode.  */
2303
2304static int
2305xg_translate_sysreg_op (char **popname, int *pnum_args, char **arg_strings)
2306{
2307  xtensa_isa isa = xtensa_default_isa;
2308  xtensa_sysreg sr;
2309  char *opname, *new_opname;
2310  const char *sr_name;
2311  int is_user, is_write;
2312
2313  opname = *popname;
2314  if (*opname == '_')
2315    opname += 1;
2316  is_user = (opname[1] == 'u');
2317  is_write = (opname[0] == 'w');
2318
2319  /* Opname == [rw]ur or [rwx]sr... */
2320
2321  if (xg_check_num_args (pnum_args, 2, opname, arg_strings))
2322    return -1;
2323
2324  /* Check if the argument is a symbolic register name.  */
2325  sr = xtensa_sysreg_lookup_name (isa, arg_strings[1]);
2326  /* Handle WSR to "INTSET" as a special case.  */
2327  if (sr == XTENSA_UNDEFINED && is_write && !is_user
2328      && !strcasecmp (arg_strings[1], "intset"))
2329    sr = xtensa_sysreg_lookup_name (isa, "interrupt");
2330  if (sr == XTENSA_UNDEFINED
2331      || (xtensa_sysreg_is_user (isa, sr) == 1) != is_user)
2332    {
2333      /* Maybe it's a register number.... */
2334      offsetT val;
2335      if (!xg_arg_is_constant (arg_strings[1], &val))
2336	{
2337	  as_bad (_("invalid register '%s' for '%s' instruction"),
2338		  arg_strings[1], opname);
2339	  return -1;
2340	}
2341      sr = xtensa_sysreg_lookup (isa, val, is_user);
2342      if (sr == XTENSA_UNDEFINED)
2343	{
2344	  as_bad (_("invalid register number (%ld) for '%s' instruction"),
2345		  (long) val, opname);
2346	  return -1;
2347	}
2348    }
2349
2350  /* Remove the last argument, which is now part of the opcode.  */
2351  free (arg_strings[1]);
2352  arg_strings[1] = 0;
2353  *pnum_args = 1;
2354
2355  /* Translate the opcode.  */
2356  sr_name = xtensa_sysreg_name (isa, sr);
2357  /* Another special case for "WSR.INTSET"....  */
2358  if (is_write && !is_user && !strcasecmp ("interrupt", sr_name))
2359    sr_name = "intset";
2360  new_opname = concat (*popname, ".", sr_name, (char *) NULL);
2361  free (*popname);
2362  *popname = new_opname;
2363
2364  return 0;
2365}
2366
2367
2368static int
2369xtensa_translate_old_userreg_ops (char **popname)
2370{
2371  xtensa_isa isa = xtensa_default_isa;
2372  xtensa_sysreg sr;
2373  char *opname, *new_opname;
2374  const char *sr_name;
2375  bfd_boolean has_underbar = FALSE;
2376
2377  opname = *popname;
2378  if (opname[0] == '_')
2379    {
2380      has_underbar = TRUE;
2381      opname += 1;
2382    }
2383
2384  sr = xtensa_sysreg_lookup_name (isa, opname + 1);
2385  if (sr != XTENSA_UNDEFINED)
2386    {
2387      /* The new default name ("nnn") is different from the old default
2388	 name ("URnnn").  The old default is handled below, and we don't
2389	 want to recognize [RW]nnn, so do nothing if the name is the (new)
2390	 default.  */
2391      static char namebuf[10];
2392      sprintf (namebuf, "%d", xtensa_sysreg_number (isa, sr));
2393      if (strcmp (namebuf, opname + 1) == 0)
2394	return 0;
2395    }
2396  else
2397    {
2398      offsetT val;
2399      char *end;
2400
2401      /* Only continue if the reg name is "URnnn".  */
2402      if (opname[1] != 'u' || opname[2] != 'r')
2403	return 0;
2404      val = strtoul (opname + 3, &end, 10);
2405      if (*end != '\0')
2406	return 0;
2407
2408      sr = xtensa_sysreg_lookup (isa, val, 1);
2409      if (sr == XTENSA_UNDEFINED)
2410	{
2411	  as_bad (_("invalid register number (%ld) for '%s'"),
2412		  (long) val, opname);
2413	  return -1;
2414	}
2415    }
2416
2417  /* Translate the opcode.  */
2418  sr_name = xtensa_sysreg_name (isa, sr);
2419  new_opname = XNEWVEC (char, strlen (sr_name) + 6);
2420  sprintf (new_opname, "%s%cur.%s", (has_underbar ? "_" : ""),
2421	   opname[0], sr_name);
2422  free (*popname);
2423  *popname = new_opname;
2424
2425  return 0;
2426}
2427
2428
2429static int
2430xtensa_translate_zero_immed (const char *old_op,
2431			     const char *new_op,
2432			     char **popname,
2433			     int *pnum_args,
2434			     char **arg_strings)
2435{
2436  char *opname;
2437  offsetT val;
2438
2439  opname = *popname;
2440  gas_assert (opname[0] != '_');
2441
2442  if (strcmp (opname, old_op) != 0)
2443    return 0;
2444
2445  if (xg_check_num_args (pnum_args, 3, opname, arg_strings))
2446    return -1;
2447  if (xg_arg_is_constant (arg_strings[1], &val) && val == 0)
2448    {
2449      xg_replace_opname (popname, new_op);
2450      free (arg_strings[1]);
2451      arg_strings[1] = arg_strings[2];
2452      arg_strings[2] = 0;
2453      *pnum_args = 2;
2454    }
2455
2456  return 0;
2457}
2458
2459
2460/* If the instruction is an idiom (i.e., a built-in macro), translate it.
2461   Returns non-zero if an error was found.  */
2462
2463static int
2464xg_translate_idioms (char **popname, int *pnum_args, char **arg_strings)
2465{
2466  char *opname = *popname;
2467  bfd_boolean has_underbar = FALSE;
2468
2469  if (*opname == '_')
2470    {
2471      has_underbar = TRUE;
2472      opname += 1;
2473    }
2474
2475  if (strcmp (opname, "mov") == 0)
2476    {
2477      if (use_transform () && !has_underbar && density_supported)
2478	xg_replace_opname (popname, "mov.n");
2479      else
2480	{
2481	  if (xg_check_num_args (pnum_args, 2, opname, arg_strings))
2482	    return -1;
2483	  xg_replace_opname (popname, (has_underbar ? "_or" : "or"));
2484	  arg_strings[2] = xstrdup (arg_strings[1]);
2485	  *pnum_args = 3;
2486	}
2487      return 0;
2488    }
2489
2490  if (strcmp (opname, "bbsi.l") == 0)
2491    {
2492      if (xg_check_num_args (pnum_args, 3, opname, arg_strings))
2493	return -1;
2494      xg_replace_opname (popname, (has_underbar ? "_bbsi" : "bbsi"));
2495      if (target_big_endian)
2496	xg_reverse_shift_count (&arg_strings[1]);
2497      return 0;
2498    }
2499
2500  if (strcmp (opname, "bbci.l") == 0)
2501    {
2502      if (xg_check_num_args (pnum_args, 3, opname, arg_strings))
2503	return -1;
2504      xg_replace_opname (popname, (has_underbar ? "_bbci" : "bbci"));
2505      if (target_big_endian)
2506	xg_reverse_shift_count (&arg_strings[1]);
2507      return 0;
2508    }
2509
2510  /* Don't do anything special with NOPs inside FLIX instructions.  They
2511     are handled elsewhere.  Real NOP instructions are always available
2512     in configurations with FLIX, so this should never be an issue but
2513     check for it anyway.  */
2514  if (!cur_vinsn.inside_bundle && xtensa_nop_opcode == XTENSA_UNDEFINED
2515      && strcmp (opname, "nop") == 0)
2516    {
2517      if (use_transform () && !has_underbar && density_supported)
2518	xg_replace_opname (popname, "nop.n");
2519      else
2520	{
2521	  if (xg_check_num_args (pnum_args, 0, opname, arg_strings))
2522	    return -1;
2523	  xg_replace_opname (popname, (has_underbar ? "_or" : "or"));
2524	  arg_strings[0] = xstrdup ("a1");
2525	  arg_strings[1] = xstrdup ("a1");
2526	  arg_strings[2] = xstrdup ("a1");
2527	  *pnum_args = 3;
2528	}
2529      return 0;
2530    }
2531
2532  /* Recognize [RW]UR and [RWX]SR.  */
2533  if ((((opname[0] == 'r' || opname[0] == 'w')
2534	&& (opname[1] == 'u' || opname[1] == 's'))
2535       || (opname[0] == 'x' && opname[1] == 's'))
2536      && opname[2] == 'r'
2537      && opname[3] == '\0')
2538    return xg_translate_sysreg_op (popname, pnum_args, arg_strings);
2539
2540  /* Backward compatibility for RUR and WUR: Recognize [RW]UR<nnn> and
2541     [RW]<name> if <name> is the non-default name of a user register.  */
2542  if ((opname[0] == 'r' || opname[0] == 'w')
2543      && xtensa_opcode_lookup (xtensa_default_isa, opname) == XTENSA_UNDEFINED)
2544    return xtensa_translate_old_userreg_ops (popname);
2545
2546  /* Relax branches that don't allow comparisons against an immediate value
2547     of zero to the corresponding branches with implicit zero immediates.  */
2548  if (!has_underbar && use_transform ())
2549    {
2550      if (xtensa_translate_zero_immed ("bnei", "bnez", popname,
2551				       pnum_args, arg_strings))
2552	return -1;
2553
2554      if (xtensa_translate_zero_immed ("beqi", "beqz", popname,
2555				       pnum_args, arg_strings))
2556	return -1;
2557
2558      if (xtensa_translate_zero_immed ("bgei", "bgez", popname,
2559				       pnum_args, arg_strings))
2560	return -1;
2561
2562      if (xtensa_translate_zero_immed ("blti", "bltz", popname,
2563				       pnum_args, arg_strings))
2564	return -1;
2565    }
2566
2567  return 0;
2568}
2569
2570
2571/* Functions for dealing with the Xtensa ISA.  */
2572
2573/* Currently the assembler only allows us to use a single target per
2574   fragment.  Because of this, only one operand for a given
2575   instruction may be symbolic.  If there is a PC-relative operand,
2576   the last one is chosen.  Otherwise, the result is the number of the
2577   last immediate operand, and if there are none of those, we fail and
2578   return -1.  */
2579
2580static int
2581get_relaxable_immed (xtensa_opcode opcode)
2582{
2583  int last_immed = -1;
2584  int noperands, opi;
2585
2586  if (opcode == XTENSA_UNDEFINED)
2587    return -1;
2588
2589  noperands = xtensa_opcode_num_operands (xtensa_default_isa, opcode);
2590  for (opi = noperands - 1; opi >= 0; opi--)
2591    {
2592      if (xtensa_operand_is_visible (xtensa_default_isa, opcode, opi) == 0)
2593	continue;
2594      if (xtensa_operand_is_PCrelative (xtensa_default_isa, opcode, opi) == 1)
2595	return opi;
2596      if (last_immed == -1
2597	  && xtensa_operand_is_register (xtensa_default_isa, opcode, opi) == 0)
2598	last_immed = opi;
2599    }
2600  return last_immed;
2601}
2602
2603
2604static xtensa_opcode
2605get_opcode_from_buf (const char *buf, int slot)
2606{
2607  static xtensa_insnbuf insnbuf = NULL;
2608  static xtensa_insnbuf slotbuf = NULL;
2609  xtensa_isa isa = xtensa_default_isa;
2610  xtensa_format fmt;
2611
2612  if (!insnbuf)
2613    {
2614      insnbuf = xtensa_insnbuf_alloc (isa);
2615      slotbuf = xtensa_insnbuf_alloc (isa);
2616    }
2617
2618  xtensa_insnbuf_from_chars (isa, insnbuf, (const unsigned char *) buf, 0);
2619  fmt = xtensa_format_decode (isa, insnbuf);
2620  if (fmt == XTENSA_UNDEFINED)
2621    return XTENSA_UNDEFINED;
2622
2623  if (slot >= xtensa_format_num_slots (isa, fmt))
2624    return XTENSA_UNDEFINED;
2625
2626  xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
2627  return xtensa_opcode_decode (isa, fmt, slot, slotbuf);
2628}
2629
2630
2631#ifdef TENSILICA_DEBUG
2632
2633/* For debugging, print out the mapping of opcode numbers to opcodes.  */
2634
2635static void
2636xtensa_print_insn_table (void)
2637{
2638  int num_opcodes, num_operands;
2639  xtensa_opcode opcode;
2640  xtensa_isa isa = xtensa_default_isa;
2641
2642  num_opcodes = xtensa_isa_num_opcodes (xtensa_default_isa);
2643  for (opcode = 0; opcode < num_opcodes; opcode++)
2644    {
2645      int opn;
2646      fprintf (stderr, "%d: %s: ", opcode, xtensa_opcode_name (isa, opcode));
2647      num_operands = xtensa_opcode_num_operands (isa, opcode);
2648      for (opn = 0; opn < num_operands; opn++)
2649	{
2650	  if (xtensa_operand_is_visible (isa, opcode, opn) == 0)
2651	    continue;
2652	  if (xtensa_operand_is_register (isa, opcode, opn) == 1)
2653	    {
2654	      xtensa_regfile opnd_rf =
2655		xtensa_operand_regfile (isa, opcode, opn);
2656	      fprintf (stderr, "%s ", xtensa_regfile_shortname (isa, opnd_rf));
2657	    }
2658	  else if (xtensa_operand_is_PCrelative (isa, opcode, opn) == 1)
2659	    fputs ("[lLr] ", stderr);
2660	  else
2661	    fputs ("i ", stderr);
2662	}
2663      fprintf (stderr, "\n");
2664    }
2665}
2666
2667
2668static void
2669print_vliw_insn (xtensa_insnbuf vbuf)
2670{
2671  xtensa_isa isa = xtensa_default_isa;
2672  xtensa_format f = xtensa_format_decode (isa, vbuf);
2673  xtensa_insnbuf sbuf = xtensa_insnbuf_alloc (isa);
2674  int op;
2675
2676  fprintf (stderr, "format = %d\n", f);
2677
2678  for (op = 0; op < xtensa_format_num_slots (isa, f); op++)
2679    {
2680      xtensa_opcode opcode;
2681      const char *opname;
2682      int operands;
2683
2684      xtensa_format_get_slot (isa, f, op, vbuf, sbuf);
2685      opcode = xtensa_opcode_decode (isa, f, op, sbuf);
2686      opname = xtensa_opcode_name (isa, opcode);
2687
2688      fprintf (stderr, "op in slot %i is %s;\n", op, opname);
2689      fprintf (stderr, "   operands = ");
2690      for (operands = 0;
2691	   operands < xtensa_opcode_num_operands (isa, opcode);
2692	   operands++)
2693	{
2694	  unsigned int val;
2695	  if (xtensa_operand_is_visible (isa, opcode, operands) == 0)
2696	    continue;
2697	  xtensa_operand_get_field (isa, opcode, operands, f, op, sbuf, &val);
2698	  xtensa_operand_decode (isa, opcode, operands, &val);
2699	  fprintf (stderr, "%d ", val);
2700	}
2701      fprintf (stderr, "\n");
2702    }
2703  xtensa_insnbuf_free (isa, sbuf);
2704}
2705
2706#endif /* TENSILICA_DEBUG */
2707
2708
2709static bfd_boolean
2710is_direct_call_opcode (xtensa_opcode opcode)
2711{
2712  xtensa_isa isa = xtensa_default_isa;
2713  int n, num_operands;
2714
2715  if (xtensa_opcode_is_call (isa, opcode) != 1)
2716    return FALSE;
2717
2718  num_operands = xtensa_opcode_num_operands (isa, opcode);
2719  for (n = 0; n < num_operands; n++)
2720    {
2721      if (xtensa_operand_is_register (isa, opcode, n) == 0
2722	  && xtensa_operand_is_PCrelative (isa, opcode, n) == 1)
2723	return TRUE;
2724    }
2725  return FALSE;
2726}
2727
2728
2729/* Convert from BFD relocation type code to slot and operand number.
2730   Returns non-zero on failure.  */
2731
2732static int
2733decode_reloc (bfd_reloc_code_real_type reloc, int *slot, bfd_boolean *is_alt)
2734{
2735  if (reloc >= BFD_RELOC_XTENSA_SLOT0_OP
2736      && reloc <= BFD_RELOC_XTENSA_SLOT14_OP)
2737    {
2738      *slot = reloc - BFD_RELOC_XTENSA_SLOT0_OP;
2739      *is_alt = FALSE;
2740    }
2741  else if (reloc >= BFD_RELOC_XTENSA_SLOT0_ALT
2742      && reloc <= BFD_RELOC_XTENSA_SLOT14_ALT)
2743    {
2744      *slot = reloc - BFD_RELOC_XTENSA_SLOT0_ALT;
2745      *is_alt = TRUE;
2746    }
2747  else
2748    return -1;
2749
2750  return 0;
2751}
2752
2753
2754/* Convert from slot number to BFD relocation type code for the
2755   standard PC-relative relocations.  Return BFD_RELOC_NONE on
2756   failure.  */
2757
2758static bfd_reloc_code_real_type
2759encode_reloc (int slot)
2760{
2761  if (slot < 0 || slot > 14)
2762    return BFD_RELOC_NONE;
2763
2764  return BFD_RELOC_XTENSA_SLOT0_OP + slot;
2765}
2766
2767
2768/* Convert from slot numbers to BFD relocation type code for the
2769   "alternate" relocations.  Return BFD_RELOC_NONE on failure.  */
2770
2771static bfd_reloc_code_real_type
2772encode_alt_reloc (int slot)
2773{
2774  if (slot < 0 || slot > 14)
2775    return BFD_RELOC_NONE;
2776
2777  return BFD_RELOC_XTENSA_SLOT0_ALT + slot;
2778}
2779
2780
2781static void
2782xtensa_insnbuf_set_operand (xtensa_insnbuf slotbuf,
2783			    xtensa_format fmt,
2784			    int slot,
2785			    xtensa_opcode opcode,
2786			    int operand,
2787			    uint32 value,
2788			    const char *file,
2789			    unsigned int line)
2790{
2791  uint32 valbuf = value;
2792
2793  if (xtensa_operand_encode (xtensa_default_isa, opcode, operand, &valbuf))
2794    {
2795      if (xtensa_operand_is_PCrelative (xtensa_default_isa, opcode, operand)
2796	  == 1)
2797	as_bad_where ((char *) file, line,
2798		      _("operand %d of '%s' has out of range value '%u'"),
2799		      operand + 1,
2800		      xtensa_opcode_name (xtensa_default_isa, opcode),
2801		      value);
2802      else
2803	as_bad_where ((char *) file, line,
2804		      _("operand %d of '%s' has invalid value '%u'"),
2805		      operand + 1,
2806		      xtensa_opcode_name (xtensa_default_isa, opcode),
2807		      value);
2808      return;
2809    }
2810
2811  xtensa_operand_set_field (xtensa_default_isa, opcode, operand, fmt, slot,
2812			    slotbuf, valbuf);
2813}
2814
2815
2816static uint32
2817xtensa_insnbuf_get_operand (xtensa_insnbuf slotbuf,
2818			    xtensa_format fmt,
2819			    int slot,
2820			    xtensa_opcode opcode,
2821			    int opnum)
2822{
2823  uint32 val = 0;
2824  (void) xtensa_operand_get_field (xtensa_default_isa, opcode, opnum,
2825				   fmt, slot, slotbuf, &val);
2826  (void) xtensa_operand_decode (xtensa_default_isa, opcode, opnum, &val);
2827  return val;
2828}
2829
2830
2831/* Checks for rules from xtensa-relax tables.  */
2832
2833/* The routine xg_instruction_matches_option_term must return TRUE
2834   when a given option term is true.  The meaning of all of the option
2835   terms is given interpretation by this function.  */
2836
2837static bfd_boolean
2838xg_instruction_matches_option_term (TInsn *insn, const ReqOrOption *option)
2839{
2840  if (strcmp (option->option_name, "realnop") == 0
2841      || strncmp (option->option_name, "IsaUse", 6) == 0)
2842    {
2843      /* These conditions were evaluated statically when building the
2844	 relaxation table.  There's no need to reevaluate them now.  */
2845      return TRUE;
2846    }
2847  else if (strcmp (option->option_name, "FREEREG") == 0)
2848    return insn->extra_arg.X_op == O_register;
2849  else
2850    {
2851      as_fatal (_("internal error: unknown option name '%s'"),
2852		option->option_name);
2853    }
2854}
2855
2856
2857static bfd_boolean
2858xg_instruction_matches_or_options (TInsn *insn,
2859				   const ReqOrOptionList *or_option)
2860{
2861  const ReqOrOption *option;
2862  /* Must match each of the AND terms.  */
2863  for (option = or_option; option != NULL; option = option->next)
2864    {
2865      if (xg_instruction_matches_option_term (insn, option))
2866	return TRUE;
2867    }
2868  return FALSE;
2869}
2870
2871
2872static bfd_boolean
2873xg_instruction_matches_options (TInsn *insn, const ReqOptionList *options)
2874{
2875  const ReqOption *req_options;
2876  /* Must match each of the AND terms.  */
2877  for (req_options = options;
2878       req_options != NULL;
2879       req_options = req_options->next)
2880    {
2881      /* Must match one of the OR clauses.  */
2882      if (!xg_instruction_matches_or_options (insn,
2883					      req_options->or_option_terms))
2884	return FALSE;
2885    }
2886  return TRUE;
2887}
2888
2889
2890/* Return the transition rule that matches or NULL if none matches.  */
2891
2892static bfd_boolean
2893xg_instruction_matches_rule (TInsn *insn, TransitionRule *rule)
2894{
2895  PreconditionList *condition_l;
2896
2897  if (rule->opcode != insn->opcode)
2898    return FALSE;
2899
2900  for (condition_l = rule->conditions;
2901       condition_l != NULL;
2902       condition_l = condition_l->next)
2903    {
2904      expressionS *exp1;
2905      expressionS *exp2;
2906      Precondition *cond = condition_l->precond;
2907
2908      switch (cond->typ)
2909	{
2910	case OP_CONSTANT:
2911	  /* The expression must be the constant.  */
2912	  gas_assert (cond->op_num < insn->ntok);
2913	  exp1 = &insn->tok[cond->op_num];
2914	  if (expr_is_const (exp1))
2915	    {
2916	      switch (cond->cmp)
2917		{
2918		case OP_EQUAL:
2919		  if (get_expr_const (exp1) != cond->op_data)
2920		    return FALSE;
2921		  break;
2922		case OP_NOTEQUAL:
2923		  if (get_expr_const (exp1) == cond->op_data)
2924		    return FALSE;
2925		  break;
2926		default:
2927		  return FALSE;
2928		}
2929	    }
2930	  else if (expr_is_register (exp1))
2931	    {
2932	      switch (cond->cmp)
2933		{
2934		case OP_EQUAL:
2935		  if (get_expr_register (exp1) != cond->op_data)
2936		    return FALSE;
2937		  break;
2938		case OP_NOTEQUAL:
2939		  if (get_expr_register (exp1) == cond->op_data)
2940		    return FALSE;
2941		  break;
2942		default:
2943		  return FALSE;
2944		}
2945	    }
2946	  else
2947	    return FALSE;
2948	  break;
2949
2950	case OP_OPERAND:
2951	  gas_assert (cond->op_num < insn->ntok);
2952	  gas_assert (cond->op_data < insn->ntok);
2953	  exp1 = &insn->tok[cond->op_num];
2954	  exp2 = &insn->tok[cond->op_data];
2955
2956	  switch (cond->cmp)
2957	    {
2958	    case OP_EQUAL:
2959	      if (!expr_is_equal (exp1, exp2))
2960		return FALSE;
2961	      break;
2962	    case OP_NOTEQUAL:
2963	      if (expr_is_equal (exp1, exp2))
2964		return FALSE;
2965	      break;
2966	    }
2967	  break;
2968
2969	case OP_LITERAL:
2970	case OP_LABEL:
2971	default:
2972	  return FALSE;
2973	}
2974    }
2975  if (!xg_instruction_matches_options (insn, rule->options))
2976    return FALSE;
2977
2978  return TRUE;
2979}
2980
2981
2982static int
2983transition_rule_cmp (const TransitionRule *a, const TransitionRule *b)
2984{
2985  bfd_boolean a_greater = FALSE;
2986  bfd_boolean b_greater = FALSE;
2987
2988  ReqOptionList *l_a = a->options;
2989  ReqOptionList *l_b = b->options;
2990
2991  /* We only care if they both are the same except for
2992     a const16 vs. an l32r.  */
2993
2994  while (l_a && l_b && ((l_a->next == NULL) == (l_b->next == NULL)))
2995    {
2996      ReqOrOptionList *l_or_a = l_a->or_option_terms;
2997      ReqOrOptionList *l_or_b = l_b->or_option_terms;
2998      while (l_or_a && l_or_b && ((l_a->next == NULL) == (l_b->next == NULL)))
2999	{
3000	  if (l_or_a->is_true != l_or_b->is_true)
3001	    return 0;
3002	  if (strcmp (l_or_a->option_name, l_or_b->option_name) != 0)
3003	    {
3004	      /* This is the case we care about.  */
3005	      if (strcmp (l_or_a->option_name, "IsaUseConst16") == 0
3006		  && strcmp (l_or_b->option_name, "IsaUseL32R") == 0)
3007		{
3008		  if (prefer_const16)
3009		    a_greater = TRUE;
3010		  else
3011		    b_greater = TRUE;
3012		}
3013	      else if (strcmp (l_or_a->option_name, "IsaUseL32R") == 0
3014		       && strcmp (l_or_b->option_name, "IsaUseConst16") == 0)
3015		{
3016		  if (prefer_const16)
3017		    b_greater = TRUE;
3018		  else
3019		    a_greater = TRUE;
3020		}
3021	      else
3022		return 0;
3023	    }
3024	  l_or_a = l_or_a->next;
3025	  l_or_b = l_or_b->next;
3026	}
3027      if (l_or_a || l_or_b)
3028	return 0;
3029
3030      l_a = l_a->next;
3031      l_b = l_b->next;
3032    }
3033  if (l_a || l_b)
3034    return 0;
3035
3036  /* Incomparable if the substitution was used differently in two cases.  */
3037  if (a_greater && b_greater)
3038    return 0;
3039
3040  if (b_greater)
3041    return 1;
3042  if (a_greater)
3043    return -1;
3044
3045  return 0;
3046}
3047
3048
3049static TransitionRule *
3050xg_instruction_match (TInsn *insn)
3051{
3052  TransitionTable *table = xg_build_simplify_table (&transition_rule_cmp);
3053  TransitionList *l;
3054  gas_assert (insn->opcode < table->num_opcodes);
3055
3056  /* Walk through all of the possible transitions.  */
3057  for (l = table->table[insn->opcode]; l != NULL; l = l->next)
3058    {
3059      TransitionRule *rule = l->rule;
3060      if (xg_instruction_matches_rule (insn, rule))
3061	return rule;
3062    }
3063  return NULL;
3064}
3065
3066
3067/* Various Other Internal Functions.  */
3068
3069static bfd_boolean
3070is_unique_insn_expansion (TransitionRule *r)
3071{
3072  if (!r->to_instr || r->to_instr->next != NULL)
3073    return FALSE;
3074  if (r->to_instr->typ != INSTR_INSTR)
3075    return FALSE;
3076  return TRUE;
3077}
3078
3079
3080/* Check if there is exactly one relaxation for INSN that converts it to
3081   another instruction of equal or larger size.  If so, and if TARG is
3082   non-null, go ahead and generate the relaxed instruction into TARG.  If
3083   NARROW_ONLY is true, then only consider relaxations that widen a narrow
3084   instruction, i.e., ignore relaxations that convert to an instruction of
3085   equal size.  In some contexts where this function is used, only
3086   a single widening is allowed and the NARROW_ONLY argument is used to
3087   exclude cases like ADDI being "widened" to an ADDMI, which may
3088   later be relaxed to an ADDMI/ADDI pair.  */
3089
3090bfd_boolean
3091xg_is_single_relaxable_insn (TInsn *insn, TInsn *targ, bfd_boolean narrow_only)
3092{
3093  TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3094  TransitionList *l;
3095  TransitionRule *match = 0;
3096
3097  gas_assert (insn->insn_type == ITYPE_INSN);
3098  gas_assert (insn->opcode < table->num_opcodes);
3099
3100  for (l = table->table[insn->opcode]; l != NULL; l = l->next)
3101    {
3102      TransitionRule *rule = l->rule;
3103
3104      if (xg_instruction_matches_rule (insn, rule)
3105	  && is_unique_insn_expansion (rule)
3106	  && (xg_get_single_size (insn->opcode) + (narrow_only ? 1 : 0)
3107	      <= xg_get_single_size (rule->to_instr->opcode)))
3108	{
3109	  if (match)
3110	    return FALSE;
3111	  match = rule;
3112	}
3113    }
3114  if (!match)
3115    return FALSE;
3116
3117  if (targ)
3118    xg_build_to_insn (targ, insn, match->to_instr);
3119  return TRUE;
3120}
3121
3122
3123/* Return the maximum number of bytes this opcode can expand to.  */
3124
3125static int
3126xg_get_max_insn_widen_size (xtensa_opcode opcode)
3127{
3128  TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3129  TransitionList *l;
3130  int max_size = xg_get_single_size (opcode);
3131
3132  gas_assert (opcode < table->num_opcodes);
3133
3134  for (l = table->table[opcode]; l != NULL; l = l->next)
3135    {
3136      TransitionRule *rule = l->rule;
3137      BuildInstr *build_list;
3138      int this_size = 0;
3139
3140      if (!rule)
3141	continue;
3142      build_list = rule->to_instr;
3143      if (is_unique_insn_expansion (rule))
3144	{
3145	  gas_assert (build_list->typ == INSTR_INSTR);
3146	  this_size = xg_get_max_insn_widen_size (build_list->opcode);
3147	}
3148      else
3149	for (; build_list != NULL; build_list = build_list->next)
3150	  {
3151	    switch (build_list->typ)
3152	      {
3153	      case INSTR_INSTR:
3154		this_size += xg_get_single_size (build_list->opcode);
3155		break;
3156	      case INSTR_LITERAL_DEF:
3157	      case INSTR_LABEL_DEF:
3158	      default:
3159		break;
3160	      }
3161	  }
3162      if (this_size > max_size)
3163	max_size = this_size;
3164    }
3165  return max_size;
3166}
3167
3168
3169/* Return the maximum number of literal bytes this opcode can generate.  */
3170
3171static int
3172xg_get_max_insn_widen_literal_size (xtensa_opcode opcode)
3173{
3174  TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3175  TransitionList *l;
3176  int max_size = 0;
3177
3178  gas_assert (opcode < table->num_opcodes);
3179
3180  for (l = table->table[opcode]; l != NULL; l = l->next)
3181    {
3182      TransitionRule *rule = l->rule;
3183      BuildInstr *build_list;
3184      int this_size = 0;
3185
3186      if (!rule)
3187	continue;
3188      build_list = rule->to_instr;
3189      if (is_unique_insn_expansion (rule))
3190	{
3191	  gas_assert (build_list->typ == INSTR_INSTR);
3192	  this_size = xg_get_max_insn_widen_literal_size (build_list->opcode);
3193	}
3194      else
3195	for (; build_list != NULL; build_list = build_list->next)
3196	  {
3197	    switch (build_list->typ)
3198	      {
3199	      case INSTR_LITERAL_DEF:
3200		/* Hard-coded 4-byte literal.  */
3201		this_size += 4;
3202		break;
3203	      case INSTR_INSTR:
3204	      case INSTR_LABEL_DEF:
3205	      default:
3206		break;
3207	      }
3208	  }
3209      if (this_size > max_size)
3210	max_size = this_size;
3211    }
3212  return max_size;
3213}
3214
3215
3216static bfd_boolean
3217xg_is_relaxable_insn (TInsn *insn, int lateral_steps)
3218{
3219  int steps_taken = 0;
3220  TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3221  TransitionList *l;
3222
3223  gas_assert (insn->insn_type == ITYPE_INSN);
3224  gas_assert (insn->opcode < table->num_opcodes);
3225
3226  for (l = table->table[insn->opcode]; l != NULL; l = l->next)
3227    {
3228      TransitionRule *rule = l->rule;
3229
3230      if (xg_instruction_matches_rule (insn, rule))
3231	{
3232	  if (steps_taken == lateral_steps)
3233	    return TRUE;
3234	  steps_taken++;
3235	}
3236    }
3237  return FALSE;
3238}
3239
3240
3241static symbolS *
3242get_special_literal_symbol (void)
3243{
3244  static symbolS *sym = NULL;
3245
3246  if (sym == NULL)
3247    sym = symbol_find_or_make ("SPECIAL_LITERAL0\001");
3248  return sym;
3249}
3250
3251
3252static symbolS *
3253get_special_label_symbol (void)
3254{
3255  static symbolS *sym = NULL;
3256
3257  if (sym == NULL)
3258    sym = symbol_find_or_make ("SPECIAL_LABEL0\001");
3259  return sym;
3260}
3261
3262
3263static bfd_boolean
3264xg_valid_literal_expression (const expressionS *exp)
3265{
3266  switch (exp->X_op)
3267    {
3268    case O_constant:
3269    case O_symbol:
3270    case O_big:
3271    case O_uminus:
3272    case O_subtract:
3273    case O_pltrel:
3274    case O_pcrel:
3275    case O_tlsfunc:
3276    case O_tlsarg:
3277    case O_tpoff:
3278    case O_dtpoff:
3279      return TRUE;
3280    default:
3281      return FALSE;
3282    }
3283}
3284
3285
3286/* This will check to see if the value can be converted into the
3287   operand type.  It will return TRUE if it does not fit.  */
3288
3289static bfd_boolean
3290xg_check_operand (int32 value, xtensa_opcode opcode, int operand)
3291{
3292  uint32 valbuf = value;
3293  if (xtensa_operand_encode (xtensa_default_isa, opcode, operand, &valbuf))
3294    return TRUE;
3295  return FALSE;
3296}
3297
3298
3299/* Assumes: All immeds are constants.  Check that all constants fit
3300   into their immeds; return FALSE if not.  */
3301
3302static bfd_boolean
3303xg_immeds_fit (const TInsn *insn)
3304{
3305  xtensa_isa isa = xtensa_default_isa;
3306  int i;
3307
3308  int n = insn->ntok;
3309  gas_assert (insn->insn_type == ITYPE_INSN);
3310  for (i = 0; i < n; ++i)
3311    {
3312      const expressionS *exp = &insn->tok[i];
3313
3314      if (xtensa_operand_is_register (isa, insn->opcode, i) == 1)
3315	continue;
3316
3317      switch (exp->X_op)
3318	{
3319	case O_register:
3320	case O_constant:
3321	  if (xg_check_operand (exp->X_add_number, insn->opcode, i))
3322	    return FALSE;
3323	  break;
3324
3325	default:
3326	  /* The symbol should have a fixup associated with it.  */
3327	  gas_assert (FALSE);
3328	  break;
3329	}
3330    }
3331  return TRUE;
3332}
3333
3334
3335/* This should only be called after we have an initial
3336   estimate of the addresses.  */
3337
3338static bfd_boolean
3339xg_symbolic_immeds_fit (const TInsn *insn,
3340			segT pc_seg,
3341			fragS *pc_frag,
3342			offsetT pc_offset,
3343			long stretch)
3344{
3345  xtensa_isa isa = xtensa_default_isa;
3346  symbolS *symbolP;
3347  fragS *sym_frag;
3348  offsetT target, pc;
3349  uint32 new_offset;
3350  int i;
3351  int n = insn->ntok;
3352
3353  gas_assert (insn->insn_type == ITYPE_INSN);
3354
3355  for (i = 0; i < n; ++i)
3356    {
3357      const expressionS *exp = &insn->tok[i];
3358
3359      if (xtensa_operand_is_register (isa, insn->opcode, i) == 1)
3360	continue;
3361
3362      switch (exp->X_op)
3363	{
3364	case O_register:
3365	case O_constant:
3366	  if (xg_check_operand (exp->X_add_number, insn->opcode, i))
3367	    return FALSE;
3368	  break;
3369
3370	case O_lo16:
3371	case O_hi16:
3372	  /* Check for the worst case.  */
3373	  if (xg_check_operand (0xffff, insn->opcode, i))
3374	    return FALSE;
3375	  break;
3376
3377	case O_symbol:
3378	  /* We only allow symbols for PC-relative references.
3379	     If pc_frag == 0, then we don't have frag locations yet.  */
3380	  if (pc_frag == 0
3381	      || xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 0)
3382	    return FALSE;
3383
3384	  /* If it is a weak symbol or a symbol in a different section,
3385	     it cannot be known to fit at assembly time.  */
3386	  if (S_IS_WEAK (exp->X_add_symbol)
3387	      || S_GET_SEGMENT (exp->X_add_symbol) != pc_seg)
3388	    {
3389	      /* For a direct call with --no-longcalls, be optimistic and
3390		 assume it will be in range.  If the symbol is weak and
3391		 undefined, it may remain undefined at link-time, in which
3392		 case it will have a zero value and almost certainly be out
3393		 of range for a direct call; thus, relax for undefined weak
3394		 symbols even if longcalls is not enabled.  */
3395	      if (is_direct_call_opcode (insn->opcode)
3396		  && ! pc_frag->tc_frag_data.use_longcalls
3397		  && (! S_IS_WEAK (exp->X_add_symbol)
3398		      || S_IS_DEFINED (exp->X_add_symbol)))
3399		return TRUE;
3400
3401	      return FALSE;
3402	    }
3403
3404	  symbolP = exp->X_add_symbol;
3405	  sym_frag = symbol_get_frag (symbolP);
3406	  target = S_GET_VALUE (symbolP) + exp->X_add_number;
3407	  pc = pc_frag->fr_address + pc_offset;
3408
3409	  /* If frag has yet to be reached on this pass, assume it
3410	     will move by STRETCH just as we did.  If this is not so,
3411	     it will be because some frag between grows, and that will
3412	     force another pass.  Beware zero-length frags.  There
3413	     should be a faster way to do this.  */
3414
3415	  if (stretch != 0
3416	      && sym_frag->relax_marker != pc_frag->relax_marker
3417	      && S_GET_SEGMENT (symbolP) == pc_seg)
3418	    {
3419	      target += stretch;
3420	    }
3421
3422	  new_offset = target;
3423	  xtensa_operand_do_reloc (isa, insn->opcode, i, &new_offset, pc);
3424	  if (xg_check_operand (new_offset, insn->opcode, i))
3425	    return FALSE;
3426	  break;
3427
3428	default:
3429	  /* The symbol should have a fixup associated with it.  */
3430	  return FALSE;
3431	}
3432    }
3433
3434  return TRUE;
3435}
3436
3437
3438/* Return TRUE on success.  */
3439
3440static bfd_boolean
3441xg_build_to_insn (TInsn *targ, TInsn *insn, BuildInstr *bi)
3442{
3443  BuildOp *op;
3444  symbolS *sym;
3445
3446  tinsn_init (targ);
3447  targ->debug_line = insn->debug_line;
3448  targ->loc_directive_seen = insn->loc_directive_seen;
3449  switch (bi->typ)
3450    {
3451    case INSTR_INSTR:
3452      op = bi->ops;
3453      targ->opcode = bi->opcode;
3454      targ->insn_type = ITYPE_INSN;
3455      targ->is_specific_opcode = FALSE;
3456
3457      for (; op != NULL; op = op->next)
3458	{
3459	  int op_num = op->op_num;
3460	  int op_data = op->op_data;
3461
3462	  gas_assert (op->op_num < MAX_INSN_ARGS);
3463
3464	  if (targ->ntok <= op_num)
3465	    targ->ntok = op_num + 1;
3466
3467	  switch (op->typ)
3468	    {
3469	    case OP_CONSTANT:
3470	      set_expr_const (&targ->tok[op_num], op_data);
3471	      break;
3472	    case OP_OPERAND:
3473	      gas_assert (op_data < insn->ntok);
3474	      copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3475	      break;
3476	    case OP_FREEREG:
3477	      if (insn->extra_arg.X_op != O_register)
3478		return FALSE;
3479	      copy_expr (&targ->tok[op_num], &insn->extra_arg);
3480	      break;
3481	    case OP_LITERAL:
3482	      sym = get_special_literal_symbol ();
3483	      set_expr_symbol_offset (&targ->tok[op_num], sym, 0);
3484	      if (insn->tok[op_data].X_op == O_tlsfunc
3485		  || insn->tok[op_data].X_op == O_tlsarg)
3486		copy_expr (&targ->extra_arg, &insn->tok[op_data]);
3487	      break;
3488	    case OP_LABEL:
3489	      sym = get_special_label_symbol ();
3490	      set_expr_symbol_offset (&targ->tok[op_num], sym, 0);
3491	      break;
3492	    case OP_OPERAND_HI16U:
3493	    case OP_OPERAND_LOW16U:
3494	      gas_assert (op_data < insn->ntok);
3495	      if (expr_is_const (&insn->tok[op_data]))
3496		{
3497		  long val;
3498		  copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3499		  val = xg_apply_userdef_op_fn (op->typ,
3500						targ->tok[op_num].
3501						X_add_number);
3502		  targ->tok[op_num].X_add_number = val;
3503		}
3504	      else
3505		{
3506		  /* For const16 we can create relocations for these.  */
3507		  if (targ->opcode == XTENSA_UNDEFINED
3508		      || (targ->opcode != xtensa_const16_opcode))
3509		    return FALSE;
3510		  gas_assert (op_data < insn->ntok);
3511		  /* Need to build a O_lo16 or O_hi16.  */
3512		  copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3513		  if (targ->tok[op_num].X_op == O_symbol)
3514		    {
3515		      if (op->typ == OP_OPERAND_HI16U)
3516			targ->tok[op_num].X_op = O_hi16;
3517		      else if (op->typ == OP_OPERAND_LOW16U)
3518			targ->tok[op_num].X_op = O_lo16;
3519		      else
3520			return FALSE;
3521		    }
3522		}
3523	      break;
3524	    default:
3525	      /* currently handles:
3526		 OP_OPERAND_LOW8
3527		 OP_OPERAND_HI24S
3528		 OP_OPERAND_F32MINUS */
3529	      if (xg_has_userdef_op_fn (op->typ))
3530		{
3531		  gas_assert (op_data < insn->ntok);
3532		  if (expr_is_const (&insn->tok[op_data]))
3533		    {
3534		      long val;
3535		      copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3536		      val = xg_apply_userdef_op_fn (op->typ,
3537						    targ->tok[op_num].
3538						    X_add_number);
3539		      targ->tok[op_num].X_add_number = val;
3540		    }
3541		  else
3542		    return FALSE; /* We cannot use a relocation for this.  */
3543		  break;
3544		}
3545	      gas_assert (0);
3546	      break;
3547	    }
3548	}
3549      break;
3550
3551    case INSTR_LITERAL_DEF:
3552      op = bi->ops;
3553      targ->opcode = XTENSA_UNDEFINED;
3554      targ->insn_type = ITYPE_LITERAL;
3555      targ->is_specific_opcode = FALSE;
3556      for (; op != NULL; op = op->next)
3557	{
3558	  int op_num = op->op_num;
3559	  int op_data = op->op_data;
3560	  gas_assert (op->op_num < MAX_INSN_ARGS);
3561
3562	  if (targ->ntok <= op_num)
3563	    targ->ntok = op_num + 1;
3564
3565	  switch (op->typ)
3566	    {
3567	    case OP_OPERAND:
3568	      gas_assert (op_data < insn->ntok);
3569	      /* We can only pass resolvable literals through.  */
3570	      if (!xg_valid_literal_expression (&insn->tok[op_data]))
3571		return FALSE;
3572	      copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3573	      break;
3574	    case OP_LITERAL:
3575	    case OP_CONSTANT:
3576	    case OP_LABEL:
3577	    default:
3578	      gas_assert (0);
3579	      break;
3580	    }
3581	}
3582      break;
3583
3584    case INSTR_LABEL_DEF:
3585      op = bi->ops;
3586      targ->opcode = XTENSA_UNDEFINED;
3587      targ->insn_type = ITYPE_LABEL;
3588      targ->is_specific_opcode = FALSE;
3589      /* Literal with no ops is a label?  */
3590      gas_assert (op == NULL);
3591      break;
3592
3593    default:
3594      gas_assert (0);
3595    }
3596
3597  return TRUE;
3598}
3599
3600
3601/* Return TRUE on success.  */
3602
3603static bfd_boolean
3604xg_build_to_stack (IStack *istack, TInsn *insn, BuildInstr *bi)
3605{
3606  for (; bi != NULL; bi = bi->next)
3607    {
3608      TInsn *next_insn = istack_push_space (istack);
3609
3610      if (!xg_build_to_insn (next_insn, insn, bi))
3611	return FALSE;
3612    }
3613  return TRUE;
3614}
3615
3616
3617/* Return TRUE on valid expansion.  */
3618
3619static bfd_boolean
3620xg_expand_to_stack (IStack *istack, TInsn *insn, int lateral_steps)
3621{
3622  int stack_size = istack->ninsn;
3623  int steps_taken = 0;
3624  TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3625  TransitionList *l;
3626
3627  gas_assert (insn->insn_type == ITYPE_INSN);
3628  gas_assert (insn->opcode < table->num_opcodes);
3629
3630  for (l = table->table[insn->opcode]; l != NULL; l = l->next)
3631    {
3632      TransitionRule *rule = l->rule;
3633
3634      if (xg_instruction_matches_rule (insn, rule))
3635	{
3636	  if (lateral_steps == steps_taken)
3637	    {
3638	      int i;
3639
3640	      /* This is it.  Expand the rule to the stack.  */
3641	      if (!xg_build_to_stack (istack, insn, rule->to_instr))
3642		return FALSE;
3643
3644	      /* Check to see if it fits.  */
3645	      for (i = stack_size; i < istack->ninsn; i++)
3646		{
3647		  TInsn *tinsn = &istack->insn[i];
3648
3649		  if (tinsn->insn_type == ITYPE_INSN
3650		      && !tinsn_has_symbolic_operands (tinsn)
3651		      && !xg_immeds_fit (tinsn))
3652		    {
3653		      istack->ninsn = stack_size;
3654		      return FALSE;
3655		    }
3656		}
3657	      return TRUE;
3658	    }
3659	  steps_taken++;
3660	}
3661    }
3662  return FALSE;
3663}
3664
3665
3666/* Relax the assembly instruction at least "min_steps".
3667   Return the number of steps taken.
3668
3669   For relaxation to correctly terminate, every relaxation chain must
3670   terminate in one of two ways:
3671
3672   1.  If the chain from one instruction to the next consists entirely of
3673       single instructions, then the chain *must* handle all possible
3674       immediates without failing.  It must not ever fail because an
3675       immediate is out of range.  The MOVI.N -> MOVI -> L32R relaxation
3676       chain is one example.  L32R loads 32 bits, and there cannot be an
3677       immediate larger than 32 bits, so it satisfies this condition.
3678       Single instruction relaxation chains are as defined by
3679       xg_is_single_relaxable_instruction.
3680
3681   2.  Otherwise, the chain must end in a multi-instruction expansion: e.g.,
3682       BNEZ.N -> BNEZ -> BNEZ.W15 -> BENZ.N/J
3683
3684   Strictly speaking, in most cases you can violate condition 1 and be OK
3685   -- in particular when the last two instructions have the same single
3686   size.  But nevertheless, you should guarantee the above two conditions.
3687
3688   We could fix this so that single-instruction expansions correctly
3689   terminate when they can't handle the range, but the error messages are
3690   worse, and it actually turns out that in every case but one (18-bit wide
3691   branches), you need a multi-instruction expansion to get the full range
3692   anyway.  And because 18-bit branches are handled identically to 15-bit
3693   branches, there isn't any point in changing it.  */
3694
3695static int
3696xg_assembly_relax (IStack *istack,
3697		   TInsn *insn,
3698		   segT pc_seg,
3699		   fragS *pc_frag,	/* if pc_frag == 0, not pc-relative */
3700		   offsetT pc_offset,	/* offset in fragment */
3701		   int min_steps,	/* minimum conversion steps */
3702		   long stretch)	/* number of bytes stretched so far */
3703{
3704  int steps_taken = 0;
3705
3706  /* Some of its immeds don't fit.  Try to build a relaxed version.
3707     This may go through a couple of stages of single instruction
3708     transformations before we get there.  */
3709
3710  TInsn single_target;
3711  TInsn current_insn;
3712  int lateral_steps = 0;
3713  int istack_size = istack->ninsn;
3714
3715  if (xg_symbolic_immeds_fit (insn, pc_seg, pc_frag, pc_offset, stretch)
3716      && steps_taken >= min_steps)
3717    {
3718      istack_push (istack, insn);
3719      return steps_taken;
3720    }
3721  current_insn = *insn;
3722
3723  /* Walk through all of the single instruction expansions.  */
3724  while (xg_is_single_relaxable_insn (&current_insn, &single_target, FALSE))
3725    {
3726      steps_taken++;
3727      if (xg_symbolic_immeds_fit (&single_target, pc_seg, pc_frag, pc_offset,
3728				  stretch))
3729	{
3730	  if (steps_taken >= min_steps)
3731	    {
3732	      istack_push (istack, &single_target);
3733	      return steps_taken;
3734	    }
3735	}
3736      current_insn = single_target;
3737    }
3738
3739  /* Now check for a multi-instruction expansion.  */
3740  while (xg_is_relaxable_insn (&current_insn, lateral_steps))
3741    {
3742      if (xg_symbolic_immeds_fit (&current_insn, pc_seg, pc_frag, pc_offset,
3743				  stretch))
3744	{
3745	  if (steps_taken >= min_steps)
3746	    {
3747	      istack_push (istack, &current_insn);
3748	      return steps_taken;
3749	    }
3750	}
3751      steps_taken++;
3752      if (xg_expand_to_stack (istack, &current_insn, lateral_steps))
3753	{
3754	  if (steps_taken >= min_steps)
3755	    return steps_taken;
3756	}
3757      lateral_steps++;
3758      istack->ninsn = istack_size;
3759    }
3760
3761  /* It's not going to work -- use the original.  */
3762  istack_push (istack, insn);
3763  return steps_taken;
3764}
3765
3766
3767static void
3768xg_finish_frag (char *last_insn,
3769		enum xtensa_relax_statesE frag_state,
3770		enum xtensa_relax_statesE slot0_state,
3771		int max_growth,
3772		bfd_boolean is_insn)
3773{
3774  /* Finish off this fragment so that it has at LEAST the desired
3775     max_growth.  If it doesn't fit in this fragment, close this one
3776     and start a new one.  In either case, return a pointer to the
3777     beginning of the growth area.  */
3778
3779  fragS *old_frag;
3780
3781  frag_grow (max_growth);
3782  old_frag = frag_now;
3783
3784  frag_now->fr_opcode = last_insn;
3785  if (is_insn)
3786    frag_now->tc_frag_data.is_insn = TRUE;
3787
3788  frag_var (rs_machine_dependent, max_growth, max_growth,
3789	    frag_state, frag_now->fr_symbol, frag_now->fr_offset, last_insn);
3790
3791  old_frag->tc_frag_data.slot_subtypes[0] = slot0_state;
3792  xtensa_set_frag_assembly_state (frag_now);
3793
3794  /* Just to make sure that we did not split it up.  */
3795  gas_assert (old_frag->fr_next == frag_now);
3796}
3797
3798
3799/* Return TRUE if the target frag is one of the next non-empty frags.  */
3800
3801static bfd_boolean
3802is_next_frag_target (const fragS *fragP, const fragS *target)
3803{
3804  if (fragP == NULL)
3805    return FALSE;
3806
3807  for (; fragP; fragP = fragP->fr_next)
3808    {
3809      if (fragP == target)
3810	return TRUE;
3811      if (fragP->fr_fix != 0)
3812	return FALSE;
3813      if (fragP->fr_type == rs_fill && fragP->fr_offset != 0)
3814	return FALSE;
3815      if ((fragP->fr_type == rs_align || fragP->fr_type == rs_align_code)
3816	  && ((fragP->fr_address % (1 << fragP->fr_offset)) != 0))
3817	return FALSE;
3818      if (fragP->fr_type == rs_space)
3819	return FALSE;
3820    }
3821  return FALSE;
3822}
3823
3824
3825static bfd_boolean
3826is_branch_jmp_to_next (TInsn *insn, fragS *fragP)
3827{
3828  xtensa_isa isa = xtensa_default_isa;
3829  int i;
3830  int num_ops = xtensa_opcode_num_operands (isa, insn->opcode);
3831  int target_op = -1;
3832  symbolS *sym;
3833  fragS *target_frag;
3834
3835  if (xtensa_opcode_is_branch (isa, insn->opcode) != 1
3836      && xtensa_opcode_is_jump (isa, insn->opcode) != 1)
3837    return FALSE;
3838
3839  for (i = 0; i < num_ops; i++)
3840    {
3841      if (xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 1)
3842	{
3843	  target_op = i;
3844	  break;
3845	}
3846    }
3847  if (target_op == -1)
3848    return FALSE;
3849
3850  if (insn->ntok <= target_op)
3851    return FALSE;
3852
3853  if (insn->tok[target_op].X_op != O_symbol)
3854    return FALSE;
3855
3856  sym = insn->tok[target_op].X_add_symbol;
3857  if (sym == NULL)
3858    return FALSE;
3859
3860  if (insn->tok[target_op].X_add_number != 0)
3861    return FALSE;
3862
3863  target_frag = symbol_get_frag (sym);
3864  if (target_frag == NULL)
3865    return FALSE;
3866
3867  if (is_next_frag_target (fragP->fr_next, target_frag)
3868      && S_GET_VALUE (sym) == target_frag->fr_address)
3869    return TRUE;
3870
3871  return FALSE;
3872}
3873
3874
3875static void
3876xg_add_branch_and_loop_targets (TInsn *insn)
3877{
3878  xtensa_isa isa = xtensa_default_isa;
3879  int num_ops = xtensa_opcode_num_operands (isa, insn->opcode);
3880
3881  if (xtensa_opcode_is_loop (isa, insn->opcode) == 1)
3882    {
3883      int i = 1;
3884      if (xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 1
3885	  && insn->tok[i].X_op == O_symbol)
3886	symbol_get_tc (insn->tok[i].X_add_symbol)->is_loop_target = TRUE;
3887      return;
3888    }
3889
3890  if (xtensa_opcode_is_branch (isa, insn->opcode) == 1
3891      || xtensa_opcode_is_loop (isa, insn->opcode) == 1)
3892    {
3893      int i;
3894
3895      for (i = 0; i < insn->ntok && i < num_ops; i++)
3896	{
3897	  if (xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 1
3898	      && insn->tok[i].X_op == O_symbol)
3899	    {
3900	      symbolS *sym = insn->tok[i].X_add_symbol;
3901	      symbol_get_tc (sym)->is_branch_target = TRUE;
3902	      if (S_IS_DEFINED (sym))
3903		symbol_get_frag (sym)->tc_frag_data.is_branch_target = TRUE;
3904	    }
3905	}
3906    }
3907}
3908
3909
3910/* Return FALSE if no error.  */
3911
3912static bfd_boolean
3913xg_build_token_insn (BuildInstr *instr_spec, TInsn *old_insn, TInsn *new_insn)
3914{
3915  int num_ops = 0;
3916  BuildOp *b_op;
3917
3918  switch (instr_spec->typ)
3919    {
3920    case INSTR_INSTR:
3921      new_insn->insn_type = ITYPE_INSN;
3922      new_insn->opcode = instr_spec->opcode;
3923      break;
3924    case INSTR_LITERAL_DEF:
3925      new_insn->insn_type = ITYPE_LITERAL;
3926      new_insn->opcode = XTENSA_UNDEFINED;
3927      break;
3928    case INSTR_LABEL_DEF:
3929      abort ();
3930    }
3931  new_insn->is_specific_opcode = FALSE;
3932  new_insn->debug_line = old_insn->debug_line;
3933  new_insn->loc_directive_seen = old_insn->loc_directive_seen;
3934
3935  for (b_op = instr_spec->ops; b_op != NULL; b_op = b_op->next)
3936    {
3937      expressionS *exp;
3938      const expressionS *src_exp;
3939
3940      num_ops++;
3941      switch (b_op->typ)
3942	{
3943	case OP_CONSTANT:
3944	  /* The expression must be the constant.  */
3945	  gas_assert (b_op->op_num < MAX_INSN_ARGS);
3946	  exp = &new_insn->tok[b_op->op_num];
3947	  set_expr_const (exp, b_op->op_data);
3948	  break;
3949
3950	case OP_OPERAND:
3951	  gas_assert (b_op->op_num < MAX_INSN_ARGS);
3952	  gas_assert (b_op->op_data < (unsigned) old_insn->ntok);
3953	  src_exp = &old_insn->tok[b_op->op_data];
3954	  exp = &new_insn->tok[b_op->op_num];
3955	  copy_expr (exp, src_exp);
3956	  break;
3957
3958	case OP_LITERAL:
3959	case OP_LABEL:
3960	  as_bad (_("can't handle generation of literal/labels yet"));
3961	  gas_assert (0);
3962
3963	default:
3964	  as_bad (_("can't handle undefined OP TYPE"));
3965	  gas_assert (0);
3966	}
3967    }
3968
3969  new_insn->ntok = num_ops;
3970  return FALSE;
3971}
3972
3973
3974/* Return TRUE if it was simplified.  */
3975
3976static bfd_boolean
3977xg_simplify_insn (TInsn *old_insn, TInsn *new_insn)
3978{
3979  TransitionRule *rule;
3980  BuildInstr *insn_spec;
3981
3982  if (old_insn->is_specific_opcode || !density_supported)
3983    return FALSE;
3984
3985  rule = xg_instruction_match (old_insn);
3986  if (rule == NULL)
3987    return FALSE;
3988
3989  insn_spec = rule->to_instr;
3990  /* There should only be one.  */
3991  gas_assert (insn_spec != NULL);
3992  gas_assert (insn_spec->next == NULL);
3993  if (insn_spec->next != NULL)
3994    return FALSE;
3995
3996  xg_build_token_insn (insn_spec, old_insn, new_insn);
3997
3998  return TRUE;
3999}
4000
4001
4002/* xg_expand_assembly_insn: (1) Simplify the instruction, i.e., l32i ->
4003   l32i.n. (2) Check the number of operands.  (3) Place the instruction
4004   tokens into the stack or relax it and place multiple
4005   instructions/literals onto the stack.  Return FALSE if no error.  */
4006
4007static bfd_boolean
4008xg_expand_assembly_insn (IStack *istack, TInsn *orig_insn)
4009{
4010  int noperands;
4011  TInsn new_insn;
4012  bfd_boolean do_expand;
4013
4014  tinsn_init (&new_insn);
4015
4016  /* Narrow it if we can.  xg_simplify_insn now does all the
4017     appropriate checking (e.g., for the density option).  */
4018  if (xg_simplify_insn (orig_insn, &new_insn))
4019    orig_insn = &new_insn;
4020
4021  noperands = xtensa_opcode_num_operands (xtensa_default_isa,
4022					  orig_insn->opcode);
4023  if (orig_insn->ntok < noperands)
4024    {
4025      as_bad (_("found %d operands for '%s':  Expected %d"),
4026	      orig_insn->ntok,
4027	      xtensa_opcode_name (xtensa_default_isa, orig_insn->opcode),
4028	      noperands);
4029      return TRUE;
4030    }
4031  if (orig_insn->ntok > noperands)
4032    as_warn (_("found too many (%d) operands for '%s':  Expected %d"),
4033	     orig_insn->ntok,
4034	     xtensa_opcode_name (xtensa_default_isa, orig_insn->opcode),
4035	     noperands);
4036
4037  /* If there are not enough operands, we will assert above.  If there
4038     are too many, just cut out the extras here.  */
4039  orig_insn->ntok = noperands;
4040
4041  if (tinsn_has_invalid_symbolic_operands (orig_insn))
4042    return TRUE;
4043
4044  /* Special case for extui opcode which has constraints not handled
4045     by the ordinary operand encoding checks.  The number of operands
4046     and related syntax issues have already been checked.  */
4047  if (orig_insn->opcode == xtensa_extui_opcode)
4048    {
4049      int shiftimm = orig_insn->tok[2].X_add_number;
4050      int maskimm = orig_insn->tok[3].X_add_number;
4051      if (shiftimm + maskimm > 32)
4052	{
4053	  as_bad (_("immediate operands sum to greater than 32"));
4054	  return TRUE;
4055	}
4056    }
4057
4058  /* If the instruction will definitely need to be relaxed, it is better
4059     to expand it now for better scheduling.  Decide whether to expand
4060     now....  */
4061  do_expand = (!orig_insn->is_specific_opcode && use_transform ());
4062
4063  /* Calls should be expanded to longcalls only in the backend relaxation
4064     so that the assembly scheduler will keep the L32R/CALLX instructions
4065     adjacent.  */
4066  if (is_direct_call_opcode (orig_insn->opcode))
4067    do_expand = FALSE;
4068
4069  if (tinsn_has_symbolic_operands (orig_insn))
4070    {
4071      /* The values of symbolic operands are not known yet, so only expand
4072	 now if an operand is "complex" (e.g., difference of symbols) and
4073	 will have to be stored as a literal regardless of the value.  */
4074      if (!tinsn_has_complex_operands (orig_insn))
4075	do_expand = FALSE;
4076    }
4077  else if (xg_immeds_fit (orig_insn))
4078    do_expand = FALSE;
4079
4080  if (do_expand)
4081    xg_assembly_relax (istack, orig_insn, 0, 0, 0, 0, 0);
4082  else
4083    istack_push (istack, orig_insn);
4084
4085  return FALSE;
4086}
4087
4088
4089/* Return TRUE if the section flags are marked linkonce
4090   or the name is .gnu.linkonce.*.  */
4091
4092static int linkonce_len = sizeof (".gnu.linkonce.") - 1;
4093
4094static bfd_boolean
4095get_is_linkonce_section (bfd *abfd ATTRIBUTE_UNUSED, segT sec)
4096{
4097  flagword flags, link_once_flags;
4098
4099  flags = bfd_get_section_flags (abfd, sec);
4100  link_once_flags = (flags & SEC_LINK_ONCE);
4101
4102  /* Flags might not be set yet.  */
4103  if (!link_once_flags
4104      && strncmp (segment_name (sec), ".gnu.linkonce.", linkonce_len) == 0)
4105    link_once_flags = SEC_LINK_ONCE;
4106
4107  return (link_once_flags != 0);
4108}
4109
4110
4111static void
4112xtensa_add_literal_sym (symbolS *sym)
4113{
4114  sym_list *l;
4115
4116  l = XNEW (sym_list);
4117  l->sym = sym;
4118  l->next = literal_syms;
4119  literal_syms = l;
4120}
4121
4122
4123static symbolS *
4124xtensa_create_literal_symbol (segT sec, fragS *frag)
4125{
4126  static int lit_num = 0;
4127  static char name[256];
4128  symbolS *symbolP;
4129
4130  sprintf (name, ".L_lit_sym%d", lit_num);
4131
4132  /* Create a local symbol.  If it is in a linkonce section, we have to
4133     be careful to make sure that if it is used in a relocation that the
4134     symbol will be in the output file.  */
4135  if (get_is_linkonce_section (stdoutput, sec))
4136    {
4137      symbolP = symbol_new (name, sec, 0, frag);
4138      S_CLEAR_EXTERNAL (symbolP);
4139      /* symbolP->local = 1; */
4140    }
4141  else
4142    symbolP = symbol_new (name, sec, 0, frag);
4143
4144  xtensa_add_literal_sym (symbolP);
4145
4146  lit_num++;
4147  return symbolP;
4148}
4149
4150
4151/* Currently all literals that are generated here are 32-bit L32R targets.  */
4152
4153static symbolS *
4154xg_assemble_literal (/* const */ TInsn *insn)
4155{
4156  emit_state state;
4157  symbolS *lit_sym = NULL;
4158  bfd_reloc_code_real_type reloc;
4159  bfd_boolean pcrel = FALSE;
4160  char *p;
4161
4162  /* size = 4 for L32R.  It could easily be larger when we move to
4163     larger constants.  Add a parameter later.  */
4164  offsetT litsize = 4;
4165  offsetT litalign = 2;		/* 2^2 = 4 */
4166  expressionS saved_loc;
4167  expressionS * emit_val;
4168
4169  set_expr_symbol_offset (&saved_loc, frag_now->fr_symbol, frag_now_fix ());
4170
4171  gas_assert (insn->insn_type == ITYPE_LITERAL);
4172  gas_assert (insn->ntok == 1);	/* must be only one token here */
4173
4174  xtensa_switch_to_literal_fragment (&state);
4175
4176  emit_val = &insn->tok[0];
4177  if (emit_val->X_op == O_big)
4178    {
4179      int size = emit_val->X_add_number * CHARS_PER_LITTLENUM;
4180      if (size > litsize)
4181	{
4182	  /* This happens when someone writes a "movi a2, big_number".  */
4183	  as_bad_where (frag_now->fr_file, frag_now->fr_line,
4184			_("invalid immediate"));
4185	  xtensa_restore_emit_state (&state);
4186	  return NULL;
4187	}
4188    }
4189
4190  /* Force a 4-byte align here.  Note that this opens a new frag, so all
4191     literals done with this function have a frag to themselves.  That's
4192     important for the way text section literals work.  */
4193  frag_align (litalign, 0, 0);
4194  record_alignment (now_seg, litalign);
4195
4196  switch (emit_val->X_op)
4197    {
4198    case O_pcrel:
4199      pcrel = TRUE;
4200      /* fall through */
4201    case O_pltrel:
4202    case O_tlsfunc:
4203    case O_tlsarg:
4204    case O_tpoff:
4205    case O_dtpoff:
4206      p = frag_more (litsize);
4207      xtensa_set_frag_assembly_state (frag_now);
4208      reloc = map_operator_to_reloc (emit_val->X_op, TRUE);
4209      if (emit_val->X_add_symbol)
4210	emit_val->X_op = O_symbol;
4211      else
4212	emit_val->X_op = O_constant;
4213      fix_new_exp (frag_now, p - frag_now->fr_literal,
4214		   litsize, emit_val, pcrel, reloc);
4215      break;
4216
4217    default:
4218      emit_expr (emit_val, litsize);
4219      break;
4220    }
4221
4222  gas_assert (frag_now->tc_frag_data.literal_frag == NULL);
4223  frag_now->tc_frag_data.literal_frag = get_literal_pool_location (now_seg);
4224  frag_now->fr_symbol = xtensa_create_literal_symbol (now_seg, frag_now);
4225  lit_sym = frag_now->fr_symbol;
4226
4227  /* Go back.  */
4228  xtensa_restore_emit_state (&state);
4229  return lit_sym;
4230}
4231
4232
4233static void
4234xg_assemble_literal_space (/* const */ int size, int slot)
4235{
4236  emit_state state;
4237  /* We might have to do something about this alignment.  It only
4238     takes effect if something is placed here.  */
4239  offsetT litalign = 2;		/* 2^2 = 4 */
4240  fragS *lit_saved_frag;
4241
4242  gas_assert (size % 4 == 0);
4243
4244  xtensa_switch_to_literal_fragment (&state);
4245
4246  /* Force a 4-byte align here.  */
4247  frag_align (litalign, 0, 0);
4248  record_alignment (now_seg, litalign);
4249
4250  frag_grow (size);
4251
4252  lit_saved_frag = frag_now;
4253  frag_now->tc_frag_data.literal_frag = get_literal_pool_location (now_seg);
4254  frag_now->fr_symbol = xtensa_create_literal_symbol (now_seg, frag_now);
4255  xg_finish_frag (0, RELAX_LITERAL, 0, size, FALSE);
4256
4257  /* Go back.  */
4258  xtensa_restore_emit_state (&state);
4259  frag_now->tc_frag_data.literal_frags[slot] = lit_saved_frag;
4260}
4261
4262
4263/* Put in a fixup record based on the opcode.
4264   Return TRUE on success.  */
4265
4266static bfd_boolean
4267xg_add_opcode_fix (TInsn *tinsn,
4268		   int opnum,
4269		   xtensa_format fmt,
4270		   int slot,
4271		   expressionS *exp,
4272		   fragS *fragP,
4273		   offsetT offset)
4274{
4275  xtensa_opcode opcode = tinsn->opcode;
4276  bfd_reloc_code_real_type reloc;
4277  reloc_howto_type *howto;
4278  int fmt_length;
4279  fixS *the_fix;
4280
4281  reloc = BFD_RELOC_NONE;
4282
4283  /* First try the special cases for "alternate" relocs.  */
4284  if (opcode == xtensa_l32r_opcode)
4285    {
4286      if (fragP->tc_frag_data.use_absolute_literals)
4287	reloc = encode_alt_reloc (slot);
4288    }
4289  else if (opcode == xtensa_const16_opcode)
4290    {
4291      if (exp->X_op == O_lo16)
4292	{
4293	  reloc = encode_reloc (slot);
4294	  exp->X_op = O_symbol;
4295	}
4296      else if (exp->X_op == O_hi16)
4297	{
4298	  reloc = encode_alt_reloc (slot);
4299	  exp->X_op = O_symbol;
4300	}
4301    }
4302
4303  if (opnum != get_relaxable_immed (opcode))
4304    {
4305      as_bad (_("invalid relocation for operand %i of '%s'"),
4306	      opnum + 1, xtensa_opcode_name (xtensa_default_isa, opcode));
4307      return FALSE;
4308    }
4309
4310  /* Handle erroneous "@h" and "@l" expressions here before they propagate
4311     into the symbol table where the generic portions of the assembler
4312     won't know what to do with them.  */
4313  if (exp->X_op == O_lo16 || exp->X_op == O_hi16)
4314    {
4315      as_bad (_("invalid expression for operand %i of '%s'"),
4316	      opnum + 1, xtensa_opcode_name (xtensa_default_isa, opcode));
4317      return FALSE;
4318    }
4319
4320  /* Next try the generic relocs.  */
4321  if (reloc == BFD_RELOC_NONE)
4322    reloc = encode_reloc (slot);
4323  if (reloc == BFD_RELOC_NONE)
4324    {
4325      as_bad (_("invalid relocation in instruction slot %i"), slot);
4326      return FALSE;
4327    }
4328
4329  howto = bfd_reloc_type_lookup (stdoutput, reloc);
4330  if (!howto)
4331    {
4332      as_bad (_("undefined symbol for opcode \"%s\""),
4333	      xtensa_opcode_name (xtensa_default_isa, opcode));
4334      return FALSE;
4335    }
4336
4337  fmt_length = xtensa_format_length (xtensa_default_isa, fmt);
4338  the_fix = fix_new_exp (fragP, offset, fmt_length, exp,
4339			 howto->pc_relative, reloc);
4340  the_fix->fx_no_overflow = 1;
4341  the_fix->tc_fix_data.X_add_symbol = exp->X_add_symbol;
4342  the_fix->tc_fix_data.X_add_number = exp->X_add_number;
4343  the_fix->tc_fix_data.slot = slot;
4344
4345  return TRUE;
4346}
4347
4348
4349static bfd_boolean
4350xg_emit_insn_to_buf (TInsn *tinsn,
4351		     char *buf,
4352		     fragS *fragP,
4353		     offsetT offset,
4354		     bfd_boolean build_fix)
4355{
4356  static xtensa_insnbuf insnbuf = NULL;
4357  bfd_boolean has_symbolic_immed = FALSE;
4358  bfd_boolean ok = TRUE;
4359
4360  if (!insnbuf)
4361    insnbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
4362
4363  has_symbolic_immed = tinsn_to_insnbuf (tinsn, insnbuf);
4364  if (has_symbolic_immed && build_fix)
4365    {
4366      /* Add a fixup.  */
4367      xtensa_format fmt = xg_get_single_format (tinsn->opcode);
4368      int slot = xg_get_single_slot (tinsn->opcode);
4369      int opnum = get_relaxable_immed (tinsn->opcode);
4370      expressionS *exp = &tinsn->tok[opnum];
4371
4372      if (!xg_add_opcode_fix (tinsn, opnum, fmt, slot, exp, fragP, offset))
4373	ok = FALSE;
4374    }
4375  fragP->tc_frag_data.is_insn = TRUE;
4376  xtensa_insnbuf_to_chars (xtensa_default_isa, insnbuf,
4377			   (unsigned char *) buf, 0);
4378  return ok;
4379}
4380
4381
4382static void
4383xg_resolve_literals (TInsn *insn, symbolS *lit_sym)
4384{
4385  symbolS *sym = get_special_literal_symbol ();
4386  int i;
4387  if (lit_sym == 0)
4388    return;
4389  gas_assert (insn->insn_type == ITYPE_INSN);
4390  for (i = 0; i < insn->ntok; i++)
4391    if (insn->tok[i].X_add_symbol == sym)
4392      insn->tok[i].X_add_symbol = lit_sym;
4393
4394}
4395
4396
4397static void
4398xg_resolve_labels (TInsn *insn, symbolS *label_sym)
4399{
4400  symbolS *sym = get_special_label_symbol ();
4401  int i;
4402  for (i = 0; i < insn->ntok; i++)
4403    if (insn->tok[i].X_add_symbol == sym)
4404      insn->tok[i].X_add_symbol = label_sym;
4405
4406}
4407
4408
4409/* Return TRUE if the instruction can write to the specified
4410   integer register.  */
4411
4412static bfd_boolean
4413is_register_writer (const TInsn *insn, const char *regset, int regnum)
4414{
4415  int i;
4416  int num_ops;
4417  xtensa_isa isa = xtensa_default_isa;
4418
4419  num_ops = xtensa_opcode_num_operands (isa, insn->opcode);
4420
4421  for (i = 0; i < num_ops; i++)
4422    {
4423      char inout;
4424      inout = xtensa_operand_inout (isa, insn->opcode, i);
4425      if ((inout == 'o' || inout == 'm')
4426	  && xtensa_operand_is_register (isa, insn->opcode, i) == 1)
4427	{
4428	  xtensa_regfile opnd_rf =
4429	    xtensa_operand_regfile (isa, insn->opcode, i);
4430	  if (!strcmp (xtensa_regfile_shortname (isa, opnd_rf), regset))
4431	    {
4432	      if ((insn->tok[i].X_op == O_register)
4433		  && (insn->tok[i].X_add_number == regnum))
4434		return TRUE;
4435	    }
4436	}
4437    }
4438  return FALSE;
4439}
4440
4441
4442static bfd_boolean
4443is_bad_loopend_opcode (const TInsn *tinsn)
4444{
4445  xtensa_opcode opcode = tinsn->opcode;
4446
4447  if (opcode == XTENSA_UNDEFINED)
4448    return FALSE;
4449
4450  if (opcode == xtensa_call0_opcode
4451      || opcode == xtensa_callx0_opcode
4452      || opcode == xtensa_call4_opcode
4453      || opcode == xtensa_callx4_opcode
4454      || opcode == xtensa_call8_opcode
4455      || opcode == xtensa_callx8_opcode
4456      || opcode == xtensa_call12_opcode
4457      || opcode == xtensa_callx12_opcode
4458      || opcode == xtensa_isync_opcode
4459      || opcode == xtensa_ret_opcode
4460      || opcode == xtensa_ret_n_opcode
4461      || opcode == xtensa_retw_opcode
4462      || opcode == xtensa_retw_n_opcode
4463      || opcode == xtensa_waiti_opcode
4464      || opcode == xtensa_rsr_lcount_opcode)
4465    return TRUE;
4466
4467  return FALSE;
4468}
4469
4470
4471/* Labels that begin with ".Ln" or ".LM"  are unaligned.
4472   This allows the debugger to add unaligned labels.
4473   Also, the assembler generates stabs labels that need
4474   not be aligned:  FAKE_LABEL_NAME . {"F", "L", "endfunc"}.  */
4475
4476static bfd_boolean
4477is_unaligned_label (symbolS *sym)
4478{
4479  const char *name = S_GET_NAME (sym);
4480  static size_t fake_size = 0;
4481
4482  if (name
4483      && name[0] == '.'
4484      && name[1] == 'L' && (name[2] == 'n' || name[2] == 'M'))
4485    return TRUE;
4486
4487  /* FAKE_LABEL_NAME followed by "F", "L" or "endfunc" */
4488  if (fake_size == 0)
4489    fake_size = strlen (FAKE_LABEL_NAME);
4490
4491  if (name
4492      && strncmp (FAKE_LABEL_NAME, name, fake_size) == 0
4493      && (name[fake_size] == 'F'
4494	  || name[fake_size] == 'L'
4495	  || (name[fake_size] == 'e'
4496	      && strncmp ("endfunc", name+fake_size, 7) == 0)))
4497    return TRUE;
4498
4499  return FALSE;
4500}
4501
4502
4503static fragS *
4504next_non_empty_frag (const fragS *fragP)
4505{
4506  fragS *next_fragP = fragP->fr_next;
4507
4508  /* Sometimes an empty will end up here due storage allocation issues.
4509     So we have to skip until we find something legit.  */
4510  while (next_fragP && next_fragP->fr_fix == 0)
4511    next_fragP = next_fragP->fr_next;
4512
4513  if (next_fragP == NULL || next_fragP->fr_fix == 0)
4514    return NULL;
4515
4516  return next_fragP;
4517}
4518
4519
4520static bfd_boolean
4521next_frag_opcode_is_loop (const fragS *fragP, xtensa_opcode *opcode)
4522{
4523  xtensa_opcode out_opcode;
4524  const fragS *next_fragP = next_non_empty_frag (fragP);
4525
4526  if (next_fragP == NULL)
4527    return FALSE;
4528
4529  out_opcode = get_opcode_from_buf (next_fragP->fr_literal, 0);
4530  if (xtensa_opcode_is_loop (xtensa_default_isa, out_opcode) == 1)
4531    {
4532      *opcode = out_opcode;
4533      return TRUE;
4534    }
4535  return FALSE;
4536}
4537
4538
4539static int
4540frag_format_size (const fragS *fragP)
4541{
4542  static xtensa_insnbuf insnbuf = NULL;
4543  xtensa_isa isa = xtensa_default_isa;
4544  xtensa_format fmt;
4545  int fmt_size;
4546
4547  if (!insnbuf)
4548    insnbuf = xtensa_insnbuf_alloc (isa);
4549
4550  if (fragP == NULL)
4551    return XTENSA_UNDEFINED;
4552
4553  xtensa_insnbuf_from_chars (isa, insnbuf,
4554			     (unsigned char *) fragP->fr_literal, 0);
4555
4556  fmt = xtensa_format_decode (isa, insnbuf);
4557  if (fmt == XTENSA_UNDEFINED)
4558    return XTENSA_UNDEFINED;
4559  fmt_size = xtensa_format_length (isa, fmt);
4560
4561  /* If the next format won't be changing due to relaxation, just
4562     return the length of the first format.  */
4563  if (fragP->fr_opcode != fragP->fr_literal)
4564    return fmt_size;
4565
4566  /* If during relaxation we have to pull an instruction out of a
4567     multi-slot instruction, we will return the more conservative
4568     number.  This works because alignment on bigger instructions
4569     is more restrictive than alignment on smaller instructions.
4570     This is more conservative than we would like, but it happens
4571     infrequently.  */
4572
4573  if (xtensa_format_num_slots (xtensa_default_isa, fmt) > 1)
4574    return fmt_size;
4575
4576  /* If we aren't doing one of our own relaxations or it isn't
4577     slot-based, then the insn size won't change.  */
4578  if (fragP->fr_type != rs_machine_dependent)
4579    return fmt_size;
4580  if (fragP->fr_subtype != RELAX_SLOTS)
4581    return fmt_size;
4582
4583  /* If an instruction is about to grow, return the longer size.  */
4584  if (fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED_STEP1
4585      || fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED_STEP2
4586      || fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED_STEP3)
4587    {
4588      /* For most frags at RELAX_IMMED_STEPX, with X > 0, the first
4589	 instruction in the relaxed version is of length 3.  (The case
4590	 where we have to pull the instruction out of a FLIX bundle
4591	 is handled conservatively above.)  However, frags with opcodes
4592	 that are expanding to wide branches end up having formats that
4593	 are not determinable by the RELAX_IMMED_STEPX enumeration, and
4594	 we can't tell directly what format the relaxer picked.  This
4595	 is a wart in the design of the relaxer that should someday be
4596	 fixed, but would require major changes, or at least should
4597	 be accompanied by major changes to make use of that data.
4598
4599	 In any event, we can tell that we are expanding from a single-slot
4600	 format to a wider one with the logic below.  */
4601
4602      int i;
4603      int relaxed_size = fmt_size + fragP->tc_frag_data.text_expansion[0];
4604
4605      for (i = 0; i < xtensa_isa_num_formats (isa); i++)
4606	{
4607	  if (relaxed_size == xtensa_format_length (isa, i))
4608	    return relaxed_size;
4609	}
4610
4611      return 3;
4612    }
4613
4614  if (fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
4615    return 2 + fragP->tc_frag_data.text_expansion[0];
4616
4617  return fmt_size;
4618}
4619
4620
4621static int
4622next_frag_format_size (const fragS *fragP)
4623{
4624  const fragS *next_fragP = next_non_empty_frag (fragP);
4625  return frag_format_size (next_fragP);
4626}
4627
4628
4629/* In early Xtensa Processors, for reasons that are unclear, the ISA
4630   required two-byte instructions to be treated as three-byte instructions
4631   for loop instruction alignment.  This restriction was removed beginning
4632   with Xtensa LX.  Now the only requirement on loop instruction alignment
4633   is that the first instruction of the loop must appear at an address that
4634   does not cross a fetch boundary.  */
4635
4636static int
4637get_loop_align_size (int insn_size)
4638{
4639  if (insn_size == XTENSA_UNDEFINED)
4640    return xtensa_fetch_width;
4641
4642  if (enforce_three_byte_loop_align && insn_size == 2)
4643    return 3;
4644
4645  return insn_size;
4646}
4647
4648
4649/* If the next legit fragment is an end-of-loop marker,
4650   switch its state so it will instantiate a NOP.  */
4651
4652static void
4653update_next_frag_state (fragS *fragP)
4654{
4655  fragS *next_fragP = fragP->fr_next;
4656  fragS *new_target = NULL;
4657
4658  if (align_targets)
4659    {
4660      /* We are guaranteed there will be one of these...   */
4661      while (!(next_fragP->fr_type == rs_machine_dependent
4662	       && (next_fragP->fr_subtype == RELAX_MAYBE_UNREACHABLE
4663		   || next_fragP->fr_subtype == RELAX_UNREACHABLE)))
4664	next_fragP = next_fragP->fr_next;
4665
4666      gas_assert (next_fragP->fr_type == rs_machine_dependent
4667	      && (next_fragP->fr_subtype == RELAX_MAYBE_UNREACHABLE
4668		  || next_fragP->fr_subtype == RELAX_UNREACHABLE));
4669
4670      /* ...and one of these.  */
4671      new_target = next_fragP->fr_next;
4672      while (!(new_target->fr_type == rs_machine_dependent
4673	       && (new_target->fr_subtype == RELAX_MAYBE_DESIRE_ALIGN
4674		   || new_target->fr_subtype == RELAX_DESIRE_ALIGN)))
4675	new_target = new_target->fr_next;
4676
4677      gas_assert (new_target->fr_type == rs_machine_dependent
4678	      && (new_target->fr_subtype == RELAX_MAYBE_DESIRE_ALIGN
4679		  || new_target->fr_subtype == RELAX_DESIRE_ALIGN));
4680    }
4681
4682  while (next_fragP && next_fragP->fr_fix == 0)
4683    {
4684      if (next_fragP->fr_type == rs_machine_dependent
4685	  && next_fragP->fr_subtype == RELAX_LOOP_END)
4686	{
4687	  next_fragP->fr_subtype = RELAX_LOOP_END_ADD_NOP;
4688	  return;
4689	}
4690
4691      next_fragP = next_fragP->fr_next;
4692    }
4693}
4694
4695
4696static bfd_boolean
4697next_frag_is_branch_target (const fragS *fragP)
4698{
4699  /* Sometimes an empty will end up here due to storage allocation issues,
4700     so we have to skip until we find something legit.  */
4701  for (fragP = fragP->fr_next; fragP; fragP = fragP->fr_next)
4702    {
4703      if (fragP->tc_frag_data.is_branch_target)
4704	return TRUE;
4705      if (fragP->fr_fix != 0)
4706	break;
4707    }
4708  return FALSE;
4709}
4710
4711
4712static bfd_boolean
4713next_frag_is_loop_target (const fragS *fragP)
4714{
4715  /* Sometimes an empty will end up here due storage allocation issues.
4716     So we have to skip until we find something legit. */
4717  for (fragP = fragP->fr_next; fragP; fragP = fragP->fr_next)
4718    {
4719      if (fragP->tc_frag_data.is_loop_target)
4720	return TRUE;
4721      if (fragP->fr_fix != 0)
4722	break;
4723    }
4724  return FALSE;
4725}
4726
4727
4728/* As specified in the relaxation table, when a loop instruction is
4729   relaxed, there are 24 bytes between the loop instruction itself and
4730   the first instruction in the loop.  */
4731
4732#define RELAXED_LOOP_INSN_BYTES 24
4733
4734static addressT
4735next_frag_pre_opcode_bytes (const fragS *fragp)
4736{
4737  const fragS *next_fragp = fragp->fr_next;
4738  xtensa_opcode next_opcode;
4739
4740  if (!next_frag_opcode_is_loop (fragp, &next_opcode))
4741    return 0;
4742
4743  /* Sometimes an empty will end up here due to storage allocation issues,
4744     so we have to skip until we find something legit.  */
4745  while (next_fragp->fr_fix == 0)
4746    next_fragp = next_fragp->fr_next;
4747
4748  if (next_fragp->fr_type != rs_machine_dependent)
4749    return 0;
4750
4751  /* There is some implicit knowledge encoded in here.
4752     The LOOP instructions that are NOT RELAX_IMMED have
4753     been relaxed.  Note that we can assume that the LOOP
4754     instruction is in slot 0 because loops aren't bundleable.  */
4755  if (next_fragp->tc_frag_data.slot_subtypes[0] > RELAX_IMMED)
4756      return get_expanded_loop_offset (next_opcode) + RELAXED_LOOP_INSN_BYTES;
4757
4758  return 0;
4759}
4760
4761
4762/* Mark a location where we can later insert literal frags.  Update
4763   the section's literal_pool_loc, so subsequent literals can be
4764   placed nearest to their use.  */
4765
4766static void
4767xtensa_mark_literal_pool_location (void)
4768{
4769  /* Any labels pointing to the current location need
4770     to be adjusted to after the literal pool.  */
4771  emit_state s;
4772  fragS *pool_location;
4773
4774  if (use_literal_section)
4775    return;
4776
4777  /* We stash info in these frags so we can later move the literal's
4778     fixes into this frchain's fix list.  */
4779  pool_location = frag_now;
4780  frag_now->tc_frag_data.lit_frchain = frchain_now;
4781  frag_now->tc_frag_data.literal_frag = frag_now;
4782  /* Just record this frag.  */
4783  xtensa_maybe_create_literal_pool_frag (FALSE, FALSE);
4784  frag_variant (rs_machine_dependent, 0, 0,
4785		RELAX_LITERAL_POOL_BEGIN, NULL, 0, NULL);
4786  xtensa_set_frag_assembly_state (frag_now);
4787  frag_now->tc_frag_data.lit_seg = now_seg;
4788  frag_variant (rs_machine_dependent, 0, 0,
4789		RELAX_LITERAL_POOL_END, NULL, 0, NULL);
4790  xtensa_set_frag_assembly_state (frag_now);
4791
4792  /* Now put a frag into the literal pool that points to this location.  */
4793  set_literal_pool_location (now_seg, pool_location);
4794  xtensa_switch_to_non_abs_literal_fragment (&s);
4795  frag_align (2, 0, 0);
4796  record_alignment (now_seg, 2);
4797
4798  /* Close whatever frag is there.  */
4799  frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
4800  xtensa_set_frag_assembly_state (frag_now);
4801  frag_now->tc_frag_data.literal_frag = pool_location;
4802  frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
4803  xtensa_restore_emit_state (&s);
4804  xtensa_set_frag_assembly_state (frag_now);
4805}
4806
4807
4808/* Build a nop of the correct size into tinsn.  */
4809
4810static void
4811build_nop (TInsn *tinsn, int size)
4812{
4813  tinsn_init (tinsn);
4814  switch (size)
4815    {
4816    case 2:
4817      tinsn->opcode = xtensa_nop_n_opcode;
4818      tinsn->ntok = 0;
4819      if (tinsn->opcode == XTENSA_UNDEFINED)
4820	as_fatal (_("opcode 'NOP.N' unavailable in this configuration"));
4821      break;
4822
4823    case 3:
4824      if (xtensa_nop_opcode == XTENSA_UNDEFINED)
4825	{
4826	  tinsn->opcode = xtensa_or_opcode;
4827	  set_expr_const (&tinsn->tok[0], 1);
4828	  set_expr_const (&tinsn->tok[1], 1);
4829	  set_expr_const (&tinsn->tok[2], 1);
4830	  tinsn->ntok = 3;
4831	}
4832      else
4833	tinsn->opcode = xtensa_nop_opcode;
4834
4835      gas_assert (tinsn->opcode != XTENSA_UNDEFINED);
4836    }
4837}
4838
4839
4840/* Assemble a NOP of the requested size in the buffer.  User must have
4841   allocated "buf" with at least "size" bytes.  */
4842
4843static void
4844assemble_nop (int size, char *buf)
4845{
4846  static xtensa_insnbuf insnbuf = NULL;
4847  TInsn tinsn;
4848
4849  build_nop (&tinsn, size);
4850
4851  if (!insnbuf)
4852    insnbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
4853
4854  tinsn_to_insnbuf (&tinsn, insnbuf);
4855  xtensa_insnbuf_to_chars (xtensa_default_isa, insnbuf,
4856			   (unsigned char *) buf, 0);
4857}
4858
4859
4860/* Return the number of bytes for the offset of the expanded loop
4861   instruction.  This should be incorporated into the relaxation
4862   specification but is hard-coded here.  This is used to auto-align
4863   the loop instruction.  It is invalid to call this function if the
4864   configuration does not have loops or if the opcode is not a loop
4865   opcode.  */
4866
4867static addressT
4868get_expanded_loop_offset (xtensa_opcode opcode)
4869{
4870  /* This is the OFFSET of the loop instruction in the expanded loop.
4871     This MUST correspond directly to the specification of the loop
4872     expansion.  It will be validated on fragment conversion.  */
4873  gas_assert (opcode != XTENSA_UNDEFINED);
4874  if (opcode == xtensa_loop_opcode)
4875    return 0;
4876  if (opcode == xtensa_loopnez_opcode)
4877    return 3;
4878  if (opcode == xtensa_loopgtz_opcode)
4879    return 6;
4880  as_fatal (_("get_expanded_loop_offset: invalid opcode"));
4881  return 0;
4882}
4883
4884
4885static fragS *
4886get_literal_pool_location (segT seg)
4887{
4888  struct litpool_seg *lps = litpool_seg_list.next;
4889  struct litpool_frag *lpf;
4890  for ( ; lps && lps->seg->id != seg->id; lps = lps->next)
4891    ;
4892  if (lps)
4893    {
4894      for (lpf = lps->frag_list.prev; lpf->fragP; lpf = lpf->prev)
4895	{ /* Skip "candidates" for now.  */
4896	  if (lpf->fragP->fr_subtype == RELAX_LITERAL_POOL_BEGIN &&
4897	      lpf->priority == 1)
4898	    return lpf->fragP;
4899	}
4900      /* Must convert a lower-priority pool.  */
4901      for (lpf = lps->frag_list.prev; lpf->fragP; lpf = lpf->prev)
4902	{
4903	  if (lpf->fragP->fr_subtype == RELAX_LITERAL_POOL_BEGIN)
4904	    return lpf->fragP;
4905	}
4906      /* Still no match -- try for a low priority pool.  */
4907      for (lpf = lps->frag_list.prev; lpf->fragP; lpf = lpf->prev)
4908	{
4909	  if (lpf->fragP->fr_subtype == RELAX_LITERAL_POOL_CANDIDATE_BEGIN)
4910	    return lpf->fragP;
4911	}
4912    }
4913  return seg_info (seg)->tc_segment_info_data.literal_pool_loc;
4914}
4915
4916
4917static void
4918set_literal_pool_location (segT seg, fragS *literal_pool_loc)
4919{
4920  seg_info (seg)->tc_segment_info_data.literal_pool_loc = literal_pool_loc;
4921}
4922
4923
4924/* Set frag assembly state should be called when a new frag is
4925   opened and after a frag has been closed.  */
4926
4927static void
4928xtensa_set_frag_assembly_state (fragS *fragP)
4929{
4930  if (!density_supported)
4931    fragP->tc_frag_data.is_no_density = TRUE;
4932
4933  /* This function is called from subsegs_finish, which is called
4934     after xtensa_end, so we can't use "use_transform" or
4935     "use_schedule" here.  */
4936  if (!directive_state[directive_transform])
4937    fragP->tc_frag_data.is_no_transform = TRUE;
4938  if (directive_state[directive_longcalls])
4939    fragP->tc_frag_data.use_longcalls = TRUE;
4940  fragP->tc_frag_data.use_absolute_literals =
4941    directive_state[directive_absolute_literals];
4942  fragP->tc_frag_data.is_assembly_state_set = TRUE;
4943}
4944
4945
4946static bfd_boolean
4947relaxable_section (asection *sec)
4948{
4949  return ((sec->flags & SEC_DEBUGGING) == 0
4950	  && strcmp (sec->name, ".eh_frame") != 0);
4951}
4952
4953
4954static void
4955xtensa_mark_frags_for_org (void)
4956{
4957  segT *seclist;
4958
4959  /* Walk over each fragment of all of the current segments.  If we find
4960     a .org frag in any of the segments, mark all frags prior to it as
4961     "no transform", which will prevent linker optimizations from messing
4962     up the .org distance.  This should be done after
4963     xtensa_find_unmarked_state_frags, because we don't want to worry here
4964     about that function trashing the data we save here.  */
4965
4966  for (seclist = &stdoutput->sections;
4967       seclist && *seclist;
4968       seclist = &(*seclist)->next)
4969    {
4970      segT sec = *seclist;
4971      segment_info_type *seginfo;
4972      fragS *fragP;
4973      flagword flags;
4974      flags = bfd_get_section_flags (stdoutput, sec);
4975      if (flags & SEC_DEBUGGING)
4976	continue;
4977      if (!(flags & SEC_ALLOC))
4978	continue;
4979
4980      seginfo = seg_info (sec);
4981      if (seginfo && seginfo->frchainP)
4982	{
4983	  fragS *last_fragP = seginfo->frchainP->frch_root;
4984	  for (fragP = seginfo->frchainP->frch_root; fragP;
4985	       fragP = fragP->fr_next)
4986	    {
4987	      /* cvt_frag_to_fill has changed the fr_type of org frags to
4988		 rs_fill, so use the value as cached in rs_subtype here.  */
4989	      if (fragP->fr_subtype == RELAX_ORG)
4990		{
4991		  while (last_fragP != fragP->fr_next)
4992		    {
4993		      last_fragP->tc_frag_data.is_no_transform = TRUE;
4994		      last_fragP = last_fragP->fr_next;
4995		    }
4996		}
4997	    }
4998	}
4999    }
5000}
5001
5002
5003static void
5004xtensa_find_unmarked_state_frags (void)
5005{
5006  segT *seclist;
5007
5008  /* Walk over each fragment of all of the current segments.  For each
5009     unmarked fragment, mark it with the same info as the previous
5010     fragment.  */
5011  for (seclist = &stdoutput->sections;
5012       seclist && *seclist;
5013       seclist = &(*seclist)->next)
5014    {
5015      segT sec = *seclist;
5016      segment_info_type *seginfo;
5017      fragS *fragP;
5018      flagword flags;
5019      flags = bfd_get_section_flags (stdoutput, sec);
5020      if (flags & SEC_DEBUGGING)
5021	continue;
5022      if (!(flags & SEC_ALLOC))
5023	continue;
5024
5025      seginfo = seg_info (sec);
5026      if (seginfo && seginfo->frchainP)
5027	{
5028	  fragS *last_fragP = 0;
5029	  for (fragP = seginfo->frchainP->frch_root; fragP;
5030	       fragP = fragP->fr_next)
5031	    {
5032	      if (fragP->fr_fix != 0
5033		  && !fragP->tc_frag_data.is_assembly_state_set)
5034		{
5035		  if (last_fragP == 0)
5036		    {
5037		      as_warn_where (fragP->fr_file, fragP->fr_line,
5038				     _("assembly state not set for first frag in section %s"),
5039				     sec->name);
5040		    }
5041		  else
5042		    {
5043		      fragP->tc_frag_data.is_assembly_state_set = TRUE;
5044		      fragP->tc_frag_data.is_no_density =
5045			last_fragP->tc_frag_data.is_no_density;
5046		      fragP->tc_frag_data.is_no_transform =
5047			last_fragP->tc_frag_data.is_no_transform;
5048		      fragP->tc_frag_data.use_longcalls =
5049			last_fragP->tc_frag_data.use_longcalls;
5050		      fragP->tc_frag_data.use_absolute_literals =
5051			last_fragP->tc_frag_data.use_absolute_literals;
5052		    }
5053		}
5054	      if (fragP->tc_frag_data.is_assembly_state_set)
5055		last_fragP = fragP;
5056	    }
5057	}
5058    }
5059}
5060
5061
5062static void
5063xtensa_find_unaligned_branch_targets (bfd *abfd ATTRIBUTE_UNUSED,
5064				      asection *sec,
5065				      void *unused ATTRIBUTE_UNUSED)
5066{
5067  flagword flags = bfd_get_section_flags (abfd, sec);
5068  segment_info_type *seginfo = seg_info (sec);
5069  fragS *frag = seginfo->frchainP->frch_root;
5070
5071  if (flags & SEC_CODE)
5072    {
5073      xtensa_isa isa = xtensa_default_isa;
5074      xtensa_insnbuf insnbuf = xtensa_insnbuf_alloc (isa);
5075      while (frag != NULL)
5076	{
5077	  if (frag->tc_frag_data.is_branch_target)
5078	    {
5079	      int op_size;
5080	      addressT branch_align, frag_addr;
5081	      xtensa_format fmt;
5082
5083	      xtensa_insnbuf_from_chars
5084		(isa, insnbuf, (unsigned char *) frag->fr_literal, 0);
5085	      fmt = xtensa_format_decode (isa, insnbuf);
5086	      op_size = xtensa_format_length (isa, fmt);
5087	      branch_align = 1 << branch_align_power (sec);
5088	      frag_addr = frag->fr_address % branch_align;
5089	      if (frag_addr + op_size > branch_align)
5090		as_warn_where (frag->fr_file, frag->fr_line,
5091			       _("unaligned branch target: %d bytes at 0x%lx"),
5092			       op_size, (long) frag->fr_address);
5093	    }
5094	  frag = frag->fr_next;
5095	}
5096      xtensa_insnbuf_free (isa, insnbuf);
5097    }
5098}
5099
5100
5101static void
5102xtensa_find_unaligned_loops (bfd *abfd ATTRIBUTE_UNUSED,
5103			     asection *sec,
5104			     void *unused ATTRIBUTE_UNUSED)
5105{
5106  flagword flags = bfd_get_section_flags (abfd, sec);
5107  segment_info_type *seginfo = seg_info (sec);
5108  fragS *frag = seginfo->frchainP->frch_root;
5109  xtensa_isa isa = xtensa_default_isa;
5110
5111  if (flags & SEC_CODE)
5112    {
5113      xtensa_insnbuf insnbuf = xtensa_insnbuf_alloc (isa);
5114      while (frag != NULL)
5115	{
5116	  if (frag->tc_frag_data.is_first_loop_insn)
5117	    {
5118	      int op_size;
5119	      addressT frag_addr;
5120	      xtensa_format fmt;
5121
5122	      if (frag->fr_fix == 0)
5123		frag = next_non_empty_frag (frag);
5124
5125	      if (frag)
5126		{
5127		  xtensa_insnbuf_from_chars
5128		    (isa, insnbuf, (unsigned char *) frag->fr_literal, 0);
5129		  fmt = xtensa_format_decode (isa, insnbuf);
5130		  op_size = xtensa_format_length (isa, fmt);
5131		  frag_addr = frag->fr_address % xtensa_fetch_width;
5132
5133		  if (frag_addr + op_size > xtensa_fetch_width)
5134		    as_warn_where (frag->fr_file, frag->fr_line,
5135				   _("unaligned loop: %d bytes at 0x%lx"),
5136				   op_size, (long) frag->fr_address);
5137		}
5138	    }
5139	  frag = frag->fr_next;
5140	}
5141      xtensa_insnbuf_free (isa, insnbuf);
5142    }
5143}
5144
5145
5146static int
5147xg_apply_fix_value (fixS *fixP, valueT val)
5148{
5149  xtensa_isa isa = xtensa_default_isa;
5150  static xtensa_insnbuf insnbuf = NULL;
5151  static xtensa_insnbuf slotbuf = NULL;
5152  xtensa_format fmt;
5153  int slot;
5154  bfd_boolean alt_reloc;
5155  xtensa_opcode opcode;
5156  char *const fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
5157
5158  if (decode_reloc (fixP->fx_r_type, &slot, &alt_reloc)
5159      || alt_reloc)
5160    as_fatal (_("unexpected fix"));
5161
5162  if (!insnbuf)
5163    {
5164      insnbuf = xtensa_insnbuf_alloc (isa);
5165      slotbuf = xtensa_insnbuf_alloc (isa);
5166    }
5167
5168  xtensa_insnbuf_from_chars (isa, insnbuf, (unsigned char *) fixpos, 0);
5169  fmt = xtensa_format_decode (isa, insnbuf);
5170  if (fmt == XTENSA_UNDEFINED)
5171    as_fatal (_("undecodable fix"));
5172  xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
5173  opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
5174  if (opcode == XTENSA_UNDEFINED)
5175    as_fatal (_("undecodable fix"));
5176
5177  /* CONST16 immediates are not PC-relative, despite the fact that we
5178     reuse the normal PC-relative operand relocations for the low part
5179     of a CONST16 operand.  */
5180  if (opcode == xtensa_const16_opcode)
5181    return 0;
5182
5183  xtensa_insnbuf_set_operand (slotbuf, fmt, slot, opcode,
5184			      get_relaxable_immed (opcode), val,
5185			      fixP->fx_file, fixP->fx_line);
5186
5187  xtensa_format_set_slot (isa, fmt, slot, insnbuf, slotbuf);
5188  xtensa_insnbuf_to_chars (isa, insnbuf, (unsigned char *) fixpos, 0);
5189
5190  return 1;
5191}
5192
5193
5194/* External Functions and Other GAS Hooks.  */
5195
5196const char *
5197xtensa_target_format (void)
5198{
5199  return (target_big_endian ? "elf32-xtensa-be" : "elf32-xtensa-le");
5200}
5201
5202
5203void
5204xtensa_file_arch_init (bfd *abfd)
5205{
5206  bfd_set_private_flags (abfd, 0x100 | 0x200);
5207}
5208
5209
5210void
5211md_number_to_chars (char *buf, valueT val, int n)
5212{
5213  if (target_big_endian)
5214    number_to_chars_bigendian (buf, val, n);
5215  else
5216    number_to_chars_littleendian (buf, val, n);
5217}
5218
5219
5220/* This function is called once, at assembler startup time.  It should
5221   set up all the tables, etc. that the MD part of the assembler will
5222   need.  */
5223
5224void
5225md_begin (void)
5226{
5227  segT current_section = now_seg;
5228  int current_subsec = now_subseg;
5229  xtensa_isa isa;
5230  int i;
5231
5232  xtensa_default_isa = xtensa_isa_init (0, 0);
5233  isa = xtensa_default_isa;
5234
5235  linkrelax = 1;
5236
5237  /* Set up the literal sections.  */
5238  memset (&default_lit_sections, 0, sizeof (default_lit_sections));
5239
5240  subseg_set (current_section, current_subsec);
5241
5242  xtensa_addi_opcode = xtensa_opcode_lookup (isa, "addi");
5243  xtensa_addmi_opcode = xtensa_opcode_lookup (isa, "addmi");
5244  xtensa_call0_opcode = xtensa_opcode_lookup (isa, "call0");
5245  xtensa_call4_opcode = xtensa_opcode_lookup (isa, "call4");
5246  xtensa_call8_opcode = xtensa_opcode_lookup (isa, "call8");
5247  xtensa_call12_opcode = xtensa_opcode_lookup (isa, "call12");
5248  xtensa_callx0_opcode = xtensa_opcode_lookup (isa, "callx0");
5249  xtensa_callx4_opcode = xtensa_opcode_lookup (isa, "callx4");
5250  xtensa_callx8_opcode = xtensa_opcode_lookup (isa, "callx8");
5251  xtensa_callx12_opcode = xtensa_opcode_lookup (isa, "callx12");
5252  xtensa_const16_opcode = xtensa_opcode_lookup (isa, "const16");
5253  xtensa_entry_opcode = xtensa_opcode_lookup (isa, "entry");
5254  xtensa_extui_opcode = xtensa_opcode_lookup (isa, "extui");
5255  xtensa_movi_opcode = xtensa_opcode_lookup (isa, "movi");
5256  xtensa_movi_n_opcode = xtensa_opcode_lookup (isa, "movi.n");
5257  xtensa_isync_opcode = xtensa_opcode_lookup (isa, "isync");
5258  xtensa_j_opcode = xtensa_opcode_lookup (isa, "j");
5259  xtensa_jx_opcode = xtensa_opcode_lookup (isa, "jx");
5260  xtensa_l32r_opcode = xtensa_opcode_lookup (isa, "l32r");
5261  xtensa_loop_opcode = xtensa_opcode_lookup (isa, "loop");
5262  xtensa_loopnez_opcode = xtensa_opcode_lookup (isa, "loopnez");
5263  xtensa_loopgtz_opcode = xtensa_opcode_lookup (isa, "loopgtz");
5264  xtensa_nop_opcode = xtensa_opcode_lookup (isa, "nop");
5265  xtensa_nop_n_opcode = xtensa_opcode_lookup (isa, "nop.n");
5266  xtensa_or_opcode = xtensa_opcode_lookup (isa, "or");
5267  xtensa_ret_opcode = xtensa_opcode_lookup (isa, "ret");
5268  xtensa_ret_n_opcode = xtensa_opcode_lookup (isa, "ret.n");
5269  xtensa_retw_opcode = xtensa_opcode_lookup (isa, "retw");
5270  xtensa_retw_n_opcode = xtensa_opcode_lookup (isa, "retw.n");
5271  xtensa_rsr_lcount_opcode = xtensa_opcode_lookup (isa, "rsr.lcount");
5272  xtensa_waiti_opcode = xtensa_opcode_lookup (isa, "waiti");
5273
5274  for (i = 0; i < xtensa_isa_num_formats (isa); i++)
5275    {
5276      int format_slots = xtensa_format_num_slots (isa, i);
5277      if (format_slots > config_max_slots)
5278	config_max_slots = format_slots;
5279    }
5280
5281  xg_init_vinsn (&cur_vinsn);
5282
5283  xtensa_num_pipe_stages = xtensa_isa_num_pipe_stages (isa);
5284
5285  init_op_placement_info_table ();
5286
5287  /* Set up the assembly state.  */
5288  if (!frag_now->tc_frag_data.is_assembly_state_set)
5289    xtensa_set_frag_assembly_state (frag_now);
5290}
5291
5292
5293/* TC_INIT_FIX_DATA hook */
5294
5295void
5296xtensa_init_fix_data (fixS *x)
5297{
5298  x->tc_fix_data.slot = 0;
5299  x->tc_fix_data.X_add_symbol = NULL;
5300  x->tc_fix_data.X_add_number = 0;
5301}
5302
5303
5304/* tc_frob_label hook */
5305
5306void
5307xtensa_frob_label (symbolS *sym)
5308{
5309  float freq;
5310
5311  if (cur_vinsn.inside_bundle)
5312    {
5313      as_bad (_("labels are not valid inside bundles"));
5314      return;
5315    }
5316
5317  freq = get_subseg_target_freq (now_seg, now_subseg);
5318
5319  /* Since the label was already attached to a frag associated with the
5320     previous basic block, it now needs to be reset to the current frag.  */
5321  symbol_set_frag (sym, frag_now);
5322  S_SET_VALUE (sym, (valueT) frag_now_fix ());
5323
5324  if (generating_literals)
5325    xtensa_add_literal_sym (sym);
5326  else
5327    xtensa_add_insn_label (sym);
5328
5329  if (symbol_get_tc (sym)->is_loop_target)
5330    {
5331      if ((get_last_insn_flags (now_seg, now_subseg)
5332	  & FLAG_IS_BAD_LOOPEND) != 0)
5333	as_bad (_("invalid last instruction for a zero-overhead loop"));
5334
5335      xtensa_set_frag_assembly_state (frag_now);
5336      frag_var (rs_machine_dependent, 4, 4, RELAX_LOOP_END,
5337		frag_now->fr_symbol, frag_now->fr_offset, NULL);
5338
5339      xtensa_set_frag_assembly_state (frag_now);
5340      xtensa_move_labels (frag_now, 0);
5341    }
5342
5343  /* No target aligning in the absolute section.  */
5344  if (now_seg != absolute_section
5345      && !is_unaligned_label (sym)
5346      && !generating_literals)
5347    {
5348      xtensa_set_frag_assembly_state (frag_now);
5349
5350      if (do_align_targets ())
5351	frag_var (rs_machine_dependent, 0, (int) freq,
5352		  RELAX_DESIRE_ALIGN_IF_TARGET, frag_now->fr_symbol,
5353		  frag_now->fr_offset, NULL);
5354      else
5355	frag_var (rs_fill, 0, 0, frag_now->fr_subtype,
5356		  frag_now->fr_symbol, frag_now->fr_offset, NULL);
5357      xtensa_set_frag_assembly_state (frag_now);
5358      xtensa_move_labels (frag_now, 0);
5359    }
5360
5361  /* We need to mark the following properties even if we aren't aligning.  */
5362
5363  /* If the label is already known to be a branch target, i.e., a
5364     forward branch, mark the frag accordingly.  Backward branches
5365     are handled by xg_add_branch_and_loop_targets.  */
5366  if (symbol_get_tc (sym)->is_branch_target)
5367    symbol_get_frag (sym)->tc_frag_data.is_branch_target = TRUE;
5368
5369  /* Loops only go forward, so they can be identified here.  */
5370  if (symbol_get_tc (sym)->is_loop_target)
5371    symbol_get_frag (sym)->tc_frag_data.is_loop_target = TRUE;
5372
5373  dwarf2_emit_label (sym);
5374}
5375
5376
5377/* tc_unrecognized_line hook */
5378
5379int
5380xtensa_unrecognized_line (int ch)
5381{
5382  switch (ch)
5383    {
5384    case '{' :
5385      if (cur_vinsn.inside_bundle == 0)
5386	{
5387	  /* PR8110: Cannot emit line number info inside a FLIX bundle
5388	     when using --gstabs.  Temporarily disable debug info.  */
5389	  generate_lineno_debug ();
5390	  if (debug_type == DEBUG_STABS)
5391	    {
5392	      xt_saved_debug_type = debug_type;
5393	      debug_type = DEBUG_NONE;
5394	    }
5395
5396	  cur_vinsn.inside_bundle = 1;
5397	}
5398      else
5399	{
5400	  as_bad (_("extra opening brace"));
5401	  return 0;
5402	}
5403      break;
5404
5405    case '}' :
5406      if (cur_vinsn.inside_bundle)
5407	finish_vinsn (&cur_vinsn);
5408      else
5409	{
5410	  as_bad (_("extra closing brace"));
5411	  return 0;
5412	}
5413      break;
5414    default:
5415      as_bad (_("syntax error"));
5416      return 0;
5417    }
5418  return 1;
5419}
5420
5421
5422/* md_flush_pending_output hook */
5423
5424void
5425xtensa_flush_pending_output (void)
5426{
5427  /* This line fixes a bug where automatically generated gstabs info
5428     separates a function label from its entry instruction, ending up
5429     with the literal position between the function label and the entry
5430     instruction and crashing code.  It only happens with --gstabs and
5431     --text-section-literals, and when several other obscure relaxation
5432     conditions are met.  */
5433  if (outputting_stabs_line_debug)
5434    return;
5435
5436  if (cur_vinsn.inside_bundle)
5437    as_bad (_("missing closing brace"));
5438
5439  /* If there is a non-zero instruction fragment, close it.  */
5440  if (frag_now_fix () != 0 && frag_now->tc_frag_data.is_insn)
5441    {
5442      frag_wane (frag_now);
5443      frag_new (0);
5444      xtensa_set_frag_assembly_state (frag_now);
5445    }
5446  frag_now->tc_frag_data.is_insn = FALSE;
5447
5448  xtensa_clear_insn_labels ();
5449}
5450
5451
5452/* We had an error while parsing an instruction.  The string might look
5453   like this: "insn arg1, arg2 }".  If so, we need to see the closing
5454   brace and reset some fields.  Otherwise, the vinsn never gets closed
5455   and the num_slots field will grow past the end of the array of slots,
5456   and bad things happen.  */
5457
5458static void
5459error_reset_cur_vinsn (void)
5460{
5461  if (cur_vinsn.inside_bundle)
5462    {
5463      if (*input_line_pointer == '}'
5464	  || *(input_line_pointer - 1) == '}'
5465	  || *(input_line_pointer - 2) == '}')
5466	xg_clear_vinsn (&cur_vinsn);
5467    }
5468}
5469
5470
5471void
5472md_assemble (char *str)
5473{
5474  xtensa_isa isa = xtensa_default_isa;
5475  char *opname;
5476  unsigned opnamelen;
5477  bfd_boolean has_underbar = FALSE;
5478  char *arg_strings[MAX_INSN_ARGS];
5479  int num_args;
5480  TInsn orig_insn;		/* Original instruction from the input.  */
5481
5482  tinsn_init (&orig_insn);
5483
5484  /* Split off the opcode.  */
5485  opnamelen = strspn (str, "abcdefghijklmnopqrstuvwxyz_/0123456789.");
5486  opname = xstrndup (str, opnamelen);
5487
5488  num_args = tokenize_arguments (arg_strings, str + opnamelen);
5489  if (num_args == -1)
5490    {
5491      as_bad (_("syntax error"));
5492      return;
5493    }
5494
5495  if (xg_translate_idioms (&opname, &num_args, arg_strings))
5496    return;
5497
5498  /* Check for an underbar prefix.  */
5499  if (*opname == '_')
5500    {
5501      has_underbar = TRUE;
5502      opname += 1;
5503    }
5504
5505  orig_insn.insn_type = ITYPE_INSN;
5506  orig_insn.ntok = 0;
5507  orig_insn.is_specific_opcode = (has_underbar || !use_transform ());
5508  orig_insn.opcode = xtensa_opcode_lookup (isa, opname);
5509
5510  /* Special case: Check for "CALLXn.TLS" pseudo op.  If found, grab its
5511     extra argument and set the opcode to "CALLXn".  */
5512  if (orig_insn.opcode == XTENSA_UNDEFINED
5513      && strncasecmp (opname, "callx", 5) == 0)
5514    {
5515      unsigned long window_size;
5516      char *suffix;
5517
5518      window_size = strtoul (opname + 5, &suffix, 10);
5519      if (suffix != opname + 5
5520	  && (window_size == 0
5521	      || window_size == 4
5522	      || window_size == 8
5523	      || window_size == 12)
5524	  && strcasecmp (suffix, ".tls") == 0)
5525	{
5526	  switch (window_size)
5527	    {
5528	    case 0: orig_insn.opcode = xtensa_callx0_opcode; break;
5529	    case 4: orig_insn.opcode = xtensa_callx4_opcode; break;
5530	    case 8: orig_insn.opcode = xtensa_callx8_opcode; break;
5531	    case 12: orig_insn.opcode = xtensa_callx12_opcode; break;
5532	    }
5533
5534	  if (num_args != 2)
5535	    as_bad (_("wrong number of operands for '%s'"), opname);
5536	  else
5537	    {
5538	      bfd_reloc_code_real_type reloc;
5539	      char *old_input_line_pointer;
5540	      expressionS *tok = &orig_insn.extra_arg;
5541
5542	      old_input_line_pointer = input_line_pointer;
5543	      input_line_pointer = arg_strings[num_args - 1];
5544
5545	      expression (tok);
5546	      if (tok->X_op == O_symbol
5547		  && ((reloc = xtensa_elf_suffix (&input_line_pointer, tok))
5548		      == BFD_RELOC_XTENSA_TLS_CALL))
5549		tok->X_op = map_suffix_reloc_to_operator (reloc);
5550	      else
5551		as_bad (_("bad relocation expression for '%s'"), opname);
5552
5553	      input_line_pointer = old_input_line_pointer;
5554	      num_args -= 1;
5555	    }
5556	}
5557    }
5558
5559  /* Special case: Check for "j.l" pseudo op.  */
5560  if (orig_insn.opcode == XTENSA_UNDEFINED
5561      && strncasecmp (opname, "j.l", 3) == 0)
5562    {
5563      if (num_args != 2)
5564	as_bad (_("wrong number of operands for '%s'"), opname);
5565      else
5566	{
5567	  char *old_input_line_pointer;
5568	  expressionS *tok = &orig_insn.extra_arg;
5569
5570	  old_input_line_pointer = input_line_pointer;
5571	  input_line_pointer = arg_strings[num_args - 1];
5572
5573	  expression_maybe_register (xtensa_jx_opcode, 0, tok);
5574	  input_line_pointer = old_input_line_pointer;
5575
5576	  num_args -= 1;
5577	  orig_insn.opcode = xtensa_j_opcode;
5578	}
5579    }
5580
5581  if (orig_insn.opcode == XTENSA_UNDEFINED)
5582    {
5583      xtensa_format fmt = xtensa_format_lookup (isa, opname);
5584      if (fmt == XTENSA_UNDEFINED)
5585	{
5586	  as_bad (_("unknown opcode or format name '%s'"), opname);
5587	  error_reset_cur_vinsn ();
5588	  return;
5589	}
5590      if (!cur_vinsn.inside_bundle)
5591	{
5592	  as_bad (_("format names only valid inside bundles"));
5593	  error_reset_cur_vinsn ();
5594	  return;
5595	}
5596      if (cur_vinsn.format != XTENSA_UNDEFINED)
5597	as_warn (_("multiple formats specified for one bundle; using '%s'"),
5598		 opname);
5599      cur_vinsn.format = fmt;
5600      free (has_underbar ? opname - 1 : opname);
5601      error_reset_cur_vinsn ();
5602      return;
5603    }
5604
5605  /* Parse the arguments.  */
5606  if (parse_arguments (&orig_insn, num_args, arg_strings))
5607    {
5608      as_bad (_("syntax error"));
5609      error_reset_cur_vinsn ();
5610      return;
5611    }
5612
5613  /* Free the opcode and argument strings, now that they've been parsed.  */
5614  free (has_underbar ? opname - 1 : opname);
5615  opname = 0;
5616  while (num_args-- > 0)
5617    free (arg_strings[num_args]);
5618
5619  /* Get expressions for invisible operands.  */
5620  if (get_invisible_operands (&orig_insn))
5621    {
5622      error_reset_cur_vinsn ();
5623      return;
5624    }
5625
5626  /* Check for the right number and type of arguments.  */
5627  if (tinsn_check_arguments (&orig_insn))
5628    {
5629      error_reset_cur_vinsn ();
5630      return;
5631    }
5632
5633  /* Record the line number for each TInsn, because a FLIX bundle may be
5634     spread across multiple input lines and individual instructions may be
5635     moved around in some cases.  */
5636  orig_insn.loc_directive_seen = dwarf2_loc_directive_seen;
5637  dwarf2_where (&orig_insn.debug_line);
5638  dwarf2_consume_line_info ();
5639
5640  xg_add_branch_and_loop_targets (&orig_insn);
5641
5642  /* Check that immediate value for ENTRY is >= 16.  */
5643  if (orig_insn.opcode == xtensa_entry_opcode && orig_insn.ntok >= 3)
5644    {
5645      expressionS *exp = &orig_insn.tok[2];
5646      if (exp->X_op == O_constant && exp->X_add_number < 16)
5647	as_warn (_("entry instruction with stack decrement < 16"));
5648    }
5649
5650  /* Finish it off:
5651     assemble_tokens (opcode, tok, ntok);
5652     expand the tokens from the orig_insn into the
5653     stack of instructions that will not expand
5654     unless required at relaxation time.  */
5655
5656  if (!cur_vinsn.inside_bundle)
5657    emit_single_op (&orig_insn);
5658  else /* We are inside a bundle.  */
5659    {
5660      cur_vinsn.slots[cur_vinsn.num_slots] = orig_insn;
5661      cur_vinsn.num_slots++;
5662      if (*input_line_pointer == '}'
5663	  || *(input_line_pointer - 1) == '}'
5664	  || *(input_line_pointer - 2) == '}')
5665	finish_vinsn (&cur_vinsn);
5666    }
5667
5668  /* We've just emitted a new instruction so clear the list of labels.  */
5669  xtensa_clear_insn_labels ();
5670
5671  xtensa_check_frag_count ();
5672}
5673
5674
5675/* HANDLE_ALIGN hook */
5676
5677/* For a .align directive, we mark the previous block with the alignment
5678   information.  This will be placed in the object file in the
5679   property section corresponding to this section.  */
5680
5681void
5682xtensa_handle_align (fragS *fragP)
5683{
5684  if (linkrelax
5685      && ! fragP->tc_frag_data.is_literal
5686      && (fragP->fr_type == rs_align
5687	  || fragP->fr_type == rs_align_code)
5688      && fragP->fr_offset > 0
5689      && now_seg != bss_section)
5690    {
5691      fragP->tc_frag_data.is_align = TRUE;
5692      fragP->tc_frag_data.alignment = fragP->fr_offset;
5693    }
5694
5695  if (fragP->fr_type == rs_align_test)
5696    {
5697      int count;
5698      count = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
5699      if (count != 0)
5700	as_bad_where (fragP->fr_file, fragP->fr_line,
5701		      _("unaligned entry instruction"));
5702    }
5703
5704  if (linkrelax && fragP->fr_type == rs_org)
5705    fragP->fr_subtype = RELAX_ORG;
5706}
5707
5708
5709/* TC_FRAG_INIT hook */
5710
5711void
5712xtensa_frag_init (fragS *frag)
5713{
5714  xtensa_set_frag_assembly_state (frag);
5715}
5716
5717
5718symbolS *
5719md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
5720{
5721  return NULL;
5722}
5723
5724
5725/* Round up a section size to the appropriate boundary.  */
5726
5727valueT
5728md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
5729{
5730  return size;			/* Byte alignment is fine.  */
5731}
5732
5733
5734long
5735md_pcrel_from (fixS *fixP)
5736{
5737  char *insn_p;
5738  static xtensa_insnbuf insnbuf = NULL;
5739  static xtensa_insnbuf slotbuf = NULL;
5740  int opnum;
5741  uint32 opnd_value;
5742  xtensa_opcode opcode;
5743  xtensa_format fmt;
5744  int slot;
5745  xtensa_isa isa = xtensa_default_isa;
5746  valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
5747  bfd_boolean alt_reloc;
5748
5749  if (fixP->fx_r_type == BFD_RELOC_XTENSA_ASM_EXPAND)
5750    return 0;
5751
5752  if (fixP->fx_r_type == BFD_RELOC_32_PCREL)
5753    return addr;
5754
5755  if (!insnbuf)
5756    {
5757      insnbuf = xtensa_insnbuf_alloc (isa);
5758      slotbuf = xtensa_insnbuf_alloc (isa);
5759    }
5760
5761  insn_p = &fixP->fx_frag->fr_literal[fixP->fx_where];
5762  xtensa_insnbuf_from_chars (isa, insnbuf, (unsigned char *) insn_p, 0);
5763  fmt = xtensa_format_decode (isa, insnbuf);
5764
5765  if (fmt == XTENSA_UNDEFINED)
5766    as_fatal (_("bad instruction format"));
5767
5768  if (decode_reloc (fixP->fx_r_type, &slot, &alt_reloc) != 0)
5769    as_fatal (_("invalid relocation"));
5770
5771  xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
5772  opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
5773
5774  /* Check for "alternate" relocations (operand not specified).  None
5775     of the current uses for these are really PC-relative.  */
5776  if (alt_reloc || opcode == xtensa_const16_opcode)
5777    {
5778      if (opcode != xtensa_l32r_opcode
5779	  && opcode != xtensa_const16_opcode)
5780	as_fatal (_("invalid relocation for '%s' instruction"),
5781		  xtensa_opcode_name (isa, opcode));
5782      return 0;
5783    }
5784
5785  opnum = get_relaxable_immed (opcode);
5786  opnd_value = 0;
5787  if (xtensa_operand_is_PCrelative (isa, opcode, opnum) != 1
5788      || xtensa_operand_do_reloc (isa, opcode, opnum, &opnd_value, addr))
5789    {
5790      as_bad_where (fixP->fx_file,
5791		    fixP->fx_line,
5792		    _("invalid relocation for operand %d of '%s'"),
5793		    opnum, xtensa_opcode_name (isa, opcode));
5794      return 0;
5795    }
5796  return 0 - opnd_value;
5797}
5798
5799
5800/* TC_FORCE_RELOCATION hook */
5801
5802int
5803xtensa_force_relocation (fixS *fix)
5804{
5805  switch (fix->fx_r_type)
5806    {
5807    case BFD_RELOC_XTENSA_ASM_EXPAND:
5808    case BFD_RELOC_XTENSA_SLOT0_ALT:
5809    case BFD_RELOC_XTENSA_SLOT1_ALT:
5810    case BFD_RELOC_XTENSA_SLOT2_ALT:
5811    case BFD_RELOC_XTENSA_SLOT3_ALT:
5812    case BFD_RELOC_XTENSA_SLOT4_ALT:
5813    case BFD_RELOC_XTENSA_SLOT5_ALT:
5814    case BFD_RELOC_XTENSA_SLOT6_ALT:
5815    case BFD_RELOC_XTENSA_SLOT7_ALT:
5816    case BFD_RELOC_XTENSA_SLOT8_ALT:
5817    case BFD_RELOC_XTENSA_SLOT9_ALT:
5818    case BFD_RELOC_XTENSA_SLOT10_ALT:
5819    case BFD_RELOC_XTENSA_SLOT11_ALT:
5820    case BFD_RELOC_XTENSA_SLOT12_ALT:
5821    case BFD_RELOC_XTENSA_SLOT13_ALT:
5822    case BFD_RELOC_XTENSA_SLOT14_ALT:
5823      return 1;
5824    default:
5825      break;
5826    }
5827
5828  if (linkrelax && fix->fx_addsy
5829      && relaxable_section (S_GET_SEGMENT (fix->fx_addsy)))
5830    return 1;
5831
5832  return generic_force_reloc (fix);
5833}
5834
5835
5836/* TC_VALIDATE_FIX_SUB hook */
5837
5838int
5839xtensa_validate_fix_sub (fixS *fix)
5840{
5841  segT add_symbol_segment, sub_symbol_segment;
5842
5843  /* The difference of two symbols should be resolved by the assembler when
5844     linkrelax is not set.  If the linker may relax the section containing
5845     the symbols, then an Xtensa DIFF relocation must be generated so that
5846     the linker knows to adjust the difference value.  */
5847  if (!linkrelax || fix->fx_addsy == NULL)
5848    return 0;
5849
5850  /* Make sure both symbols are in the same segment, and that segment is
5851     "normal" and relaxable.  If the segment is not "normal", then the
5852     fix is not valid.  If the segment is not "relaxable", then the fix
5853     should have been handled earlier.  */
5854  add_symbol_segment = S_GET_SEGMENT (fix->fx_addsy);
5855  if (! SEG_NORMAL (add_symbol_segment) ||
5856      ! relaxable_section (add_symbol_segment))
5857    return 0;
5858  sub_symbol_segment = S_GET_SEGMENT (fix->fx_subsy);
5859  return (sub_symbol_segment == add_symbol_segment);
5860}
5861
5862
5863/* NO_PSEUDO_DOT hook */
5864
5865/* This function has nothing to do with pseudo dots, but this is the
5866   nearest macro to where the check needs to take place.  FIXME: This
5867   seems wrong.  */
5868
5869bfd_boolean
5870xtensa_check_inside_bundle (void)
5871{
5872  if (cur_vinsn.inside_bundle && input_line_pointer[-1] == '.')
5873    as_bad (_("directives are not valid inside bundles"));
5874
5875  /* This function must always return FALSE because it is called via a
5876     macro that has nothing to do with bundling.  */
5877  return FALSE;
5878}
5879
5880
5881/* md_elf_section_change_hook */
5882
5883void
5884xtensa_elf_section_change_hook (void)
5885{
5886  /* Set up the assembly state.  */
5887  if (!frag_now->tc_frag_data.is_assembly_state_set)
5888    xtensa_set_frag_assembly_state (frag_now);
5889}
5890
5891
5892/* tc_fix_adjustable hook */
5893
5894bfd_boolean
5895xtensa_fix_adjustable (fixS *fixP)
5896{
5897  /* We need the symbol name for the VTABLE entries.  */
5898  if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
5899      || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
5900    return 0;
5901
5902  return 1;
5903}
5904
5905
5906/* tc_symbol_new_hook */
5907
5908symbolS *expr_symbols = NULL;
5909
5910void
5911xtensa_symbol_new_hook (symbolS *sym)
5912{
5913  if (is_leb128_expr && S_GET_SEGMENT (sym) == expr_section)
5914    {
5915      symbol_get_tc (sym)->next_expr_symbol = expr_symbols;
5916      expr_symbols = sym;
5917    }
5918}
5919
5920
5921void
5922md_apply_fix (fixS *fixP, valueT *valP, segT seg)
5923{
5924  char *const fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
5925  valueT val = 0;
5926
5927  /* Subtracted symbols are only allowed for a few relocation types, and
5928     unless linkrelax is enabled, they should not make it to this point.  */
5929  if (fixP->fx_subsy && !(linkrelax && (fixP->fx_r_type == BFD_RELOC_32
5930					|| fixP->fx_r_type == BFD_RELOC_16
5931					|| fixP->fx_r_type == BFD_RELOC_8)))
5932    as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
5933
5934  switch (fixP->fx_r_type)
5935    {
5936    case BFD_RELOC_32_PCREL:
5937    case BFD_RELOC_32:
5938    case BFD_RELOC_16:
5939    case BFD_RELOC_8:
5940      if (fixP->fx_subsy)
5941	{
5942	  switch (fixP->fx_r_type)
5943	    {
5944	    case BFD_RELOC_8:
5945	      fixP->fx_r_type = BFD_RELOC_XTENSA_DIFF8;
5946	      fixP->fx_signed = 0;
5947	      break;
5948	    case BFD_RELOC_16:
5949	      fixP->fx_r_type = BFD_RELOC_XTENSA_DIFF16;
5950	      fixP->fx_signed = 0;
5951	      break;
5952	    case BFD_RELOC_32:
5953	      fixP->fx_r_type = BFD_RELOC_XTENSA_DIFF32;
5954	      fixP->fx_signed = 0;
5955	      break;
5956	    default:
5957	      break;
5958	    }
5959
5960	  val = (S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset
5961		 - S_GET_VALUE (fixP->fx_subsy));
5962
5963	  /* The difference value gets written out, and the DIFF reloc
5964	     identifies the address of the subtracted symbol (i.e., the one
5965	     with the lowest address).  */
5966	  *valP = val;
5967	  fixP->fx_offset -= val;
5968	  fixP->fx_subsy = NULL;
5969	}
5970      else if (! fixP->fx_addsy)
5971	{
5972	  val = *valP;
5973	  fixP->fx_done = 1;
5974	}
5975      /* fall through */
5976
5977    case BFD_RELOC_XTENSA_PLT:
5978      md_number_to_chars (fixpos, val, fixP->fx_size);
5979      fixP->fx_no_overflow = 0; /* Use the standard overflow check.  */
5980      break;
5981
5982    case BFD_RELOC_XTENSA_TLSDESC_FN:
5983    case BFD_RELOC_XTENSA_TLSDESC_ARG:
5984    case BFD_RELOC_XTENSA_TLS_TPOFF:
5985    case BFD_RELOC_XTENSA_TLS_DTPOFF:
5986      S_SET_THREAD_LOCAL (fixP->fx_addsy);
5987      md_number_to_chars (fixpos, 0, fixP->fx_size);
5988      fixP->fx_no_overflow = 0; /* Use the standard overflow check.  */
5989      break;
5990
5991    case BFD_RELOC_XTENSA_SLOT0_OP:
5992    case BFD_RELOC_XTENSA_SLOT1_OP:
5993    case BFD_RELOC_XTENSA_SLOT2_OP:
5994    case BFD_RELOC_XTENSA_SLOT3_OP:
5995    case BFD_RELOC_XTENSA_SLOT4_OP:
5996    case BFD_RELOC_XTENSA_SLOT5_OP:
5997    case BFD_RELOC_XTENSA_SLOT6_OP:
5998    case BFD_RELOC_XTENSA_SLOT7_OP:
5999    case BFD_RELOC_XTENSA_SLOT8_OP:
6000    case BFD_RELOC_XTENSA_SLOT9_OP:
6001    case BFD_RELOC_XTENSA_SLOT10_OP:
6002    case BFD_RELOC_XTENSA_SLOT11_OP:
6003    case BFD_RELOC_XTENSA_SLOT12_OP:
6004    case BFD_RELOC_XTENSA_SLOT13_OP:
6005    case BFD_RELOC_XTENSA_SLOT14_OP:
6006      if (linkrelax)
6007	{
6008	  /* Write the tentative value of a PC-relative relocation to a
6009	     local symbol into the instruction.  The value will be ignored
6010	     by the linker, and it makes the object file disassembly
6011	     readable when all branch targets are encoded in relocations.  */
6012
6013	  gas_assert (fixP->fx_addsy);
6014	  if (S_GET_SEGMENT (fixP->fx_addsy) == seg
6015	      && !S_FORCE_RELOC (fixP->fx_addsy, 1))
6016	    {
6017	      val = (S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset
6018		     - md_pcrel_from (fixP));
6019	      (void) xg_apply_fix_value (fixP, val);
6020	    }
6021	}
6022      else if (! fixP->fx_addsy)
6023	{
6024	  val = *valP;
6025	  if (xg_apply_fix_value (fixP, val))
6026	    fixP->fx_done = 1;
6027	}
6028      break;
6029
6030    case BFD_RELOC_XTENSA_ASM_EXPAND:
6031    case BFD_RELOC_XTENSA_TLS_FUNC:
6032    case BFD_RELOC_XTENSA_TLS_ARG:
6033    case BFD_RELOC_XTENSA_TLS_CALL:
6034    case BFD_RELOC_XTENSA_SLOT0_ALT:
6035    case BFD_RELOC_XTENSA_SLOT1_ALT:
6036    case BFD_RELOC_XTENSA_SLOT2_ALT:
6037    case BFD_RELOC_XTENSA_SLOT3_ALT:
6038    case BFD_RELOC_XTENSA_SLOT4_ALT:
6039    case BFD_RELOC_XTENSA_SLOT5_ALT:
6040    case BFD_RELOC_XTENSA_SLOT6_ALT:
6041    case BFD_RELOC_XTENSA_SLOT7_ALT:
6042    case BFD_RELOC_XTENSA_SLOT8_ALT:
6043    case BFD_RELOC_XTENSA_SLOT9_ALT:
6044    case BFD_RELOC_XTENSA_SLOT10_ALT:
6045    case BFD_RELOC_XTENSA_SLOT11_ALT:
6046    case BFD_RELOC_XTENSA_SLOT12_ALT:
6047    case BFD_RELOC_XTENSA_SLOT13_ALT:
6048    case BFD_RELOC_XTENSA_SLOT14_ALT:
6049      /* These all need to be resolved at link-time.  Do nothing now.  */
6050      break;
6051
6052    case BFD_RELOC_VTABLE_INHERIT:
6053    case BFD_RELOC_VTABLE_ENTRY:
6054      fixP->fx_done = 0;
6055      break;
6056
6057    default:
6058      as_bad (_("unhandled local relocation fix %s"),
6059	      bfd_get_reloc_code_name (fixP->fx_r_type));
6060    }
6061}
6062
6063
6064const char *
6065md_atof (int type, char *litP, int *sizeP)
6066{
6067  return ieee_md_atof (type, litP, sizeP, target_big_endian);
6068}
6069
6070
6071int
6072md_estimate_size_before_relax (fragS *fragP, segT seg ATTRIBUTE_UNUSED)
6073{
6074  return total_frag_text_expansion (fragP);
6075}
6076
6077
6078/* Translate internal representation of relocation info to BFD target
6079   format.  */
6080
6081arelent *
6082tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
6083{
6084  arelent *reloc;
6085
6086  reloc = XNEW (arelent);
6087  reloc->sym_ptr_ptr = XNEW (asymbol *);
6088  *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
6089  reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
6090
6091  /* Make sure none of our internal relocations make it this far.
6092     They'd better have been fully resolved by this point.  */
6093  gas_assert ((int) fixp->fx_r_type > 0);
6094
6095  reloc->addend = fixp->fx_offset;
6096
6097  reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
6098  if (reloc->howto == NULL)
6099    {
6100      as_bad_where (fixp->fx_file, fixp->fx_line,
6101		    _("cannot represent `%s' relocation in object file"),
6102		    bfd_get_reloc_code_name (fixp->fx_r_type));
6103      free (reloc->sym_ptr_ptr);
6104      free (reloc);
6105      return NULL;
6106    }
6107
6108  if (!fixp->fx_pcrel != !reloc->howto->pc_relative)
6109    as_fatal (_("internal error; cannot generate `%s' relocation"),
6110	      bfd_get_reloc_code_name (fixp->fx_r_type));
6111
6112  return reloc;
6113}
6114
6115
6116/* Checks for resource conflicts between instructions.  */
6117
6118/* The func unit stuff could be implemented as bit-vectors rather
6119   than the iterative approach here.  If it ends up being too
6120   slow, we will switch it.  */
6121
6122resource_table *
6123new_resource_table (void *data,
6124		    int cycles,
6125		    int nu,
6126		    unit_num_copies_func uncf,
6127		    opcode_num_units_func onuf,
6128		    opcode_funcUnit_use_unit_func ouuf,
6129		    opcode_funcUnit_use_stage_func ousf)
6130{
6131  int i;
6132  resource_table *rt = XNEW (resource_table);
6133  rt->data = data;
6134  rt->cycles = cycles;
6135  rt->allocated_cycles = cycles;
6136  rt->num_units = nu;
6137  rt->unit_num_copies = uncf;
6138  rt->opcode_num_units = onuf;
6139  rt->opcode_unit_use = ouuf;
6140  rt->opcode_unit_stage = ousf;
6141
6142  rt->units = XCNEWVEC (unsigned char *, cycles);
6143  for (i = 0; i < cycles; i++)
6144    rt->units[i] = XCNEWVEC (unsigned char, nu);
6145
6146  return rt;
6147}
6148
6149
6150void
6151clear_resource_table (resource_table *rt)
6152{
6153  int i, j;
6154  for (i = 0; i < rt->allocated_cycles; i++)
6155    for (j = 0; j < rt->num_units; j++)
6156      rt->units[i][j] = 0;
6157}
6158
6159
6160/* We never shrink it, just fake it into thinking so.  */
6161
6162void
6163resize_resource_table (resource_table *rt, int cycles)
6164{
6165  int i, old_cycles;
6166
6167  rt->cycles = cycles;
6168  if (cycles <= rt->allocated_cycles)
6169    return;
6170
6171  old_cycles = rt->allocated_cycles;
6172  rt->allocated_cycles = cycles;
6173
6174  rt->units = XRESIZEVEC (unsigned char *, rt->units, rt->allocated_cycles);
6175  for (i = 0; i < old_cycles; i++)
6176    rt->units[i] = XRESIZEVEC (unsigned char, rt->units[i], rt->num_units);
6177  for (i = old_cycles; i < cycles; i++)
6178    rt->units[i] = XCNEWVEC (unsigned char, rt->num_units);
6179}
6180
6181
6182bfd_boolean
6183resources_available (resource_table *rt, xtensa_opcode opcode, int cycle)
6184{
6185  int i;
6186  int uses = (rt->opcode_num_units) (rt->data, opcode);
6187
6188  for (i = 0; i < uses; i++)
6189    {
6190      xtensa_funcUnit unit = (rt->opcode_unit_use) (rt->data, opcode, i);
6191      int stage = (rt->opcode_unit_stage) (rt->data, opcode, i);
6192      int copies_in_use = rt->units[stage + cycle][unit];
6193      int copies = (rt->unit_num_copies) (rt->data, unit);
6194      if (copies_in_use >= copies)
6195	return FALSE;
6196    }
6197  return TRUE;
6198}
6199
6200
6201void
6202reserve_resources (resource_table *rt, xtensa_opcode opcode, int cycle)
6203{
6204  int i;
6205  int uses = (rt->opcode_num_units) (rt->data, opcode);
6206
6207  for (i = 0; i < uses; i++)
6208    {
6209      xtensa_funcUnit unit = (rt->opcode_unit_use) (rt->data, opcode, i);
6210      int stage = (rt->opcode_unit_stage) (rt->data, opcode, i);
6211      /* Note that this allows resources to be oversubscribed.  That's
6212	 essential to the way the optional scheduler works.
6213	 resources_available reports when a resource is over-subscribed,
6214	 so it's easy to tell.  */
6215      rt->units[stage + cycle][unit]++;
6216    }
6217}
6218
6219
6220void
6221release_resources (resource_table *rt, xtensa_opcode opcode, int cycle)
6222{
6223  int i;
6224  int uses = (rt->opcode_num_units) (rt->data, opcode);
6225
6226  for (i = 0; i < uses; i++)
6227    {
6228      xtensa_funcUnit unit = (rt->opcode_unit_use) (rt->data, opcode, i);
6229      int stage = (rt->opcode_unit_stage) (rt->data, opcode, i);
6230      gas_assert (rt->units[stage + cycle][unit] > 0);
6231      rt->units[stage + cycle][unit]--;
6232    }
6233}
6234
6235
6236/* Wrapper functions make parameterized resource reservation
6237   more convenient.  */
6238
6239int
6240opcode_funcUnit_use_unit (void *data, xtensa_opcode opcode, int idx)
6241{
6242  xtensa_funcUnit_use *use = xtensa_opcode_funcUnit_use (data, opcode, idx);
6243  return use->unit;
6244}
6245
6246
6247int
6248opcode_funcUnit_use_stage (void *data, xtensa_opcode opcode, int idx)
6249{
6250  xtensa_funcUnit_use *use = xtensa_opcode_funcUnit_use (data, opcode, idx);
6251  return use->stage;
6252}
6253
6254
6255/* Note that this function does not check issue constraints, but
6256   solely whether the hardware is available to execute the given
6257   instructions together.  It also doesn't check if the tinsns
6258   write the same state, or access the same tieports.  That is
6259   checked by check_t1_t2_reads_and_writes.  */
6260
6261static bfd_boolean
6262resources_conflict (vliw_insn *vinsn)
6263{
6264  int i;
6265  static resource_table *rt = NULL;
6266
6267  /* This is the most common case by far.  Optimize it.  */
6268  if (vinsn->num_slots == 1)
6269    return FALSE;
6270
6271  if (rt == NULL)
6272    {
6273      xtensa_isa isa = xtensa_default_isa;
6274      rt = new_resource_table
6275	(isa, xtensa_num_pipe_stages,
6276	 xtensa_isa_num_funcUnits (isa),
6277	 (unit_num_copies_func) xtensa_funcUnit_num_copies,
6278	 (opcode_num_units_func) xtensa_opcode_num_funcUnit_uses,
6279	 opcode_funcUnit_use_unit,
6280	 opcode_funcUnit_use_stage);
6281    }
6282
6283  clear_resource_table (rt);
6284
6285  for (i = 0; i < vinsn->num_slots; i++)
6286    {
6287      if (!resources_available (rt, vinsn->slots[i].opcode, 0))
6288	return TRUE;
6289      reserve_resources (rt, vinsn->slots[i].opcode, 0);
6290    }
6291
6292  return FALSE;
6293}
6294
6295
6296/* finish_vinsn, emit_single_op and helper functions.  */
6297
6298static bfd_boolean find_vinsn_conflicts (vliw_insn *);
6299static xtensa_format xg_find_narrowest_format (vliw_insn *);
6300static void xg_assemble_vliw_tokens (vliw_insn *);
6301
6302
6303/* We have reached the end of a bundle; emit into the frag.  */
6304
6305static void
6306finish_vinsn (vliw_insn *vinsn)
6307{
6308  IStack slotstack;
6309  int i;
6310
6311  if (find_vinsn_conflicts (vinsn))
6312    {
6313      xg_clear_vinsn (vinsn);
6314      return;
6315    }
6316
6317  /* First, find a format that works.  */
6318  if (vinsn->format == XTENSA_UNDEFINED)
6319    vinsn->format = xg_find_narrowest_format (vinsn);
6320
6321  if (xtensa_format_num_slots (xtensa_default_isa, vinsn->format) > 1
6322      && produce_flix == FLIX_NONE)
6323    {
6324      as_bad (_("The option \"--no-allow-flix\" prohibits multi-slot flix."));
6325      xg_clear_vinsn (vinsn);
6326      return;
6327    }
6328
6329  if (vinsn->format == XTENSA_UNDEFINED)
6330    {
6331      as_bad (_("couldn't find a valid instruction format"));
6332      fprintf (stderr, _("    ops were: "));
6333      for (i = 0; i < vinsn->num_slots; i++)
6334	fprintf (stderr, _(" %s;"),
6335		 xtensa_opcode_name (xtensa_default_isa,
6336				     vinsn->slots[i].opcode));
6337      fprintf (stderr, _("\n"));
6338      xg_clear_vinsn (vinsn);
6339      return;
6340    }
6341
6342  if (vinsn->num_slots
6343      != xtensa_format_num_slots (xtensa_default_isa, vinsn->format))
6344    {
6345      as_bad (_("format '%s' allows %d slots, but there are %d opcodes"),
6346	      xtensa_format_name (xtensa_default_isa, vinsn->format),
6347	      xtensa_format_num_slots (xtensa_default_isa, vinsn->format),
6348	      vinsn->num_slots);
6349      xg_clear_vinsn (vinsn);
6350      return;
6351    }
6352
6353  if (resources_conflict (vinsn))
6354    {
6355      as_bad (_("illegal resource usage in bundle"));
6356      fprintf (stderr, "    ops were: ");
6357      for (i = 0; i < vinsn->num_slots; i++)
6358	fprintf (stderr, " %s;",
6359		 xtensa_opcode_name (xtensa_default_isa,
6360				     vinsn->slots[i].opcode));
6361      fprintf (stderr, "\n");
6362      xg_clear_vinsn (vinsn);
6363      return;
6364    }
6365
6366  for (i = 0; i < vinsn->num_slots; i++)
6367    {
6368      if (vinsn->slots[i].opcode != XTENSA_UNDEFINED)
6369	{
6370	  symbolS *lit_sym = NULL;
6371	  int j;
6372	  bfd_boolean e = FALSE;
6373	  bfd_boolean saved_density = density_supported;
6374
6375	  /* We don't want to narrow ops inside multi-slot bundles.  */
6376	  if (vinsn->num_slots > 1)
6377	    density_supported = FALSE;
6378
6379	  istack_init (&slotstack);
6380	  if (vinsn->slots[i].opcode == xtensa_nop_opcode)
6381	    {
6382	      vinsn->slots[i].opcode =
6383		xtensa_format_slot_nop_opcode (xtensa_default_isa,
6384					       vinsn->format, i);
6385	      vinsn->slots[i].ntok = 0;
6386	    }
6387
6388	  if (xg_expand_assembly_insn (&slotstack, &vinsn->slots[i]))
6389	    {
6390	      e = TRUE;
6391	      continue;
6392	    }
6393
6394	  density_supported = saved_density;
6395
6396	  if (e)
6397	    {
6398	      xg_clear_vinsn (vinsn);
6399	      return;
6400	    }
6401
6402	  for (j = 0; j < slotstack.ninsn; j++)
6403	    {
6404	      TInsn *insn = &slotstack.insn[j];
6405	      if (insn->insn_type == ITYPE_LITERAL)
6406		{
6407		  gas_assert (lit_sym == NULL);
6408		  lit_sym = xg_assemble_literal (insn);
6409		}
6410	      else
6411		{
6412		  gas_assert (insn->insn_type == ITYPE_INSN);
6413		  if (lit_sym)
6414		    xg_resolve_literals (insn, lit_sym);
6415		  if (j != slotstack.ninsn - 1)
6416		    emit_single_op (insn);
6417		}
6418	    }
6419
6420	  if (vinsn->num_slots > 1)
6421	    {
6422	      if (opcode_fits_format_slot
6423		  (slotstack.insn[slotstack.ninsn - 1].opcode,
6424		   vinsn->format, i))
6425		{
6426		  vinsn->slots[i] = slotstack.insn[slotstack.ninsn - 1];
6427		}
6428	      else
6429		{
6430		  emit_single_op (&slotstack.insn[slotstack.ninsn - 1]);
6431		  if (vinsn->format == XTENSA_UNDEFINED)
6432		    vinsn->slots[i].opcode = xtensa_nop_opcode;
6433		  else
6434		    vinsn->slots[i].opcode
6435		      = xtensa_format_slot_nop_opcode (xtensa_default_isa,
6436						       vinsn->format, i);
6437
6438		  vinsn->slots[i].ntok = 0;
6439		}
6440	    }
6441	  else
6442	    {
6443	      vinsn->slots[0] = slotstack.insn[slotstack.ninsn - 1];
6444	      vinsn->format = XTENSA_UNDEFINED;
6445	    }
6446	}
6447    }
6448
6449  /* Now check resource conflicts on the modified bundle.  */
6450  if (resources_conflict (vinsn))
6451    {
6452      as_bad (_("illegal resource usage in bundle"));
6453      fprintf (stderr, "    ops were: ");
6454      for (i = 0; i < vinsn->num_slots; i++)
6455	fprintf (stderr, " %s;",
6456		 xtensa_opcode_name (xtensa_default_isa,
6457				     vinsn->slots[i].opcode));
6458      fprintf (stderr, "\n");
6459      xg_clear_vinsn (vinsn);
6460      return;
6461    }
6462
6463  /* First, find a format that works.  */
6464  if (vinsn->format == XTENSA_UNDEFINED)
6465      vinsn->format = xg_find_narrowest_format (vinsn);
6466
6467  xg_assemble_vliw_tokens (vinsn);
6468
6469  xg_clear_vinsn (vinsn);
6470
6471  xtensa_check_frag_count ();
6472}
6473
6474
6475/* Given an vliw instruction, what conflicts are there in register
6476   usage and in writes to states and queues?
6477
6478   This function does two things:
6479   1. Reports an error when a vinsn contains illegal combinations
6480      of writes to registers states or queues.
6481   2. Marks individual tinsns as not relaxable if the combination
6482      contains antidependencies.
6483
6484   Job 2 handles things like swap semantics in instructions that need
6485   to be relaxed.  For example,
6486
6487	addi a0, a1, 100000
6488
6489   normally would be relaxed to
6490
6491	l32r a0, some_label
6492	add a0, a1, a0
6493
6494   _but_, if the above instruction is bundled with an a0 reader, e.g.,
6495
6496	{ addi a0, a1, 10000 ; add a2, a0, a4 ; }
6497
6498   then we can't relax it into
6499
6500	l32r a0, some_label
6501	{ add a0, a1, a0 ; add a2, a0, a4 ; }
6502
6503   because the value of a0 is trashed before the second add can read it.  */
6504
6505static char check_t1_t2_reads_and_writes (TInsn *, TInsn *);
6506
6507static bfd_boolean
6508find_vinsn_conflicts (vliw_insn *vinsn)
6509{
6510  int i, j;
6511  int branches = 0;
6512  xtensa_isa isa = xtensa_default_isa;
6513
6514  gas_assert (!past_xtensa_end);
6515
6516  for (i = 0 ; i < vinsn->num_slots; i++)
6517    {
6518      TInsn *op1 = &vinsn->slots[i];
6519      if (op1->is_specific_opcode)
6520	op1->keep_wide = TRUE;
6521      else
6522	op1->keep_wide = FALSE;
6523    }
6524
6525  for (i = 0 ; i < vinsn->num_slots; i++)
6526    {
6527      TInsn *op1 = &vinsn->slots[i];
6528
6529      if (xtensa_opcode_is_branch (isa, op1->opcode) == 1)
6530	branches++;
6531
6532      for (j = 0; j < vinsn->num_slots; j++)
6533	{
6534	  if (i != j)
6535	    {
6536	      TInsn *op2 = &vinsn->slots[j];
6537	      char conflict_type = check_t1_t2_reads_and_writes (op1, op2);
6538	      switch (conflict_type)
6539		{
6540		case 'c':
6541		  as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) write the same register"),
6542			  xtensa_opcode_name (isa, op1->opcode), i,
6543			  xtensa_opcode_name (isa, op2->opcode), j);
6544		  return TRUE;
6545		case 'd':
6546		  as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) write the same state"),
6547			  xtensa_opcode_name (isa, op1->opcode), i,
6548			  xtensa_opcode_name (isa, op2->opcode), j);
6549		  return TRUE;
6550		case 'e':
6551		  as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) write the same port"),
6552			  xtensa_opcode_name (isa, op1->opcode), i,
6553			  xtensa_opcode_name (isa, op2->opcode), j);
6554		  return TRUE;
6555		case 'f':
6556		  as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) both have volatile port accesses"),
6557			  xtensa_opcode_name (isa, op1->opcode), i,
6558			  xtensa_opcode_name (isa, op2->opcode), j);
6559		  return TRUE;
6560		default:
6561		  /* Everything is OK.  */
6562		  break;
6563		}
6564	      op2->is_specific_opcode = (op2->is_specific_opcode
6565					 || conflict_type == 'a');
6566	    }
6567	}
6568    }
6569
6570  if (branches > 1)
6571    {
6572      as_bad (_("multiple branches or jumps in the same bundle"));
6573      return TRUE;
6574    }
6575
6576  return FALSE;
6577}
6578
6579
6580/* Check how the state used by t1 and t2 relate.
6581   Cases found are:
6582
6583   case A: t1 reads a register t2 writes (an antidependency within a bundle)
6584   case B: no relationship between what is read and written (both could
6585           read the same reg though)
6586   case C: t1 writes a register t2 writes (a register conflict within a
6587           bundle)
6588   case D: t1 writes a state that t2 also writes
6589   case E: t1 writes a tie queue that t2 also writes
6590   case F: two volatile queue accesses
6591*/
6592
6593static char
6594check_t1_t2_reads_and_writes (TInsn *t1, TInsn *t2)
6595{
6596  xtensa_isa isa = xtensa_default_isa;
6597  xtensa_regfile t1_regfile, t2_regfile;
6598  int t1_reg, t2_reg;
6599  int t1_base_reg, t1_last_reg;
6600  int t2_base_reg, t2_last_reg;
6601  char t1_inout, t2_inout;
6602  int i, j;
6603  char conflict = 'b';
6604  int t1_states;
6605  int t2_states;
6606  int t1_interfaces;
6607  int t2_interfaces;
6608  bfd_boolean t1_volatile = FALSE;
6609  bfd_boolean t2_volatile = FALSE;
6610
6611  /* Check registers.  */
6612  for (j = 0; j < t2->ntok; j++)
6613    {
6614      if (xtensa_operand_is_register (isa, t2->opcode, j) != 1)
6615	continue;
6616
6617      t2_regfile = xtensa_operand_regfile (isa, t2->opcode, j);
6618      t2_base_reg = t2->tok[j].X_add_number;
6619      t2_last_reg = t2_base_reg + xtensa_operand_num_regs (isa, t2->opcode, j);
6620
6621      for (i = 0; i < t1->ntok; i++)
6622	{
6623	  if (xtensa_operand_is_register (isa, t1->opcode, i) != 1)
6624	    continue;
6625
6626	  t1_regfile = xtensa_operand_regfile (isa, t1->opcode, i);
6627
6628	  if (t1_regfile != t2_regfile)
6629	    continue;
6630
6631	  t1_inout = xtensa_operand_inout (isa, t1->opcode, i);
6632	  t2_inout = xtensa_operand_inout (isa, t2->opcode, j);
6633
6634	  if (xtensa_operand_is_known_reg (isa, t1->opcode, i) == 0
6635	      || xtensa_operand_is_known_reg (isa, t2->opcode, j) == 0)
6636	    {
6637	      if (t1_inout == 'm' || t1_inout == 'o'
6638		  || t2_inout == 'm' || t2_inout == 'o')
6639		{
6640		  conflict = 'a';
6641		  continue;
6642		}
6643	    }
6644
6645	  t1_base_reg = t1->tok[i].X_add_number;
6646	  t1_last_reg = (t1_base_reg
6647			 + xtensa_operand_num_regs (isa, t1->opcode, i));
6648
6649	  for (t1_reg = t1_base_reg; t1_reg < t1_last_reg; t1_reg++)
6650	    {
6651	      for (t2_reg = t2_base_reg; t2_reg < t2_last_reg; t2_reg++)
6652		{
6653		  if (t1_reg != t2_reg)
6654		    continue;
6655
6656		  if (t2_inout == 'i' && (t1_inout == 'm' || t1_inout == 'o'))
6657		    {
6658		      conflict = 'a';
6659		      continue;
6660		    }
6661
6662		  if (t1_inout == 'i' && (t2_inout == 'm' || t2_inout == 'o'))
6663		    {
6664		      conflict = 'a';
6665		      continue;
6666		    }
6667
6668		  if (t1_inout != 'i' && t2_inout != 'i')
6669		    return 'c';
6670		}
6671	    }
6672	}
6673    }
6674
6675  /* Check states.  */
6676  t1_states = xtensa_opcode_num_stateOperands (isa, t1->opcode);
6677  t2_states = xtensa_opcode_num_stateOperands (isa, t2->opcode);
6678  for (j = 0; j < t2_states; j++)
6679    {
6680      xtensa_state t2_so = xtensa_stateOperand_state (isa, t2->opcode, j);
6681      t2_inout = xtensa_stateOperand_inout (isa, t2->opcode, j);
6682      for (i = 0; i < t1_states; i++)
6683	{
6684	  xtensa_state t1_so = xtensa_stateOperand_state (isa, t1->opcode, i);
6685	  t1_inout = xtensa_stateOperand_inout (isa, t1->opcode, i);
6686	  if (t1_so != t2_so || xtensa_state_is_shared_or (isa, t1_so) == 1)
6687	    continue;
6688
6689	  if (t2_inout == 'i' && (t1_inout == 'm' || t1_inout == 'o'))
6690	    {
6691	      conflict = 'a';
6692	      continue;
6693	    }
6694
6695	  if (t1_inout == 'i' && (t2_inout == 'm' || t2_inout == 'o'))
6696	    {
6697	      conflict = 'a';
6698	      continue;
6699	    }
6700
6701	  if (t1_inout != 'i' && t2_inout != 'i')
6702	    return 'd';
6703	}
6704    }
6705
6706  /* Check tieports.  */
6707  t1_interfaces = xtensa_opcode_num_interfaceOperands (isa, t1->opcode);
6708  t2_interfaces = xtensa_opcode_num_interfaceOperands (isa, t2->opcode);
6709  for (j = 0; j < t2_interfaces; j++)
6710    {
6711      xtensa_interface t2_int
6712	= xtensa_interfaceOperand_interface (isa, t2->opcode, j);
6713      int t2_class = xtensa_interface_class_id (isa, t2_int);
6714
6715      t2_inout = xtensa_interface_inout (isa, t2_int);
6716      if (xtensa_interface_has_side_effect (isa, t2_int) == 1)
6717	t2_volatile = TRUE;
6718
6719      for (i = 0; i < t1_interfaces; i++)
6720	{
6721	  xtensa_interface t1_int
6722	    = xtensa_interfaceOperand_interface (isa, t1->opcode, j);
6723	  int t1_class = xtensa_interface_class_id (isa, t1_int);
6724
6725	  t1_inout = xtensa_interface_inout (isa, t1_int);
6726	  if (xtensa_interface_has_side_effect (isa, t1_int) == 1)
6727	    t1_volatile = TRUE;
6728
6729	  if (t1_volatile && t2_volatile && (t1_class == t2_class))
6730	    return 'f';
6731
6732	  if (t1_int != t2_int)
6733	    continue;
6734
6735	  if (t2_inout == 'i' && t1_inout == 'o')
6736	    {
6737	      conflict = 'a';
6738	      continue;
6739	    }
6740
6741	  if (t1_inout == 'i' && t2_inout == 'o')
6742	    {
6743	      conflict = 'a';
6744	      continue;
6745	    }
6746
6747	  if (t1_inout != 'i' && t2_inout != 'i')
6748	    return 'e';
6749	}
6750    }
6751
6752  return conflict;
6753}
6754
6755
6756static xtensa_format
6757xg_find_narrowest_format (vliw_insn *vinsn)
6758{
6759  /* Right now we assume that the ops within the vinsn are properly
6760     ordered for the slots that the programmer wanted them in.  In
6761     other words, we don't rearrange the ops in hopes of finding a
6762     better format.  The scheduler handles that.  */
6763
6764  xtensa_isa isa = xtensa_default_isa;
6765  xtensa_format format;
6766  xtensa_opcode nop_opcode = xtensa_nop_opcode;
6767
6768  if (vinsn->num_slots == 1)
6769    return xg_get_single_format (vinsn->slots[0].opcode);
6770
6771  for (format = 0; format < xtensa_isa_num_formats (isa); format++)
6772    {
6773      vliw_insn v_copy;
6774      xg_copy_vinsn (&v_copy, vinsn);
6775      if (xtensa_format_num_slots (isa, format) == v_copy.num_slots)
6776	{
6777	  int slot;
6778	  int fit = 0;
6779	  for (slot = 0; slot < v_copy.num_slots; slot++)
6780	    {
6781	      if (v_copy.slots[slot].opcode == nop_opcode)
6782		{
6783		  v_copy.slots[slot].opcode =
6784		    xtensa_format_slot_nop_opcode (isa, format, slot);
6785		  v_copy.slots[slot].ntok = 0;
6786		}
6787
6788	      if (opcode_fits_format_slot (v_copy.slots[slot].opcode,
6789					   format, slot))
6790		fit++;
6791	      else if (v_copy.num_slots > 1)
6792		{
6793		  TInsn widened;
6794		  /* Try the widened version.  */
6795		  if (!v_copy.slots[slot].keep_wide
6796		      && !v_copy.slots[slot].is_specific_opcode
6797		      && xg_is_single_relaxable_insn (&v_copy.slots[slot],
6798						      &widened, TRUE)
6799		      && opcode_fits_format_slot (widened.opcode,
6800						  format, slot))
6801		    {
6802		      v_copy.slots[slot] = widened;
6803		      fit++;
6804		    }
6805		}
6806	    }
6807	  if (fit == v_copy.num_slots)
6808	    {
6809	      xg_copy_vinsn (vinsn, &v_copy);
6810	      xtensa_format_encode (isa, format, vinsn->insnbuf);
6811	      vinsn->format = format;
6812	      break;
6813	    }
6814	}
6815    }
6816
6817  if (format == xtensa_isa_num_formats (isa))
6818    return XTENSA_UNDEFINED;
6819
6820  return format;
6821}
6822
6823
6824/* Return the additional space needed in a frag
6825   for possible relaxations of any ops in a VLIW insn.
6826   Also fill out the relaxations that might be required of
6827   each tinsn in the vinsn.  */
6828
6829static int
6830relaxation_requirements (vliw_insn *vinsn, bfd_boolean *pfinish_frag)
6831{
6832  bfd_boolean finish_frag = FALSE;
6833  int extra_space = 0;
6834  int slot;
6835
6836  for (slot = 0; slot < vinsn->num_slots; slot++)
6837    {
6838      TInsn *tinsn = &vinsn->slots[slot];
6839      if (!tinsn_has_symbolic_operands (tinsn))
6840	{
6841	  /* A narrow instruction could be widened later to help
6842	     alignment issues.  */
6843	  if (xg_is_single_relaxable_insn (tinsn, 0, TRUE)
6844	      && !tinsn->is_specific_opcode
6845	      && vinsn->num_slots == 1)
6846	    {
6847	      /* Difference in bytes between narrow and wide insns...  */
6848	      extra_space += 1;
6849	      tinsn->subtype = RELAX_NARROW;
6850	    }
6851	}
6852      else
6853	{
6854	  if (workaround_b_j_loop_end
6855	      && tinsn->opcode == xtensa_jx_opcode
6856	      && use_transform ())
6857	    {
6858	      /* Add 2 of these.  */
6859	      extra_space += 3; /* for the nop size */
6860	      tinsn->subtype = RELAX_ADD_NOP_IF_PRE_LOOP_END;
6861	    }
6862
6863	  /* Need to assemble it with space for the relocation.  */
6864	  if (xg_is_relaxable_insn (tinsn, 0)
6865	      && !tinsn->is_specific_opcode)
6866	    {
6867	      int max_size = xg_get_max_insn_widen_size (tinsn->opcode);
6868	      int max_literal_size =
6869		xg_get_max_insn_widen_literal_size (tinsn->opcode);
6870
6871	      tinsn->literal_space = max_literal_size;
6872
6873	      tinsn->subtype = RELAX_IMMED;
6874	      extra_space += max_size;
6875	    }
6876	  else
6877	    {
6878	      /* A fix record will be added for this instruction prior
6879		 to relaxation, so make it end the frag.  */
6880	      finish_frag = TRUE;
6881	    }
6882	}
6883    }
6884  *pfinish_frag = finish_frag;
6885  return extra_space;
6886}
6887
6888
6889static void
6890bundle_tinsn (TInsn *tinsn, vliw_insn *vinsn)
6891{
6892  xtensa_isa isa = xtensa_default_isa;
6893  int slot, chosen_slot;
6894
6895  vinsn->format = xg_get_single_format (tinsn->opcode);
6896  gas_assert (vinsn->format != XTENSA_UNDEFINED);
6897  vinsn->num_slots = xtensa_format_num_slots (isa, vinsn->format);
6898
6899  chosen_slot = xg_get_single_slot (tinsn->opcode);
6900  for (slot = 0; slot < vinsn->num_slots; slot++)
6901    {
6902      if (slot == chosen_slot)
6903	vinsn->slots[slot] = *tinsn;
6904      else
6905	{
6906	  vinsn->slots[slot].opcode =
6907	    xtensa_format_slot_nop_opcode (isa, vinsn->format, slot);
6908	  vinsn->slots[slot].ntok = 0;
6909	  vinsn->slots[slot].insn_type = ITYPE_INSN;
6910	}
6911    }
6912}
6913
6914
6915static bfd_boolean
6916emit_single_op (TInsn *orig_insn)
6917{
6918  int i;
6919  IStack istack;		/* put instructions into here */
6920  symbolS *lit_sym = NULL;
6921  symbolS *label_sym = NULL;
6922
6923  istack_init (&istack);
6924
6925  /* Special-case for "movi aX, foo" which is guaranteed to need relaxing.
6926     Because the scheduling and bundling characteristics of movi and
6927     l32r or const16 are so different, we can do much better if we relax
6928     it prior to scheduling and bundling, rather than after.  */
6929  if ((orig_insn->opcode == xtensa_movi_opcode
6930       || orig_insn->opcode == xtensa_movi_n_opcode)
6931      && !cur_vinsn.inside_bundle
6932      && (orig_insn->tok[1].X_op == O_symbol
6933	  || orig_insn->tok[1].X_op == O_pltrel
6934	  || orig_insn->tok[1].X_op == O_tlsfunc
6935	  || orig_insn->tok[1].X_op == O_tlsarg
6936	  || orig_insn->tok[1].X_op == O_tpoff
6937	  || orig_insn->tok[1].X_op == O_dtpoff)
6938      && !orig_insn->is_specific_opcode && use_transform ())
6939    xg_assembly_relax (&istack, orig_insn, now_seg, frag_now, 0, 1, 0);
6940  else
6941    if (xg_expand_assembly_insn (&istack, orig_insn))
6942      return TRUE;
6943
6944  for (i = 0; i < istack.ninsn; i++)
6945    {
6946      TInsn *insn = &istack.insn[i];
6947      switch (insn->insn_type)
6948	{
6949	case ITYPE_LITERAL:
6950	  gas_assert (lit_sym == NULL);
6951	  lit_sym = xg_assemble_literal (insn);
6952	  break;
6953	case ITYPE_LABEL:
6954	  {
6955	    static int relaxed_sym_idx = 0;
6956	    char *label = XNEWVEC (char, strlen (FAKE_LABEL_NAME) + 12);
6957	    sprintf (label, "%s_rl_%x", FAKE_LABEL_NAME, relaxed_sym_idx++);
6958	    colon (label);
6959	    gas_assert (label_sym == NULL);
6960	    label_sym = symbol_find_or_make (label);
6961	    gas_assert (label_sym);
6962	    free (label);
6963	  }
6964	  break;
6965	case ITYPE_INSN:
6966	  {
6967	    vliw_insn v;
6968	    if (lit_sym)
6969	      xg_resolve_literals (insn, lit_sym);
6970	    if (label_sym)
6971	      xg_resolve_labels (insn, label_sym);
6972	    xg_init_vinsn (&v);
6973	    bundle_tinsn (insn, &v);
6974	    finish_vinsn (&v);
6975	    xg_free_vinsn (&v);
6976	  }
6977	  break;
6978	default:
6979	  gas_assert (0);
6980	  break;
6981	}
6982    }
6983  return FALSE;
6984}
6985
6986
6987static int
6988total_frag_text_expansion (fragS *fragP)
6989{
6990  int slot;
6991  int total_expansion = 0;
6992
6993  for (slot = 0; slot < config_max_slots; slot++)
6994    total_expansion += fragP->tc_frag_data.text_expansion[slot];
6995
6996  return total_expansion;
6997}
6998
6999
7000/* Emit a vliw instruction to the current fragment.  */
7001
7002static void
7003xg_assemble_vliw_tokens (vliw_insn *vinsn)
7004{
7005  bfd_boolean finish_frag;
7006  bfd_boolean is_jump = FALSE;
7007  bfd_boolean is_branch = FALSE;
7008  xtensa_isa isa = xtensa_default_isa;
7009  int insn_size;
7010  int extra_space;
7011  char *f = NULL;
7012  int slot;
7013  struct dwarf2_line_info debug_line;
7014  bfd_boolean loc_directive_seen = FALSE;
7015  TInsn *tinsn;
7016
7017  memset (&debug_line, 0, sizeof (struct dwarf2_line_info));
7018
7019  if (generating_literals)
7020    {
7021      static int reported = 0;
7022      if (reported < 4)
7023	as_bad_where (frag_now->fr_file, frag_now->fr_line,
7024		      _("cannot assemble into a literal fragment"));
7025      if (reported == 3)
7026	as_bad (_("..."));
7027      reported++;
7028      return;
7029    }
7030
7031  if (frag_now_fix () != 0
7032      && (! frag_now->tc_frag_data.is_insn
7033 	  || (vinsn_has_specific_opcodes (vinsn) && use_transform ())
7034 	  || (!use_transform ()) != frag_now->tc_frag_data.is_no_transform
7035 	  || (directive_state[directive_longcalls]
7036	      != frag_now->tc_frag_data.use_longcalls)
7037 	  || (directive_state[directive_absolute_literals]
7038	      != frag_now->tc_frag_data.use_absolute_literals)))
7039    {
7040      frag_wane (frag_now);
7041      frag_new (0);
7042      xtensa_set_frag_assembly_state (frag_now);
7043    }
7044
7045  if (workaround_a0_b_retw
7046      && vinsn->num_slots == 1
7047      && (get_last_insn_flags (now_seg, now_subseg) & FLAG_IS_A0_WRITER) != 0
7048      && xtensa_opcode_is_branch (isa, vinsn->slots[0].opcode) == 1
7049      && use_transform ())
7050    {
7051      has_a0_b_retw = TRUE;
7052
7053      /* Mark this fragment with the special RELAX_ADD_NOP_IF_A0_B_RETW.
7054	 After the first assembly pass we will check all of them and
7055	 add a nop if needed.  */
7056      frag_now->tc_frag_data.is_insn = TRUE;
7057      frag_var (rs_machine_dependent, 4, 4,
7058		RELAX_ADD_NOP_IF_A0_B_RETW,
7059		frag_now->fr_symbol,
7060		frag_now->fr_offset,
7061		NULL);
7062      xtensa_set_frag_assembly_state (frag_now);
7063      frag_now->tc_frag_data.is_insn = TRUE;
7064      frag_var (rs_machine_dependent, 4, 4,
7065		RELAX_ADD_NOP_IF_A0_B_RETW,
7066		frag_now->fr_symbol,
7067		frag_now->fr_offset,
7068		NULL);
7069      xtensa_set_frag_assembly_state (frag_now);
7070    }
7071
7072  for (slot = 0; slot < vinsn->num_slots; slot++)
7073    {
7074      tinsn = &vinsn->slots[slot];
7075
7076      /* See if the instruction implies an aligned section.  */
7077      if (xtensa_opcode_is_loop (isa, tinsn->opcode) == 1)
7078	record_alignment (now_seg, 2);
7079
7080      /* Determine the best line number for debug info.  */
7081      if ((tinsn->loc_directive_seen || !loc_directive_seen)
7082	  && (tinsn->debug_line.filenum != debug_line.filenum
7083	      || tinsn->debug_line.line < debug_line.line
7084	      || tinsn->debug_line.column < debug_line.column))
7085	debug_line = tinsn->debug_line;
7086      if (tinsn->loc_directive_seen)
7087	loc_directive_seen = TRUE;
7088    }
7089
7090  /* Special cases for instructions that force an alignment... */
7091  /* None of these opcodes are bundle-able.  */
7092  if (xtensa_opcode_is_loop (isa, vinsn->slots[0].opcode) == 1)
7093    {
7094      int max_fill;
7095
7096      /* Remember the symbol that marks the end of the loop in the frag
7097	 that marks the start of the loop.  This way we can easily find
7098	 the end of the loop at the beginning, without adding special code
7099	 to mark the loop instructions themselves.  */
7100      symbolS *target_sym = NULL;
7101      if (vinsn->slots[0].tok[1].X_op == O_symbol)
7102	target_sym = vinsn->slots[0].tok[1].X_add_symbol;
7103
7104      xtensa_set_frag_assembly_state (frag_now);
7105      frag_now->tc_frag_data.is_insn = TRUE;
7106
7107      max_fill = get_text_align_max_fill_size
7108	(get_text_align_power (xtensa_fetch_width),
7109	 TRUE, frag_now->tc_frag_data.is_no_density);
7110
7111      if (use_transform ())
7112	frag_var (rs_machine_dependent, max_fill, max_fill,
7113		  RELAX_ALIGN_NEXT_OPCODE, target_sym, 0, NULL);
7114      else
7115	frag_var (rs_machine_dependent, 0, 0,
7116		  RELAX_CHECK_ALIGN_NEXT_OPCODE, target_sym, 0, NULL);
7117      xtensa_set_frag_assembly_state (frag_now);
7118    }
7119
7120  if (vinsn->slots[0].opcode == xtensa_entry_opcode
7121      && !vinsn->slots[0].is_specific_opcode)
7122    {
7123      xtensa_mark_literal_pool_location ();
7124      xtensa_move_labels (frag_now, 0);
7125      frag_var (rs_align_test, 1, 1, 0, NULL, 2, NULL);
7126    }
7127
7128  if (vinsn->num_slots == 1)
7129    {
7130      if (workaround_a0_b_retw && use_transform ())
7131	set_last_insn_flags (now_seg, now_subseg, FLAG_IS_A0_WRITER,
7132			     is_register_writer (&vinsn->slots[0], "a", 0));
7133
7134      set_last_insn_flags (now_seg, now_subseg, FLAG_IS_BAD_LOOPEND,
7135			   is_bad_loopend_opcode (&vinsn->slots[0]));
7136    }
7137  else
7138    set_last_insn_flags (now_seg, now_subseg, FLAG_IS_BAD_LOOPEND, FALSE);
7139
7140  insn_size = xtensa_format_length (isa, vinsn->format);
7141
7142  extra_space = relaxation_requirements (vinsn, &finish_frag);
7143
7144  /* vinsn_to_insnbuf will produce the error.  */
7145  if (vinsn->format != XTENSA_UNDEFINED)
7146    {
7147      f = frag_more (insn_size + extra_space);
7148      xtensa_set_frag_assembly_state (frag_now);
7149      frag_now->tc_frag_data.is_insn = TRUE;
7150    }
7151
7152  vinsn_to_insnbuf (vinsn, f, frag_now, FALSE);
7153  if (vinsn->format == XTENSA_UNDEFINED)
7154    return;
7155
7156  xtensa_insnbuf_to_chars (isa, vinsn->insnbuf, (unsigned char *) f, 0);
7157
7158  if (debug_type == DEBUG_DWARF2 || loc_directive_seen)
7159    dwarf2_gen_line_info (frag_now_fix () - (insn_size + extra_space),
7160			  &debug_line);
7161
7162  for (slot = 0; slot < vinsn->num_slots; slot++)
7163    {
7164      tinsn = &vinsn->slots[slot];
7165      frag_now->tc_frag_data.slot_subtypes[slot] = tinsn->subtype;
7166      frag_now->tc_frag_data.slot_symbols[slot] = tinsn->symbol;
7167      frag_now->tc_frag_data.slot_offsets[slot] = tinsn->offset;
7168      frag_now->tc_frag_data.literal_frags[slot] = tinsn->literal_frag;
7169      if (tinsn->opcode == xtensa_l32r_opcode)
7170	{
7171	  frag_now->tc_frag_data.literal_frags[slot] =
7172		  tinsn->tok[1].X_add_symbol->sy_frag;
7173	}
7174      if (tinsn->literal_space != 0)
7175	xg_assemble_literal_space (tinsn->literal_space, slot);
7176      frag_now->tc_frag_data.free_reg[slot] = tinsn->extra_arg;
7177
7178      if (tinsn->subtype == RELAX_NARROW)
7179	gas_assert (vinsn->num_slots == 1);
7180      if (xtensa_opcode_is_jump (isa, tinsn->opcode) == 1)
7181	is_jump = TRUE;
7182      if (xtensa_opcode_is_branch (isa, tinsn->opcode) == 1)
7183	is_branch = TRUE;
7184
7185      if (tinsn->subtype || tinsn->symbol || tinsn->offset
7186	  || tinsn->literal_frag || is_jump || is_branch)
7187	finish_frag = TRUE;
7188    }
7189
7190  if (vinsn_has_specific_opcodes (vinsn) && use_transform ())
7191    frag_now->tc_frag_data.is_specific_opcode = TRUE;
7192
7193  if (finish_frag)
7194    {
7195      frag_variant (rs_machine_dependent,
7196		    extra_space, extra_space, RELAX_SLOTS,
7197		    frag_now->fr_symbol, frag_now->fr_offset, f);
7198      xtensa_set_frag_assembly_state (frag_now);
7199    }
7200
7201  /* Special cases for loops:
7202     close_loop_end should be inserted AFTER short_loop.
7203     Make sure that CLOSE loops are processed BEFORE short_loops
7204     when converting them.  */
7205
7206  /* "short_loop": Add a NOP if the loop is < 4 bytes.  */
7207  if (xtensa_opcode_is_loop (isa, vinsn->slots[0].opcode) == 1
7208      && !vinsn->slots[0].is_specific_opcode)
7209    {
7210      if (workaround_short_loop && use_transform ())
7211	{
7212	  maybe_has_short_loop = TRUE;
7213	  frag_now->tc_frag_data.is_insn = TRUE;
7214	  frag_var (rs_machine_dependent, 4, 4,
7215		    RELAX_ADD_NOP_IF_SHORT_LOOP,
7216		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
7217	  frag_now->tc_frag_data.is_insn = TRUE;
7218	  frag_var (rs_machine_dependent, 4, 4,
7219		    RELAX_ADD_NOP_IF_SHORT_LOOP,
7220		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
7221	}
7222
7223      /* "close_loop_end": Add up to 12 bytes of NOPs to keep a
7224	 loop at least 12 bytes away from another loop's end.  */
7225      if (workaround_close_loop_end && use_transform ())
7226	{
7227	  maybe_has_close_loop_end = TRUE;
7228	  frag_now->tc_frag_data.is_insn = TRUE;
7229	  frag_var (rs_machine_dependent, 12, 12,
7230		    RELAX_ADD_NOP_IF_CLOSE_LOOP_END,
7231		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
7232	}
7233    }
7234
7235  if (use_transform ())
7236    {
7237      if (is_jump)
7238	{
7239	  gas_assert (finish_frag);
7240	  frag_var (rs_machine_dependent,
7241		    xtensa_fetch_width, xtensa_fetch_width,
7242		    RELAX_UNREACHABLE,
7243		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
7244	  xtensa_set_frag_assembly_state (frag_now);
7245	  xtensa_maybe_create_trampoline_frag ();
7246	  /* Always create one here.  */
7247	  xtensa_maybe_create_literal_pool_frag (TRUE, FALSE);
7248	}
7249      else if (is_branch && do_align_targets ())
7250	{
7251	  gas_assert (finish_frag);
7252	  frag_var (rs_machine_dependent,
7253		    xtensa_fetch_width, xtensa_fetch_width,
7254		    RELAX_MAYBE_UNREACHABLE,
7255		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
7256	  xtensa_set_frag_assembly_state (frag_now);
7257	  frag_var (rs_machine_dependent,
7258		    0, 0,
7259		    RELAX_MAYBE_DESIRE_ALIGN,
7260		    frag_now->fr_symbol, frag_now->fr_offset, NULL);
7261	  xtensa_set_frag_assembly_state (frag_now);
7262	}
7263    }
7264
7265  /* Now, if the original opcode was a call...  */
7266  if (do_align_targets ()
7267      && xtensa_opcode_is_call (isa, vinsn->slots[0].opcode) == 1)
7268    {
7269      float freq = get_subseg_total_freq (now_seg, now_subseg);
7270      frag_now->tc_frag_data.is_insn = TRUE;
7271      frag_var (rs_machine_dependent, 4, (int) freq, RELAX_DESIRE_ALIGN,
7272		frag_now->fr_symbol, frag_now->fr_offset, NULL);
7273      xtensa_set_frag_assembly_state (frag_now);
7274    }
7275
7276  if (vinsn_has_specific_opcodes (vinsn) && use_transform ())
7277    {
7278      frag_wane (frag_now);
7279      frag_new (0);
7280      xtensa_set_frag_assembly_state (frag_now);
7281    }
7282}
7283
7284
7285/* xtensa_end and helper functions.  */
7286
7287static void xtensa_cleanup_align_frags (void);
7288static void xtensa_fix_target_frags (void);
7289static void xtensa_mark_narrow_branches (void);
7290static void xtensa_mark_zcl_first_insns (void);
7291static void xtensa_mark_difference_of_two_symbols (void);
7292static void xtensa_fix_a0_b_retw_frags (void);
7293static void xtensa_fix_b_j_loop_end_frags (void);
7294static void xtensa_fix_close_loop_end_frags (void);
7295static void xtensa_fix_short_loop_frags (void);
7296static void xtensa_sanity_check (void);
7297static void xtensa_add_config_info (void);
7298
7299void
7300xtensa_end (void)
7301{
7302  directive_balance ();
7303  xtensa_flush_pending_output ();
7304
7305  past_xtensa_end = TRUE;
7306
7307  xtensa_move_literals ();
7308
7309  xtensa_reorder_segments ();
7310  xtensa_cleanup_align_frags ();
7311  xtensa_fix_target_frags ();
7312  if (workaround_a0_b_retw && has_a0_b_retw)
7313    xtensa_fix_a0_b_retw_frags ();
7314  if (workaround_b_j_loop_end)
7315    xtensa_fix_b_j_loop_end_frags ();
7316
7317  /* "close_loop_end" should be processed BEFORE "short_loop".  */
7318  if (workaround_close_loop_end && maybe_has_close_loop_end)
7319    xtensa_fix_close_loop_end_frags ();
7320
7321  if (workaround_short_loop && maybe_has_short_loop)
7322    xtensa_fix_short_loop_frags ();
7323  if (align_targets)
7324    xtensa_mark_narrow_branches ();
7325  xtensa_mark_zcl_first_insns ();
7326
7327  xtensa_sanity_check ();
7328
7329  xtensa_add_config_info ();
7330
7331  xtensa_check_frag_count ();
7332}
7333
7334
7335struct trampoline_frag
7336{
7337  struct trampoline_frag *next;
7338  bfd_boolean needs_jump_around;
7339  fragS *fragP;
7340  fixS *fixP;
7341};
7342
7343struct trampoline_seg
7344{
7345  struct trampoline_seg *next;
7346  asection *seg;
7347  struct trampoline_frag trampoline_list;
7348};
7349
7350static struct trampoline_seg trampoline_seg_list;
7351#define J_RANGE (128 * 1024)
7352
7353static int unreachable_count = 0;
7354
7355
7356static void
7357xtensa_maybe_create_trampoline_frag (void)
7358{
7359  if (!use_trampolines)
7360    return;
7361
7362  /* We create an area for possible trampolines every 10 unreachable frags.
7363     These are preferred over the ones not preceded by an unreachable frag,
7364     because we don't have to jump around them. This function is called after
7365     each RELAX_UNREACHABLE frag is created.  */
7366
7367  if (++unreachable_count > 10)
7368    {
7369      xtensa_create_trampoline_frag (FALSE);
7370      clear_frag_count ();
7371      unreachable_count = 0;
7372    }
7373}
7374
7375static void
7376xtensa_check_frag_count (void)
7377{
7378  if (!use_trampolines || frag_now->tc_frag_data.is_no_transform)
7379    return;
7380
7381  /* We create an area for possible trampolines every 8000 frags or so. This
7382     is an estimate based on the max range of a "j" insn (+/-128K) divided
7383     by a typical frag byte count (16), minus a few for safety. This function
7384     is called after each source line is processed.  */
7385
7386  if (get_frag_count () > 8000)
7387    {
7388      xtensa_create_trampoline_frag (TRUE);
7389      clear_frag_count ();
7390      unreachable_count = 0;
7391    }
7392
7393  /* We create an area for a possible literal pool every N (default 5000)
7394     frags or so.  */
7395  xtensa_maybe_create_literal_pool_frag (TRUE, TRUE);
7396}
7397
7398static xtensa_insnbuf trampoline_buf = NULL;
7399static xtensa_insnbuf trampoline_slotbuf = NULL;
7400
7401static xtensa_insnbuf litpool_buf = NULL;
7402static xtensa_insnbuf litpool_slotbuf = NULL;
7403
7404#define TRAMPOLINE_FRAG_SIZE 3000
7405
7406static void
7407xtensa_create_trampoline_frag (bfd_boolean needs_jump_around)
7408{
7409  /* Emit a frag where we can place intermediate jump instructions,
7410     in case we need to jump farther than 128K bytes.
7411     Each jump instruction takes three bytes.
7412     We allocate enough for 1000 trampolines in each frag.
7413     If that's not enough, oh well.  */
7414
7415  struct trampoline_seg *ts = trampoline_seg_list.next;
7416  struct trampoline_frag *tf;
7417  char *varP;
7418  fragS *fragP;
7419  int size = TRAMPOLINE_FRAG_SIZE;
7420
7421  for ( ; ts; ts = ts->next)
7422    {
7423      if (ts->seg == now_seg)
7424	break;
7425    }
7426
7427  if (ts == NULL)
7428    {
7429      ts = XCNEW(struct trampoline_seg);
7430      ts->next = trampoline_seg_list.next;
7431      trampoline_seg_list.next = ts;
7432      ts->seg = now_seg;
7433    }
7434
7435  frag_wane (frag_now);
7436  frag_new (0);
7437  xtensa_set_frag_assembly_state (frag_now);
7438  varP = frag_var (rs_machine_dependent, size, size, RELAX_TRAMPOLINE, NULL, 0, NULL);
7439  fragP = (fragS *)(varP - SIZEOF_STRUCT_FRAG);
7440  if (trampoline_buf == NULL)
7441    {
7442      trampoline_buf = xtensa_insnbuf_alloc (xtensa_default_isa);
7443      trampoline_slotbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
7444    }
7445  tf = XNEW (struct trampoline_frag);
7446  tf->next = ts->trampoline_list.next;
7447  ts->trampoline_list.next = tf;
7448  tf->needs_jump_around = needs_jump_around;
7449  tf->fragP = fragP;
7450  tf->fixP = NULL;
7451}
7452
7453
7454static struct trampoline_seg *
7455find_trampoline_seg (asection *seg)
7456{
7457  struct trampoline_seg *ts = trampoline_seg_list.next;
7458
7459  for ( ; ts; ts = ts->next)
7460    {
7461      if (ts->seg == seg)
7462	return ts;
7463    }
7464
7465  return NULL;
7466}
7467
7468
7469void dump_trampolines (void);
7470
7471void
7472dump_trampolines (void)
7473{
7474  struct trampoline_seg *ts = trampoline_seg_list.next;
7475
7476  for ( ; ts; ts = ts->next)
7477    {
7478      asection *seg = ts->seg;
7479
7480      if (seg == NULL)
7481	continue;
7482      fprintf(stderr, "SECTION %s\n", seg->name);
7483      struct trampoline_frag *tf = ts->trampoline_list.next;
7484      for ( ; tf; tf = tf->next)
7485	{
7486	  if (tf->fragP == NULL)
7487	    continue;
7488	  fprintf(stderr, "   0x%08x: fix=%d, jump_around=%s\n",
7489		  (int)tf->fragP->fr_address, (int)tf->fragP->fr_fix,
7490		  tf->needs_jump_around ? "T" : "F");
7491	}
7492    }
7493}
7494
7495static void dump_litpools (void) __attribute__ ((unused));
7496
7497static void
7498dump_litpools (void)
7499{
7500  struct litpool_seg *lps = litpool_seg_list.next;
7501  struct litpool_frag *lpf;
7502
7503  for ( ; lps ; lps = lps->next )
7504    {
7505      printf("litpool seg %s\n", lps->seg->name);
7506      for ( lpf = lps->frag_list.next; lpf->fragP; lpf = lpf->next )
7507	{
7508	  fragS *litfrag = lpf->fragP->fr_next;
7509	  int count = 0;
7510	  while (litfrag && litfrag->fr_subtype != RELAX_LITERAL_POOL_END)
7511	    {
7512	      if (litfrag->fr_fix == 4)
7513		count++;
7514	      litfrag = litfrag->fr_next;
7515	    }
7516	  printf("   %ld <%d:%d> (%d) [%d]: ",
7517		 lpf->addr, lpf->priority, lpf->original_priority,
7518		 lpf->fragP->fr_line, count);
7519	  //dump_frag(lpf->fragP);
7520	}
7521    }
7522}
7523
7524static void
7525xtensa_maybe_create_literal_pool_frag (bfd_boolean create,
7526				       bfd_boolean only_if_needed)
7527{
7528  struct litpool_seg *lps = litpool_seg_list.next;
7529  fragS *fragP;
7530  struct litpool_frag *lpf;
7531  bfd_boolean needed = FALSE;
7532
7533  if (use_literal_section || !auto_litpools)
7534    return;
7535
7536  for ( ; lps ; lps = lps->next )
7537    {
7538      if (lps->seg == now_seg)
7539	break;
7540    }
7541
7542  if (lps == NULL)
7543    {
7544      lps = XCNEW (struct litpool_seg);
7545      lps->next = litpool_seg_list.next;
7546      litpool_seg_list.next = lps;
7547      lps->seg = now_seg;
7548      lps->frag_list.next = &lps->frag_list;
7549      lps->frag_list.prev = &lps->frag_list;
7550    }
7551
7552  lps->frag_count++;
7553
7554  if (create)
7555    {
7556      if (only_if_needed)
7557	{
7558	  if (past_xtensa_end || !use_transform() ||
7559	      frag_now->tc_frag_data.is_no_transform)
7560	    {
7561	      return;
7562	    }
7563	  if (auto_litpool_limit <= 0)
7564	    {
7565	      /* Don't create a litpool based only on frag count.  */
7566	      return;
7567	    }
7568	  else if (lps->frag_count > auto_litpool_limit)
7569	    {
7570	      needed = TRUE;
7571	    }
7572	  else
7573	    {
7574	      return;
7575	    }
7576	}
7577      else
7578	{
7579	  needed = TRUE;
7580	}
7581    }
7582
7583  if (needed)
7584    {
7585      int size = (only_if_needed) ? 3 : 0; /* Space for a "j" insn.  */
7586      /* Create a potential site for a literal pool.  */
7587      frag_wane (frag_now);
7588      frag_new (0);
7589      xtensa_set_frag_assembly_state (frag_now);
7590      fragP = frag_now;
7591      fragP->tc_frag_data.lit_frchain = frchain_now;
7592      fragP->tc_frag_data.literal_frag = fragP;
7593      frag_var (rs_machine_dependent, size, size,
7594		    (only_if_needed) ?
7595		        RELAX_LITERAL_POOL_CANDIDATE_BEGIN :
7596		        RELAX_LITERAL_POOL_BEGIN,
7597		    NULL, 0, NULL);
7598      frag_now->tc_frag_data.lit_seg = now_seg;
7599      frag_variant (rs_machine_dependent, 0, 0,
7600		    RELAX_LITERAL_POOL_END, NULL, 0, NULL);
7601      xtensa_set_frag_assembly_state (frag_now);
7602    }
7603  else
7604    {
7605      /* RELAX_LITERAL_POOL_BEGIN frag is being created;
7606	 just record it here.  */
7607      fragP = frag_now;
7608    }
7609
7610  lpf = XNEW (struct litpool_frag);
7611  /* Insert at tail of circular list.  */
7612  lpf->addr = 0;
7613  lps->frag_list.prev->next = lpf;
7614  lpf->next = &lps->frag_list;
7615  lpf->prev = lps->frag_list.prev;
7616  lps->frag_list.prev = lpf;
7617  lpf->fragP = fragP;
7618  lpf->priority = (needed) ? (only_if_needed) ? 3 : 2 : 1;
7619  lpf->original_priority = lpf->priority;
7620
7621  lps->frag_count = 0;
7622}
7623
7624static void
7625xtensa_cleanup_align_frags (void)
7626{
7627  frchainS *frchP;
7628  asection *s;
7629
7630  for (s = stdoutput->sections; s; s = s->next)
7631    for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7632      {
7633	fragS *fragP;
7634	/* Walk over all of the fragments in a subsection.  */
7635	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7636	  {
7637	    if ((fragP->fr_type == rs_align
7638		 || fragP->fr_type == rs_align_code
7639		 || (fragP->fr_type == rs_machine_dependent
7640		     && (fragP->fr_subtype == RELAX_DESIRE_ALIGN
7641			 || fragP->fr_subtype == RELAX_DESIRE_ALIGN_IF_TARGET)))
7642		&& fragP->fr_fix == 0)
7643	      {
7644		fragS *next = fragP->fr_next;
7645
7646		while (next
7647		       && next->fr_fix == 0
7648		       && next->fr_type == rs_machine_dependent
7649		       && next->fr_subtype == RELAX_DESIRE_ALIGN_IF_TARGET)
7650		  {
7651		    frag_wane (next);
7652		    next = next->fr_next;
7653		  }
7654	      }
7655	    /* If we don't widen branch targets, then they
7656	       will be easier to align.  */
7657	    if (fragP->tc_frag_data.is_branch_target
7658		&& fragP->fr_opcode == fragP->fr_literal
7659		&& fragP->fr_type == rs_machine_dependent
7660		&& fragP->fr_subtype == RELAX_SLOTS
7661		&& fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
7662	      frag_wane (fragP);
7663	    if (fragP->fr_type == rs_machine_dependent
7664		&& fragP->fr_subtype == RELAX_UNREACHABLE)
7665	      fragP->tc_frag_data.is_unreachable = TRUE;
7666	  }
7667      }
7668}
7669
7670
7671/* Re-process all of the fragments looking to convert all of the
7672   RELAX_DESIRE_ALIGN_IF_TARGET fragments.  If there is a branch
7673   target in the next fragment, convert this to RELAX_DESIRE_ALIGN.
7674   Otherwise, convert to a .fill 0.  */
7675
7676static void
7677xtensa_fix_target_frags (void)
7678{
7679  frchainS *frchP;
7680  asection *s;
7681
7682  /* When this routine is called, all of the subsections are still intact
7683     so we walk over subsections instead of sections.  */
7684  for (s = stdoutput->sections; s; s = s->next)
7685    for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7686      {
7687	fragS *fragP;
7688
7689	/* Walk over all of the fragments in a subsection.  */
7690	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7691	  {
7692	    if (fragP->fr_type == rs_machine_dependent
7693		&& fragP->fr_subtype == RELAX_DESIRE_ALIGN_IF_TARGET)
7694	      {
7695		if (next_frag_is_branch_target (fragP))
7696		  fragP->fr_subtype = RELAX_DESIRE_ALIGN;
7697		else
7698		  frag_wane (fragP);
7699	      }
7700	  }
7701      }
7702}
7703
7704
7705static bfd_boolean is_narrow_branch_guaranteed_in_range (fragS *, TInsn *);
7706
7707static void
7708xtensa_mark_narrow_branches (void)
7709{
7710  frchainS *frchP;
7711  asection *s;
7712
7713  for (s = stdoutput->sections; s; s = s->next)
7714    for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7715      {
7716	fragS *fragP;
7717	/* Walk over all of the fragments in a subsection.  */
7718	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7719	  {
7720	    if (fragP->fr_type == rs_machine_dependent
7721		&& fragP->fr_subtype == RELAX_SLOTS
7722		&& fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED)
7723	      {
7724		vliw_insn vinsn;
7725
7726		vinsn_from_chars (&vinsn, fragP->fr_opcode);
7727		tinsn_immed_from_frag (&vinsn.slots[0], fragP, 0);
7728
7729		if (vinsn.num_slots == 1
7730		    && xtensa_opcode_is_branch (xtensa_default_isa,
7731						vinsn.slots[0].opcode) == 1
7732		    && xg_get_single_size (vinsn.slots[0].opcode) == 2
7733		    && is_narrow_branch_guaranteed_in_range (fragP,
7734							     &vinsn.slots[0]))
7735		  {
7736		    fragP->fr_subtype = RELAX_SLOTS;
7737		    fragP->tc_frag_data.slot_subtypes[0] = RELAX_NARROW;
7738		    fragP->tc_frag_data.is_aligning_branch = 1;
7739		  }
7740	      }
7741	  }
7742      }
7743}
7744
7745
7746/* A branch is typically widened only when its target is out of
7747   range.  However, we would like to widen them to align a subsequent
7748   branch target when possible.
7749
7750   Because the branch relaxation code is so convoluted, the optimal solution
7751   (combining the two cases) is difficult to get right in all circumstances.
7752   We therefore go with an "almost as good" solution, where we only
7753   use for alignment narrow branches that definitely will not expand to a
7754   jump and a branch.  These functions find and mark these cases.  */
7755
7756/* The range in bytes of BNEZ.N and BEQZ.N.  The target operand is encoded
7757   as PC + 4 + imm6, where imm6 is a 6-bit immediate ranging from 0 to 63.
7758   We start counting beginning with the frag after the 2-byte branch, so the
7759   maximum offset is (4 - 2) + 63 = 65.  */
7760#define MAX_IMMED6 65
7761
7762static offsetT unrelaxed_frag_max_size (fragS *);
7763
7764static bfd_boolean
7765is_narrow_branch_guaranteed_in_range (fragS *fragP, TInsn *tinsn)
7766{
7767  const expressionS *exp = &tinsn->tok[1];
7768  symbolS *symbolP = exp->X_add_symbol;
7769  offsetT max_distance = exp->X_add_number;
7770  fragS *target_frag;
7771
7772  if (exp->X_op != O_symbol)
7773    return FALSE;
7774
7775  target_frag = symbol_get_frag (symbolP);
7776
7777  max_distance += (S_GET_VALUE (symbolP) - target_frag->fr_address);
7778  if (is_branch_jmp_to_next (tinsn, fragP))
7779    return FALSE;
7780
7781  /* The branch doesn't branch over it's own frag,
7782     but over the subsequent ones.  */
7783  fragP = fragP->fr_next;
7784  while (fragP != NULL && fragP != target_frag && max_distance <= MAX_IMMED6)
7785    {
7786      max_distance += unrelaxed_frag_max_size (fragP);
7787      fragP = fragP->fr_next;
7788    }
7789  if (max_distance <= MAX_IMMED6 && fragP == target_frag)
7790    return TRUE;
7791  return FALSE;
7792}
7793
7794
7795static void
7796xtensa_mark_zcl_first_insns (void)
7797{
7798  frchainS *frchP;
7799  asection *s;
7800
7801  for (s = stdoutput->sections; s; s = s->next)
7802    for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7803      {
7804	fragS *fragP;
7805	/* Walk over all of the fragments in a subsection.  */
7806	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7807	  {
7808	    if (fragP->fr_type == rs_machine_dependent
7809		&& (fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE
7810		    || fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE))
7811	      {
7812		/* Find the loop frag.  */
7813		fragS *loop_frag = next_non_empty_frag (fragP);
7814		/* Find the first insn frag.  */
7815		fragS *targ_frag = next_non_empty_frag (loop_frag);
7816
7817	      /* Handle a corner case that comes up in hardware
7818		 diagnostics.  The original assembly looks like this:
7819
7820		 loop aX, LabelA
7821		 <empty_frag>--not found by next_non_empty_frag
7822		 loop aY, LabelB
7823
7824		 Depending on the start address, the assembler may or
7825		 may not change it to look something like this:
7826
7827		 loop aX, LabelA
7828		 nop--frag isn't empty anymore
7829		 loop aY, LabelB
7830
7831		 So set up to check the alignment of the nop if it
7832		 exists  */
7833		while (loop_frag != targ_frag)
7834		  {
7835		    if (loop_frag->fr_type == rs_machine_dependent
7836			&& (loop_frag->fr_subtype == RELAX_ALIGN_NEXT_OPCODE
7837			    || loop_frag->fr_subtype
7838			    == RELAX_CHECK_ALIGN_NEXT_OPCODE))
7839		      targ_frag = loop_frag;
7840		    else
7841		      loop_frag = loop_frag->fr_next;
7842		  }
7843
7844		/* Of course, sometimes (mostly for toy test cases) a
7845		   zero-cost loop instruction is the last in a section.  */
7846		if (targ_frag)
7847		  {
7848		    targ_frag->tc_frag_data.is_first_loop_insn = TRUE;
7849		    /* Do not widen a frag that is the first instruction of a
7850		       zero-cost loop.  It makes that loop harder to align.  */
7851		    if (targ_frag->fr_type == rs_machine_dependent
7852			&& targ_frag->fr_subtype == RELAX_SLOTS
7853			&& (targ_frag->tc_frag_data.slot_subtypes[0]
7854			    == RELAX_NARROW))
7855		      {
7856			if (targ_frag->tc_frag_data.is_aligning_branch)
7857			  targ_frag->tc_frag_data.slot_subtypes[0] = RELAX_IMMED;
7858			else
7859			  {
7860			    frag_wane (targ_frag);
7861			    targ_frag->tc_frag_data.slot_subtypes[0] = 0;
7862			  }
7863		      }
7864		  }
7865		if (fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE)
7866		  frag_wane (fragP);
7867	      }
7868	  }
7869      }
7870}
7871
7872
7873/* When a difference-of-symbols expression is encoded as a uleb128 or
7874   sleb128 value, the linker is unable to adjust that value to account for
7875   link-time relaxation.  Mark all the code between such symbols so that
7876   its size cannot be changed by linker relaxation.  */
7877
7878static void
7879xtensa_mark_difference_of_two_symbols (void)
7880{
7881  symbolS *expr_sym;
7882
7883  for (expr_sym = expr_symbols; expr_sym;
7884       expr_sym = symbol_get_tc (expr_sym)->next_expr_symbol)
7885    {
7886      expressionS *exp = symbol_get_value_expression (expr_sym);
7887
7888      if (exp->X_op == O_subtract)
7889	{
7890	  symbolS *left = exp->X_add_symbol;
7891	  symbolS *right = exp->X_op_symbol;
7892
7893	  /* Difference of two symbols not in the same section
7894	     are handled with relocations in the linker.  */
7895	  if (S_GET_SEGMENT (left) == S_GET_SEGMENT (right))
7896	    {
7897	      fragS *start;
7898	      fragS *end;
7899	      fragS *walk;
7900
7901	      if (symbol_get_frag (left)->fr_address
7902		  <= symbol_get_frag (right)->fr_address)
7903		{
7904		  start = symbol_get_frag (left);
7905		  end = symbol_get_frag (right);
7906		}
7907	      else
7908		{
7909		  start = symbol_get_frag (right);
7910		  end = symbol_get_frag (left);
7911		}
7912
7913	      if (start->tc_frag_data.no_transform_end != NULL)
7914		walk = start->tc_frag_data.no_transform_end;
7915	      else
7916		walk = start;
7917	      do
7918		{
7919		  walk->tc_frag_data.is_no_transform = 1;
7920		  walk = walk->fr_next;
7921		}
7922	      while (walk && walk->fr_address < end->fr_address);
7923
7924	      start->tc_frag_data.no_transform_end = walk;
7925	    }
7926	}
7927    }
7928}
7929
7930
7931/* Re-process all of the fragments looking to convert all of the
7932   RELAX_ADD_NOP_IF_A0_B_RETW.  If the next instruction is a
7933   conditional branch or a retw/retw.n, convert this frag to one that
7934   will generate a NOP.  In any case close it off with a .fill 0.  */
7935
7936static bfd_boolean next_instrs_are_b_retw (fragS *);
7937
7938static void
7939xtensa_fix_a0_b_retw_frags (void)
7940{
7941  frchainS *frchP;
7942  asection *s;
7943
7944  /* When this routine is called, all of the subsections are still intact
7945     so we walk over subsections instead of sections.  */
7946  for (s = stdoutput->sections; s; s = s->next)
7947    for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7948      {
7949	fragS *fragP;
7950
7951	/* Walk over all of the fragments in a subsection.  */
7952	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7953	  {
7954	    if (fragP->fr_type == rs_machine_dependent
7955		&& fragP->fr_subtype == RELAX_ADD_NOP_IF_A0_B_RETW)
7956	      {
7957		if (next_instrs_are_b_retw (fragP))
7958		  {
7959		    if (fragP->tc_frag_data.is_no_transform)
7960		      as_bad (_("instruction sequence (write a0, branch, retw) may trigger hardware errata"));
7961		    else
7962		      relax_frag_add_nop (fragP);
7963		  }
7964		frag_wane (fragP);
7965	      }
7966	  }
7967      }
7968}
7969
7970
7971static bfd_boolean
7972next_instrs_are_b_retw (fragS *fragP)
7973{
7974  xtensa_opcode opcode;
7975  xtensa_format fmt;
7976  const fragS *next_fragP = next_non_empty_frag (fragP);
7977  static xtensa_insnbuf insnbuf = NULL;
7978  static xtensa_insnbuf slotbuf = NULL;
7979  xtensa_isa isa = xtensa_default_isa;
7980  int offset = 0;
7981  int slot;
7982  bfd_boolean branch_seen = FALSE;
7983
7984  if (!insnbuf)
7985    {
7986      insnbuf = xtensa_insnbuf_alloc (isa);
7987      slotbuf = xtensa_insnbuf_alloc (isa);
7988    }
7989
7990  if (next_fragP == NULL)
7991    return FALSE;
7992
7993  /* Check for the conditional branch.  */
7994  xtensa_insnbuf_from_chars
7995    (isa, insnbuf, (unsigned char *) &next_fragP->fr_literal[offset], 0);
7996  fmt = xtensa_format_decode (isa, insnbuf);
7997  if (fmt == XTENSA_UNDEFINED)
7998    return FALSE;
7999
8000  for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
8001    {
8002      xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
8003      opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
8004
8005      branch_seen = (branch_seen
8006		     || xtensa_opcode_is_branch (isa, opcode) == 1);
8007    }
8008
8009  if (!branch_seen)
8010    return FALSE;
8011
8012  offset += xtensa_format_length (isa, fmt);
8013  if (offset == next_fragP->fr_fix)
8014    {
8015      next_fragP = next_non_empty_frag (next_fragP);
8016      offset = 0;
8017    }
8018
8019  if (next_fragP == NULL)
8020    return FALSE;
8021
8022  /* Check for the retw/retw.n.  */
8023  xtensa_insnbuf_from_chars
8024    (isa, insnbuf, (unsigned char *) &next_fragP->fr_literal[offset], 0);
8025  fmt = xtensa_format_decode (isa, insnbuf);
8026
8027  /* Because RETW[.N] is not bundleable, a VLIW bundle here means that we
8028     have no problems.  */
8029  if (fmt == XTENSA_UNDEFINED
8030      || xtensa_format_num_slots (isa, fmt) != 1)
8031    return FALSE;
8032
8033  xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf);
8034  opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
8035
8036  if (opcode == xtensa_retw_opcode || opcode == xtensa_retw_n_opcode)
8037    return TRUE;
8038
8039  return FALSE;
8040}
8041
8042
8043/* Re-process all of the fragments looking to convert all of the
8044   RELAX_ADD_NOP_IF_PRE_LOOP_END.  If there is one instruction and a
8045   loop end label, convert this frag to one that will generate a NOP.
8046   In any case close it off with a .fill 0.  */
8047
8048static bfd_boolean next_instr_is_loop_end (fragS *);
8049
8050static void
8051xtensa_fix_b_j_loop_end_frags (void)
8052{
8053  frchainS *frchP;
8054  asection *s;
8055
8056  /* When this routine is called, all of the subsections are still intact
8057     so we walk over subsections instead of sections.  */
8058  for (s = stdoutput->sections; s; s = s->next)
8059    for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
8060      {
8061	fragS *fragP;
8062
8063	/* Walk over all of the fragments in a subsection.  */
8064	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
8065	  {
8066	    if (fragP->fr_type == rs_machine_dependent
8067		&& fragP->fr_subtype == RELAX_ADD_NOP_IF_PRE_LOOP_END)
8068	      {
8069		if (next_instr_is_loop_end (fragP))
8070		  {
8071		    if (fragP->tc_frag_data.is_no_transform)
8072		      as_bad (_("branching or jumping to a loop end may trigger hardware errata"));
8073		    else
8074		      relax_frag_add_nop (fragP);
8075		  }
8076		frag_wane (fragP);
8077	      }
8078	  }
8079      }
8080}
8081
8082
8083static bfd_boolean
8084next_instr_is_loop_end (fragS *fragP)
8085{
8086  const fragS *next_fragP;
8087
8088  if (next_frag_is_loop_target (fragP))
8089    return FALSE;
8090
8091  next_fragP = next_non_empty_frag (fragP);
8092  if (next_fragP == NULL)
8093    return FALSE;
8094
8095  if (!next_frag_is_loop_target (next_fragP))
8096    return FALSE;
8097
8098  /* If the size is >= 3 then there is more than one instruction here.
8099     The hardware bug will not fire.  */
8100  if (next_fragP->fr_fix > 3)
8101    return FALSE;
8102
8103  return TRUE;
8104}
8105
8106
8107/* Re-process all of the fragments looking to convert all of the
8108   RELAX_ADD_NOP_IF_CLOSE_LOOP_END.  If there is an loop end that is
8109   not MY loop's loop end within 12 bytes, add enough nops here to
8110   make it at least 12 bytes away.  In any case close it off with a
8111   .fill 0.  */
8112
8113static offsetT min_bytes_to_other_loop_end
8114  (fragS *, fragS *, offsetT);
8115
8116static void
8117xtensa_fix_close_loop_end_frags (void)
8118{
8119  frchainS *frchP;
8120  asection *s;
8121
8122  /* When this routine is called, all of the subsections are still intact
8123     so we walk over subsections instead of sections.  */
8124  for (s = stdoutput->sections; s; s = s->next)
8125    for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
8126      {
8127	fragS *fragP;
8128
8129	fragS *current_target = NULL;
8130
8131	/* Walk over all of the fragments in a subsection.  */
8132	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
8133	  {
8134	    if (fragP->fr_type == rs_machine_dependent
8135		&& ((fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE)
8136		    || (fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE)))
8137	      current_target = symbol_get_frag (fragP->fr_symbol);
8138
8139	    if (current_target
8140		&& fragP->fr_type == rs_machine_dependent
8141		&& fragP->fr_subtype == RELAX_ADD_NOP_IF_CLOSE_LOOP_END)
8142	      {
8143		offsetT min_bytes;
8144		int bytes_added = 0;
8145
8146#define REQUIRED_LOOP_DIVIDING_BYTES 12
8147		/* Max out at 12.  */
8148		min_bytes = min_bytes_to_other_loop_end
8149		  (fragP->fr_next, current_target, REQUIRED_LOOP_DIVIDING_BYTES);
8150
8151		if (min_bytes < REQUIRED_LOOP_DIVIDING_BYTES)
8152		  {
8153		    if (fragP->tc_frag_data.is_no_transform)
8154		      as_bad (_("loop end too close to another loop end may trigger hardware errata"));
8155		    else
8156		      {
8157			while (min_bytes + bytes_added
8158			       < REQUIRED_LOOP_DIVIDING_BYTES)
8159			  {
8160			    int length = 3;
8161
8162			    if (fragP->fr_var < length)
8163			      as_fatal (_("fr_var %lu < length %d"),
8164					(long) fragP->fr_var, length);
8165			    else
8166			      {
8167				assemble_nop (length,
8168					      fragP->fr_literal + fragP->fr_fix);
8169				fragP->fr_fix += length;
8170				fragP->fr_var -= length;
8171			      }
8172			    bytes_added += length;
8173			  }
8174		      }
8175		  }
8176		frag_wane (fragP);
8177	      }
8178	    gas_assert (fragP->fr_type != rs_machine_dependent
8179		    || fragP->fr_subtype != RELAX_ADD_NOP_IF_CLOSE_LOOP_END);
8180	  }
8181      }
8182}
8183
8184
8185static offsetT unrelaxed_frag_min_size (fragS *);
8186
8187static offsetT
8188min_bytes_to_other_loop_end (fragS *fragP,
8189			     fragS *current_target,
8190			     offsetT max_size)
8191{
8192  offsetT offset = 0;
8193  fragS *current_fragP;
8194
8195  for (current_fragP = fragP;
8196       current_fragP;
8197       current_fragP = current_fragP->fr_next)
8198    {
8199      if (current_fragP->tc_frag_data.is_loop_target
8200	  && current_fragP != current_target)
8201	return offset;
8202
8203      offset += unrelaxed_frag_min_size (current_fragP);
8204
8205      if (offset >= max_size)
8206	return max_size;
8207    }
8208  return max_size;
8209}
8210
8211
8212static offsetT
8213unrelaxed_frag_min_size (fragS *fragP)
8214{
8215  offsetT size = fragP->fr_fix;
8216
8217  /* Add fill size.  */
8218  if (fragP->fr_type == rs_fill)
8219    size += fragP->fr_offset;
8220
8221  return size;
8222}
8223
8224
8225static offsetT
8226unrelaxed_frag_max_size (fragS *fragP)
8227{
8228  offsetT size = fragP->fr_fix;
8229  switch (fragP->fr_type)
8230    {
8231    case 0:
8232      /* Empty frags created by the obstack allocation scheme
8233	 end up with type 0.  */
8234      break;
8235    case rs_fill:
8236    case rs_org:
8237    case rs_space:
8238      size += fragP->fr_offset;
8239      break;
8240    case rs_align:
8241    case rs_align_code:
8242    case rs_align_test:
8243    case rs_leb128:
8244    case rs_cfa:
8245    case rs_dwarf2dbg:
8246      /* No further adjustments needed.  */
8247      break;
8248    case rs_machine_dependent:
8249      if (fragP->fr_subtype != RELAX_DESIRE_ALIGN)
8250	size += fragP->fr_var;
8251      break;
8252    default:
8253      /* We had darn well better know how big it is.  */
8254      gas_assert (0);
8255      break;
8256    }
8257
8258  return size;
8259}
8260
8261
8262/* Re-process all of the fragments looking to convert all
8263   of the RELAX_ADD_NOP_IF_SHORT_LOOP.  If:
8264
8265   A)
8266     1) the instruction size count to the loop end label
8267        is too short (<= 2 instructions),
8268     2) loop has a jump or branch in it
8269
8270   or B)
8271     1) workaround_all_short_loops is TRUE
8272     2) The generating loop was a  'loopgtz' or 'loopnez'
8273     3) the instruction size count to the loop end label is too short
8274        (<= 2 instructions)
8275   then convert this frag (and maybe the next one) to generate a NOP.
8276   In any case close it off with a .fill 0.  */
8277
8278static int count_insns_to_loop_end (fragS *, bfd_boolean, int);
8279static bfd_boolean branch_before_loop_end (fragS *);
8280
8281static void
8282xtensa_fix_short_loop_frags (void)
8283{
8284  frchainS *frchP;
8285  asection *s;
8286
8287  /* When this routine is called, all of the subsections are still intact
8288     so we walk over subsections instead of sections.  */
8289  for (s = stdoutput->sections; s; s = s->next)
8290    for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
8291      {
8292	fragS *fragP;
8293	xtensa_opcode current_opcode = XTENSA_UNDEFINED;
8294
8295	/* Walk over all of the fragments in a subsection.  */
8296	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
8297	  {
8298	    if (fragP->fr_type == rs_machine_dependent
8299		&& ((fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE)
8300		    || (fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE)))
8301	      {
8302		TInsn t_insn;
8303		fragS *loop_frag = next_non_empty_frag (fragP);
8304		tinsn_from_chars (&t_insn, loop_frag->fr_opcode, 0);
8305		current_opcode = t_insn.opcode;
8306		gas_assert (xtensa_opcode_is_loop (xtensa_default_isa,
8307					       current_opcode) == 1);
8308	      }
8309
8310	    if (fragP->fr_type == rs_machine_dependent
8311		&& fragP->fr_subtype == RELAX_ADD_NOP_IF_SHORT_LOOP)
8312	      {
8313		if (count_insns_to_loop_end (fragP->fr_next, TRUE, 3) < 3
8314		    && (branch_before_loop_end (fragP->fr_next)
8315			|| (workaround_all_short_loops
8316			    && current_opcode != XTENSA_UNDEFINED
8317			    && current_opcode != xtensa_loop_opcode)))
8318		  {
8319		    if (fragP->tc_frag_data.is_no_transform)
8320		      as_bad (_("loop containing less than three instructions may trigger hardware errata"));
8321		    else
8322		      relax_frag_add_nop (fragP);
8323		  }
8324		frag_wane (fragP);
8325	      }
8326	  }
8327      }
8328}
8329
8330
8331static int unrelaxed_frag_min_insn_count (fragS *);
8332
8333static int
8334count_insns_to_loop_end (fragS *base_fragP,
8335			 bfd_boolean count_relax_add,
8336			 int max_count)
8337{
8338  fragS *fragP = NULL;
8339  int insn_count = 0;
8340
8341  fragP = base_fragP;
8342
8343  for (; fragP && !fragP->tc_frag_data.is_loop_target; fragP = fragP->fr_next)
8344    {
8345      insn_count += unrelaxed_frag_min_insn_count (fragP);
8346      if (insn_count >= max_count)
8347	return max_count;
8348
8349      if (count_relax_add)
8350	{
8351	  if (fragP->fr_type == rs_machine_dependent
8352	      && fragP->fr_subtype == RELAX_ADD_NOP_IF_SHORT_LOOP)
8353	    {
8354	      /* In order to add the appropriate number of
8355	         NOPs, we count an instruction for downstream
8356	         occurrences.  */
8357	      insn_count++;
8358	      if (insn_count >= max_count)
8359		return max_count;
8360	    }
8361	}
8362    }
8363  return insn_count;
8364}
8365
8366
8367static int
8368unrelaxed_frag_min_insn_count (fragS *fragP)
8369{
8370  xtensa_isa isa = xtensa_default_isa;
8371  static xtensa_insnbuf insnbuf = NULL;
8372  int insn_count = 0;
8373  int offset = 0;
8374
8375  if (!fragP->tc_frag_data.is_insn)
8376    return insn_count;
8377
8378  if (!insnbuf)
8379    insnbuf = xtensa_insnbuf_alloc (isa);
8380
8381  /* Decode the fixed instructions.  */
8382  while (offset < fragP->fr_fix)
8383    {
8384      xtensa_format fmt;
8385
8386      xtensa_insnbuf_from_chars
8387	(isa, insnbuf, (unsigned char *) fragP->fr_literal + offset, 0);
8388      fmt = xtensa_format_decode (isa, insnbuf);
8389
8390      if (fmt == XTENSA_UNDEFINED)
8391	{
8392	  as_fatal (_("undecodable instruction in instruction frag"));
8393	  return insn_count;
8394	}
8395      offset += xtensa_format_length (isa, fmt);
8396      insn_count++;
8397    }
8398
8399  return insn_count;
8400}
8401
8402
8403static bfd_boolean unrelaxed_frag_has_b_j (fragS *);
8404
8405static bfd_boolean
8406branch_before_loop_end (fragS *base_fragP)
8407{
8408  fragS *fragP;
8409
8410  for (fragP = base_fragP;
8411       fragP && !fragP->tc_frag_data.is_loop_target;
8412       fragP = fragP->fr_next)
8413    {
8414      if (unrelaxed_frag_has_b_j (fragP))
8415	return TRUE;
8416    }
8417  return FALSE;
8418}
8419
8420
8421static bfd_boolean
8422unrelaxed_frag_has_b_j (fragS *fragP)
8423{
8424  static xtensa_insnbuf insnbuf = NULL;
8425  xtensa_isa isa = xtensa_default_isa;
8426  int offset = 0;
8427
8428  if (!fragP->tc_frag_data.is_insn)
8429    return FALSE;
8430
8431  if (!insnbuf)
8432    insnbuf = xtensa_insnbuf_alloc (isa);
8433
8434  /* Decode the fixed instructions.  */
8435  while (offset < fragP->fr_fix)
8436    {
8437      xtensa_format fmt;
8438      int slot;
8439
8440      xtensa_insnbuf_from_chars
8441	(isa, insnbuf, (unsigned char *) fragP->fr_literal + offset, 0);
8442      fmt = xtensa_format_decode (isa, insnbuf);
8443      if (fmt == XTENSA_UNDEFINED)
8444	return FALSE;
8445
8446      for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
8447	{
8448	  xtensa_opcode opcode =
8449	    get_opcode_from_buf (fragP->fr_literal + offset, slot);
8450	  if (xtensa_opcode_is_branch (isa, opcode) == 1
8451	      || xtensa_opcode_is_jump (isa, opcode) == 1)
8452	    return TRUE;
8453	}
8454      offset += xtensa_format_length (isa, fmt);
8455    }
8456  return FALSE;
8457}
8458
8459
8460/* Checks to be made after initial assembly but before relaxation.  */
8461
8462static bfd_boolean is_empty_loop (const TInsn *, fragS *);
8463static bfd_boolean is_local_forward_loop (const TInsn *, fragS *);
8464
8465static void
8466xtensa_sanity_check (void)
8467{
8468  const char *file_name;
8469  unsigned line;
8470  frchainS *frchP;
8471  asection *s;
8472
8473  file_name = as_where (&line);
8474  for (s = stdoutput->sections; s; s = s->next)
8475    for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
8476      {
8477	fragS *fragP;
8478
8479	/* Walk over all of the fragments in a subsection.  */
8480	for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
8481	  {
8482	    if (fragP->fr_type == rs_machine_dependent
8483		&& fragP->fr_subtype == RELAX_SLOTS
8484		&& fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED)
8485	      {
8486		static xtensa_insnbuf insnbuf = NULL;
8487		TInsn t_insn;
8488
8489		if (fragP->fr_opcode != NULL)
8490		  {
8491		    if (!insnbuf)
8492		      insnbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
8493		    tinsn_from_chars (&t_insn, fragP->fr_opcode, 0);
8494		    tinsn_immed_from_frag (&t_insn, fragP, 0);
8495
8496		    if (xtensa_opcode_is_loop (xtensa_default_isa,
8497					       t_insn.opcode) == 1)
8498		      {
8499			if (is_empty_loop (&t_insn, fragP))
8500			  {
8501			    new_logical_line (fragP->fr_file, fragP->fr_line);
8502			    as_bad (_("invalid empty loop"));
8503			  }
8504			if (!is_local_forward_loop (&t_insn, fragP))
8505			  {
8506			    new_logical_line (fragP->fr_file, fragP->fr_line);
8507			    as_bad (_("loop target does not follow "
8508				      "loop instruction in section"));
8509			  }
8510		      }
8511		  }
8512	      }
8513	  }
8514      }
8515  new_logical_line (file_name, line);
8516}
8517
8518
8519#define LOOP_IMMED_OPN 1
8520
8521/* Return TRUE if the loop target is the next non-zero fragment.  */
8522
8523static bfd_boolean
8524is_empty_loop (const TInsn *insn, fragS *fragP)
8525{
8526  const expressionS *exp;
8527  symbolS *symbolP;
8528  fragS *next_fragP;
8529
8530  if (insn->insn_type != ITYPE_INSN)
8531    return FALSE;
8532
8533  if (xtensa_opcode_is_loop (xtensa_default_isa, insn->opcode) != 1)
8534    return FALSE;
8535
8536  if (insn->ntok <= LOOP_IMMED_OPN)
8537    return FALSE;
8538
8539  exp = &insn->tok[LOOP_IMMED_OPN];
8540
8541  if (exp->X_op != O_symbol)
8542    return FALSE;
8543
8544  symbolP = exp->X_add_symbol;
8545  if (!symbolP)
8546    return FALSE;
8547
8548  if (symbol_get_frag (symbolP) == NULL)
8549    return FALSE;
8550
8551  if (S_GET_VALUE (symbolP) != 0)
8552    return FALSE;
8553
8554  /* Walk through the zero-size fragments from this one.  If we find
8555     the target fragment, then this is a zero-size loop.  */
8556
8557  for (next_fragP = fragP->fr_next;
8558       next_fragP != NULL;
8559       next_fragP = next_fragP->fr_next)
8560    {
8561      if (next_fragP == symbol_get_frag (symbolP))
8562	return TRUE;
8563      if (next_fragP->fr_fix != 0)
8564	return FALSE;
8565    }
8566  return FALSE;
8567}
8568
8569
8570static bfd_boolean
8571is_local_forward_loop (const TInsn *insn, fragS *fragP)
8572{
8573  const expressionS *exp;
8574  symbolS *symbolP;
8575  fragS *next_fragP;
8576
8577  if (insn->insn_type != ITYPE_INSN)
8578    return FALSE;
8579
8580  if (xtensa_opcode_is_loop (xtensa_default_isa, insn->opcode) != 1)
8581    return FALSE;
8582
8583  if (insn->ntok <= LOOP_IMMED_OPN)
8584    return FALSE;
8585
8586  exp = &insn->tok[LOOP_IMMED_OPN];
8587
8588  if (exp->X_op != O_symbol)
8589    return FALSE;
8590
8591  symbolP = exp->X_add_symbol;
8592  if (!symbolP)
8593    return FALSE;
8594
8595  if (symbol_get_frag (symbolP) == NULL)
8596    return FALSE;
8597
8598  /* Walk through fragments until we find the target.
8599     If we do not find the target, then this is an invalid loop.  */
8600
8601  for (next_fragP = fragP->fr_next;
8602       next_fragP != NULL;
8603       next_fragP = next_fragP->fr_next)
8604    {
8605      if (next_fragP == symbol_get_frag (symbolP))
8606	return TRUE;
8607    }
8608
8609  return FALSE;
8610}
8611
8612
8613#define XTINFO_NAME "Xtensa_Info"
8614#define XTINFO_NAMESZ 12
8615#define XTINFO_TYPE 1
8616
8617static void
8618xtensa_add_config_info (void)
8619{
8620  asection *info_sec;
8621  char *data, *p;
8622  int sz;
8623
8624  info_sec = subseg_new (".xtensa.info", 0);
8625  bfd_set_section_flags (stdoutput, info_sec, SEC_HAS_CONTENTS | SEC_READONLY);
8626
8627  data = XNEWVEC (char, 100);
8628  sprintf (data, "USE_ABSOLUTE_LITERALS=%d\nABI=%d\n",
8629	   XSHAL_USE_ABSOLUTE_LITERALS, XSHAL_ABI);
8630  sz = strlen (data) + 1;
8631
8632  /* Add enough null terminators to pad to a word boundary.  */
8633  do
8634    data[sz++] = 0;
8635  while ((sz & 3) != 0);
8636
8637  /* Follow the standard note section layout:
8638     First write the length of the name string.  */
8639  p = frag_more (4);
8640  md_number_to_chars (p, (valueT) XTINFO_NAMESZ, 4);
8641
8642  /* Next comes the length of the "descriptor", i.e., the actual data.  */
8643  p = frag_more (4);
8644  md_number_to_chars (p, (valueT) sz, 4);
8645
8646  /* Write the note type.  */
8647  p = frag_more (4);
8648  md_number_to_chars (p, (valueT) XTINFO_TYPE, 4);
8649
8650  /* Write the name field.  */
8651  p = frag_more (XTINFO_NAMESZ);
8652  memcpy (p, XTINFO_NAME, XTINFO_NAMESZ);
8653
8654  /* Finally, write the descriptor.  */
8655  p = frag_more (sz);
8656  memcpy (p, data, sz);
8657
8658  free (data);
8659}
8660
8661
8662/* Alignment Functions.  */
8663
8664static int
8665get_text_align_power (unsigned target_size)
8666{
8667  if (target_size <= 4)
8668    return 2;
8669
8670  if (target_size <= 8)
8671    return 3;
8672
8673  if (target_size <= 16)
8674    return 4;
8675
8676  if (target_size <= 32)
8677    return 5;
8678
8679  if (target_size <= 64)
8680    return 6;
8681
8682  if (target_size <= 128)
8683    return 7;
8684
8685  if (target_size <= 256)
8686    return 8;
8687
8688  if (target_size <= 512)
8689    return 9;
8690
8691  if (target_size <= 1024)
8692    return 10;
8693
8694  gas_assert (0);
8695  return 0;
8696}
8697
8698
8699static int
8700get_text_align_max_fill_size (int align_pow,
8701			      bfd_boolean use_nops,
8702			      bfd_boolean use_no_density)
8703{
8704  if (!use_nops)
8705    return (1 << align_pow);
8706  if (use_no_density)
8707    return 3 * (1 << align_pow);
8708
8709  return 1 + (1 << align_pow);
8710}
8711
8712
8713/* Calculate the minimum bytes of fill needed at "address" to align a
8714   target instruction of size "target_size" so that it does not cross a
8715   power-of-two boundary specified by "align_pow".  If "use_nops" is FALSE,
8716   the fill can be an arbitrary number of bytes.  Otherwise, the space must
8717   be filled by NOP instructions.  */
8718
8719static int
8720get_text_align_fill_size (addressT address,
8721			  int align_pow,
8722			  int target_size,
8723			  bfd_boolean use_nops,
8724			  bfd_boolean use_no_density)
8725{
8726  addressT alignment, fill, fill_limit, fill_step;
8727  bfd_boolean skip_one = FALSE;
8728
8729  alignment = (1 << align_pow);
8730  gas_assert (target_size > 0 && alignment >= (addressT) target_size);
8731
8732  if (!use_nops)
8733    {
8734      fill_limit = alignment;
8735      fill_step = 1;
8736    }
8737  else if (!use_no_density)
8738    {
8739      /* Combine 2- and 3-byte NOPs to fill anything larger than one.  */
8740      fill_limit = alignment * 2;
8741      fill_step = 1;
8742      skip_one = TRUE;
8743    }
8744  else
8745    {
8746      /* Fill with 3-byte NOPs -- can only fill multiples of 3.  */
8747      fill_limit = alignment * 3;
8748      fill_step = 3;
8749    }
8750
8751  /* Try all fill sizes until finding one that works.  */
8752  for (fill = 0; fill < fill_limit; fill += fill_step)
8753    {
8754      if (skip_one && fill == 1)
8755	continue;
8756      if ((address + fill) >> align_pow
8757	  == (address + fill + target_size - 1) >> align_pow)
8758	return fill;
8759    }
8760  gas_assert (0);
8761  return 0;
8762}
8763
8764
8765static int
8766branch_align_power (segT sec)
8767{
8768  /* If the Xtensa processor has a fetch width of X, and
8769     the section is aligned to at least that boundary, then a branch
8770     target need only fit within that aligned block of memory to avoid
8771     a stall.  Otherwise, try to fit branch targets within 4-byte
8772     aligned blocks (which may be insufficient, e.g., if the section
8773     has no alignment, but it's good enough).  */
8774  int fetch_align = get_text_align_power(xtensa_fetch_width);
8775  int sec_align = get_recorded_alignment (sec);
8776
8777  if (sec_align >= fetch_align)
8778    return fetch_align;
8779
8780  return 2;
8781}
8782
8783
8784/* This will assert if it is not possible.  */
8785
8786static int
8787get_text_align_nop_count (offsetT fill_size, bfd_boolean use_no_density)
8788{
8789  int count = 0;
8790
8791  if (use_no_density)
8792    {
8793      gas_assert (fill_size % 3 == 0);
8794      return (fill_size / 3);
8795    }
8796
8797  gas_assert (fill_size != 1);	/* Bad argument.  */
8798
8799  while (fill_size > 1)
8800    {
8801      int insn_size = 3;
8802      if (fill_size == 2 || fill_size == 4)
8803	insn_size = 2;
8804      fill_size -= insn_size;
8805      count++;
8806    }
8807  gas_assert (fill_size != 1);	/* Bad algorithm.  */
8808  return count;
8809}
8810
8811
8812static int
8813get_text_align_nth_nop_size (offsetT fill_size,
8814			     int n,
8815			     bfd_boolean use_no_density)
8816{
8817  int count = 0;
8818
8819  if (use_no_density)
8820    return 3;
8821
8822  gas_assert (fill_size != 1);	/* Bad argument.  */
8823
8824  while (fill_size > 1)
8825    {
8826      int insn_size = 3;
8827      if (fill_size == 2 || fill_size == 4)
8828	insn_size = 2;
8829      fill_size -= insn_size;
8830      count++;
8831      if (n + 1 == count)
8832	return insn_size;
8833    }
8834  gas_assert (0);
8835  return 0;
8836}
8837
8838
8839/* For the given fragment, find the appropriate address
8840   for it to begin at if we are using NOPs to align it.  */
8841
8842static addressT
8843get_noop_aligned_address (fragS *fragP, addressT address)
8844{
8845  /* The rule is: get next fragment's FIRST instruction.  Find
8846     the smallest number of bytes that need to be added to
8847     ensure that the next fragment's FIRST instruction will fit
8848     in a single word.
8849
8850     E.G.,   2 bytes : 0, 1, 2 mod 4
8851	     3 bytes: 0, 1 mod 4
8852
8853     If the FIRST instruction MIGHT be relaxed,
8854     assume that it will become a 3-byte instruction.
8855
8856     Note again here that LOOP instructions are not bundleable,
8857     and this relaxation only applies to LOOP opcodes.  */
8858
8859  int fill_size = 0;
8860  int first_insn_size;
8861  int loop_insn_size;
8862  addressT pre_opcode_bytes;
8863  int align_power;
8864  fragS *first_insn;
8865  xtensa_opcode opcode;
8866  bfd_boolean is_loop;
8867
8868  gas_assert (fragP->fr_type == rs_machine_dependent);
8869  gas_assert (fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE);
8870
8871  /* Find the loop frag.  */
8872  first_insn = next_non_empty_frag (fragP);
8873  /* Now find the first insn frag.  */
8874  first_insn = next_non_empty_frag (first_insn);
8875
8876  is_loop = next_frag_opcode_is_loop (fragP, &opcode);
8877  gas_assert (is_loop);
8878  loop_insn_size = xg_get_single_size (opcode);
8879
8880  pre_opcode_bytes = next_frag_pre_opcode_bytes (fragP);
8881  pre_opcode_bytes += loop_insn_size;
8882
8883  /* For loops, the alignment depends on the size of the
8884     instruction following the loop, not the LOOP instruction.  */
8885
8886  if (first_insn == NULL)
8887    first_insn_size = xtensa_fetch_width;
8888  else
8889    first_insn_size = get_loop_align_size (frag_format_size (first_insn));
8890
8891  /* If it was 8, then we'll need a larger alignment for the section.  */
8892  align_power = get_text_align_power (first_insn_size);
8893  record_alignment (now_seg, align_power);
8894
8895  fill_size = get_text_align_fill_size
8896    (address + pre_opcode_bytes, align_power, first_insn_size, TRUE,
8897     fragP->tc_frag_data.is_no_density);
8898
8899  return address + fill_size;
8900}
8901
8902
8903/* 3 mechanisms for relaxing an alignment:
8904
8905   Align to a power of 2.
8906   Align so the next fragment's instruction does not cross a word boundary.
8907   Align the current instruction so that if the next instruction
8908       were 3 bytes, it would not cross a word boundary.
8909
8910   We can align with:
8911
8912   zeros    - This is easy; always insert zeros.
8913   nops     - 3-byte and 2-byte instructions
8914              2 - 2-byte nop
8915              3 - 3-byte nop
8916              4 - 2 2-byte nops
8917              >=5 : 3-byte instruction + fn (n-3)
8918   widening - widen previous instructions.  */
8919
8920static offsetT
8921get_aligned_diff (fragS *fragP, addressT address, offsetT *max_diff)
8922{
8923  addressT target_address, loop_insn_offset;
8924  int target_size;
8925  xtensa_opcode loop_opcode;
8926  bfd_boolean is_loop;
8927  int align_power;
8928  offsetT opt_diff;
8929  offsetT branch_align;
8930  fragS *loop_frag;
8931
8932  gas_assert (fragP->fr_type == rs_machine_dependent);
8933  switch (fragP->fr_subtype)
8934    {
8935    case RELAX_DESIRE_ALIGN:
8936      target_size = next_frag_format_size (fragP);
8937      if (target_size == XTENSA_UNDEFINED)
8938	target_size = 3;
8939      align_power = branch_align_power (now_seg);
8940      branch_align = 1 << align_power;
8941      /* Don't count on the section alignment being as large as the target.  */
8942      if (target_size > branch_align)
8943	target_size = branch_align;
8944      opt_diff = get_text_align_fill_size (address, align_power,
8945					   target_size, FALSE, FALSE);
8946
8947      *max_diff = (opt_diff + branch_align
8948		   - (target_size + ((address + opt_diff) % branch_align)));
8949      gas_assert (*max_diff >= opt_diff);
8950      return opt_diff;
8951
8952    case RELAX_ALIGN_NEXT_OPCODE:
8953      /* The next non-empty frag after this one holds the LOOP instruction
8954	 that needs to be aligned.  The required alignment depends on the
8955	 size of the next non-empty frag after the loop frag, i.e., the
8956	 first instruction in the loop.  */
8957      loop_frag = next_non_empty_frag (fragP);
8958      target_size = get_loop_align_size (next_frag_format_size (loop_frag));
8959      loop_insn_offset = 0;
8960      is_loop = next_frag_opcode_is_loop (fragP, &loop_opcode);
8961      gas_assert (is_loop);
8962
8963      /* If the loop has been expanded then the LOOP instruction
8964	 could be at an offset from this fragment.  */
8965      if (loop_frag->tc_frag_data.slot_subtypes[0] != RELAX_IMMED)
8966	loop_insn_offset = get_expanded_loop_offset (loop_opcode);
8967
8968      /* In an ideal world, which is what we are shooting for here,
8969	 we wouldn't need to use any NOPs immediately prior to the
8970	 LOOP instruction.  If this approach fails, relax_frag_loop_align
8971	 will call get_noop_aligned_address.  */
8972      target_address =
8973	address + loop_insn_offset + xg_get_single_size (loop_opcode);
8974      align_power = get_text_align_power (target_size);
8975      opt_diff = get_text_align_fill_size (target_address, align_power,
8976					   target_size, FALSE, FALSE);
8977
8978      *max_diff = xtensa_fetch_width
8979	- ((target_address + opt_diff) % xtensa_fetch_width)
8980	- target_size + opt_diff;
8981      gas_assert (*max_diff >= opt_diff);
8982      return opt_diff;
8983
8984    default:
8985      break;
8986    }
8987  gas_assert (0);
8988  return 0;
8989}
8990
8991
8992/* md_relax_frag Hook and Helper Functions.  */
8993
8994static long relax_frag_loop_align (fragS *, long);
8995static long relax_frag_for_align (fragS *, long);
8996static long relax_frag_immed
8997  (segT, fragS *, long, int, xtensa_format, int, int *, bfd_boolean);
8998
8999typedef struct cached_fixup cached_fixupS;
9000struct cached_fixup
9001{
9002  int addr;
9003  int target;
9004  int delta;
9005  fixS *fixP;
9006};
9007
9008typedef struct fixup_cache fixup_cacheS;
9009struct fixup_cache
9010{
9011  cached_fixupS *fixups;
9012  unsigned n_fixups;
9013  unsigned n_max;
9014
9015  segT seg;
9016  fragS *first_frag;
9017};
9018
9019static int fixup_order (const void *a, const void *b)
9020{
9021  const cached_fixupS *pa = a;
9022  const cached_fixupS *pb = b;
9023
9024  if (pa->addr == pb->addr)
9025    {
9026      if (pa->target == pb->target)
9027	{
9028	  if (pa->fixP->fx_r_type == pb->fixP->fx_r_type)
9029	    return 0;
9030	  return pa->fixP->fx_r_type < pb->fixP->fx_r_type ?  -1 : 1;
9031	}
9032      return pa->target - pb->target;
9033    }
9034  return pa->addr - pb->addr;
9035}
9036
9037static bfd_boolean xtensa_make_cached_fixup (cached_fixupS *o, fixS *fixP)
9038{
9039  xtensa_isa isa = xtensa_default_isa;
9040  int addr = fixP->fx_frag->fr_address;
9041  int target;
9042  int delta;
9043  symbolS *s = fixP->fx_addsy;
9044  int slot;
9045  xtensa_format fmt;
9046  xtensa_opcode opcode;
9047
9048  if (fixP->fx_r_type < BFD_RELOC_XTENSA_SLOT0_OP ||
9049      fixP->fx_r_type > BFD_RELOC_XTENSA_SLOT14_OP)
9050    return FALSE;
9051  target = S_GET_VALUE (s);
9052  delta = target - addr;
9053
9054  if (abs(delta) < J_RANGE / 2)
9055    return FALSE;
9056
9057  xtensa_insnbuf_from_chars (isa, trampoline_buf,
9058			     (unsigned char *) fixP->fx_frag->fr_literal +
9059			     fixP->fx_where, 0);
9060  fmt = xtensa_format_decode (isa, trampoline_buf);
9061  gas_assert (fmt != XTENSA_UNDEFINED);
9062  slot = fixP->tc_fix_data.slot;
9063  xtensa_format_get_slot (isa, fmt, slot, trampoline_buf, trampoline_slotbuf);
9064  opcode = xtensa_opcode_decode (isa, fmt, slot, trampoline_slotbuf);
9065  if (opcode != xtensa_j_opcode)
9066    return FALSE;
9067
9068  o->addr = addr;
9069  o->target = target;
9070  o->delta = delta;
9071  o->fixP = fixP;
9072
9073  return TRUE;
9074}
9075
9076static void xtensa_realloc_fixup_cache (fixup_cacheS *cache, unsigned add)
9077{
9078  if (cache->n_fixups + add > cache->n_max)
9079    {
9080      cache->n_max = (cache->n_fixups + add) * 2;
9081      cache->fixups = XRESIZEVEC (cached_fixupS, cache->fixups, cache->n_max);
9082    }
9083}
9084
9085static void xtensa_cache_relaxable_fixups (fixup_cacheS *cache,
9086					   segment_info_type *seginfo)
9087{
9088  fixS *fixP;
9089
9090  cache->n_fixups = 0;
9091
9092  for (fixP = seginfo->fix_root; fixP ; fixP = fixP->fx_next)
9093    {
9094      xtensa_realloc_fixup_cache (cache, 1);
9095
9096      if (xtensa_make_cached_fixup (cache->fixups + cache->n_fixups, fixP))
9097	++cache->n_fixups;
9098    }
9099  qsort (cache->fixups, cache->n_fixups, sizeof (*cache->fixups), fixup_order);
9100}
9101
9102static unsigned xtensa_find_first_cached_fixup (const fixup_cacheS *cache,
9103						int addr)
9104{
9105  unsigned a = 0;
9106  unsigned b = cache->n_fixups;
9107
9108  while (b - a > 1)
9109    {
9110      unsigned c = (a + b) / 2;
9111
9112      if (cache->fixups[c].addr < addr)
9113	a = c;
9114      else
9115	b = c;
9116    }
9117  return a;
9118}
9119
9120static void xtensa_delete_cached_fixup (fixup_cacheS *cache, unsigned i)
9121{
9122  memmove (cache->fixups + i, cache->fixups + i + 1,
9123	   (cache->n_fixups - i - 1) * sizeof (*cache->fixups));
9124  --cache->n_fixups;
9125}
9126
9127static bfd_boolean xtensa_add_cached_fixup (fixup_cacheS *cache, fixS *fixP)
9128{
9129  cached_fixupS o;
9130  unsigned i;
9131
9132  if (!xtensa_make_cached_fixup (&o, fixP))
9133    return FALSE;
9134  xtensa_realloc_fixup_cache (cache, 1);
9135  i = xtensa_find_first_cached_fixup (cache, o.addr);
9136  if (i < cache->n_fixups)
9137    {
9138      ++i;
9139      memmove (cache->fixups + i + 1, cache->fixups + i,
9140	       (cache->n_fixups - i) * sizeof (*cache->fixups));
9141    }
9142  cache->fixups[i] = o;
9143  ++cache->n_fixups;
9144  return TRUE;
9145}
9146
9147/* Return the number of bytes added to this fragment, given that the
9148   input has been stretched already by "stretch".  */
9149
9150long
9151xtensa_relax_frag (fragS *fragP, long stretch, int *stretched_p)
9152{
9153  xtensa_isa isa = xtensa_default_isa;
9154  int unreported = fragP->tc_frag_data.unreported_expansion;
9155  long new_stretch = 0;
9156  const char *file_name;
9157  unsigned line;
9158  int lit_size;
9159  static xtensa_insnbuf vbuf = NULL;
9160  int slot, num_slots;
9161  xtensa_format fmt;
9162
9163  file_name = as_where (&line);
9164  new_logical_line (fragP->fr_file, fragP->fr_line);
9165
9166  fragP->tc_frag_data.unreported_expansion = 0;
9167
9168  switch (fragP->fr_subtype)
9169    {
9170    case RELAX_ALIGN_NEXT_OPCODE:
9171      /* Always convert.  */
9172      if (fragP->tc_frag_data.relax_seen)
9173	new_stretch = relax_frag_loop_align (fragP, stretch);
9174      break;
9175
9176    case RELAX_LOOP_END:
9177      /* Do nothing.  */
9178      break;
9179
9180    case RELAX_LOOP_END_ADD_NOP:
9181      /* Add a NOP and switch to .fill 0.  */
9182      new_stretch = relax_frag_add_nop (fragP);
9183      frag_wane (fragP);
9184      break;
9185
9186    case RELAX_DESIRE_ALIGN:
9187      /* Do nothing. The narrowing before this frag will either align
9188         it or not.  */
9189      break;
9190
9191    case RELAX_LITERAL:
9192    case RELAX_LITERAL_FINAL:
9193      return 0;
9194
9195    case RELAX_LITERAL_NR:
9196      lit_size = 4;
9197      fragP->fr_subtype = RELAX_LITERAL_FINAL;
9198      gas_assert (unreported == lit_size);
9199      memset (&fragP->fr_literal[fragP->fr_fix], 0, 4);
9200      fragP->fr_var -= lit_size;
9201      fragP->fr_fix += lit_size;
9202      new_stretch = 4;
9203      break;
9204
9205    case RELAX_SLOTS:
9206      if (vbuf == NULL)
9207	vbuf = xtensa_insnbuf_alloc (isa);
9208
9209      xtensa_insnbuf_from_chars
9210	(isa, vbuf, (unsigned char *) fragP->fr_opcode, 0);
9211      fmt = xtensa_format_decode (isa, vbuf);
9212      num_slots = xtensa_format_num_slots (isa, fmt);
9213
9214      for (slot = 0; slot < num_slots; slot++)
9215	{
9216	  switch (fragP->tc_frag_data.slot_subtypes[slot])
9217	    {
9218	    case RELAX_NARROW:
9219	      if (fragP->tc_frag_data.relax_seen)
9220		new_stretch += relax_frag_for_align (fragP, stretch);
9221	      break;
9222
9223	    case RELAX_IMMED:
9224	    case RELAX_IMMED_STEP1:
9225	    case RELAX_IMMED_STEP2:
9226	    case RELAX_IMMED_STEP3:
9227	      /* Place the immediate.  */
9228	      new_stretch += relax_frag_immed
9229		(now_seg, fragP, stretch,
9230		 fragP->tc_frag_data.slot_subtypes[slot] - RELAX_IMMED,
9231		 fmt, slot, stretched_p, FALSE);
9232	      break;
9233
9234	    default:
9235	      /* This is OK; see the note in xg_assemble_vliw_tokens.  */
9236	      break;
9237	    }
9238	}
9239      break;
9240
9241    case RELAX_LITERAL_POOL_BEGIN:
9242      if (fragP->fr_var != 0)
9243	{
9244	  /* We have a converted "candidate" literal pool;
9245	     assemble a jump around it.  */
9246	  TInsn insn;
9247	  if (!litpool_slotbuf)
9248	    {
9249	      litpool_buf = xtensa_insnbuf_alloc (isa);
9250	      litpool_slotbuf = xtensa_insnbuf_alloc (isa);
9251	    }
9252	  new_stretch += 3;
9253	  fragP->tc_frag_data.relax_seen = FALSE; /* Need another pass.  */
9254	  fragP->tc_frag_data.is_insn = TRUE;
9255	  tinsn_init (&insn);
9256	  insn.insn_type = ITYPE_INSN;
9257	  insn.opcode = xtensa_j_opcode;
9258	  insn.ntok = 1;
9259	  set_expr_symbol_offset (&insn.tok[0], fragP->fr_symbol,
9260				  fragP->fr_fix);
9261	  fmt = xg_get_single_format (xtensa_j_opcode);
9262	  tinsn_to_slotbuf (fmt, 0, &insn, litpool_slotbuf);
9263	  xtensa_format_set_slot (isa, fmt, 0, litpool_buf, litpool_slotbuf);
9264	  xtensa_insnbuf_to_chars (isa, litpool_buf,
9265				   (unsigned char *)fragP->fr_literal +
9266				   fragP->fr_fix, 3);
9267	  fragP->fr_fix += 3;
9268	  fragP->fr_var -= 3;
9269	  /* Add a fix-up.  */
9270	  fix_new (fragP, 0, 3, fragP->fr_symbol, 0, TRUE,
9271		   BFD_RELOC_XTENSA_SLOT0_OP);
9272	}
9273      break;
9274
9275    case RELAX_LITERAL_POOL_END:
9276    case RELAX_LITERAL_POOL_CANDIDATE_BEGIN:
9277    case RELAX_MAYBE_UNREACHABLE:
9278    case RELAX_MAYBE_DESIRE_ALIGN:
9279      /* No relaxation required.  */
9280      break;
9281
9282    case RELAX_FILL_NOP:
9283    case RELAX_UNREACHABLE:
9284      if (fragP->tc_frag_data.relax_seen)
9285	new_stretch += relax_frag_for_align (fragP, stretch);
9286      break;
9287
9288    case RELAX_TRAMPOLINE:
9289      if (fragP->tc_frag_data.relax_seen)
9290        {
9291	  static fixup_cacheS fixup_cache;
9292	  segment_info_type *seginfo = seg_info (now_seg);
9293	  int trampaddr = fragP->fr_address + fragP->fr_fix;
9294	  int searchaddr = trampaddr < J_RANGE ? 0 : trampaddr - J_RANGE;
9295	  unsigned i;
9296
9297	  if (now_seg != fixup_cache.seg ||
9298	      fragP == fixup_cache.first_frag ||
9299	      fixup_cache.first_frag == NULL)
9300	    {
9301	      xtensa_cache_relaxable_fixups (&fixup_cache, seginfo);
9302	      fixup_cache.seg = now_seg;
9303	      fixup_cache.first_frag = fragP;
9304	    }
9305
9306          /* Scan for jumps that will not reach.  */
9307          for (i = xtensa_find_first_cached_fixup (&fixup_cache, searchaddr);
9308	       i < fixup_cache.n_fixups; ++i)
9309
9310            {
9311	      fixS *fixP = fixup_cache.fixups[i].fixP;
9312	      int target = fixup_cache.fixups[i].target;
9313	      int addr = fixup_cache.fixups[i].addr;
9314	      int delta = fixup_cache.fixups[i].delta + stretch;
9315
9316	      trampaddr = fragP->fr_address + fragP->fr_fix;
9317
9318	      if (addr + J_RANGE < trampaddr)
9319		continue;
9320	      if (addr > trampaddr + J_RANGE)
9321		break;
9322	      if (abs (delta) < J_RANGE)
9323		continue;
9324
9325	      slot = fixP->tc_fix_data.slot;
9326
9327              if (delta > J_RANGE  || delta < -1 * J_RANGE)
9328                { /* Found an out-of-range jump; scan the list of trampolines for the best match.  */
9329		  struct trampoline_seg *ts = find_trampoline_seg (now_seg);
9330		  struct trampoline_frag *tf = ts->trampoline_list.next;
9331		  struct trampoline_frag *prev = &ts->trampoline_list;
9332		  int lower = (target < addr) ? target : addr;
9333		  int upper = (target > addr) ? target : addr;
9334		  int midpoint = lower + (upper - lower) / 2;
9335
9336		  if ((upper - lower) > 2 * J_RANGE)
9337		    {
9338		      /* One trampoline won't suffice; we need multiple jumps.
9339			 Jump to the trampoline that's farthest, but still in
9340			 range relative to the original "j" instruction.  */
9341		      for ( ; tf; prev = tf, tf = tf->next )
9342			{
9343			  int this_addr = tf->fragP->fr_address + tf->fragP->fr_fix;
9344			  int next_addr = (tf->next) ? tf->next->fragP->fr_address + tf->next->fragP->fr_fix : 0 ;
9345
9346			  if (addr == lower)
9347			    {
9348			      /* Forward jump.  */
9349			      if (this_addr - addr < J_RANGE)
9350				break;
9351			    }
9352			  else
9353			    {
9354			      /* Backward jump.  */
9355			      if (next_addr == 0 || addr - next_addr > J_RANGE)
9356				break;
9357			    }
9358			}
9359		    }
9360		  else
9361		    {
9362		      struct trampoline_frag *best_tf = NULL;
9363		      int best_delta = 0;
9364
9365		      for ( ; tf; prev = tf, tf = tf->next )
9366			{
9367			  int this_addr = tf->fragP->fr_address + tf->fragP->fr_fix;
9368			  int this_delta = abs (this_addr - midpoint);
9369
9370			  if (!best_tf || this_delta < best_delta)
9371			    {
9372			       best_tf = tf;
9373			       best_delta = this_delta;
9374			    }
9375			}
9376		      tf = best_tf;
9377		    }
9378		  if (tf->fragP == fragP)
9379		    {
9380		      if (abs (addr - trampaddr) < J_RANGE)
9381			{ /* The trampoline is in range of original; fix it!  */
9382			  fixS *newfixP;
9383			  int offset;
9384			  TInsn insn;
9385			  symbolS *lsym;
9386			  fragS *fP; /* The out-of-range jump.  */
9387
9388			  new_stretch += init_trampoline_frag (tf);
9389			  offset = fragP->fr_fix; /* Where to assemble the j insn.  */
9390			  lsym = fragP->fr_symbol;
9391			  fP = fixP->fx_frag;
9392			  /* Assemble a jump to the target label here.  */
9393			  tinsn_init (&insn);
9394			  insn.insn_type = ITYPE_INSN;
9395			  insn.opcode = xtensa_j_opcode;
9396			  insn.ntok = 1;
9397			  set_expr_symbol_offset (&insn.tok[0], lsym, offset);
9398			  fmt = xg_get_single_format (xtensa_j_opcode);
9399			  tinsn_to_slotbuf (fmt, 0, &insn, trampoline_slotbuf);
9400			  xtensa_format_set_slot (isa, fmt, 0, trampoline_buf, trampoline_slotbuf);
9401			  xtensa_insnbuf_to_chars (isa, trampoline_buf, (unsigned char *)fragP->fr_literal + offset, 3);
9402			  fragP->fr_fix += 3;
9403			  fragP->fr_var -= 3;
9404			  /* Add a fix-up for the original j insn.  */
9405			  newfixP = fix_new (fP, fixP->fx_where, fixP->fx_size, lsym, fragP->fr_fix - 3, TRUE, fixP->fx_r_type);
9406			  newfixP->fx_no_overflow = 1;
9407			  newfixP->tc_fix_data.X_add_symbol = lsym;
9408			  newfixP->tc_fix_data.X_add_number = offset;
9409			  newfixP->tc_fix_data.slot = slot;
9410
9411			  xtensa_delete_cached_fixup (&fixup_cache, i);
9412			  xtensa_add_cached_fixup (&fixup_cache, newfixP);
9413
9414			  /* Move the fix-up from the original j insn to this one.  */
9415			  fixP->fx_frag = fragP;
9416			  fixP->fx_where = fragP->fr_fix - 3;
9417			  fixP->tc_fix_data.slot = 0;
9418
9419			  xtensa_add_cached_fixup (&fixup_cache, fixP);
9420
9421			  /* re-do current fixup */
9422			  --i;
9423
9424			  /* Adjust the jump around this trampoline (if present).  */
9425			  if (tf->fixP != NULL)
9426			    {
9427			      tf->fixP->fx_offset += 3;
9428			    }
9429			  new_stretch += 3;
9430			  fragP->tc_frag_data.relax_seen = FALSE; /* Need another pass.  */
9431			  /* Do we have room for more?  */
9432			  if (fragP->fr_var < 3)
9433			    { /* No, convert to fill.  */
9434			      frag_wane (fragP);
9435			      fragP->fr_subtype = 0;
9436			      /* Remove from the trampoline_list.  */
9437			      prev->next = tf->next;
9438			      if (fragP == fixup_cache.first_frag)
9439				fixup_cache.first_frag = NULL;
9440			      break;
9441			    }
9442			}
9443		    }
9444                }
9445            }
9446        }
9447      break;
9448
9449    default:
9450      as_bad (_("bad relaxation state"));
9451    }
9452
9453  /* Tell gas we need another relaxation pass.  */
9454  if (! fragP->tc_frag_data.relax_seen)
9455    {
9456      fragP->tc_frag_data.relax_seen = TRUE;
9457      *stretched_p = 1;
9458    }
9459
9460  new_logical_line (file_name, line);
9461  return new_stretch;
9462}
9463
9464
9465static long
9466relax_frag_loop_align (fragS *fragP, long stretch)
9467{
9468  addressT old_address, old_next_address, old_size;
9469  addressT new_address, new_next_address, new_size;
9470  addressT growth;
9471
9472  /* All the frags with relax_frag_for_alignment prior to this one in the
9473     section have been done, hopefully eliminating the need for a NOP here.
9474     But, this will put it in if necessary.  */
9475
9476  /* Calculate the old address of this fragment and the next fragment.  */
9477  old_address = fragP->fr_address - stretch;
9478  old_next_address = (fragP->fr_address - stretch + fragP->fr_fix +
9479		      fragP->tc_frag_data.text_expansion[0]);
9480  old_size = old_next_address - old_address;
9481
9482  /* Calculate the new address of this fragment and the next fragment.  */
9483  new_address = fragP->fr_address;
9484  new_next_address =
9485    get_noop_aligned_address (fragP, fragP->fr_address + fragP->fr_fix);
9486  new_size = new_next_address - new_address;
9487
9488  growth = new_size - old_size;
9489
9490  /* Fix up the text_expansion field and return the new growth.  */
9491  fragP->tc_frag_data.text_expansion[0] += growth;
9492  return growth;
9493}
9494
9495
9496/* Add a NOP instruction.  */
9497
9498static long
9499relax_frag_add_nop (fragS *fragP)
9500{
9501  char *nop_buf = fragP->fr_literal + fragP->fr_fix;
9502  int length = fragP->tc_frag_data.is_no_density ? 3 : 2;
9503  assemble_nop (length, nop_buf);
9504  fragP->tc_frag_data.is_insn = TRUE;
9505
9506  if (fragP->fr_var < length)
9507    {
9508      as_fatal (_("fr_var (%ld) < length (%d)"), (long) fragP->fr_var, length);
9509      return 0;
9510    }
9511
9512  fragP->fr_fix += length;
9513  fragP->fr_var -= length;
9514  return length;
9515}
9516
9517
9518static long future_alignment_required (fragS *, long);
9519
9520static long
9521relax_frag_for_align (fragS *fragP, long stretch)
9522{
9523  /* Overview of the relaxation procedure for alignment:
9524     We can widen with NOPs or by widening instructions or by filling
9525     bytes after jump instructions.  Find the opportune places and widen
9526     them if necessary.  */
9527
9528  long stretch_me;
9529  long diff;
9530
9531  gas_assert (fragP->fr_subtype == RELAX_FILL_NOP
9532	  || fragP->fr_subtype == RELAX_UNREACHABLE
9533	  || (fragP->fr_subtype == RELAX_SLOTS
9534	      && fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW));
9535
9536  stretch_me = future_alignment_required (fragP, stretch);
9537  diff = stretch_me - fragP->tc_frag_data.text_expansion[0];
9538  if (diff == 0)
9539    return 0;
9540
9541  if (diff < 0)
9542    {
9543      /* We expanded on a previous pass.  Can we shrink now?  */
9544      long shrink = fragP->tc_frag_data.text_expansion[0] - stretch_me;
9545      if (shrink <= stretch && stretch > 0)
9546	{
9547	  fragP->tc_frag_data.text_expansion[0] = stretch_me;
9548	  return -shrink;
9549	}
9550      return 0;
9551    }
9552
9553  /* Below here, diff > 0.  */
9554  fragP->tc_frag_data.text_expansion[0] = stretch_me;
9555
9556  return diff;
9557}
9558
9559
9560/* Return the address of the next frag that should be aligned.
9561
9562   By "address" we mean the address it _would_ be at if there
9563   is no action taken to align it between here and the target frag.
9564   In other words, if no narrows and no fill nops are used between
9565   here and the frag to align, _even_if_ some of the frags we use
9566   to align targets have already expanded on a previous relaxation
9567   pass.
9568
9569   Also, count each frag that may be used to help align the target.
9570
9571   Return 0 if there are no frags left in the chain that need to be
9572   aligned.  */
9573
9574static addressT
9575find_address_of_next_align_frag (fragS **fragPP,
9576				 int *wide_nops,
9577				 int *narrow_nops,
9578				 int *widens,
9579				 bfd_boolean *paddable)
9580{
9581  fragS *fragP = *fragPP;
9582  addressT address = fragP->fr_address;
9583
9584  /* Do not reset the counts to 0.  */
9585
9586  while (fragP)
9587    {
9588      /* Limit this to a small search.  */
9589      if (*widens >= (int) xtensa_fetch_width)
9590	{
9591	  *fragPP = fragP;
9592	  return 0;
9593	}
9594      address += fragP->fr_fix;
9595
9596      if (fragP->fr_type == rs_fill)
9597	address += fragP->fr_offset * fragP->fr_var;
9598      else if (fragP->fr_type == rs_machine_dependent)
9599	{
9600	  switch (fragP->fr_subtype)
9601	    {
9602	    case RELAX_UNREACHABLE:
9603	      *paddable = TRUE;
9604	      break;
9605
9606	    case RELAX_FILL_NOP:
9607	      (*wide_nops)++;
9608	      if (!fragP->tc_frag_data.is_no_density)
9609		(*narrow_nops)++;
9610	      break;
9611
9612	    case RELAX_SLOTS:
9613	      if (fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
9614		{
9615		  (*widens)++;
9616		  break;
9617		}
9618	      address += total_frag_text_expansion (fragP);
9619	      break;
9620
9621	    case RELAX_IMMED:
9622	      address += fragP->tc_frag_data.text_expansion[0];
9623	      break;
9624
9625	    case RELAX_ALIGN_NEXT_OPCODE:
9626	    case RELAX_DESIRE_ALIGN:
9627	      *fragPP = fragP;
9628	      return address;
9629
9630	    case RELAX_MAYBE_UNREACHABLE:
9631	    case RELAX_MAYBE_DESIRE_ALIGN:
9632	      /* Do nothing.  */
9633	      break;
9634
9635	    default:
9636	      /* Just punt if we don't know the type.  */
9637	      *fragPP = fragP;
9638	      return 0;
9639	    }
9640	}
9641      else
9642	{
9643	  /* Just punt if we don't know the type.  */
9644	  *fragPP = fragP;
9645	  return 0;
9646	}
9647      fragP = fragP->fr_next;
9648    }
9649
9650  *fragPP = fragP;
9651  return 0;
9652}
9653
9654
9655static long bytes_to_stretch (fragS *, int, int, int, int);
9656
9657static long
9658future_alignment_required (fragS *fragP, long stretch ATTRIBUTE_UNUSED)
9659{
9660  fragS *this_frag = fragP;
9661  long address;
9662  int num_widens = 0;
9663  int wide_nops = 0;
9664  int narrow_nops = 0;
9665  bfd_boolean paddable = FALSE;
9666  offsetT local_opt_diff;
9667  offsetT opt_diff;
9668  offsetT max_diff;
9669  int stretch_amount = 0;
9670  int local_stretch_amount;
9671  int global_stretch_amount;
9672
9673  address = find_address_of_next_align_frag
9674    (&fragP, &wide_nops, &narrow_nops, &num_widens, &paddable);
9675
9676  if (!address)
9677    {
9678      if (this_frag->tc_frag_data.is_aligning_branch)
9679	this_frag->tc_frag_data.slot_subtypes[0] = RELAX_IMMED;
9680      else
9681	frag_wane (this_frag);
9682    }
9683  else
9684    {
9685      local_opt_diff = get_aligned_diff (fragP, address, &max_diff);
9686      opt_diff = local_opt_diff;
9687      gas_assert (opt_diff >= 0);
9688      gas_assert (max_diff >= opt_diff);
9689      if (max_diff == 0)
9690	return 0;
9691
9692      if (fragP)
9693	fragP = fragP->fr_next;
9694
9695      while (fragP && opt_diff < max_diff && address)
9696	{
9697	  /* We only use these to determine if we can exit early
9698	     because there will be plenty of ways to align future
9699	     align frags.  */
9700	  int glob_widens = 0;
9701	  int dnn = 0;
9702	  int dw = 0;
9703	  bfd_boolean glob_pad = 0;
9704	  address = find_address_of_next_align_frag
9705	    (&fragP, &glob_widens, &dnn, &dw, &glob_pad);
9706	  /* If there is a padable portion, then skip.  */
9707	  if (glob_pad || glob_widens >= (1 << branch_align_power (now_seg)))
9708	    address = 0;
9709
9710	  if (address)
9711	    {
9712	      offsetT next_m_diff;
9713	      offsetT next_o_diff;
9714
9715	      /* Downrange frags haven't had stretch added to them yet.  */
9716	      address += stretch;
9717
9718	      /* The address also includes any text expansion from this
9719		 frag in a previous pass, but we don't want that.  */
9720	      address -= this_frag->tc_frag_data.text_expansion[0];
9721
9722	      /* Assume we are going to move at least opt_diff.  In
9723		 reality, we might not be able to, but assuming that
9724		 we will helps catch cases where moving opt_diff pushes
9725		 the next target from aligned to unaligned.  */
9726	      address += opt_diff;
9727
9728	      next_o_diff = get_aligned_diff (fragP, address, &next_m_diff);
9729
9730	      /* Now cleanup for the adjustments to address.  */
9731	      next_o_diff += opt_diff;
9732	      next_m_diff += opt_diff;
9733	      if (next_o_diff <= max_diff && next_o_diff > opt_diff)
9734		opt_diff = next_o_diff;
9735	      if (next_m_diff < max_diff)
9736		max_diff = next_m_diff;
9737	      fragP = fragP->fr_next;
9738	    }
9739	}
9740
9741      /* If there are enough wideners in between, do it.  */
9742      if (paddable)
9743	{
9744	  if (this_frag->fr_subtype == RELAX_UNREACHABLE)
9745	    {
9746	      gas_assert (opt_diff <= (signed) xtensa_fetch_width);
9747	      return opt_diff;
9748	    }
9749	  return 0;
9750	}
9751      local_stretch_amount
9752	= bytes_to_stretch (this_frag, wide_nops, narrow_nops,
9753			    num_widens, local_opt_diff);
9754      global_stretch_amount
9755	= bytes_to_stretch (this_frag, wide_nops, narrow_nops,
9756			    num_widens, opt_diff);
9757      /* If the condition below is true, then the frag couldn't
9758	 stretch the correct amount for the global case, so we just
9759	 optimize locally.  We'll rely on the subsequent frags to get
9760	 the correct alignment in the global case.  */
9761      if (global_stretch_amount < local_stretch_amount)
9762	stretch_amount = local_stretch_amount;
9763      else
9764	stretch_amount = global_stretch_amount;
9765
9766      if (this_frag->fr_subtype == RELAX_SLOTS
9767	  && this_frag->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
9768	gas_assert (stretch_amount <= 1);
9769      else if (this_frag->fr_subtype == RELAX_FILL_NOP)
9770	{
9771	  if (this_frag->tc_frag_data.is_no_density)
9772	    gas_assert (stretch_amount == 3 || stretch_amount == 0);
9773	  else
9774	    gas_assert (stretch_amount <= 3);
9775	}
9776    }
9777  return stretch_amount;
9778}
9779
9780
9781/* The idea: widen everything you can to get a target or loop aligned,
9782   then start using NOPs.
9783
9784   wide_nops   = the number of wide NOPs available for aligning
9785   narrow_nops = the number of narrow NOPs available for aligning
9786		 (a subset of wide_nops)
9787   widens      = the number of narrow instructions that should be widened
9788
9789*/
9790
9791static long
9792bytes_to_stretch (fragS *this_frag,
9793		  int wide_nops,
9794		  int narrow_nops,
9795		  int num_widens,
9796		  int desired_diff)
9797{
9798  int nops_needed;
9799  int nop_bytes;
9800  int extra_bytes;
9801  int bytes_short = desired_diff - num_widens;
9802
9803  gas_assert (desired_diff >= 0
9804	      && desired_diff < (signed) xtensa_fetch_width);
9805  if (desired_diff == 0)
9806    return 0;
9807
9808  gas_assert (wide_nops > 0 || num_widens > 0);
9809
9810  /* Always prefer widening to NOP-filling.  */
9811  if (bytes_short < 0)
9812    {
9813      /* There are enough RELAX_NARROW frags after this one
9814	 to align the target without widening this frag in any way.  */
9815      return 0;
9816    }
9817
9818  if (bytes_short == 0)
9819    {
9820      /* Widen every narrow between here and the align target
9821	 and the align target will be properly aligned.  */
9822      if (this_frag->fr_subtype == RELAX_FILL_NOP)
9823	return 0;
9824      else
9825	return 1;
9826    }
9827
9828  /* From here we will need at least one NOP to get an alignment.
9829     However, we may not be able to align at all, in which case,
9830     don't widen.  */
9831  nops_needed = desired_diff / 3;
9832
9833  /* If there aren't enough nops, don't widen.  */
9834  if (nops_needed > wide_nops)
9835    return 0;
9836
9837  /* First try it with all wide nops.  */
9838  nop_bytes = nops_needed * 3;
9839  extra_bytes = desired_diff - nop_bytes;
9840
9841  if (nop_bytes + num_widens >= desired_diff)
9842    {
9843      if (this_frag->fr_subtype == RELAX_FILL_NOP)
9844	return 3;
9845      else if (num_widens == extra_bytes)
9846	return 1;
9847      return 0;
9848    }
9849
9850  /* Add a narrow nop.  */
9851  nops_needed++;
9852  nop_bytes += 2;
9853  extra_bytes -= 2;
9854  if (narrow_nops == 0 || nops_needed > wide_nops)
9855    return 0;
9856
9857  if (nop_bytes + num_widens >= desired_diff && extra_bytes >= 0)
9858    {
9859      if (this_frag->fr_subtype == RELAX_FILL_NOP)
9860	return !this_frag->tc_frag_data.is_no_density ? 2 : 3;
9861      else if (num_widens == extra_bytes)
9862	return 1;
9863      return 0;
9864    }
9865
9866  /* Replace a wide nop with a narrow nop--we can get here if
9867     extra_bytes was negative in the previous conditional.  */
9868  if (narrow_nops == 1)
9869    return 0;
9870  nop_bytes--;
9871  extra_bytes++;
9872  if (nop_bytes + num_widens >= desired_diff)
9873    {
9874      if (this_frag->fr_subtype == RELAX_FILL_NOP)
9875	return !this_frag->tc_frag_data.is_no_density ? 2 : 3;
9876      else if (num_widens == extra_bytes)
9877	return 1;
9878      return 0;
9879    }
9880
9881  /* If we can't satisfy any of the above cases, then we can't align
9882     using padding or fill nops.  */
9883  return 0;
9884}
9885
9886
9887static struct trampoline_frag *
9888search_trampolines (TInsn *tinsn, fragS *fragP, bfd_boolean unreachable_only)
9889{
9890  struct trampoline_seg *ts = find_trampoline_seg (now_seg);
9891  struct trampoline_frag *tf = (ts) ? ts->trampoline_list.next : NULL;
9892  struct trampoline_frag *best_tf = NULL;
9893  int best_delta = 0;
9894  int best_addr = 0;
9895  symbolS *sym = tinsn->tok[0].X_add_symbol;
9896  offsetT target = S_GET_VALUE (sym) + tinsn->tok[0].X_add_number;
9897  offsetT addr = fragP->fr_address;
9898  offsetT lower = (addr < target) ? addr : target;
9899  offsetT upper = (addr > target) ? addr : target;
9900  int delta = upper - lower;
9901  offsetT midpoint = lower + delta / 2;
9902  int this_delta = -1;
9903  int this_addr = -1;
9904
9905  if (delta > 2 * J_RANGE)
9906    {
9907      /* One trampoline won't do; we need multiple.
9908	 Choose the farthest trampoline that's still in range of the original
9909	 and let a later pass finish the job.  */
9910      for ( ; tf; tf = tf->next)
9911	{
9912	  int next_addr = (tf->next) ? tf->next->fragP->fr_address + tf->next->fragP->fr_fix : 0;
9913
9914	  this_addr = tf->fragP->fr_address + tf->fragP->fr_fix;
9915	  if (lower == addr)
9916	    {
9917	      /* Forward jump.  */
9918	      if (this_addr - addr < J_RANGE)
9919		break;
9920	    }
9921	  else
9922	    {
9923	      /* Backward jump.  */
9924	      if (next_addr == 0 || addr - next_addr > J_RANGE)
9925		break;
9926	    }
9927	}
9928      if (abs (addr - this_addr) < J_RANGE)
9929	return tf;
9930
9931      return NULL;
9932    }
9933  for ( ; tf; tf = tf->next)
9934    {
9935      this_addr = tf->fragP->fr_address + tf->fragP->fr_fix;
9936      this_delta = abs (this_addr - midpoint);
9937      if (unreachable_only && tf->needs_jump_around)
9938	continue;
9939      if (!best_tf || this_delta < best_delta)
9940        {
9941	  best_tf = tf;
9942	  best_delta = this_delta;
9943	  best_addr = this_addr;
9944        }
9945    }
9946
9947  if (best_tf &&
9948      best_delta < J_RANGE &&
9949      abs(best_addr - lower) < J_RANGE &&
9950      abs(best_addr - upper) < J_RANGE)
9951    return best_tf;
9952
9953  return NULL; /* No suitable trampoline found.  */
9954}
9955
9956
9957static struct trampoline_frag *
9958get_best_trampoline (TInsn *tinsn, fragS *fragP)
9959{
9960  struct trampoline_frag *tf = NULL;
9961
9962  tf = search_trampolines (tinsn, fragP, TRUE); /* Try unreachable first.  */
9963
9964  if (tf == NULL)
9965    tf = search_trampolines (tinsn, fragP, FALSE); /* Try ones needing a jump-around, too.  */
9966
9967  return tf;
9968}
9969
9970
9971static void
9972check_and_update_trampolines (void)
9973{
9974  struct trampoline_seg *ts = find_trampoline_seg (now_seg);
9975  struct trampoline_frag *tf = ts->trampoline_list.next;
9976  struct trampoline_frag *prev = &ts->trampoline_list;
9977
9978  for ( ; tf; prev = tf, tf = tf->next)
9979    {
9980      if (tf->fragP->fr_var < 3)
9981	{
9982	  frag_wane (tf->fragP);
9983	  prev->next = tf->next;
9984	  tf->fragP = NULL;
9985	}
9986    }
9987}
9988
9989
9990static int
9991init_trampoline_frag (struct trampoline_frag *trampP)
9992{
9993  fragS *fp = trampP->fragP;
9994  int growth = 0;
9995
9996  if (fp->fr_fix == 0)
9997    {
9998      symbolS *lsym;
9999      char label[10 + 2 * sizeof(fp)];
10000      sprintf (label, ".L0_TR_%p", fp);
10001
10002      lsym = (symbolS *)local_symbol_make (label, now_seg, 0, fp);
10003      fp->fr_symbol = lsym;
10004      if (trampP->needs_jump_around)
10005        {
10006	  /* Add a jump around this block of jumps, in case
10007	     control flows into this block.  */
10008	  fixS *fixP;
10009	  TInsn insn;
10010	  xtensa_format fmt;
10011	  xtensa_isa isa = xtensa_default_isa;
10012
10013	  fp->tc_frag_data.is_insn = 1;
10014	  /* Assemble a jump insn.  */
10015	  tinsn_init (&insn);
10016	  insn.insn_type = ITYPE_INSN;
10017	  insn.opcode = xtensa_j_opcode;
10018	  insn.ntok = 1;
10019	  set_expr_symbol_offset (&insn.tok[0], lsym, 3);
10020	  fmt = xg_get_single_format (xtensa_j_opcode);
10021	  tinsn_to_slotbuf (fmt, 0, &insn, trampoline_slotbuf);
10022	  xtensa_format_set_slot (isa, fmt, 0, trampoline_buf, trampoline_slotbuf);
10023	  xtensa_insnbuf_to_chars (isa, trampoline_buf, (unsigned char *)fp->fr_literal, 3);
10024	  fp->fr_fix += 3;
10025	  fp->fr_var -= 3;
10026	  growth = 3;
10027	  fixP = fix_new (fp, 0, 3, lsym, 3, TRUE, BFD_RELOC_XTENSA_SLOT0_OP);
10028	  trampP->fixP = fixP;
10029        }
10030    }
10031  return growth;
10032}
10033
10034
10035static int
10036add_jump_to_trampoline (struct trampoline_frag *trampP, fragS *origfrag)
10037{
10038  fragS *tramp = trampP->fragP;
10039  fixS *fixP;
10040  int offset = tramp->fr_fix; /* Where to assemble the j insn.  */
10041  TInsn insn;
10042  symbolS *lsym;
10043  symbolS *tsym;
10044  int toffset;
10045  xtensa_format fmt;
10046  xtensa_isa isa = xtensa_default_isa;
10047  int growth = 0;
10048
10049  lsym = tramp->fr_symbol;
10050  /* Assemble a jump to the target label in the trampoline frag.  */
10051  tsym = origfrag->tc_frag_data.slot_symbols[0];
10052  toffset = origfrag-> tc_frag_data.slot_offsets[0];
10053  tinsn_init (&insn);
10054  insn.insn_type = ITYPE_INSN;
10055  insn.opcode = xtensa_j_opcode;
10056  insn.ntok = 1;
10057  set_expr_symbol_offset (&insn.tok[0], tsym, toffset);
10058  fmt = xg_get_single_format (xtensa_j_opcode);
10059  tinsn_to_slotbuf (fmt, 0, &insn, trampoline_slotbuf);
10060  xtensa_format_set_slot (isa, fmt, 0, trampoline_buf, trampoline_slotbuf);
10061  xtensa_insnbuf_to_chars (isa, trampoline_buf, (unsigned char *)tramp->fr_literal + offset, 3);
10062  tramp->fr_fix += 3;
10063  tramp->fr_var -= 3;
10064  growth = 3;
10065  /* add a fix-up for the trampoline jump.  */
10066  fixP = fix_new (tramp, tramp->fr_fix - 3, 3, tsym, toffset, TRUE, BFD_RELOC_XTENSA_SLOT0_OP);
10067  /* Modify the jump at the start of this trampoline to point past the newly-added jump.  */
10068  fixP = trampP->fixP;
10069  if (fixP)
10070    fixP->fx_offset += 3;
10071  /* Modify the original j to point here.  */
10072  origfrag->tc_frag_data.slot_symbols[0] = lsym;
10073  origfrag->tc_frag_data.slot_offsets[0] = tramp->fr_fix - 3;
10074  /* If trampoline is full, remove it from the list.  */
10075  check_and_update_trampolines ();
10076
10077  return growth;
10078}
10079
10080
10081static long
10082relax_frag_immed (segT segP,
10083		  fragS *fragP,
10084		  long stretch,
10085		  int min_steps,
10086		  xtensa_format fmt,
10087		  int slot,
10088		  int *stretched_p,
10089		  bfd_boolean estimate_only)
10090{
10091  TInsn tinsn;
10092  int old_size;
10093  bfd_boolean negatable_branch = FALSE;
10094  bfd_boolean branch_jmp_to_next = FALSE;
10095  bfd_boolean from_wide_insn = FALSE;
10096  xtensa_isa isa = xtensa_default_isa;
10097  IStack istack;
10098  offsetT frag_offset;
10099  int num_steps;
10100  int num_text_bytes, num_literal_bytes;
10101  int literal_diff, total_text_diff, this_text_diff;
10102
10103  gas_assert (fragP->fr_opcode != NULL);
10104
10105  xg_clear_vinsn (&cur_vinsn);
10106  vinsn_from_chars (&cur_vinsn, fragP->fr_opcode);
10107  if (cur_vinsn.num_slots > 1)
10108    from_wide_insn = TRUE;
10109
10110  tinsn = cur_vinsn.slots[slot];
10111  tinsn_immed_from_frag (&tinsn, fragP, slot);
10112
10113  if (estimate_only && xtensa_opcode_is_loop (isa, tinsn.opcode) == 1)
10114    return 0;
10115
10116  if (workaround_b_j_loop_end && ! fragP->tc_frag_data.is_no_transform)
10117    branch_jmp_to_next = is_branch_jmp_to_next (&tinsn, fragP);
10118
10119  negatable_branch = (xtensa_opcode_is_branch (isa, tinsn.opcode) == 1);
10120
10121  old_size = xtensa_format_length (isa, fmt);
10122
10123  /* Special case: replace a branch to the next instruction with a NOP.
10124     This is required to work around a hardware bug in T1040.0 and also
10125     serves as an optimization.  */
10126
10127  if (branch_jmp_to_next
10128      && ((old_size == 2) || (old_size == 3))
10129      && !next_frag_is_loop_target (fragP))
10130    return 0;
10131
10132  /* Here is the fun stuff: Get the immediate field from this
10133     instruction.  If it fits, we are done.  If not, find the next
10134     instruction sequence that fits.  */
10135
10136  frag_offset = fragP->fr_opcode - fragP->fr_literal;
10137  istack_init (&istack);
10138  num_steps = xg_assembly_relax (&istack, &tinsn, segP, fragP, frag_offset,
10139				 min_steps, stretch);
10140  gas_assert (num_steps >= min_steps && num_steps <= RELAX_IMMED_MAXSTEPS);
10141
10142  fragP->tc_frag_data.slot_subtypes[slot] = (int) RELAX_IMMED + num_steps;
10143
10144  /* Figure out the number of bytes needed.  */
10145  num_literal_bytes = get_num_stack_literal_bytes (&istack);
10146  literal_diff
10147    = num_literal_bytes - fragP->tc_frag_data.literal_expansion[slot];
10148  num_text_bytes = get_num_stack_text_bytes (&istack);
10149
10150  if (from_wide_insn)
10151    {
10152      int first = 0;
10153      while (istack.insn[first].opcode == XTENSA_UNDEFINED)
10154	first++;
10155
10156      num_text_bytes += old_size;
10157      if (opcode_fits_format_slot (istack.insn[first].opcode, fmt, slot))
10158	num_text_bytes -= xg_get_single_size (istack.insn[first].opcode);
10159      else
10160	{
10161	  /* The first instruction in the relaxed sequence will go after
10162	     the current wide instruction, and thus its symbolic immediates
10163	     might not fit.  */
10164
10165	  istack_init (&istack);
10166	  num_steps = xg_assembly_relax (&istack, &tinsn, segP, fragP,
10167					 frag_offset + old_size,
10168					 min_steps, stretch + old_size);
10169	  gas_assert (num_steps >= min_steps && num_steps <= RELAX_IMMED_MAXSTEPS);
10170
10171	  fragP->tc_frag_data.slot_subtypes[slot]
10172	    = (int) RELAX_IMMED + num_steps;
10173
10174	  num_literal_bytes = get_num_stack_literal_bytes (&istack);
10175	  literal_diff
10176	    = num_literal_bytes - fragP->tc_frag_data.literal_expansion[slot];
10177
10178	  num_text_bytes = get_num_stack_text_bytes (&istack) + old_size;
10179	}
10180    }
10181
10182  total_text_diff = num_text_bytes - old_size;
10183  this_text_diff = total_text_diff - fragP->tc_frag_data.text_expansion[slot];
10184
10185  /* It MUST get larger.  If not, we could get an infinite loop.  */
10186  gas_assert (num_text_bytes >= 0);
10187  gas_assert (literal_diff >= 0);
10188  gas_assert (total_text_diff >= 0);
10189
10190  fragP->tc_frag_data.text_expansion[slot] = total_text_diff;
10191  fragP->tc_frag_data.literal_expansion[slot] = num_literal_bytes;
10192  gas_assert (fragP->tc_frag_data.text_expansion[slot] >= 0);
10193  gas_assert (fragP->tc_frag_data.literal_expansion[slot] >= 0);
10194
10195  /* Find the associated expandable literal for this.  */
10196  if (literal_diff != 0)
10197    {
10198      fragS *lit_fragP = fragP->tc_frag_data.literal_frags[slot];
10199      if (lit_fragP)
10200	{
10201	  gas_assert (literal_diff == 4);
10202	  lit_fragP->tc_frag_data.unreported_expansion += literal_diff;
10203
10204	  /* We expect that the literal section state has NOT been
10205	     modified yet.  */
10206	  gas_assert (lit_fragP->fr_type == rs_machine_dependent
10207		  && lit_fragP->fr_subtype == RELAX_LITERAL);
10208	  lit_fragP->fr_subtype = RELAX_LITERAL_NR;
10209
10210	  /* We need to mark this section for another iteration
10211	     of relaxation.  */
10212	  (*stretched_p)++;
10213	}
10214    }
10215
10216  if (negatable_branch && istack.ninsn > 1)
10217    update_next_frag_state (fragP);
10218
10219  /* If last insn is a jump, and it cannot reach its target, try to find a trampoline.  */
10220  if (istack.ninsn > 2 &&
10221      istack.insn[istack.ninsn - 1].insn_type == ITYPE_LABEL &&
10222      istack.insn[istack.ninsn - 2].insn_type == ITYPE_INSN &&
10223      istack.insn[istack.ninsn - 2].opcode == xtensa_j_opcode)
10224    {
10225      TInsn *jinsn = &istack.insn[istack.ninsn - 2];
10226
10227      if (!xg_symbolic_immeds_fit (jinsn, segP, fragP, fragP->fr_offset, total_text_diff))
10228	{
10229	  struct trampoline_frag *tf = get_best_trampoline (jinsn, fragP);
10230
10231	  if (tf)
10232	    {
10233	      this_text_diff += init_trampoline_frag (tf);
10234	      this_text_diff += add_jump_to_trampoline (tf, fragP);
10235	    }
10236	  else
10237	    {
10238	      /* If target symbol is undefined, assume it will reach once linked.  */
10239	      expressionS *exp = &istack.insn[istack.ninsn - 2].tok[0];
10240
10241	      if (exp->X_op == O_symbol && S_IS_DEFINED (exp->X_add_symbol))
10242		{
10243		  as_bad_where (fragP->fr_file, fragP->fr_line,
10244		    _("jump target out of range; no usable trampoline found"));
10245		}
10246	    }
10247	}
10248    }
10249
10250  return this_text_diff;
10251}
10252
10253
10254/* md_convert_frag Hook and Helper Functions.  */
10255
10256static void convert_frag_align_next_opcode (fragS *);
10257static void convert_frag_narrow (segT, fragS *, xtensa_format, int);
10258static void convert_frag_fill_nop (fragS *);
10259static void convert_frag_immed (segT, fragS *, int, xtensa_format, int);
10260
10261void
10262md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec, fragS *fragp)
10263{
10264  static xtensa_insnbuf vbuf = NULL;
10265  xtensa_isa isa = xtensa_default_isa;
10266  int slot;
10267  int num_slots;
10268  xtensa_format fmt;
10269  const char *file_name;
10270  unsigned line;
10271
10272  file_name = as_where (&line);
10273  new_logical_line (fragp->fr_file, fragp->fr_line);
10274
10275  switch (fragp->fr_subtype)
10276    {
10277    case RELAX_ALIGN_NEXT_OPCODE:
10278      /* Always convert.  */
10279      convert_frag_align_next_opcode (fragp);
10280      break;
10281
10282    case RELAX_DESIRE_ALIGN:
10283      /* Do nothing.  If not aligned already, too bad.  */
10284      break;
10285
10286    case RELAX_LITERAL:
10287    case RELAX_LITERAL_FINAL:
10288      break;
10289
10290    case RELAX_SLOTS:
10291      if (vbuf == NULL)
10292	vbuf = xtensa_insnbuf_alloc (isa);
10293
10294      xtensa_insnbuf_from_chars
10295	(isa, vbuf, (unsigned char *) fragp->fr_opcode, 0);
10296      fmt = xtensa_format_decode (isa, vbuf);
10297      num_slots = xtensa_format_num_slots (isa, fmt);
10298
10299      for (slot = 0; slot < num_slots; slot++)
10300	{
10301	  switch (fragp->tc_frag_data.slot_subtypes[slot])
10302	    {
10303	    case RELAX_NARROW:
10304	      convert_frag_narrow (sec, fragp, fmt, slot);
10305	      break;
10306
10307	    case RELAX_IMMED:
10308	    case RELAX_IMMED_STEP1:
10309	    case RELAX_IMMED_STEP2:
10310	    case RELAX_IMMED_STEP3:
10311	      /* Place the immediate.  */
10312	      convert_frag_immed
10313		(sec, fragp,
10314		 fragp->tc_frag_data.slot_subtypes[slot] - RELAX_IMMED,
10315		 fmt, slot);
10316	      break;
10317
10318	    default:
10319	      /* This is OK because some slots could have
10320		 relaxations and others have none.  */
10321	      break;
10322	    }
10323	}
10324      break;
10325
10326    case RELAX_UNREACHABLE:
10327      memset (&fragp->fr_literal[fragp->fr_fix], 0, fragp->fr_var);
10328      fragp->fr_fix += fragp->tc_frag_data.text_expansion[0];
10329      fragp->fr_var -= fragp->tc_frag_data.text_expansion[0];
10330      frag_wane (fragp);
10331      break;
10332
10333    case RELAX_MAYBE_UNREACHABLE:
10334    case RELAX_MAYBE_DESIRE_ALIGN:
10335      frag_wane (fragp);
10336      break;
10337
10338    case RELAX_FILL_NOP:
10339      convert_frag_fill_nop (fragp);
10340      break;
10341
10342    case RELAX_LITERAL_NR:
10343      if (use_literal_section)
10344	{
10345	  /* This should have been handled during relaxation.  When
10346	     relaxing a code segment, literals sometimes need to be
10347	     added to the corresponding literal segment.  If that
10348	     literal segment has already been relaxed, then we end up
10349	     in this situation.  Marking the literal segments as data
10350	     would make this happen less often (since GAS always relaxes
10351	     code before data), but we could still get into trouble if
10352	     there are instructions in a segment that is not marked as
10353	     containing code.  Until we can implement a better solution,
10354	     cheat and adjust the addresses of all the following frags.
10355	     This could break subsequent alignments, but the linker's
10356	     literal coalescing will do that anyway.  */
10357
10358	  fragS *f;
10359	  fragp->fr_subtype = RELAX_LITERAL_FINAL;
10360	  gas_assert (fragp->tc_frag_data.unreported_expansion == 4);
10361	  memset (&fragp->fr_literal[fragp->fr_fix], 0, 4);
10362	  fragp->fr_var -= 4;
10363	  fragp->fr_fix += 4;
10364	  for (f = fragp->fr_next; f; f = f->fr_next)
10365	    f->fr_address += 4;
10366	}
10367      else
10368	as_bad (_("invalid relaxation fragment result"));
10369      break;
10370
10371    case RELAX_TRAMPOLINE:
10372      break;
10373    }
10374
10375  fragp->fr_var = 0;
10376  new_logical_line (file_name, line);
10377}
10378
10379
10380static void
10381convert_frag_align_next_opcode (fragS *fragp)
10382{
10383  char *nop_buf;		/* Location for Writing.  */
10384  bfd_boolean use_no_density = fragp->tc_frag_data.is_no_density;
10385  addressT aligned_address;
10386  offsetT fill_size;
10387  int nop, nop_count;
10388
10389  aligned_address = get_noop_aligned_address (fragp, fragp->fr_address +
10390					      fragp->fr_fix);
10391  fill_size = aligned_address - (fragp->fr_address + fragp->fr_fix);
10392  nop_count = get_text_align_nop_count (fill_size, use_no_density);
10393  nop_buf = fragp->fr_literal + fragp->fr_fix;
10394
10395  for (nop = 0; nop < nop_count; nop++)
10396    {
10397      int nop_size;
10398      nop_size = get_text_align_nth_nop_size (fill_size, nop, use_no_density);
10399
10400      assemble_nop (nop_size, nop_buf);
10401      nop_buf += nop_size;
10402    }
10403
10404  fragp->fr_fix += fill_size;
10405  fragp->fr_var -= fill_size;
10406}
10407
10408
10409static void
10410convert_frag_narrow (segT segP, fragS *fragP, xtensa_format fmt, int slot)
10411{
10412  TInsn tinsn, single_target;
10413  int size, old_size, diff;
10414  offsetT frag_offset;
10415
10416  gas_assert (slot == 0);
10417  tinsn_from_chars (&tinsn, fragP->fr_opcode, 0);
10418
10419  if (fragP->tc_frag_data.is_aligning_branch == 1)
10420    {
10421      gas_assert (fragP->tc_frag_data.text_expansion[0] == 1
10422	      || fragP->tc_frag_data.text_expansion[0] == 0);
10423      convert_frag_immed (segP, fragP, fragP->tc_frag_data.text_expansion[0],
10424			  fmt, slot);
10425      return;
10426    }
10427
10428  if (fragP->tc_frag_data.text_expansion[0] == 0)
10429    {
10430      /* No conversion.  */
10431      fragP->fr_var = 0;
10432      return;
10433    }
10434
10435  gas_assert (fragP->fr_opcode != NULL);
10436
10437  /* Frags in this relaxation state should only contain
10438     single instruction bundles.  */
10439  tinsn_immed_from_frag (&tinsn, fragP, 0);
10440
10441  /* Just convert it to a wide form....  */
10442  size = 0;
10443  old_size = xg_get_single_size (tinsn.opcode);
10444
10445  tinsn_init (&single_target);
10446  frag_offset = fragP->fr_opcode - fragP->fr_literal;
10447
10448  if (! xg_is_single_relaxable_insn (&tinsn, &single_target, FALSE))
10449    {
10450      as_bad (_("unable to widen instruction"));
10451      return;
10452    }
10453
10454  size = xg_get_single_size (single_target.opcode);
10455  xg_emit_insn_to_buf (&single_target, fragP->fr_opcode, fragP,
10456		       frag_offset, TRUE);
10457
10458  diff = size - old_size;
10459  gas_assert (diff >= 0);
10460  gas_assert (diff <= fragP->fr_var);
10461  fragP->fr_var -= diff;
10462  fragP->fr_fix += diff;
10463
10464  /* clean it up */
10465  fragP->fr_var = 0;
10466}
10467
10468
10469static void
10470convert_frag_fill_nop (fragS *fragP)
10471{
10472  char *loc = &fragP->fr_literal[fragP->fr_fix];
10473  int size = fragP->tc_frag_data.text_expansion[0];
10474  gas_assert ((unsigned) size == (fragP->fr_next->fr_address
10475			      - fragP->fr_address - fragP->fr_fix));
10476  if (size == 0)
10477    {
10478      /* No conversion.  */
10479      fragP->fr_var = 0;
10480      return;
10481    }
10482  assemble_nop (size, loc);
10483  fragP->tc_frag_data.is_insn = TRUE;
10484  fragP->fr_var -= size;
10485  fragP->fr_fix += size;
10486  frag_wane (fragP);
10487}
10488
10489
10490static fixS *fix_new_exp_in_seg
10491  (segT, subsegT, fragS *, int, int, expressionS *, int,
10492   bfd_reloc_code_real_type);
10493static void convert_frag_immed_finish_loop (segT, fragS *, TInsn *);
10494
10495static void
10496convert_frag_immed (segT segP,
10497		    fragS *fragP,
10498		    int min_steps,
10499		    xtensa_format fmt,
10500		    int slot)
10501{
10502  char *immed_instr = fragP->fr_opcode;
10503  TInsn orig_tinsn;
10504  bfd_boolean expanded = FALSE;
10505  bfd_boolean branch_jmp_to_next = FALSE;
10506  char *fr_opcode = fragP->fr_opcode;
10507  xtensa_isa isa = xtensa_default_isa;
10508  bfd_boolean from_wide_insn = FALSE;
10509  int bytes;
10510  bfd_boolean is_loop;
10511
10512  gas_assert (fr_opcode != NULL);
10513
10514  xg_clear_vinsn (&cur_vinsn);
10515
10516  vinsn_from_chars (&cur_vinsn, fr_opcode);
10517  if (cur_vinsn.num_slots > 1)
10518    from_wide_insn = TRUE;
10519
10520  orig_tinsn = cur_vinsn.slots[slot];
10521  tinsn_immed_from_frag (&orig_tinsn, fragP, slot);
10522
10523  is_loop = xtensa_opcode_is_loop (xtensa_default_isa, orig_tinsn.opcode) == 1;
10524
10525  if (workaround_b_j_loop_end && ! fragP->tc_frag_data.is_no_transform)
10526    branch_jmp_to_next = is_branch_jmp_to_next (&orig_tinsn, fragP);
10527
10528  if (branch_jmp_to_next && !next_frag_is_loop_target (fragP))
10529    {
10530      /* Conversion just inserts a NOP and marks the fix as completed.  */
10531      bytes = xtensa_format_length (isa, fmt);
10532      if (bytes >= 4)
10533	{
10534	  cur_vinsn.slots[slot].opcode =
10535	    xtensa_format_slot_nop_opcode (isa, cur_vinsn.format, slot);
10536	  cur_vinsn.slots[slot].ntok = 0;
10537	}
10538      else
10539	{
10540	  bytes += fragP->tc_frag_data.text_expansion[0];
10541	  gas_assert (bytes == 2 || bytes == 3);
10542	  build_nop (&cur_vinsn.slots[0], bytes);
10543	  fragP->fr_fix += fragP->tc_frag_data.text_expansion[0];
10544	}
10545      vinsn_to_insnbuf (&cur_vinsn, fr_opcode, frag_now, TRUE);
10546      xtensa_insnbuf_to_chars
10547	(isa, cur_vinsn.insnbuf, (unsigned char *) fr_opcode, 0);
10548      fragP->fr_var = 0;
10549    }
10550  else
10551    {
10552      /* Here is the fun stuff:  Get the immediate field from this
10553	 instruction.  If it fits, we're done.  If not, find the next
10554	 instruction sequence that fits.  */
10555
10556      IStack istack;
10557      int i;
10558      symbolS *lit_sym = NULL;
10559      int total_size = 0;
10560      int target_offset = 0;
10561      int old_size;
10562      int diff;
10563      symbolS *gen_label = NULL;
10564      offsetT frag_offset;
10565      bfd_boolean first = TRUE;
10566
10567      /* It does not fit.  Find something that does and
10568         convert immediately.  */
10569      frag_offset = fr_opcode - fragP->fr_literal;
10570      istack_init (&istack);
10571      xg_assembly_relax (&istack, &orig_tinsn,
10572			 segP, fragP, frag_offset, min_steps, 0);
10573
10574      old_size = xtensa_format_length (isa, fmt);
10575
10576      /* Assemble this right inline.  */
10577
10578      /* First, create the mapping from a label name to the REAL label.  */
10579      target_offset = 0;
10580      for (i = 0; i < istack.ninsn; i++)
10581	{
10582	  TInsn *tinsn = &istack.insn[i];
10583	  fragS *lit_frag;
10584
10585	  switch (tinsn->insn_type)
10586	    {
10587	    case ITYPE_LITERAL:
10588	      if (lit_sym != NULL)
10589		as_bad (_("multiple literals in expansion"));
10590	      /* First find the appropriate space in the literal pool.  */
10591	      lit_frag = fragP->tc_frag_data.literal_frags[slot];
10592	      if (lit_frag == NULL)
10593		as_bad (_("no registered fragment for literal"));
10594	      if (tinsn->ntok != 1)
10595		as_bad (_("number of literal tokens != 1"));
10596
10597	      /* Set the literal symbol and add a fixup.  */
10598	      lit_sym = lit_frag->fr_symbol;
10599	      break;
10600
10601	    case ITYPE_LABEL:
10602	      if (align_targets && !is_loop)
10603		{
10604		  fragS *unreach = fragP->fr_next;
10605		  while (!(unreach->fr_type == rs_machine_dependent
10606			   && (unreach->fr_subtype == RELAX_MAYBE_UNREACHABLE
10607			       || unreach->fr_subtype == RELAX_UNREACHABLE)))
10608		    {
10609		      unreach = unreach->fr_next;
10610		    }
10611
10612		  gas_assert (unreach->fr_type == rs_machine_dependent
10613			  && (unreach->fr_subtype == RELAX_MAYBE_UNREACHABLE
10614			      || unreach->fr_subtype == RELAX_UNREACHABLE));
10615
10616		  target_offset += unreach->tc_frag_data.text_expansion[0];
10617		}
10618	      gas_assert (gen_label == NULL);
10619	      gen_label = symbol_new (FAKE_LABEL_NAME, now_seg,
10620				      fr_opcode - fragP->fr_literal
10621				      + target_offset, fragP);
10622	      break;
10623
10624	    case ITYPE_INSN:
10625	      if (first && from_wide_insn)
10626		{
10627		  target_offset += xtensa_format_length (isa, fmt);
10628		  first = FALSE;
10629		  if (!opcode_fits_format_slot (tinsn->opcode, fmt, slot))
10630		    target_offset += xg_get_single_size (tinsn->opcode);
10631		}
10632	      else
10633		target_offset += xg_get_single_size (tinsn->opcode);
10634	      break;
10635	    }
10636	}
10637
10638      total_size = 0;
10639      first = TRUE;
10640      for (i = 0; i < istack.ninsn; i++)
10641	{
10642	  TInsn *tinsn = &istack.insn[i];
10643	  fragS *lit_frag;
10644	  int size;
10645	  segT target_seg;
10646	  bfd_reloc_code_real_type reloc_type;
10647
10648	  switch (tinsn->insn_type)
10649	    {
10650	    case ITYPE_LITERAL:
10651	      lit_frag = fragP->tc_frag_data.literal_frags[slot];
10652	      /* Already checked.  */
10653	      gas_assert (lit_frag != NULL);
10654	      gas_assert (lit_sym != NULL);
10655	      gas_assert (tinsn->ntok == 1);
10656	      /* Add a fixup.  */
10657	      target_seg = S_GET_SEGMENT (lit_sym);
10658	      gas_assert (target_seg);
10659	      reloc_type = map_operator_to_reloc (tinsn->tok[0].X_op, TRUE);
10660	      fix_new_exp_in_seg (target_seg, 0, lit_frag, 0, 4,
10661				  &tinsn->tok[0], FALSE, reloc_type);
10662	      break;
10663
10664	    case ITYPE_LABEL:
10665	      break;
10666
10667	    case ITYPE_INSN:
10668	      xg_resolve_labels (tinsn, gen_label);
10669	      xg_resolve_literals (tinsn, lit_sym);
10670	      if (from_wide_insn && first)
10671		{
10672		  first = FALSE;
10673		  if (opcode_fits_format_slot (tinsn->opcode, fmt, slot))
10674		    {
10675		      cur_vinsn.slots[slot] = *tinsn;
10676		    }
10677		  else
10678		    {
10679		      cur_vinsn.slots[slot].opcode =
10680			xtensa_format_slot_nop_opcode (isa, fmt, slot);
10681		      cur_vinsn.slots[slot].ntok = 0;
10682		    }
10683		  vinsn_to_insnbuf (&cur_vinsn, immed_instr, fragP, TRUE);
10684		  xtensa_insnbuf_to_chars (isa, cur_vinsn.insnbuf,
10685					   (unsigned char *) immed_instr, 0);
10686		  fragP->tc_frag_data.is_insn = TRUE;
10687		  size = xtensa_format_length (isa, fmt);
10688		  if (!opcode_fits_format_slot (tinsn->opcode, fmt, slot))
10689		    {
10690		      xg_emit_insn_to_buf
10691			(tinsn, immed_instr + size, fragP,
10692			 immed_instr - fragP->fr_literal + size, TRUE);
10693		      size += xg_get_single_size (tinsn->opcode);
10694		    }
10695		}
10696	      else
10697		{
10698		  size = xg_get_single_size (tinsn->opcode);
10699		  xg_emit_insn_to_buf (tinsn, immed_instr, fragP,
10700				       immed_instr - fragP->fr_literal, TRUE);
10701		}
10702	      immed_instr += size;
10703	      total_size += size;
10704	      break;
10705	    }
10706	}
10707
10708      diff = total_size - old_size;
10709      gas_assert (diff >= 0);
10710      if (diff != 0)
10711	expanded = TRUE;
10712      gas_assert (diff <= fragP->fr_var);
10713      fragP->fr_var -= diff;
10714      fragP->fr_fix += diff;
10715    }
10716
10717  /* Check for undefined immediates in LOOP instructions.  */
10718  if (is_loop)
10719    {
10720      symbolS *sym;
10721      sym = orig_tinsn.tok[1].X_add_symbol;
10722      if (sym != NULL && !S_IS_DEFINED (sym))
10723	{
10724	  as_bad (_("unresolved loop target symbol: %s"), S_GET_NAME (sym));
10725	  return;
10726	}
10727      sym = orig_tinsn.tok[1].X_op_symbol;
10728      if (sym != NULL && !S_IS_DEFINED (sym))
10729	{
10730	  as_bad (_("unresolved loop target symbol: %s"), S_GET_NAME (sym));
10731	  return;
10732	}
10733    }
10734
10735  if (expanded && xtensa_opcode_is_loop (isa, orig_tinsn.opcode) == 1)
10736    convert_frag_immed_finish_loop (segP, fragP, &orig_tinsn);
10737
10738  if (expanded && is_direct_call_opcode (orig_tinsn.opcode))
10739    {
10740      /* Add an expansion note on the expanded instruction.  */
10741      fix_new_exp_in_seg (now_seg, 0, fragP, fr_opcode - fragP->fr_literal, 4,
10742			  &orig_tinsn.tok[0], TRUE,
10743			  BFD_RELOC_XTENSA_ASM_EXPAND);
10744    }
10745}
10746
10747
10748/* Add a new fix expression into the desired segment.  We have to
10749   switch to that segment to do this.  */
10750
10751static fixS *
10752fix_new_exp_in_seg (segT new_seg,
10753		    subsegT new_subseg,
10754		    fragS *frag,
10755		    int where,
10756		    int size,
10757		    expressionS *exp,
10758		    int pcrel,
10759		    bfd_reloc_code_real_type r_type)
10760{
10761  fixS *new_fix;
10762  segT seg = now_seg;
10763  subsegT subseg = now_subseg;
10764
10765  gas_assert (new_seg != 0);
10766  subseg_set (new_seg, new_subseg);
10767
10768  new_fix = fix_new_exp (frag, where, size, exp, pcrel, r_type);
10769  subseg_set (seg, subseg);
10770  return new_fix;
10771}
10772
10773
10774/* Relax a loop instruction so that it can span loop >256 bytes.
10775
10776                  loop    as, .L1
10777          .L0:
10778                  rsr     as, LEND
10779                  wsr     as, LBEG
10780                  addi    as, as, lo8 (label-.L1)
10781                  addmi   as, as, mid8 (label-.L1)
10782                  wsr     as, LEND
10783                  isync
10784                  rsr     as, LCOUNT
10785                  addi    as, as, 1
10786          .L1:
10787                  <<body>>
10788          label:
10789*/
10790
10791static void
10792convert_frag_immed_finish_loop (segT segP, fragS *fragP, TInsn *tinsn)
10793{
10794  TInsn loop_insn;
10795  TInsn addi_insn;
10796  TInsn addmi_insn;
10797  unsigned long target;
10798  static xtensa_insnbuf insnbuf = NULL;
10799  unsigned int loop_length, loop_length_hi, loop_length_lo;
10800  xtensa_isa isa = xtensa_default_isa;
10801  addressT loop_offset;
10802  addressT addi_offset = 9;
10803  addressT addmi_offset = 12;
10804  fragS *next_fragP;
10805  int target_count;
10806
10807  if (!insnbuf)
10808    insnbuf = xtensa_insnbuf_alloc (isa);
10809
10810  /* Get the loop offset.  */
10811  loop_offset = get_expanded_loop_offset (tinsn->opcode);
10812
10813  /* Validate that there really is a LOOP at the loop_offset.  Because
10814     loops are not bundleable, we can assume that the instruction will be
10815     in slot 0.  */
10816  tinsn_from_chars (&loop_insn, fragP->fr_opcode + loop_offset, 0);
10817  tinsn_immed_from_frag (&loop_insn, fragP, 0);
10818
10819  gas_assert (xtensa_opcode_is_loop (isa, loop_insn.opcode) == 1);
10820  addi_offset += loop_offset;
10821  addmi_offset += loop_offset;
10822
10823  gas_assert (tinsn->ntok == 2);
10824  if (tinsn->tok[1].X_op == O_constant)
10825    target = tinsn->tok[1].X_add_number;
10826  else if (tinsn->tok[1].X_op == O_symbol)
10827    {
10828      /* Find the fragment.  */
10829      symbolS *sym = tinsn->tok[1].X_add_symbol;
10830      gas_assert (S_GET_SEGMENT (sym) == segP
10831	      || S_GET_SEGMENT (sym) == absolute_section);
10832      target = (S_GET_VALUE (sym) + tinsn->tok[1].X_add_number);
10833    }
10834  else
10835    {
10836      as_bad (_("invalid expression evaluation type %d"), tinsn->tok[1].X_op);
10837      target = 0;
10838    }
10839
10840  loop_length = target - (fragP->fr_address + fragP->fr_fix);
10841  loop_length_hi = loop_length & ~0x0ff;
10842  loop_length_lo = loop_length & 0x0ff;
10843  if (loop_length_lo >= 128)
10844    {
10845      loop_length_lo -= 256;
10846      loop_length_hi += 256;
10847    }
10848
10849  /* Because addmi sign-extends the immediate, 'loop_length_hi' can be at most
10850     32512.  If the loop is larger than that, then we just fail.  */
10851  if (loop_length_hi > 32512)
10852    as_bad_where (fragP->fr_file, fragP->fr_line,
10853		  _("loop too long for LOOP instruction"));
10854
10855  tinsn_from_chars (&addi_insn, fragP->fr_opcode + addi_offset, 0);
10856  gas_assert (addi_insn.opcode == xtensa_addi_opcode);
10857
10858  tinsn_from_chars (&addmi_insn, fragP->fr_opcode + addmi_offset, 0);
10859  gas_assert (addmi_insn.opcode == xtensa_addmi_opcode);
10860
10861  set_expr_const (&addi_insn.tok[2], loop_length_lo);
10862  tinsn_to_insnbuf (&addi_insn, insnbuf);
10863
10864  fragP->tc_frag_data.is_insn = TRUE;
10865  xtensa_insnbuf_to_chars
10866    (isa, insnbuf, (unsigned char *) fragP->fr_opcode + addi_offset, 0);
10867
10868  set_expr_const (&addmi_insn.tok[2], loop_length_hi);
10869  tinsn_to_insnbuf (&addmi_insn, insnbuf);
10870  xtensa_insnbuf_to_chars
10871    (isa, insnbuf, (unsigned char *) fragP->fr_opcode + addmi_offset, 0);
10872
10873  /* Walk through all of the frags from here to the loop end
10874     and mark them as no_transform to keep them from being modified
10875     by the linker.  If we ever have a relocation for the
10876     addi/addmi of the difference of two symbols we can remove this.  */
10877
10878  target_count = 0;
10879  for (next_fragP = fragP; next_fragP != NULL;
10880       next_fragP = next_fragP->fr_next)
10881    {
10882      next_fragP->tc_frag_data.is_no_transform = TRUE;
10883      if (next_fragP->tc_frag_data.is_loop_target)
10884	target_count++;
10885      if (target_count == 2)
10886	break;
10887    }
10888}
10889
10890
10891/* A map that keeps information on a per-subsegment basis.  This is
10892   maintained during initial assembly, but is invalid once the
10893   subsegments are smashed together.  I.E., it cannot be used during
10894   the relaxation.  */
10895
10896typedef struct subseg_map_struct
10897{
10898  /* the key */
10899  segT seg;
10900  subsegT subseg;
10901
10902  /* the data */
10903  unsigned flags;
10904  float total_freq;	/* fall-through + branch target frequency */
10905  float target_freq;	/* branch target frequency alone */
10906
10907  struct subseg_map_struct *next;
10908} subseg_map;
10909
10910
10911static subseg_map *sseg_map = NULL;
10912
10913static subseg_map *
10914get_subseg_info (segT seg, subsegT subseg)
10915{
10916  subseg_map *subseg_e;
10917
10918  for (subseg_e = sseg_map; subseg_e; subseg_e = subseg_e->next)
10919    {
10920      if (seg == subseg_e->seg && subseg == subseg_e->subseg)
10921	break;
10922    }
10923  return subseg_e;
10924}
10925
10926
10927static subseg_map *
10928add_subseg_info (segT seg, subsegT subseg)
10929{
10930  subseg_map *subseg_e = XNEW (subseg_map);
10931  memset (subseg_e, 0, sizeof (subseg_map));
10932  subseg_e->seg = seg;
10933  subseg_e->subseg = subseg;
10934  subseg_e->flags = 0;
10935  /* Start off considering every branch target very important.  */
10936  subseg_e->target_freq = 1.0;
10937  subseg_e->total_freq = 1.0;
10938  subseg_e->next = sseg_map;
10939  sseg_map = subseg_e;
10940  return subseg_e;
10941}
10942
10943
10944static unsigned
10945get_last_insn_flags (segT seg, subsegT subseg)
10946{
10947  subseg_map *subseg_e = get_subseg_info (seg, subseg);
10948  if (subseg_e)
10949    return subseg_e->flags;
10950  return 0;
10951}
10952
10953
10954static void
10955set_last_insn_flags (segT seg,
10956		     subsegT subseg,
10957		     unsigned fl,
10958		     bfd_boolean val)
10959{
10960  subseg_map *subseg_e = get_subseg_info (seg, subseg);
10961  if (! subseg_e)
10962    subseg_e = add_subseg_info (seg, subseg);
10963  if (val)
10964    subseg_e->flags |= fl;
10965  else
10966    subseg_e->flags &= ~fl;
10967}
10968
10969
10970static float
10971get_subseg_total_freq (segT seg, subsegT subseg)
10972{
10973  subseg_map *subseg_e = get_subseg_info (seg, subseg);
10974  if (subseg_e)
10975    return subseg_e->total_freq;
10976  return 1.0;
10977}
10978
10979
10980static float
10981get_subseg_target_freq (segT seg, subsegT subseg)
10982{
10983  subseg_map *subseg_e = get_subseg_info (seg, subseg);
10984  if (subseg_e)
10985    return subseg_e->target_freq;
10986  return 1.0;
10987}
10988
10989
10990static void
10991set_subseg_freq (segT seg, subsegT subseg, float total_f, float target_f)
10992{
10993  subseg_map *subseg_e = get_subseg_info (seg, subseg);
10994  if (! subseg_e)
10995    subseg_e = add_subseg_info (seg, subseg);
10996  subseg_e->total_freq = total_f;
10997  subseg_e->target_freq = target_f;
10998}
10999
11000
11001/* Segment Lists and emit_state Stuff.  */
11002
11003static void
11004xtensa_move_seg_list_to_beginning (seg_list *head)
11005{
11006  head = head->next;
11007  while (head)
11008    {
11009      segT literal_section = head->seg;
11010
11011      /* Move the literal section to the front of the section list.  */
11012      gas_assert (literal_section);
11013      if (literal_section != stdoutput->sections)
11014	{
11015	  bfd_section_list_remove (stdoutput, literal_section);
11016	  bfd_section_list_prepend (stdoutput, literal_section);
11017	}
11018      head = head->next;
11019    }
11020}
11021
11022
11023static void mark_literal_frags (seg_list *);
11024
11025static void
11026xtensa_move_literals (void)
11027{
11028  seg_list *segment;
11029  frchainS *frchain_from, *frchain_to;
11030  fragS *search_frag, *next_frag, *literal_pool, *insert_after;
11031  fragS **frag_splice;
11032  emit_state state;
11033  segT dest_seg;
11034  fixS *fix, *next_fix, **fix_splice;
11035  sym_list *lit;
11036  struct litpool_seg *lps;
11037  const char *init_name = INIT_SECTION_NAME;
11038  const char *fini_name = FINI_SECTION_NAME;
11039  int init_name_len = strlen(init_name);
11040  int fini_name_len = strlen(fini_name);
11041
11042  mark_literal_frags (literal_head->next);
11043
11044  if (use_literal_section)
11045    return;
11046
11047  /* Assign addresses (rough estimates) to the potential literal pool locations
11048     and create new ones if the gaps are too large.  */
11049
11050  for (lps = litpool_seg_list.next; lps; lps = lps->next)
11051    {
11052      frchainS *frchP = seg_info (lps->seg)->frchainP;
11053      struct litpool_frag *lpf = lps->frag_list.next;
11054      addressT addr = 0;
11055
11056      for ( ; frchP; frchP = frchP->frch_next)
11057	{
11058	  fragS *fragP;
11059	  for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
11060	    {
11061	      if (lpf && fragP == lpf->fragP)
11062		{
11063		  gas_assert(fragP->fr_type == rs_machine_dependent &&
11064			     (fragP->fr_subtype == RELAX_LITERAL_POOL_BEGIN ||
11065			      fragP->fr_subtype == RELAX_LITERAL_POOL_CANDIDATE_BEGIN));
11066		  /* Found a litpool location.  */
11067		  lpf->addr = addr;
11068		  lpf = lpf->next;
11069		}
11070	      if (fragP->fr_type == rs_machine_dependent &&
11071		  fragP->fr_subtype == RELAX_SLOTS)
11072		{
11073		  int slot;
11074		  for (slot = 0; slot < MAX_SLOTS; slot++)
11075		    {
11076		      if (fragP->tc_frag_data.literal_frags[slot])
11077			{
11078			  /* L32R; point its literal to the nearest litpool
11079			     preferring non-"candidate" positions to avoid
11080			     the jump-around.  */
11081			  fragS *litfrag = fragP->tc_frag_data.literal_frags[slot];
11082			  struct litpool_frag *lp = lpf->prev;
11083			  if (!lp->fragP)
11084			    {
11085			      break;
11086			    }
11087			  while (lp->fragP->fr_subtype ==
11088				 RELAX_LITERAL_POOL_CANDIDATE_BEGIN)
11089			    {
11090			      lp = lp->prev;
11091			      if (lp->fragP == NULL)
11092				{
11093				  /* End of list; have to bite the bullet.
11094				     Take the nearest.  */
11095				  lp = lpf->prev;
11096				  break;
11097				}
11098			      /* Does it (conservatively) reach?  */
11099			      if (addr - lp->addr <= 128 * 1024)
11100				{
11101				  if (lp->fragP->fr_subtype == RELAX_LITERAL_POOL_BEGIN)
11102				    {
11103				      /* Found a good one.  */
11104				      break;
11105				    }
11106				  else if (lp->prev->fragP &&
11107					   addr - lp->prev->addr > 128 * 1024)
11108				    {
11109				      /* This is still a "candidate" but the next one
11110				         will be too far away, so revert to the nearest
11111					 one, convert it and add the jump around.  */
11112				      fragS *poolbeg;
11113				      fragS *poolend;
11114				      symbolS *lsym;
11115				      char label[10 + 2 * sizeof (fragS *)];
11116				      lp = lpf->prev;
11117				      poolbeg = lp->fragP;
11118				      lp->priority = 1;
11119				      poolbeg->fr_subtype = RELAX_LITERAL_POOL_BEGIN;
11120				      poolend = poolbeg->fr_next;
11121				      gas_assert (poolend->fr_type == rs_machine_dependent &&
11122						  poolend->fr_subtype == RELAX_LITERAL_POOL_END);
11123				      /* Create a local symbol pointing to the
11124				         end of the pool.  */
11125				      sprintf (label, ".L0_LT_%p", poolbeg);
11126				      lsym = (symbolS *)local_symbol_make (label, lps->seg,
11127									   0, poolend);
11128				      poolbeg->fr_symbol = lsym;
11129				      /* Rest is done in xtensa_relax_frag.  */
11130				    }
11131				}
11132			    }
11133			  if (! litfrag->tc_frag_data.literal_frag)
11134			    {
11135			      /* Take earliest use of this literal to avoid
11136				 forward refs.  */
11137			      litfrag->tc_frag_data.literal_frag = lp->fragP;
11138			    }
11139			}
11140		    }
11141		}
11142	      addr += fragP->fr_fix;
11143	      if (fragP->fr_type == rs_fill)
11144		addr += fragP->fr_offset;
11145	    }
11146	}
11147    }
11148
11149  for (segment = literal_head->next; segment; segment = segment->next)
11150    {
11151      const char *seg_name = segment_name (segment->seg);
11152
11153      /* Keep the literals for .init and .fini in separate sections.  */
11154      if ((!memcmp (seg_name, init_name, init_name_len) &&
11155	   !strcmp (seg_name + init_name_len, ".literal")) ||
11156	  (!memcmp (seg_name, fini_name, fini_name_len) &&
11157	   !strcmp (seg_name + fini_name_len, ".literal")))
11158	continue;
11159
11160      frchain_from = seg_info (segment->seg)->frchainP;
11161      search_frag = frchain_from->frch_root;
11162      literal_pool = NULL;
11163      frchain_to = NULL;
11164      frag_splice = &(frchain_from->frch_root);
11165
11166      while (search_frag && !search_frag->tc_frag_data.literal_frag)
11167	{
11168	  gas_assert (search_frag->fr_fix == 0
11169		  || search_frag->fr_type == rs_align);
11170	  search_frag = search_frag->fr_next;
11171	}
11172
11173      if (!search_frag)
11174	{
11175	  search_frag = frchain_from->frch_root;
11176	  as_bad_where (search_frag->fr_file, search_frag->fr_line,
11177			_("literal pool location required for text-section-literals; specify with .literal_position"));
11178	  continue;
11179	}
11180
11181      gas_assert (search_frag->tc_frag_data.literal_frag->fr_subtype
11182	      == RELAX_LITERAL_POOL_BEGIN);
11183      xtensa_switch_section_emit_state (&state, segment->seg, 0);
11184
11185      /* Make sure that all the frags in this series are closed, and
11186	 that there is at least one left over of zero-size.  This
11187	 prevents us from making a segment with an frchain without any
11188	 frags in it.  */
11189      frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
11190      xtensa_set_frag_assembly_state (frag_now);
11191      frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
11192      xtensa_set_frag_assembly_state (frag_now);
11193
11194      while (search_frag != frag_now)
11195	{
11196	  next_frag = search_frag->fr_next;
11197	  if (search_frag->tc_frag_data.literal_frag)
11198	    {
11199	      literal_pool = search_frag->tc_frag_data.literal_frag;
11200	      gas_assert (literal_pool->fr_subtype == RELAX_LITERAL_POOL_BEGIN);
11201	      frchain_to = literal_pool->tc_frag_data.lit_frchain;
11202	      gas_assert (frchain_to);
11203	    }
11204
11205	  if (search_frag->fr_type == rs_fill && search_frag->fr_fix == 0)
11206	    {
11207	      /* Skip empty fill frags.  */
11208	      *frag_splice = next_frag;
11209	      search_frag = next_frag;
11210	      continue;
11211	    }
11212
11213	  if (search_frag->fr_type == rs_align)
11214	    {
11215	      /* Skip alignment frags, because the pool as a whole will be
11216	         aligned if used, and we don't want to force alignment if the
11217		 pool is unused.  */
11218	      *frag_splice = next_frag;
11219	      search_frag = next_frag;
11220	      continue;
11221	    }
11222
11223	  /* First, move the frag out of the literal section and
11224	     to the appropriate place.  */
11225
11226	  /* Insert an aligmnent frag at start of pool.  */
11227	  if (literal_pool->fr_next->fr_type == rs_machine_dependent &&
11228	      literal_pool->fr_next->fr_subtype == RELAX_LITERAL_POOL_END)
11229	    {
11230	      segT pool_seg = literal_pool->fr_next->tc_frag_data.lit_seg;
11231	      emit_state prev_state;
11232	      fragS *prev_frag;
11233	      fragS *align_frag;
11234	      xtensa_switch_section_emit_state (&prev_state, pool_seg, 0);
11235	      prev_frag = frag_now;
11236	      frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
11237	      align_frag = frag_now;
11238	      frag_align (2, 0, 0);
11239	      /* Splice it into the right place.  */
11240	      prev_frag->fr_next = align_frag->fr_next;
11241	      align_frag->fr_next = literal_pool->fr_next;
11242	      literal_pool->fr_next = align_frag;
11243	      /* Insert after this one.  */
11244	      literal_pool->tc_frag_data.literal_frag = align_frag;
11245	      xtensa_restore_emit_state (&prev_state);
11246	    }
11247	  insert_after = literal_pool->tc_frag_data.literal_frag;
11248	  dest_seg = insert_after->fr_next->tc_frag_data.lit_seg;
11249	  /* Skip align frag.  */
11250	  if (insert_after->fr_next->fr_type == rs_align)
11251	    {
11252	      insert_after = insert_after->fr_next;
11253	    }
11254
11255	  *frag_splice = next_frag;
11256	  search_frag->fr_next = insert_after->fr_next;
11257	  insert_after->fr_next = search_frag;
11258	  search_frag->tc_frag_data.lit_seg = dest_seg;
11259	  literal_pool->tc_frag_data.literal_frag = search_frag;
11260
11261	  /* Now move any fixups associated with this frag to the
11262	     right section.  */
11263	  fix = frchain_from->fix_root;
11264	  fix_splice = &(frchain_from->fix_root);
11265	  while (fix)
11266	    {
11267	      next_fix = fix->fx_next;
11268	      if (fix->fx_frag == search_frag)
11269		{
11270		  *fix_splice = next_fix;
11271		  fix->fx_next = frchain_to->fix_root;
11272		  frchain_to->fix_root = fix;
11273		  if (frchain_to->fix_tail == NULL)
11274		    frchain_to->fix_tail = fix;
11275		}
11276	      else
11277		fix_splice = &(fix->fx_next);
11278	      fix = next_fix;
11279	    }
11280	  search_frag = next_frag;
11281	}
11282
11283      if (frchain_from->fix_root != NULL)
11284	{
11285	  frchain_from = seg_info (segment->seg)->frchainP;
11286	  as_warn (_("fixes not all moved from %s"), segment->seg->name);
11287
11288	  gas_assert (frchain_from->fix_root == NULL);
11289	}
11290      frchain_from->fix_tail = NULL;
11291      xtensa_restore_emit_state (&state);
11292    }
11293
11294  /* Now fix up the SEGMENT value for all the literal symbols.  */
11295  for (lit = literal_syms; lit; lit = lit->next)
11296    {
11297      symbolS *lit_sym = lit->sym;
11298      segT dseg = symbol_get_frag (lit_sym)->tc_frag_data.lit_seg;
11299      if (dseg)
11300	S_SET_SEGMENT (lit_sym, dseg);
11301    }
11302}
11303
11304
11305/* Walk over all the frags for segments in a list and mark them as
11306   containing literals.  As clunky as this is, we can't rely on frag_var
11307   and frag_variant to get called in all situations.  */
11308
11309static void
11310mark_literal_frags (seg_list *segment)
11311{
11312  frchainS *frchain_from;
11313  fragS *search_frag;
11314
11315  while (segment)
11316    {
11317      frchain_from = seg_info (segment->seg)->frchainP;
11318      search_frag = frchain_from->frch_root;
11319      while (search_frag)
11320	{
11321	  search_frag->tc_frag_data.is_literal = TRUE;
11322	  search_frag = search_frag->fr_next;
11323	}
11324      segment = segment->next;
11325    }
11326}
11327
11328
11329static void
11330xtensa_reorder_seg_list (seg_list *head, segT after)
11331{
11332  /* Move all of the sections in the section list to come
11333     after "after" in the gnu segment list.  */
11334
11335  head = head->next;
11336  while (head)
11337    {
11338      segT literal_section = head->seg;
11339
11340      /* Move the literal section after "after".  */
11341      gas_assert (literal_section);
11342      if (literal_section != after)
11343	{
11344	  bfd_section_list_remove (stdoutput, literal_section);
11345	  bfd_section_list_insert_after (stdoutput, after, literal_section);
11346	}
11347
11348      head = head->next;
11349    }
11350}
11351
11352
11353/* Push all the literal segments to the end of the gnu list.  */
11354
11355static void
11356xtensa_reorder_segments (void)
11357{
11358  segT sec;
11359  segT last_sec = 0;
11360  int old_count = 0;
11361  int new_count = 0;
11362
11363  for (sec = stdoutput->sections; sec != NULL; sec = sec->next)
11364    {
11365      last_sec = sec;
11366      old_count++;
11367    }
11368
11369  /* Now that we have the last section, push all the literal
11370     sections to the end.  */
11371  xtensa_reorder_seg_list (literal_head, last_sec);
11372
11373  /* Now perform the final error check.  */
11374  for (sec = stdoutput->sections; sec != NULL; sec = sec->next)
11375    new_count++;
11376  gas_assert (new_count == old_count);
11377}
11378
11379
11380/* Change the emit state (seg, subseg, and frag related stuff) to the
11381   correct location.  Return a emit_state which can be passed to
11382   xtensa_restore_emit_state to return to current fragment.  */
11383
11384static void
11385xtensa_switch_to_literal_fragment (emit_state *result)
11386{
11387  if (directive_state[directive_absolute_literals])
11388    {
11389      segT lit4_seg = cache_literal_section (TRUE);
11390      xtensa_switch_section_emit_state (result, lit4_seg, 0);
11391    }
11392  else
11393    xtensa_switch_to_non_abs_literal_fragment (result);
11394
11395  /* Do a 4-byte align here.  */
11396  frag_align (2, 0, 0);
11397  record_alignment (now_seg, 2);
11398}
11399
11400
11401static void
11402xtensa_switch_to_non_abs_literal_fragment (emit_state *result)
11403{
11404  static bfd_boolean recursive = FALSE;
11405  fragS *pool_location = get_literal_pool_location (now_seg);
11406  segT lit_seg;
11407  bfd_boolean is_init =
11408    (now_seg && !strcmp (segment_name (now_seg), INIT_SECTION_NAME));
11409  bfd_boolean is_fini =
11410    (now_seg && !strcmp (segment_name (now_seg), FINI_SECTION_NAME));
11411
11412  if (pool_location == NULL
11413      && !use_literal_section
11414      && !recursive
11415      && !is_init && ! is_fini)
11416    {
11417      if (!auto_litpools)
11418	{
11419	  as_bad (_("literal pool location required for text-section-literals; specify with .literal_position"));
11420	}
11421
11422      /* When we mark a literal pool location, we want to put a frag in
11423	 the literal pool that points to it.  But to do that, we want to
11424	 switch_to_literal_fragment.  But literal sections don't have
11425	 literal pools, so their location is always null, so we would
11426	 recurse forever.  This is kind of hacky, but it works.  */
11427
11428      recursive = TRUE;
11429      xtensa_mark_literal_pool_location ();
11430      recursive = FALSE;
11431    }
11432
11433  lit_seg = cache_literal_section (FALSE);
11434  xtensa_switch_section_emit_state (result, lit_seg, 0);
11435
11436  if (!use_literal_section
11437      && !is_init && !is_fini
11438      && get_literal_pool_location (now_seg) != pool_location)
11439    {
11440      /* Close whatever frag is there.  */
11441      frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
11442      xtensa_set_frag_assembly_state (frag_now);
11443      frag_now->tc_frag_data.literal_frag = pool_location;
11444      frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
11445      xtensa_set_frag_assembly_state (frag_now);
11446    }
11447}
11448
11449
11450/* Call this function before emitting data into the literal section.
11451   This is a helper function for xtensa_switch_to_literal_fragment.
11452   This is similar to a .section new_now_seg subseg. */
11453
11454static void
11455xtensa_switch_section_emit_state (emit_state *state,
11456				  segT new_now_seg,
11457				  subsegT new_now_subseg)
11458{
11459  state->name = now_seg->name;
11460  state->now_seg = now_seg;
11461  state->now_subseg = now_subseg;
11462  state->generating_literals = generating_literals;
11463  generating_literals++;
11464  subseg_set (new_now_seg, new_now_subseg);
11465}
11466
11467
11468/* Use to restore the emitting into the normal place.  */
11469
11470static void
11471xtensa_restore_emit_state (emit_state *state)
11472{
11473  generating_literals = state->generating_literals;
11474  subseg_set (state->now_seg, state->now_subseg);
11475}
11476
11477
11478/* Predicate function used to look up a section in a particular group.  */
11479
11480static bfd_boolean
11481match_section_group (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
11482{
11483  const char *gname = inf;
11484  const char *group_name = elf_group_name (sec);
11485
11486  return (group_name == gname
11487	  || (group_name != NULL
11488	      && gname != NULL
11489	      && strcmp (group_name, gname) == 0));
11490}
11491
11492
11493/* Get the literal section to be used for the current text section.
11494   The result may be cached in the default_lit_sections structure.  */
11495
11496static segT
11497cache_literal_section (bfd_boolean use_abs_literals)
11498{
11499  const char *text_name, *group_name = 0;
11500  const char *base_name, *suffix;
11501  char *name;
11502  segT *pcached;
11503  segT seg, current_section;
11504  int current_subsec;
11505  bfd_boolean linkonce = FALSE;
11506
11507  /* Save the current section/subsection.  */
11508  current_section = now_seg;
11509  current_subsec = now_subseg;
11510
11511  /* Clear the cached values if they are no longer valid.  */
11512  if (now_seg != default_lit_sections.current_text_seg)
11513    {
11514      default_lit_sections.current_text_seg = now_seg;
11515      default_lit_sections.lit_seg = NULL;
11516      default_lit_sections.lit4_seg = NULL;
11517    }
11518
11519  /* Check if the literal section is already cached.  */
11520  if (use_abs_literals)
11521    pcached = &default_lit_sections.lit4_seg;
11522  else
11523    pcached = &default_lit_sections.lit_seg;
11524
11525  if (*pcached)
11526    return *pcached;
11527
11528  text_name = default_lit_sections.lit_prefix;
11529  if (! text_name || ! *text_name)
11530    {
11531      text_name = segment_name (current_section);
11532      group_name = elf_group_name (current_section);
11533      linkonce = (current_section->flags & SEC_LINK_ONCE) != 0;
11534    }
11535
11536  base_name = use_abs_literals ? ".lit4" : ".literal";
11537  if (group_name)
11538    {
11539      name = concat (base_name, ".", group_name, (char *) NULL);
11540    }
11541  else if (strncmp (text_name, ".gnu.linkonce.", linkonce_len) == 0)
11542    {
11543      suffix = strchr (text_name + linkonce_len, '.');
11544
11545      name = concat (".gnu.linkonce", base_name, suffix ? suffix : "",
11546		     (char *) NULL);
11547      linkonce = TRUE;
11548    }
11549  else
11550    {
11551      /* If the section name begins or ends with ".text", then replace
11552	 that portion instead of appending an additional suffix.  */
11553      size_t len = strlen (text_name);
11554      if (len >= 5
11555	  && (strcmp (text_name + len - 5, ".text") == 0
11556	      || strncmp (text_name, ".text", 5) == 0))
11557	len -= 5;
11558
11559      name = XNEWVEC (char, len + strlen (base_name) + 1);
11560      if (strncmp (text_name, ".text", 5) == 0)
11561	{
11562	  strcpy (name, base_name);
11563	  strcat (name, text_name + 5);
11564	}
11565      else
11566	{
11567	  strcpy (name, text_name);
11568	  strcpy (name + len, base_name);
11569	}
11570    }
11571
11572  /* Canonicalize section names to allow renaming literal sections.
11573     The group name, if any, came from the current text section and
11574     has already been canonicalized.  */
11575  name = tc_canonicalize_symbol_name (name);
11576
11577  seg = bfd_get_section_by_name_if (stdoutput, name, match_section_group,
11578				    (void *) group_name);
11579  if (! seg)
11580    {
11581      flagword flags;
11582
11583      seg = subseg_force_new (name, 0);
11584
11585      if (! use_abs_literals)
11586	{
11587	  /* Add the newly created literal segment to the list.  */
11588	  seg_list *n = XNEW (seg_list);
11589	  n->seg = seg;
11590	  n->next = literal_head->next;
11591	  literal_head->next = n;
11592	}
11593
11594      flags = (SEC_HAS_CONTENTS | SEC_READONLY | SEC_ALLOC | SEC_LOAD
11595	       | (linkonce ? (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD) : 0)
11596	       | (use_abs_literals ? SEC_DATA : SEC_CODE));
11597
11598      elf_group_name (seg) = group_name;
11599
11600      bfd_set_section_flags (stdoutput, seg, flags);
11601      bfd_set_section_alignment (stdoutput, seg, 2);
11602    }
11603
11604  *pcached = seg;
11605  subseg_set (current_section, current_subsec);
11606  return seg;
11607}
11608
11609
11610/* Property Tables Stuff.  */
11611
11612#define XTENSA_INSN_SEC_NAME ".xt.insn"
11613#define XTENSA_LIT_SEC_NAME ".xt.lit"
11614#define XTENSA_PROP_SEC_NAME ".xt.prop"
11615
11616typedef bfd_boolean (*frag_predicate) (const fragS *);
11617typedef void (*frag_flags_fn) (const fragS *, frag_flags *);
11618
11619static bfd_boolean get_frag_is_literal (const fragS *);
11620static void xtensa_create_property_segments
11621  (frag_predicate, frag_predicate, const char *, xt_section_type);
11622static void xtensa_create_xproperty_segments
11623  (frag_flags_fn, const char *, xt_section_type);
11624static bfd_boolean exclude_section_from_property_tables (segT);
11625static bfd_boolean section_has_property (segT, frag_predicate);
11626static bfd_boolean section_has_xproperty (segT, frag_flags_fn);
11627static void add_xt_block_frags
11628  (segT, xtensa_block_info **, frag_predicate, frag_predicate);
11629static bfd_boolean xtensa_frag_flags_is_empty (const frag_flags *);
11630static void xtensa_frag_flags_init (frag_flags *);
11631static void get_frag_property_flags (const fragS *, frag_flags *);
11632static flagword frag_flags_to_number (const frag_flags *);
11633static void add_xt_prop_frags (segT, xtensa_block_info **, frag_flags_fn);
11634
11635/* Set up property tables after relaxation.  */
11636
11637void
11638xtensa_post_relax_hook (void)
11639{
11640  xtensa_move_seg_list_to_beginning (literal_head);
11641
11642  xtensa_find_unmarked_state_frags ();
11643  xtensa_mark_frags_for_org ();
11644  xtensa_mark_difference_of_two_symbols ();
11645
11646  xtensa_create_property_segments (get_frag_is_literal,
11647				   NULL,
11648				   XTENSA_LIT_SEC_NAME,
11649				   xt_literal_sec);
11650  xtensa_create_xproperty_segments (get_frag_property_flags,
11651				    XTENSA_PROP_SEC_NAME,
11652				    xt_prop_sec);
11653
11654  if (warn_unaligned_branch_targets)
11655    bfd_map_over_sections (stdoutput, xtensa_find_unaligned_branch_targets, 0);
11656  bfd_map_over_sections (stdoutput, xtensa_find_unaligned_loops, 0);
11657}
11658
11659
11660/* This function is only meaningful after xtensa_move_literals.  */
11661
11662static bfd_boolean
11663get_frag_is_literal (const fragS *fragP)
11664{
11665  gas_assert (fragP != NULL);
11666  return fragP->tc_frag_data.is_literal;
11667}
11668
11669
11670static void
11671xtensa_create_property_segments (frag_predicate property_function,
11672				 frag_predicate end_property_function,
11673				 const char *section_name_base,
11674				 xt_section_type sec_type)
11675{
11676  segT *seclist;
11677
11678  /* Walk over all of the current segments.
11679     Walk over each fragment
11680     For each non-empty fragment,
11681     Build a property record (append where possible).  */
11682
11683  for (seclist = &stdoutput->sections;
11684       seclist && *seclist;
11685       seclist = &(*seclist)->next)
11686    {
11687      segT sec = *seclist;
11688
11689      if (exclude_section_from_property_tables (sec))
11690	continue;
11691
11692      if (section_has_property (sec, property_function))
11693	{
11694	  segment_info_type *xt_seg_info;
11695	  xtensa_block_info **xt_blocks;
11696	  segT prop_sec = xtensa_make_property_section (sec, section_name_base);
11697
11698	  prop_sec->output_section = prop_sec;
11699	  subseg_set (prop_sec, 0);
11700	  xt_seg_info = seg_info (prop_sec);
11701	  xt_blocks = &xt_seg_info->tc_segment_info_data.blocks[sec_type];
11702
11703	  /* Walk over all of the frchains here and add new sections.  */
11704	  add_xt_block_frags (sec, xt_blocks, property_function,
11705			      end_property_function);
11706	}
11707    }
11708
11709  /* Now we fill them out....  */
11710
11711  for (seclist = &stdoutput->sections;
11712       seclist && *seclist;
11713       seclist = &(*seclist)->next)
11714    {
11715      segment_info_type *seginfo;
11716      xtensa_block_info *block;
11717      segT sec = *seclist;
11718
11719      seginfo = seg_info (sec);
11720      block = seginfo->tc_segment_info_data.blocks[sec_type];
11721
11722      if (block)
11723	{
11724	  xtensa_block_info *cur_block;
11725	  int num_recs = 0;
11726	  bfd_size_type rec_size;
11727
11728	  for (cur_block = block; cur_block; cur_block = cur_block->next)
11729	    num_recs++;
11730
11731	  rec_size = num_recs * 8;
11732	  bfd_set_section_size (stdoutput, sec, rec_size);
11733
11734	  if (num_recs)
11735	    {
11736	      char *frag_data;
11737	      int i;
11738
11739	      subseg_set (sec, 0);
11740	      frag_data = frag_more (rec_size);
11741	      cur_block = block;
11742	      for (i = 0; i < num_recs; i++)
11743		{
11744		  fixS *fix;
11745
11746		  /* Write the fixup.  */
11747		  gas_assert (cur_block);
11748		  fix = fix_new (frag_now, i * 8, 4,
11749				 section_symbol (cur_block->sec),
11750				 cur_block->offset,
11751				 FALSE, BFD_RELOC_32);
11752		  fix->fx_file = "<internal>";
11753		  fix->fx_line = 0;
11754
11755		  /* Write the length.  */
11756		  md_number_to_chars (&frag_data[4 + i * 8],
11757				      cur_block->size, 4);
11758		  cur_block = cur_block->next;
11759		}
11760	      frag_wane (frag_now);
11761	      frag_new (0);
11762	      frag_wane (frag_now);
11763	    }
11764	}
11765    }
11766}
11767
11768
11769static void
11770xtensa_create_xproperty_segments (frag_flags_fn flag_fn,
11771				  const char *section_name_base,
11772				  xt_section_type sec_type)
11773{
11774  segT *seclist;
11775
11776  /* Walk over all of the current segments.
11777     Walk over each fragment.
11778     For each fragment that has instructions,
11779     build an instruction record (append where possible).  */
11780
11781  for (seclist = &stdoutput->sections;
11782       seclist && *seclist;
11783       seclist = &(*seclist)->next)
11784    {
11785      segT sec = *seclist;
11786
11787      if (exclude_section_from_property_tables (sec))
11788	continue;
11789
11790      if (section_has_xproperty (sec, flag_fn))
11791	{
11792	  segment_info_type *xt_seg_info;
11793	  xtensa_block_info **xt_blocks;
11794	  segT prop_sec = xtensa_make_property_section (sec, section_name_base);
11795
11796	  prop_sec->output_section = prop_sec;
11797	  subseg_set (prop_sec, 0);
11798	  xt_seg_info = seg_info (prop_sec);
11799	  xt_blocks = &xt_seg_info->tc_segment_info_data.blocks[sec_type];
11800
11801	  /* Walk over all of the frchains here and add new sections.  */
11802	  add_xt_prop_frags (sec, xt_blocks, flag_fn);
11803	}
11804    }
11805
11806  /* Now we fill them out....  */
11807
11808  for (seclist = &stdoutput->sections;
11809       seclist && *seclist;
11810       seclist = &(*seclist)->next)
11811    {
11812      segment_info_type *seginfo;
11813      xtensa_block_info *block;
11814      segT sec = *seclist;
11815
11816      seginfo = seg_info (sec);
11817      block = seginfo->tc_segment_info_data.blocks[sec_type];
11818
11819      if (block)
11820	{
11821	  xtensa_block_info *cur_block;
11822	  int num_recs = 0;
11823	  bfd_size_type rec_size;
11824
11825	  for (cur_block = block; cur_block; cur_block = cur_block->next)
11826	    num_recs++;
11827
11828	  rec_size = num_recs * (8 + 4);
11829	  bfd_set_section_size (stdoutput, sec, rec_size);
11830	  /* elf_section_data (sec)->this_hdr.sh_entsize = 12; */
11831
11832	  if (num_recs)
11833	    {
11834	      char *frag_data;
11835	      int i;
11836
11837	      subseg_set (sec, 0);
11838	      frag_data = frag_more (rec_size);
11839	      cur_block = block;
11840	      for (i = 0; i < num_recs; i++)
11841		{
11842		  fixS *fix;
11843
11844		  /* Write the fixup.  */
11845		  gas_assert (cur_block);
11846		  fix = fix_new (frag_now, i * 12, 4,
11847				 section_symbol (cur_block->sec),
11848				 cur_block->offset,
11849				 FALSE, BFD_RELOC_32);
11850		  fix->fx_file = "<internal>";
11851		  fix->fx_line = 0;
11852
11853		  /* Write the length.  */
11854		  md_number_to_chars (&frag_data[4 + i * 12],
11855				      cur_block->size, 4);
11856		  md_number_to_chars (&frag_data[8 + i * 12],
11857				      frag_flags_to_number (&cur_block->flags),
11858				      sizeof (flagword));
11859		  cur_block = cur_block->next;
11860		}
11861	      frag_wane (frag_now);
11862	      frag_new (0);
11863	      frag_wane (frag_now);
11864	    }
11865	}
11866    }
11867}
11868
11869
11870static bfd_boolean
11871exclude_section_from_property_tables (segT sec)
11872{
11873  flagword flags = bfd_get_section_flags (stdoutput, sec);
11874
11875  /* Sections that don't contribute to the memory footprint are excluded.  */
11876  if ((flags & SEC_DEBUGGING)
11877      || !(flags & SEC_ALLOC)
11878      || (flags & SEC_MERGE))
11879    return TRUE;
11880
11881  /* Linker cie and fde optimizations mess up property entries for
11882     eh_frame sections, but there is nothing inside them relevant to
11883     property tables anyway.  */
11884  if (strcmp (sec->name, ".eh_frame") == 0)
11885    return TRUE;
11886
11887  return FALSE;
11888}
11889
11890
11891static bfd_boolean
11892section_has_property (segT sec, frag_predicate property_function)
11893{
11894  segment_info_type *seginfo = seg_info (sec);
11895  fragS *fragP;
11896
11897  if (seginfo && seginfo->frchainP)
11898    {
11899      for (fragP = seginfo->frchainP->frch_root; fragP; fragP = fragP->fr_next)
11900	{
11901	  if (property_function (fragP)
11902	      && (fragP->fr_type != rs_fill || fragP->fr_fix != 0))
11903	    return TRUE;
11904	}
11905    }
11906  return FALSE;
11907}
11908
11909
11910static bfd_boolean
11911section_has_xproperty (segT sec, frag_flags_fn property_function)
11912{
11913  segment_info_type *seginfo = seg_info (sec);
11914  fragS *fragP;
11915
11916  if (seginfo && seginfo->frchainP)
11917    {
11918      for (fragP = seginfo->frchainP->frch_root; fragP; fragP = fragP->fr_next)
11919	{
11920	  frag_flags prop_flags;
11921	  property_function (fragP, &prop_flags);
11922	  if (!xtensa_frag_flags_is_empty (&prop_flags))
11923	    return TRUE;
11924	}
11925    }
11926  return FALSE;
11927}
11928
11929
11930/* Two types of block sections exist right now: literal and insns.  */
11931
11932static void
11933add_xt_block_frags (segT sec,
11934		    xtensa_block_info **xt_block,
11935		    frag_predicate property_function,
11936		    frag_predicate end_property_function)
11937{
11938  fragS *fragP;
11939
11940  /* Build it if needed.  */
11941  while (*xt_block != NULL)
11942    xt_block = &(*xt_block)->next;
11943  /* We are either at NULL at the beginning or at the end.  */
11944
11945  /* Walk through the frags.  */
11946  if (seg_info (sec)->frchainP)
11947    {
11948      for (fragP = seg_info (sec)->frchainP->frch_root;
11949	   fragP;
11950	   fragP = fragP->fr_next)
11951	{
11952	  if (property_function (fragP)
11953	      && (fragP->fr_type != rs_fill || fragP->fr_fix != 0))
11954	    {
11955	      if (*xt_block != NULL)
11956		{
11957		  if ((*xt_block)->offset + (*xt_block)->size
11958		      == fragP->fr_address)
11959		    (*xt_block)->size += fragP->fr_fix;
11960		  else
11961		    xt_block = &((*xt_block)->next);
11962		}
11963	      if (*xt_block == NULL)
11964		{
11965		  xtensa_block_info *new_block = XNEW (xtensa_block_info);
11966		  new_block->sec = sec;
11967		  new_block->offset = fragP->fr_address;
11968		  new_block->size = fragP->fr_fix;
11969		  new_block->next = NULL;
11970		  xtensa_frag_flags_init (&new_block->flags);
11971		  *xt_block = new_block;
11972		}
11973	      if (end_property_function
11974		  && end_property_function (fragP))
11975		{
11976		  xt_block = &((*xt_block)->next);
11977		}
11978	    }
11979	}
11980    }
11981}
11982
11983
11984/* Break the encapsulation of add_xt_prop_frags here.  */
11985
11986static bfd_boolean
11987xtensa_frag_flags_is_empty (const frag_flags *prop_flags)
11988{
11989  if (prop_flags->is_literal
11990      || prop_flags->is_insn
11991      || prop_flags->is_data
11992      || prop_flags->is_unreachable)
11993    return FALSE;
11994  return TRUE;
11995}
11996
11997
11998static void
11999xtensa_frag_flags_init (frag_flags *prop_flags)
12000{
12001  memset (prop_flags, 0, sizeof (frag_flags));
12002}
12003
12004
12005static void
12006get_frag_property_flags (const fragS *fragP, frag_flags *prop_flags)
12007{
12008  xtensa_frag_flags_init (prop_flags);
12009  if (fragP->tc_frag_data.is_literal)
12010    prop_flags->is_literal = TRUE;
12011  if (fragP->tc_frag_data.is_specific_opcode
12012      || fragP->tc_frag_data.is_no_transform)
12013    {
12014      prop_flags->is_no_transform = TRUE;
12015      if (xtensa_frag_flags_is_empty (prop_flags))
12016	prop_flags->is_data = TRUE;
12017    }
12018  if (fragP->tc_frag_data.is_unreachable)
12019    prop_flags->is_unreachable = TRUE;
12020  else if (fragP->tc_frag_data.is_insn)
12021    {
12022      prop_flags->is_insn = TRUE;
12023      if (fragP->tc_frag_data.is_loop_target)
12024	prop_flags->insn.is_loop_target = TRUE;
12025      if (fragP->tc_frag_data.is_branch_target)
12026	prop_flags->insn.is_branch_target = TRUE;
12027      if (fragP->tc_frag_data.is_no_density)
12028	prop_flags->insn.is_no_density = TRUE;
12029      if (fragP->tc_frag_data.use_absolute_literals)
12030	prop_flags->insn.is_abslit = TRUE;
12031    }
12032  if (fragP->tc_frag_data.is_align)
12033    {
12034      prop_flags->is_align = TRUE;
12035      prop_flags->alignment = fragP->tc_frag_data.alignment;
12036      if (xtensa_frag_flags_is_empty (prop_flags))
12037	prop_flags->is_data = TRUE;
12038    }
12039}
12040
12041
12042static flagword
12043frag_flags_to_number (const frag_flags *prop_flags)
12044{
12045  flagword num = 0;
12046  if (prop_flags->is_literal)
12047    num |= XTENSA_PROP_LITERAL;
12048  if (prop_flags->is_insn)
12049    num |= XTENSA_PROP_INSN;
12050  if (prop_flags->is_data)
12051    num |= XTENSA_PROP_DATA;
12052  if (prop_flags->is_unreachable)
12053    num |= XTENSA_PROP_UNREACHABLE;
12054  if (prop_flags->insn.is_loop_target)
12055    num |= XTENSA_PROP_INSN_LOOP_TARGET;
12056  if (prop_flags->insn.is_branch_target)
12057    {
12058      num |= XTENSA_PROP_INSN_BRANCH_TARGET;
12059      num = SET_XTENSA_PROP_BT_ALIGN (num, prop_flags->insn.bt_align_priority);
12060    }
12061
12062  if (prop_flags->insn.is_no_density)
12063    num |= XTENSA_PROP_INSN_NO_DENSITY;
12064  if (prop_flags->is_no_transform)
12065    num |= XTENSA_PROP_NO_TRANSFORM;
12066  if (prop_flags->insn.is_no_reorder)
12067    num |= XTENSA_PROP_INSN_NO_REORDER;
12068  if (prop_flags->insn.is_abslit)
12069    num |= XTENSA_PROP_INSN_ABSLIT;
12070
12071  if (prop_flags->is_align)
12072    {
12073      num |= XTENSA_PROP_ALIGN;
12074      num = SET_XTENSA_PROP_ALIGNMENT (num, prop_flags->alignment);
12075    }
12076
12077  return num;
12078}
12079
12080
12081static bfd_boolean
12082xtensa_frag_flags_combinable (const frag_flags *prop_flags_1,
12083			      const frag_flags *prop_flags_2)
12084{
12085  /* Cannot combine with an end marker.  */
12086
12087  if (prop_flags_1->is_literal != prop_flags_2->is_literal)
12088    return FALSE;
12089  if (prop_flags_1->is_insn != prop_flags_2->is_insn)
12090    return FALSE;
12091  if (prop_flags_1->is_data != prop_flags_2->is_data)
12092    return FALSE;
12093
12094  if (prop_flags_1->is_insn)
12095    {
12096      /* Properties of the beginning of the frag.  */
12097      if (prop_flags_2->insn.is_loop_target)
12098	return FALSE;
12099      if (prop_flags_2->insn.is_branch_target)
12100	return FALSE;
12101      if (prop_flags_1->insn.is_no_density !=
12102	  prop_flags_2->insn.is_no_density)
12103	return FALSE;
12104      if (prop_flags_1->is_no_transform !=
12105	  prop_flags_2->is_no_transform)
12106	return FALSE;
12107      if (prop_flags_1->insn.is_no_reorder !=
12108	  prop_flags_2->insn.is_no_reorder)
12109	return FALSE;
12110      if (prop_flags_1->insn.is_abslit !=
12111	  prop_flags_2->insn.is_abslit)
12112	return FALSE;
12113    }
12114
12115  if (prop_flags_1->is_align)
12116    return FALSE;
12117
12118  return TRUE;
12119}
12120
12121
12122static bfd_vma
12123xt_block_aligned_size (const xtensa_block_info *xt_block)
12124{
12125  bfd_vma end_addr;
12126  unsigned align_bits;
12127
12128  if (!xt_block->flags.is_align)
12129    return xt_block->size;
12130
12131  end_addr = xt_block->offset + xt_block->size;
12132  align_bits = xt_block->flags.alignment;
12133  end_addr = ((end_addr + ((1 << align_bits) -1)) >> align_bits) << align_bits;
12134  return end_addr - xt_block->offset;
12135}
12136
12137
12138static bfd_boolean
12139xtensa_xt_block_combine (xtensa_block_info *xt_block,
12140			 const xtensa_block_info *xt_block_2)
12141{
12142  if (xt_block->sec != xt_block_2->sec)
12143    return FALSE;
12144  if (xt_block->offset + xt_block_aligned_size (xt_block)
12145      != xt_block_2->offset)
12146    return FALSE;
12147
12148  if (xt_block_2->size == 0
12149      && (!xt_block_2->flags.is_unreachable
12150	  || xt_block->flags.is_unreachable))
12151    {
12152      if (xt_block_2->flags.is_align
12153	  && xt_block->flags.is_align)
12154	{
12155	  /* Nothing needed.  */
12156	  if (xt_block->flags.alignment >= xt_block_2->flags.alignment)
12157	    return TRUE;
12158	}
12159      else
12160	{
12161	  if (xt_block_2->flags.is_align)
12162	    {
12163	      /* Push alignment to previous entry.  */
12164	      xt_block->flags.is_align = xt_block_2->flags.is_align;
12165	      xt_block->flags.alignment = xt_block_2->flags.alignment;
12166	    }
12167	  return TRUE;
12168	}
12169    }
12170  if (!xtensa_frag_flags_combinable (&xt_block->flags,
12171				     &xt_block_2->flags))
12172    return FALSE;
12173
12174  xt_block->size += xt_block_2->size;
12175
12176  if (xt_block_2->flags.is_align)
12177    {
12178      xt_block->flags.is_align = TRUE;
12179      xt_block->flags.alignment = xt_block_2->flags.alignment;
12180    }
12181
12182  return TRUE;
12183}
12184
12185
12186static void
12187add_xt_prop_frags (segT sec,
12188		   xtensa_block_info **xt_block,
12189		   frag_flags_fn property_function)
12190{
12191  fragS *fragP;
12192
12193  /* Build it if needed.  */
12194  while (*xt_block != NULL)
12195    {
12196      xt_block = &(*xt_block)->next;
12197    }
12198  /* We are either at NULL at the beginning or at the end.  */
12199
12200  /* Walk through the frags.  */
12201  if (seg_info (sec)->frchainP)
12202    {
12203      for (fragP = seg_info (sec)->frchainP->frch_root; fragP;
12204	   fragP = fragP->fr_next)
12205	{
12206	  xtensa_block_info tmp_block;
12207	  tmp_block.sec = sec;
12208	  tmp_block.offset = fragP->fr_address;
12209	  tmp_block.size = fragP->fr_fix;
12210	  tmp_block.next = NULL;
12211	  property_function (fragP, &tmp_block.flags);
12212
12213	  if (!xtensa_frag_flags_is_empty (&tmp_block.flags))
12214	    /* && fragP->fr_fix != 0) */
12215	    {
12216	      if ((*xt_block) == NULL
12217		  || !xtensa_xt_block_combine (*xt_block, &tmp_block))
12218		{
12219		  xtensa_block_info *new_block;
12220		  if ((*xt_block) != NULL)
12221		    xt_block = &(*xt_block)->next;
12222		  new_block = XNEW (xtensa_block_info);
12223		  *new_block = tmp_block;
12224		  *xt_block = new_block;
12225		}
12226	    }
12227	}
12228    }
12229}
12230
12231
12232/* op_placement_info_table */
12233
12234/* op_placement_info makes it easier to determine which
12235   ops can go in which slots.  */
12236
12237static void
12238init_op_placement_info_table (void)
12239{
12240  xtensa_isa isa = xtensa_default_isa;
12241  xtensa_insnbuf ibuf = xtensa_insnbuf_alloc (isa);
12242  xtensa_opcode opcode;
12243  xtensa_format fmt;
12244  int slot;
12245  int num_opcodes = xtensa_isa_num_opcodes (isa);
12246
12247  op_placement_table = XNEWVEC (op_placement_info, num_opcodes);
12248  gas_assert (xtensa_isa_num_formats (isa) < MAX_FORMATS);
12249
12250  for (opcode = 0; opcode < num_opcodes; opcode++)
12251    {
12252      op_placement_info *opi = &op_placement_table[opcode];
12253      /* FIXME: Make tinsn allocation dynamic.  */
12254      if (xtensa_opcode_num_operands (isa, opcode) > MAX_INSN_ARGS)
12255	as_fatal (_("too many operands in instruction"));
12256      opi->narrowest = XTENSA_UNDEFINED;
12257      opi->narrowest_size = 0x7F;
12258      opi->narrowest_slot = 0;
12259      opi->formats = 0;
12260      opi->num_formats = 0;
12261      opi->issuef = 0;
12262      for (fmt = 0; fmt < xtensa_isa_num_formats (isa); fmt++)
12263	{
12264	  opi->slots[fmt] = 0;
12265	  for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
12266	    {
12267	      if (xtensa_opcode_encode (isa, fmt, slot, ibuf, opcode) == 0)
12268		{
12269		  int fmt_length = xtensa_format_length (isa, fmt);
12270		  opi->issuef++;
12271		  set_bit (fmt, opi->formats);
12272		  set_bit (slot, opi->slots[fmt]);
12273		  if (fmt_length < opi->narrowest_size
12274		      || (fmt_length == opi->narrowest_size
12275			  && (xtensa_format_num_slots (isa, fmt)
12276			      < xtensa_format_num_slots (isa,
12277							 opi->narrowest))))
12278		    {
12279		      opi->narrowest = fmt;
12280		      opi->narrowest_size = fmt_length;
12281		      opi->narrowest_slot = slot;
12282		    }
12283		}
12284	    }
12285	  if (opi->formats)
12286	    opi->num_formats++;
12287	}
12288    }
12289  xtensa_insnbuf_free (isa, ibuf);
12290}
12291
12292
12293bfd_boolean
12294opcode_fits_format_slot (xtensa_opcode opcode, xtensa_format fmt, int slot)
12295{
12296  return bit_is_set (slot, op_placement_table[opcode].slots[fmt]);
12297}
12298
12299
12300/* If the opcode is available in a single slot format, return its size.  */
12301
12302static int
12303xg_get_single_size (xtensa_opcode opcode)
12304{
12305  return op_placement_table[opcode].narrowest_size;
12306}
12307
12308
12309static xtensa_format
12310xg_get_single_format (xtensa_opcode opcode)
12311{
12312  return op_placement_table[opcode].narrowest;
12313}
12314
12315
12316static int
12317xg_get_single_slot (xtensa_opcode opcode)
12318{
12319  return op_placement_table[opcode].narrowest_slot;
12320}
12321
12322
12323/* Instruction Stack Functions (from "xtensa-istack.h").  */
12324
12325void
12326istack_init (IStack *stack)
12327{
12328  stack->ninsn = 0;
12329}
12330
12331
12332bfd_boolean
12333istack_empty (IStack *stack)
12334{
12335  return (stack->ninsn == 0);
12336}
12337
12338
12339bfd_boolean
12340istack_full (IStack *stack)
12341{
12342  return (stack->ninsn == MAX_ISTACK);
12343}
12344
12345
12346/* Return a pointer to the top IStack entry.
12347   It is an error to call this if istack_empty () is TRUE. */
12348
12349TInsn *
12350istack_top (IStack *stack)
12351{
12352  int rec = stack->ninsn - 1;
12353  gas_assert (!istack_empty (stack));
12354  return &stack->insn[rec];
12355}
12356
12357
12358/* Add a new TInsn to an IStack.
12359   It is an error to call this if istack_full () is TRUE.  */
12360
12361void
12362istack_push (IStack *stack, TInsn *insn)
12363{
12364  int rec = stack->ninsn;
12365  gas_assert (!istack_full (stack));
12366  stack->insn[rec] = *insn;
12367  stack->ninsn++;
12368}
12369
12370
12371/* Clear space for the next TInsn on the IStack and return a pointer
12372   to it.  It is an error to call this if istack_full () is TRUE.  */
12373
12374TInsn *
12375istack_push_space (IStack *stack)
12376{
12377  int rec = stack->ninsn;
12378  TInsn *insn;
12379  gas_assert (!istack_full (stack));
12380  insn = &stack->insn[rec];
12381  tinsn_init (insn);
12382  stack->ninsn++;
12383  return insn;
12384}
12385
12386
12387/* Remove the last pushed instruction.  It is an error to call this if
12388   istack_empty () returns TRUE.  */
12389
12390void
12391istack_pop (IStack *stack)
12392{
12393  int rec = stack->ninsn - 1;
12394  gas_assert (!istack_empty (stack));
12395  stack->ninsn--;
12396  tinsn_init (&stack->insn[rec]);
12397}
12398
12399
12400/* TInsn functions.  */
12401
12402void
12403tinsn_init (TInsn *dst)
12404{
12405  memset (dst, 0, sizeof (TInsn));
12406}
12407
12408
12409/* Return TRUE if ANY of the operands in the insn are symbolic.  */
12410
12411static bfd_boolean
12412tinsn_has_symbolic_operands (const TInsn *insn)
12413{
12414  int i;
12415  int n = insn->ntok;
12416
12417  gas_assert (insn->insn_type == ITYPE_INSN);
12418
12419  for (i = 0; i < n; ++i)
12420    {
12421      switch (insn->tok[i].X_op)
12422	{
12423	case O_register:
12424	case O_constant:
12425	  break;
12426	default:
12427	  return TRUE;
12428	}
12429    }
12430  return FALSE;
12431}
12432
12433
12434bfd_boolean
12435tinsn_has_invalid_symbolic_operands (const TInsn *insn)
12436{
12437  xtensa_isa isa = xtensa_default_isa;
12438  int i;
12439  int n = insn->ntok;
12440
12441  gas_assert (insn->insn_type == ITYPE_INSN);
12442
12443  for (i = 0; i < n; ++i)
12444    {
12445      switch (insn->tok[i].X_op)
12446	{
12447	case O_register:
12448	case O_constant:
12449	  break;
12450	case O_big:
12451	case O_illegal:
12452	case O_absent:
12453	  /* Errors for these types are caught later.  */
12454	  break;
12455	case O_hi16:
12456	case O_lo16:
12457	default:
12458	  /* Symbolic immediates are only allowed on the last immediate
12459	     operand.  At this time, CONST16 is the only opcode where we
12460	     support non-PC-relative relocations.  */
12461	  if (i != get_relaxable_immed (insn->opcode)
12462	      || (xtensa_operand_is_PCrelative (isa, insn->opcode, i) != 1
12463		  && insn->opcode != xtensa_const16_opcode))
12464	    {
12465	      as_bad (_("invalid symbolic operand"));
12466	      return TRUE;
12467	    }
12468	}
12469    }
12470  return FALSE;
12471}
12472
12473
12474/* For assembly code with complex expressions (e.g. subtraction),
12475   we have to build them in the literal pool so that
12476   their results are calculated correctly after relaxation.
12477   The relaxation only handles expressions that
12478   boil down to SYMBOL + OFFSET.  */
12479
12480static bfd_boolean
12481tinsn_has_complex_operands (const TInsn *insn)
12482{
12483  int i;
12484  int n = insn->ntok;
12485  gas_assert (insn->insn_type == ITYPE_INSN);
12486  for (i = 0; i < n; ++i)
12487    {
12488      switch (insn->tok[i].X_op)
12489	{
12490	case O_register:
12491	case O_constant:
12492	case O_symbol:
12493	case O_lo16:
12494	case O_hi16:
12495	  break;
12496	default:
12497	  return TRUE;
12498	}
12499    }
12500  return FALSE;
12501}
12502
12503
12504/* Encode a TInsn opcode and its constant operands into slotbuf.
12505   Return TRUE if there is a symbol in the immediate field.  This
12506   function assumes that:
12507   1) The number of operands are correct.
12508   2) The insn_type is ITYPE_INSN.
12509   3) The opcode can be encoded in the specified format and slot.
12510   4) Operands are either O_constant or O_symbol, and all constants fit.  */
12511
12512static bfd_boolean
12513tinsn_to_slotbuf (xtensa_format fmt,
12514		  int slot,
12515		  TInsn *tinsn,
12516		  xtensa_insnbuf slotbuf)
12517{
12518  xtensa_isa isa = xtensa_default_isa;
12519  xtensa_opcode opcode = tinsn->opcode;
12520  bfd_boolean has_fixup = FALSE;
12521  int noperands = xtensa_opcode_num_operands (isa, opcode);
12522  int i;
12523
12524  gas_assert (tinsn->insn_type == ITYPE_INSN);
12525  if (noperands != tinsn->ntok)
12526    as_fatal (_("operand number mismatch"));
12527
12528  if (xtensa_opcode_encode (isa, fmt, slot, slotbuf, opcode))
12529    {
12530      as_bad (_("cannot encode opcode \"%s\" in the given format \"%s\""),
12531	      xtensa_opcode_name (isa, opcode), xtensa_format_name (isa, fmt));
12532      return FALSE;
12533    }
12534
12535  for (i = 0; i < noperands; i++)
12536    {
12537      expressionS *exp = &tinsn->tok[i];
12538      int rc;
12539      unsigned line;
12540      const char *file_name;
12541      uint32 opnd_value;
12542
12543      switch (exp->X_op)
12544	{
12545	case O_register:
12546	  if (xtensa_operand_is_visible (isa, opcode, i) == 0)
12547	    break;
12548	  /* The register number has already been checked in
12549	     expression_maybe_register, so we don't need to check here.  */
12550	  opnd_value = exp->X_add_number;
12551	  (void) xtensa_operand_encode (isa, opcode, i, &opnd_value);
12552	  rc = xtensa_operand_set_field (isa, opcode, i, fmt, slot, slotbuf,
12553					 opnd_value);
12554	  if (rc != 0)
12555	    as_warn (_("xtensa-isa failure: %s"), xtensa_isa_error_msg (isa));
12556	  break;
12557
12558	case O_constant:
12559	  if (xtensa_operand_is_visible (isa, opcode, i) == 0)
12560	    break;
12561	  file_name = as_where (&line);
12562	  /* It is a constant and we called this function
12563	     then we have to try to fit it.  */
12564	  xtensa_insnbuf_set_operand (slotbuf, fmt, slot, opcode, i,
12565				      exp->X_add_number, file_name, line);
12566	  break;
12567
12568	default:
12569	  has_fixup = TRUE;
12570	  break;
12571	}
12572    }
12573
12574  return has_fixup;
12575}
12576
12577
12578/* Encode a single TInsn into an insnbuf.  If the opcode can only be encoded
12579   into a multi-slot instruction, fill the other slots with NOPs.
12580   Return TRUE if there is a symbol in the immediate field.  See also the
12581   assumptions listed for tinsn_to_slotbuf.  */
12582
12583static bfd_boolean
12584tinsn_to_insnbuf (TInsn *tinsn, xtensa_insnbuf insnbuf)
12585{
12586  static xtensa_insnbuf slotbuf = 0;
12587  static vliw_insn vinsn;
12588  xtensa_isa isa = xtensa_default_isa;
12589  bfd_boolean has_fixup = FALSE;
12590  int i;
12591
12592  if (!slotbuf)
12593    {
12594      slotbuf = xtensa_insnbuf_alloc (isa);
12595      xg_init_vinsn (&vinsn);
12596    }
12597
12598  xg_clear_vinsn (&vinsn);
12599
12600  bundle_tinsn (tinsn, &vinsn);
12601
12602  xtensa_format_encode (isa, vinsn.format, insnbuf);
12603
12604  for (i = 0; i < vinsn.num_slots; i++)
12605    {
12606      /* Only one slot may have a fix-up because the rest contains NOPs.  */
12607      has_fixup |=
12608	tinsn_to_slotbuf (vinsn.format, i, &vinsn.slots[i], vinsn.slotbuf[i]);
12609      xtensa_format_set_slot (isa, vinsn.format, i, insnbuf, vinsn.slotbuf[i]);
12610    }
12611
12612  return has_fixup;
12613}
12614
12615
12616/* Check the instruction arguments.  Return TRUE on failure.  */
12617
12618static bfd_boolean
12619tinsn_check_arguments (const TInsn *insn)
12620{
12621  xtensa_isa isa = xtensa_default_isa;
12622  xtensa_opcode opcode = insn->opcode;
12623  xtensa_regfile t1_regfile, t2_regfile;
12624  int t1_reg, t2_reg;
12625  int t1_base_reg, t1_last_reg;
12626  int t2_base_reg, t2_last_reg;
12627  char t1_inout, t2_inout;
12628  int i, j;
12629
12630  if (opcode == XTENSA_UNDEFINED)
12631    {
12632      as_bad (_("invalid opcode"));
12633      return TRUE;
12634    }
12635
12636  if (xtensa_opcode_num_operands (isa, opcode) > insn->ntok)
12637    {
12638      as_bad (_("too few operands"));
12639      return TRUE;
12640    }
12641
12642  if (xtensa_opcode_num_operands (isa, opcode) < insn->ntok)
12643    {
12644      as_bad (_("too many operands"));
12645      return TRUE;
12646    }
12647
12648  /* Check registers.  */
12649  for (j = 0; j < insn->ntok; j++)
12650    {
12651      if (xtensa_operand_is_register (isa, insn->opcode, j) != 1)
12652	continue;
12653
12654      t2_regfile = xtensa_operand_regfile (isa, insn->opcode, j);
12655      t2_base_reg = insn->tok[j].X_add_number;
12656      t2_last_reg
12657	= t2_base_reg + xtensa_operand_num_regs (isa, insn->opcode, j);
12658
12659      for (i = 0; i < insn->ntok; i++)
12660	{
12661	  if (i == j)
12662	    continue;
12663
12664	  if (xtensa_operand_is_register (isa, insn->opcode, i) != 1)
12665	    continue;
12666
12667	  t1_regfile = xtensa_operand_regfile (isa, insn->opcode, i);
12668
12669	  if (t1_regfile != t2_regfile)
12670	    continue;
12671
12672	  t1_inout = xtensa_operand_inout (isa, insn->opcode, i);
12673	  t2_inout = xtensa_operand_inout (isa, insn->opcode, j);
12674
12675	  t1_base_reg = insn->tok[i].X_add_number;
12676	  t1_last_reg = (t1_base_reg
12677			 + xtensa_operand_num_regs (isa, insn->opcode, i));
12678
12679	  for (t1_reg = t1_base_reg; t1_reg < t1_last_reg; t1_reg++)
12680	    {
12681	      for (t2_reg = t2_base_reg; t2_reg < t2_last_reg; t2_reg++)
12682		{
12683		  if (t1_reg != t2_reg)
12684		    continue;
12685
12686		  if (t1_inout != 'i' && t2_inout != 'i')
12687		    {
12688		      as_bad (_("multiple writes to the same register"));
12689		      return TRUE;
12690		    }
12691		}
12692	    }
12693	}
12694    }
12695  return FALSE;
12696}
12697
12698
12699/* Load an instruction from its encoded form.  */
12700
12701static void
12702tinsn_from_chars (TInsn *tinsn, char *f, int slot)
12703{
12704  vliw_insn vinsn;
12705
12706  xg_init_vinsn (&vinsn);
12707  vinsn_from_chars (&vinsn, f);
12708
12709  *tinsn = vinsn.slots[slot];
12710  xg_free_vinsn (&vinsn);
12711}
12712
12713
12714static void
12715tinsn_from_insnbuf (TInsn *tinsn,
12716		    xtensa_insnbuf slotbuf,
12717		    xtensa_format fmt,
12718		    int slot)
12719{
12720  int i;
12721  xtensa_isa isa = xtensa_default_isa;
12722
12723  /* Find the immed.  */
12724  tinsn_init (tinsn);
12725  tinsn->insn_type = ITYPE_INSN;
12726  tinsn->is_specific_opcode = FALSE;	/* must not be specific */
12727  tinsn->opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
12728  tinsn->ntok = xtensa_opcode_num_operands (isa, tinsn->opcode);
12729  for (i = 0; i < tinsn->ntok; i++)
12730    {
12731      set_expr_const (&tinsn->tok[i],
12732		      xtensa_insnbuf_get_operand (slotbuf, fmt, slot,
12733						  tinsn->opcode, i));
12734    }
12735}
12736
12737
12738/* Read the value of the relaxable immed from the fr_symbol and fr_offset.  */
12739
12740static void
12741tinsn_immed_from_frag (TInsn *tinsn, fragS *fragP, int slot)
12742{
12743  xtensa_opcode opcode = tinsn->opcode;
12744  int opnum;
12745
12746  if (fragP->tc_frag_data.slot_symbols[slot])
12747    {
12748      opnum = get_relaxable_immed (opcode);
12749      gas_assert (opnum >= 0);
12750      set_expr_symbol_offset (&tinsn->tok[opnum],
12751			      fragP->tc_frag_data.slot_symbols[slot],
12752			      fragP->tc_frag_data.slot_offsets[slot]);
12753    }
12754  tinsn->extra_arg = fragP->tc_frag_data.free_reg[slot];
12755}
12756
12757
12758static int
12759get_num_stack_text_bytes (IStack *istack)
12760{
12761  int i;
12762  int text_bytes = 0;
12763
12764  for (i = 0; i < istack->ninsn; i++)
12765    {
12766      TInsn *tinsn = &istack->insn[i];
12767      if (tinsn->insn_type == ITYPE_INSN)
12768	text_bytes += xg_get_single_size (tinsn->opcode);
12769    }
12770  return text_bytes;
12771}
12772
12773
12774static int
12775get_num_stack_literal_bytes (IStack *istack)
12776{
12777  int i;
12778  int lit_bytes = 0;
12779
12780  for (i = 0; i < istack->ninsn; i++)
12781    {
12782      TInsn *tinsn = &istack->insn[i];
12783      if (tinsn->insn_type == ITYPE_LITERAL && tinsn->ntok == 1)
12784	lit_bytes += 4;
12785    }
12786  return lit_bytes;
12787}
12788
12789
12790/* vliw_insn functions.  */
12791
12792static void
12793xg_init_vinsn (vliw_insn *v)
12794{
12795  int i;
12796  xtensa_isa isa = xtensa_default_isa;
12797
12798  xg_clear_vinsn (v);
12799
12800  v->insnbuf = xtensa_insnbuf_alloc (isa);
12801  if (v->insnbuf == NULL)
12802    as_fatal (_("out of memory"));
12803
12804  for (i = 0; i < config_max_slots; i++)
12805    {
12806      v->slotbuf[i] = xtensa_insnbuf_alloc (isa);
12807      if (v->slotbuf[i] == NULL)
12808	as_fatal (_("out of memory"));
12809    }
12810}
12811
12812
12813static void
12814xg_clear_vinsn (vliw_insn *v)
12815{
12816  int i;
12817
12818  memset (v, 0, offsetof (vliw_insn, slots)
12819                + sizeof(TInsn) * config_max_slots);
12820
12821  v->format = XTENSA_UNDEFINED;
12822  v->num_slots = 0;
12823  v->inside_bundle = FALSE;
12824
12825  if (xt_saved_debug_type != DEBUG_NONE)
12826    debug_type = xt_saved_debug_type;
12827
12828  for (i = 0; i < config_max_slots; i++)
12829    v->slots[i].opcode = XTENSA_UNDEFINED;
12830}
12831
12832
12833static void
12834xg_copy_vinsn (vliw_insn *dst, vliw_insn *src)
12835{
12836  memcpy (dst, src,
12837	  offsetof(vliw_insn, slots) + src->num_slots * sizeof(TInsn));
12838  dst->insnbuf = src->insnbuf;
12839  memcpy (dst->slotbuf, src->slotbuf, src->num_slots * sizeof(xtensa_insnbuf));
12840}
12841
12842
12843static bfd_boolean
12844vinsn_has_specific_opcodes (vliw_insn *v)
12845{
12846  int i;
12847
12848  for (i = 0; i < v->num_slots; i++)
12849    {
12850      if (v->slots[i].is_specific_opcode)
12851	return TRUE;
12852    }
12853  return FALSE;
12854}
12855
12856
12857static void
12858xg_free_vinsn (vliw_insn *v)
12859{
12860  int i;
12861  xtensa_insnbuf_free (xtensa_default_isa, v->insnbuf);
12862  for (i = 0; i < config_max_slots; i++)
12863    xtensa_insnbuf_free (xtensa_default_isa, v->slotbuf[i]);
12864}
12865
12866
12867/* Encode a vliw_insn into an insnbuf.  Return TRUE if there are any symbolic
12868   operands.  See also the assumptions listed for tinsn_to_slotbuf.  */
12869
12870static bfd_boolean
12871vinsn_to_insnbuf (vliw_insn *vinsn,
12872		  char *frag_offset,
12873		  fragS *fragP,
12874		  bfd_boolean record_fixup)
12875{
12876  xtensa_isa isa = xtensa_default_isa;
12877  xtensa_format fmt = vinsn->format;
12878  xtensa_insnbuf insnbuf = vinsn->insnbuf;
12879  int slot;
12880  bfd_boolean has_fixup = FALSE;
12881
12882  xtensa_format_encode (isa, fmt, insnbuf);
12883
12884  for (slot = 0; slot < vinsn->num_slots; slot++)
12885    {
12886      TInsn *tinsn = &vinsn->slots[slot];
12887      expressionS *extra_arg = &tinsn->extra_arg;
12888      bfd_boolean tinsn_has_fixup =
12889	tinsn_to_slotbuf (vinsn->format, slot, tinsn,
12890			  vinsn->slotbuf[slot]);
12891
12892      xtensa_format_set_slot (isa, fmt, slot,
12893			      insnbuf, vinsn->slotbuf[slot]);
12894      if (extra_arg->X_op != O_illegal && extra_arg->X_op != O_register)
12895	{
12896	  if (vinsn->num_slots != 1)
12897	    as_bad (_("TLS relocation not allowed in FLIX bundle"));
12898	  else if (record_fixup)
12899	    /* Instructions that generate TLS relocations should always be
12900	       relaxed in the front-end.  If "record_fixup" is set, then this
12901	       function is being called during back-end relaxation, so flag
12902	       the unexpected behavior as an error.  */
12903	    as_bad (_("unexpected TLS relocation"));
12904	  else
12905	    fix_new (fragP, frag_offset - fragP->fr_literal,
12906		     xtensa_format_length (isa, fmt),
12907		     extra_arg->X_add_symbol, extra_arg->X_add_number,
12908		     FALSE, map_operator_to_reloc (extra_arg->X_op, FALSE));
12909	}
12910      if (tinsn_has_fixup)
12911	{
12912	  int i;
12913	  xtensa_opcode opcode = tinsn->opcode;
12914	  int noperands = xtensa_opcode_num_operands (isa, opcode);
12915	  has_fixup = TRUE;
12916
12917	  for (i = 0; i < noperands; i++)
12918	    {
12919	      expressionS* exp = &tinsn->tok[i];
12920	      switch (exp->X_op)
12921		{
12922		case O_symbol:
12923		case O_lo16:
12924		case O_hi16:
12925		  if (get_relaxable_immed (opcode) == i)
12926		    {
12927		      /* Add a fix record for the instruction, except if this
12928			 function is being called prior to relaxation, i.e.,
12929			 if record_fixup is false, and the instruction might
12930			 be relaxed later.  */
12931		      if (record_fixup
12932			  || tinsn->is_specific_opcode
12933			  || !xg_is_relaxable_insn (tinsn, 0))
12934			{
12935			  xg_add_opcode_fix (tinsn, i, fmt, slot, exp, fragP,
12936					     frag_offset - fragP->fr_literal);
12937			}
12938		      else
12939			{
12940			  if (exp->X_op != O_symbol)
12941			    as_bad (_("invalid operand"));
12942			  tinsn->symbol = exp->X_add_symbol;
12943			  tinsn->offset = exp->X_add_number;
12944			}
12945		    }
12946		  else
12947		    as_bad (_("symbolic operand not allowed"));
12948		  break;
12949
12950		case O_constant:
12951		case O_register:
12952		  break;
12953
12954		default:
12955		  as_bad (_("expression too complex"));
12956		  break;
12957		}
12958	    }
12959	}
12960    }
12961
12962  return has_fixup;
12963}
12964
12965
12966static void
12967vinsn_from_chars (vliw_insn *vinsn, char *f)
12968{
12969  static xtensa_insnbuf insnbuf = NULL;
12970  static xtensa_insnbuf slotbuf = NULL;
12971  int i;
12972  xtensa_format fmt;
12973  xtensa_isa isa = xtensa_default_isa;
12974
12975  if (!insnbuf)
12976    {
12977      insnbuf = xtensa_insnbuf_alloc (isa);
12978      slotbuf = xtensa_insnbuf_alloc (isa);
12979    }
12980
12981  xtensa_insnbuf_from_chars (isa, insnbuf, (unsigned char *) f, 0);
12982  fmt = xtensa_format_decode (isa, insnbuf);
12983  if (fmt == XTENSA_UNDEFINED)
12984    as_fatal (_("cannot decode instruction format"));
12985  vinsn->format = fmt;
12986  vinsn->num_slots = xtensa_format_num_slots (isa, fmt);
12987
12988  for (i = 0; i < vinsn->num_slots; i++)
12989    {
12990      TInsn *tinsn = &vinsn->slots[i];
12991      xtensa_format_get_slot (isa, fmt, i, insnbuf, slotbuf);
12992      tinsn_from_insnbuf (tinsn, slotbuf, fmt, i);
12993    }
12994}
12995
12996
12997/* Expression utilities.  */
12998
12999/* Return TRUE if the expression is an integer constant.  */
13000
13001bfd_boolean
13002expr_is_const (const expressionS *s)
13003{
13004  return (s->X_op == O_constant);
13005}
13006
13007
13008/* Get the expression constant.
13009   Calling this is illegal if expr_is_const () returns TRUE.  */
13010
13011offsetT
13012get_expr_const (const expressionS *s)
13013{
13014  gas_assert (expr_is_const (s));
13015  return s->X_add_number;
13016}
13017
13018
13019/* Set the expression to a constant value.  */
13020
13021void
13022set_expr_const (expressionS *s, offsetT val)
13023{
13024  s->X_op = O_constant;
13025  s->X_add_number = val;
13026  s->X_add_symbol = NULL;
13027  s->X_op_symbol = NULL;
13028}
13029
13030
13031bfd_boolean
13032expr_is_register (const expressionS *s)
13033{
13034  return (s->X_op == O_register);
13035}
13036
13037
13038/* Get the expression constant.
13039   Calling this is illegal if expr_is_const () returns TRUE.  */
13040
13041offsetT
13042get_expr_register (const expressionS *s)
13043{
13044  gas_assert (expr_is_register (s));
13045  return s->X_add_number;
13046}
13047
13048
13049/* Set the expression to a symbol + constant offset.  */
13050
13051void
13052set_expr_symbol_offset (expressionS *s, symbolS *sym, offsetT offset)
13053{
13054  s->X_op = O_symbol;
13055  s->X_add_symbol = sym;
13056  s->X_op_symbol = NULL;	/* unused */
13057  s->X_add_number = offset;
13058}
13059
13060
13061/* Return TRUE if the two expressions are equal.  */
13062
13063bfd_boolean
13064expr_is_equal (expressionS *s1, expressionS *s2)
13065{
13066  if (s1->X_op != s2->X_op)
13067    return FALSE;
13068  if (s1->X_add_symbol != s2->X_add_symbol)
13069    return FALSE;
13070  if (s1->X_op_symbol != s2->X_op_symbol)
13071    return FALSE;
13072  if (s1->X_add_number != s2->X_add_number)
13073    return FALSE;
13074  return TRUE;
13075}
13076
13077
13078static void
13079copy_expr (expressionS *dst, const expressionS *src)
13080{
13081  memcpy (dst, src, sizeof (expressionS));
13082}
13083
13084
13085/* Support for the "--rename-section" option.  */
13086
13087struct rename_section_struct
13088{
13089  const char *old_name;
13090  char *new_name;
13091  struct rename_section_struct *next;
13092};
13093
13094static struct rename_section_struct *section_rename;
13095
13096
13097/* Parse the string "oldname=new_name(:oldname2=new_name2)*" and add
13098   entries to the section_rename list.  Note: Specifying multiple
13099   renamings separated by colons is not documented and is retained only
13100   for backward compatibility.  */
13101
13102static void
13103build_section_rename (const char *arg)
13104{
13105  struct rename_section_struct *r;
13106  char *this_arg = NULL;
13107  char *next_arg = NULL;
13108
13109  for (this_arg = xstrdup (arg); this_arg != NULL; this_arg = next_arg)
13110    {
13111      char *old_name, *new_name;
13112
13113      if (this_arg)
13114	{
13115	  next_arg = strchr (this_arg, ':');
13116	  if (next_arg)
13117	    {
13118	      *next_arg = '\0';
13119	      next_arg++;
13120	    }
13121	}
13122
13123      old_name = this_arg;
13124      new_name = strchr (this_arg, '=');
13125
13126      if (*old_name == '\0')
13127	{
13128	  as_warn (_("ignoring extra '-rename-section' delimiter ':'"));
13129	  continue;
13130	}
13131      if (!new_name || new_name[1] == '\0')
13132	{
13133	  as_warn (_("ignoring invalid '-rename-section' specification: '%s'"),
13134		   old_name);
13135	  continue;
13136	}
13137      *new_name = '\0';
13138      new_name++;
13139
13140      /* Check for invalid section renaming.  */
13141      for (r = section_rename; r != NULL; r = r->next)
13142	{
13143	  if (strcmp (r->old_name, old_name) == 0)
13144	    as_bad (_("section %s renamed multiple times"), old_name);
13145	  if (strcmp (r->new_name, new_name) == 0)
13146	    as_bad (_("multiple sections remapped to output section %s"),
13147		    new_name);
13148	}
13149
13150      /* Now add it.  */
13151      r = XNEW (struct rename_section_struct);
13152      r->old_name = xstrdup (old_name);
13153      r->new_name = xstrdup (new_name);
13154      r->next = section_rename;
13155      section_rename = r;
13156    }
13157}
13158
13159
13160char *
13161xtensa_section_rename (const char *name)
13162{
13163  struct rename_section_struct *r = section_rename;
13164
13165  for (r = section_rename; r != NULL; r = r->next)
13166    {
13167      if (strcmp (r->old_name, name) == 0)
13168	return r->new_name;
13169    }
13170
13171  return (char *) name;
13172}
13173