OSDN Git Service

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