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