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