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