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