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