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