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