tc-xtensa.c revision 1.1 1 1.1 skrll /* tc-xtensa.c -- Assemble Xtensa instructions.
2 1.1 skrll Copyright 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
3 1.1 skrll
4 1.1 skrll This file is part of GAS, the GNU Assembler.
5 1.1 skrll
6 1.1 skrll GAS is free software; you can redistribute it and/or modify
7 1.1 skrll it under the terms of the GNU General Public License as published by
8 1.1 skrll the Free Software Foundation; either version 3, or (at your option)
9 1.1 skrll any later version.
10 1.1 skrll
11 1.1 skrll GAS is distributed in the hope that it will be useful,
12 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
13 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 1.1 skrll GNU General Public License for more details.
15 1.1 skrll
16 1.1 skrll You should have received a copy of the GNU General Public License
17 1.1 skrll along with GAS; see the file COPYING. If not, write to
18 1.1 skrll the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
19 1.1 skrll MA 02110-1301, USA. */
20 1.1 skrll
21 1.1 skrll #include <limits.h>
22 1.1 skrll #include "as.h"
23 1.1 skrll #include "sb.h"
24 1.1 skrll #include "safe-ctype.h"
25 1.1 skrll #include "tc-xtensa.h"
26 1.1 skrll #include "subsegs.h"
27 1.1 skrll #include "xtensa-relax.h"
28 1.1 skrll #include "dwarf2dbg.h"
29 1.1 skrll #include "xtensa-istack.h"
30 1.1 skrll #include "struc-symbol.h"
31 1.1 skrll #include "xtensa-config.h"
32 1.1 skrll
33 1.1 skrll /* Provide default values for new configuration settings. */
34 1.1 skrll #ifndef XSHAL_ABI
35 1.1 skrll #define XSHAL_ABI 0
36 1.1 skrll #endif
37 1.1 skrll
38 1.1 skrll #ifndef uint32
39 1.1 skrll #define uint32 unsigned int
40 1.1 skrll #endif
41 1.1 skrll #ifndef int32
42 1.1 skrll #define int32 signed int
43 1.1 skrll #endif
44 1.1 skrll
45 1.1 skrll /* Notes:
46 1.1 skrll
47 1.1 skrll Naming conventions (used somewhat inconsistently):
48 1.1 skrll The xtensa_ functions are exported
49 1.1 skrll The xg_ functions are internal
50 1.1 skrll
51 1.1 skrll We also have a couple of different extensibility mechanisms.
52 1.1 skrll 1) The idiom replacement:
53 1.1 skrll This is used when a line is first parsed to
54 1.1 skrll replace an instruction pattern with another instruction
55 1.1 skrll It is currently limited to replacements of instructions
56 1.1 skrll with constant operands.
57 1.1 skrll 2) The xtensa-relax.c mechanism that has stronger instruction
58 1.1 skrll replacement patterns. When an instruction's immediate field
59 1.1 skrll does not fit the next instruction sequence is attempted.
60 1.1 skrll In addition, "narrow" opcodes are supported this way. */
61 1.1 skrll
62 1.1 skrll
63 1.1 skrll /* Define characters with special meanings to GAS. */
64 1.1 skrll const char comment_chars[] = "#";
65 1.1 skrll const char line_comment_chars[] = "#";
66 1.1 skrll const char line_separator_chars[] = ";";
67 1.1 skrll const char EXP_CHARS[] = "eE";
68 1.1 skrll const char FLT_CHARS[] = "rRsSfFdDxXpP";
69 1.1 skrll
70 1.1 skrll
71 1.1 skrll /* Flags to indicate whether the hardware supports the density and
72 1.1 skrll absolute literals options. */
73 1.1 skrll
74 1.1 skrll bfd_boolean density_supported = XCHAL_HAVE_DENSITY;
75 1.1 skrll bfd_boolean absolute_literals_supported = XSHAL_USE_ABSOLUTE_LITERALS;
76 1.1 skrll
77 1.1 skrll /* Maximum width we would pad an unreachable frag to get alignment. */
78 1.1 skrll #define UNREACHABLE_MAX_WIDTH 8
79 1.1 skrll
80 1.1 skrll static vliw_insn cur_vinsn;
81 1.1 skrll
82 1.1 skrll unsigned xtensa_num_pipe_stages;
83 1.1 skrll unsigned xtensa_fetch_width = XCHAL_INST_FETCH_WIDTH;
84 1.1 skrll
85 1.1 skrll static enum debug_info_type xt_saved_debug_type = DEBUG_NONE;
86 1.1 skrll
87 1.1 skrll /* Some functions are only valid in the front end. This variable
88 1.1 skrll allows us to assert that we haven't crossed over into the
89 1.1 skrll back end. */
90 1.1 skrll static bfd_boolean past_xtensa_end = FALSE;
91 1.1 skrll
92 1.1 skrll /* Flags for properties of the last instruction in a segment. */
93 1.1 skrll #define FLAG_IS_A0_WRITER 0x1
94 1.1 skrll #define FLAG_IS_BAD_LOOPEND 0x2
95 1.1 skrll
96 1.1 skrll
97 1.1 skrll /* We define a special segment names ".literal" to place literals
98 1.1 skrll into. The .fini and .init sections are special because they
99 1.1 skrll contain code that is moved together by the linker. We give them
100 1.1 skrll their own special .fini.literal and .init.literal sections. */
101 1.1 skrll
102 1.1 skrll #define LITERAL_SECTION_NAME xtensa_section_rename (".literal")
103 1.1 skrll #define LIT4_SECTION_NAME xtensa_section_rename (".lit4")
104 1.1 skrll #define INIT_SECTION_NAME xtensa_section_rename (".init")
105 1.1 skrll #define FINI_SECTION_NAME xtensa_section_rename (".fini")
106 1.1 skrll
107 1.1 skrll
108 1.1 skrll /* This type is used for the directive_stack to keep track of the
109 1.1 skrll state of the literal collection pools. If lit_prefix is set, it is
110 1.1 skrll used to determine the literal section names; otherwise, the literal
111 1.1 skrll sections are determined based on the current text section. The
112 1.1 skrll lit_seg and lit4_seg fields cache these literal sections, with the
113 1.1 skrll current_text_seg field used a tag to indicate whether the cached
114 1.1 skrll values are valid. */
115 1.1 skrll
116 1.1 skrll typedef struct lit_state_struct
117 1.1 skrll {
118 1.1 skrll char *lit_prefix;
119 1.1 skrll segT current_text_seg;
120 1.1 skrll segT lit_seg;
121 1.1 skrll segT lit4_seg;
122 1.1 skrll } lit_state;
123 1.1 skrll
124 1.1 skrll static lit_state default_lit_sections;
125 1.1 skrll
126 1.1 skrll
127 1.1 skrll /* We keep a list of literal segments. The seg_list type is the node
128 1.1 skrll for this list. The literal_head pointer is the head of the list,
129 1.1 skrll with the literal_head_h dummy node at the start. */
130 1.1 skrll
131 1.1 skrll typedef struct seg_list_struct
132 1.1 skrll {
133 1.1 skrll struct seg_list_struct *next;
134 1.1 skrll segT seg;
135 1.1 skrll } seg_list;
136 1.1 skrll
137 1.1 skrll static seg_list literal_head_h;
138 1.1 skrll static seg_list *literal_head = &literal_head_h;
139 1.1 skrll
140 1.1 skrll
141 1.1 skrll /* Lists of symbols. We keep a list of symbols that label the current
142 1.1 skrll instruction, so that we can adjust the symbols when inserting alignment
143 1.1 skrll for various instructions. We also keep a list of all the symbols on
144 1.1 skrll literals, so that we can fix up those symbols when the literals are
145 1.1 skrll later moved into the text sections. */
146 1.1 skrll
147 1.1 skrll typedef struct sym_list_struct
148 1.1 skrll {
149 1.1 skrll struct sym_list_struct *next;
150 1.1 skrll symbolS *sym;
151 1.1 skrll } sym_list;
152 1.1 skrll
153 1.1 skrll static sym_list *insn_labels = NULL;
154 1.1 skrll static sym_list *free_insn_labels = NULL;
155 1.1 skrll static sym_list *saved_insn_labels = NULL;
156 1.1 skrll
157 1.1 skrll static sym_list *literal_syms;
158 1.1 skrll
159 1.1 skrll
160 1.1 skrll /* Flags to determine whether to prefer const16 or l32r
161 1.1 skrll if both options are available. */
162 1.1 skrll int prefer_const16 = 0;
163 1.1 skrll int prefer_l32r = 0;
164 1.1 skrll
165 1.1 skrll /* Global flag to indicate when we are emitting literals. */
166 1.1 skrll int generating_literals = 0;
167 1.1 skrll
168 1.1 skrll /* The following PROPERTY table definitions are copied from
169 1.1 skrll <elf/xtensa.h> and must be kept in sync with the code there. */
170 1.1 skrll
171 1.1 skrll /* Flags in the property tables to specify whether blocks of memory
172 1.1 skrll are literals, instructions, data, or unreachable. For
173 1.1 skrll instructions, blocks that begin loop targets and branch targets are
174 1.1 skrll designated. Blocks that do not allow density, instruction
175 1.1 skrll reordering or transformation are also specified. Finally, for
176 1.1 skrll branch targets, branch target alignment priority is included.
177 1.1 skrll Alignment of the next block is specified in the current block
178 1.1 skrll and the size of the current block does not include any fill required
179 1.1 skrll to align to the next block. */
180 1.1 skrll
181 1.1 skrll #define XTENSA_PROP_LITERAL 0x00000001
182 1.1 skrll #define XTENSA_PROP_INSN 0x00000002
183 1.1 skrll #define XTENSA_PROP_DATA 0x00000004
184 1.1 skrll #define XTENSA_PROP_UNREACHABLE 0x00000008
185 1.1 skrll /* Instruction only properties at beginning of code. */
186 1.1 skrll #define XTENSA_PROP_INSN_LOOP_TARGET 0x00000010
187 1.1 skrll #define XTENSA_PROP_INSN_BRANCH_TARGET 0x00000020
188 1.1 skrll /* Instruction only properties about code. */
189 1.1 skrll #define XTENSA_PROP_INSN_NO_DENSITY 0x00000040
190 1.1 skrll #define XTENSA_PROP_INSN_NO_REORDER 0x00000080
191 1.1 skrll /* Historically, NO_TRANSFORM was a property of instructions,
192 1.1 skrll but it should apply to literals under certain circumstances. */
193 1.1 skrll #define XTENSA_PROP_NO_TRANSFORM 0x00000100
194 1.1 skrll
195 1.1 skrll /* Branch target alignment information. This transmits information
196 1.1 skrll to the linker optimization about the priority of aligning a
197 1.1 skrll particular block for branch target alignment: None, low priority,
198 1.1 skrll high priority, or required. These only need to be checked in
199 1.1 skrll instruction blocks marked as XTENSA_PROP_INSN_BRANCH_TARGET.
200 1.1 skrll Common usage is
201 1.1 skrll
202 1.1 skrll switch (GET_XTENSA_PROP_BT_ALIGN (flags))
203 1.1 skrll case XTENSA_PROP_BT_ALIGN_NONE:
204 1.1 skrll case XTENSA_PROP_BT_ALIGN_LOW:
205 1.1 skrll case XTENSA_PROP_BT_ALIGN_HIGH:
206 1.1 skrll case XTENSA_PROP_BT_ALIGN_REQUIRE:
207 1.1 skrll */
208 1.1 skrll #define XTENSA_PROP_BT_ALIGN_MASK 0x00000600
209 1.1 skrll
210 1.1 skrll /* No branch target alignment. */
211 1.1 skrll #define XTENSA_PROP_BT_ALIGN_NONE 0x0
212 1.1 skrll /* Low priority branch target alignment. */
213 1.1 skrll #define XTENSA_PROP_BT_ALIGN_LOW 0x1
214 1.1 skrll /* High priority branch target alignment. */
215 1.1 skrll #define XTENSA_PROP_BT_ALIGN_HIGH 0x2
216 1.1 skrll /* Required branch target alignment. */
217 1.1 skrll #define XTENSA_PROP_BT_ALIGN_REQUIRE 0x3
218 1.1 skrll
219 1.1 skrll #define GET_XTENSA_PROP_BT_ALIGN(flag) \
220 1.1 skrll (((unsigned) ((flag) & (XTENSA_PROP_BT_ALIGN_MASK))) >> 9)
221 1.1 skrll #define SET_XTENSA_PROP_BT_ALIGN(flag, align) \
222 1.1 skrll (((flag) & (~XTENSA_PROP_BT_ALIGN_MASK)) | \
223 1.1 skrll (((align) << 9) & XTENSA_PROP_BT_ALIGN_MASK))
224 1.1 skrll
225 1.1 skrll
226 1.1 skrll /* Alignment is specified in the block BEFORE the one that needs
227 1.1 skrll alignment. Up to 5 bits. Use GET_XTENSA_PROP_ALIGNMENT(flags) to
228 1.1 skrll get the required alignment specified as a power of 2. Use
229 1.1 skrll SET_XTENSA_PROP_ALIGNMENT(flags, pow2) to set the required
230 1.1 skrll alignment. Be careful of side effects since the SET will evaluate
231 1.1 skrll flags twice. Also, note that the SIZE of a block in the property
232 1.1 skrll table does not include the alignment size, so the alignment fill
233 1.1 skrll must be calculated to determine if two blocks are contiguous.
234 1.1 skrll TEXT_ALIGN is not currently implemented but is a placeholder for a
235 1.1 skrll possible future implementation. */
236 1.1 skrll
237 1.1 skrll #define XTENSA_PROP_ALIGN 0x00000800
238 1.1 skrll
239 1.1 skrll #define XTENSA_PROP_ALIGNMENT_MASK 0x0001f000
240 1.1 skrll
241 1.1 skrll #define GET_XTENSA_PROP_ALIGNMENT(flag) \
242 1.1 skrll (((unsigned) ((flag) & (XTENSA_PROP_ALIGNMENT_MASK))) >> 12)
243 1.1 skrll #define SET_XTENSA_PROP_ALIGNMENT(flag, align) \
244 1.1 skrll (((flag) & (~XTENSA_PROP_ALIGNMENT_MASK)) | \
245 1.1 skrll (((align) << 12) & XTENSA_PROP_ALIGNMENT_MASK))
246 1.1 skrll
247 1.1 skrll #define XTENSA_PROP_INSN_ABSLIT 0x00020000
248 1.1 skrll
249 1.1 skrll
250 1.1 skrll /* Structure for saving instruction and alignment per-fragment data
251 1.1 skrll that will be written to the object file. This structure is
252 1.1 skrll equivalent to the actual data that will be written out to the file
253 1.1 skrll but is easier to use. We provide a conversion to file flags
254 1.1 skrll in frag_flags_to_number. */
255 1.1 skrll
256 1.1 skrll typedef struct frag_flags_struct frag_flags;
257 1.1 skrll
258 1.1 skrll struct frag_flags_struct
259 1.1 skrll {
260 1.1 skrll /* is_literal should only be used after xtensa_move_literals.
261 1.1 skrll If you need to check if you are generating a literal fragment,
262 1.1 skrll then use the generating_literals global. */
263 1.1 skrll
264 1.1 skrll unsigned is_literal : 1;
265 1.1 skrll unsigned is_insn : 1;
266 1.1 skrll unsigned is_data : 1;
267 1.1 skrll unsigned is_unreachable : 1;
268 1.1 skrll
269 1.1 skrll /* is_specific_opcode implies no_transform. */
270 1.1 skrll unsigned is_no_transform : 1;
271 1.1 skrll
272 1.1 skrll struct
273 1.1 skrll {
274 1.1 skrll unsigned is_loop_target : 1;
275 1.1 skrll unsigned is_branch_target : 1; /* Branch targets have a priority. */
276 1.1 skrll unsigned bt_align_priority : 2;
277 1.1 skrll
278 1.1 skrll unsigned is_no_density : 1;
279 1.1 skrll /* no_longcalls flag does not need to be placed in the object file. */
280 1.1 skrll
281 1.1 skrll unsigned is_no_reorder : 1;
282 1.1 skrll
283 1.1 skrll /* Uses absolute literal addressing for l32r. */
284 1.1 skrll unsigned is_abslit : 1;
285 1.1 skrll } insn;
286 1.1 skrll unsigned is_align : 1;
287 1.1 skrll unsigned alignment : 5;
288 1.1 skrll };
289 1.1 skrll
290 1.1 skrll
291 1.1 skrll /* Structure for saving information about a block of property data
292 1.1 skrll for frags that have the same flags. */
293 1.1 skrll struct xtensa_block_info_struct
294 1.1 skrll {
295 1.1 skrll segT sec;
296 1.1 skrll bfd_vma offset;
297 1.1 skrll size_t size;
298 1.1 skrll frag_flags flags;
299 1.1 skrll struct xtensa_block_info_struct *next;
300 1.1 skrll };
301 1.1 skrll
302 1.1 skrll
303 1.1 skrll /* Structure for saving the current state before emitting literals. */
304 1.1 skrll typedef struct emit_state_struct
305 1.1 skrll {
306 1.1 skrll const char *name;
307 1.1 skrll segT now_seg;
308 1.1 skrll subsegT now_subseg;
309 1.1 skrll int generating_literals;
310 1.1 skrll } emit_state;
311 1.1 skrll
312 1.1 skrll
313 1.1 skrll /* Opcode placement information */
314 1.1 skrll
315 1.1 skrll typedef unsigned long long bitfield;
316 1.1 skrll #define bit_is_set(bit, bf) ((bf) & (0x01ll << (bit)))
317 1.1 skrll #define set_bit(bit, bf) ((bf) |= (0x01ll << (bit)))
318 1.1 skrll #define clear_bit(bit, bf) ((bf) &= ~(0x01ll << (bit)))
319 1.1 skrll
320 1.1 skrll #define MAX_FORMATS 32
321 1.1 skrll
322 1.1 skrll typedef struct op_placement_info_struct
323 1.1 skrll {
324 1.1 skrll int num_formats;
325 1.1 skrll /* A number describing how restrictive the issue is for this
326 1.1 skrll opcode. For example, an opcode that fits lots of different
327 1.1 skrll formats has a high freedom, as does an opcode that fits
328 1.1 skrll only one format but many slots in that format. The most
329 1.1 skrll restrictive is the opcode that fits only one slot in one
330 1.1 skrll format. */
331 1.1 skrll int issuef;
332 1.1 skrll xtensa_format narrowest;
333 1.1 skrll char narrowest_size;
334 1.1 skrll char narrowest_slot;
335 1.1 skrll
336 1.1 skrll /* formats is a bitfield with the Nth bit set
337 1.1 skrll if the opcode fits in the Nth xtensa_format. */
338 1.1 skrll bitfield formats;
339 1.1 skrll
340 1.1 skrll /* slots[N]'s Mth bit is set if the op fits in the
341 1.1 skrll Mth slot of the Nth xtensa_format. */
342 1.1 skrll bitfield slots[MAX_FORMATS];
343 1.1 skrll
344 1.1 skrll /* A count of the number of slots in a given format
345 1.1 skrll an op can fit (i.e., the bitcount of the slot field above). */
346 1.1 skrll char slots_in_format[MAX_FORMATS];
347 1.1 skrll
348 1.1 skrll } op_placement_info, *op_placement_info_table;
349 1.1 skrll
350 1.1 skrll op_placement_info_table op_placement_table;
351 1.1 skrll
352 1.1 skrll
353 1.1 skrll /* Extra expression types. */
354 1.1 skrll
355 1.1 skrll #define O_pltrel O_md1 /* like O_symbol but use a PLT reloc */
356 1.1 skrll #define O_hi16 O_md2 /* use high 16 bits of symbolic value */
357 1.1 skrll #define O_lo16 O_md3 /* use low 16 bits of symbolic value */
358 1.1 skrll #define O_pcrel O_md4 /* value is a PC-relative offset */
359 1.1 skrll #define O_tlsfunc O_md5 /* TLS_FUNC/TLSDESC_FN relocation */
360 1.1 skrll #define O_tlsarg O_md6 /* TLS_ARG/TLSDESC_ARG relocation */
361 1.1 skrll #define O_tlscall O_md7 /* TLS_CALL relocation */
362 1.1 skrll #define O_tpoff O_md8 /* TPOFF relocation */
363 1.1 skrll #define O_dtpoff O_md9 /* DTPOFF relocation */
364 1.1 skrll
365 1.1 skrll struct suffix_reloc_map
366 1.1 skrll {
367 1.1 skrll char *suffix;
368 1.1 skrll int length;
369 1.1 skrll bfd_reloc_code_real_type reloc;
370 1.1 skrll unsigned char operator;
371 1.1 skrll };
372 1.1 skrll
373 1.1 skrll #define SUFFIX_MAP(str, reloc, op) { str, sizeof (str) - 1, reloc, op }
374 1.1 skrll
375 1.1 skrll static struct suffix_reloc_map suffix_relocs[] =
376 1.1 skrll {
377 1.1 skrll SUFFIX_MAP ("l", BFD_RELOC_LO16, O_lo16),
378 1.1 skrll SUFFIX_MAP ("h", BFD_RELOC_HI16, O_hi16),
379 1.1 skrll SUFFIX_MAP ("plt", BFD_RELOC_XTENSA_PLT, O_pltrel),
380 1.1 skrll SUFFIX_MAP ("pcrel", BFD_RELOC_32_PCREL, O_pcrel),
381 1.1 skrll SUFFIX_MAP ("tlsfunc", BFD_RELOC_XTENSA_TLS_FUNC, O_tlsfunc),
382 1.1 skrll SUFFIX_MAP ("tlsarg", BFD_RELOC_XTENSA_TLS_ARG, O_tlsarg),
383 1.1 skrll SUFFIX_MAP ("tlscall", BFD_RELOC_XTENSA_TLS_CALL, O_tlscall),
384 1.1 skrll SUFFIX_MAP ("tpoff", BFD_RELOC_XTENSA_TLS_TPOFF, O_tpoff),
385 1.1 skrll SUFFIX_MAP ("dtpoff", BFD_RELOC_XTENSA_TLS_DTPOFF, O_dtpoff),
386 1.1 skrll { (char *) 0, 0, BFD_RELOC_UNUSED, 0 }
387 1.1 skrll };
388 1.1 skrll
389 1.1 skrll
390 1.1 skrll /* Directives. */
391 1.1 skrll
392 1.1 skrll typedef enum
393 1.1 skrll {
394 1.1 skrll directive_none = 0,
395 1.1 skrll directive_literal,
396 1.1 skrll directive_density,
397 1.1 skrll directive_transform,
398 1.1 skrll directive_freeregs,
399 1.1 skrll directive_longcalls,
400 1.1 skrll directive_literal_prefix,
401 1.1 skrll directive_schedule,
402 1.1 skrll directive_absolute_literals,
403 1.1 skrll directive_last_directive
404 1.1 skrll } directiveE;
405 1.1 skrll
406 1.1 skrll typedef struct
407 1.1 skrll {
408 1.1 skrll const char *name;
409 1.1 skrll bfd_boolean can_be_negated;
410 1.1 skrll } directive_infoS;
411 1.1 skrll
412 1.1 skrll const directive_infoS directive_info[] =
413 1.1 skrll {
414 1.1 skrll { "none", FALSE },
415 1.1 skrll { "literal", FALSE },
416 1.1 skrll { "density", TRUE },
417 1.1 skrll { "transform", TRUE },
418 1.1 skrll { "freeregs", FALSE },
419 1.1 skrll { "longcalls", TRUE },
420 1.1 skrll { "literal_prefix", FALSE },
421 1.1 skrll { "schedule", TRUE },
422 1.1 skrll { "absolute-literals", TRUE }
423 1.1 skrll };
424 1.1 skrll
425 1.1 skrll bfd_boolean directive_state[] =
426 1.1 skrll {
427 1.1 skrll FALSE, /* none */
428 1.1 skrll FALSE, /* literal */
429 1.1 skrll #if !XCHAL_HAVE_DENSITY
430 1.1 skrll FALSE, /* density */
431 1.1 skrll #else
432 1.1 skrll TRUE, /* density */
433 1.1 skrll #endif
434 1.1 skrll TRUE, /* transform */
435 1.1 skrll FALSE, /* freeregs */
436 1.1 skrll FALSE, /* longcalls */
437 1.1 skrll FALSE, /* literal_prefix */
438 1.1 skrll FALSE, /* schedule */
439 1.1 skrll #if XSHAL_USE_ABSOLUTE_LITERALS
440 1.1 skrll TRUE /* absolute_literals */
441 1.1 skrll #else
442 1.1 skrll FALSE /* absolute_literals */
443 1.1 skrll #endif
444 1.1 skrll };
445 1.1 skrll
446 1.1 skrll
447 1.1 skrll /* Directive functions. */
448 1.1 skrll
449 1.1 skrll static void xtensa_begin_directive (int);
450 1.1 skrll static void xtensa_end_directive (int);
451 1.1 skrll static void xtensa_literal_prefix (void);
452 1.1 skrll static void xtensa_literal_position (int);
453 1.1 skrll static void xtensa_literal_pseudo (int);
454 1.1 skrll static void xtensa_frequency_pseudo (int);
455 1.1 skrll static void xtensa_elf_cons (int);
456 1.1 skrll static void xtensa_leb128 (int);
457 1.1 skrll
458 1.1 skrll /* Parsing and Idiom Translation. */
459 1.1 skrll
460 1.1 skrll static bfd_reloc_code_real_type xtensa_elf_suffix (char **, expressionS *);
461 1.1 skrll
462 1.1 skrll /* Various Other Internal Functions. */
463 1.1 skrll
464 1.1 skrll extern bfd_boolean xg_is_single_relaxable_insn (TInsn *, TInsn *, bfd_boolean);
465 1.1 skrll static bfd_boolean xg_build_to_insn (TInsn *, TInsn *, BuildInstr *);
466 1.1 skrll static void xtensa_mark_literal_pool_location (void);
467 1.1 skrll static addressT get_expanded_loop_offset (xtensa_opcode);
468 1.1 skrll static fragS *get_literal_pool_location (segT);
469 1.1 skrll static void set_literal_pool_location (segT, fragS *);
470 1.1 skrll static void xtensa_set_frag_assembly_state (fragS *);
471 1.1 skrll static void finish_vinsn (vliw_insn *);
472 1.1 skrll static bfd_boolean emit_single_op (TInsn *);
473 1.1 skrll static int total_frag_text_expansion (fragS *);
474 1.1 skrll
475 1.1 skrll /* Alignment Functions. */
476 1.1 skrll
477 1.1 skrll static int get_text_align_power (unsigned);
478 1.1 skrll static int get_text_align_max_fill_size (int, bfd_boolean, bfd_boolean);
479 1.1 skrll static int branch_align_power (segT);
480 1.1 skrll
481 1.1 skrll /* Helpers for xtensa_relax_frag(). */
482 1.1 skrll
483 1.1 skrll static long relax_frag_add_nop (fragS *);
484 1.1 skrll
485 1.1 skrll /* Accessors for additional per-subsegment information. */
486 1.1 skrll
487 1.1 skrll static unsigned get_last_insn_flags (segT, subsegT);
488 1.1 skrll static void set_last_insn_flags (segT, subsegT, unsigned, bfd_boolean);
489 1.1 skrll static float get_subseg_total_freq (segT, subsegT);
490 1.1 skrll static float get_subseg_target_freq (segT, subsegT);
491 1.1 skrll static void set_subseg_freq (segT, subsegT, float, float);
492 1.1 skrll
493 1.1 skrll /* Segment list functions. */
494 1.1 skrll
495 1.1 skrll static void xtensa_move_literals (void);
496 1.1 skrll static void xtensa_reorder_segments (void);
497 1.1 skrll static void xtensa_switch_to_literal_fragment (emit_state *);
498 1.1 skrll static void xtensa_switch_to_non_abs_literal_fragment (emit_state *);
499 1.1 skrll static void xtensa_switch_section_emit_state (emit_state *, segT, subsegT);
500 1.1 skrll static void xtensa_restore_emit_state (emit_state *);
501 1.1 skrll static segT cache_literal_section (bfd_boolean);
502 1.1 skrll
503 1.1 skrll /* Import from elf32-xtensa.c in BFD library. */
504 1.1 skrll
505 1.1 skrll extern asection *xtensa_make_property_section (asection *, const char *);
506 1.1 skrll
507 1.1 skrll /* op_placement_info functions. */
508 1.1 skrll
509 1.1 skrll static void init_op_placement_info_table (void);
510 1.1 skrll extern bfd_boolean opcode_fits_format_slot (xtensa_opcode, xtensa_format, int);
511 1.1 skrll static int xg_get_single_size (xtensa_opcode);
512 1.1 skrll static xtensa_format xg_get_single_format (xtensa_opcode);
513 1.1 skrll static int xg_get_single_slot (xtensa_opcode);
514 1.1 skrll
515 1.1 skrll /* TInsn and IStack functions. */
516 1.1 skrll
517 1.1 skrll static bfd_boolean tinsn_has_symbolic_operands (const TInsn *);
518 1.1 skrll static bfd_boolean tinsn_has_invalid_symbolic_operands (const TInsn *);
519 1.1 skrll static bfd_boolean tinsn_has_complex_operands (const TInsn *);
520 1.1 skrll static bfd_boolean tinsn_to_insnbuf (TInsn *, xtensa_insnbuf);
521 1.1 skrll static bfd_boolean tinsn_check_arguments (const TInsn *);
522 1.1 skrll static void tinsn_from_chars (TInsn *, char *, int);
523 1.1 skrll static void tinsn_immed_from_frag (TInsn *, fragS *, int);
524 1.1 skrll static int get_num_stack_text_bytes (IStack *);
525 1.1 skrll static int get_num_stack_literal_bytes (IStack *);
526 1.1 skrll
527 1.1 skrll /* vliw_insn functions. */
528 1.1 skrll
529 1.1 skrll static void xg_init_vinsn (vliw_insn *);
530 1.1 skrll static void xg_clear_vinsn (vliw_insn *);
531 1.1 skrll static bfd_boolean vinsn_has_specific_opcodes (vliw_insn *);
532 1.1 skrll static void xg_free_vinsn (vliw_insn *);
533 1.1 skrll static bfd_boolean vinsn_to_insnbuf
534 1.1 skrll (vliw_insn *, char *, fragS *, bfd_boolean);
535 1.1 skrll static void vinsn_from_chars (vliw_insn *, char *);
536 1.1 skrll
537 1.1 skrll /* Expression Utilities. */
538 1.1 skrll
539 1.1 skrll bfd_boolean expr_is_const (const expressionS *);
540 1.1 skrll offsetT get_expr_const (const expressionS *);
541 1.1 skrll void set_expr_const (expressionS *, offsetT);
542 1.1 skrll bfd_boolean expr_is_register (const expressionS *);
543 1.1 skrll offsetT get_expr_register (const expressionS *);
544 1.1 skrll void set_expr_symbol_offset (expressionS *, symbolS *, offsetT);
545 1.1 skrll bfd_boolean expr_is_equal (expressionS *, expressionS *);
546 1.1 skrll static void copy_expr (expressionS *, const expressionS *);
547 1.1 skrll
548 1.1 skrll /* Section renaming. */
549 1.1 skrll
550 1.1 skrll static void build_section_rename (const char *);
551 1.1 skrll
552 1.1 skrll
553 1.1 skrll /* ISA imported from bfd. */
554 1.1 skrll extern xtensa_isa xtensa_default_isa;
555 1.1 skrll
556 1.1 skrll extern int target_big_endian;
557 1.1 skrll
558 1.1 skrll static xtensa_opcode xtensa_addi_opcode;
559 1.1 skrll static xtensa_opcode xtensa_addmi_opcode;
560 1.1 skrll static xtensa_opcode xtensa_call0_opcode;
561 1.1 skrll static xtensa_opcode xtensa_call4_opcode;
562 1.1 skrll static xtensa_opcode xtensa_call8_opcode;
563 1.1 skrll static xtensa_opcode xtensa_call12_opcode;
564 1.1 skrll static xtensa_opcode xtensa_callx0_opcode;
565 1.1 skrll static xtensa_opcode xtensa_callx4_opcode;
566 1.1 skrll static xtensa_opcode xtensa_callx8_opcode;
567 1.1 skrll static xtensa_opcode xtensa_callx12_opcode;
568 1.1 skrll static xtensa_opcode xtensa_const16_opcode;
569 1.1 skrll static xtensa_opcode xtensa_entry_opcode;
570 1.1 skrll static xtensa_opcode xtensa_extui_opcode;
571 1.1 skrll static xtensa_opcode xtensa_movi_opcode;
572 1.1 skrll static xtensa_opcode xtensa_movi_n_opcode;
573 1.1 skrll static xtensa_opcode xtensa_isync_opcode;
574 1.1 skrll static xtensa_opcode xtensa_jx_opcode;
575 1.1 skrll static xtensa_opcode xtensa_l32r_opcode;
576 1.1 skrll static xtensa_opcode xtensa_loop_opcode;
577 1.1 skrll static xtensa_opcode xtensa_loopnez_opcode;
578 1.1 skrll static xtensa_opcode xtensa_loopgtz_opcode;
579 1.1 skrll static xtensa_opcode xtensa_nop_opcode;
580 1.1 skrll static xtensa_opcode xtensa_nop_n_opcode;
581 1.1 skrll static xtensa_opcode xtensa_or_opcode;
582 1.1 skrll static xtensa_opcode xtensa_ret_opcode;
583 1.1 skrll static xtensa_opcode xtensa_ret_n_opcode;
584 1.1 skrll static xtensa_opcode xtensa_retw_opcode;
585 1.1 skrll static xtensa_opcode xtensa_retw_n_opcode;
586 1.1 skrll static xtensa_opcode xtensa_rsr_lcount_opcode;
587 1.1 skrll static xtensa_opcode xtensa_waiti_opcode;
588 1.1 skrll
589 1.1 skrll
590 1.1 skrll /* Command-line Options. */
592 1.1 skrll
593 1.1 skrll bfd_boolean use_literal_section = TRUE;
594 1.1 skrll static bfd_boolean align_targets = TRUE;
595 1.1 skrll static bfd_boolean warn_unaligned_branch_targets = FALSE;
596 1.1 skrll static bfd_boolean has_a0_b_retw = FALSE;
597 1.1 skrll static bfd_boolean workaround_a0_b_retw = FALSE;
598 1.1 skrll static bfd_boolean workaround_b_j_loop_end = FALSE;
599 1.1 skrll static bfd_boolean workaround_short_loop = FALSE;
600 1.1 skrll static bfd_boolean maybe_has_short_loop = FALSE;
601 1.1 skrll static bfd_boolean workaround_close_loop_end = FALSE;
602 1.1 skrll static bfd_boolean maybe_has_close_loop_end = FALSE;
603 1.1 skrll static bfd_boolean enforce_three_byte_loop_align = FALSE;
604 1.1 skrll
605 1.1 skrll /* When workaround_short_loops is TRUE, all loops with early exits must
606 1.1 skrll have at least 3 instructions. workaround_all_short_loops is a modifier
607 1.1 skrll to the workaround_short_loop flag. In addition to the
608 1.1 skrll workaround_short_loop actions, all straightline loopgtz and loopnez
609 1.1 skrll must have at least 3 instructions. */
610 1.1 skrll
611 1.1 skrll static bfd_boolean workaround_all_short_loops = FALSE;
612 1.1 skrll
613 1.1 skrll
614 1.1 skrll static void
615 1.1 skrll xtensa_setup_hw_workarounds (int earliest, int latest)
616 1.1 skrll {
617 1.1 skrll if (earliest > latest)
618 1.1 skrll as_fatal (_("illegal range of target hardware versions"));
619 1.1 skrll
620 1.1 skrll /* Enable all workarounds for pre-T1050.0 hardware. */
621 1.1 skrll if (earliest < 105000 || latest < 105000)
622 1.1 skrll {
623 1.1 skrll workaround_a0_b_retw |= TRUE;
624 1.1 skrll workaround_b_j_loop_end |= TRUE;
625 1.1 skrll workaround_short_loop |= TRUE;
626 1.1 skrll workaround_close_loop_end |= TRUE;
627 1.1 skrll workaround_all_short_loops |= TRUE;
628 1.1 skrll enforce_three_byte_loop_align = TRUE;
629 1.1 skrll }
630 1.1 skrll }
631 1.1 skrll
632 1.1 skrll
633 1.1 skrll enum
634 1.1 skrll {
635 1.1 skrll option_density = OPTION_MD_BASE,
636 1.1 skrll option_no_density,
637 1.1 skrll
638 1.1 skrll option_relax,
639 1.1 skrll option_no_relax,
640 1.1 skrll
641 1.1 skrll option_link_relax,
642 1.1 skrll option_no_link_relax,
643 1.1 skrll
644 1.1 skrll option_generics,
645 1.1 skrll option_no_generics,
646 1.1 skrll
647 1.1 skrll option_transform,
648 1.1 skrll option_no_transform,
649 1.1 skrll
650 1.1 skrll option_text_section_literals,
651 1.1 skrll option_no_text_section_literals,
652 1.1 skrll
653 1.1 skrll option_absolute_literals,
654 1.1 skrll option_no_absolute_literals,
655 1.1 skrll
656 1.1 skrll option_align_targets,
657 1.1 skrll option_no_align_targets,
658 1.1 skrll
659 1.1 skrll option_warn_unaligned_targets,
660 1.1 skrll
661 1.1 skrll option_longcalls,
662 1.1 skrll option_no_longcalls,
663 1.1 skrll
664 1.1 skrll option_workaround_a0_b_retw,
665 1.1 skrll option_no_workaround_a0_b_retw,
666 1.1 skrll
667 1.1 skrll option_workaround_b_j_loop_end,
668 1.1 skrll option_no_workaround_b_j_loop_end,
669 1.1 skrll
670 1.1 skrll option_workaround_short_loop,
671 1.1 skrll option_no_workaround_short_loop,
672 1.1 skrll
673 1.1 skrll option_workaround_all_short_loops,
674 1.1 skrll option_no_workaround_all_short_loops,
675 1.1 skrll
676 1.1 skrll option_workaround_close_loop_end,
677 1.1 skrll option_no_workaround_close_loop_end,
678 1.1 skrll
679 1.1 skrll option_no_workarounds,
680 1.1 skrll
681 1.1 skrll option_rename_section_name,
682 1.1 skrll
683 1.1 skrll option_prefer_l32r,
684 1.1 skrll option_prefer_const16,
685 1.1 skrll
686 1.1 skrll option_target_hardware
687 1.1 skrll };
688 1.1 skrll
689 1.1 skrll const char *md_shortopts = "";
690 1.1 skrll
691 1.1 skrll struct option md_longopts[] =
692 1.1 skrll {
693 1.1 skrll { "density", no_argument, NULL, option_density },
694 1.1 skrll { "no-density", no_argument, NULL, option_no_density },
695 1.1 skrll
696 1.1 skrll /* Both "relax" and "generics" are deprecated and treated as equivalent
697 1.1 skrll to the "transform" option. */
698 1.1 skrll { "relax", no_argument, NULL, option_relax },
699 1.1 skrll { "no-relax", no_argument, NULL, option_no_relax },
700 1.1 skrll { "generics", no_argument, NULL, option_generics },
701 1.1 skrll { "no-generics", no_argument, NULL, option_no_generics },
702 1.1 skrll
703 1.1 skrll { "transform", no_argument, NULL, option_transform },
704 1.1 skrll { "no-transform", no_argument, NULL, option_no_transform },
705 1.1 skrll { "text-section-literals", no_argument, NULL, option_text_section_literals },
706 1.1 skrll { "no-text-section-literals", no_argument, NULL,
707 1.1 skrll option_no_text_section_literals },
708 1.1 skrll { "absolute-literals", no_argument, NULL, option_absolute_literals },
709 1.1 skrll { "no-absolute-literals", no_argument, NULL, option_no_absolute_literals },
710 1.1 skrll /* This option was changed from -align-target to -target-align
711 1.1 skrll because it conflicted with the "-al" option. */
712 1.1 skrll { "target-align", no_argument, NULL, option_align_targets },
713 1.1 skrll { "no-target-align", no_argument, NULL, option_no_align_targets },
714 1.1 skrll { "warn-unaligned-targets", no_argument, NULL,
715 1.1 skrll option_warn_unaligned_targets },
716 1.1 skrll { "longcalls", no_argument, NULL, option_longcalls },
717 1.1 skrll { "no-longcalls", no_argument, NULL, option_no_longcalls },
718 1.1 skrll
719 1.1 skrll { "no-workaround-a0-b-retw", no_argument, NULL,
720 1.1 skrll option_no_workaround_a0_b_retw },
721 1.1 skrll { "workaround-a0-b-retw", no_argument, NULL, option_workaround_a0_b_retw },
722 1.1 skrll
723 1.1 skrll { "no-workaround-b-j-loop-end", no_argument, NULL,
724 1.1 skrll option_no_workaround_b_j_loop_end },
725 1.1 skrll { "workaround-b-j-loop-end", no_argument, NULL,
726 1.1 skrll option_workaround_b_j_loop_end },
727 1.1 skrll
728 1.1 skrll { "no-workaround-short-loops", no_argument, NULL,
729 1.1 skrll option_no_workaround_short_loop },
730 1.1 skrll { "workaround-short-loops", no_argument, NULL,
731 1.1 skrll option_workaround_short_loop },
732 1.1 skrll
733 1.1 skrll { "no-workaround-all-short-loops", no_argument, NULL,
734 1.1 skrll option_no_workaround_all_short_loops },
735 1.1 skrll { "workaround-all-short-loop", no_argument, NULL,
736 1.1 skrll option_workaround_all_short_loops },
737 1.1 skrll
738 1.1 skrll { "prefer-l32r", no_argument, NULL, option_prefer_l32r },
739 1.1 skrll { "prefer-const16", no_argument, NULL, option_prefer_const16 },
740 1.1 skrll
741 1.1 skrll { "no-workarounds", no_argument, NULL, option_no_workarounds },
742 1.1 skrll
743 1.1 skrll { "no-workaround-close-loop-end", no_argument, NULL,
744 1.1 skrll option_no_workaround_close_loop_end },
745 1.1 skrll { "workaround-close-loop-end", no_argument, NULL,
746 1.1 skrll option_workaround_close_loop_end },
747 1.1 skrll
748 1.1 skrll { "rename-section", required_argument, NULL, option_rename_section_name },
749 1.1 skrll
750 1.1 skrll { "link-relax", no_argument, NULL, option_link_relax },
751 1.1 skrll { "no-link-relax", no_argument, NULL, option_no_link_relax },
752 1.1 skrll
753 1.1 skrll { "target-hardware", required_argument, NULL, option_target_hardware },
754 1.1 skrll
755 1.1 skrll { NULL, no_argument, NULL, 0 }
756 1.1 skrll };
757 1.1 skrll
758 1.1 skrll size_t md_longopts_size = sizeof md_longopts;
759 1.1 skrll
760 1.1 skrll
761 1.1 skrll int
762 1.1 skrll md_parse_option (int c, char *arg)
763 1.1 skrll {
764 1.1 skrll switch (c)
765 1.1 skrll {
766 1.1 skrll case option_density:
767 1.1 skrll as_warn (_("--density option is ignored"));
768 1.1 skrll return 1;
769 1.1 skrll case option_no_density:
770 1.1 skrll as_warn (_("--no-density option is ignored"));
771 1.1 skrll return 1;
772 1.1 skrll case option_link_relax:
773 1.1 skrll linkrelax = 1;
774 1.1 skrll return 1;
775 1.1 skrll case option_no_link_relax:
776 1.1 skrll linkrelax = 0;
777 1.1 skrll return 1;
778 1.1 skrll case option_generics:
779 1.1 skrll as_warn (_("--generics is deprecated; use --transform instead"));
780 1.1 skrll return md_parse_option (option_transform, arg);
781 1.1 skrll case option_no_generics:
782 1.1 skrll as_warn (_("--no-generics is deprecated; use --no-transform instead"));
783 1.1 skrll return md_parse_option (option_no_transform, arg);
784 1.1 skrll case option_relax:
785 1.1 skrll as_warn (_("--relax is deprecated; use --transform instead"));
786 1.1 skrll return md_parse_option (option_transform, arg);
787 1.1 skrll case option_no_relax:
788 1.1 skrll as_warn (_("--no-relax is deprecated; use --no-transform instead"));
789 1.1 skrll return md_parse_option (option_no_transform, arg);
790 1.1 skrll case option_longcalls:
791 1.1 skrll directive_state[directive_longcalls] = TRUE;
792 1.1 skrll return 1;
793 1.1 skrll case option_no_longcalls:
794 1.1 skrll directive_state[directive_longcalls] = FALSE;
795 1.1 skrll return 1;
796 1.1 skrll case option_text_section_literals:
797 1.1 skrll use_literal_section = FALSE;
798 1.1 skrll return 1;
799 1.1 skrll case option_no_text_section_literals:
800 1.1 skrll use_literal_section = TRUE;
801 1.1 skrll return 1;
802 1.1 skrll case option_absolute_literals:
803 1.1 skrll if (!absolute_literals_supported)
804 1.1 skrll {
805 1.1 skrll as_fatal (_("--absolute-literals option not supported in this Xtensa configuration"));
806 1.1 skrll return 0;
807 1.1 skrll }
808 1.1 skrll directive_state[directive_absolute_literals] = TRUE;
809 1.1 skrll return 1;
810 1.1 skrll case option_no_absolute_literals:
811 1.1 skrll directive_state[directive_absolute_literals] = FALSE;
812 1.1 skrll return 1;
813 1.1 skrll
814 1.1 skrll case option_workaround_a0_b_retw:
815 1.1 skrll workaround_a0_b_retw = TRUE;
816 1.1 skrll return 1;
817 1.1 skrll case option_no_workaround_a0_b_retw:
818 1.1 skrll workaround_a0_b_retw = FALSE;
819 1.1 skrll return 1;
820 1.1 skrll case option_workaround_b_j_loop_end:
821 1.1 skrll workaround_b_j_loop_end = TRUE;
822 1.1 skrll return 1;
823 1.1 skrll case option_no_workaround_b_j_loop_end:
824 1.1 skrll workaround_b_j_loop_end = FALSE;
825 1.1 skrll return 1;
826 1.1 skrll
827 1.1 skrll case option_workaround_short_loop:
828 1.1 skrll workaround_short_loop = TRUE;
829 1.1 skrll return 1;
830 1.1 skrll case option_no_workaround_short_loop:
831 1.1 skrll workaround_short_loop = FALSE;
832 1.1 skrll return 1;
833 1.1 skrll
834 1.1 skrll case option_workaround_all_short_loops:
835 1.1 skrll workaround_all_short_loops = TRUE;
836 1.1 skrll return 1;
837 1.1 skrll case option_no_workaround_all_short_loops:
838 1.1 skrll workaround_all_short_loops = FALSE;
839 1.1 skrll return 1;
840 1.1 skrll
841 1.1 skrll case option_workaround_close_loop_end:
842 1.1 skrll workaround_close_loop_end = TRUE;
843 1.1 skrll return 1;
844 1.1 skrll case option_no_workaround_close_loop_end:
845 1.1 skrll workaround_close_loop_end = FALSE;
846 1.1 skrll return 1;
847 1.1 skrll
848 1.1 skrll case option_no_workarounds:
849 1.1 skrll workaround_a0_b_retw = FALSE;
850 1.1 skrll workaround_b_j_loop_end = FALSE;
851 1.1 skrll workaround_short_loop = FALSE;
852 1.1 skrll workaround_all_short_loops = FALSE;
853 1.1 skrll workaround_close_loop_end = FALSE;
854 1.1 skrll return 1;
855 1.1 skrll
856 1.1 skrll case option_align_targets:
857 1.1 skrll align_targets = TRUE;
858 1.1 skrll return 1;
859 1.1 skrll case option_no_align_targets:
860 1.1 skrll align_targets = FALSE;
861 1.1 skrll return 1;
862 1.1 skrll
863 1.1 skrll case option_warn_unaligned_targets:
864 1.1 skrll warn_unaligned_branch_targets = TRUE;
865 1.1 skrll return 1;
866 1.1 skrll
867 1.1 skrll case option_rename_section_name:
868 1.1 skrll build_section_rename (arg);
869 1.1 skrll return 1;
870 1.1 skrll
871 1.1 skrll case 'Q':
872 1.1 skrll /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
873 1.1 skrll should be emitted or not. FIXME: Not implemented. */
874 1.1 skrll return 1;
875 1.1 skrll
876 1.1 skrll case option_prefer_l32r:
877 1.1 skrll if (prefer_const16)
878 1.1 skrll as_fatal (_("prefer-l32r conflicts with prefer-const16"));
879 1.1 skrll prefer_l32r = 1;
880 1.1 skrll return 1;
881 1.1 skrll
882 1.1 skrll case option_prefer_const16:
883 1.1 skrll if (prefer_l32r)
884 1.1 skrll as_fatal (_("prefer-const16 conflicts with prefer-l32r"));
885 1.1 skrll prefer_const16 = 1;
886 1.1 skrll return 1;
887 1.1 skrll
888 1.1 skrll case option_target_hardware:
889 1.1 skrll {
890 1.1 skrll int earliest, latest = 0;
891 1.1 skrll if (*arg == 0 || *arg == '-')
892 1.1 skrll as_fatal (_("invalid target hardware version"));
893 1.1 skrll
894 1.1 skrll earliest = strtol (arg, &arg, 0);
895 1.1 skrll
896 1.1 skrll if (*arg == 0)
897 1.1 skrll latest = earliest;
898 1.1 skrll else if (*arg == '-')
899 1.1 skrll {
900 1.1 skrll if (*++arg == 0)
901 1.1 skrll as_fatal (_("invalid target hardware version"));
902 1.1 skrll latest = strtol (arg, &arg, 0);
903 1.1 skrll }
904 1.1 skrll if (*arg != 0)
905 1.1 skrll as_fatal (_("invalid target hardware version"));
906 1.1 skrll
907 1.1 skrll xtensa_setup_hw_workarounds (earliest, latest);
908 1.1 skrll return 1;
909 1.1 skrll }
910 1.1 skrll
911 1.1 skrll case option_transform:
912 1.1 skrll /* This option has no affect other than to use the defaults,
913 1.1 skrll which are already set. */
914 1.1 skrll return 1;
915 1.1 skrll
916 1.1 skrll case option_no_transform:
917 1.1 skrll /* This option turns off all transformations of any kind.
918 1.1 skrll However, because we want to preserve the state of other
919 1.1 skrll directives, we only change its own field. Thus, before
920 1.1 skrll you perform any transformation, always check if transform
921 1.1 skrll is available. If you use the functions we provide for this
922 1.1 skrll purpose, you will be ok. */
923 1.1 skrll directive_state[directive_transform] = FALSE;
924 1.1 skrll return 1;
925 1.1 skrll
926 1.1 skrll default:
927 1.1 skrll return 0;
928 1.1 skrll }
929 1.1 skrll }
930 1.1 skrll
931 1.1 skrll
932 1.1 skrll void
933 1.1 skrll md_show_usage (FILE *stream)
934 1.1 skrll {
935 1.1 skrll fputs ("\n\
936 1.1 skrll Xtensa options:\n\
937 1.1 skrll --[no-]text-section-literals\n\
938 1.1 skrll [Do not] put literals in the text section\n\
939 1.1 skrll --[no-]absolute-literals\n\
940 1.1 skrll [Do not] default to use non-PC-relative literals\n\
941 1.1 skrll --[no-]target-align [Do not] try to align branch targets\n\
942 1.1 skrll --[no-]longcalls [Do not] emit 32-bit call sequences\n\
943 1.1 skrll --[no-]transform [Do not] transform instructions\n\
944 1.1 skrll --rename-section old=new Rename section 'old' to 'new'\n", stream);
945 1.1 skrll }
946 1.1 skrll
947 1.1 skrll
948 1.1 skrll /* Functions related to the list of current label symbols. */
950 1.1 skrll
951 1.1 skrll static void
952 1.1 skrll xtensa_add_insn_label (symbolS *sym)
953 1.1 skrll {
954 1.1 skrll sym_list *l;
955 1.1 skrll
956 1.1 skrll if (!free_insn_labels)
957 1.1 skrll l = (sym_list *) xmalloc (sizeof (sym_list));
958 1.1 skrll else
959 1.1 skrll {
960 1.1 skrll l = free_insn_labels;
961 1.1 skrll free_insn_labels = l->next;
962 1.1 skrll }
963 1.1 skrll
964 1.1 skrll l->sym = sym;
965 1.1 skrll l->next = insn_labels;
966 1.1 skrll insn_labels = l;
967 1.1 skrll }
968 1.1 skrll
969 1.1 skrll
970 1.1 skrll static void
971 1.1 skrll xtensa_clear_insn_labels (void)
972 1.1 skrll {
973 1.1 skrll sym_list **pl;
974 1.1 skrll
975 1.1 skrll for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
976 1.1 skrll ;
977 1.1 skrll *pl = insn_labels;
978 1.1 skrll insn_labels = NULL;
979 1.1 skrll }
980 1.1 skrll
981 1.1 skrll
982 1.1 skrll static void
983 1.1 skrll xtensa_move_labels (fragS *new_frag, valueT new_offset)
984 1.1 skrll {
985 1.1 skrll sym_list *lit;
986 1.1 skrll
987 1.1 skrll for (lit = insn_labels; lit; lit = lit->next)
988 1.1 skrll {
989 1.1 skrll symbolS *lit_sym = lit->sym;
990 1.1 skrll S_SET_VALUE (lit_sym, new_offset);
991 1.1 skrll symbol_set_frag (lit_sym, new_frag);
992 1.1 skrll }
993 1.1 skrll }
994 1.1 skrll
995 1.1 skrll
996 1.1 skrll /* Directive data and functions. */
998 1.1 skrll
999 1.1 skrll typedef struct state_stackS_struct
1000 1.1 skrll {
1001 1.1 skrll directiveE directive;
1002 1.1 skrll bfd_boolean negated;
1003 1.1 skrll bfd_boolean old_state;
1004 1.1 skrll const char *file;
1005 1.1 skrll unsigned int line;
1006 1.1 skrll const void *datum;
1007 1.1 skrll struct state_stackS_struct *prev;
1008 1.1 skrll } state_stackS;
1009 1.1 skrll
1010 1.1 skrll state_stackS *directive_state_stack;
1011 1.1 skrll
1012 1.1 skrll const pseudo_typeS md_pseudo_table[] =
1013 1.1 skrll {
1014 1.1 skrll { "align", s_align_bytes, 0 }, /* Defaulting is invalid (0). */
1015 1.1 skrll { "literal_position", xtensa_literal_position, 0 },
1016 1.1 skrll { "frame", s_ignore, 0 }, /* Formerly used for STABS debugging. */
1017 1.1 skrll { "long", xtensa_elf_cons, 4 },
1018 1.1 skrll { "word", xtensa_elf_cons, 4 },
1019 1.1 skrll { "4byte", xtensa_elf_cons, 4 },
1020 1.1 skrll { "short", xtensa_elf_cons, 2 },
1021 1.1 skrll { "2byte", xtensa_elf_cons, 2 },
1022 1.1 skrll { "sleb128", xtensa_leb128, 1},
1023 1.1 skrll { "uleb128", xtensa_leb128, 0},
1024 1.1 skrll { "begin", xtensa_begin_directive, 0 },
1025 1.1 skrll { "end", xtensa_end_directive, 0 },
1026 1.1 skrll { "literal", xtensa_literal_pseudo, 0 },
1027 1.1 skrll { "frequency", xtensa_frequency_pseudo, 0 },
1028 1.1 skrll { NULL, 0, 0 },
1029 1.1 skrll };
1030 1.1 skrll
1031 1.1 skrll
1032 1.1 skrll static bfd_boolean
1033 1.1 skrll use_transform (void)
1034 1.1 skrll {
1035 1.1 skrll /* After md_end, you should be checking frag by frag, rather
1036 1.1 skrll than state directives. */
1037 1.1 skrll assert (!past_xtensa_end);
1038 1.1 skrll return directive_state[directive_transform];
1039 1.1 skrll }
1040 1.1 skrll
1041 1.1 skrll
1042 1.1 skrll static bfd_boolean
1043 1.1 skrll do_align_targets (void)
1044 1.1 skrll {
1045 1.1 skrll /* Do not use this function after md_end; just look at align_targets
1046 1.1 skrll instead. There is no target-align directive, so alignment is either
1047 1.1 skrll enabled for all frags or not done at all. */
1048 1.1 skrll assert (!past_xtensa_end);
1049 1.1 skrll return align_targets && use_transform ();
1050 1.1 skrll }
1051 1.1 skrll
1052 1.1 skrll
1053 1.1 skrll static void
1054 1.1 skrll directive_push (directiveE directive, bfd_boolean negated, const void *datum)
1055 1.1 skrll {
1056 1.1 skrll char *file;
1057 1.1 skrll unsigned int line;
1058 1.1 skrll state_stackS *stack = (state_stackS *) xmalloc (sizeof (state_stackS));
1059 1.1 skrll
1060 1.1 skrll as_where (&file, &line);
1061 1.1 skrll
1062 1.1 skrll stack->directive = directive;
1063 1.1 skrll stack->negated = negated;
1064 1.1 skrll stack->old_state = directive_state[directive];
1065 1.1 skrll stack->file = file;
1066 1.1 skrll stack->line = line;
1067 1.1 skrll stack->datum = datum;
1068 1.1 skrll stack->prev = directive_state_stack;
1069 1.1 skrll directive_state_stack = stack;
1070 1.1 skrll
1071 1.1 skrll directive_state[directive] = !negated;
1072 1.1 skrll }
1073 1.1 skrll
1074 1.1 skrll
1075 1.1 skrll static void
1076 1.1 skrll directive_pop (directiveE *directive,
1077 1.1 skrll bfd_boolean *negated,
1078 1.1 skrll const char **file,
1079 1.1 skrll unsigned int *line,
1080 1.1 skrll const void **datum)
1081 1.1 skrll {
1082 1.1 skrll state_stackS *top = directive_state_stack;
1083 1.1 skrll
1084 1.1 skrll if (!directive_state_stack)
1085 1.1 skrll {
1086 1.1 skrll as_bad (_("unmatched end directive"));
1087 1.1 skrll *directive = directive_none;
1088 1.1 skrll return;
1089 1.1 skrll }
1090 1.1 skrll
1091 1.1 skrll directive_state[directive_state_stack->directive] = top->old_state;
1092 1.1 skrll *directive = top->directive;
1093 1.1 skrll *negated = top->negated;
1094 1.1 skrll *file = top->file;
1095 1.1 skrll *line = top->line;
1096 1.1 skrll *datum = top->datum;
1097 1.1 skrll directive_state_stack = top->prev;
1098 1.1 skrll free (top);
1099 1.1 skrll }
1100 1.1 skrll
1101 1.1 skrll
1102 1.1 skrll static void
1103 1.1 skrll directive_balance (void)
1104 1.1 skrll {
1105 1.1 skrll while (directive_state_stack)
1106 1.1 skrll {
1107 1.1 skrll directiveE directive;
1108 1.1 skrll bfd_boolean negated;
1109 1.1 skrll const char *file;
1110 1.1 skrll unsigned int line;
1111 1.1 skrll const void *datum;
1112 1.1 skrll
1113 1.1 skrll directive_pop (&directive, &negated, &file, &line, &datum);
1114 1.1 skrll as_warn_where ((char *) file, line,
1115 1.1 skrll _(".begin directive with no matching .end directive"));
1116 1.1 skrll }
1117 1.1 skrll }
1118 1.1 skrll
1119 1.1 skrll
1120 1.1 skrll static bfd_boolean
1121 1.1 skrll inside_directive (directiveE dir)
1122 1.1 skrll {
1123 1.1 skrll state_stackS *top = directive_state_stack;
1124 1.1 skrll
1125 1.1 skrll while (top && top->directive != dir)
1126 1.1 skrll top = top->prev;
1127 1.1 skrll
1128 1.1 skrll return (top != NULL);
1129 1.1 skrll }
1130 1.1 skrll
1131 1.1 skrll
1132 1.1 skrll static void
1133 1.1 skrll get_directive (directiveE *directive, bfd_boolean *negated)
1134 1.1 skrll {
1135 1.1 skrll int len;
1136 1.1 skrll unsigned i;
1137 1.1 skrll char *directive_string;
1138 1.1 skrll
1139 1.1 skrll if (strncmp (input_line_pointer, "no-", 3) != 0)
1140 1.1 skrll *negated = FALSE;
1141 1.1 skrll else
1142 1.1 skrll {
1143 1.1 skrll *negated = TRUE;
1144 1.1 skrll input_line_pointer += 3;
1145 1.1 skrll }
1146 1.1 skrll
1147 1.1 skrll len = strspn (input_line_pointer,
1148 1.1 skrll "abcdefghijklmnopqrstuvwxyz_-/0123456789.");
1149 1.1 skrll
1150 1.1 skrll /* This code is a hack to make .begin [no-][generics|relax] exactly
1151 1.1 skrll equivalent to .begin [no-]transform. We should remove it when
1152 1.1 skrll we stop accepting those options. */
1153 1.1 skrll
1154 1.1 skrll if (strncmp (input_line_pointer, "generics", strlen ("generics")) == 0)
1155 1.1 skrll {
1156 1.1 skrll as_warn (_("[no-]generics is deprecated; use [no-]transform instead"));
1157 1.1 skrll directive_string = "transform";
1158 1.1 skrll }
1159 1.1 skrll else if (strncmp (input_line_pointer, "relax", strlen ("relax")) == 0)
1160 1.1 skrll {
1161 1.1 skrll as_warn (_("[no-]relax is deprecated; use [no-]transform instead"));
1162 1.1 skrll directive_string = "transform";
1163 1.1 skrll }
1164 1.1 skrll else
1165 1.1 skrll directive_string = input_line_pointer;
1166 1.1 skrll
1167 1.1 skrll for (i = 0; i < sizeof (directive_info) / sizeof (*directive_info); ++i)
1168 1.1 skrll {
1169 1.1 skrll if (strncmp (directive_string, directive_info[i].name, len) == 0)
1170 1.1 skrll {
1171 1.1 skrll input_line_pointer += len;
1172 1.1 skrll *directive = (directiveE) i;
1173 1.1 skrll if (*negated && !directive_info[i].can_be_negated)
1174 1.1 skrll as_bad (_("directive %s cannot be negated"),
1175 1.1 skrll directive_info[i].name);
1176 1.1 skrll return;
1177 1.1 skrll }
1178 1.1 skrll }
1179 1.1 skrll
1180 1.1 skrll as_bad (_("unknown directive"));
1181 1.1 skrll *directive = (directiveE) XTENSA_UNDEFINED;
1182 1.1 skrll }
1183 1.1 skrll
1184 1.1 skrll
1185 1.1 skrll static void
1186 1.1 skrll xtensa_begin_directive (int ignore ATTRIBUTE_UNUSED)
1187 1.1 skrll {
1188 1.1 skrll directiveE directive;
1189 1.1 skrll bfd_boolean negated;
1190 1.1 skrll emit_state *state;
1191 1.1 skrll lit_state *ls;
1192 1.1 skrll
1193 1.1 skrll get_directive (&directive, &negated);
1194 1.1 skrll if (directive == (directiveE) XTENSA_UNDEFINED)
1195 1.1 skrll {
1196 1.1 skrll discard_rest_of_line ();
1197 1.1 skrll return;
1198 1.1 skrll }
1199 1.1 skrll
1200 1.1 skrll if (cur_vinsn.inside_bundle)
1201 1.1 skrll as_bad (_("directives are not valid inside bundles"));
1202 1.1 skrll
1203 1.1 skrll switch (directive)
1204 1.1 skrll {
1205 1.1 skrll case directive_literal:
1206 1.1 skrll if (!inside_directive (directive_literal))
1207 1.1 skrll {
1208 1.1 skrll /* Previous labels go with whatever follows this directive, not with
1209 1.1 skrll the literal, so save them now. */
1210 1.1 skrll saved_insn_labels = insn_labels;
1211 1.1 skrll insn_labels = NULL;
1212 1.1 skrll }
1213 1.1 skrll as_warn (_(".begin literal is deprecated; use .literal instead"));
1214 1.1 skrll state = (emit_state *) xmalloc (sizeof (emit_state));
1215 1.1 skrll xtensa_switch_to_literal_fragment (state);
1216 1.1 skrll directive_push (directive_literal, negated, state);
1217 1.1 skrll break;
1218 1.1 skrll
1219 1.1 skrll case directive_literal_prefix:
1220 1.1 skrll /* Have to flush pending output because a movi relaxed to an l32r
1221 1.1 skrll might produce a literal. */
1222 1.1 skrll md_flush_pending_output ();
1223 1.1 skrll /* Check to see if the current fragment is a literal
1224 1.1 skrll fragment. If it is, then this operation is not allowed. */
1225 1.1 skrll if (generating_literals)
1226 1.1 skrll {
1227 1.1 skrll as_bad (_("cannot set literal_prefix inside literal fragment"));
1228 1.1 skrll return;
1229 1.1 skrll }
1230 1.1 skrll
1231 1.1 skrll /* Allocate the literal state for this section and push
1232 1.1 skrll onto the directive stack. */
1233 1.1 skrll ls = xmalloc (sizeof (lit_state));
1234 1.1 skrll assert (ls);
1235 1.1 skrll
1236 1.1 skrll *ls = default_lit_sections;
1237 1.1 skrll directive_push (directive_literal_prefix, negated, ls);
1238 1.1 skrll
1239 1.1 skrll /* Process the new prefix. */
1240 1.1 skrll xtensa_literal_prefix ();
1241 1.1 skrll break;
1242 1.1 skrll
1243 1.1 skrll case directive_freeregs:
1244 1.1 skrll /* This information is currently unused, but we'll accept the statement
1245 1.1 skrll and just discard the rest of the line. This won't check the syntax,
1246 1.1 skrll but it will accept every correct freeregs directive. */
1247 1.1 skrll input_line_pointer += strcspn (input_line_pointer, "\n");
1248 1.1 skrll directive_push (directive_freeregs, negated, 0);
1249 1.1 skrll break;
1250 1.1 skrll
1251 1.1 skrll case directive_schedule:
1252 1.1 skrll md_flush_pending_output ();
1253 1.1 skrll frag_var (rs_fill, 0, 0, frag_now->fr_subtype,
1254 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
1255 1.1 skrll directive_push (directive_schedule, negated, 0);
1256 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
1257 1.1 skrll break;
1258 1.1 skrll
1259 1.1 skrll case directive_density:
1260 1.1 skrll as_warn (_(".begin [no-]density is ignored"));
1261 1.1 skrll break;
1262 1.1 skrll
1263 1.1 skrll case directive_absolute_literals:
1264 1.1 skrll md_flush_pending_output ();
1265 1.1 skrll if (!absolute_literals_supported && !negated)
1266 1.1 skrll {
1267 1.1 skrll as_warn (_("Xtensa absolute literals option not supported; ignored"));
1268 1.1 skrll break;
1269 1.1 skrll }
1270 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
1271 1.1 skrll directive_push (directive, negated, 0);
1272 1.1 skrll break;
1273 1.1 skrll
1274 1.1 skrll default:
1275 1.1 skrll md_flush_pending_output ();
1276 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
1277 1.1 skrll directive_push (directive, negated, 0);
1278 1.1 skrll break;
1279 1.1 skrll }
1280 1.1 skrll
1281 1.1 skrll demand_empty_rest_of_line ();
1282 1.1 skrll }
1283 1.1 skrll
1284 1.1 skrll
1285 1.1 skrll static void
1286 1.1 skrll xtensa_end_directive (int ignore ATTRIBUTE_UNUSED)
1287 1.1 skrll {
1288 1.1 skrll directiveE begin_directive, end_directive;
1289 1.1 skrll bfd_boolean begin_negated, end_negated;
1290 1.1 skrll const char *file;
1291 1.1 skrll unsigned int line;
1292 1.1 skrll emit_state *state;
1293 1.1 skrll emit_state **state_ptr;
1294 1.1 skrll lit_state *s;
1295 1.1 skrll
1296 1.1 skrll if (cur_vinsn.inside_bundle)
1297 1.1 skrll as_bad (_("directives are not valid inside bundles"));
1298 1.1 skrll
1299 1.1 skrll get_directive (&end_directive, &end_negated);
1300 1.1 skrll
1301 1.1 skrll md_flush_pending_output ();
1302 1.1 skrll
1303 1.1 skrll switch (end_directive)
1304 1.1 skrll {
1305 1.1 skrll case (directiveE) XTENSA_UNDEFINED:
1306 1.1 skrll discard_rest_of_line ();
1307 1.1 skrll return;
1308 1.1 skrll
1309 1.1 skrll case directive_density:
1310 1.1 skrll as_warn (_(".end [no-]density is ignored"));
1311 1.1 skrll demand_empty_rest_of_line ();
1312 1.1 skrll break;
1313 1.1 skrll
1314 1.1 skrll case directive_absolute_literals:
1315 1.1 skrll if (!absolute_literals_supported && !end_negated)
1316 1.1 skrll {
1317 1.1 skrll as_warn (_("Xtensa absolute literals option not supported; ignored"));
1318 1.1 skrll demand_empty_rest_of_line ();
1319 1.1 skrll return;
1320 1.1 skrll }
1321 1.1 skrll break;
1322 1.1 skrll
1323 1.1 skrll default:
1324 1.1 skrll break;
1325 1.1 skrll }
1326 1.1 skrll
1327 1.1 skrll state_ptr = &state; /* use state_ptr to avoid type-punning warning */
1328 1.1 skrll directive_pop (&begin_directive, &begin_negated, &file, &line,
1329 1.1 skrll (const void **) state_ptr);
1330 1.1 skrll
1331 1.1 skrll if (begin_directive != directive_none)
1332 1.1 skrll {
1333 1.1 skrll if (begin_directive != end_directive || begin_negated != end_negated)
1334 1.1 skrll {
1335 1.1 skrll as_bad (_("does not match begin %s%s at %s:%d"),
1336 1.1 skrll begin_negated ? "no-" : "",
1337 1.1 skrll directive_info[begin_directive].name, file, line);
1338 1.1 skrll }
1339 1.1 skrll else
1340 1.1 skrll {
1341 1.1 skrll switch (end_directive)
1342 1.1 skrll {
1343 1.1 skrll case directive_literal:
1344 1.1 skrll frag_var (rs_fill, 0, 0, 0, NULL, 0, NULL);
1345 1.1 skrll xtensa_restore_emit_state (state);
1346 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
1347 1.1 skrll free (state);
1348 1.1 skrll if (!inside_directive (directive_literal))
1349 1.1 skrll {
1350 1.1 skrll /* Restore the list of current labels. */
1351 1.1 skrll xtensa_clear_insn_labels ();
1352 1.1 skrll insn_labels = saved_insn_labels;
1353 1.1 skrll }
1354 1.1 skrll break;
1355 1.1 skrll
1356 1.1 skrll case directive_literal_prefix:
1357 1.1 skrll /* Restore the default collection sections from saved state. */
1358 1.1 skrll s = (lit_state *) state;
1359 1.1 skrll assert (s);
1360 1.1 skrll default_lit_sections = *s;
1361 1.1 skrll
1362 1.1 skrll /* Free the state storage. */
1363 1.1 skrll free (s->lit_prefix);
1364 1.1 skrll free (s);
1365 1.1 skrll break;
1366 1.1 skrll
1367 1.1 skrll case directive_schedule:
1368 1.1 skrll case directive_freeregs:
1369 1.1 skrll break;
1370 1.1 skrll
1371 1.1 skrll default:
1372 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
1373 1.1 skrll break;
1374 1.1 skrll }
1375 1.1 skrll }
1376 1.1 skrll }
1377 1.1 skrll
1378 1.1 skrll demand_empty_rest_of_line ();
1379 1.1 skrll }
1380 1.1 skrll
1381 1.1 skrll
1382 1.1 skrll /* Place an aligned literal fragment at the current location. */
1383 1.1 skrll
1384 1.1 skrll static void
1385 1.1 skrll xtensa_literal_position (int ignore ATTRIBUTE_UNUSED)
1386 1.1 skrll {
1387 1.1 skrll md_flush_pending_output ();
1388 1.1 skrll
1389 1.1 skrll if (inside_directive (directive_literal))
1390 1.1 skrll as_warn (_(".literal_position inside literal directive; ignoring"));
1391 1.1 skrll xtensa_mark_literal_pool_location ();
1392 1.1 skrll
1393 1.1 skrll demand_empty_rest_of_line ();
1394 1.1 skrll xtensa_clear_insn_labels ();
1395 1.1 skrll }
1396 1.1 skrll
1397 1.1 skrll
1398 1.1 skrll /* Support .literal label, expr, ... */
1399 1.1 skrll
1400 1.1 skrll static void
1401 1.1 skrll xtensa_literal_pseudo (int ignored ATTRIBUTE_UNUSED)
1402 1.1 skrll {
1403 1.1 skrll emit_state state;
1404 1.1 skrll char *p, *base_name;
1405 1.1 skrll char c;
1406 1.1 skrll segT dest_seg;
1407 1.1 skrll
1408 1.1 skrll if (inside_directive (directive_literal))
1409 1.1 skrll {
1410 1.1 skrll as_bad (_(".literal not allowed inside .begin literal region"));
1411 1.1 skrll ignore_rest_of_line ();
1412 1.1 skrll return;
1413 1.1 skrll }
1414 1.1 skrll
1415 1.1 skrll md_flush_pending_output ();
1416 1.1 skrll
1417 1.1 skrll /* Previous labels go with whatever follows this directive, not with
1418 1.1 skrll the literal, so save them now. */
1419 1.1 skrll saved_insn_labels = insn_labels;
1420 1.1 skrll insn_labels = NULL;
1421 1.1 skrll
1422 1.1 skrll /* If we are using text-section literals, then this is the right value... */
1423 1.1 skrll dest_seg = now_seg;
1424 1.1 skrll
1425 1.1 skrll base_name = input_line_pointer;
1426 1.1 skrll
1427 1.1 skrll xtensa_switch_to_literal_fragment (&state);
1428 1.1 skrll
1429 1.1 skrll /* ...but if we aren't using text-section-literals, then we
1430 1.1 skrll need to put them in the section we just switched to. */
1431 1.1 skrll if (use_literal_section || directive_state[directive_absolute_literals])
1432 1.1 skrll dest_seg = now_seg;
1433 1.1 skrll
1434 1.1 skrll /* All literals are aligned to four-byte boundaries. */
1435 1.1 skrll frag_align (2, 0, 0);
1436 1.1 skrll record_alignment (now_seg, 2);
1437 1.1 skrll
1438 1.1 skrll c = get_symbol_end ();
1439 1.1 skrll /* Just after name is now '\0'. */
1440 1.1 skrll p = input_line_pointer;
1441 1.1 skrll *p = c;
1442 1.1 skrll SKIP_WHITESPACE ();
1443 1.1 skrll
1444 1.1 skrll if (*input_line_pointer != ',' && *input_line_pointer != ':')
1445 1.1 skrll {
1446 1.1 skrll as_bad (_("expected comma or colon after symbol name; "
1447 1.1 skrll "rest of line ignored"));
1448 1.1 skrll ignore_rest_of_line ();
1449 1.1 skrll xtensa_restore_emit_state (&state);
1450 1.1 skrll return;
1451 1.1 skrll }
1452 1.1 skrll *p = 0;
1453 1.1 skrll
1454 1.1 skrll colon (base_name);
1455 1.1 skrll
1456 1.1 skrll *p = c;
1457 1.1 skrll input_line_pointer++; /* skip ',' or ':' */
1458 1.1 skrll
1459 1.1 skrll xtensa_elf_cons (4);
1460 1.1 skrll
1461 1.1 skrll xtensa_restore_emit_state (&state);
1462 1.1 skrll
1463 1.1 skrll /* Restore the list of current labels. */
1464 1.1 skrll xtensa_clear_insn_labels ();
1465 1.1 skrll insn_labels = saved_insn_labels;
1466 1.1 skrll }
1467 1.1 skrll
1468 1.1 skrll
1469 1.1 skrll static void
1470 1.1 skrll xtensa_literal_prefix (void)
1471 1.1 skrll {
1472 1.1 skrll char *name;
1473 1.1 skrll int len;
1474 1.1 skrll
1475 1.1 skrll /* Parse the new prefix from the input_line_pointer. */
1476 1.1 skrll SKIP_WHITESPACE ();
1477 1.1 skrll len = strspn (input_line_pointer,
1478 1.1 skrll "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
1479 1.1 skrll "abcdefghijklmnopqrstuvwxyz_/0123456789.$");
1480 1.1 skrll
1481 1.1 skrll /* Get a null-terminated copy of the name. */
1482 1.1 skrll name = xmalloc (len + 1);
1483 1.1 skrll assert (name);
1484 1.1 skrll strncpy (name, input_line_pointer, len);
1485 1.1 skrll name[len] = 0;
1486 1.1 skrll
1487 1.1 skrll /* Skip the name in the input line. */
1488 1.1 skrll input_line_pointer += len;
1489 1.1 skrll
1490 1.1 skrll default_lit_sections.lit_prefix = name;
1491 1.1 skrll
1492 1.1 skrll /* Clear cached literal sections, since the prefix has changed. */
1493 1.1 skrll default_lit_sections.lit_seg = NULL;
1494 1.1 skrll default_lit_sections.lit4_seg = NULL;
1495 1.1 skrll }
1496 1.1 skrll
1497 1.1 skrll
1498 1.1 skrll /* Support ".frequency branch_target_frequency fall_through_frequency". */
1499 1.1 skrll
1500 1.1 skrll static void
1501 1.1 skrll xtensa_frequency_pseudo (int ignored ATTRIBUTE_UNUSED)
1502 1.1 skrll {
1503 1.1 skrll float fall_through_f, target_f;
1504 1.1 skrll
1505 1.1 skrll fall_through_f = (float) strtod (input_line_pointer, &input_line_pointer);
1506 1.1 skrll if (fall_through_f < 0)
1507 1.1 skrll {
1508 1.1 skrll as_bad (_("fall through frequency must be greater than 0"));
1509 1.1 skrll ignore_rest_of_line ();
1510 1.1 skrll return;
1511 1.1 skrll }
1512 1.1 skrll
1513 1.1 skrll target_f = (float) strtod (input_line_pointer, &input_line_pointer);
1514 1.1 skrll if (target_f < 0)
1515 1.1 skrll {
1516 1.1 skrll as_bad (_("branch target frequency must be greater than 0"));
1517 1.1 skrll ignore_rest_of_line ();
1518 1.1 skrll return;
1519 1.1 skrll }
1520 1.1 skrll
1521 1.1 skrll set_subseg_freq (now_seg, now_subseg, target_f + fall_through_f, target_f);
1522 1.1 skrll
1523 1.1 skrll demand_empty_rest_of_line ();
1524 1.1 skrll }
1525 1.1 skrll
1526 1.1 skrll
1527 1.1 skrll /* Like normal .long/.short/.word, except support @plt, etc.
1528 1.1 skrll Clobbers input_line_pointer, checks end-of-line. */
1529 1.1 skrll
1530 1.1 skrll static void
1531 1.1 skrll xtensa_elf_cons (int nbytes)
1532 1.1 skrll {
1533 1.1 skrll expressionS exp;
1534 1.1 skrll bfd_reloc_code_real_type reloc;
1535 1.1 skrll
1536 1.1 skrll md_flush_pending_output ();
1537 1.1 skrll
1538 1.1 skrll if (cur_vinsn.inside_bundle)
1539 1.1 skrll as_bad (_("directives are not valid inside bundles"));
1540 1.1 skrll
1541 1.1 skrll if (is_it_end_of_statement ())
1542 1.1 skrll {
1543 1.1 skrll demand_empty_rest_of_line ();
1544 1.1 skrll return;
1545 1.1 skrll }
1546 1.1 skrll
1547 1.1 skrll do
1548 1.1 skrll {
1549 1.1 skrll expression (&exp);
1550 1.1 skrll if (exp.X_op == O_symbol
1551 1.1 skrll && *input_line_pointer == '@'
1552 1.1 skrll && ((reloc = xtensa_elf_suffix (&input_line_pointer, &exp))
1553 1.1 skrll != BFD_RELOC_NONE))
1554 1.1 skrll {
1555 1.1 skrll reloc_howto_type *reloc_howto =
1556 1.1 skrll bfd_reloc_type_lookup (stdoutput, reloc);
1557 1.1 skrll
1558 1.1 skrll if (reloc == BFD_RELOC_UNUSED || !reloc_howto)
1559 1.1 skrll as_bad (_("unsupported relocation"));
1560 1.1 skrll else if ((reloc >= BFD_RELOC_XTENSA_SLOT0_OP
1561 1.1 skrll && reloc <= BFD_RELOC_XTENSA_SLOT14_OP)
1562 1.1 skrll || (reloc >= BFD_RELOC_XTENSA_SLOT0_ALT
1563 1.1 skrll && reloc <= BFD_RELOC_XTENSA_SLOT14_ALT))
1564 1.1 skrll as_bad (_("opcode-specific %s relocation used outside "
1565 1.1 skrll "an instruction"), reloc_howto->name);
1566 1.1 skrll else if (nbytes != (int) bfd_get_reloc_size (reloc_howto))
1567 1.1 skrll as_bad (_("%s relocations do not fit in %d bytes"),
1568 1.1 skrll reloc_howto->name, nbytes);
1569 1.1 skrll else if (reloc == BFD_RELOC_XTENSA_TLS_FUNC
1570 1.1 skrll || reloc == BFD_RELOC_XTENSA_TLS_ARG
1571 1.1 skrll || reloc == BFD_RELOC_XTENSA_TLS_CALL)
1572 1.1 skrll as_bad (_("invalid use of %s relocation"), reloc_howto->name);
1573 1.1 skrll else
1574 1.1 skrll {
1575 1.1 skrll char *p = frag_more ((int) nbytes);
1576 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
1577 1.1 skrll fix_new_exp (frag_now, p - frag_now->fr_literal,
1578 1.1 skrll nbytes, &exp, reloc_howto->pc_relative, reloc);
1579 1.1 skrll }
1580 1.1 skrll }
1581 1.1 skrll else
1582 1.1 skrll {
1583 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
1584 1.1 skrll emit_expr (&exp, (unsigned int) nbytes);
1585 1.1 skrll }
1586 1.1 skrll }
1587 1.1 skrll while (*input_line_pointer++ == ',');
1588 1.1 skrll
1589 1.1 skrll input_line_pointer--; /* Put terminator back into stream. */
1590 1.1 skrll demand_empty_rest_of_line ();
1591 1.1 skrll }
1592 1.1 skrll
1593 1.1 skrll static bfd_boolean is_leb128_expr;
1594 1.1 skrll
1595 1.1 skrll static void
1596 1.1 skrll xtensa_leb128 (int sign)
1597 1.1 skrll {
1598 1.1 skrll is_leb128_expr = TRUE;
1599 1.1 skrll s_leb128 (sign);
1600 1.1 skrll is_leb128_expr = FALSE;
1601 1.1 skrll }
1602 1.1 skrll
1603 1.1 skrll
1604 1.1 skrll /* Parsing and Idiom Translation. */
1606 1.1 skrll
1607 1.1 skrll /* Parse @plt, etc. and return the desired relocation. */
1608 1.1 skrll static bfd_reloc_code_real_type
1609 1.1 skrll xtensa_elf_suffix (char **str_p, expressionS *exp_p)
1610 1.1 skrll {
1611 1.1 skrll char ident[20];
1612 1.1 skrll char *str = *str_p;
1613 1.1 skrll char *str2;
1614 1.1 skrll int ch;
1615 1.1 skrll int len;
1616 1.1 skrll struct suffix_reloc_map *ptr;
1617 1.1 skrll
1618 1.1 skrll if (*str++ != '@')
1619 1.1 skrll return BFD_RELOC_NONE;
1620 1.1 skrll
1621 1.1 skrll for (ch = *str, str2 = ident;
1622 1.1 skrll (str2 < ident + sizeof (ident) - 1
1623 1.1 skrll && (ISALNUM (ch) || ch == '@'));
1624 1.1 skrll ch = *++str)
1625 1.1 skrll {
1626 1.1 skrll *str2++ = (ISLOWER (ch)) ? ch : TOLOWER (ch);
1627 1.1 skrll }
1628 1.1 skrll
1629 1.1 skrll *str2 = '\0';
1630 1.1 skrll len = str2 - ident;
1631 1.1 skrll
1632 1.1 skrll ch = ident[0];
1633 1.1 skrll for (ptr = &suffix_relocs[0]; ptr->length > 0; ptr++)
1634 1.1 skrll if (ch == ptr->suffix[0]
1635 1.1 skrll && len == ptr->length
1636 1.1 skrll && memcmp (ident, ptr->suffix, ptr->length) == 0)
1637 1.1 skrll {
1638 1.1 skrll /* Now check for "identifier@suffix+constant". */
1639 1.1 skrll if (*str == '-' || *str == '+')
1640 1.1 skrll {
1641 1.1 skrll char *orig_line = input_line_pointer;
1642 1.1 skrll expressionS new_exp;
1643 1.1 skrll
1644 1.1 skrll input_line_pointer = str;
1645 1.1 skrll expression (&new_exp);
1646 1.1 skrll if (new_exp.X_op == O_constant)
1647 1.1 skrll {
1648 1.1 skrll exp_p->X_add_number += new_exp.X_add_number;
1649 1.1 skrll str = input_line_pointer;
1650 1.1 skrll }
1651 1.1 skrll
1652 1.1 skrll if (&input_line_pointer != str_p)
1653 1.1 skrll input_line_pointer = orig_line;
1654 1.1 skrll }
1655 1.1 skrll
1656 1.1 skrll *str_p = str;
1657 1.1 skrll return ptr->reloc;
1658 1.1 skrll }
1659 1.1 skrll
1660 1.1 skrll return BFD_RELOC_UNUSED;
1661 1.1 skrll }
1662 1.1 skrll
1663 1.1 skrll
1664 1.1 skrll /* Find the matching operator type. */
1665 1.1 skrll static unsigned char
1666 1.1 skrll map_suffix_reloc_to_operator (bfd_reloc_code_real_type reloc)
1667 1.1 skrll {
1668 1.1 skrll struct suffix_reloc_map *sfx;
1669 1.1 skrll unsigned char operator = (unsigned char) -1;
1670 1.1 skrll
1671 1.1 skrll for (sfx = &suffix_relocs[0]; sfx->suffix; sfx++)
1672 1.1 skrll {
1673 1.1 skrll if (sfx->reloc == reloc)
1674 1.1 skrll {
1675 1.1 skrll operator = sfx->operator;
1676 1.1 skrll break;
1677 1.1 skrll }
1678 1.1 skrll }
1679 1.1 skrll assert (operator != (unsigned char) -1);
1680 1.1 skrll return operator;
1681 1.1 skrll }
1682 1.1 skrll
1683 1.1 skrll
1684 1.1 skrll /* Find the matching reloc type. */
1685 1.1 skrll static bfd_reloc_code_real_type
1686 1.1 skrll map_operator_to_reloc (unsigned char operator, bfd_boolean is_literal)
1687 1.1 skrll {
1688 1.1 skrll struct suffix_reloc_map *sfx;
1689 1.1 skrll bfd_reloc_code_real_type reloc = BFD_RELOC_UNUSED;
1690 1.1 skrll
1691 1.1 skrll for (sfx = &suffix_relocs[0]; sfx->suffix; sfx++)
1692 1.1 skrll {
1693 1.1 skrll if (sfx->operator == operator)
1694 1.1 skrll {
1695 1.1 skrll reloc = sfx->reloc;
1696 1.1 skrll break;
1697 1.1 skrll }
1698 1.1 skrll }
1699 1.1 skrll
1700 1.1 skrll if (is_literal)
1701 1.1 skrll {
1702 1.1 skrll if (reloc == BFD_RELOC_XTENSA_TLS_FUNC)
1703 1.1 skrll return BFD_RELOC_XTENSA_TLSDESC_FN;
1704 1.1 skrll else if (reloc == BFD_RELOC_XTENSA_TLS_ARG)
1705 1.1 skrll return BFD_RELOC_XTENSA_TLSDESC_ARG;
1706 1.1 skrll }
1707 1.1 skrll
1708 1.1 skrll if (reloc == BFD_RELOC_UNUSED)
1709 1.1 skrll return BFD_RELOC_32;
1710 1.1 skrll
1711 1.1 skrll return reloc;
1712 1.1 skrll }
1713 1.1 skrll
1714 1.1 skrll
1715 1.1 skrll static const char *
1716 1.1 skrll expression_end (const char *name)
1717 1.1 skrll {
1718 1.1 skrll while (1)
1719 1.1 skrll {
1720 1.1 skrll switch (*name)
1721 1.1 skrll {
1722 1.1 skrll case '}':
1723 1.1 skrll case ';':
1724 1.1 skrll case '\0':
1725 1.1 skrll case ',':
1726 1.1 skrll case ':':
1727 1.1 skrll return name;
1728 1.1 skrll case ' ':
1729 1.1 skrll case '\t':
1730 1.1 skrll ++name;
1731 1.1 skrll continue;
1732 1.1 skrll default:
1733 1.1 skrll return 0;
1734 1.1 skrll }
1735 1.1 skrll }
1736 1.1 skrll }
1737 1.1 skrll
1738 1.1 skrll
1739 1.1 skrll #define ERROR_REG_NUM ((unsigned) -1)
1740 1.1 skrll
1741 1.1 skrll static unsigned
1742 1.1 skrll tc_get_register (const char *prefix)
1743 1.1 skrll {
1744 1.1 skrll unsigned reg;
1745 1.1 skrll const char *next_expr;
1746 1.1 skrll const char *old_line_pointer;
1747 1.1 skrll
1748 1.1 skrll SKIP_WHITESPACE ();
1749 1.1 skrll old_line_pointer = input_line_pointer;
1750 1.1 skrll
1751 1.1 skrll if (*input_line_pointer == '$')
1752 1.1 skrll ++input_line_pointer;
1753 1.1 skrll
1754 1.1 skrll /* Accept "sp" as a synonym for "a1". */
1755 1.1 skrll if (input_line_pointer[0] == 's' && input_line_pointer[1] == 'p'
1756 1.1 skrll && expression_end (input_line_pointer + 2))
1757 1.1 skrll {
1758 1.1 skrll input_line_pointer += 2;
1759 1.1 skrll return 1; /* AR[1] */
1760 1.1 skrll }
1761 1.1 skrll
1762 1.1 skrll while (*input_line_pointer++ == *prefix++)
1763 1.1 skrll ;
1764 1.1 skrll --input_line_pointer;
1765 1.1 skrll --prefix;
1766 1.1 skrll
1767 1.1 skrll if (*prefix)
1768 1.1 skrll {
1769 1.1 skrll as_bad (_("bad register name: %s"), old_line_pointer);
1770 1.1 skrll return ERROR_REG_NUM;
1771 1.1 skrll }
1772 1.1 skrll
1773 1.1 skrll if (!ISDIGIT ((unsigned char) *input_line_pointer))
1774 1.1 skrll {
1775 1.1 skrll as_bad (_("bad register number: %s"), input_line_pointer);
1776 1.1 skrll return ERROR_REG_NUM;
1777 1.1 skrll }
1778 1.1 skrll
1779 1.1 skrll reg = 0;
1780 1.1 skrll
1781 1.1 skrll while (ISDIGIT ((int) *input_line_pointer))
1782 1.1 skrll reg = reg * 10 + *input_line_pointer++ - '0';
1783 1.1 skrll
1784 1.1 skrll if (!(next_expr = expression_end (input_line_pointer)))
1785 1.1 skrll {
1786 1.1 skrll as_bad (_("bad register name: %s"), old_line_pointer);
1787 1.1 skrll return ERROR_REG_NUM;
1788 1.1 skrll }
1789 1.1 skrll
1790 1.1 skrll input_line_pointer = (char *) next_expr;
1791 1.1 skrll
1792 1.1 skrll return reg;
1793 1.1 skrll }
1794 1.1 skrll
1795 1.1 skrll
1796 1.1 skrll static void
1797 1.1 skrll expression_maybe_register (xtensa_opcode opc, int opnd, expressionS *tok)
1798 1.1 skrll {
1799 1.1 skrll xtensa_isa isa = xtensa_default_isa;
1800 1.1 skrll
1801 1.1 skrll /* Check if this is an immediate operand. */
1802 1.1 skrll if (xtensa_operand_is_register (isa, opc, opnd) == 0)
1803 1.1 skrll {
1804 1.1 skrll bfd_reloc_code_real_type reloc;
1805 1.1 skrll segT t = expression (tok);
1806 1.1 skrll if (t == absolute_section
1807 1.1 skrll && xtensa_operand_is_PCrelative (isa, opc, opnd) == 1)
1808 1.1 skrll {
1809 1.1 skrll assert (tok->X_op == O_constant);
1810 1.1 skrll tok->X_op = O_symbol;
1811 1.1 skrll tok->X_add_symbol = &abs_symbol;
1812 1.1 skrll }
1813 1.1 skrll
1814 1.1 skrll if ((tok->X_op == O_constant || tok->X_op == O_symbol)
1815 1.1 skrll && ((reloc = xtensa_elf_suffix (&input_line_pointer, tok))
1816 1.1 skrll != BFD_RELOC_NONE))
1817 1.1 skrll {
1818 1.1 skrll switch (reloc)
1819 1.1 skrll {
1820 1.1 skrll case BFD_RELOC_LO16:
1821 1.1 skrll if (tok->X_op == O_constant)
1822 1.1 skrll {
1823 1.1 skrll tok->X_add_number &= 0xffff;
1824 1.1 skrll return;
1825 1.1 skrll }
1826 1.1 skrll break;
1827 1.1 skrll case BFD_RELOC_HI16:
1828 1.1 skrll if (tok->X_op == O_constant)
1829 1.1 skrll {
1830 1.1 skrll tok->X_add_number = ((unsigned) tok->X_add_number) >> 16;
1831 1.1 skrll return;
1832 1.1 skrll }
1833 1.1 skrll break;
1834 1.1 skrll case BFD_RELOC_UNUSED:
1835 1.1 skrll as_bad (_("unsupported relocation"));
1836 1.1 skrll return;
1837 1.1 skrll case BFD_RELOC_32_PCREL:
1838 1.1 skrll as_bad (_("pcrel relocation not allowed in an instruction"));
1839 1.1 skrll return;
1840 1.1 skrll default:
1841 1.1 skrll break;
1842 1.1 skrll }
1843 1.1 skrll tok->X_op = map_suffix_reloc_to_operator (reloc);
1844 1.1 skrll }
1845 1.1 skrll }
1846 1.1 skrll else
1847 1.1 skrll {
1848 1.1 skrll xtensa_regfile opnd_rf = xtensa_operand_regfile (isa, opc, opnd);
1849 1.1 skrll unsigned reg = tc_get_register (xtensa_regfile_shortname (isa, opnd_rf));
1850 1.1 skrll
1851 1.1 skrll if (reg != ERROR_REG_NUM) /* Already errored */
1852 1.1 skrll {
1853 1.1 skrll uint32 buf = reg;
1854 1.1 skrll if (xtensa_operand_encode (isa, opc, opnd, &buf))
1855 1.1 skrll as_bad (_("register number out of range"));
1856 1.1 skrll }
1857 1.1 skrll
1858 1.1 skrll tok->X_op = O_register;
1859 1.1 skrll tok->X_add_symbol = 0;
1860 1.1 skrll tok->X_add_number = reg;
1861 1.1 skrll }
1862 1.1 skrll }
1863 1.1 skrll
1864 1.1 skrll
1865 1.1 skrll /* Split up the arguments for an opcode or pseudo-op. */
1866 1.1 skrll
1867 1.1 skrll static int
1868 1.1 skrll tokenize_arguments (char **args, char *str)
1869 1.1 skrll {
1870 1.1 skrll char *old_input_line_pointer;
1871 1.1 skrll bfd_boolean saw_comma = FALSE;
1872 1.1 skrll bfd_boolean saw_arg = FALSE;
1873 1.1 skrll bfd_boolean saw_colon = FALSE;
1874 1.1 skrll int num_args = 0;
1875 1.1 skrll char *arg_end, *arg;
1876 1.1 skrll int arg_len;
1877 1.1 skrll
1878 1.1 skrll /* Save and restore input_line_pointer around this function. */
1879 1.1 skrll old_input_line_pointer = input_line_pointer;
1880 1.1 skrll input_line_pointer = str;
1881 1.1 skrll
1882 1.1 skrll while (*input_line_pointer)
1883 1.1 skrll {
1884 1.1 skrll SKIP_WHITESPACE ();
1885 1.1 skrll switch (*input_line_pointer)
1886 1.1 skrll {
1887 1.1 skrll case '\0':
1888 1.1 skrll case '}':
1889 1.1 skrll goto fini;
1890 1.1 skrll
1891 1.1 skrll case ':':
1892 1.1 skrll input_line_pointer++;
1893 1.1 skrll if (saw_comma || saw_colon || !saw_arg)
1894 1.1 skrll goto err;
1895 1.1 skrll saw_colon = TRUE;
1896 1.1 skrll break;
1897 1.1 skrll
1898 1.1 skrll case ',':
1899 1.1 skrll input_line_pointer++;
1900 1.1 skrll if (saw_comma || saw_colon || !saw_arg)
1901 1.1 skrll goto err;
1902 1.1 skrll saw_comma = TRUE;
1903 1.1 skrll break;
1904 1.1 skrll
1905 1.1 skrll default:
1906 1.1 skrll if (!saw_comma && !saw_colon && saw_arg)
1907 1.1 skrll goto err;
1908 1.1 skrll
1909 1.1 skrll arg_end = input_line_pointer + 1;
1910 1.1 skrll while (!expression_end (arg_end))
1911 1.1 skrll arg_end += 1;
1912 1.1 skrll
1913 1.1 skrll arg_len = arg_end - input_line_pointer;
1914 1.1 skrll arg = (char *) xmalloc ((saw_colon ? 1 : 0) + arg_len + 1);
1915 1.1 skrll args[num_args] = arg;
1916 1.1 skrll
1917 1.1 skrll if (saw_colon)
1918 1.1 skrll *arg++ = ':';
1919 1.1 skrll strncpy (arg, input_line_pointer, arg_len);
1920 1.1 skrll arg[arg_len] = '\0';
1921 1.1 skrll
1922 1.1 skrll input_line_pointer = arg_end;
1923 1.1 skrll num_args += 1;
1924 1.1 skrll saw_comma = FALSE;
1925 1.1 skrll saw_colon = FALSE;
1926 1.1 skrll saw_arg = TRUE;
1927 1.1 skrll break;
1928 1.1 skrll }
1929 1.1 skrll }
1930 1.1 skrll
1931 1.1 skrll fini:
1932 1.1 skrll if (saw_comma || saw_colon)
1933 1.1 skrll goto err;
1934 1.1 skrll input_line_pointer = old_input_line_pointer;
1935 1.1 skrll return num_args;
1936 1.1 skrll
1937 1.1 skrll err:
1938 1.1 skrll if (saw_comma)
1939 1.1 skrll as_bad (_("extra comma"));
1940 1.1 skrll else if (saw_colon)
1941 1.1 skrll as_bad (_("extra colon"));
1942 1.1 skrll else if (!saw_arg)
1943 1.1 skrll as_bad (_("missing argument"));
1944 1.1 skrll else
1945 1.1 skrll as_bad (_("missing comma or colon"));
1946 1.1 skrll input_line_pointer = old_input_line_pointer;
1947 1.1 skrll return -1;
1948 1.1 skrll }
1949 1.1 skrll
1950 1.1 skrll
1951 1.1 skrll /* Parse the arguments to an opcode. Return TRUE on error. */
1952 1.1 skrll
1953 1.1 skrll static bfd_boolean
1954 1.1 skrll parse_arguments (TInsn *insn, int num_args, char **arg_strings)
1955 1.1 skrll {
1956 1.1 skrll expressionS *tok, *last_tok;
1957 1.1 skrll xtensa_opcode opcode = insn->opcode;
1958 1.1 skrll bfd_boolean had_error = TRUE;
1959 1.1 skrll xtensa_isa isa = xtensa_default_isa;
1960 1.1 skrll int n, num_regs = 0;
1961 1.1 skrll int opcode_operand_count;
1962 1.1 skrll int opnd_cnt, last_opnd_cnt;
1963 1.1 skrll unsigned int next_reg = 0;
1964 1.1 skrll char *old_input_line_pointer;
1965 1.1 skrll
1966 1.1 skrll if (insn->insn_type == ITYPE_LITERAL)
1967 1.1 skrll opcode_operand_count = 1;
1968 1.1 skrll else
1969 1.1 skrll opcode_operand_count = xtensa_opcode_num_operands (isa, opcode);
1970 1.1 skrll
1971 1.1 skrll tok = insn->tok;
1972 1.1 skrll memset (tok, 0, sizeof (*tok) * MAX_INSN_ARGS);
1973 1.1 skrll
1974 1.1 skrll /* Save and restore input_line_pointer around this function. */
1975 1.1 skrll old_input_line_pointer = input_line_pointer;
1976 1.1 skrll
1977 1.1 skrll last_tok = 0;
1978 1.1 skrll last_opnd_cnt = -1;
1979 1.1 skrll opnd_cnt = 0;
1980 1.1 skrll
1981 1.1 skrll /* Skip invisible operands. */
1982 1.1 skrll while (xtensa_operand_is_visible (isa, opcode, opnd_cnt) == 0)
1983 1.1 skrll {
1984 1.1 skrll opnd_cnt += 1;
1985 1.1 skrll tok++;
1986 1.1 skrll }
1987 1.1 skrll
1988 1.1 skrll for (n = 0; n < num_args; n++)
1989 1.1 skrll {
1990 1.1 skrll input_line_pointer = arg_strings[n];
1991 1.1 skrll if (*input_line_pointer == ':')
1992 1.1 skrll {
1993 1.1 skrll xtensa_regfile opnd_rf;
1994 1.1 skrll input_line_pointer++;
1995 1.1 skrll if (num_regs == 0)
1996 1.1 skrll goto err;
1997 1.1 skrll assert (opnd_cnt > 0);
1998 1.1 skrll num_regs--;
1999 1.1 skrll opnd_rf = xtensa_operand_regfile (isa, opcode, last_opnd_cnt);
2000 1.1 skrll if (next_reg
2001 1.1 skrll != tc_get_register (xtensa_regfile_shortname (isa, opnd_rf)))
2002 1.1 skrll as_warn (_("incorrect register number, ignoring"));
2003 1.1 skrll next_reg++;
2004 1.1 skrll }
2005 1.1 skrll else
2006 1.1 skrll {
2007 1.1 skrll if (opnd_cnt >= opcode_operand_count)
2008 1.1 skrll {
2009 1.1 skrll as_warn (_("too many arguments"));
2010 1.1 skrll goto err;
2011 1.1 skrll }
2012 1.1 skrll assert (opnd_cnt < MAX_INSN_ARGS);
2013 1.1 skrll
2014 1.1 skrll expression_maybe_register (opcode, opnd_cnt, tok);
2015 1.1 skrll next_reg = tok->X_add_number + 1;
2016 1.1 skrll
2017 1.1 skrll if (tok->X_op == O_illegal || tok->X_op == O_absent)
2018 1.1 skrll goto err;
2019 1.1 skrll if (xtensa_operand_is_register (isa, opcode, opnd_cnt) == 1)
2020 1.1 skrll {
2021 1.1 skrll num_regs = xtensa_operand_num_regs (isa, opcode, opnd_cnt) - 1;
2022 1.1 skrll /* minus 1 because we are seeing one right now */
2023 1.1 skrll }
2024 1.1 skrll else
2025 1.1 skrll num_regs = 0;
2026 1.1 skrll
2027 1.1 skrll last_tok = tok;
2028 1.1 skrll last_opnd_cnt = opnd_cnt;
2029 1.1 skrll
2030 1.1 skrll do
2031 1.1 skrll {
2032 1.1 skrll opnd_cnt += 1;
2033 1.1 skrll tok++;
2034 1.1 skrll }
2035 1.1 skrll while (xtensa_operand_is_visible (isa, opcode, opnd_cnt) == 0);
2036 1.1 skrll }
2037 1.1 skrll }
2038 1.1 skrll
2039 1.1 skrll if (num_regs > 0 && ((int) next_reg != last_tok->X_add_number + 1))
2040 1.1 skrll goto err;
2041 1.1 skrll
2042 1.1 skrll insn->ntok = tok - insn->tok;
2043 1.1 skrll had_error = FALSE;
2044 1.1 skrll
2045 1.1 skrll err:
2046 1.1 skrll input_line_pointer = old_input_line_pointer;
2047 1.1 skrll return had_error;
2048 1.1 skrll }
2049 1.1 skrll
2050 1.1 skrll
2051 1.1 skrll static int
2052 1.1 skrll get_invisible_operands (TInsn *insn)
2053 1.1 skrll {
2054 1.1 skrll xtensa_isa isa = xtensa_default_isa;
2055 1.1 skrll static xtensa_insnbuf slotbuf = NULL;
2056 1.1 skrll xtensa_format fmt;
2057 1.1 skrll xtensa_opcode opc = insn->opcode;
2058 1.1 skrll int slot, opnd, fmt_found;
2059 1.1 skrll unsigned val;
2060 1.1 skrll
2061 1.1 skrll if (!slotbuf)
2062 1.1 skrll slotbuf = xtensa_insnbuf_alloc (isa);
2063 1.1 skrll
2064 1.1 skrll /* Find format/slot where this can be encoded. */
2065 1.1 skrll fmt_found = 0;
2066 1.1 skrll slot = 0;
2067 1.1 skrll for (fmt = 0; fmt < xtensa_isa_num_formats (isa); fmt++)
2068 1.1 skrll {
2069 1.1 skrll for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
2070 1.1 skrll {
2071 1.1 skrll if (xtensa_opcode_encode (isa, fmt, slot, slotbuf, opc) == 0)
2072 1.1 skrll {
2073 1.1 skrll fmt_found = 1;
2074 1.1 skrll break;
2075 1.1 skrll }
2076 1.1 skrll }
2077 1.1 skrll if (fmt_found) break;
2078 1.1 skrll }
2079 1.1 skrll
2080 1.1 skrll if (!fmt_found)
2081 1.1 skrll {
2082 1.1 skrll as_bad (_("cannot encode opcode \"%s\""), xtensa_opcode_name (isa, opc));
2083 1.1 skrll return -1;
2084 1.1 skrll }
2085 1.1 skrll
2086 1.1 skrll /* First encode all the visible operands
2087 1.1 skrll (to deal with shared field operands). */
2088 1.1 skrll for (opnd = 0; opnd < insn->ntok; opnd++)
2089 1.1 skrll {
2090 1.1 skrll if (xtensa_operand_is_visible (isa, opc, opnd) == 1
2091 1.1 skrll && (insn->tok[opnd].X_op == O_register
2092 1.1 skrll || insn->tok[opnd].X_op == O_constant))
2093 1.1 skrll {
2094 1.1 skrll val = insn->tok[opnd].X_add_number;
2095 1.1 skrll xtensa_operand_encode (isa, opc, opnd, &val);
2096 1.1 skrll xtensa_operand_set_field (isa, opc, opnd, fmt, slot, slotbuf, val);
2097 1.1 skrll }
2098 1.1 skrll }
2099 1.1 skrll
2100 1.1 skrll /* Then pull out the values for the invisible ones. */
2101 1.1 skrll for (opnd = 0; opnd < insn->ntok; opnd++)
2102 1.1 skrll {
2103 1.1 skrll if (xtensa_operand_is_visible (isa, opc, opnd) == 0)
2104 1.1 skrll {
2105 1.1 skrll xtensa_operand_get_field (isa, opc, opnd, fmt, slot, slotbuf, &val);
2106 1.1 skrll xtensa_operand_decode (isa, opc, opnd, &val);
2107 1.1 skrll insn->tok[opnd].X_add_number = val;
2108 1.1 skrll if (xtensa_operand_is_register (isa, opc, opnd) == 1)
2109 1.1 skrll insn->tok[opnd].X_op = O_register;
2110 1.1 skrll else
2111 1.1 skrll insn->tok[opnd].X_op = O_constant;
2112 1.1 skrll }
2113 1.1 skrll }
2114 1.1 skrll
2115 1.1 skrll return 0;
2116 1.1 skrll }
2117 1.1 skrll
2118 1.1 skrll
2119 1.1 skrll static void
2120 1.1 skrll xg_reverse_shift_count (char **cnt_argp)
2121 1.1 skrll {
2122 1.1 skrll char *cnt_arg, *new_arg;
2123 1.1 skrll cnt_arg = *cnt_argp;
2124 1.1 skrll
2125 1.1 skrll /* replace the argument with "31-(argument)" */
2126 1.1 skrll new_arg = (char *) xmalloc (strlen (cnt_arg) + 6);
2127 1.1 skrll sprintf (new_arg, "31-(%s)", cnt_arg);
2128 1.1 skrll
2129 1.1 skrll free (cnt_arg);
2130 1.1 skrll *cnt_argp = new_arg;
2131 1.1 skrll }
2132 1.1 skrll
2133 1.1 skrll
2134 1.1 skrll /* If "arg" is a constant expression, return non-zero with the value
2135 1.1 skrll in *valp. */
2136 1.1 skrll
2137 1.1 skrll static int
2138 1.1 skrll xg_arg_is_constant (char *arg, offsetT *valp)
2139 1.1 skrll {
2140 1.1 skrll expressionS exp;
2141 1.1 skrll char *save_ptr = input_line_pointer;
2142 1.1 skrll
2143 1.1 skrll input_line_pointer = arg;
2144 1.1 skrll expression (&exp);
2145 1.1 skrll input_line_pointer = save_ptr;
2146 1.1 skrll
2147 1.1 skrll if (exp.X_op == O_constant)
2148 1.1 skrll {
2149 1.1 skrll *valp = exp.X_add_number;
2150 1.1 skrll return 1;
2151 1.1 skrll }
2152 1.1 skrll
2153 1.1 skrll return 0;
2154 1.1 skrll }
2155 1.1 skrll
2156 1.1 skrll
2157 1.1 skrll static void
2158 1.1 skrll xg_replace_opname (char **popname, char *newop)
2159 1.1 skrll {
2160 1.1 skrll free (*popname);
2161 1.1 skrll *popname = (char *) xmalloc (strlen (newop) + 1);
2162 1.1 skrll strcpy (*popname, newop);
2163 1.1 skrll }
2164 1.1 skrll
2165 1.1 skrll
2166 1.1 skrll static int
2167 1.1 skrll xg_check_num_args (int *pnum_args,
2168 1.1 skrll int expected_num,
2169 1.1 skrll char *opname,
2170 1.1 skrll char **arg_strings)
2171 1.1 skrll {
2172 1.1 skrll int num_args = *pnum_args;
2173 1.1 skrll
2174 1.1 skrll if (num_args < expected_num)
2175 1.1 skrll {
2176 1.1 skrll as_bad (_("not enough operands (%d) for '%s'; expected %d"),
2177 1.1 skrll num_args, opname, expected_num);
2178 1.1 skrll return -1;
2179 1.1 skrll }
2180 1.1 skrll
2181 1.1 skrll if (num_args > expected_num)
2182 1.1 skrll {
2183 1.1 skrll as_warn (_("too many operands (%d) for '%s'; expected %d"),
2184 1.1 skrll num_args, opname, expected_num);
2185 1.1 skrll while (num_args-- > expected_num)
2186 1.1 skrll {
2187 1.1 skrll free (arg_strings[num_args]);
2188 1.1 skrll arg_strings[num_args] = 0;
2189 1.1 skrll }
2190 1.1 skrll *pnum_args = expected_num;
2191 1.1 skrll return -1;
2192 1.1 skrll }
2193 1.1 skrll
2194 1.1 skrll return 0;
2195 1.1 skrll }
2196 1.1 skrll
2197 1.1 skrll
2198 1.1 skrll /* If the register is not specified as part of the opcode,
2199 1.1 skrll then get it from the operand and move it to the opcode. */
2200 1.1 skrll
2201 1.1 skrll static int
2202 1.1 skrll xg_translate_sysreg_op (char **popname, int *pnum_args, char **arg_strings)
2203 1.1 skrll {
2204 1.1 skrll xtensa_isa isa = xtensa_default_isa;
2205 1.1 skrll xtensa_sysreg sr;
2206 1.1 skrll char *opname, *new_opname;
2207 1.1 skrll const char *sr_name;
2208 1.1 skrll int is_user, is_write;
2209 1.1 skrll
2210 1.1 skrll opname = *popname;
2211 1.1 skrll if (*opname == '_')
2212 1.1 skrll opname += 1;
2213 1.1 skrll is_user = (opname[1] == 'u');
2214 1.1 skrll is_write = (opname[0] == 'w');
2215 1.1 skrll
2216 1.1 skrll /* Opname == [rw]ur or [rwx]sr... */
2217 1.1 skrll
2218 1.1 skrll if (xg_check_num_args (pnum_args, 2, opname, arg_strings))
2219 1.1 skrll return -1;
2220 1.1 skrll
2221 1.1 skrll /* Check if the argument is a symbolic register name. */
2222 1.1 skrll sr = xtensa_sysreg_lookup_name (isa, arg_strings[1]);
2223 1.1 skrll /* Handle WSR to "INTSET" as a special case. */
2224 1.1 skrll if (sr == XTENSA_UNDEFINED && is_write && !is_user
2225 1.1 skrll && !strcasecmp (arg_strings[1], "intset"))
2226 1.1 skrll sr = xtensa_sysreg_lookup_name (isa, "interrupt");
2227 1.1 skrll if (sr == XTENSA_UNDEFINED
2228 1.1 skrll || (xtensa_sysreg_is_user (isa, sr) == 1) != is_user)
2229 1.1 skrll {
2230 1.1 skrll /* Maybe it's a register number.... */
2231 1.1 skrll offsetT val;
2232 1.1 skrll if (!xg_arg_is_constant (arg_strings[1], &val))
2233 1.1 skrll {
2234 1.1 skrll as_bad (_("invalid register '%s' for '%s' instruction"),
2235 1.1 skrll arg_strings[1], opname);
2236 1.1 skrll return -1;
2237 1.1 skrll }
2238 1.1 skrll sr = xtensa_sysreg_lookup (isa, val, is_user);
2239 1.1 skrll if (sr == XTENSA_UNDEFINED)
2240 1.1 skrll {
2241 1.1 skrll as_bad (_("invalid register number (%ld) for '%s' instruction"),
2242 1.1 skrll (long) val, opname);
2243 1.1 skrll return -1;
2244 1.1 skrll }
2245 1.1 skrll }
2246 1.1 skrll
2247 1.1 skrll /* Remove the last argument, which is now part of the opcode. */
2248 1.1 skrll free (arg_strings[1]);
2249 1.1 skrll arg_strings[1] = 0;
2250 1.1 skrll *pnum_args = 1;
2251 1.1 skrll
2252 1.1 skrll /* Translate the opcode. */
2253 1.1 skrll sr_name = xtensa_sysreg_name (isa, sr);
2254 1.1 skrll /* Another special case for "WSR.INTSET".... */
2255 1.1 skrll if (is_write && !is_user && !strcasecmp ("interrupt", sr_name))
2256 1.1 skrll sr_name = "intset";
2257 1.1 skrll new_opname = (char *) xmalloc (strlen (sr_name) + 6);
2258 1.1 skrll sprintf (new_opname, "%s.%s", *popname, sr_name);
2259 1.1 skrll free (*popname);
2260 1.1 skrll *popname = new_opname;
2261 1.1 skrll
2262 1.1 skrll return 0;
2263 1.1 skrll }
2264 1.1 skrll
2265 1.1 skrll
2266 1.1 skrll static int
2267 1.1 skrll xtensa_translate_old_userreg_ops (char **popname)
2268 1.1 skrll {
2269 1.1 skrll xtensa_isa isa = xtensa_default_isa;
2270 1.1 skrll xtensa_sysreg sr;
2271 1.1 skrll char *opname, *new_opname;
2272 1.1 skrll const char *sr_name;
2273 1.1 skrll bfd_boolean has_underbar = FALSE;
2274 1.1 skrll
2275 1.1 skrll opname = *popname;
2276 1.1 skrll if (opname[0] == '_')
2277 1.1 skrll {
2278 1.1 skrll has_underbar = TRUE;
2279 1.1 skrll opname += 1;
2280 1.1 skrll }
2281 1.1 skrll
2282 1.1 skrll sr = xtensa_sysreg_lookup_name (isa, opname + 1);
2283 1.1 skrll if (sr != XTENSA_UNDEFINED)
2284 1.1 skrll {
2285 1.1 skrll /* The new default name ("nnn") is different from the old default
2286 1.1 skrll name ("URnnn"). The old default is handled below, and we don't
2287 1.1 skrll want to recognize [RW]nnn, so do nothing if the name is the (new)
2288 1.1 skrll default. */
2289 1.1 skrll static char namebuf[10];
2290 1.1 skrll sprintf (namebuf, "%d", xtensa_sysreg_number (isa, sr));
2291 1.1 skrll if (strcmp (namebuf, opname + 1) == 0)
2292 1.1 skrll return 0;
2293 1.1 skrll }
2294 1.1 skrll else
2295 1.1 skrll {
2296 1.1 skrll offsetT val;
2297 1.1 skrll char *end;
2298 1.1 skrll
2299 1.1 skrll /* Only continue if the reg name is "URnnn". */
2300 1.1 skrll if (opname[1] != 'u' || opname[2] != 'r')
2301 1.1 skrll return 0;
2302 1.1 skrll val = strtoul (opname + 3, &end, 10);
2303 1.1 skrll if (*end != '\0')
2304 1.1 skrll return 0;
2305 1.1 skrll
2306 1.1 skrll sr = xtensa_sysreg_lookup (isa, val, 1);
2307 1.1 skrll if (sr == XTENSA_UNDEFINED)
2308 1.1 skrll {
2309 1.1 skrll as_bad (_("invalid register number (%ld) for '%s'"),
2310 1.1 skrll (long) val, opname);
2311 1.1 skrll return -1;
2312 1.1 skrll }
2313 1.1 skrll }
2314 1.1 skrll
2315 1.1 skrll /* Translate the opcode. */
2316 1.1 skrll sr_name = xtensa_sysreg_name (isa, sr);
2317 1.1 skrll new_opname = (char *) xmalloc (strlen (sr_name) + 6);
2318 1.1 skrll sprintf (new_opname, "%s%cur.%s", (has_underbar ? "_" : ""),
2319 1.1 skrll opname[0], sr_name);
2320 1.1 skrll free (*popname);
2321 1.1 skrll *popname = new_opname;
2322 1.1 skrll
2323 1.1 skrll return 0;
2324 1.1 skrll }
2325 1.1 skrll
2326 1.1 skrll
2327 1.1 skrll static int
2328 1.1 skrll xtensa_translate_zero_immed (char *old_op,
2329 1.1 skrll char *new_op,
2330 1.1 skrll char **popname,
2331 1.1 skrll int *pnum_args,
2332 1.1 skrll char **arg_strings)
2333 1.1 skrll {
2334 1.1 skrll char *opname;
2335 1.1 skrll offsetT val;
2336 1.1 skrll
2337 1.1 skrll opname = *popname;
2338 1.1 skrll assert (opname[0] != '_');
2339 1.1 skrll
2340 1.1 skrll if (strcmp (opname, old_op) != 0)
2341 1.1 skrll return 0;
2342 1.1 skrll
2343 1.1 skrll if (xg_check_num_args (pnum_args, 3, opname, arg_strings))
2344 1.1 skrll return -1;
2345 1.1 skrll if (xg_arg_is_constant (arg_strings[1], &val) && val == 0)
2346 1.1 skrll {
2347 1.1 skrll xg_replace_opname (popname, new_op);
2348 1.1 skrll free (arg_strings[1]);
2349 1.1 skrll arg_strings[1] = arg_strings[2];
2350 1.1 skrll arg_strings[2] = 0;
2351 1.1 skrll *pnum_args = 2;
2352 1.1 skrll }
2353 1.1 skrll
2354 1.1 skrll return 0;
2355 1.1 skrll }
2356 1.1 skrll
2357 1.1 skrll
2358 1.1 skrll /* If the instruction is an idiom (i.e., a built-in macro), translate it.
2359 1.1 skrll Returns non-zero if an error was found. */
2360 1.1 skrll
2361 1.1 skrll static int
2362 1.1 skrll xg_translate_idioms (char **popname, int *pnum_args, char **arg_strings)
2363 1.1 skrll {
2364 1.1 skrll char *opname = *popname;
2365 1.1 skrll bfd_boolean has_underbar = FALSE;
2366 1.1 skrll
2367 1.1 skrll if (*opname == '_')
2368 1.1 skrll {
2369 1.1 skrll has_underbar = TRUE;
2370 1.1 skrll opname += 1;
2371 1.1 skrll }
2372 1.1 skrll
2373 1.1 skrll if (strcmp (opname, "mov") == 0)
2374 1.1 skrll {
2375 1.1 skrll if (use_transform () && !has_underbar && density_supported)
2376 1.1 skrll xg_replace_opname (popname, "mov.n");
2377 1.1 skrll else
2378 1.1 skrll {
2379 1.1 skrll if (xg_check_num_args (pnum_args, 2, opname, arg_strings))
2380 1.1 skrll return -1;
2381 1.1 skrll xg_replace_opname (popname, (has_underbar ? "_or" : "or"));
2382 1.1 skrll arg_strings[2] = (char *) xmalloc (strlen (arg_strings[1]) + 1);
2383 1.1 skrll strcpy (arg_strings[2], arg_strings[1]);
2384 1.1 skrll *pnum_args = 3;
2385 1.1 skrll }
2386 1.1 skrll return 0;
2387 1.1 skrll }
2388 1.1 skrll
2389 1.1 skrll if (strcmp (opname, "bbsi.l") == 0)
2390 1.1 skrll {
2391 1.1 skrll if (xg_check_num_args (pnum_args, 3, opname, arg_strings))
2392 1.1 skrll return -1;
2393 1.1 skrll xg_replace_opname (popname, (has_underbar ? "_bbsi" : "bbsi"));
2394 1.1 skrll if (target_big_endian)
2395 1.1 skrll xg_reverse_shift_count (&arg_strings[1]);
2396 1.1 skrll return 0;
2397 1.1 skrll }
2398 1.1 skrll
2399 1.1 skrll if (strcmp (opname, "bbci.l") == 0)
2400 1.1 skrll {
2401 1.1 skrll if (xg_check_num_args (pnum_args, 3, opname, arg_strings))
2402 1.1 skrll return -1;
2403 1.1 skrll xg_replace_opname (popname, (has_underbar ? "_bbci" : "bbci"));
2404 1.1 skrll if (target_big_endian)
2405 1.1 skrll xg_reverse_shift_count (&arg_strings[1]);
2406 1.1 skrll return 0;
2407 1.1 skrll }
2408 1.1 skrll
2409 1.1 skrll /* Don't do anything special with NOPs inside FLIX instructions. They
2410 1.1 skrll are handled elsewhere. Real NOP instructions are always available
2411 1.1 skrll in configurations with FLIX, so this should never be an issue but
2412 1.1 skrll check for it anyway. */
2413 1.1 skrll if (!cur_vinsn.inside_bundle && xtensa_nop_opcode == XTENSA_UNDEFINED
2414 1.1 skrll && strcmp (opname, "nop") == 0)
2415 1.1 skrll {
2416 1.1 skrll if (use_transform () && !has_underbar && density_supported)
2417 1.1 skrll xg_replace_opname (popname, "nop.n");
2418 1.1 skrll else
2419 1.1 skrll {
2420 1.1 skrll if (xg_check_num_args (pnum_args, 0, opname, arg_strings))
2421 1.1 skrll return -1;
2422 1.1 skrll xg_replace_opname (popname, (has_underbar ? "_or" : "or"));
2423 1.1 skrll arg_strings[0] = (char *) xmalloc (3);
2424 1.1 skrll arg_strings[1] = (char *) xmalloc (3);
2425 1.1 skrll arg_strings[2] = (char *) xmalloc (3);
2426 1.1 skrll strcpy (arg_strings[0], "a1");
2427 1.1 skrll strcpy (arg_strings[1], "a1");
2428 1.1 skrll strcpy (arg_strings[2], "a1");
2429 1.1 skrll *pnum_args = 3;
2430 1.1 skrll }
2431 1.1 skrll return 0;
2432 1.1 skrll }
2433 1.1 skrll
2434 1.1 skrll /* Recognize [RW]UR and [RWX]SR. */
2435 1.1 skrll if ((((opname[0] == 'r' || opname[0] == 'w')
2436 1.1 skrll && (opname[1] == 'u' || opname[1] == 's'))
2437 1.1 skrll || (opname[0] == 'x' && opname[1] == 's'))
2438 1.1 skrll && opname[2] == 'r'
2439 1.1 skrll && opname[3] == '\0')
2440 1.1 skrll return xg_translate_sysreg_op (popname, pnum_args, arg_strings);
2441 1.1 skrll
2442 1.1 skrll /* Backward compatibility for RUR and WUR: Recognize [RW]UR<nnn> and
2443 1.1 skrll [RW]<name> if <name> is the non-default name of a user register. */
2444 1.1 skrll if ((opname[0] == 'r' || opname[0] == 'w')
2445 1.1 skrll && xtensa_opcode_lookup (xtensa_default_isa, opname) == XTENSA_UNDEFINED)
2446 1.1 skrll return xtensa_translate_old_userreg_ops (popname);
2447 1.1 skrll
2448 1.1 skrll /* Relax branches that don't allow comparisons against an immediate value
2449 1.1 skrll of zero to the corresponding branches with implicit zero immediates. */
2450 1.1 skrll if (!has_underbar && use_transform ())
2451 1.1 skrll {
2452 1.1 skrll if (xtensa_translate_zero_immed ("bnei", "bnez", popname,
2453 1.1 skrll pnum_args, arg_strings))
2454 1.1 skrll return -1;
2455 1.1 skrll
2456 1.1 skrll if (xtensa_translate_zero_immed ("beqi", "beqz", popname,
2457 1.1 skrll pnum_args, arg_strings))
2458 1.1 skrll return -1;
2459 1.1 skrll
2460 1.1 skrll if (xtensa_translate_zero_immed ("bgei", "bgez", popname,
2461 1.1 skrll pnum_args, arg_strings))
2462 1.1 skrll return -1;
2463 1.1 skrll
2464 1.1 skrll if (xtensa_translate_zero_immed ("blti", "bltz", popname,
2465 1.1 skrll pnum_args, arg_strings))
2466 1.1 skrll return -1;
2467 1.1 skrll }
2468 1.1 skrll
2469 1.1 skrll return 0;
2470 1.1 skrll }
2471 1.1 skrll
2472 1.1 skrll
2473 1.1 skrll /* Functions for dealing with the Xtensa ISA. */
2475 1.1 skrll
2476 1.1 skrll /* Currently the assembler only allows us to use a single target per
2477 1.1 skrll fragment. Because of this, only one operand for a given
2478 1.1 skrll instruction may be symbolic. If there is a PC-relative operand,
2479 1.1 skrll the last one is chosen. Otherwise, the result is the number of the
2480 1.1 skrll last immediate operand, and if there are none of those, we fail and
2481 1.1 skrll return -1. */
2482 1.1 skrll
2483 1.1 skrll static int
2484 1.1 skrll get_relaxable_immed (xtensa_opcode opcode)
2485 1.1 skrll {
2486 1.1 skrll int last_immed = -1;
2487 1.1 skrll int noperands, opi;
2488 1.1 skrll
2489 1.1 skrll if (opcode == XTENSA_UNDEFINED)
2490 1.1 skrll return -1;
2491 1.1 skrll
2492 1.1 skrll noperands = xtensa_opcode_num_operands (xtensa_default_isa, opcode);
2493 1.1 skrll for (opi = noperands - 1; opi >= 0; opi--)
2494 1.1 skrll {
2495 1.1 skrll if (xtensa_operand_is_visible (xtensa_default_isa, opcode, opi) == 0)
2496 1.1 skrll continue;
2497 1.1 skrll if (xtensa_operand_is_PCrelative (xtensa_default_isa, opcode, opi) == 1)
2498 1.1 skrll return opi;
2499 1.1 skrll if (last_immed == -1
2500 1.1 skrll && xtensa_operand_is_register (xtensa_default_isa, opcode, opi) == 0)
2501 1.1 skrll last_immed = opi;
2502 1.1 skrll }
2503 1.1 skrll return last_immed;
2504 1.1 skrll }
2505 1.1 skrll
2506 1.1 skrll
2507 1.1 skrll static xtensa_opcode
2508 1.1 skrll get_opcode_from_buf (const char *buf, int slot)
2509 1.1 skrll {
2510 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
2511 1.1 skrll static xtensa_insnbuf slotbuf = NULL;
2512 1.1 skrll xtensa_isa isa = xtensa_default_isa;
2513 1.1 skrll xtensa_format fmt;
2514 1.1 skrll
2515 1.1 skrll if (!insnbuf)
2516 1.1 skrll {
2517 1.1 skrll insnbuf = xtensa_insnbuf_alloc (isa);
2518 1.1 skrll slotbuf = xtensa_insnbuf_alloc (isa);
2519 1.1 skrll }
2520 1.1 skrll
2521 1.1 skrll xtensa_insnbuf_from_chars (isa, insnbuf, (const unsigned char *) buf, 0);
2522 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
2523 1.1 skrll if (fmt == XTENSA_UNDEFINED)
2524 1.1 skrll return XTENSA_UNDEFINED;
2525 1.1 skrll
2526 1.1 skrll if (slot >= xtensa_format_num_slots (isa, fmt))
2527 1.1 skrll return XTENSA_UNDEFINED;
2528 1.1 skrll
2529 1.1 skrll xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
2530 1.1 skrll return xtensa_opcode_decode (isa, fmt, slot, slotbuf);
2531 1.1 skrll }
2532 1.1 skrll
2533 1.1 skrll
2534 1.1 skrll #ifdef TENSILICA_DEBUG
2535 1.1 skrll
2536 1.1 skrll /* For debugging, print out the mapping of opcode numbers to opcodes. */
2537 1.1 skrll
2538 1.1 skrll static void
2539 1.1 skrll xtensa_print_insn_table (void)
2540 1.1 skrll {
2541 1.1 skrll int num_opcodes, num_operands;
2542 1.1 skrll xtensa_opcode opcode;
2543 1.1 skrll xtensa_isa isa = xtensa_default_isa;
2544 1.1 skrll
2545 1.1 skrll num_opcodes = xtensa_isa_num_opcodes (xtensa_default_isa);
2546 1.1 skrll for (opcode = 0; opcode < num_opcodes; opcode++)
2547 1.1 skrll {
2548 1.1 skrll int opn;
2549 1.1 skrll fprintf (stderr, "%d: %s: ", opcode, xtensa_opcode_name (isa, opcode));
2550 1.1 skrll num_operands = xtensa_opcode_num_operands (isa, opcode);
2551 1.1 skrll for (opn = 0; opn < num_operands; opn++)
2552 1.1 skrll {
2553 1.1 skrll if (xtensa_operand_is_visible (isa, opcode, opn) == 0)
2554 1.1 skrll continue;
2555 1.1 skrll if (xtensa_operand_is_register (isa, opcode, opn) == 1)
2556 1.1 skrll {
2557 1.1 skrll xtensa_regfile opnd_rf =
2558 1.1 skrll xtensa_operand_regfile (isa, opcode, opn);
2559 1.1 skrll fprintf (stderr, "%s ", xtensa_regfile_shortname (isa, opnd_rf));
2560 1.1 skrll }
2561 1.1 skrll else if (xtensa_operand_is_PCrelative (isa, opcode, opn) == 1)
2562 1.1 skrll fputs ("[lLr] ", stderr);
2563 1.1 skrll else
2564 1.1 skrll fputs ("i ", stderr);
2565 1.1 skrll }
2566 1.1 skrll fprintf (stderr, "\n");
2567 1.1 skrll }
2568 1.1 skrll }
2569 1.1 skrll
2570 1.1 skrll
2571 1.1 skrll static void
2572 1.1 skrll print_vliw_insn (xtensa_insnbuf vbuf)
2573 1.1 skrll {
2574 1.1 skrll xtensa_isa isa = xtensa_default_isa;
2575 1.1 skrll xtensa_format f = xtensa_format_decode (isa, vbuf);
2576 1.1 skrll xtensa_insnbuf sbuf = xtensa_insnbuf_alloc (isa);
2577 1.1 skrll int op;
2578 1.1 skrll
2579 1.1 skrll fprintf (stderr, "format = %d\n", f);
2580 1.1 skrll
2581 1.1 skrll for (op = 0; op < xtensa_format_num_slots (isa, f); op++)
2582 1.1 skrll {
2583 1.1 skrll xtensa_opcode opcode;
2584 1.1 skrll const char *opname;
2585 1.1 skrll int operands;
2586 1.1 skrll
2587 1.1 skrll xtensa_format_get_slot (isa, f, op, vbuf, sbuf);
2588 1.1 skrll opcode = xtensa_opcode_decode (isa, f, op, sbuf);
2589 1.1 skrll opname = xtensa_opcode_name (isa, opcode);
2590 1.1 skrll
2591 1.1 skrll fprintf (stderr, "op in slot %i is %s;\n", op, opname);
2592 1.1 skrll fprintf (stderr, " operands = ");
2593 1.1 skrll for (operands = 0;
2594 1.1 skrll operands < xtensa_opcode_num_operands (isa, opcode);
2595 1.1 skrll operands++)
2596 1.1 skrll {
2597 1.1 skrll unsigned int val;
2598 1.1 skrll if (xtensa_operand_is_visible (isa, opcode, operands) == 0)
2599 1.1 skrll continue;
2600 1.1 skrll xtensa_operand_get_field (isa, opcode, operands, f, op, sbuf, &val);
2601 1.1 skrll xtensa_operand_decode (isa, opcode, operands, &val);
2602 1.1 skrll fprintf (stderr, "%d ", val);
2603 1.1 skrll }
2604 1.1 skrll fprintf (stderr, "\n");
2605 1.1 skrll }
2606 1.1 skrll xtensa_insnbuf_free (isa, sbuf);
2607 1.1 skrll }
2608 1.1 skrll
2609 1.1 skrll #endif /* TENSILICA_DEBUG */
2610 1.1 skrll
2611 1.1 skrll
2612 1.1 skrll static bfd_boolean
2613 1.1 skrll is_direct_call_opcode (xtensa_opcode opcode)
2614 1.1 skrll {
2615 1.1 skrll xtensa_isa isa = xtensa_default_isa;
2616 1.1 skrll int n, num_operands;
2617 1.1 skrll
2618 1.1 skrll if (xtensa_opcode_is_call (isa, opcode) != 1)
2619 1.1 skrll return FALSE;
2620 1.1 skrll
2621 1.1 skrll num_operands = xtensa_opcode_num_operands (isa, opcode);
2622 1.1 skrll for (n = 0; n < num_operands; n++)
2623 1.1 skrll {
2624 1.1 skrll if (xtensa_operand_is_register (isa, opcode, n) == 0
2625 1.1 skrll && xtensa_operand_is_PCrelative (isa, opcode, n) == 1)
2626 1.1 skrll return TRUE;
2627 1.1 skrll }
2628 1.1 skrll return FALSE;
2629 1.1 skrll }
2630 1.1 skrll
2631 1.1 skrll
2632 1.1 skrll /* Convert from BFD relocation type code to slot and operand number.
2633 1.1 skrll Returns non-zero on failure. */
2634 1.1 skrll
2635 1.1 skrll static int
2636 1.1 skrll decode_reloc (bfd_reloc_code_real_type reloc, int *slot, bfd_boolean *is_alt)
2637 1.1 skrll {
2638 1.1 skrll if (reloc >= BFD_RELOC_XTENSA_SLOT0_OP
2639 1.1 skrll && reloc <= BFD_RELOC_XTENSA_SLOT14_OP)
2640 1.1 skrll {
2641 1.1 skrll *slot = reloc - BFD_RELOC_XTENSA_SLOT0_OP;
2642 1.1 skrll *is_alt = FALSE;
2643 1.1 skrll }
2644 1.1 skrll else if (reloc >= BFD_RELOC_XTENSA_SLOT0_ALT
2645 1.1 skrll && reloc <= BFD_RELOC_XTENSA_SLOT14_ALT)
2646 1.1 skrll {
2647 1.1 skrll *slot = reloc - BFD_RELOC_XTENSA_SLOT0_ALT;
2648 1.1 skrll *is_alt = TRUE;
2649 1.1 skrll }
2650 1.1 skrll else
2651 1.1 skrll return -1;
2652 1.1 skrll
2653 1.1 skrll return 0;
2654 1.1 skrll }
2655 1.1 skrll
2656 1.1 skrll
2657 1.1 skrll /* Convert from slot number to BFD relocation type code for the
2658 1.1 skrll standard PC-relative relocations. Return BFD_RELOC_NONE on
2659 1.1 skrll failure. */
2660 1.1 skrll
2661 1.1 skrll static bfd_reloc_code_real_type
2662 1.1 skrll encode_reloc (int slot)
2663 1.1 skrll {
2664 1.1 skrll if (slot < 0 || slot > 14)
2665 1.1 skrll return BFD_RELOC_NONE;
2666 1.1 skrll
2667 1.1 skrll return BFD_RELOC_XTENSA_SLOT0_OP + slot;
2668 1.1 skrll }
2669 1.1 skrll
2670 1.1 skrll
2671 1.1 skrll /* Convert from slot numbers to BFD relocation type code for the
2672 1.1 skrll "alternate" relocations. Return BFD_RELOC_NONE on failure. */
2673 1.1 skrll
2674 1.1 skrll static bfd_reloc_code_real_type
2675 1.1 skrll encode_alt_reloc (int slot)
2676 1.1 skrll {
2677 1.1 skrll if (slot < 0 || slot > 14)
2678 1.1 skrll return BFD_RELOC_NONE;
2679 1.1 skrll
2680 1.1 skrll return BFD_RELOC_XTENSA_SLOT0_ALT + slot;
2681 1.1 skrll }
2682 1.1 skrll
2683 1.1 skrll
2684 1.1 skrll static void
2685 1.1 skrll xtensa_insnbuf_set_operand (xtensa_insnbuf slotbuf,
2686 1.1 skrll xtensa_format fmt,
2687 1.1 skrll int slot,
2688 1.1 skrll xtensa_opcode opcode,
2689 1.1 skrll int operand,
2690 1.1 skrll uint32 value,
2691 1.1 skrll const char *file,
2692 1.1 skrll unsigned int line)
2693 1.1 skrll {
2694 1.1 skrll uint32 valbuf = value;
2695 1.1 skrll
2696 1.1 skrll if (xtensa_operand_encode (xtensa_default_isa, opcode, operand, &valbuf))
2697 1.1 skrll {
2698 1.1 skrll if (xtensa_operand_is_PCrelative (xtensa_default_isa, opcode, operand)
2699 1.1 skrll == 1)
2700 1.1 skrll as_bad_where ((char *) file, line,
2701 1.1 skrll _("operand %d of '%s' has out of range value '%u'"),
2702 1.1 skrll operand + 1,
2703 1.1 skrll xtensa_opcode_name (xtensa_default_isa, opcode),
2704 1.1 skrll value);
2705 1.1 skrll else
2706 1.1 skrll as_bad_where ((char *) file, line,
2707 1.1 skrll _("operand %d of '%s' has invalid value '%u'"),
2708 1.1 skrll operand + 1,
2709 1.1 skrll xtensa_opcode_name (xtensa_default_isa, opcode),
2710 1.1 skrll value);
2711 1.1 skrll return;
2712 1.1 skrll }
2713 1.1 skrll
2714 1.1 skrll xtensa_operand_set_field (xtensa_default_isa, opcode, operand, fmt, slot,
2715 1.1 skrll slotbuf, valbuf);
2716 1.1 skrll }
2717 1.1 skrll
2718 1.1 skrll
2719 1.1 skrll static uint32
2720 1.1 skrll xtensa_insnbuf_get_operand (xtensa_insnbuf slotbuf,
2721 1.1 skrll xtensa_format fmt,
2722 1.1 skrll int slot,
2723 1.1 skrll xtensa_opcode opcode,
2724 1.1 skrll int opnum)
2725 1.1 skrll {
2726 1.1 skrll uint32 val = 0;
2727 1.1 skrll (void) xtensa_operand_get_field (xtensa_default_isa, opcode, opnum,
2728 1.1 skrll fmt, slot, slotbuf, &val);
2729 1.1 skrll (void) xtensa_operand_decode (xtensa_default_isa, opcode, opnum, &val);
2730 1.1 skrll return val;
2731 1.1 skrll }
2732 1.1 skrll
2733 1.1 skrll
2734 1.1 skrll /* Checks for rules from xtensa-relax tables. */
2736 1.1 skrll
2737 1.1 skrll /* The routine xg_instruction_matches_option_term must return TRUE
2738 1.1 skrll when a given option term is true. The meaning of all of the option
2739 1.1 skrll terms is given interpretation by this function. This is needed when
2740 1.1 skrll an option depends on the state of a directive, but there are no such
2741 1.1 skrll options in use right now. */
2742 1.1 skrll
2743 1.1 skrll static bfd_boolean
2744 1.1 skrll xg_instruction_matches_option_term (TInsn *insn ATTRIBUTE_UNUSED,
2745 1.1 skrll const ReqOrOption *option)
2746 1.1 skrll {
2747 1.1 skrll if (strcmp (option->option_name, "realnop") == 0
2748 1.1 skrll || strncmp (option->option_name, "IsaUse", 6) == 0)
2749 1.1 skrll {
2750 1.1 skrll /* These conditions were evaluated statically when building the
2751 1.1 skrll relaxation table. There's no need to reevaluate them now. */
2752 1.1 skrll return TRUE;
2753 1.1 skrll }
2754 1.1 skrll else
2755 1.1 skrll {
2756 1.1 skrll as_fatal (_("internal error: unknown option name '%s'"),
2757 1.1 skrll option->option_name);
2758 1.1 skrll }
2759 1.1 skrll }
2760 1.1 skrll
2761 1.1 skrll
2762 1.1 skrll static bfd_boolean
2763 1.1 skrll xg_instruction_matches_or_options (TInsn *insn,
2764 1.1 skrll const ReqOrOptionList *or_option)
2765 1.1 skrll {
2766 1.1 skrll const ReqOrOption *option;
2767 1.1 skrll /* Must match each of the AND terms. */
2768 1.1 skrll for (option = or_option; option != NULL; option = option->next)
2769 1.1 skrll {
2770 1.1 skrll if (xg_instruction_matches_option_term (insn, option))
2771 1.1 skrll return TRUE;
2772 1.1 skrll }
2773 1.1 skrll return FALSE;
2774 1.1 skrll }
2775 1.1 skrll
2776 1.1 skrll
2777 1.1 skrll static bfd_boolean
2778 1.1 skrll xg_instruction_matches_options (TInsn *insn, const ReqOptionList *options)
2779 1.1 skrll {
2780 1.1 skrll const ReqOption *req_options;
2781 1.1 skrll /* Must match each of the AND terms. */
2782 1.1 skrll for (req_options = options;
2783 1.1 skrll req_options != NULL;
2784 1.1 skrll req_options = req_options->next)
2785 1.1 skrll {
2786 1.1 skrll /* Must match one of the OR clauses. */
2787 1.1 skrll if (!xg_instruction_matches_or_options (insn,
2788 1.1 skrll req_options->or_option_terms))
2789 1.1 skrll return FALSE;
2790 1.1 skrll }
2791 1.1 skrll return TRUE;
2792 1.1 skrll }
2793 1.1 skrll
2794 1.1 skrll
2795 1.1 skrll /* Return the transition rule that matches or NULL if none matches. */
2796 1.1 skrll
2797 1.1 skrll static bfd_boolean
2798 1.1 skrll xg_instruction_matches_rule (TInsn *insn, TransitionRule *rule)
2799 1.1 skrll {
2800 1.1 skrll PreconditionList *condition_l;
2801 1.1 skrll
2802 1.1 skrll if (rule->opcode != insn->opcode)
2803 1.1 skrll return FALSE;
2804 1.1 skrll
2805 1.1 skrll for (condition_l = rule->conditions;
2806 1.1 skrll condition_l != NULL;
2807 1.1 skrll condition_l = condition_l->next)
2808 1.1 skrll {
2809 1.1 skrll expressionS *exp1;
2810 1.1 skrll expressionS *exp2;
2811 1.1 skrll Precondition *cond = condition_l->precond;
2812 1.1 skrll
2813 1.1 skrll switch (cond->typ)
2814 1.1 skrll {
2815 1.1 skrll case OP_CONSTANT:
2816 1.1 skrll /* The expression must be the constant. */
2817 1.1 skrll assert (cond->op_num < insn->ntok);
2818 1.1 skrll exp1 = &insn->tok[cond->op_num];
2819 1.1 skrll if (expr_is_const (exp1))
2820 1.1 skrll {
2821 1.1 skrll switch (cond->cmp)
2822 1.1 skrll {
2823 1.1 skrll case OP_EQUAL:
2824 1.1 skrll if (get_expr_const (exp1) != cond->op_data)
2825 1.1 skrll return FALSE;
2826 1.1 skrll break;
2827 1.1 skrll case OP_NOTEQUAL:
2828 1.1 skrll if (get_expr_const (exp1) == cond->op_data)
2829 1.1 skrll return FALSE;
2830 1.1 skrll break;
2831 1.1 skrll default:
2832 1.1 skrll return FALSE;
2833 1.1 skrll }
2834 1.1 skrll }
2835 1.1 skrll else if (expr_is_register (exp1))
2836 1.1 skrll {
2837 1.1 skrll switch (cond->cmp)
2838 1.1 skrll {
2839 1.1 skrll case OP_EQUAL:
2840 1.1 skrll if (get_expr_register (exp1) != cond->op_data)
2841 1.1 skrll return FALSE;
2842 1.1 skrll break;
2843 1.1 skrll case OP_NOTEQUAL:
2844 1.1 skrll if (get_expr_register (exp1) == cond->op_data)
2845 1.1 skrll return FALSE;
2846 1.1 skrll break;
2847 1.1 skrll default:
2848 1.1 skrll return FALSE;
2849 1.1 skrll }
2850 1.1 skrll }
2851 1.1 skrll else
2852 1.1 skrll return FALSE;
2853 1.1 skrll break;
2854 1.1 skrll
2855 1.1 skrll case OP_OPERAND:
2856 1.1 skrll assert (cond->op_num < insn->ntok);
2857 1.1 skrll assert (cond->op_data < insn->ntok);
2858 1.1 skrll exp1 = &insn->tok[cond->op_num];
2859 1.1 skrll exp2 = &insn->tok[cond->op_data];
2860 1.1 skrll
2861 1.1 skrll switch (cond->cmp)
2862 1.1 skrll {
2863 1.1 skrll case OP_EQUAL:
2864 1.1 skrll if (!expr_is_equal (exp1, exp2))
2865 1.1 skrll return FALSE;
2866 1.1 skrll break;
2867 1.1 skrll case OP_NOTEQUAL:
2868 1.1 skrll if (expr_is_equal (exp1, exp2))
2869 1.1 skrll return FALSE;
2870 1.1 skrll break;
2871 1.1 skrll }
2872 1.1 skrll break;
2873 1.1 skrll
2874 1.1 skrll case OP_LITERAL:
2875 1.1 skrll case OP_LABEL:
2876 1.1 skrll default:
2877 1.1 skrll return FALSE;
2878 1.1 skrll }
2879 1.1 skrll }
2880 1.1 skrll if (!xg_instruction_matches_options (insn, rule->options))
2881 1.1 skrll return FALSE;
2882 1.1 skrll
2883 1.1 skrll return TRUE;
2884 1.1 skrll }
2885 1.1 skrll
2886 1.1 skrll
2887 1.1 skrll static int
2888 1.1 skrll transition_rule_cmp (const TransitionRule *a, const TransitionRule *b)
2889 1.1 skrll {
2890 1.1 skrll bfd_boolean a_greater = FALSE;
2891 1.1 skrll bfd_boolean b_greater = FALSE;
2892 1.1 skrll
2893 1.1 skrll ReqOptionList *l_a = a->options;
2894 1.1 skrll ReqOptionList *l_b = b->options;
2895 1.1 skrll
2896 1.1 skrll /* We only care if they both are the same except for
2897 1.1 skrll a const16 vs. an l32r. */
2898 1.1 skrll
2899 1.1 skrll while (l_a && l_b && ((l_a->next == NULL) == (l_b->next == NULL)))
2900 1.1 skrll {
2901 1.1 skrll ReqOrOptionList *l_or_a = l_a->or_option_terms;
2902 1.1 skrll ReqOrOptionList *l_or_b = l_b->or_option_terms;
2903 1.1 skrll while (l_or_a && l_or_b && ((l_a->next == NULL) == (l_b->next == NULL)))
2904 1.1 skrll {
2905 1.1 skrll if (l_or_a->is_true != l_or_b->is_true)
2906 1.1 skrll return 0;
2907 1.1 skrll if (strcmp (l_or_a->option_name, l_or_b->option_name) != 0)
2908 1.1 skrll {
2909 1.1 skrll /* This is the case we care about. */
2910 1.1 skrll if (strcmp (l_or_a->option_name, "IsaUseConst16") == 0
2911 1.1 skrll && strcmp (l_or_b->option_name, "IsaUseL32R") == 0)
2912 1.1 skrll {
2913 1.1 skrll if (prefer_const16)
2914 1.1 skrll a_greater = TRUE;
2915 1.1 skrll else
2916 1.1 skrll b_greater = TRUE;
2917 1.1 skrll }
2918 1.1 skrll else if (strcmp (l_or_a->option_name, "IsaUseL32R") == 0
2919 1.1 skrll && strcmp (l_or_b->option_name, "IsaUseConst16") == 0)
2920 1.1 skrll {
2921 1.1 skrll if (prefer_const16)
2922 1.1 skrll b_greater = TRUE;
2923 1.1 skrll else
2924 1.1 skrll a_greater = TRUE;
2925 1.1 skrll }
2926 1.1 skrll else
2927 1.1 skrll return 0;
2928 1.1 skrll }
2929 1.1 skrll l_or_a = l_or_a->next;
2930 1.1 skrll l_or_b = l_or_b->next;
2931 1.1 skrll }
2932 1.1 skrll if (l_or_a || l_or_b)
2933 1.1 skrll return 0;
2934 1.1 skrll
2935 1.1 skrll l_a = l_a->next;
2936 1.1 skrll l_b = l_b->next;
2937 1.1 skrll }
2938 1.1 skrll if (l_a || l_b)
2939 1.1 skrll return 0;
2940 1.1 skrll
2941 1.1 skrll /* Incomparable if the substitution was used differently in two cases. */
2942 1.1 skrll if (a_greater && b_greater)
2943 1.1 skrll return 0;
2944 1.1 skrll
2945 1.1 skrll if (b_greater)
2946 1.1 skrll return 1;
2947 1.1 skrll if (a_greater)
2948 1.1 skrll return -1;
2949 1.1 skrll
2950 1.1 skrll return 0;
2951 1.1 skrll }
2952 1.1 skrll
2953 1.1 skrll
2954 1.1 skrll static TransitionRule *
2955 1.1 skrll xg_instruction_match (TInsn *insn)
2956 1.1 skrll {
2957 1.1 skrll TransitionTable *table = xg_build_simplify_table (&transition_rule_cmp);
2958 1.1 skrll TransitionList *l;
2959 1.1 skrll assert (insn->opcode < table->num_opcodes);
2960 1.1 skrll
2961 1.1 skrll /* Walk through all of the possible transitions. */
2962 1.1 skrll for (l = table->table[insn->opcode]; l != NULL; l = l->next)
2963 1.1 skrll {
2964 1.1 skrll TransitionRule *rule = l->rule;
2965 1.1 skrll if (xg_instruction_matches_rule (insn, rule))
2966 1.1 skrll return rule;
2967 1.1 skrll }
2968 1.1 skrll return NULL;
2969 1.1 skrll }
2970 1.1 skrll
2971 1.1 skrll
2972 1.1 skrll /* Various Other Internal Functions. */
2974 1.1 skrll
2975 1.1 skrll static bfd_boolean
2976 1.1 skrll is_unique_insn_expansion (TransitionRule *r)
2977 1.1 skrll {
2978 1.1 skrll if (!r->to_instr || r->to_instr->next != NULL)
2979 1.1 skrll return FALSE;
2980 1.1 skrll if (r->to_instr->typ != INSTR_INSTR)
2981 1.1 skrll return FALSE;
2982 1.1 skrll return TRUE;
2983 1.1 skrll }
2984 1.1 skrll
2985 1.1 skrll
2986 1.1 skrll /* Check if there is exactly one relaxation for INSN that converts it to
2987 1.1 skrll another instruction of equal or larger size. If so, and if TARG is
2988 1.1 skrll non-null, go ahead and generate the relaxed instruction into TARG. If
2989 1.1 skrll NARROW_ONLY is true, then only consider relaxations that widen a narrow
2990 1.1 skrll instruction, i.e., ignore relaxations that convert to an instruction of
2991 1.1 skrll equal size. In some contexts where this function is used, only
2992 1.1 skrll a single widening is allowed and the NARROW_ONLY argument is used to
2993 1.1 skrll exclude cases like ADDI being "widened" to an ADDMI, which may
2994 1.1 skrll later be relaxed to an ADDMI/ADDI pair. */
2995 1.1 skrll
2996 1.1 skrll bfd_boolean
2997 1.1 skrll xg_is_single_relaxable_insn (TInsn *insn, TInsn *targ, bfd_boolean narrow_only)
2998 1.1 skrll {
2999 1.1 skrll TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3000 1.1 skrll TransitionList *l;
3001 1.1 skrll TransitionRule *match = 0;
3002 1.1 skrll
3003 1.1 skrll assert (insn->insn_type == ITYPE_INSN);
3004 1.1 skrll assert (insn->opcode < table->num_opcodes);
3005 1.1 skrll
3006 1.1 skrll for (l = table->table[insn->opcode]; l != NULL; l = l->next)
3007 1.1 skrll {
3008 1.1 skrll TransitionRule *rule = l->rule;
3009 1.1 skrll
3010 1.1 skrll if (xg_instruction_matches_rule (insn, rule)
3011 1.1 skrll && is_unique_insn_expansion (rule)
3012 1.1 skrll && (xg_get_single_size (insn->opcode) + (narrow_only ? 1 : 0)
3013 1.1 skrll <= xg_get_single_size (rule->to_instr->opcode)))
3014 1.1 skrll {
3015 1.1 skrll if (match)
3016 1.1 skrll return FALSE;
3017 1.1 skrll match = rule;
3018 1.1 skrll }
3019 1.1 skrll }
3020 1.1 skrll if (!match)
3021 1.1 skrll return FALSE;
3022 1.1 skrll
3023 1.1 skrll if (targ)
3024 1.1 skrll xg_build_to_insn (targ, insn, match->to_instr);
3025 1.1 skrll return TRUE;
3026 1.1 skrll }
3027 1.1 skrll
3028 1.1 skrll
3029 1.1 skrll /* Return the maximum number of bytes this opcode can expand to. */
3030 1.1 skrll
3031 1.1 skrll static int
3032 1.1 skrll xg_get_max_insn_widen_size (xtensa_opcode opcode)
3033 1.1 skrll {
3034 1.1 skrll TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3035 1.1 skrll TransitionList *l;
3036 1.1 skrll int max_size = xg_get_single_size (opcode);
3037 1.1 skrll
3038 1.1 skrll assert (opcode < table->num_opcodes);
3039 1.1 skrll
3040 1.1 skrll for (l = table->table[opcode]; l != NULL; l = l->next)
3041 1.1 skrll {
3042 1.1 skrll TransitionRule *rule = l->rule;
3043 1.1 skrll BuildInstr *build_list;
3044 1.1 skrll int this_size = 0;
3045 1.1 skrll
3046 1.1 skrll if (!rule)
3047 1.1 skrll continue;
3048 1.1 skrll build_list = rule->to_instr;
3049 1.1 skrll if (is_unique_insn_expansion (rule))
3050 1.1 skrll {
3051 1.1 skrll assert (build_list->typ == INSTR_INSTR);
3052 1.1 skrll this_size = xg_get_max_insn_widen_size (build_list->opcode);
3053 1.1 skrll }
3054 1.1 skrll else
3055 1.1 skrll for (; build_list != NULL; build_list = build_list->next)
3056 1.1 skrll {
3057 1.1 skrll switch (build_list->typ)
3058 1.1 skrll {
3059 1.1 skrll case INSTR_INSTR:
3060 1.1 skrll this_size += xg_get_single_size (build_list->opcode);
3061 1.1 skrll break;
3062 1.1 skrll case INSTR_LITERAL_DEF:
3063 1.1 skrll case INSTR_LABEL_DEF:
3064 1.1 skrll default:
3065 1.1 skrll break;
3066 1.1 skrll }
3067 1.1 skrll }
3068 1.1 skrll if (this_size > max_size)
3069 1.1 skrll max_size = this_size;
3070 1.1 skrll }
3071 1.1 skrll return max_size;
3072 1.1 skrll }
3073 1.1 skrll
3074 1.1 skrll
3075 1.1 skrll /* Return the maximum number of literal bytes this opcode can generate. */
3076 1.1 skrll
3077 1.1 skrll static int
3078 1.1 skrll xg_get_max_insn_widen_literal_size (xtensa_opcode opcode)
3079 1.1 skrll {
3080 1.1 skrll TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3081 1.1 skrll TransitionList *l;
3082 1.1 skrll int max_size = 0;
3083 1.1 skrll
3084 1.1 skrll assert (opcode < table->num_opcodes);
3085 1.1 skrll
3086 1.1 skrll for (l = table->table[opcode]; l != NULL; l = l->next)
3087 1.1 skrll {
3088 1.1 skrll TransitionRule *rule = l->rule;
3089 1.1 skrll BuildInstr *build_list;
3090 1.1 skrll int this_size = 0;
3091 1.1 skrll
3092 1.1 skrll if (!rule)
3093 1.1 skrll continue;
3094 1.1 skrll build_list = rule->to_instr;
3095 1.1 skrll if (is_unique_insn_expansion (rule))
3096 1.1 skrll {
3097 1.1 skrll assert (build_list->typ == INSTR_INSTR);
3098 1.1 skrll this_size = xg_get_max_insn_widen_literal_size (build_list->opcode);
3099 1.1 skrll }
3100 1.1 skrll else
3101 1.1 skrll for (; build_list != NULL; build_list = build_list->next)
3102 1.1 skrll {
3103 1.1 skrll switch (build_list->typ)
3104 1.1 skrll {
3105 1.1 skrll case INSTR_LITERAL_DEF:
3106 1.1 skrll /* Hard-coded 4-byte literal. */
3107 1.1 skrll this_size += 4;
3108 1.1 skrll break;
3109 1.1 skrll case INSTR_INSTR:
3110 1.1 skrll case INSTR_LABEL_DEF:
3111 1.1 skrll default:
3112 1.1 skrll break;
3113 1.1 skrll }
3114 1.1 skrll }
3115 1.1 skrll if (this_size > max_size)
3116 1.1 skrll max_size = this_size;
3117 1.1 skrll }
3118 1.1 skrll return max_size;
3119 1.1 skrll }
3120 1.1 skrll
3121 1.1 skrll
3122 1.1 skrll static bfd_boolean
3123 1.1 skrll xg_is_relaxable_insn (TInsn *insn, int lateral_steps)
3124 1.1 skrll {
3125 1.1 skrll int steps_taken = 0;
3126 1.1 skrll TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3127 1.1 skrll TransitionList *l;
3128 1.1 skrll
3129 1.1 skrll assert (insn->insn_type == ITYPE_INSN);
3130 1.1 skrll assert (insn->opcode < table->num_opcodes);
3131 1.1 skrll
3132 1.1 skrll for (l = table->table[insn->opcode]; l != NULL; l = l->next)
3133 1.1 skrll {
3134 1.1 skrll TransitionRule *rule = l->rule;
3135 1.1 skrll
3136 1.1 skrll if (xg_instruction_matches_rule (insn, rule))
3137 1.1 skrll {
3138 1.1 skrll if (steps_taken == lateral_steps)
3139 1.1 skrll return TRUE;
3140 1.1 skrll steps_taken++;
3141 1.1 skrll }
3142 1.1 skrll }
3143 1.1 skrll return FALSE;
3144 1.1 skrll }
3145 1.1 skrll
3146 1.1 skrll
3147 1.1 skrll static symbolS *
3148 1.1 skrll get_special_literal_symbol (void)
3149 1.1 skrll {
3150 1.1 skrll static symbolS *sym = NULL;
3151 1.1 skrll
3152 1.1 skrll if (sym == NULL)
3153 1.1 skrll sym = symbol_find_or_make ("SPECIAL_LITERAL0\001");
3154 1.1 skrll return sym;
3155 1.1 skrll }
3156 1.1 skrll
3157 1.1 skrll
3158 1.1 skrll static symbolS *
3159 1.1 skrll get_special_label_symbol (void)
3160 1.1 skrll {
3161 1.1 skrll static symbolS *sym = NULL;
3162 1.1 skrll
3163 1.1 skrll if (sym == NULL)
3164 1.1 skrll sym = symbol_find_or_make ("SPECIAL_LABEL0\001");
3165 1.1 skrll return sym;
3166 1.1 skrll }
3167 1.1 skrll
3168 1.1 skrll
3169 1.1 skrll static bfd_boolean
3170 1.1 skrll xg_valid_literal_expression (const expressionS *exp)
3171 1.1 skrll {
3172 1.1 skrll switch (exp->X_op)
3173 1.1 skrll {
3174 1.1 skrll case O_constant:
3175 1.1 skrll case O_symbol:
3176 1.1 skrll case O_big:
3177 1.1 skrll case O_uminus:
3178 1.1 skrll case O_subtract:
3179 1.1 skrll case O_pltrel:
3180 1.1 skrll case O_pcrel:
3181 1.1 skrll case O_tlsfunc:
3182 1.1 skrll case O_tlsarg:
3183 1.1 skrll case O_tpoff:
3184 1.1 skrll case O_dtpoff:
3185 1.1 skrll return TRUE;
3186 1.1 skrll default:
3187 1.1 skrll return FALSE;
3188 1.1 skrll }
3189 1.1 skrll }
3190 1.1 skrll
3191 1.1 skrll
3192 1.1 skrll /* This will check to see if the value can be converted into the
3193 1.1 skrll operand type. It will return TRUE if it does not fit. */
3194 1.1 skrll
3195 1.1 skrll static bfd_boolean
3196 1.1 skrll xg_check_operand (int32 value, xtensa_opcode opcode, int operand)
3197 1.1 skrll {
3198 1.1 skrll uint32 valbuf = value;
3199 1.1 skrll if (xtensa_operand_encode (xtensa_default_isa, opcode, operand, &valbuf))
3200 1.1 skrll return TRUE;
3201 1.1 skrll return FALSE;
3202 1.1 skrll }
3203 1.1 skrll
3204 1.1 skrll
3205 1.1 skrll /* Assumes: All immeds are constants. Check that all constants fit
3206 1.1 skrll into their immeds; return FALSE if not. */
3207 1.1 skrll
3208 1.1 skrll static bfd_boolean
3209 1.1 skrll xg_immeds_fit (const TInsn *insn)
3210 1.1 skrll {
3211 1.1 skrll xtensa_isa isa = xtensa_default_isa;
3212 1.1 skrll int i;
3213 1.1 skrll
3214 1.1 skrll int n = insn->ntok;
3215 1.1 skrll assert (insn->insn_type == ITYPE_INSN);
3216 1.1 skrll for (i = 0; i < n; ++i)
3217 1.1 skrll {
3218 1.1 skrll const expressionS *expr = &insn->tok[i];
3219 1.1 skrll if (xtensa_operand_is_register (isa, insn->opcode, i) == 1)
3220 1.1 skrll continue;
3221 1.1 skrll
3222 1.1 skrll switch (expr->X_op)
3223 1.1 skrll {
3224 1.1 skrll case O_register:
3225 1.1 skrll case O_constant:
3226 1.1 skrll if (xg_check_operand (expr->X_add_number, insn->opcode, i))
3227 1.1 skrll return FALSE;
3228 1.1 skrll break;
3229 1.1 skrll
3230 1.1 skrll default:
3231 1.1 skrll /* The symbol should have a fixup associated with it. */
3232 1.1 skrll assert (FALSE);
3233 1.1 skrll break;
3234 1.1 skrll }
3235 1.1 skrll }
3236 1.1 skrll return TRUE;
3237 1.1 skrll }
3238 1.1 skrll
3239 1.1 skrll
3240 1.1 skrll /* This should only be called after we have an initial
3241 1.1 skrll estimate of the addresses. */
3242 1.1 skrll
3243 1.1 skrll static bfd_boolean
3244 1.1 skrll xg_symbolic_immeds_fit (const TInsn *insn,
3245 1.1 skrll segT pc_seg,
3246 1.1 skrll fragS *pc_frag,
3247 1.1 skrll offsetT pc_offset,
3248 1.1 skrll long stretch)
3249 1.1 skrll {
3250 1.1 skrll xtensa_isa isa = xtensa_default_isa;
3251 1.1 skrll symbolS *symbolP;
3252 1.1 skrll fragS *sym_frag;
3253 1.1 skrll offsetT target, pc;
3254 1.1 skrll uint32 new_offset;
3255 1.1 skrll int i;
3256 1.1 skrll int n = insn->ntok;
3257 1.1 skrll
3258 1.1 skrll assert (insn->insn_type == ITYPE_INSN);
3259 1.1 skrll
3260 1.1 skrll for (i = 0; i < n; ++i)
3261 1.1 skrll {
3262 1.1 skrll const expressionS *expr = &insn->tok[i];
3263 1.1 skrll if (xtensa_operand_is_register (isa, insn->opcode, i) == 1)
3264 1.1 skrll continue;
3265 1.1 skrll
3266 1.1 skrll switch (expr->X_op)
3267 1.1 skrll {
3268 1.1 skrll case O_register:
3269 1.1 skrll case O_constant:
3270 1.1 skrll if (xg_check_operand (expr->X_add_number, insn->opcode, i))
3271 1.1 skrll return FALSE;
3272 1.1 skrll break;
3273 1.1 skrll
3274 1.1 skrll case O_lo16:
3275 1.1 skrll case O_hi16:
3276 1.1 skrll /* Check for the worst case. */
3277 1.1 skrll if (xg_check_operand (0xffff, insn->opcode, i))
3278 1.1 skrll return FALSE;
3279 1.1 skrll break;
3280 1.1 skrll
3281 1.1 skrll case O_symbol:
3282 1.1 skrll /* We only allow symbols for PC-relative references.
3283 1.1 skrll If pc_frag == 0, then we don't have frag locations yet. */
3284 1.1 skrll if (pc_frag == 0
3285 1.1 skrll || xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 0)
3286 1.1 skrll return FALSE;
3287 1.1 skrll
3288 1.1 skrll /* If it is a weak symbol or a symbol in a different section,
3289 1.1 skrll it cannot be known to fit at assembly time. */
3290 1.1 skrll if (S_IS_WEAK (expr->X_add_symbol)
3291 1.1 skrll || S_GET_SEGMENT (expr->X_add_symbol) != pc_seg)
3292 1.1 skrll {
3293 1.1 skrll /* For a direct call with --no-longcalls, be optimistic and
3294 1.1 skrll assume it will be in range. If the symbol is weak and
3295 1.1 skrll undefined, it may remain undefined at link-time, in which
3296 1.1 skrll case it will have a zero value and almost certainly be out
3297 1.1 skrll of range for a direct call; thus, relax for undefined weak
3298 1.1 skrll symbols even if longcalls is not enabled. */
3299 1.1 skrll if (is_direct_call_opcode (insn->opcode)
3300 1.1 skrll && ! pc_frag->tc_frag_data.use_longcalls
3301 1.1 skrll && (! S_IS_WEAK (expr->X_add_symbol)
3302 1.1 skrll || S_IS_DEFINED (expr->X_add_symbol)))
3303 1.1 skrll return TRUE;
3304 1.1 skrll
3305 1.1 skrll return FALSE;
3306 1.1 skrll }
3307 1.1 skrll
3308 1.1 skrll symbolP = expr->X_add_symbol;
3309 1.1 skrll sym_frag = symbol_get_frag (symbolP);
3310 1.1 skrll target = S_GET_VALUE (symbolP) + expr->X_add_number;
3311 1.1 skrll pc = pc_frag->fr_address + pc_offset;
3312 1.1 skrll
3313 1.1 skrll /* If frag has yet to be reached on this pass, assume it
3314 1.1 skrll will move by STRETCH just as we did. If this is not so,
3315 1.1 skrll it will be because some frag between grows, and that will
3316 1.1 skrll force another pass. Beware zero-length frags. There
3317 1.1 skrll should be a faster way to do this. */
3318 1.1 skrll
3319 1.1 skrll if (stretch != 0
3320 1.1 skrll && sym_frag->relax_marker != pc_frag->relax_marker
3321 1.1 skrll && S_GET_SEGMENT (symbolP) == pc_seg)
3322 1.1 skrll {
3323 1.1 skrll target += stretch;
3324 1.1 skrll }
3325 1.1 skrll
3326 1.1 skrll new_offset = target;
3327 1.1 skrll xtensa_operand_do_reloc (isa, insn->opcode, i, &new_offset, pc);
3328 1.1 skrll if (xg_check_operand (new_offset, insn->opcode, i))
3329 1.1 skrll return FALSE;
3330 1.1 skrll break;
3331 1.1 skrll
3332 1.1 skrll default:
3333 1.1 skrll /* The symbol should have a fixup associated with it. */
3334 1.1 skrll return FALSE;
3335 1.1 skrll }
3336 1.1 skrll }
3337 1.1 skrll
3338 1.1 skrll return TRUE;
3339 1.1 skrll }
3340 1.1 skrll
3341 1.1 skrll
3342 1.1 skrll /* Return TRUE on success. */
3343 1.1 skrll
3344 1.1 skrll static bfd_boolean
3345 1.1 skrll xg_build_to_insn (TInsn *targ, TInsn *insn, BuildInstr *bi)
3346 1.1 skrll {
3347 1.1 skrll BuildOp *op;
3348 1.1 skrll symbolS *sym;
3349 1.1 skrll
3350 1.1 skrll tinsn_init (targ);
3351 1.1 skrll targ->debug_line = insn->debug_line;
3352 1.1 skrll targ->loc_directive_seen = insn->loc_directive_seen;
3353 1.1 skrll switch (bi->typ)
3354 1.1 skrll {
3355 1.1 skrll case INSTR_INSTR:
3356 1.1 skrll op = bi->ops;
3357 1.1 skrll targ->opcode = bi->opcode;
3358 1.1 skrll targ->insn_type = ITYPE_INSN;
3359 1.1 skrll targ->is_specific_opcode = FALSE;
3360 1.1 skrll
3361 1.1 skrll for (; op != NULL; op = op->next)
3362 1.1 skrll {
3363 1.1 skrll int op_num = op->op_num;
3364 1.1 skrll int op_data = op->op_data;
3365 1.1 skrll
3366 1.1 skrll assert (op->op_num < MAX_INSN_ARGS);
3367 1.1 skrll
3368 1.1 skrll if (targ->ntok <= op_num)
3369 1.1 skrll targ->ntok = op_num + 1;
3370 1.1 skrll
3371 1.1 skrll switch (op->typ)
3372 1.1 skrll {
3373 1.1 skrll case OP_CONSTANT:
3374 1.1 skrll set_expr_const (&targ->tok[op_num], op_data);
3375 1.1 skrll break;
3376 1.1 skrll case OP_OPERAND:
3377 1.1 skrll assert (op_data < insn->ntok);
3378 1.1 skrll copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3379 1.1 skrll break;
3380 1.1 skrll case OP_LITERAL:
3381 1.1 skrll sym = get_special_literal_symbol ();
3382 1.1 skrll set_expr_symbol_offset (&targ->tok[op_num], sym, 0);
3383 1.1 skrll if (insn->tok[op_data].X_op == O_tlsfunc
3384 1.1 skrll || insn->tok[op_data].X_op == O_tlsarg)
3385 1.1 skrll copy_expr (&targ->tls_reloc, &insn->tok[op_data]);
3386 1.1 skrll break;
3387 1.1 skrll case OP_LABEL:
3388 1.1 skrll sym = get_special_label_symbol ();
3389 1.1 skrll set_expr_symbol_offset (&targ->tok[op_num], sym, 0);
3390 1.1 skrll break;
3391 1.1 skrll case OP_OPERAND_HI16U:
3392 1.1 skrll case OP_OPERAND_LOW16U:
3393 1.1 skrll assert (op_data < insn->ntok);
3394 1.1 skrll if (expr_is_const (&insn->tok[op_data]))
3395 1.1 skrll {
3396 1.1 skrll long val;
3397 1.1 skrll copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3398 1.1 skrll val = xg_apply_userdef_op_fn (op->typ,
3399 1.1 skrll targ->tok[op_num].
3400 1.1 skrll X_add_number);
3401 1.1 skrll targ->tok[op_num].X_add_number = val;
3402 1.1 skrll }
3403 1.1 skrll else
3404 1.1 skrll {
3405 1.1 skrll /* For const16 we can create relocations for these. */
3406 1.1 skrll if (targ->opcode == XTENSA_UNDEFINED
3407 1.1 skrll || (targ->opcode != xtensa_const16_opcode))
3408 1.1 skrll return FALSE;
3409 1.1 skrll assert (op_data < insn->ntok);
3410 1.1 skrll /* Need to build a O_lo16 or O_hi16. */
3411 1.1 skrll copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3412 1.1 skrll if (targ->tok[op_num].X_op == O_symbol)
3413 1.1 skrll {
3414 1.1 skrll if (op->typ == OP_OPERAND_HI16U)
3415 1.1 skrll targ->tok[op_num].X_op = O_hi16;
3416 1.1 skrll else if (op->typ == OP_OPERAND_LOW16U)
3417 1.1 skrll targ->tok[op_num].X_op = O_lo16;
3418 1.1 skrll else
3419 1.1 skrll return FALSE;
3420 1.1 skrll }
3421 1.1 skrll }
3422 1.1 skrll break;
3423 1.1 skrll default:
3424 1.1 skrll /* currently handles:
3425 1.1 skrll OP_OPERAND_LOW8
3426 1.1 skrll OP_OPERAND_HI24S
3427 1.1 skrll OP_OPERAND_F32MINUS */
3428 1.1 skrll if (xg_has_userdef_op_fn (op->typ))
3429 1.1 skrll {
3430 1.1 skrll assert (op_data < insn->ntok);
3431 1.1 skrll if (expr_is_const (&insn->tok[op_data]))
3432 1.1 skrll {
3433 1.1 skrll long val;
3434 1.1 skrll copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3435 1.1 skrll val = xg_apply_userdef_op_fn (op->typ,
3436 1.1 skrll targ->tok[op_num].
3437 1.1 skrll X_add_number);
3438 1.1 skrll targ->tok[op_num].X_add_number = val;
3439 1.1 skrll }
3440 1.1 skrll else
3441 1.1 skrll return FALSE; /* We cannot use a relocation for this. */
3442 1.1 skrll break;
3443 1.1 skrll }
3444 1.1 skrll assert (0);
3445 1.1 skrll break;
3446 1.1 skrll }
3447 1.1 skrll }
3448 1.1 skrll break;
3449 1.1 skrll
3450 1.1 skrll case INSTR_LITERAL_DEF:
3451 1.1 skrll op = bi->ops;
3452 1.1 skrll targ->opcode = XTENSA_UNDEFINED;
3453 1.1 skrll targ->insn_type = ITYPE_LITERAL;
3454 1.1 skrll targ->is_specific_opcode = FALSE;
3455 1.1 skrll for (; op != NULL; op = op->next)
3456 1.1 skrll {
3457 1.1 skrll int op_num = op->op_num;
3458 1.1 skrll int op_data = op->op_data;
3459 1.1 skrll assert (op->op_num < MAX_INSN_ARGS);
3460 1.1 skrll
3461 1.1 skrll if (targ->ntok <= op_num)
3462 1.1 skrll targ->ntok = op_num + 1;
3463 1.1 skrll
3464 1.1 skrll switch (op->typ)
3465 1.1 skrll {
3466 1.1 skrll case OP_OPERAND:
3467 1.1 skrll assert (op_data < insn->ntok);
3468 1.1 skrll /* We can only pass resolvable literals through. */
3469 1.1 skrll if (!xg_valid_literal_expression (&insn->tok[op_data]))
3470 1.1 skrll return FALSE;
3471 1.1 skrll copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3472 1.1 skrll break;
3473 1.1 skrll case OP_LITERAL:
3474 1.1 skrll case OP_CONSTANT:
3475 1.1 skrll case OP_LABEL:
3476 1.1 skrll default:
3477 1.1 skrll assert (0);
3478 1.1 skrll break;
3479 1.1 skrll }
3480 1.1 skrll }
3481 1.1 skrll break;
3482 1.1 skrll
3483 1.1 skrll case INSTR_LABEL_DEF:
3484 1.1 skrll op = bi->ops;
3485 1.1 skrll targ->opcode = XTENSA_UNDEFINED;
3486 1.1 skrll targ->insn_type = ITYPE_LABEL;
3487 1.1 skrll targ->is_specific_opcode = FALSE;
3488 1.1 skrll /* Literal with no ops is a label? */
3489 1.1 skrll assert (op == NULL);
3490 1.1 skrll break;
3491 1.1 skrll
3492 1.1 skrll default:
3493 1.1 skrll assert (0);
3494 1.1 skrll }
3495 1.1 skrll
3496 1.1 skrll return TRUE;
3497 1.1 skrll }
3498 1.1 skrll
3499 1.1 skrll
3500 1.1 skrll /* Return TRUE on success. */
3501 1.1 skrll
3502 1.1 skrll static bfd_boolean
3503 1.1 skrll xg_build_to_stack (IStack *istack, TInsn *insn, BuildInstr *bi)
3504 1.1 skrll {
3505 1.1 skrll for (; bi != NULL; bi = bi->next)
3506 1.1 skrll {
3507 1.1 skrll TInsn *next_insn = istack_push_space (istack);
3508 1.1 skrll
3509 1.1 skrll if (!xg_build_to_insn (next_insn, insn, bi))
3510 1.1 skrll return FALSE;
3511 1.1 skrll }
3512 1.1 skrll return TRUE;
3513 1.1 skrll }
3514 1.1 skrll
3515 1.1 skrll
3516 1.1 skrll /* Return TRUE on valid expansion. */
3517 1.1 skrll
3518 1.1 skrll static bfd_boolean
3519 1.1 skrll xg_expand_to_stack (IStack *istack, TInsn *insn, int lateral_steps)
3520 1.1 skrll {
3521 1.1 skrll int stack_size = istack->ninsn;
3522 1.1 skrll int steps_taken = 0;
3523 1.1 skrll TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3524 1.1 skrll TransitionList *l;
3525 1.1 skrll
3526 1.1 skrll assert (insn->insn_type == ITYPE_INSN);
3527 1.1 skrll assert (insn->opcode < table->num_opcodes);
3528 1.1 skrll
3529 1.1 skrll for (l = table->table[insn->opcode]; l != NULL; l = l->next)
3530 1.1 skrll {
3531 1.1 skrll TransitionRule *rule = l->rule;
3532 1.1 skrll
3533 1.1 skrll if (xg_instruction_matches_rule (insn, rule))
3534 1.1 skrll {
3535 1.1 skrll if (lateral_steps == steps_taken)
3536 1.1 skrll {
3537 1.1 skrll int i;
3538 1.1 skrll
3539 1.1 skrll /* This is it. Expand the rule to the stack. */
3540 1.1 skrll if (!xg_build_to_stack (istack, insn, rule->to_instr))
3541 1.1 skrll return FALSE;
3542 1.1 skrll
3543 1.1 skrll /* Check to see if it fits. */
3544 1.1 skrll for (i = stack_size; i < istack->ninsn; i++)
3545 1.1 skrll {
3546 1.1 skrll TInsn *insn = &istack->insn[i];
3547 1.1 skrll
3548 1.1 skrll if (insn->insn_type == ITYPE_INSN
3549 1.1 skrll && !tinsn_has_symbolic_operands (insn)
3550 1.1 skrll && !xg_immeds_fit (insn))
3551 1.1 skrll {
3552 1.1 skrll istack->ninsn = stack_size;
3553 1.1 skrll return FALSE;
3554 1.1 skrll }
3555 1.1 skrll }
3556 1.1 skrll return TRUE;
3557 1.1 skrll }
3558 1.1 skrll steps_taken++;
3559 1.1 skrll }
3560 1.1 skrll }
3561 1.1 skrll return FALSE;
3562 1.1 skrll }
3563 1.1 skrll
3564 1.1 skrll
3565 1.1 skrll /* Relax the assembly instruction at least "min_steps".
3567 1.1 skrll Return the number of steps taken.
3568 1.1 skrll
3569 1.1 skrll For relaxation to correctly terminate, every relaxation chain must
3570 1.1 skrll terminate in one of two ways:
3571 1.1 skrll
3572 1.1 skrll 1. If the chain from one instruction to the next consists entirely of
3573 1.1 skrll single instructions, then the chain *must* handle all possible
3574 1.1 skrll immediates without failing. It must not ever fail because an
3575 1.1 skrll immediate is out of range. The MOVI.N -> MOVI -> L32R relaxation
3576 1.1 skrll chain is one example. L32R loads 32 bits, and there cannot be an
3577 1.1 skrll immediate larger than 32 bits, so it satisfies this condition.
3578 1.1 skrll Single instruction relaxation chains are as defined by
3579 1.1 skrll xg_is_single_relaxable_instruction.
3580 1.1 skrll
3581 1.1 skrll 2. Otherwise, the chain must end in a multi-instruction expansion: e.g.,
3582 1.1 skrll BNEZ.N -> BNEZ -> BNEZ.W15 -> BENZ.N/J
3583 1.1 skrll
3584 1.1 skrll Strictly speaking, in most cases you can violate condition 1 and be OK
3585 1.1 skrll -- in particular when the last two instructions have the same single
3586 1.1 skrll size. But nevertheless, you should guarantee the above two conditions.
3587 1.1 skrll
3588 1.1 skrll We could fix this so that single-instruction expansions correctly
3589 1.1 skrll terminate when they can't handle the range, but the error messages are
3590 1.1 skrll worse, and it actually turns out that in every case but one (18-bit wide
3591 1.1 skrll branches), you need a multi-instruction expansion to get the full range
3592 1.1 skrll anyway. And because 18-bit branches are handled identically to 15-bit
3593 1.1 skrll branches, there isn't any point in changing it. */
3594 1.1 skrll
3595 1.1 skrll static int
3596 1.1 skrll xg_assembly_relax (IStack *istack,
3597 1.1 skrll TInsn *insn,
3598 1.1 skrll segT pc_seg,
3599 1.1 skrll fragS *pc_frag, /* if pc_frag == 0, not pc-relative */
3600 1.1 skrll offsetT pc_offset, /* offset in fragment */
3601 1.1 skrll int min_steps, /* minimum conversion steps */
3602 1.1 skrll long stretch) /* number of bytes stretched so far */
3603 1.1 skrll {
3604 1.1 skrll int steps_taken = 0;
3605 1.1 skrll
3606 1.1 skrll /* Some of its immeds don't fit. Try to build a relaxed version.
3607 1.1 skrll This may go through a couple of stages of single instruction
3608 1.1 skrll transformations before we get there. */
3609 1.1 skrll
3610 1.1 skrll TInsn single_target;
3611 1.1 skrll TInsn current_insn;
3612 1.1 skrll int lateral_steps = 0;
3613 1.1 skrll int istack_size = istack->ninsn;
3614 1.1 skrll
3615 1.1 skrll if (xg_symbolic_immeds_fit (insn, pc_seg, pc_frag, pc_offset, stretch)
3616 1.1 skrll && steps_taken >= min_steps)
3617 1.1 skrll {
3618 1.1 skrll istack_push (istack, insn);
3619 1.1 skrll return steps_taken;
3620 1.1 skrll }
3621 1.1 skrll current_insn = *insn;
3622 1.1 skrll
3623 1.1 skrll /* Walk through all of the single instruction expansions. */
3624 1.1 skrll while (xg_is_single_relaxable_insn (¤t_insn, &single_target, FALSE))
3625 1.1 skrll {
3626 1.1 skrll steps_taken++;
3627 1.1 skrll if (xg_symbolic_immeds_fit (&single_target, pc_seg, pc_frag, pc_offset,
3628 1.1 skrll stretch))
3629 1.1 skrll {
3630 1.1 skrll if (steps_taken >= min_steps)
3631 1.1 skrll {
3632 1.1 skrll istack_push (istack, &single_target);
3633 1.1 skrll return steps_taken;
3634 1.1 skrll }
3635 1.1 skrll }
3636 1.1 skrll current_insn = single_target;
3637 1.1 skrll }
3638 1.1 skrll
3639 1.1 skrll /* Now check for a multi-instruction expansion. */
3640 1.1 skrll while (xg_is_relaxable_insn (¤t_insn, lateral_steps))
3641 1.1 skrll {
3642 1.1 skrll if (xg_symbolic_immeds_fit (¤t_insn, pc_seg, pc_frag, pc_offset,
3643 1.1 skrll stretch))
3644 1.1 skrll {
3645 1.1 skrll if (steps_taken >= min_steps)
3646 1.1 skrll {
3647 1.1 skrll istack_push (istack, ¤t_insn);
3648 1.1 skrll return steps_taken;
3649 1.1 skrll }
3650 1.1 skrll }
3651 1.1 skrll steps_taken++;
3652 1.1 skrll if (xg_expand_to_stack (istack, ¤t_insn, lateral_steps))
3653 1.1 skrll {
3654 1.1 skrll if (steps_taken >= min_steps)
3655 1.1 skrll return steps_taken;
3656 1.1 skrll }
3657 1.1 skrll lateral_steps++;
3658 1.1 skrll istack->ninsn = istack_size;
3659 1.1 skrll }
3660 1.1 skrll
3661 1.1 skrll /* It's not going to work -- use the original. */
3662 1.1 skrll istack_push (istack, insn);
3663 1.1 skrll return steps_taken;
3664 1.1 skrll }
3665 1.1 skrll
3666 1.1 skrll
3667 1.1 skrll static void
3668 1.1 skrll xg_finish_frag (char *last_insn,
3669 1.1 skrll enum xtensa_relax_statesE frag_state,
3670 1.1 skrll enum xtensa_relax_statesE slot0_state,
3671 1.1 skrll int max_growth,
3672 1.1 skrll bfd_boolean is_insn)
3673 1.1 skrll {
3674 1.1 skrll /* Finish off this fragment so that it has at LEAST the desired
3675 1.1 skrll max_growth. If it doesn't fit in this fragment, close this one
3676 1.1 skrll and start a new one. In either case, return a pointer to the
3677 1.1 skrll beginning of the growth area. */
3678 1.1 skrll
3679 1.1 skrll fragS *old_frag;
3680 1.1 skrll
3681 1.1 skrll frag_grow (max_growth);
3682 1.1 skrll old_frag = frag_now;
3683 1.1 skrll
3684 1.1 skrll frag_now->fr_opcode = last_insn;
3685 1.1 skrll if (is_insn)
3686 1.1 skrll frag_now->tc_frag_data.is_insn = TRUE;
3687 1.1 skrll
3688 1.1 skrll frag_var (rs_machine_dependent, max_growth, max_growth,
3689 1.1 skrll frag_state, frag_now->fr_symbol, frag_now->fr_offset, last_insn);
3690 1.1 skrll
3691 1.1 skrll old_frag->tc_frag_data.slot_subtypes[0] = slot0_state;
3692 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
3693 1.1 skrll
3694 1.1 skrll /* Just to make sure that we did not split it up. */
3695 1.1 skrll assert (old_frag->fr_next == frag_now);
3696 1.1 skrll }
3697 1.1 skrll
3698 1.1 skrll
3699 1.1 skrll /* Return TRUE if the target frag is one of the next non-empty frags. */
3700 1.1 skrll
3701 1.1 skrll static bfd_boolean
3702 1.1 skrll is_next_frag_target (const fragS *fragP, const fragS *target)
3703 1.1 skrll {
3704 1.1 skrll if (fragP == NULL)
3705 1.1 skrll return FALSE;
3706 1.1 skrll
3707 1.1 skrll for (; fragP; fragP = fragP->fr_next)
3708 1.1 skrll {
3709 1.1 skrll if (fragP == target)
3710 1.1 skrll return TRUE;
3711 1.1 skrll if (fragP->fr_fix != 0)
3712 1.1 skrll return FALSE;
3713 1.1 skrll if (fragP->fr_type == rs_fill && fragP->fr_offset != 0)
3714 1.1 skrll return FALSE;
3715 1.1 skrll if ((fragP->fr_type == rs_align || fragP->fr_type == rs_align_code)
3716 1.1 skrll && ((fragP->fr_address % (1 << fragP->fr_offset)) != 0))
3717 1.1 skrll return FALSE;
3718 1.1 skrll if (fragP->fr_type == rs_space)
3719 1.1 skrll return FALSE;
3720 1.1 skrll }
3721 1.1 skrll return FALSE;
3722 1.1 skrll }
3723 1.1 skrll
3724 1.1 skrll
3725 1.1 skrll static bfd_boolean
3726 1.1 skrll is_branch_jmp_to_next (TInsn *insn, fragS *fragP)
3727 1.1 skrll {
3728 1.1 skrll xtensa_isa isa = xtensa_default_isa;
3729 1.1 skrll int i;
3730 1.1 skrll int num_ops = xtensa_opcode_num_operands (isa, insn->opcode);
3731 1.1 skrll int target_op = -1;
3732 1.1 skrll symbolS *sym;
3733 1.1 skrll fragS *target_frag;
3734 1.1 skrll
3735 1.1 skrll if (xtensa_opcode_is_branch (isa, insn->opcode) != 1
3736 1.1 skrll && xtensa_opcode_is_jump (isa, insn->opcode) != 1)
3737 1.1 skrll return FALSE;
3738 1.1 skrll
3739 1.1 skrll for (i = 0; i < num_ops; i++)
3740 1.1 skrll {
3741 1.1 skrll if (xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 1)
3742 1.1 skrll {
3743 1.1 skrll target_op = i;
3744 1.1 skrll break;
3745 1.1 skrll }
3746 1.1 skrll }
3747 1.1 skrll if (target_op == -1)
3748 1.1 skrll return FALSE;
3749 1.1 skrll
3750 1.1 skrll if (insn->ntok <= target_op)
3751 1.1 skrll return FALSE;
3752 1.1 skrll
3753 1.1 skrll if (insn->tok[target_op].X_op != O_symbol)
3754 1.1 skrll return FALSE;
3755 1.1 skrll
3756 1.1 skrll sym = insn->tok[target_op].X_add_symbol;
3757 1.1 skrll if (sym == NULL)
3758 1.1 skrll return FALSE;
3759 1.1 skrll
3760 1.1 skrll if (insn->tok[target_op].X_add_number != 0)
3761 1.1 skrll return FALSE;
3762 1.1 skrll
3763 1.1 skrll target_frag = symbol_get_frag (sym);
3764 1.1 skrll if (target_frag == NULL)
3765 1.1 skrll return FALSE;
3766 1.1 skrll
3767 1.1 skrll if (is_next_frag_target (fragP->fr_next, target_frag)
3768 1.1 skrll && S_GET_VALUE (sym) == target_frag->fr_address)
3769 1.1 skrll return TRUE;
3770 1.1 skrll
3771 1.1 skrll return FALSE;
3772 1.1 skrll }
3773 1.1 skrll
3774 1.1 skrll
3775 1.1 skrll static void
3776 1.1 skrll xg_add_branch_and_loop_targets (TInsn *insn)
3777 1.1 skrll {
3778 1.1 skrll xtensa_isa isa = xtensa_default_isa;
3779 1.1 skrll int num_ops = xtensa_opcode_num_operands (isa, insn->opcode);
3780 1.1 skrll
3781 1.1 skrll if (xtensa_opcode_is_loop (isa, insn->opcode) == 1)
3782 1.1 skrll {
3783 1.1 skrll int i = 1;
3784 1.1 skrll if (xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 1
3785 1.1 skrll && insn->tok[i].X_op == O_symbol)
3786 1.1 skrll symbol_get_tc (insn->tok[i].X_add_symbol)->is_loop_target = TRUE;
3787 1.1 skrll return;
3788 1.1 skrll }
3789 1.1 skrll
3790 1.1 skrll if (xtensa_opcode_is_branch (isa, insn->opcode) == 1
3791 1.1 skrll || xtensa_opcode_is_loop (isa, insn->opcode) == 1)
3792 1.1 skrll {
3793 1.1 skrll int i;
3794 1.1 skrll
3795 1.1 skrll for (i = 0; i < insn->ntok && i < num_ops; i++)
3796 1.1 skrll {
3797 1.1 skrll if (xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 1
3798 1.1 skrll && insn->tok[i].X_op == O_symbol)
3799 1.1 skrll {
3800 1.1 skrll symbolS *sym = insn->tok[i].X_add_symbol;
3801 1.1 skrll symbol_get_tc (sym)->is_branch_target = TRUE;
3802 1.1 skrll if (S_IS_DEFINED (sym))
3803 1.1 skrll symbol_get_frag (sym)->tc_frag_data.is_branch_target = TRUE;
3804 1.1 skrll }
3805 1.1 skrll }
3806 1.1 skrll }
3807 1.1 skrll }
3808 1.1 skrll
3809 1.1 skrll
3810 1.1 skrll /* Return FALSE if no error. */
3811 1.1 skrll
3812 1.1 skrll static bfd_boolean
3813 1.1 skrll xg_build_token_insn (BuildInstr *instr_spec, TInsn *old_insn, TInsn *new_insn)
3814 1.1 skrll {
3815 1.1 skrll int num_ops = 0;
3816 1.1 skrll BuildOp *b_op;
3817 1.1 skrll
3818 1.1 skrll switch (instr_spec->typ)
3819 1.1 skrll {
3820 1.1 skrll case INSTR_INSTR:
3821 1.1 skrll new_insn->insn_type = ITYPE_INSN;
3822 1.1 skrll new_insn->opcode = instr_spec->opcode;
3823 1.1 skrll break;
3824 1.1 skrll case INSTR_LITERAL_DEF:
3825 1.1 skrll new_insn->insn_type = ITYPE_LITERAL;
3826 1.1 skrll new_insn->opcode = XTENSA_UNDEFINED;
3827 1.1 skrll break;
3828 1.1 skrll case INSTR_LABEL_DEF:
3829 1.1 skrll abort ();
3830 1.1 skrll }
3831 1.1 skrll new_insn->is_specific_opcode = FALSE;
3832 1.1 skrll new_insn->debug_line = old_insn->debug_line;
3833 1.1 skrll new_insn->loc_directive_seen = old_insn->loc_directive_seen;
3834 1.1 skrll
3835 1.1 skrll for (b_op = instr_spec->ops; b_op != NULL; b_op = b_op->next)
3836 1.1 skrll {
3837 1.1 skrll expressionS *exp;
3838 1.1 skrll const expressionS *src_exp;
3839 1.1 skrll
3840 1.1 skrll num_ops++;
3841 1.1 skrll switch (b_op->typ)
3842 1.1 skrll {
3843 1.1 skrll case OP_CONSTANT:
3844 1.1 skrll /* The expression must be the constant. */
3845 1.1 skrll assert (b_op->op_num < MAX_INSN_ARGS);
3846 1.1 skrll exp = &new_insn->tok[b_op->op_num];
3847 1.1 skrll set_expr_const (exp, b_op->op_data);
3848 1.1 skrll break;
3849 1.1 skrll
3850 1.1 skrll case OP_OPERAND:
3851 1.1 skrll assert (b_op->op_num < MAX_INSN_ARGS);
3852 1.1 skrll assert (b_op->op_data < (unsigned) old_insn->ntok);
3853 1.1 skrll src_exp = &old_insn->tok[b_op->op_data];
3854 1.1 skrll exp = &new_insn->tok[b_op->op_num];
3855 1.1 skrll copy_expr (exp, src_exp);
3856 1.1 skrll break;
3857 1.1 skrll
3858 1.1 skrll case OP_LITERAL:
3859 1.1 skrll case OP_LABEL:
3860 1.1 skrll as_bad (_("can't handle generation of literal/labels yet"));
3861 1.1 skrll assert (0);
3862 1.1 skrll
3863 1.1 skrll default:
3864 1.1 skrll as_bad (_("can't handle undefined OP TYPE"));
3865 1.1 skrll assert (0);
3866 1.1 skrll }
3867 1.1 skrll }
3868 1.1 skrll
3869 1.1 skrll new_insn->ntok = num_ops;
3870 1.1 skrll return FALSE;
3871 1.1 skrll }
3872 1.1 skrll
3873 1.1 skrll
3874 1.1 skrll /* Return TRUE if it was simplified. */
3875 1.1 skrll
3876 1.1 skrll static bfd_boolean
3877 1.1 skrll xg_simplify_insn (TInsn *old_insn, TInsn *new_insn)
3878 1.1 skrll {
3879 1.1 skrll TransitionRule *rule;
3880 1.1 skrll BuildInstr *insn_spec;
3881 1.1 skrll
3882 1.1 skrll if (old_insn->is_specific_opcode || !density_supported)
3883 1.1 skrll return FALSE;
3884 1.1 skrll
3885 1.1 skrll rule = xg_instruction_match (old_insn);
3886 1.1 skrll if (rule == NULL)
3887 1.1 skrll return FALSE;
3888 1.1 skrll
3889 1.1 skrll insn_spec = rule->to_instr;
3890 1.1 skrll /* There should only be one. */
3891 1.1 skrll assert (insn_spec != NULL);
3892 1.1 skrll assert (insn_spec->next == NULL);
3893 1.1 skrll if (insn_spec->next != NULL)
3894 1.1 skrll return FALSE;
3895 1.1 skrll
3896 1.1 skrll xg_build_token_insn (insn_spec, old_insn, new_insn);
3897 1.1 skrll
3898 1.1 skrll return TRUE;
3899 1.1 skrll }
3900 1.1 skrll
3901 1.1 skrll
3902 1.1 skrll /* xg_expand_assembly_insn: (1) Simplify the instruction, i.e., l32i ->
3903 1.1 skrll l32i.n. (2) Check the number of operands. (3) Place the instruction
3904 1.1 skrll tokens into the stack or relax it and place multiple
3905 1.1 skrll instructions/literals onto the stack. Return FALSE if no error. */
3906 1.1 skrll
3907 1.1 skrll static bfd_boolean
3908 1.1 skrll xg_expand_assembly_insn (IStack *istack, TInsn *orig_insn)
3909 1.1 skrll {
3910 1.1 skrll int noperands;
3911 1.1 skrll TInsn new_insn;
3912 1.1 skrll bfd_boolean do_expand;
3913 1.1 skrll
3914 1.1 skrll tinsn_init (&new_insn);
3915 1.1 skrll
3916 1.1 skrll /* Narrow it if we can. xg_simplify_insn now does all the
3917 1.1 skrll appropriate checking (e.g., for the density option). */
3918 1.1 skrll if (xg_simplify_insn (orig_insn, &new_insn))
3919 1.1 skrll orig_insn = &new_insn;
3920 1.1 skrll
3921 1.1 skrll noperands = xtensa_opcode_num_operands (xtensa_default_isa,
3922 1.1 skrll orig_insn->opcode);
3923 1.1 skrll if (orig_insn->ntok < noperands)
3924 1.1 skrll {
3925 1.1 skrll as_bad (_("found %d operands for '%s': Expected %d"),
3926 1.1 skrll orig_insn->ntok,
3927 1.1 skrll xtensa_opcode_name (xtensa_default_isa, orig_insn->opcode),
3928 1.1 skrll noperands);
3929 1.1 skrll return TRUE;
3930 1.1 skrll }
3931 1.1 skrll if (orig_insn->ntok > noperands)
3932 1.1 skrll as_warn (_("found too many (%d) operands for '%s': Expected %d"),
3933 1.1 skrll orig_insn->ntok,
3934 1.1 skrll xtensa_opcode_name (xtensa_default_isa, orig_insn->opcode),
3935 1.1 skrll noperands);
3936 1.1 skrll
3937 1.1 skrll /* If there are not enough operands, we will assert above. If there
3938 1.1 skrll are too many, just cut out the extras here. */
3939 1.1 skrll orig_insn->ntok = noperands;
3940 1.1 skrll
3941 1.1 skrll if (tinsn_has_invalid_symbolic_operands (orig_insn))
3942 1.1 skrll return TRUE;
3943 1.1 skrll
3944 1.1 skrll /* Special case for extui opcode which has constraints not handled
3945 1.1 skrll by the ordinary operand encoding checks. The number of operands
3946 1.1 skrll and related syntax issues have already been checked. */
3947 1.1 skrll if (orig_insn->opcode == xtensa_extui_opcode)
3948 1.1 skrll {
3949 1.1 skrll int shiftimm = orig_insn->tok[2].X_add_number;
3950 1.1 skrll int maskimm = orig_insn->tok[3].X_add_number;
3951 1.1 skrll if (shiftimm + maskimm > 32)
3952 1.1 skrll {
3953 1.1 skrll as_bad (_("immediate operands sum to greater than 32"));
3954 1.1 skrll return TRUE;
3955 1.1 skrll }
3956 1.1 skrll }
3957 1.1 skrll
3958 1.1 skrll /* If the instruction will definitely need to be relaxed, it is better
3959 1.1 skrll to expand it now for better scheduling. Decide whether to expand
3960 1.1 skrll now.... */
3961 1.1 skrll do_expand = (!orig_insn->is_specific_opcode && use_transform ());
3962 1.1 skrll
3963 1.1 skrll /* Calls should be expanded to longcalls only in the backend relaxation
3964 1.1 skrll so that the assembly scheduler will keep the L32R/CALLX instructions
3965 1.1 skrll adjacent. */
3966 1.1 skrll if (is_direct_call_opcode (orig_insn->opcode))
3967 1.1 skrll do_expand = FALSE;
3968 1.1 skrll
3969 1.1 skrll if (tinsn_has_symbolic_operands (orig_insn))
3970 1.1 skrll {
3971 1.1 skrll /* The values of symbolic operands are not known yet, so only expand
3972 1.1 skrll now if an operand is "complex" (e.g., difference of symbols) and
3973 1.1 skrll will have to be stored as a literal regardless of the value. */
3974 1.1 skrll if (!tinsn_has_complex_operands (orig_insn))
3975 1.1 skrll do_expand = FALSE;
3976 1.1 skrll }
3977 1.1 skrll else if (xg_immeds_fit (orig_insn))
3978 1.1 skrll do_expand = FALSE;
3979 1.1 skrll
3980 1.1 skrll if (do_expand)
3981 1.1 skrll xg_assembly_relax (istack, orig_insn, 0, 0, 0, 0, 0);
3982 1.1 skrll else
3983 1.1 skrll istack_push (istack, orig_insn);
3984 1.1 skrll
3985 1.1 skrll return FALSE;
3986 1.1 skrll }
3987 1.1 skrll
3988 1.1 skrll
3989 1.1 skrll /* Return TRUE if the section flags are marked linkonce
3990 1.1 skrll or the name is .gnu.linkonce.*. */
3991 1.1 skrll
3992 1.1 skrll static int linkonce_len = sizeof (".gnu.linkonce.") - 1;
3993 1.1 skrll
3994 1.1 skrll static bfd_boolean
3995 1.1 skrll get_is_linkonce_section (bfd *abfd ATTRIBUTE_UNUSED, segT sec)
3996 1.1 skrll {
3997 1.1 skrll flagword flags, link_once_flags;
3998 1.1 skrll
3999 1.1 skrll flags = bfd_get_section_flags (abfd, sec);
4000 1.1 skrll link_once_flags = (flags & SEC_LINK_ONCE);
4001 1.1 skrll
4002 1.1 skrll /* Flags might not be set yet. */
4003 1.1 skrll if (!link_once_flags
4004 1.1 skrll && strncmp (segment_name (sec), ".gnu.linkonce.", linkonce_len) == 0)
4005 1.1 skrll link_once_flags = SEC_LINK_ONCE;
4006 1.1 skrll
4007 1.1 skrll return (link_once_flags != 0);
4008 1.1 skrll }
4009 1.1 skrll
4010 1.1 skrll
4011 1.1 skrll static void
4012 1.1 skrll xtensa_add_literal_sym (symbolS *sym)
4013 1.1 skrll {
4014 1.1 skrll sym_list *l;
4015 1.1 skrll
4016 1.1 skrll l = (sym_list *) xmalloc (sizeof (sym_list));
4017 1.1 skrll l->sym = sym;
4018 1.1 skrll l->next = literal_syms;
4019 1.1 skrll literal_syms = l;
4020 1.1 skrll }
4021 1.1 skrll
4022 1.1 skrll
4023 1.1 skrll static symbolS *
4024 1.1 skrll xtensa_create_literal_symbol (segT sec, fragS *frag)
4025 1.1 skrll {
4026 1.1 skrll static int lit_num = 0;
4027 1.1 skrll static char name[256];
4028 1.1 skrll symbolS *symbolP;
4029 1.1 skrll
4030 1.1 skrll sprintf (name, ".L_lit_sym%d", lit_num);
4031 1.1 skrll
4032 1.1 skrll /* Create a local symbol. If it is in a linkonce section, we have to
4033 1.1 skrll be careful to make sure that if it is used in a relocation that the
4034 1.1 skrll symbol will be in the output file. */
4035 1.1 skrll if (get_is_linkonce_section (stdoutput, sec))
4036 1.1 skrll {
4037 1.1 skrll symbolP = symbol_new (name, sec, 0, frag);
4038 1.1 skrll S_CLEAR_EXTERNAL (symbolP);
4039 1.1 skrll /* symbolP->local = 1; */
4040 1.1 skrll }
4041 1.1 skrll else
4042 1.1 skrll symbolP = symbol_new (name, sec, 0, frag);
4043 1.1 skrll
4044 1.1 skrll xtensa_add_literal_sym (symbolP);
4045 1.1 skrll
4046 1.1 skrll lit_num++;
4047 1.1 skrll return symbolP;
4048 1.1 skrll }
4049 1.1 skrll
4050 1.1 skrll
4051 1.1 skrll /* Currently all literals that are generated here are 32-bit L32R targets. */
4052 1.1 skrll
4053 1.1 skrll static symbolS *
4054 1.1 skrll xg_assemble_literal (/* const */ TInsn *insn)
4055 1.1 skrll {
4056 1.1 skrll emit_state state;
4057 1.1 skrll symbolS *lit_sym = NULL;
4058 1.1 skrll bfd_reloc_code_real_type reloc;
4059 1.1 skrll bfd_boolean pcrel = FALSE;
4060 1.1 skrll char *p;
4061 1.1 skrll
4062 1.1 skrll /* size = 4 for L32R. It could easily be larger when we move to
4063 1.1 skrll larger constants. Add a parameter later. */
4064 1.1 skrll offsetT litsize = 4;
4065 1.1 skrll offsetT litalign = 2; /* 2^2 = 4 */
4066 1.1 skrll expressionS saved_loc;
4067 1.1 skrll expressionS * emit_val;
4068 1.1 skrll
4069 1.1 skrll set_expr_symbol_offset (&saved_loc, frag_now->fr_symbol, frag_now_fix ());
4070 1.1 skrll
4071 1.1 skrll assert (insn->insn_type == ITYPE_LITERAL);
4072 1.1 skrll assert (insn->ntok == 1); /* must be only one token here */
4073 1.1 skrll
4074 1.1 skrll xtensa_switch_to_literal_fragment (&state);
4075 1.1 skrll
4076 1.1 skrll emit_val = &insn->tok[0];
4077 1.1 skrll if (emit_val->X_op == O_big)
4078 1.1 skrll {
4079 1.1 skrll int size = emit_val->X_add_number * CHARS_PER_LITTLENUM;
4080 1.1 skrll if (size > litsize)
4081 1.1 skrll {
4082 1.1 skrll /* This happens when someone writes a "movi a2, big_number". */
4083 1.1 skrll as_bad_where (frag_now->fr_file, frag_now->fr_line,
4084 1.1 skrll _("invalid immediate"));
4085 1.1 skrll xtensa_restore_emit_state (&state);
4086 1.1 skrll return NULL;
4087 1.1 skrll }
4088 1.1 skrll }
4089 1.1 skrll
4090 1.1 skrll /* Force a 4-byte align here. Note that this opens a new frag, so all
4091 1.1 skrll literals done with this function have a frag to themselves. That's
4092 1.1 skrll important for the way text section literals work. */
4093 1.1 skrll frag_align (litalign, 0, 0);
4094 1.1 skrll record_alignment (now_seg, litalign);
4095 1.1 skrll
4096 1.1 skrll switch (emit_val->X_op)
4097 1.1 skrll {
4098 1.1 skrll case O_pcrel:
4099 1.1 skrll pcrel = TRUE;
4100 1.1 skrll /* fall through */
4101 1.1 skrll case O_pltrel:
4102 1.1 skrll case O_tlsfunc:
4103 1.1 skrll case O_tlsarg:
4104 1.1 skrll case O_tpoff:
4105 1.1 skrll case O_dtpoff:
4106 1.1 skrll p = frag_more (litsize);
4107 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
4108 1.1 skrll reloc = map_operator_to_reloc (emit_val->X_op, TRUE);
4109 1.1 skrll if (emit_val->X_add_symbol)
4110 1.1 skrll emit_val->X_op = O_symbol;
4111 1.1 skrll else
4112 1.1 skrll emit_val->X_op = O_constant;
4113 1.1 skrll fix_new_exp (frag_now, p - frag_now->fr_literal,
4114 1.1 skrll litsize, emit_val, pcrel, reloc);
4115 1.1 skrll break;
4116 1.1 skrll
4117 1.1 skrll default:
4118 1.1 skrll emit_expr (emit_val, litsize);
4119 1.1 skrll break;
4120 1.1 skrll }
4121 1.1 skrll
4122 1.1 skrll assert (frag_now->tc_frag_data.literal_frag == NULL);
4123 1.1 skrll frag_now->tc_frag_data.literal_frag = get_literal_pool_location (now_seg);
4124 1.1 skrll frag_now->fr_symbol = xtensa_create_literal_symbol (now_seg, frag_now);
4125 1.1 skrll lit_sym = frag_now->fr_symbol;
4126 1.1 skrll
4127 1.1 skrll /* Go back. */
4128 1.1 skrll xtensa_restore_emit_state (&state);
4129 1.1 skrll return lit_sym;
4130 1.1 skrll }
4131 1.1 skrll
4132 1.1 skrll
4133 1.1 skrll static void
4134 1.1 skrll xg_assemble_literal_space (/* const */ int size, int slot)
4135 1.1 skrll {
4136 1.1 skrll emit_state state;
4137 1.1 skrll /* We might have to do something about this alignment. It only
4138 1.1 skrll takes effect if something is placed here. */
4139 1.1 skrll offsetT litalign = 2; /* 2^2 = 4 */
4140 1.1 skrll fragS *lit_saved_frag;
4141 1.1 skrll
4142 1.1 skrll assert (size % 4 == 0);
4143 1.1 skrll
4144 1.1 skrll xtensa_switch_to_literal_fragment (&state);
4145 1.1 skrll
4146 1.1 skrll /* Force a 4-byte align here. */
4147 1.1 skrll frag_align (litalign, 0, 0);
4148 1.1 skrll record_alignment (now_seg, litalign);
4149 1.1 skrll
4150 1.1 skrll frag_grow (size);
4151 1.1 skrll
4152 1.1 skrll lit_saved_frag = frag_now;
4153 1.1 skrll frag_now->tc_frag_data.literal_frag = get_literal_pool_location (now_seg);
4154 1.1 skrll frag_now->fr_symbol = xtensa_create_literal_symbol (now_seg, frag_now);
4155 1.1 skrll xg_finish_frag (0, RELAX_LITERAL, 0, size, FALSE);
4156 1.1 skrll
4157 1.1 skrll /* Go back. */
4158 1.1 skrll xtensa_restore_emit_state (&state);
4159 1.1 skrll frag_now->tc_frag_data.literal_frags[slot] = lit_saved_frag;
4160 1.1 skrll }
4161 1.1 skrll
4162 1.1 skrll
4163 1.1 skrll /* Put in a fixup record based on the opcode.
4164 1.1 skrll Return TRUE on success. */
4165 1.1 skrll
4166 1.1 skrll static bfd_boolean
4167 1.1 skrll xg_add_opcode_fix (TInsn *tinsn,
4168 1.1 skrll int opnum,
4169 1.1 skrll xtensa_format fmt,
4170 1.1 skrll int slot,
4171 1.1 skrll expressionS *expr,
4172 1.1 skrll fragS *fragP,
4173 1.1 skrll offsetT offset)
4174 1.1 skrll {
4175 1.1 skrll xtensa_opcode opcode = tinsn->opcode;
4176 1.1 skrll bfd_reloc_code_real_type reloc;
4177 1.1 skrll reloc_howto_type *howto;
4178 1.1 skrll int fmt_length;
4179 1.1 skrll fixS *the_fix;
4180 1.1 skrll
4181 1.1 skrll reloc = BFD_RELOC_NONE;
4182 1.1 skrll
4183 1.1 skrll /* First try the special cases for "alternate" relocs. */
4184 1.1 skrll if (opcode == xtensa_l32r_opcode)
4185 1.1 skrll {
4186 1.1 skrll if (fragP->tc_frag_data.use_absolute_literals)
4187 1.1 skrll reloc = encode_alt_reloc (slot);
4188 1.1 skrll }
4189 1.1 skrll else if (opcode == xtensa_const16_opcode)
4190 1.1 skrll {
4191 1.1 skrll if (expr->X_op == O_lo16)
4192 1.1 skrll {
4193 1.1 skrll reloc = encode_reloc (slot);
4194 1.1 skrll expr->X_op = O_symbol;
4195 1.1 skrll }
4196 1.1 skrll else if (expr->X_op == O_hi16)
4197 1.1 skrll {
4198 1.1 skrll reloc = encode_alt_reloc (slot);
4199 1.1 skrll expr->X_op = O_symbol;
4200 1.1 skrll }
4201 1.1 skrll }
4202 1.1 skrll
4203 1.1 skrll if (opnum != get_relaxable_immed (opcode))
4204 1.1 skrll {
4205 1.1 skrll as_bad (_("invalid relocation for operand %i of '%s'"),
4206 1.1 skrll opnum + 1, xtensa_opcode_name (xtensa_default_isa, opcode));
4207 1.1 skrll return FALSE;
4208 1.1 skrll }
4209 1.1 skrll
4210 1.1 skrll /* Handle erroneous "@h" and "@l" expressions here before they propagate
4211 1.1 skrll into the symbol table where the generic portions of the assembler
4212 1.1 skrll won't know what to do with them. */
4213 1.1 skrll if (expr->X_op == O_lo16 || expr->X_op == O_hi16)
4214 1.1 skrll {
4215 1.1 skrll as_bad (_("invalid expression for operand %i of '%s'"),
4216 1.1 skrll opnum + 1, xtensa_opcode_name (xtensa_default_isa, opcode));
4217 1.1 skrll return FALSE;
4218 1.1 skrll }
4219 1.1 skrll
4220 1.1 skrll /* Next try the generic relocs. */
4221 1.1 skrll if (reloc == BFD_RELOC_NONE)
4222 1.1 skrll reloc = encode_reloc (slot);
4223 1.1 skrll if (reloc == BFD_RELOC_NONE)
4224 1.1 skrll {
4225 1.1 skrll as_bad (_("invalid relocation in instruction slot %i"), slot);
4226 1.1 skrll return FALSE;
4227 1.1 skrll }
4228 1.1 skrll
4229 1.1 skrll howto = bfd_reloc_type_lookup (stdoutput, reloc);
4230 1.1 skrll if (!howto)
4231 1.1 skrll {
4232 1.1 skrll as_bad (_("undefined symbol for opcode \"%s\""),
4233 1.1 skrll xtensa_opcode_name (xtensa_default_isa, opcode));
4234 1.1 skrll return FALSE;
4235 1.1 skrll }
4236 1.1 skrll
4237 1.1 skrll fmt_length = xtensa_format_length (xtensa_default_isa, fmt);
4238 1.1 skrll the_fix = fix_new_exp (fragP, offset, fmt_length, expr,
4239 1.1 skrll howto->pc_relative, reloc);
4240 1.1 skrll the_fix->fx_no_overflow = 1;
4241 1.1 skrll the_fix->tc_fix_data.X_add_symbol = expr->X_add_symbol;
4242 1.1 skrll the_fix->tc_fix_data.X_add_number = expr->X_add_number;
4243 1.1 skrll the_fix->tc_fix_data.slot = slot;
4244 1.1 skrll
4245 1.1 skrll return TRUE;
4246 1.1 skrll }
4247 1.1 skrll
4248 1.1 skrll
4249 1.1 skrll static bfd_boolean
4250 1.1 skrll xg_emit_insn_to_buf (TInsn *tinsn,
4251 1.1 skrll char *buf,
4252 1.1 skrll fragS *fragP,
4253 1.1 skrll offsetT offset,
4254 1.1 skrll bfd_boolean build_fix)
4255 1.1 skrll {
4256 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
4257 1.1 skrll bfd_boolean has_symbolic_immed = FALSE;
4258 1.1 skrll bfd_boolean ok = TRUE;
4259 1.1 skrll
4260 1.1 skrll if (!insnbuf)
4261 1.1 skrll insnbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
4262 1.1 skrll
4263 1.1 skrll has_symbolic_immed = tinsn_to_insnbuf (tinsn, insnbuf);
4264 1.1 skrll if (has_symbolic_immed && build_fix)
4265 1.1 skrll {
4266 1.1 skrll /* Add a fixup. */
4267 1.1 skrll xtensa_format fmt = xg_get_single_format (tinsn->opcode);
4268 1.1 skrll int slot = xg_get_single_slot (tinsn->opcode);
4269 1.1 skrll int opnum = get_relaxable_immed (tinsn->opcode);
4270 1.1 skrll expressionS *exp = &tinsn->tok[opnum];
4271 1.1 skrll
4272 1.1 skrll if (!xg_add_opcode_fix (tinsn, opnum, fmt, slot, exp, fragP, offset))
4273 1.1 skrll ok = FALSE;
4274 1.1 skrll }
4275 1.1 skrll fragP->tc_frag_data.is_insn = TRUE;
4276 1.1 skrll xtensa_insnbuf_to_chars (xtensa_default_isa, insnbuf,
4277 1.1 skrll (unsigned char *) buf, 0);
4278 1.1 skrll return ok;
4279 1.1 skrll }
4280 1.1 skrll
4281 1.1 skrll
4282 1.1 skrll static void
4283 1.1 skrll xg_resolve_literals (TInsn *insn, symbolS *lit_sym)
4284 1.1 skrll {
4285 1.1 skrll symbolS *sym = get_special_literal_symbol ();
4286 1.1 skrll int i;
4287 1.1 skrll if (lit_sym == 0)
4288 1.1 skrll return;
4289 1.1 skrll assert (insn->insn_type == ITYPE_INSN);
4290 1.1 skrll for (i = 0; i < insn->ntok; i++)
4291 1.1 skrll if (insn->tok[i].X_add_symbol == sym)
4292 1.1 skrll insn->tok[i].X_add_symbol = lit_sym;
4293 1.1 skrll
4294 1.1 skrll }
4295 1.1 skrll
4296 1.1 skrll
4297 1.1 skrll static void
4298 1.1 skrll xg_resolve_labels (TInsn *insn, symbolS *label_sym)
4299 1.1 skrll {
4300 1.1 skrll symbolS *sym = get_special_label_symbol ();
4301 1.1 skrll int i;
4302 1.1 skrll for (i = 0; i < insn->ntok; i++)
4303 1.1 skrll if (insn->tok[i].X_add_symbol == sym)
4304 1.1 skrll insn->tok[i].X_add_symbol = label_sym;
4305 1.1 skrll
4306 1.1 skrll }
4307 1.1 skrll
4308 1.1 skrll
4309 1.1 skrll /* Return TRUE if the instruction can write to the specified
4310 1.1 skrll integer register. */
4311 1.1 skrll
4312 1.1 skrll static bfd_boolean
4313 1.1 skrll is_register_writer (const TInsn *insn, const char *regset, int regnum)
4314 1.1 skrll {
4315 1.1 skrll int i;
4316 1.1 skrll int num_ops;
4317 1.1 skrll xtensa_isa isa = xtensa_default_isa;
4318 1.1 skrll
4319 1.1 skrll num_ops = xtensa_opcode_num_operands (isa, insn->opcode);
4320 1.1 skrll
4321 1.1 skrll for (i = 0; i < num_ops; i++)
4322 1.1 skrll {
4323 1.1 skrll char inout;
4324 1.1 skrll inout = xtensa_operand_inout (isa, insn->opcode, i);
4325 1.1 skrll if ((inout == 'o' || inout == 'm')
4326 1.1 skrll && xtensa_operand_is_register (isa, insn->opcode, i) == 1)
4327 1.1 skrll {
4328 1.1 skrll xtensa_regfile opnd_rf =
4329 1.1 skrll xtensa_operand_regfile (isa, insn->opcode, i);
4330 1.1 skrll if (!strcmp (xtensa_regfile_shortname (isa, opnd_rf), regset))
4331 1.1 skrll {
4332 1.1 skrll if ((insn->tok[i].X_op == O_register)
4333 1.1 skrll && (insn->tok[i].X_add_number == regnum))
4334 1.1 skrll return TRUE;
4335 1.1 skrll }
4336 1.1 skrll }
4337 1.1 skrll }
4338 1.1 skrll return FALSE;
4339 1.1 skrll }
4340 1.1 skrll
4341 1.1 skrll
4342 1.1 skrll static bfd_boolean
4343 1.1 skrll is_bad_loopend_opcode (const TInsn *tinsn)
4344 1.1 skrll {
4345 1.1 skrll xtensa_opcode opcode = tinsn->opcode;
4346 1.1 skrll
4347 1.1 skrll if (opcode == XTENSA_UNDEFINED)
4348 1.1 skrll return FALSE;
4349 1.1 skrll
4350 1.1 skrll if (opcode == xtensa_call0_opcode
4351 1.1 skrll || opcode == xtensa_callx0_opcode
4352 1.1 skrll || opcode == xtensa_call4_opcode
4353 1.1 skrll || opcode == xtensa_callx4_opcode
4354 1.1 skrll || opcode == xtensa_call8_opcode
4355 1.1 skrll || opcode == xtensa_callx8_opcode
4356 1.1 skrll || opcode == xtensa_call12_opcode
4357 1.1 skrll || opcode == xtensa_callx12_opcode
4358 1.1 skrll || opcode == xtensa_isync_opcode
4359 1.1 skrll || opcode == xtensa_ret_opcode
4360 1.1 skrll || opcode == xtensa_ret_n_opcode
4361 1.1 skrll || opcode == xtensa_retw_opcode
4362 1.1 skrll || opcode == xtensa_retw_n_opcode
4363 1.1 skrll || opcode == xtensa_waiti_opcode
4364 1.1 skrll || opcode == xtensa_rsr_lcount_opcode)
4365 1.1 skrll return TRUE;
4366 1.1 skrll
4367 1.1 skrll return FALSE;
4368 1.1 skrll }
4369 1.1 skrll
4370 1.1 skrll
4371 1.1 skrll /* Labels that begin with ".Ln" or ".LM" are unaligned.
4372 1.1 skrll This allows the debugger to add unaligned labels.
4373 1.1 skrll Also, the assembler generates stabs labels that need
4374 1.1 skrll not be aligned: FAKE_LABEL_NAME . {"F", "L", "endfunc"}. */
4375 1.1 skrll
4376 1.1 skrll static bfd_boolean
4377 1.1 skrll is_unaligned_label (symbolS *sym)
4378 1.1 skrll {
4379 1.1 skrll const char *name = S_GET_NAME (sym);
4380 1.1 skrll static size_t fake_size = 0;
4381 1.1 skrll
4382 1.1 skrll if (name
4383 1.1 skrll && name[0] == '.'
4384 1.1 skrll && name[1] == 'L' && (name[2] == 'n' || name[2] == 'M'))
4385 1.1 skrll return TRUE;
4386 1.1 skrll
4387 1.1 skrll /* FAKE_LABEL_NAME followed by "F", "L" or "endfunc" */
4388 1.1 skrll if (fake_size == 0)
4389 1.1 skrll fake_size = strlen (FAKE_LABEL_NAME);
4390 1.1 skrll
4391 1.1 skrll if (name
4392 1.1 skrll && strncmp (FAKE_LABEL_NAME, name, fake_size) == 0
4393 1.1 skrll && (name[fake_size] == 'F'
4394 1.1 skrll || name[fake_size] == 'L'
4395 1.1 skrll || (name[fake_size] == 'e'
4396 1.1 skrll && strncmp ("endfunc", name+fake_size, 7) == 0)))
4397 1.1 skrll return TRUE;
4398 1.1 skrll
4399 1.1 skrll return FALSE;
4400 1.1 skrll }
4401 1.1 skrll
4402 1.1 skrll
4403 1.1 skrll static fragS *
4404 1.1 skrll next_non_empty_frag (const fragS *fragP)
4405 1.1 skrll {
4406 1.1 skrll fragS *next_fragP = fragP->fr_next;
4407 1.1 skrll
4408 1.1 skrll /* Sometimes an empty will end up here due storage allocation issues.
4409 1.1 skrll So we have to skip until we find something legit. */
4410 1.1 skrll while (next_fragP && next_fragP->fr_fix == 0)
4411 1.1 skrll next_fragP = next_fragP->fr_next;
4412 1.1 skrll
4413 1.1 skrll if (next_fragP == NULL || next_fragP->fr_fix == 0)
4414 1.1 skrll return NULL;
4415 1.1 skrll
4416 1.1 skrll return next_fragP;
4417 1.1 skrll }
4418 1.1 skrll
4419 1.1 skrll
4420 1.1 skrll static bfd_boolean
4421 1.1 skrll next_frag_opcode_is_loop (const fragS *fragP, xtensa_opcode *opcode)
4422 1.1 skrll {
4423 1.1 skrll xtensa_opcode out_opcode;
4424 1.1 skrll const fragS *next_fragP = next_non_empty_frag (fragP);
4425 1.1 skrll
4426 1.1 skrll if (next_fragP == NULL)
4427 1.1 skrll return FALSE;
4428 1.1 skrll
4429 1.1 skrll out_opcode = get_opcode_from_buf (next_fragP->fr_literal, 0);
4430 1.1 skrll if (xtensa_opcode_is_loop (xtensa_default_isa, out_opcode) == 1)
4431 1.1 skrll {
4432 1.1 skrll *opcode = out_opcode;
4433 1.1 skrll return TRUE;
4434 1.1 skrll }
4435 1.1 skrll return FALSE;
4436 1.1 skrll }
4437 1.1 skrll
4438 1.1 skrll
4439 1.1 skrll static int
4440 1.1 skrll frag_format_size (const fragS *fragP)
4441 1.1 skrll {
4442 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
4443 1.1 skrll xtensa_isa isa = xtensa_default_isa;
4444 1.1 skrll xtensa_format fmt;
4445 1.1 skrll int fmt_size;
4446 1.1 skrll
4447 1.1 skrll if (!insnbuf)
4448 1.1 skrll insnbuf = xtensa_insnbuf_alloc (isa);
4449 1.1 skrll
4450 1.1 skrll if (fragP == NULL)
4451 1.1 skrll return XTENSA_UNDEFINED;
4452 1.1 skrll
4453 1.1 skrll xtensa_insnbuf_from_chars (isa, insnbuf,
4454 1.1 skrll (unsigned char *) fragP->fr_literal, 0);
4455 1.1 skrll
4456 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
4457 1.1 skrll if (fmt == XTENSA_UNDEFINED)
4458 1.1 skrll return XTENSA_UNDEFINED;
4459 1.1 skrll fmt_size = xtensa_format_length (isa, fmt);
4460 1.1 skrll
4461 1.1 skrll /* If the next format won't be changing due to relaxation, just
4462 1.1 skrll return the length of the first format. */
4463 1.1 skrll if (fragP->fr_opcode != fragP->fr_literal)
4464 1.1 skrll return fmt_size;
4465 1.1 skrll
4466 1.1 skrll /* If during relaxation we have to pull an instruction out of a
4467 1.1 skrll multi-slot instruction, we will return the more conservative
4468 1.1 skrll number. This works because alignment on bigger instructions
4469 1.1 skrll is more restrictive than alignment on smaller instructions.
4470 1.1 skrll This is more conservative than we would like, but it happens
4471 1.1 skrll infrequently. */
4472 1.1 skrll
4473 1.1 skrll if (xtensa_format_num_slots (xtensa_default_isa, fmt) > 1)
4474 1.1 skrll return fmt_size;
4475 1.1 skrll
4476 1.1 skrll /* If we aren't doing one of our own relaxations or it isn't
4477 1.1 skrll slot-based, then the insn size won't change. */
4478 1.1 skrll if (fragP->fr_type != rs_machine_dependent)
4479 1.1 skrll return fmt_size;
4480 1.1 skrll if (fragP->fr_subtype != RELAX_SLOTS)
4481 1.1 skrll return fmt_size;
4482 1.1 skrll
4483 1.1 skrll /* If an instruction is about to grow, return the longer size. */
4484 1.1 skrll if (fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED_STEP1
4485 1.1 skrll || fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED_STEP2
4486 1.1 skrll || fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED_STEP3)
4487 1.1 skrll {
4488 1.1 skrll /* For most frags at RELAX_IMMED_STEPX, with X > 0, the first
4489 1.1 skrll instruction in the relaxed version is of length 3. (The case
4490 1.1 skrll where we have to pull the instruction out of a FLIX bundle
4491 1.1 skrll is handled conservatively above.) However, frags with opcodes
4492 1.1 skrll that are expanding to wide branches end up having formats that
4493 1.1 skrll are not determinable by the RELAX_IMMED_STEPX enumeration, and
4494 1.1 skrll we can't tell directly what format the relaxer picked. This
4495 1.1 skrll is a wart in the design of the relaxer that should someday be
4496 1.1 skrll fixed, but would require major changes, or at least should
4497 1.1 skrll be accompanied by major changes to make use of that data.
4498 1.1 skrll
4499 1.1 skrll In any event, we can tell that we are expanding from a single-slot
4500 1.1 skrll three-byte format to a wider one with the logic below. */
4501 1.1 skrll
4502 1.1 skrll if (fmt_size <= 3 && fragP->tc_frag_data.text_expansion[0] != 3)
4503 1.1 skrll return 3 + fragP->tc_frag_data.text_expansion[0];
4504 1.1 skrll else
4505 1.1 skrll return 3;
4506 1.1 skrll }
4507 1.1 skrll
4508 1.1 skrll if (fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
4509 1.1 skrll return 2 + fragP->tc_frag_data.text_expansion[0];
4510 1.1 skrll
4511 1.1 skrll return fmt_size;
4512 1.1 skrll }
4513 1.1 skrll
4514 1.1 skrll
4515 1.1 skrll static int
4516 1.1 skrll next_frag_format_size (const fragS *fragP)
4517 1.1 skrll {
4518 1.1 skrll const fragS *next_fragP = next_non_empty_frag (fragP);
4519 1.1 skrll return frag_format_size (next_fragP);
4520 1.1 skrll }
4521 1.1 skrll
4522 1.1 skrll
4523 1.1 skrll /* In early Xtensa Processors, for reasons that are unclear, the ISA
4524 1.1 skrll required two-byte instructions to be treated as three-byte instructions
4525 1.1 skrll for loop instruction alignment. This restriction was removed beginning
4526 1.1 skrll with Xtensa LX. Now the only requirement on loop instruction alignment
4527 1.1 skrll is that the first instruction of the loop must appear at an address that
4528 1.1 skrll does not cross a fetch boundary. */
4529 1.1 skrll
4530 1.1 skrll static int
4531 1.1 skrll get_loop_align_size (int insn_size)
4532 1.1 skrll {
4533 1.1 skrll if (insn_size == XTENSA_UNDEFINED)
4534 1.1 skrll return xtensa_fetch_width;
4535 1.1 skrll
4536 1.1 skrll if (enforce_three_byte_loop_align && insn_size == 2)
4537 1.1 skrll return 3;
4538 1.1 skrll
4539 1.1 skrll return insn_size;
4540 1.1 skrll }
4541 1.1 skrll
4542 1.1 skrll
4543 1.1 skrll /* If the next legit fragment is an end-of-loop marker,
4544 1.1 skrll switch its state so it will instantiate a NOP. */
4545 1.1 skrll
4546 1.1 skrll static void
4547 1.1 skrll update_next_frag_state (fragS *fragP)
4548 1.1 skrll {
4549 1.1 skrll fragS *next_fragP = fragP->fr_next;
4550 1.1 skrll fragS *new_target = NULL;
4551 1.1 skrll
4552 1.1 skrll if (align_targets)
4553 1.1 skrll {
4554 1.1 skrll /* We are guaranteed there will be one of these... */
4555 1.1 skrll while (!(next_fragP->fr_type == rs_machine_dependent
4556 1.1 skrll && (next_fragP->fr_subtype == RELAX_MAYBE_UNREACHABLE
4557 1.1 skrll || next_fragP->fr_subtype == RELAX_UNREACHABLE)))
4558 1.1 skrll next_fragP = next_fragP->fr_next;
4559 1.1 skrll
4560 1.1 skrll assert (next_fragP->fr_type == rs_machine_dependent
4561 1.1 skrll && (next_fragP->fr_subtype == RELAX_MAYBE_UNREACHABLE
4562 1.1 skrll || next_fragP->fr_subtype == RELAX_UNREACHABLE));
4563 1.1 skrll
4564 1.1 skrll /* ...and one of these. */
4565 1.1 skrll new_target = next_fragP->fr_next;
4566 1.1 skrll while (!(new_target->fr_type == rs_machine_dependent
4567 1.1 skrll && (new_target->fr_subtype == RELAX_MAYBE_DESIRE_ALIGN
4568 1.1 skrll || new_target->fr_subtype == RELAX_DESIRE_ALIGN)))
4569 1.1 skrll new_target = new_target->fr_next;
4570 1.1 skrll
4571 1.1 skrll assert (new_target->fr_type == rs_machine_dependent
4572 1.1 skrll && (new_target->fr_subtype == RELAX_MAYBE_DESIRE_ALIGN
4573 1.1 skrll || new_target->fr_subtype == RELAX_DESIRE_ALIGN));
4574 1.1 skrll }
4575 1.1 skrll
4576 1.1 skrll while (next_fragP && next_fragP->fr_fix == 0)
4577 1.1 skrll {
4578 1.1 skrll if (next_fragP->fr_type == rs_machine_dependent
4579 1.1 skrll && next_fragP->fr_subtype == RELAX_LOOP_END)
4580 1.1 skrll {
4581 1.1 skrll next_fragP->fr_subtype = RELAX_LOOP_END_ADD_NOP;
4582 1.1 skrll return;
4583 1.1 skrll }
4584 1.1 skrll
4585 1.1 skrll next_fragP = next_fragP->fr_next;
4586 1.1 skrll }
4587 1.1 skrll }
4588 1.1 skrll
4589 1.1 skrll
4590 1.1 skrll static bfd_boolean
4591 1.1 skrll next_frag_is_branch_target (const fragS *fragP)
4592 1.1 skrll {
4593 1.1 skrll /* Sometimes an empty will end up here due to storage allocation issues,
4594 1.1 skrll so we have to skip until we find something legit. */
4595 1.1 skrll for (fragP = fragP->fr_next; fragP; fragP = fragP->fr_next)
4596 1.1 skrll {
4597 1.1 skrll if (fragP->tc_frag_data.is_branch_target)
4598 1.1 skrll return TRUE;
4599 1.1 skrll if (fragP->fr_fix != 0)
4600 1.1 skrll break;
4601 1.1 skrll }
4602 1.1 skrll return FALSE;
4603 1.1 skrll }
4604 1.1 skrll
4605 1.1 skrll
4606 1.1 skrll static bfd_boolean
4607 1.1 skrll next_frag_is_loop_target (const fragS *fragP)
4608 1.1 skrll {
4609 1.1 skrll /* Sometimes an empty will end up here due storage allocation issues.
4610 1.1 skrll So we have to skip until we find something legit. */
4611 1.1 skrll for (fragP = fragP->fr_next; fragP; fragP = fragP->fr_next)
4612 1.1 skrll {
4613 1.1 skrll if (fragP->tc_frag_data.is_loop_target)
4614 1.1 skrll return TRUE;
4615 1.1 skrll if (fragP->fr_fix != 0)
4616 1.1 skrll break;
4617 1.1 skrll }
4618 1.1 skrll return FALSE;
4619 1.1 skrll }
4620 1.1 skrll
4621 1.1 skrll
4622 1.1 skrll static addressT
4623 1.1 skrll next_frag_pre_opcode_bytes (const fragS *fragp)
4624 1.1 skrll {
4625 1.1 skrll const fragS *next_fragp = fragp->fr_next;
4626 1.1 skrll xtensa_opcode next_opcode;
4627 1.1 skrll
4628 1.1 skrll if (!next_frag_opcode_is_loop (fragp, &next_opcode))
4629 1.1 skrll return 0;
4630 1.1 skrll
4631 1.1 skrll /* Sometimes an empty will end up here due to storage allocation issues,
4632 1.1 skrll so we have to skip until we find something legit. */
4633 1.1 skrll while (next_fragp->fr_fix == 0)
4634 1.1 skrll next_fragp = next_fragp->fr_next;
4635 1.1 skrll
4636 1.1 skrll if (next_fragp->fr_type != rs_machine_dependent)
4637 1.1 skrll return 0;
4638 1.1 skrll
4639 1.1 skrll /* There is some implicit knowledge encoded in here.
4640 1.1 skrll The LOOP instructions that are NOT RELAX_IMMED have
4641 1.1 skrll been relaxed. Note that we can assume that the LOOP
4642 1.1 skrll instruction is in slot 0 because loops aren't bundleable. */
4643 1.1 skrll if (next_fragp->tc_frag_data.slot_subtypes[0] > RELAX_IMMED)
4644 1.1 skrll return get_expanded_loop_offset (next_opcode);
4645 1.1 skrll
4646 1.1 skrll return 0;
4647 1.1 skrll }
4648 1.1 skrll
4649 1.1 skrll
4650 1.1 skrll /* Mark a location where we can later insert literal frags. Update
4651 1.1 skrll the section's literal_pool_loc, so subsequent literals can be
4652 1.1 skrll placed nearest to their use. */
4653 1.1 skrll
4654 1.1 skrll static void
4655 1.1 skrll xtensa_mark_literal_pool_location (void)
4656 1.1 skrll {
4657 1.1 skrll /* Any labels pointing to the current location need
4658 1.1 skrll to be adjusted to after the literal pool. */
4659 1.1 skrll emit_state s;
4660 1.1 skrll fragS *pool_location;
4661 1.1 skrll
4662 1.1 skrll if (use_literal_section)
4663 1.1 skrll return;
4664 1.1 skrll
4665 1.1 skrll /* We stash info in these frags so we can later move the literal's
4666 1.1 skrll fixes into this frchain's fix list. */
4667 1.1 skrll pool_location = frag_now;
4668 1.1 skrll frag_now->tc_frag_data.lit_frchain = frchain_now;
4669 1.1 skrll frag_now->tc_frag_data.literal_frag = frag_now;
4670 1.1 skrll frag_variant (rs_machine_dependent, 0, 0,
4671 1.1 skrll RELAX_LITERAL_POOL_BEGIN, NULL, 0, NULL);
4672 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
4673 1.1 skrll frag_now->tc_frag_data.lit_seg = now_seg;
4674 1.1 skrll frag_variant (rs_machine_dependent, 0, 0,
4675 1.1 skrll RELAX_LITERAL_POOL_END, NULL, 0, NULL);
4676 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
4677 1.1 skrll
4678 1.1 skrll /* Now put a frag into the literal pool that points to this location. */
4679 1.1 skrll set_literal_pool_location (now_seg, pool_location);
4680 1.1 skrll xtensa_switch_to_non_abs_literal_fragment (&s);
4681 1.1 skrll frag_align (2, 0, 0);
4682 1.1 skrll record_alignment (now_seg, 2);
4683 1.1 skrll
4684 1.1 skrll /* Close whatever frag is there. */
4685 1.1 skrll frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
4686 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
4687 1.1 skrll frag_now->tc_frag_data.literal_frag = pool_location;
4688 1.1 skrll frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
4689 1.1 skrll xtensa_restore_emit_state (&s);
4690 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
4691 1.1 skrll }
4692 1.1 skrll
4693 1.1 skrll
4694 1.1 skrll /* Build a nop of the correct size into tinsn. */
4695 1.1 skrll
4696 1.1 skrll static void
4697 1.1 skrll build_nop (TInsn *tinsn, int size)
4698 1.1 skrll {
4699 1.1 skrll tinsn_init (tinsn);
4700 1.1 skrll switch (size)
4701 1.1 skrll {
4702 1.1 skrll case 2:
4703 1.1 skrll tinsn->opcode = xtensa_nop_n_opcode;
4704 1.1 skrll tinsn->ntok = 0;
4705 1.1 skrll if (tinsn->opcode == XTENSA_UNDEFINED)
4706 1.1 skrll as_fatal (_("opcode 'NOP.N' unavailable in this configuration"));
4707 1.1 skrll break;
4708 1.1 skrll
4709 1.1 skrll case 3:
4710 1.1 skrll if (xtensa_nop_opcode == XTENSA_UNDEFINED)
4711 1.1 skrll {
4712 1.1 skrll tinsn->opcode = xtensa_or_opcode;
4713 1.1 skrll set_expr_const (&tinsn->tok[0], 1);
4714 1.1 skrll set_expr_const (&tinsn->tok[1], 1);
4715 1.1 skrll set_expr_const (&tinsn->tok[2], 1);
4716 1.1 skrll tinsn->ntok = 3;
4717 1.1 skrll }
4718 1.1 skrll else
4719 1.1 skrll tinsn->opcode = xtensa_nop_opcode;
4720 1.1 skrll
4721 1.1 skrll assert (tinsn->opcode != XTENSA_UNDEFINED);
4722 1.1 skrll }
4723 1.1 skrll }
4724 1.1 skrll
4725 1.1 skrll
4726 1.1 skrll /* Assemble a NOP of the requested size in the buffer. User must have
4727 1.1 skrll allocated "buf" with at least "size" bytes. */
4728 1.1 skrll
4729 1.1 skrll static void
4730 1.1 skrll assemble_nop (int size, char *buf)
4731 1.1 skrll {
4732 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
4733 1.1 skrll TInsn tinsn;
4734 1.1 skrll
4735 1.1 skrll build_nop (&tinsn, size);
4736 1.1 skrll
4737 1.1 skrll if (!insnbuf)
4738 1.1 skrll insnbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
4739 1.1 skrll
4740 1.1 skrll tinsn_to_insnbuf (&tinsn, insnbuf);
4741 1.1 skrll xtensa_insnbuf_to_chars (xtensa_default_isa, insnbuf,
4742 1.1 skrll (unsigned char *) buf, 0);
4743 1.1 skrll }
4744 1.1 skrll
4745 1.1 skrll
4746 1.1 skrll /* Return the number of bytes for the offset of the expanded loop
4747 1.1 skrll instruction. This should be incorporated into the relaxation
4748 1.1 skrll specification but is hard-coded here. This is used to auto-align
4749 1.1 skrll the loop instruction. It is invalid to call this function if the
4750 1.1 skrll configuration does not have loops or if the opcode is not a loop
4751 1.1 skrll opcode. */
4752 1.1 skrll
4753 1.1 skrll static addressT
4754 1.1 skrll get_expanded_loop_offset (xtensa_opcode opcode)
4755 1.1 skrll {
4756 1.1 skrll /* This is the OFFSET of the loop instruction in the expanded loop.
4757 1.1 skrll This MUST correspond directly to the specification of the loop
4758 1.1 skrll expansion. It will be validated on fragment conversion. */
4759 1.1 skrll assert (opcode != XTENSA_UNDEFINED);
4760 1.1 skrll if (opcode == xtensa_loop_opcode)
4761 1.1 skrll return 0;
4762 1.1 skrll if (opcode == xtensa_loopnez_opcode)
4763 1.1 skrll return 3;
4764 1.1 skrll if (opcode == xtensa_loopgtz_opcode)
4765 1.1 skrll return 6;
4766 1.1 skrll as_fatal (_("get_expanded_loop_offset: invalid opcode"));
4767 1.1 skrll return 0;
4768 1.1 skrll }
4769 1.1 skrll
4770 1.1 skrll
4771 1.1 skrll static fragS *
4772 1.1 skrll get_literal_pool_location (segT seg)
4773 1.1 skrll {
4774 1.1 skrll return seg_info (seg)->tc_segment_info_data.literal_pool_loc;
4775 1.1 skrll }
4776 1.1 skrll
4777 1.1 skrll
4778 1.1 skrll static void
4779 1.1 skrll set_literal_pool_location (segT seg, fragS *literal_pool_loc)
4780 1.1 skrll {
4781 1.1 skrll seg_info (seg)->tc_segment_info_data.literal_pool_loc = literal_pool_loc;
4782 1.1 skrll }
4783 1.1 skrll
4784 1.1 skrll
4785 1.1 skrll /* Set frag assembly state should be called when a new frag is
4786 1.1 skrll opened and after a frag has been closed. */
4787 1.1 skrll
4788 1.1 skrll static void
4789 1.1 skrll xtensa_set_frag_assembly_state (fragS *fragP)
4790 1.1 skrll {
4791 1.1 skrll if (!density_supported)
4792 1.1 skrll fragP->tc_frag_data.is_no_density = TRUE;
4793 1.1 skrll
4794 1.1 skrll /* This function is called from subsegs_finish, which is called
4795 1.1 skrll after xtensa_end, so we can't use "use_transform" or
4796 1.1 skrll "use_schedule" here. */
4797 1.1 skrll if (!directive_state[directive_transform])
4798 1.1 skrll fragP->tc_frag_data.is_no_transform = TRUE;
4799 1.1 skrll if (directive_state[directive_longcalls])
4800 1.1 skrll fragP->tc_frag_data.use_longcalls = TRUE;
4801 1.1 skrll fragP->tc_frag_data.use_absolute_literals =
4802 1.1 skrll directive_state[directive_absolute_literals];
4803 1.1 skrll fragP->tc_frag_data.is_assembly_state_set = TRUE;
4804 1.1 skrll }
4805 1.1 skrll
4806 1.1 skrll
4807 1.1 skrll static bfd_boolean
4808 1.1 skrll relaxable_section (asection *sec)
4809 1.1 skrll {
4810 1.1 skrll return ((sec->flags & SEC_DEBUGGING) == 0
4811 1.1 skrll && strcmp (sec->name, ".eh_frame") != 0);
4812 1.1 skrll }
4813 1.1 skrll
4814 1.1 skrll
4815 1.1 skrll static void
4816 1.1 skrll xtensa_mark_frags_for_org (void)
4817 1.1 skrll {
4818 1.1 skrll segT *seclist;
4819 1.1 skrll
4820 1.1 skrll /* Walk over each fragment of all of the current segments. If we find
4821 1.1 skrll a .org frag in any of the segments, mark all frags prior to it as
4822 1.1 skrll "no transform", which will prevent linker optimizations from messing
4823 1.1 skrll up the .org distance. This should be done after
4824 1.1 skrll xtensa_find_unmarked_state_frags, because we don't want to worry here
4825 1.1 skrll about that function trashing the data we save here. */
4826 1.1 skrll
4827 1.1 skrll for (seclist = &stdoutput->sections;
4828 1.1 skrll seclist && *seclist;
4829 1.1 skrll seclist = &(*seclist)->next)
4830 1.1 skrll {
4831 1.1 skrll segT sec = *seclist;
4832 1.1 skrll segment_info_type *seginfo;
4833 1.1 skrll fragS *fragP;
4834 1.1 skrll flagword flags;
4835 1.1 skrll flags = bfd_get_section_flags (stdoutput, sec);
4836 1.1 skrll if (flags & SEC_DEBUGGING)
4837 1.1 skrll continue;
4838 1.1 skrll if (!(flags & SEC_ALLOC))
4839 1.1 skrll continue;
4840 1.1 skrll
4841 1.1 skrll seginfo = seg_info (sec);
4842 1.1 skrll if (seginfo && seginfo->frchainP)
4843 1.1 skrll {
4844 1.1 skrll fragS *last_fragP = seginfo->frchainP->frch_root;
4845 1.1 skrll for (fragP = seginfo->frchainP->frch_root; fragP;
4846 1.1 skrll fragP = fragP->fr_next)
4847 1.1 skrll {
4848 1.1 skrll /* cvt_frag_to_fill has changed the fr_type of org frags to
4849 1.1 skrll rs_fill, so use the value as cached in rs_subtype here. */
4850 1.1 skrll if (fragP->fr_subtype == RELAX_ORG)
4851 1.1 skrll {
4852 1.1 skrll while (last_fragP != fragP->fr_next)
4853 1.1 skrll {
4854 1.1 skrll last_fragP->tc_frag_data.is_no_transform = TRUE;
4855 1.1 skrll last_fragP = last_fragP->fr_next;
4856 1.1 skrll }
4857 1.1 skrll }
4858 1.1 skrll }
4859 1.1 skrll }
4860 1.1 skrll }
4861 1.1 skrll }
4862 1.1 skrll
4863 1.1 skrll
4864 1.1 skrll static void
4865 1.1 skrll xtensa_find_unmarked_state_frags (void)
4866 1.1 skrll {
4867 1.1 skrll segT *seclist;
4868 1.1 skrll
4869 1.1 skrll /* Walk over each fragment of all of the current segments. For each
4870 1.1 skrll unmarked fragment, mark it with the same info as the previous
4871 1.1 skrll fragment. */
4872 1.1 skrll for (seclist = &stdoutput->sections;
4873 1.1 skrll seclist && *seclist;
4874 1.1 skrll seclist = &(*seclist)->next)
4875 1.1 skrll {
4876 1.1 skrll segT sec = *seclist;
4877 1.1 skrll segment_info_type *seginfo;
4878 1.1 skrll fragS *fragP;
4879 1.1 skrll flagword flags;
4880 1.1 skrll flags = bfd_get_section_flags (stdoutput, sec);
4881 1.1 skrll if (flags & SEC_DEBUGGING)
4882 1.1 skrll continue;
4883 1.1 skrll if (!(flags & SEC_ALLOC))
4884 1.1 skrll continue;
4885 1.1 skrll
4886 1.1 skrll seginfo = seg_info (sec);
4887 1.1 skrll if (seginfo && seginfo->frchainP)
4888 1.1 skrll {
4889 1.1 skrll fragS *last_fragP = 0;
4890 1.1 skrll for (fragP = seginfo->frchainP->frch_root; fragP;
4891 1.1 skrll fragP = fragP->fr_next)
4892 1.1 skrll {
4893 1.1 skrll if (fragP->fr_fix != 0
4894 1.1 skrll && !fragP->tc_frag_data.is_assembly_state_set)
4895 1.1 skrll {
4896 1.1 skrll if (last_fragP == 0)
4897 1.1 skrll {
4898 1.1 skrll as_warn_where (fragP->fr_file, fragP->fr_line,
4899 1.1 skrll _("assembly state not set for first frag in section %s"),
4900 1.1 skrll sec->name);
4901 1.1 skrll }
4902 1.1 skrll else
4903 1.1 skrll {
4904 1.1 skrll fragP->tc_frag_data.is_assembly_state_set = TRUE;
4905 1.1 skrll fragP->tc_frag_data.is_no_density =
4906 1.1 skrll last_fragP->tc_frag_data.is_no_density;
4907 1.1 skrll fragP->tc_frag_data.is_no_transform =
4908 1.1 skrll last_fragP->tc_frag_data.is_no_transform;
4909 1.1 skrll fragP->tc_frag_data.use_longcalls =
4910 1.1 skrll last_fragP->tc_frag_data.use_longcalls;
4911 1.1 skrll fragP->tc_frag_data.use_absolute_literals =
4912 1.1 skrll last_fragP->tc_frag_data.use_absolute_literals;
4913 1.1 skrll }
4914 1.1 skrll }
4915 1.1 skrll if (fragP->tc_frag_data.is_assembly_state_set)
4916 1.1 skrll last_fragP = fragP;
4917 1.1 skrll }
4918 1.1 skrll }
4919 1.1 skrll }
4920 1.1 skrll }
4921 1.1 skrll
4922 1.1 skrll
4923 1.1 skrll static void
4924 1.1 skrll xtensa_find_unaligned_branch_targets (bfd *abfd ATTRIBUTE_UNUSED,
4925 1.1 skrll asection *sec,
4926 1.1 skrll void *unused ATTRIBUTE_UNUSED)
4927 1.1 skrll {
4928 1.1 skrll flagword flags = bfd_get_section_flags (abfd, sec);
4929 1.1 skrll segment_info_type *seginfo = seg_info (sec);
4930 1.1 skrll fragS *frag = seginfo->frchainP->frch_root;
4931 1.1 skrll
4932 1.1 skrll if (flags & SEC_CODE)
4933 1.1 skrll {
4934 1.1 skrll xtensa_isa isa = xtensa_default_isa;
4935 1.1 skrll xtensa_insnbuf insnbuf = xtensa_insnbuf_alloc (isa);
4936 1.1 skrll while (frag != NULL)
4937 1.1 skrll {
4938 1.1 skrll if (frag->tc_frag_data.is_branch_target)
4939 1.1 skrll {
4940 1.1 skrll int op_size;
4941 1.1 skrll addressT branch_align, frag_addr;
4942 1.1 skrll xtensa_format fmt;
4943 1.1 skrll
4944 1.1 skrll xtensa_insnbuf_from_chars
4945 1.1 skrll (isa, insnbuf, (unsigned char *) frag->fr_literal, 0);
4946 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
4947 1.1 skrll op_size = xtensa_format_length (isa, fmt);
4948 1.1 skrll branch_align = 1 << branch_align_power (sec);
4949 1.1 skrll frag_addr = frag->fr_address % branch_align;
4950 1.1 skrll if (frag_addr + op_size > branch_align)
4951 1.1 skrll as_warn_where (frag->fr_file, frag->fr_line,
4952 1.1 skrll _("unaligned branch target: %d bytes at 0x%lx"),
4953 1.1 skrll op_size, (long) frag->fr_address);
4954 1.1 skrll }
4955 1.1 skrll frag = frag->fr_next;
4956 1.1 skrll }
4957 1.1 skrll xtensa_insnbuf_free (isa, insnbuf);
4958 1.1 skrll }
4959 1.1 skrll }
4960 1.1 skrll
4961 1.1 skrll
4962 1.1 skrll static void
4963 1.1 skrll xtensa_find_unaligned_loops (bfd *abfd ATTRIBUTE_UNUSED,
4964 1.1 skrll asection *sec,
4965 1.1 skrll void *unused ATTRIBUTE_UNUSED)
4966 1.1 skrll {
4967 1.1 skrll flagword flags = bfd_get_section_flags (abfd, sec);
4968 1.1 skrll segment_info_type *seginfo = seg_info (sec);
4969 1.1 skrll fragS *frag = seginfo->frchainP->frch_root;
4970 1.1 skrll xtensa_isa isa = xtensa_default_isa;
4971 1.1 skrll
4972 1.1 skrll if (flags & SEC_CODE)
4973 1.1 skrll {
4974 1.1 skrll xtensa_insnbuf insnbuf = xtensa_insnbuf_alloc (isa);
4975 1.1 skrll while (frag != NULL)
4976 1.1 skrll {
4977 1.1 skrll if (frag->tc_frag_data.is_first_loop_insn)
4978 1.1 skrll {
4979 1.1 skrll int op_size;
4980 1.1 skrll addressT frag_addr;
4981 1.1 skrll xtensa_format fmt;
4982 1.1 skrll
4983 1.1 skrll xtensa_insnbuf_from_chars
4984 1.1 skrll (isa, insnbuf, (unsigned char *) frag->fr_literal, 0);
4985 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
4986 1.1 skrll op_size = xtensa_format_length (isa, fmt);
4987 1.1 skrll frag_addr = frag->fr_address % xtensa_fetch_width;
4988 1.1 skrll
4989 1.1 skrll if (frag_addr + op_size > xtensa_fetch_width)
4990 1.1 skrll as_warn_where (frag->fr_file, frag->fr_line,
4991 1.1 skrll _("unaligned loop: %d bytes at 0x%lx"),
4992 1.1 skrll op_size, (long) frag->fr_address);
4993 1.1 skrll }
4994 1.1 skrll frag = frag->fr_next;
4995 1.1 skrll }
4996 1.1 skrll xtensa_insnbuf_free (isa, insnbuf);
4997 1.1 skrll }
4998 1.1 skrll }
4999 1.1 skrll
5000 1.1 skrll
5001 1.1 skrll static int
5002 1.1 skrll xg_apply_fix_value (fixS *fixP, valueT val)
5003 1.1 skrll {
5004 1.1 skrll xtensa_isa isa = xtensa_default_isa;
5005 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
5006 1.1 skrll static xtensa_insnbuf slotbuf = NULL;
5007 1.1 skrll xtensa_format fmt;
5008 1.1 skrll int slot;
5009 1.1 skrll bfd_boolean alt_reloc;
5010 1.1 skrll xtensa_opcode opcode;
5011 1.1 skrll char *const fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
5012 1.1 skrll
5013 1.1 skrll if (decode_reloc (fixP->fx_r_type, &slot, &alt_reloc)
5014 1.1 skrll || alt_reloc)
5015 1.1 skrll as_fatal (_("unexpected fix"));
5016 1.1 skrll
5017 1.1 skrll if (!insnbuf)
5018 1.1 skrll {
5019 1.1 skrll insnbuf = xtensa_insnbuf_alloc (isa);
5020 1.1 skrll slotbuf = xtensa_insnbuf_alloc (isa);
5021 1.1 skrll }
5022 1.1 skrll
5023 1.1 skrll xtensa_insnbuf_from_chars (isa, insnbuf, (unsigned char *) fixpos, 0);
5024 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
5025 1.1 skrll if (fmt == XTENSA_UNDEFINED)
5026 1.1 skrll as_fatal (_("undecodable fix"));
5027 1.1 skrll xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
5028 1.1 skrll opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
5029 1.1 skrll if (opcode == XTENSA_UNDEFINED)
5030 1.1 skrll as_fatal (_("undecodable fix"));
5031 1.1 skrll
5032 1.1 skrll /* CONST16 immediates are not PC-relative, despite the fact that we
5033 1.1 skrll reuse the normal PC-relative operand relocations for the low part
5034 1.1 skrll of a CONST16 operand. */
5035 1.1 skrll if (opcode == xtensa_const16_opcode)
5036 1.1 skrll return 0;
5037 1.1 skrll
5038 1.1 skrll xtensa_insnbuf_set_operand (slotbuf, fmt, slot, opcode,
5039 1.1 skrll get_relaxable_immed (opcode), val,
5040 1.1 skrll fixP->fx_file, fixP->fx_line);
5041 1.1 skrll
5042 1.1 skrll xtensa_format_set_slot (isa, fmt, slot, insnbuf, slotbuf);
5043 1.1 skrll xtensa_insnbuf_to_chars (isa, insnbuf, (unsigned char *) fixpos, 0);
5044 1.1 skrll
5045 1.1 skrll return 1;
5046 1.1 skrll }
5047 1.1 skrll
5048 1.1 skrll
5049 1.1 skrll /* External Functions and Other GAS Hooks. */
5051 1.1 skrll
5052 1.1 skrll const char *
5053 1.1 skrll xtensa_target_format (void)
5054 1.1 skrll {
5055 1.1 skrll return (target_big_endian ? "elf32-xtensa-be" : "elf32-xtensa-le");
5056 1.1 skrll }
5057 1.1 skrll
5058 1.1 skrll
5059 1.1 skrll void
5060 1.1 skrll xtensa_file_arch_init (bfd *abfd)
5061 1.1 skrll {
5062 1.1 skrll bfd_set_private_flags (abfd, 0x100 | 0x200);
5063 1.1 skrll }
5064 1.1 skrll
5065 1.1 skrll
5066 1.1 skrll void
5067 1.1 skrll md_number_to_chars (char *buf, valueT val, int n)
5068 1.1 skrll {
5069 1.1 skrll if (target_big_endian)
5070 1.1 skrll number_to_chars_bigendian (buf, val, n);
5071 1.1 skrll else
5072 1.1 skrll number_to_chars_littleendian (buf, val, n);
5073 1.1 skrll }
5074 1.1 skrll
5075 1.1 skrll
5076 1.1 skrll /* This function is called once, at assembler startup time. It should
5077 1.1 skrll set up all the tables, etc. that the MD part of the assembler will
5078 1.1 skrll need. */
5079 1.1 skrll
5080 1.1 skrll void
5081 1.1 skrll md_begin (void)
5082 1.1 skrll {
5083 1.1 skrll segT current_section = now_seg;
5084 1.1 skrll int current_subsec = now_subseg;
5085 1.1 skrll xtensa_isa isa;
5086 1.1 skrll
5087 1.1 skrll xtensa_default_isa = xtensa_isa_init (0, 0);
5088 1.1 skrll isa = xtensa_default_isa;
5089 1.1 skrll
5090 1.1 skrll linkrelax = 1;
5091 1.1 skrll
5092 1.1 skrll /* Set up the literal sections. */
5093 1.1 skrll memset (&default_lit_sections, 0, sizeof (default_lit_sections));
5094 1.1 skrll
5095 1.1 skrll subseg_set (current_section, current_subsec);
5096 1.1 skrll
5097 1.1 skrll xg_init_vinsn (&cur_vinsn);
5098 1.1 skrll
5099 1.1 skrll xtensa_addi_opcode = xtensa_opcode_lookup (isa, "addi");
5100 1.1 skrll xtensa_addmi_opcode = xtensa_opcode_lookup (isa, "addmi");
5101 1.1 skrll xtensa_call0_opcode = xtensa_opcode_lookup (isa, "call0");
5102 1.1 skrll xtensa_call4_opcode = xtensa_opcode_lookup (isa, "call4");
5103 1.1 skrll xtensa_call8_opcode = xtensa_opcode_lookup (isa, "call8");
5104 1.1 skrll xtensa_call12_opcode = xtensa_opcode_lookup (isa, "call12");
5105 1.1 skrll xtensa_callx0_opcode = xtensa_opcode_lookup (isa, "callx0");
5106 1.1 skrll xtensa_callx4_opcode = xtensa_opcode_lookup (isa, "callx4");
5107 1.1 skrll xtensa_callx8_opcode = xtensa_opcode_lookup (isa, "callx8");
5108 1.1 skrll xtensa_callx12_opcode = xtensa_opcode_lookup (isa, "callx12");
5109 1.1 skrll xtensa_const16_opcode = xtensa_opcode_lookup (isa, "const16");
5110 1.1 skrll xtensa_entry_opcode = xtensa_opcode_lookup (isa, "entry");
5111 1.1 skrll xtensa_extui_opcode = xtensa_opcode_lookup (isa, "extui");
5112 1.1 skrll xtensa_movi_opcode = xtensa_opcode_lookup (isa, "movi");
5113 1.1 skrll xtensa_movi_n_opcode = xtensa_opcode_lookup (isa, "movi.n");
5114 1.1 skrll xtensa_isync_opcode = xtensa_opcode_lookup (isa, "isync");
5115 1.1 skrll xtensa_jx_opcode = xtensa_opcode_lookup (isa, "jx");
5116 1.1 skrll xtensa_l32r_opcode = xtensa_opcode_lookup (isa, "l32r");
5117 1.1 skrll xtensa_loop_opcode = xtensa_opcode_lookup (isa, "loop");
5118 1.1 skrll xtensa_loopnez_opcode = xtensa_opcode_lookup (isa, "loopnez");
5119 1.1 skrll xtensa_loopgtz_opcode = xtensa_opcode_lookup (isa, "loopgtz");
5120 1.1 skrll xtensa_nop_opcode = xtensa_opcode_lookup (isa, "nop");
5121 1.1 skrll xtensa_nop_n_opcode = xtensa_opcode_lookup (isa, "nop.n");
5122 1.1 skrll xtensa_or_opcode = xtensa_opcode_lookup (isa, "or");
5123 1.1 skrll xtensa_ret_opcode = xtensa_opcode_lookup (isa, "ret");
5124 1.1 skrll xtensa_ret_n_opcode = xtensa_opcode_lookup (isa, "ret.n");
5125 1.1 skrll xtensa_retw_opcode = xtensa_opcode_lookup (isa, "retw");
5126 1.1 skrll xtensa_retw_n_opcode = xtensa_opcode_lookup (isa, "retw.n");
5127 1.1 skrll xtensa_rsr_lcount_opcode = xtensa_opcode_lookup (isa, "rsr.lcount");
5128 1.1 skrll xtensa_waiti_opcode = xtensa_opcode_lookup (isa, "waiti");
5129 1.1 skrll
5130 1.1 skrll xtensa_num_pipe_stages = xtensa_isa_num_pipe_stages (isa);
5131 1.1 skrll
5132 1.1 skrll init_op_placement_info_table ();
5133 1.1 skrll
5134 1.1 skrll /* Set up the assembly state. */
5135 1.1 skrll if (!frag_now->tc_frag_data.is_assembly_state_set)
5136 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
5137 1.1 skrll }
5138 1.1 skrll
5139 1.1 skrll
5140 1.1 skrll /* TC_INIT_FIX_DATA hook */
5141 1.1 skrll
5142 1.1 skrll void
5143 1.1 skrll xtensa_init_fix_data (fixS *x)
5144 1.1 skrll {
5145 1.1 skrll x->tc_fix_data.slot = 0;
5146 1.1 skrll x->tc_fix_data.X_add_symbol = NULL;
5147 1.1 skrll x->tc_fix_data.X_add_number = 0;
5148 1.1 skrll }
5149 1.1 skrll
5150 1.1 skrll
5151 1.1 skrll /* tc_frob_label hook */
5152 1.1 skrll
5153 1.1 skrll void
5154 1.1 skrll xtensa_frob_label (symbolS *sym)
5155 1.1 skrll {
5156 1.1 skrll float freq;
5157 1.1 skrll
5158 1.1 skrll if (cur_vinsn.inside_bundle)
5159 1.1 skrll {
5160 1.1 skrll as_bad (_("labels are not valid inside bundles"));
5161 1.1 skrll return;
5162 1.1 skrll }
5163 1.1 skrll
5164 1.1 skrll freq = get_subseg_target_freq (now_seg, now_subseg);
5165 1.1 skrll
5166 1.1 skrll /* Since the label was already attached to a frag associated with the
5167 1.1 skrll previous basic block, it now needs to be reset to the current frag. */
5168 1.1 skrll symbol_set_frag (sym, frag_now);
5169 1.1 skrll S_SET_VALUE (sym, (valueT) frag_now_fix ());
5170 1.1 skrll
5171 1.1 skrll if (generating_literals)
5172 1.1 skrll xtensa_add_literal_sym (sym);
5173 1.1 skrll else
5174 1.1 skrll xtensa_add_insn_label (sym);
5175 1.1 skrll
5176 1.1 skrll if (symbol_get_tc (sym)->is_loop_target)
5177 1.1 skrll {
5178 1.1 skrll if ((get_last_insn_flags (now_seg, now_subseg)
5179 1.1 skrll & FLAG_IS_BAD_LOOPEND) != 0)
5180 1.1 skrll as_bad (_("invalid last instruction for a zero-overhead loop"));
5181 1.1 skrll
5182 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
5183 1.1 skrll frag_var (rs_machine_dependent, 4, 4, RELAX_LOOP_END,
5184 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
5185 1.1 skrll
5186 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
5187 1.1 skrll xtensa_move_labels (frag_now, 0);
5188 1.1 skrll }
5189 1.1 skrll
5190 1.1 skrll /* No target aligning in the absolute section. */
5191 1.1 skrll if (now_seg != absolute_section
5192 1.1 skrll && do_align_targets ()
5193 1.1 skrll && !is_unaligned_label (sym)
5194 1.1 skrll && !generating_literals)
5195 1.1 skrll {
5196 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
5197 1.1 skrll
5198 1.1 skrll frag_var (rs_machine_dependent,
5199 1.1 skrll 0, (int) freq,
5200 1.1 skrll RELAX_DESIRE_ALIGN_IF_TARGET,
5201 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
5202 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
5203 1.1 skrll xtensa_move_labels (frag_now, 0);
5204 1.1 skrll }
5205 1.1 skrll
5206 1.1 skrll /* We need to mark the following properties even if we aren't aligning. */
5207 1.1 skrll
5208 1.1 skrll /* If the label is already known to be a branch target, i.e., a
5209 1.1 skrll forward branch, mark the frag accordingly. Backward branches
5210 1.1 skrll are handled by xg_add_branch_and_loop_targets. */
5211 1.1 skrll if (symbol_get_tc (sym)->is_branch_target)
5212 1.1 skrll symbol_get_frag (sym)->tc_frag_data.is_branch_target = TRUE;
5213 1.1 skrll
5214 1.1 skrll /* Loops only go forward, so they can be identified here. */
5215 1.1 skrll if (symbol_get_tc (sym)->is_loop_target)
5216 1.1 skrll symbol_get_frag (sym)->tc_frag_data.is_loop_target = TRUE;
5217 1.1 skrll
5218 1.1 skrll dwarf2_emit_label (sym);
5219 1.1 skrll }
5220 1.1 skrll
5221 1.1 skrll
5222 1.1 skrll /* tc_unrecognized_line hook */
5223 1.1 skrll
5224 1.1 skrll int
5225 1.1 skrll xtensa_unrecognized_line (int ch)
5226 1.1 skrll {
5227 1.1 skrll switch (ch)
5228 1.1 skrll {
5229 1.1 skrll case '{' :
5230 1.1 skrll if (cur_vinsn.inside_bundle == 0)
5231 1.1 skrll {
5232 1.1 skrll /* PR8110: Cannot emit line number info inside a FLIX bundle
5233 1.1 skrll when using --gstabs. Temporarily disable debug info. */
5234 1.1 skrll generate_lineno_debug ();
5235 1.1 skrll if (debug_type == DEBUG_STABS)
5236 1.1 skrll {
5237 1.1 skrll xt_saved_debug_type = debug_type;
5238 1.1 skrll debug_type = DEBUG_NONE;
5239 1.1 skrll }
5240 1.1 skrll
5241 1.1 skrll cur_vinsn.inside_bundle = 1;
5242 1.1 skrll }
5243 1.1 skrll else
5244 1.1 skrll {
5245 1.1 skrll as_bad (_("extra opening brace"));
5246 1.1 skrll return 0;
5247 1.1 skrll }
5248 1.1 skrll break;
5249 1.1 skrll
5250 1.1 skrll case '}' :
5251 1.1 skrll if (cur_vinsn.inside_bundle)
5252 1.1 skrll finish_vinsn (&cur_vinsn);
5253 1.1 skrll else
5254 1.1 skrll {
5255 1.1 skrll as_bad (_("extra closing brace"));
5256 1.1 skrll return 0;
5257 1.1 skrll }
5258 1.1 skrll break;
5259 1.1 skrll default:
5260 1.1 skrll as_bad (_("syntax error"));
5261 1.1 skrll return 0;
5262 1.1 skrll }
5263 1.1 skrll return 1;
5264 1.1 skrll }
5265 1.1 skrll
5266 1.1 skrll
5267 1.1 skrll /* md_flush_pending_output hook */
5268 1.1 skrll
5269 1.1 skrll void
5270 1.1 skrll xtensa_flush_pending_output (void)
5271 1.1 skrll {
5272 1.1 skrll /* This line fixes a bug where automatically generated gstabs info
5273 1.1 skrll separates a function label from its entry instruction, ending up
5274 1.1 skrll with the literal position between the function label and the entry
5275 1.1 skrll instruction and crashing code. It only happens with --gstabs and
5276 1.1 skrll --text-section-literals, and when several other obscure relaxation
5277 1.1 skrll conditions are met. */
5278 1.1 skrll if (outputting_stabs_line_debug)
5279 1.1 skrll return;
5280 1.1 skrll
5281 1.1 skrll if (cur_vinsn.inside_bundle)
5282 1.1 skrll as_bad (_("missing closing brace"));
5283 1.1 skrll
5284 1.1 skrll /* If there is a non-zero instruction fragment, close it. */
5285 1.1 skrll if (frag_now_fix () != 0 && frag_now->tc_frag_data.is_insn)
5286 1.1 skrll {
5287 1.1 skrll frag_wane (frag_now);
5288 1.1 skrll frag_new (0);
5289 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
5290 1.1 skrll }
5291 1.1 skrll frag_now->tc_frag_data.is_insn = FALSE;
5292 1.1 skrll
5293 1.1 skrll xtensa_clear_insn_labels ();
5294 1.1 skrll }
5295 1.1 skrll
5296 1.1 skrll
5297 1.1 skrll /* We had an error while parsing an instruction. The string might look
5298 1.1 skrll like this: "insn arg1, arg2 }". If so, we need to see the closing
5299 1.1 skrll brace and reset some fields. Otherwise, the vinsn never gets closed
5300 1.1 skrll and the num_slots field will grow past the end of the array of slots,
5301 1.1 skrll and bad things happen. */
5302 1.1 skrll
5303 1.1 skrll static void
5304 1.1 skrll error_reset_cur_vinsn (void)
5305 1.1 skrll {
5306 1.1 skrll if (cur_vinsn.inside_bundle)
5307 1.1 skrll {
5308 1.1 skrll if (*input_line_pointer == '}'
5309 1.1 skrll || *(input_line_pointer - 1) == '}'
5310 1.1 skrll || *(input_line_pointer - 2) == '}')
5311 1.1 skrll xg_clear_vinsn (&cur_vinsn);
5312 1.1 skrll }
5313 1.1 skrll }
5314 1.1 skrll
5315 1.1 skrll
5316 1.1 skrll void
5317 1.1 skrll md_assemble (char *str)
5318 1.1 skrll {
5319 1.1 skrll xtensa_isa isa = xtensa_default_isa;
5320 1.1 skrll char *opname;
5321 1.1 skrll unsigned opnamelen;
5322 1.1 skrll bfd_boolean has_underbar = FALSE;
5323 1.1 skrll char *arg_strings[MAX_INSN_ARGS];
5324 1.1 skrll int num_args;
5325 1.1 skrll TInsn orig_insn; /* Original instruction from the input. */
5326 1.1 skrll
5327 1.1 skrll tinsn_init (&orig_insn);
5328 1.1 skrll
5329 1.1 skrll /* Split off the opcode. */
5330 1.1 skrll opnamelen = strspn (str, "abcdefghijklmnopqrstuvwxyz_/0123456789.");
5331 1.1 skrll opname = xmalloc (opnamelen + 1);
5332 1.1 skrll memcpy (opname, str, opnamelen);
5333 1.1 skrll opname[opnamelen] = '\0';
5334 1.1 skrll
5335 1.1 skrll num_args = tokenize_arguments (arg_strings, str + opnamelen);
5336 1.1 skrll if (num_args == -1)
5337 1.1 skrll {
5338 1.1 skrll as_bad (_("syntax error"));
5339 1.1 skrll return;
5340 1.1 skrll }
5341 1.1 skrll
5342 1.1 skrll if (xg_translate_idioms (&opname, &num_args, arg_strings))
5343 1.1 skrll return;
5344 1.1 skrll
5345 1.1 skrll /* Check for an underbar prefix. */
5346 1.1 skrll if (*opname == '_')
5347 1.1 skrll {
5348 1.1 skrll has_underbar = TRUE;
5349 1.1 skrll opname += 1;
5350 1.1 skrll }
5351 1.1 skrll
5352 1.1 skrll orig_insn.insn_type = ITYPE_INSN;
5353 1.1 skrll orig_insn.ntok = 0;
5354 1.1 skrll orig_insn.is_specific_opcode = (has_underbar || !use_transform ());
5355 1.1 skrll orig_insn.opcode = xtensa_opcode_lookup (isa, opname);
5356 1.1 skrll
5357 1.1 skrll /* Special case: Check for "CALLXn.TLS" psuedo op. If found, grab its
5358 1.1 skrll extra argument and set the opcode to "CALLXn". */
5359 1.1 skrll if (orig_insn.opcode == XTENSA_UNDEFINED
5360 1.1 skrll && strncasecmp (opname, "callx", 5) == 0)
5361 1.1 skrll {
5362 1.1 skrll unsigned long window_size;
5363 1.1 skrll char *suffix;
5364 1.1 skrll
5365 1.1 skrll window_size = strtoul (opname + 5, &suffix, 10);
5366 1.1 skrll if (suffix != opname + 5
5367 1.1 skrll && (window_size == 0
5368 1.1 skrll || window_size == 4
5369 1.1 skrll || window_size == 8
5370 1.1 skrll || window_size == 12)
5371 1.1 skrll && strcasecmp (suffix, ".tls") == 0)
5372 1.1 skrll {
5373 1.1 skrll switch (window_size)
5374 1.1 skrll {
5375 1.1 skrll case 0: orig_insn.opcode = xtensa_callx0_opcode; break;
5376 1.1 skrll case 4: orig_insn.opcode = xtensa_callx4_opcode; break;
5377 1.1 skrll case 8: orig_insn.opcode = xtensa_callx8_opcode; break;
5378 1.1 skrll case 12: orig_insn.opcode = xtensa_callx12_opcode; break;
5379 1.1 skrll }
5380 1.1 skrll
5381 1.1 skrll if (num_args != 2)
5382 1.1 skrll as_bad (_("wrong number of operands for '%s'"), opname);
5383 1.1 skrll else
5384 1.1 skrll {
5385 1.1 skrll bfd_reloc_code_real_type reloc;
5386 1.1 skrll char *old_input_line_pointer;
5387 1.1 skrll expressionS *tok = &orig_insn.tls_reloc;
5388 1.1 skrll segT t;
5389 1.1 skrll
5390 1.1 skrll old_input_line_pointer = input_line_pointer;
5391 1.1 skrll input_line_pointer = arg_strings[num_args - 1];
5392 1.1 skrll
5393 1.1 skrll t = expression (tok);
5394 1.1 skrll if (tok->X_op == O_symbol
5395 1.1 skrll && ((reloc = xtensa_elf_suffix (&input_line_pointer, tok))
5396 1.1 skrll == BFD_RELOC_XTENSA_TLS_CALL))
5397 1.1 skrll tok->X_op = map_suffix_reloc_to_operator (reloc);
5398 1.1 skrll else
5399 1.1 skrll as_bad (_("bad relocation expression for '%s'"), opname);
5400 1.1 skrll
5401 1.1 skrll input_line_pointer = old_input_line_pointer;
5402 1.1 skrll num_args -= 1;
5403 1.1 skrll }
5404 1.1 skrll }
5405 1.1 skrll }
5406 1.1 skrll
5407 1.1 skrll if (orig_insn.opcode == XTENSA_UNDEFINED)
5408 1.1 skrll {
5409 1.1 skrll xtensa_format fmt = xtensa_format_lookup (isa, opname);
5410 1.1 skrll if (fmt == XTENSA_UNDEFINED)
5411 1.1 skrll {
5412 1.1 skrll as_bad (_("unknown opcode or format name '%s'"), opname);
5413 1.1 skrll error_reset_cur_vinsn ();
5414 1.1 skrll return;
5415 1.1 skrll }
5416 1.1 skrll if (!cur_vinsn.inside_bundle)
5417 1.1 skrll {
5418 1.1 skrll as_bad (_("format names only valid inside bundles"));
5419 1.1 skrll error_reset_cur_vinsn ();
5420 1.1 skrll return;
5421 1.1 skrll }
5422 1.1 skrll if (cur_vinsn.format != XTENSA_UNDEFINED)
5423 1.1 skrll as_warn (_("multiple formats specified for one bundle; using '%s'"),
5424 1.1 skrll opname);
5425 1.1 skrll cur_vinsn.format = fmt;
5426 1.1 skrll free (has_underbar ? opname - 1 : opname);
5427 1.1 skrll error_reset_cur_vinsn ();
5428 1.1 skrll return;
5429 1.1 skrll }
5430 1.1 skrll
5431 1.1 skrll /* Parse the arguments. */
5432 1.1 skrll if (parse_arguments (&orig_insn, num_args, arg_strings))
5433 1.1 skrll {
5434 1.1 skrll as_bad (_("syntax error"));
5435 1.1 skrll error_reset_cur_vinsn ();
5436 1.1 skrll return;
5437 1.1 skrll }
5438 1.1 skrll
5439 1.1 skrll /* Free the opcode and argument strings, now that they've been parsed. */
5440 1.1 skrll free (has_underbar ? opname - 1 : opname);
5441 1.1 skrll opname = 0;
5442 1.1 skrll while (num_args-- > 0)
5443 1.1 skrll free (arg_strings[num_args]);
5444 1.1 skrll
5445 1.1 skrll /* Get expressions for invisible operands. */
5446 1.1 skrll if (get_invisible_operands (&orig_insn))
5447 1.1 skrll {
5448 1.1 skrll error_reset_cur_vinsn ();
5449 1.1 skrll return;
5450 1.1 skrll }
5451 1.1 skrll
5452 1.1 skrll /* Check for the right number and type of arguments. */
5453 1.1 skrll if (tinsn_check_arguments (&orig_insn))
5454 1.1 skrll {
5455 1.1 skrll error_reset_cur_vinsn ();
5456 1.1 skrll return;
5457 1.1 skrll }
5458 1.1 skrll
5459 1.1 skrll /* Record the line number for each TInsn, because a FLIX bundle may be
5460 1.1 skrll spread across multiple input lines and individual instructions may be
5461 1.1 skrll moved around in some cases. */
5462 1.1 skrll orig_insn.loc_directive_seen = dwarf2_loc_directive_seen;
5463 1.1 skrll dwarf2_where (&orig_insn.debug_line);
5464 1.1 skrll dwarf2_consume_line_info ();
5465 1.1 skrll
5466 1.1 skrll xg_add_branch_and_loop_targets (&orig_insn);
5467 1.1 skrll
5468 1.1 skrll /* Check that immediate value for ENTRY is >= 16. */
5469 1.1 skrll if (orig_insn.opcode == xtensa_entry_opcode && orig_insn.ntok >= 3)
5470 1.1 skrll {
5471 1.1 skrll expressionS *exp = &orig_insn.tok[2];
5472 1.1 skrll if (exp->X_op == O_constant && exp->X_add_number < 16)
5473 1.1 skrll as_warn (_("entry instruction with stack decrement < 16"));
5474 1.1 skrll }
5475 1.1 skrll
5476 1.1 skrll /* Finish it off:
5477 1.1 skrll assemble_tokens (opcode, tok, ntok);
5478 1.1 skrll expand the tokens from the orig_insn into the
5479 1.1 skrll stack of instructions that will not expand
5480 1.1 skrll unless required at relaxation time. */
5481 1.1 skrll
5482 1.1 skrll if (!cur_vinsn.inside_bundle)
5483 1.1 skrll emit_single_op (&orig_insn);
5484 1.1 skrll else /* We are inside a bundle. */
5485 1.1 skrll {
5486 1.1 skrll cur_vinsn.slots[cur_vinsn.num_slots] = orig_insn;
5487 1.1 skrll cur_vinsn.num_slots++;
5488 1.1 skrll if (*input_line_pointer == '}'
5489 1.1 skrll || *(input_line_pointer - 1) == '}'
5490 1.1 skrll || *(input_line_pointer - 2) == '}')
5491 1.1 skrll finish_vinsn (&cur_vinsn);
5492 1.1 skrll }
5493 1.1 skrll
5494 1.1 skrll /* We've just emitted a new instruction so clear the list of labels. */
5495 1.1 skrll xtensa_clear_insn_labels ();
5496 1.1 skrll }
5497 1.1 skrll
5498 1.1 skrll
5499 1.1 skrll /* HANDLE_ALIGN hook */
5500 1.1 skrll
5501 1.1 skrll /* For a .align directive, we mark the previous block with the alignment
5502 1.1 skrll information. This will be placed in the object file in the
5503 1.1 skrll property section corresponding to this section. */
5504 1.1 skrll
5505 1.1 skrll void
5506 1.1 skrll xtensa_handle_align (fragS *fragP)
5507 1.1 skrll {
5508 1.1 skrll if (linkrelax
5509 1.1 skrll && ! fragP->tc_frag_data.is_literal
5510 1.1 skrll && (fragP->fr_type == rs_align
5511 1.1 skrll || fragP->fr_type == rs_align_code)
5512 1.1 skrll && fragP->fr_address + fragP->fr_fix > 0
5513 1.1 skrll && fragP->fr_offset > 0
5514 1.1 skrll && now_seg != bss_section)
5515 1.1 skrll {
5516 1.1 skrll fragP->tc_frag_data.is_align = TRUE;
5517 1.1 skrll fragP->tc_frag_data.alignment = fragP->fr_offset;
5518 1.1 skrll }
5519 1.1 skrll
5520 1.1 skrll if (fragP->fr_type == rs_align_test)
5521 1.1 skrll {
5522 1.1 skrll int count;
5523 1.1 skrll count = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
5524 1.1 skrll if (count != 0)
5525 1.1 skrll as_bad_where (fragP->fr_file, fragP->fr_line,
5526 1.1 skrll _("unaligned entry instruction"));
5527 1.1 skrll }
5528 1.1 skrll
5529 1.1 skrll if (linkrelax && fragP->fr_type == rs_org)
5530 1.1 skrll fragP->fr_subtype = RELAX_ORG;
5531 1.1 skrll }
5532 1.1 skrll
5533 1.1 skrll
5534 1.1 skrll /* TC_FRAG_INIT hook */
5535 1.1 skrll
5536 1.1 skrll void
5537 1.1 skrll xtensa_frag_init (fragS *frag)
5538 1.1 skrll {
5539 1.1 skrll xtensa_set_frag_assembly_state (frag);
5540 1.1 skrll }
5541 1.1 skrll
5542 1.1 skrll
5543 1.1 skrll symbolS *
5544 1.1 skrll md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
5545 1.1 skrll {
5546 1.1 skrll return NULL;
5547 1.1 skrll }
5548 1.1 skrll
5549 1.1 skrll
5550 1.1 skrll /* Round up a section size to the appropriate boundary. */
5551 1.1 skrll
5552 1.1 skrll valueT
5553 1.1 skrll md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
5554 1.1 skrll {
5555 1.1 skrll return size; /* Byte alignment is fine. */
5556 1.1 skrll }
5557 1.1 skrll
5558 1.1 skrll
5559 1.1 skrll long
5560 1.1 skrll md_pcrel_from (fixS *fixP)
5561 1.1 skrll {
5562 1.1 skrll char *insn_p;
5563 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
5564 1.1 skrll static xtensa_insnbuf slotbuf = NULL;
5565 1.1 skrll int opnum;
5566 1.1 skrll uint32 opnd_value;
5567 1.1 skrll xtensa_opcode opcode;
5568 1.1 skrll xtensa_format fmt;
5569 1.1 skrll int slot;
5570 1.1 skrll xtensa_isa isa = xtensa_default_isa;
5571 1.1 skrll valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
5572 1.1 skrll bfd_boolean alt_reloc;
5573 1.1 skrll
5574 1.1 skrll if (fixP->fx_r_type == BFD_RELOC_XTENSA_ASM_EXPAND)
5575 1.1 skrll return 0;
5576 1.1 skrll
5577 1.1 skrll if (fixP->fx_r_type == BFD_RELOC_32_PCREL)
5578 1.1 skrll return addr;
5579 1.1 skrll
5580 1.1 skrll if (!insnbuf)
5581 1.1 skrll {
5582 1.1 skrll insnbuf = xtensa_insnbuf_alloc (isa);
5583 1.1 skrll slotbuf = xtensa_insnbuf_alloc (isa);
5584 1.1 skrll }
5585 1.1 skrll
5586 1.1 skrll insn_p = &fixP->fx_frag->fr_literal[fixP->fx_where];
5587 1.1 skrll xtensa_insnbuf_from_chars (isa, insnbuf, (unsigned char *) insn_p, 0);
5588 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
5589 1.1 skrll
5590 1.1 skrll if (fmt == XTENSA_UNDEFINED)
5591 1.1 skrll as_fatal (_("bad instruction format"));
5592 1.1 skrll
5593 1.1 skrll if (decode_reloc (fixP->fx_r_type, &slot, &alt_reloc) != 0)
5594 1.1 skrll as_fatal (_("invalid relocation"));
5595 1.1 skrll
5596 1.1 skrll xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
5597 1.1 skrll opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
5598 1.1 skrll
5599 1.1 skrll /* Check for "alternate" relocations (operand not specified). None
5600 1.1 skrll of the current uses for these are really PC-relative. */
5601 1.1 skrll if (alt_reloc || opcode == xtensa_const16_opcode)
5602 1.1 skrll {
5603 1.1 skrll if (opcode != xtensa_l32r_opcode
5604 1.1 skrll && opcode != xtensa_const16_opcode)
5605 1.1 skrll as_fatal (_("invalid relocation for '%s' instruction"),
5606 1.1 skrll xtensa_opcode_name (isa, opcode));
5607 1.1 skrll return 0;
5608 1.1 skrll }
5609 1.1 skrll
5610 1.1 skrll opnum = get_relaxable_immed (opcode);
5611 1.1 skrll opnd_value = 0;
5612 1.1 skrll if (xtensa_operand_is_PCrelative (isa, opcode, opnum) != 1
5613 1.1 skrll || xtensa_operand_do_reloc (isa, opcode, opnum, &opnd_value, addr))
5614 1.1 skrll {
5615 1.1 skrll as_bad_where (fixP->fx_file,
5616 1.1 skrll fixP->fx_line,
5617 1.1 skrll _("invalid relocation for operand %d of '%s'"),
5618 1.1 skrll opnum, xtensa_opcode_name (isa, opcode));
5619 1.1 skrll return 0;
5620 1.1 skrll }
5621 1.1 skrll return 0 - opnd_value;
5622 1.1 skrll }
5623 1.1 skrll
5624 1.1 skrll
5625 1.1 skrll /* TC_FORCE_RELOCATION hook */
5626 1.1 skrll
5627 1.1 skrll int
5628 1.1 skrll xtensa_force_relocation (fixS *fix)
5629 1.1 skrll {
5630 1.1 skrll switch (fix->fx_r_type)
5631 1.1 skrll {
5632 1.1 skrll case BFD_RELOC_XTENSA_ASM_EXPAND:
5633 1.1 skrll case BFD_RELOC_XTENSA_SLOT0_ALT:
5634 1.1 skrll case BFD_RELOC_XTENSA_SLOT1_ALT:
5635 1.1 skrll case BFD_RELOC_XTENSA_SLOT2_ALT:
5636 1.1 skrll case BFD_RELOC_XTENSA_SLOT3_ALT:
5637 1.1 skrll case BFD_RELOC_XTENSA_SLOT4_ALT:
5638 1.1 skrll case BFD_RELOC_XTENSA_SLOT5_ALT:
5639 1.1 skrll case BFD_RELOC_XTENSA_SLOT6_ALT:
5640 1.1 skrll case BFD_RELOC_XTENSA_SLOT7_ALT:
5641 1.1 skrll case BFD_RELOC_XTENSA_SLOT8_ALT:
5642 1.1 skrll case BFD_RELOC_XTENSA_SLOT9_ALT:
5643 1.1 skrll case BFD_RELOC_XTENSA_SLOT10_ALT:
5644 1.1 skrll case BFD_RELOC_XTENSA_SLOT11_ALT:
5645 1.1 skrll case BFD_RELOC_XTENSA_SLOT12_ALT:
5646 1.1 skrll case BFD_RELOC_XTENSA_SLOT13_ALT:
5647 1.1 skrll case BFD_RELOC_XTENSA_SLOT14_ALT:
5648 1.1 skrll return 1;
5649 1.1 skrll default:
5650 1.1 skrll break;
5651 1.1 skrll }
5652 1.1 skrll
5653 1.1 skrll if (linkrelax && fix->fx_addsy
5654 1.1 skrll && relaxable_section (S_GET_SEGMENT (fix->fx_addsy)))
5655 1.1 skrll return 1;
5656 1.1 skrll
5657 1.1 skrll return generic_force_reloc (fix);
5658 1.1 skrll }
5659 1.1 skrll
5660 1.1 skrll
5661 1.1 skrll /* TC_VALIDATE_FIX_SUB hook */
5662 1.1 skrll
5663 1.1 skrll int
5664 1.1 skrll xtensa_validate_fix_sub (fixS *fix)
5665 1.1 skrll {
5666 1.1 skrll segT add_symbol_segment, sub_symbol_segment;
5667 1.1 skrll
5668 1.1 skrll /* The difference of two symbols should be resolved by the assembler when
5669 1.1 skrll linkrelax is not set. If the linker may relax the section containing
5670 1.1 skrll the symbols, then an Xtensa DIFF relocation must be generated so that
5671 1.1 skrll the linker knows to adjust the difference value. */
5672 1.1 skrll if (!linkrelax || fix->fx_addsy == NULL)
5673 1.1 skrll return 0;
5674 1.1 skrll
5675 1.1 skrll /* Make sure both symbols are in the same segment, and that segment is
5676 1.1 skrll "normal" and relaxable. If the segment is not "normal", then the
5677 1.1 skrll fix is not valid. If the segment is not "relaxable", then the fix
5678 1.1 skrll should have been handled earlier. */
5679 1.1 skrll add_symbol_segment = S_GET_SEGMENT (fix->fx_addsy);
5680 1.1 skrll if (! SEG_NORMAL (add_symbol_segment) ||
5681 1.1 skrll ! relaxable_section (add_symbol_segment))
5682 1.1 skrll return 0;
5683 1.1 skrll sub_symbol_segment = S_GET_SEGMENT (fix->fx_subsy);
5684 1.1 skrll return (sub_symbol_segment == add_symbol_segment);
5685 1.1 skrll }
5686 1.1 skrll
5687 1.1 skrll
5688 1.1 skrll /* NO_PSEUDO_DOT hook */
5689 1.1 skrll
5690 1.1 skrll /* This function has nothing to do with pseudo dots, but this is the
5691 1.1 skrll nearest macro to where the check needs to take place. FIXME: This
5692 1.1 skrll seems wrong. */
5693 1.1 skrll
5694 1.1 skrll bfd_boolean
5695 1.1 skrll xtensa_check_inside_bundle (void)
5696 1.1 skrll {
5697 1.1 skrll if (cur_vinsn.inside_bundle && input_line_pointer[-1] == '.')
5698 1.1 skrll as_bad (_("directives are not valid inside bundles"));
5699 1.1 skrll
5700 1.1 skrll /* This function must always return FALSE because it is called via a
5701 1.1 skrll macro that has nothing to do with bundling. */
5702 1.1 skrll return FALSE;
5703 1.1 skrll }
5704 1.1 skrll
5705 1.1 skrll
5706 1.1 skrll /* md_elf_section_change_hook */
5707 1.1 skrll
5708 1.1 skrll void
5709 1.1 skrll xtensa_elf_section_change_hook (void)
5710 1.1 skrll {
5711 1.1 skrll /* Set up the assembly state. */
5712 1.1 skrll if (!frag_now->tc_frag_data.is_assembly_state_set)
5713 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
5714 1.1 skrll }
5715 1.1 skrll
5716 1.1 skrll
5717 1.1 skrll /* tc_fix_adjustable hook */
5718 1.1 skrll
5719 1.1 skrll bfd_boolean
5720 1.1 skrll xtensa_fix_adjustable (fixS *fixP)
5721 1.1 skrll {
5722 1.1 skrll /* An offset is not allowed in combination with the difference of two
5723 1.1 skrll symbols, but that cannot be easily detected after a local symbol
5724 1.1 skrll has been adjusted to a (section+offset) form. Return 0 so that such
5725 1.1 skrll an fix will not be adjusted. */
5726 1.1 skrll if (fixP->fx_subsy && fixP->fx_addsy && fixP->fx_offset
5727 1.1 skrll && relaxable_section (S_GET_SEGMENT (fixP->fx_subsy)))
5728 1.1 skrll return 0;
5729 1.1 skrll
5730 1.1 skrll /* We need the symbol name for the VTABLE entries. */
5731 1.1 skrll if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
5732 1.1 skrll || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
5733 1.1 skrll return 0;
5734 1.1 skrll
5735 1.1 skrll return 1;
5736 1.1 skrll }
5737 1.1 skrll
5738 1.1 skrll
5739 1.1 skrll /* tc_symbol_new_hook */
5740 1.1 skrll
5741 1.1 skrll symbolS *expr_symbols = NULL;
5742 1.1 skrll
5743 1.1 skrll void
5744 1.1 skrll xtensa_symbol_new_hook (symbolS *sym)
5745 1.1 skrll {
5746 1.1 skrll if (is_leb128_expr && S_GET_SEGMENT (sym) == expr_section)
5747 1.1 skrll {
5748 1.1 skrll symbol_get_tc (sym)->next_expr_symbol = expr_symbols;
5749 1.1 skrll expr_symbols = sym;
5750 1.1 skrll }
5751 1.1 skrll }
5752 1.1 skrll
5753 1.1 skrll
5754 1.1 skrll void
5755 1.1 skrll md_apply_fix (fixS *fixP, valueT *valP, segT seg)
5756 1.1 skrll {
5757 1.1 skrll char *const fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
5758 1.1 skrll valueT val = 0;
5759 1.1 skrll
5760 1.1 skrll /* Subtracted symbols are only allowed for a few relocation types, and
5761 1.1 skrll unless linkrelax is enabled, they should not make it to this point. */
5762 1.1 skrll if (fixP->fx_subsy && !(linkrelax && (fixP->fx_r_type == BFD_RELOC_32
5763 1.1 skrll || fixP->fx_r_type == BFD_RELOC_16
5764 1.1 skrll || fixP->fx_r_type == BFD_RELOC_8)))
5765 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
5766 1.1 skrll
5767 1.1 skrll switch (fixP->fx_r_type)
5768 1.1 skrll {
5769 1.1 skrll case BFD_RELOC_32_PCREL:
5770 1.1 skrll case BFD_RELOC_32:
5771 1.1 skrll case BFD_RELOC_16:
5772 1.1 skrll case BFD_RELOC_8:
5773 1.1 skrll if (fixP->fx_subsy)
5774 1.1 skrll {
5775 1.1 skrll switch (fixP->fx_r_type)
5776 1.1 skrll {
5777 1.1 skrll case BFD_RELOC_8:
5778 1.1 skrll fixP->fx_r_type = BFD_RELOC_XTENSA_DIFF8;
5779 1.1 skrll break;
5780 1.1 skrll case BFD_RELOC_16:
5781 1.1 skrll fixP->fx_r_type = BFD_RELOC_XTENSA_DIFF16;
5782 1.1 skrll break;
5783 1.1 skrll case BFD_RELOC_32:
5784 1.1 skrll fixP->fx_r_type = BFD_RELOC_XTENSA_DIFF32;
5785 1.1 skrll break;
5786 1.1 skrll default:
5787 1.1 skrll break;
5788 1.1 skrll }
5789 1.1 skrll
5790 1.1 skrll /* An offset is only allowed when it results from adjusting a
5791 1.1 skrll local symbol into a section-relative offset. If the offset
5792 1.1 skrll came from the original expression, tc_fix_adjustable will have
5793 1.1 skrll prevented the fix from being converted to a section-relative
5794 1.1 skrll form so that we can flag the error here. */
5795 1.1 skrll if (fixP->fx_offset != 0 && !symbol_section_p (fixP->fx_addsy))
5796 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line,
5797 1.1 skrll _("cannot represent subtraction with an offset"));
5798 1.1 skrll
5799 1.1 skrll val = (S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset
5800 1.1 skrll - S_GET_VALUE (fixP->fx_subsy));
5801 1.1 skrll
5802 1.1 skrll /* The difference value gets written out, and the DIFF reloc
5803 1.1 skrll identifies the address of the subtracted symbol (i.e., the one
5804 1.1 skrll with the lowest address). */
5805 1.1 skrll *valP = val;
5806 1.1 skrll fixP->fx_offset -= val;
5807 1.1 skrll fixP->fx_subsy = NULL;
5808 1.1 skrll }
5809 1.1 skrll else if (! fixP->fx_addsy)
5810 1.1 skrll {
5811 1.1 skrll val = *valP;
5812 1.1 skrll fixP->fx_done = 1;
5813 1.1 skrll }
5814 1.1 skrll /* fall through */
5815 1.1 skrll
5816 1.1 skrll case BFD_RELOC_XTENSA_PLT:
5817 1.1 skrll md_number_to_chars (fixpos, val, fixP->fx_size);
5818 1.1 skrll fixP->fx_no_overflow = 0; /* Use the standard overflow check. */
5819 1.1 skrll break;
5820 1.1 skrll
5821 1.1 skrll case BFD_RELOC_XTENSA_TLSDESC_FN:
5822 1.1 skrll case BFD_RELOC_XTENSA_TLSDESC_ARG:
5823 1.1 skrll case BFD_RELOC_XTENSA_TLS_TPOFF:
5824 1.1 skrll case BFD_RELOC_XTENSA_TLS_DTPOFF:
5825 1.1 skrll S_SET_THREAD_LOCAL (fixP->fx_addsy);
5826 1.1 skrll md_number_to_chars (fixpos, 0, fixP->fx_size);
5827 1.1 skrll fixP->fx_no_overflow = 0; /* Use the standard overflow check. */
5828 1.1 skrll break;
5829 1.1 skrll
5830 1.1 skrll case BFD_RELOC_XTENSA_SLOT0_OP:
5831 1.1 skrll case BFD_RELOC_XTENSA_SLOT1_OP:
5832 1.1 skrll case BFD_RELOC_XTENSA_SLOT2_OP:
5833 1.1 skrll case BFD_RELOC_XTENSA_SLOT3_OP:
5834 1.1 skrll case BFD_RELOC_XTENSA_SLOT4_OP:
5835 1.1 skrll case BFD_RELOC_XTENSA_SLOT5_OP:
5836 1.1 skrll case BFD_RELOC_XTENSA_SLOT6_OP:
5837 1.1 skrll case BFD_RELOC_XTENSA_SLOT7_OP:
5838 1.1 skrll case BFD_RELOC_XTENSA_SLOT8_OP:
5839 1.1 skrll case BFD_RELOC_XTENSA_SLOT9_OP:
5840 1.1 skrll case BFD_RELOC_XTENSA_SLOT10_OP:
5841 1.1 skrll case BFD_RELOC_XTENSA_SLOT11_OP:
5842 1.1 skrll case BFD_RELOC_XTENSA_SLOT12_OP:
5843 1.1 skrll case BFD_RELOC_XTENSA_SLOT13_OP:
5844 1.1 skrll case BFD_RELOC_XTENSA_SLOT14_OP:
5845 1.1 skrll if (linkrelax)
5846 1.1 skrll {
5847 1.1 skrll /* Write the tentative value of a PC-relative relocation to a
5848 1.1 skrll local symbol into the instruction. The value will be ignored
5849 1.1 skrll by the linker, and it makes the object file disassembly
5850 1.1 skrll readable when all branch targets are encoded in relocations. */
5851 1.1 skrll
5852 1.1 skrll assert (fixP->fx_addsy);
5853 1.1 skrll if (S_GET_SEGMENT (fixP->fx_addsy) == seg
5854 1.1 skrll && !S_FORCE_RELOC (fixP->fx_addsy, 1))
5855 1.1 skrll {
5856 1.1 skrll val = (S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset
5857 1.1 skrll - md_pcrel_from (fixP));
5858 1.1 skrll (void) xg_apply_fix_value (fixP, val);
5859 1.1 skrll }
5860 1.1 skrll }
5861 1.1 skrll else if (! fixP->fx_addsy)
5862 1.1 skrll {
5863 1.1 skrll val = *valP;
5864 1.1 skrll if (xg_apply_fix_value (fixP, val))
5865 1.1 skrll fixP->fx_done = 1;
5866 1.1 skrll }
5867 1.1 skrll break;
5868 1.1 skrll
5869 1.1 skrll case BFD_RELOC_XTENSA_ASM_EXPAND:
5870 1.1 skrll case BFD_RELOC_XTENSA_TLS_FUNC:
5871 1.1 skrll case BFD_RELOC_XTENSA_TLS_ARG:
5872 1.1 skrll case BFD_RELOC_XTENSA_TLS_CALL:
5873 1.1 skrll case BFD_RELOC_XTENSA_SLOT0_ALT:
5874 1.1 skrll case BFD_RELOC_XTENSA_SLOT1_ALT:
5875 1.1 skrll case BFD_RELOC_XTENSA_SLOT2_ALT:
5876 1.1 skrll case BFD_RELOC_XTENSA_SLOT3_ALT:
5877 1.1 skrll case BFD_RELOC_XTENSA_SLOT4_ALT:
5878 1.1 skrll case BFD_RELOC_XTENSA_SLOT5_ALT:
5879 1.1 skrll case BFD_RELOC_XTENSA_SLOT6_ALT:
5880 1.1 skrll case BFD_RELOC_XTENSA_SLOT7_ALT:
5881 1.1 skrll case BFD_RELOC_XTENSA_SLOT8_ALT:
5882 1.1 skrll case BFD_RELOC_XTENSA_SLOT9_ALT:
5883 1.1 skrll case BFD_RELOC_XTENSA_SLOT10_ALT:
5884 1.1 skrll case BFD_RELOC_XTENSA_SLOT11_ALT:
5885 1.1 skrll case BFD_RELOC_XTENSA_SLOT12_ALT:
5886 1.1 skrll case BFD_RELOC_XTENSA_SLOT13_ALT:
5887 1.1 skrll case BFD_RELOC_XTENSA_SLOT14_ALT:
5888 1.1 skrll /* These all need to be resolved at link-time. Do nothing now. */
5889 1.1 skrll break;
5890 1.1 skrll
5891 1.1 skrll case BFD_RELOC_VTABLE_INHERIT:
5892 1.1 skrll case BFD_RELOC_VTABLE_ENTRY:
5893 1.1 skrll fixP->fx_done = 0;
5894 1.1 skrll break;
5895 1.1 skrll
5896 1.1 skrll default:
5897 1.1 skrll as_bad (_("unhandled local relocation fix %s"),
5898 1.1 skrll bfd_get_reloc_code_name (fixP->fx_r_type));
5899 1.1 skrll }
5900 1.1 skrll }
5901 1.1 skrll
5902 1.1 skrll
5903 1.1 skrll char *
5904 1.1 skrll md_atof (int type, char *litP, int *sizeP)
5905 1.1 skrll {
5906 1.1 skrll return ieee_md_atof (type, litP, sizeP, target_big_endian);
5907 1.1 skrll }
5908 1.1 skrll
5909 1.1 skrll
5910 1.1 skrll int
5911 1.1 skrll md_estimate_size_before_relax (fragS *fragP, segT seg ATTRIBUTE_UNUSED)
5912 1.1 skrll {
5913 1.1 skrll return total_frag_text_expansion (fragP);
5914 1.1 skrll }
5915 1.1 skrll
5916 1.1 skrll
5917 1.1 skrll /* Translate internal representation of relocation info to BFD target
5918 1.1 skrll format. */
5919 1.1 skrll
5920 1.1 skrll arelent *
5921 1.1 skrll tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
5922 1.1 skrll {
5923 1.1 skrll arelent *reloc;
5924 1.1 skrll
5925 1.1 skrll reloc = (arelent *) xmalloc (sizeof (arelent));
5926 1.1 skrll reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
5927 1.1 skrll *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
5928 1.1 skrll reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
5929 1.1 skrll
5930 1.1 skrll /* Make sure none of our internal relocations make it this far.
5931 1.1 skrll They'd better have been fully resolved by this point. */
5932 1.1 skrll assert ((int) fixp->fx_r_type > 0);
5933 1.1 skrll
5934 1.1 skrll reloc->addend = fixp->fx_offset;
5935 1.1 skrll
5936 1.1 skrll reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
5937 1.1 skrll if (reloc->howto == NULL)
5938 1.1 skrll {
5939 1.1 skrll as_bad_where (fixp->fx_file, fixp->fx_line,
5940 1.1 skrll _("cannot represent `%s' relocation in object file"),
5941 1.1 skrll bfd_get_reloc_code_name (fixp->fx_r_type));
5942 1.1 skrll free (reloc->sym_ptr_ptr);
5943 1.1 skrll free (reloc);
5944 1.1 skrll return NULL;
5945 1.1 skrll }
5946 1.1 skrll
5947 1.1 skrll if (!fixp->fx_pcrel != !reloc->howto->pc_relative)
5948 1.1 skrll as_fatal (_("internal error; cannot generate `%s' relocation"),
5949 1.1 skrll bfd_get_reloc_code_name (fixp->fx_r_type));
5950 1.1 skrll
5951 1.1 skrll return reloc;
5952 1.1 skrll }
5953 1.1 skrll
5954 1.1 skrll
5955 1.1 skrll /* Checks for resource conflicts between instructions. */
5957 1.1 skrll
5958 1.1 skrll /* The func unit stuff could be implemented as bit-vectors rather
5959 1.1 skrll than the iterative approach here. If it ends up being too
5960 1.1 skrll slow, we will switch it. */
5961 1.1 skrll
5962 1.1 skrll resource_table *
5963 1.1 skrll new_resource_table (void *data,
5964 1.1 skrll int cycles,
5965 1.1 skrll int nu,
5966 1.1 skrll unit_num_copies_func uncf,
5967 1.1 skrll opcode_num_units_func onuf,
5968 1.1 skrll opcode_funcUnit_use_unit_func ouuf,
5969 1.1 skrll opcode_funcUnit_use_stage_func ousf)
5970 1.1 skrll {
5971 1.1 skrll int i;
5972 1.1 skrll resource_table *rt = (resource_table *) xmalloc (sizeof (resource_table));
5973 1.1 skrll rt->data = data;
5974 1.1 skrll rt->cycles = cycles;
5975 1.1 skrll rt->allocated_cycles = cycles;
5976 1.1 skrll rt->num_units = nu;
5977 1.1 skrll rt->unit_num_copies = uncf;
5978 1.1 skrll rt->opcode_num_units = onuf;
5979 1.1 skrll rt->opcode_unit_use = ouuf;
5980 1.1 skrll rt->opcode_unit_stage = ousf;
5981 1.1 skrll
5982 1.1 skrll rt->units = (unsigned char **) xcalloc (cycles, sizeof (unsigned char *));
5983 1.1 skrll for (i = 0; i < cycles; i++)
5984 1.1 skrll rt->units[i] = (unsigned char *) xcalloc (nu, sizeof (unsigned char));
5985 1.1 skrll
5986 1.1 skrll return rt;
5987 1.1 skrll }
5988 1.1 skrll
5989 1.1 skrll
5990 1.1 skrll void
5991 1.1 skrll clear_resource_table (resource_table *rt)
5992 1.1 skrll {
5993 1.1 skrll int i, j;
5994 1.1 skrll for (i = 0; i < rt->allocated_cycles; i++)
5995 1.1 skrll for (j = 0; j < rt->num_units; j++)
5996 1.1 skrll rt->units[i][j] = 0;
5997 1.1 skrll }
5998 1.1 skrll
5999 1.1 skrll
6000 1.1 skrll /* We never shrink it, just fake it into thinking so. */
6001 1.1 skrll
6002 1.1 skrll void
6003 1.1 skrll resize_resource_table (resource_table *rt, int cycles)
6004 1.1 skrll {
6005 1.1 skrll int i, old_cycles;
6006 1.1 skrll
6007 1.1 skrll rt->cycles = cycles;
6008 1.1 skrll if (cycles <= rt->allocated_cycles)
6009 1.1 skrll return;
6010 1.1 skrll
6011 1.1 skrll old_cycles = rt->allocated_cycles;
6012 1.1 skrll rt->allocated_cycles = cycles;
6013 1.1 skrll
6014 1.1 skrll rt->units = xrealloc (rt->units,
6015 1.1 skrll rt->allocated_cycles * sizeof (unsigned char *));
6016 1.1 skrll for (i = 0; i < old_cycles; i++)
6017 1.1 skrll rt->units[i] = xrealloc (rt->units[i],
6018 1.1 skrll rt->num_units * sizeof (unsigned char));
6019 1.1 skrll for (i = old_cycles; i < cycles; i++)
6020 1.1 skrll rt->units[i] = xcalloc (rt->num_units, sizeof (unsigned char));
6021 1.1 skrll }
6022 1.1 skrll
6023 1.1 skrll
6024 1.1 skrll bfd_boolean
6025 1.1 skrll resources_available (resource_table *rt, xtensa_opcode opcode, int cycle)
6026 1.1 skrll {
6027 1.1 skrll int i;
6028 1.1 skrll int uses = (rt->opcode_num_units) (rt->data, opcode);
6029 1.1 skrll
6030 1.1 skrll for (i = 0; i < uses; i++)
6031 1.1 skrll {
6032 1.1 skrll xtensa_funcUnit unit = (rt->opcode_unit_use) (rt->data, opcode, i);
6033 1.1 skrll int stage = (rt->opcode_unit_stage) (rt->data, opcode, i);
6034 1.1 skrll int copies_in_use = rt->units[stage + cycle][unit];
6035 1.1 skrll int copies = (rt->unit_num_copies) (rt->data, unit);
6036 1.1 skrll if (copies_in_use >= copies)
6037 1.1 skrll return FALSE;
6038 1.1 skrll }
6039 1.1 skrll return TRUE;
6040 1.1 skrll }
6041 1.1 skrll
6042 1.1 skrll
6043 1.1 skrll void
6044 1.1 skrll reserve_resources (resource_table *rt, xtensa_opcode opcode, int cycle)
6045 1.1 skrll {
6046 1.1 skrll int i;
6047 1.1 skrll int uses = (rt->opcode_num_units) (rt->data, opcode);
6048 1.1 skrll
6049 1.1 skrll for (i = 0; i < uses; i++)
6050 1.1 skrll {
6051 1.1 skrll xtensa_funcUnit unit = (rt->opcode_unit_use) (rt->data, opcode, i);
6052 1.1 skrll int stage = (rt->opcode_unit_stage) (rt->data, opcode, i);
6053 1.1 skrll /* Note that this allows resources to be oversubscribed. That's
6054 1.1 skrll essential to the way the optional scheduler works.
6055 1.1 skrll resources_available reports when a resource is over-subscribed,
6056 1.1 skrll so it's easy to tell. */
6057 1.1 skrll rt->units[stage + cycle][unit]++;
6058 1.1 skrll }
6059 1.1 skrll }
6060 1.1 skrll
6061 1.1 skrll
6062 1.1 skrll void
6063 1.1 skrll release_resources (resource_table *rt, xtensa_opcode opcode, int cycle)
6064 1.1 skrll {
6065 1.1 skrll int i;
6066 1.1 skrll int uses = (rt->opcode_num_units) (rt->data, opcode);
6067 1.1 skrll
6068 1.1 skrll for (i = 0; i < uses; i++)
6069 1.1 skrll {
6070 1.1 skrll xtensa_funcUnit unit = (rt->opcode_unit_use) (rt->data, opcode, i);
6071 1.1 skrll int stage = (rt->opcode_unit_stage) (rt->data, opcode, i);
6072 1.1 skrll assert (rt->units[stage + cycle][unit] > 0);
6073 1.1 skrll rt->units[stage + cycle][unit]--;
6074 1.1 skrll }
6075 1.1 skrll }
6076 1.1 skrll
6077 1.1 skrll
6078 1.1 skrll /* Wrapper functions make parameterized resource reservation
6079 1.1 skrll more convenient. */
6080 1.1 skrll
6081 1.1 skrll int
6082 1.1 skrll opcode_funcUnit_use_unit (void *data, xtensa_opcode opcode, int idx)
6083 1.1 skrll {
6084 1.1 skrll xtensa_funcUnit_use *use = xtensa_opcode_funcUnit_use (data, opcode, idx);
6085 1.1 skrll return use->unit;
6086 1.1 skrll }
6087 1.1 skrll
6088 1.1 skrll
6089 1.1 skrll int
6090 1.1 skrll opcode_funcUnit_use_stage (void *data, xtensa_opcode opcode, int idx)
6091 1.1 skrll {
6092 1.1 skrll xtensa_funcUnit_use *use = xtensa_opcode_funcUnit_use (data, opcode, idx);
6093 1.1 skrll return use->stage;
6094 1.1 skrll }
6095 1.1 skrll
6096 1.1 skrll
6097 1.1 skrll /* Note that this function does not check issue constraints, but
6098 1.1 skrll solely whether the hardware is available to execute the given
6099 1.1 skrll instructions together. It also doesn't check if the tinsns
6100 1.1 skrll write the same state, or access the same tieports. That is
6101 1.1 skrll checked by check_t1_t2_reads_and_writes. */
6102 1.1 skrll
6103 1.1 skrll static bfd_boolean
6104 1.1 skrll resources_conflict (vliw_insn *vinsn)
6105 1.1 skrll {
6106 1.1 skrll int i;
6107 1.1 skrll static resource_table *rt = NULL;
6108 1.1 skrll
6109 1.1 skrll /* This is the most common case by far. Optimize it. */
6110 1.1 skrll if (vinsn->num_slots == 1)
6111 1.1 skrll return FALSE;
6112 1.1 skrll
6113 1.1 skrll if (rt == NULL)
6114 1.1 skrll {
6115 1.1 skrll xtensa_isa isa = xtensa_default_isa;
6116 1.1 skrll rt = new_resource_table
6117 1.1 skrll (isa, xtensa_num_pipe_stages,
6118 1.1 skrll xtensa_isa_num_funcUnits (isa),
6119 1.1 skrll (unit_num_copies_func) xtensa_funcUnit_num_copies,
6120 1.1 skrll (opcode_num_units_func) xtensa_opcode_num_funcUnit_uses,
6121 1.1 skrll opcode_funcUnit_use_unit,
6122 1.1 skrll opcode_funcUnit_use_stage);
6123 1.1 skrll }
6124 1.1 skrll
6125 1.1 skrll clear_resource_table (rt);
6126 1.1 skrll
6127 1.1 skrll for (i = 0; i < vinsn->num_slots; i++)
6128 1.1 skrll {
6129 1.1 skrll if (!resources_available (rt, vinsn->slots[i].opcode, 0))
6130 1.1 skrll return TRUE;
6131 1.1 skrll reserve_resources (rt, vinsn->slots[i].opcode, 0);
6132 1.1 skrll }
6133 1.1 skrll
6134 1.1 skrll return FALSE;
6135 1.1 skrll }
6136 1.1 skrll
6137 1.1 skrll
6138 1.1 skrll /* finish_vinsn, emit_single_op and helper functions. */
6140 1.1 skrll
6141 1.1 skrll static bfd_boolean find_vinsn_conflicts (vliw_insn *);
6142 1.1 skrll static xtensa_format xg_find_narrowest_format (vliw_insn *);
6143 1.1 skrll static void xg_assemble_vliw_tokens (vliw_insn *);
6144 1.1 skrll
6145 1.1 skrll
6146 1.1 skrll /* We have reached the end of a bundle; emit into the frag. */
6147 1.1 skrll
6148 1.1 skrll static void
6149 1.1 skrll finish_vinsn (vliw_insn *vinsn)
6150 1.1 skrll {
6151 1.1 skrll IStack slotstack;
6152 1.1 skrll int i;
6153 1.1 skrll char *file_name;
6154 1.1 skrll unsigned line;
6155 1.1 skrll
6156 1.1 skrll if (find_vinsn_conflicts (vinsn))
6157 1.1 skrll {
6158 1.1 skrll xg_clear_vinsn (vinsn);
6159 1.1 skrll return;
6160 1.1 skrll }
6161 1.1 skrll
6162 1.1 skrll /* First, find a format that works. */
6163 1.1 skrll if (vinsn->format == XTENSA_UNDEFINED)
6164 1.1 skrll vinsn->format = xg_find_narrowest_format (vinsn);
6165 1.1 skrll
6166 1.1 skrll if (vinsn->format == XTENSA_UNDEFINED)
6167 1.1 skrll {
6168 1.1 skrll as_where (&file_name, &line);
6169 1.1 skrll as_bad_where (file_name, line,
6170 1.1 skrll _("couldn't find a valid instruction format"));
6171 1.1 skrll fprintf (stderr, _(" ops were: "));
6172 1.1 skrll for (i = 0; i < vinsn->num_slots; i++)
6173 1.1 skrll fprintf (stderr, _(" %s;"),
6174 1.1 skrll xtensa_opcode_name (xtensa_default_isa,
6175 1.1 skrll vinsn->slots[i].opcode));
6176 1.1 skrll fprintf (stderr, _("\n"));
6177 1.1 skrll xg_clear_vinsn (vinsn);
6178 1.1 skrll return;
6179 1.1 skrll }
6180 1.1 skrll
6181 1.1 skrll if (vinsn->num_slots
6182 1.1 skrll != xtensa_format_num_slots (xtensa_default_isa, vinsn->format))
6183 1.1 skrll {
6184 1.1 skrll as_bad (_("format '%s' allows %d slots, but there are %d opcodes"),
6185 1.1 skrll xtensa_format_name (xtensa_default_isa, vinsn->format),
6186 1.1 skrll xtensa_format_num_slots (xtensa_default_isa, vinsn->format),
6187 1.1 skrll vinsn->num_slots);
6188 1.1 skrll xg_clear_vinsn (vinsn);
6189 1.1 skrll return;
6190 1.1 skrll }
6191 1.1 skrll
6192 1.1 skrll if (resources_conflict (vinsn))
6193 1.1 skrll {
6194 1.1 skrll as_where (&file_name, &line);
6195 1.1 skrll as_bad_where (file_name, line, _("illegal resource usage in bundle"));
6196 1.1 skrll fprintf (stderr, " ops were: ");
6197 1.1 skrll for (i = 0; i < vinsn->num_slots; i++)
6198 1.1 skrll fprintf (stderr, " %s;",
6199 1.1 skrll xtensa_opcode_name (xtensa_default_isa,
6200 1.1 skrll vinsn->slots[i].opcode));
6201 1.1 skrll fprintf (stderr, "\n");
6202 1.1 skrll xg_clear_vinsn (vinsn);
6203 1.1 skrll return;
6204 1.1 skrll }
6205 1.1 skrll
6206 1.1 skrll for (i = 0; i < vinsn->num_slots; i++)
6207 1.1 skrll {
6208 1.1 skrll if (vinsn->slots[i].opcode != XTENSA_UNDEFINED)
6209 1.1 skrll {
6210 1.1 skrll symbolS *lit_sym = NULL;
6211 1.1 skrll int j;
6212 1.1 skrll bfd_boolean e = FALSE;
6213 1.1 skrll bfd_boolean saved_density = density_supported;
6214 1.1 skrll
6215 1.1 skrll /* We don't want to narrow ops inside multi-slot bundles. */
6216 1.1 skrll if (vinsn->num_slots > 1)
6217 1.1 skrll density_supported = FALSE;
6218 1.1 skrll
6219 1.1 skrll istack_init (&slotstack);
6220 1.1 skrll if (vinsn->slots[i].opcode == xtensa_nop_opcode)
6221 1.1 skrll {
6222 1.1 skrll vinsn->slots[i].opcode =
6223 1.1 skrll xtensa_format_slot_nop_opcode (xtensa_default_isa,
6224 1.1 skrll vinsn->format, i);
6225 1.1 skrll vinsn->slots[i].ntok = 0;
6226 1.1 skrll }
6227 1.1 skrll
6228 1.1 skrll if (xg_expand_assembly_insn (&slotstack, &vinsn->slots[i]))
6229 1.1 skrll {
6230 1.1 skrll e = TRUE;
6231 1.1 skrll continue;
6232 1.1 skrll }
6233 1.1 skrll
6234 1.1 skrll density_supported = saved_density;
6235 1.1 skrll
6236 1.1 skrll if (e)
6237 1.1 skrll {
6238 1.1 skrll xg_clear_vinsn (vinsn);
6239 1.1 skrll return;
6240 1.1 skrll }
6241 1.1 skrll
6242 1.1 skrll for (j = 0; j < slotstack.ninsn; j++)
6243 1.1 skrll {
6244 1.1 skrll TInsn *insn = &slotstack.insn[j];
6245 1.1 skrll if (insn->insn_type == ITYPE_LITERAL)
6246 1.1 skrll {
6247 1.1 skrll assert (lit_sym == NULL);
6248 1.1 skrll lit_sym = xg_assemble_literal (insn);
6249 1.1 skrll }
6250 1.1 skrll else
6251 1.1 skrll {
6252 1.1 skrll assert (insn->insn_type == ITYPE_INSN);
6253 1.1 skrll if (lit_sym)
6254 1.1 skrll xg_resolve_literals (insn, lit_sym);
6255 1.1 skrll if (j != slotstack.ninsn - 1)
6256 1.1 skrll emit_single_op (insn);
6257 1.1 skrll }
6258 1.1 skrll }
6259 1.1 skrll
6260 1.1 skrll if (vinsn->num_slots > 1)
6261 1.1 skrll {
6262 1.1 skrll if (opcode_fits_format_slot
6263 1.1 skrll (slotstack.insn[slotstack.ninsn - 1].opcode,
6264 1.1 skrll vinsn->format, i))
6265 1.1 skrll {
6266 1.1 skrll vinsn->slots[i] = slotstack.insn[slotstack.ninsn - 1];
6267 1.1 skrll }
6268 1.1 skrll else
6269 1.1 skrll {
6270 1.1 skrll emit_single_op (&slotstack.insn[slotstack.ninsn - 1]);
6271 1.1 skrll if (vinsn->format == XTENSA_UNDEFINED)
6272 1.1 skrll vinsn->slots[i].opcode = xtensa_nop_opcode;
6273 1.1 skrll else
6274 1.1 skrll vinsn->slots[i].opcode
6275 1.1 skrll = xtensa_format_slot_nop_opcode (xtensa_default_isa,
6276 1.1 skrll vinsn->format, i);
6277 1.1 skrll
6278 1.1 skrll vinsn->slots[i].ntok = 0;
6279 1.1 skrll }
6280 1.1 skrll }
6281 1.1 skrll else
6282 1.1 skrll {
6283 1.1 skrll vinsn->slots[0] = slotstack.insn[slotstack.ninsn - 1];
6284 1.1 skrll vinsn->format = XTENSA_UNDEFINED;
6285 1.1 skrll }
6286 1.1 skrll }
6287 1.1 skrll }
6288 1.1 skrll
6289 1.1 skrll /* Now check resource conflicts on the modified bundle. */
6290 1.1 skrll if (resources_conflict (vinsn))
6291 1.1 skrll {
6292 1.1 skrll as_where (&file_name, &line);
6293 1.1 skrll as_bad_where (file_name, line, _("illegal resource usage in bundle"));
6294 1.1 skrll fprintf (stderr, " ops were: ");
6295 1.1 skrll for (i = 0; i < vinsn->num_slots; i++)
6296 1.1 skrll fprintf (stderr, " %s;",
6297 1.1 skrll xtensa_opcode_name (xtensa_default_isa,
6298 1.1 skrll vinsn->slots[i].opcode));
6299 1.1 skrll fprintf (stderr, "\n");
6300 1.1 skrll xg_clear_vinsn (vinsn);
6301 1.1 skrll return;
6302 1.1 skrll }
6303 1.1 skrll
6304 1.1 skrll /* First, find a format that works. */
6305 1.1 skrll if (vinsn->format == XTENSA_UNDEFINED)
6306 1.1 skrll vinsn->format = xg_find_narrowest_format (vinsn);
6307 1.1 skrll
6308 1.1 skrll xg_assemble_vliw_tokens (vinsn);
6309 1.1 skrll
6310 1.1 skrll xg_clear_vinsn (vinsn);
6311 1.1 skrll }
6312 1.1 skrll
6313 1.1 skrll
6314 1.1 skrll /* Given an vliw instruction, what conflicts are there in register
6315 1.1 skrll usage and in writes to states and queues?
6316 1.1 skrll
6317 1.1 skrll This function does two things:
6318 1.1 skrll 1. Reports an error when a vinsn contains illegal combinations
6319 1.1 skrll of writes to registers states or queues.
6320 1.1 skrll 2. Marks individual tinsns as not relaxable if the combination
6321 1.1 skrll contains antidependencies.
6322 1.1 skrll
6323 1.1 skrll Job 2 handles things like swap semantics in instructions that need
6324 1.1 skrll to be relaxed. For example,
6325 1.1 skrll
6326 1.1 skrll addi a0, a1, 100000
6327 1.1 skrll
6328 1.1 skrll normally would be relaxed to
6329 1.1 skrll
6330 1.1 skrll l32r a0, some_label
6331 1.1 skrll add a0, a1, a0
6332 1.1 skrll
6333 1.1 skrll _but_, if the above instruction is bundled with an a0 reader, e.g.,
6334 1.1 skrll
6335 1.1 skrll { addi a0, a1, 10000 ; add a2, a0, a4 ; }
6336 1.1 skrll
6337 1.1 skrll then we can't relax it into
6338 1.1 skrll
6339 1.1 skrll l32r a0, some_label
6340 1.1 skrll { add a0, a1, a0 ; add a2, a0, a4 ; }
6341 1.1 skrll
6342 1.1 skrll because the value of a0 is trashed before the second add can read it. */
6343 1.1 skrll
6344 1.1 skrll static char check_t1_t2_reads_and_writes (TInsn *, TInsn *);
6345 1.1 skrll
6346 1.1 skrll static bfd_boolean
6347 1.1 skrll find_vinsn_conflicts (vliw_insn *vinsn)
6348 1.1 skrll {
6349 1.1 skrll int i, j;
6350 1.1 skrll int branches = 0;
6351 1.1 skrll xtensa_isa isa = xtensa_default_isa;
6352 1.1 skrll
6353 1.1 skrll assert (!past_xtensa_end);
6354 1.1 skrll
6355 1.1 skrll for (i = 0 ; i < vinsn->num_slots; i++)
6356 1.1 skrll {
6357 1.1 skrll TInsn *op1 = &vinsn->slots[i];
6358 1.1 skrll if (op1->is_specific_opcode)
6359 1.1 skrll op1->keep_wide = TRUE;
6360 1.1 skrll else
6361 1.1 skrll op1->keep_wide = FALSE;
6362 1.1 skrll }
6363 1.1 skrll
6364 1.1 skrll for (i = 0 ; i < vinsn->num_slots; i++)
6365 1.1 skrll {
6366 1.1 skrll TInsn *op1 = &vinsn->slots[i];
6367 1.1 skrll
6368 1.1 skrll if (xtensa_opcode_is_branch (isa, op1->opcode) == 1)
6369 1.1 skrll branches++;
6370 1.1 skrll
6371 1.1 skrll for (j = 0; j < vinsn->num_slots; j++)
6372 1.1 skrll {
6373 1.1 skrll if (i != j)
6374 1.1 skrll {
6375 1.1 skrll TInsn *op2 = &vinsn->slots[j];
6376 1.1 skrll char conflict_type = check_t1_t2_reads_and_writes (op1, op2);
6377 1.1 skrll switch (conflict_type)
6378 1.1 skrll {
6379 1.1 skrll case 'c':
6380 1.1 skrll as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) write the same register"),
6381 1.1 skrll xtensa_opcode_name (isa, op1->opcode), i,
6382 1.1 skrll xtensa_opcode_name (isa, op2->opcode), j);
6383 1.1 skrll return TRUE;
6384 1.1 skrll case 'd':
6385 1.1 skrll as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) write the same state"),
6386 1.1 skrll xtensa_opcode_name (isa, op1->opcode), i,
6387 1.1 skrll xtensa_opcode_name (isa, op2->opcode), j);
6388 1.1 skrll return TRUE;
6389 1.1 skrll case 'e':
6390 1.1 skrll as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) write the same port"),
6391 1.1 skrll xtensa_opcode_name (isa, op1->opcode), i,
6392 1.1 skrll xtensa_opcode_name (isa, op2->opcode), j);
6393 1.1 skrll return TRUE;
6394 1.1 skrll case 'f':
6395 1.1 skrll as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) both have volatile port accesses"),
6396 1.1 skrll xtensa_opcode_name (isa, op1->opcode), i,
6397 1.1 skrll xtensa_opcode_name (isa, op2->opcode), j);
6398 1.1 skrll return TRUE;
6399 1.1 skrll default:
6400 1.1 skrll /* Everything is OK. */
6401 1.1 skrll break;
6402 1.1 skrll }
6403 1.1 skrll op2->is_specific_opcode = (op2->is_specific_opcode
6404 1.1 skrll || conflict_type == 'a');
6405 1.1 skrll }
6406 1.1 skrll }
6407 1.1 skrll }
6408 1.1 skrll
6409 1.1 skrll if (branches > 1)
6410 1.1 skrll {
6411 1.1 skrll as_bad (_("multiple branches or jumps in the same bundle"));
6412 1.1 skrll return TRUE;
6413 1.1 skrll }
6414 1.1 skrll
6415 1.1 skrll return FALSE;
6416 1.1 skrll }
6417 1.1 skrll
6418 1.1 skrll
6419 1.1 skrll /* Check how the state used by t1 and t2 relate.
6420 1.1 skrll Cases found are:
6421 1.1 skrll
6422 1.1 skrll case A: t1 reads a register t2 writes (an antidependency within a bundle)
6423 1.1 skrll case B: no relationship between what is read and written (both could
6424 1.1 skrll read the same reg though)
6425 1.1 skrll case C: t1 writes a register t2 writes (a register conflict within a
6426 1.1 skrll bundle)
6427 1.1 skrll case D: t1 writes a state that t2 also writes
6428 1.1 skrll case E: t1 writes a tie queue that t2 also writes
6429 1.1 skrll case F: two volatile queue accesses
6430 1.1 skrll */
6431 1.1 skrll
6432 1.1 skrll static char
6433 1.1 skrll check_t1_t2_reads_and_writes (TInsn *t1, TInsn *t2)
6434 1.1 skrll {
6435 1.1 skrll xtensa_isa isa = xtensa_default_isa;
6436 1.1 skrll xtensa_regfile t1_regfile, t2_regfile;
6437 1.1 skrll int t1_reg, t2_reg;
6438 1.1 skrll int t1_base_reg, t1_last_reg;
6439 1.1 skrll int t2_base_reg, t2_last_reg;
6440 1.1 skrll char t1_inout, t2_inout;
6441 1.1 skrll int i, j;
6442 1.1 skrll char conflict = 'b';
6443 1.1 skrll int t1_states;
6444 1.1 skrll int t2_states;
6445 1.1 skrll int t1_interfaces;
6446 1.1 skrll int t2_interfaces;
6447 1.1 skrll bfd_boolean t1_volatile = FALSE;
6448 1.1 skrll bfd_boolean t2_volatile = FALSE;
6449 1.1 skrll
6450 1.1 skrll /* Check registers. */
6451 1.1 skrll for (j = 0; j < t2->ntok; j++)
6452 1.1 skrll {
6453 1.1 skrll if (xtensa_operand_is_register (isa, t2->opcode, j) != 1)
6454 1.1 skrll continue;
6455 1.1 skrll
6456 1.1 skrll t2_regfile = xtensa_operand_regfile (isa, t2->opcode, j);
6457 1.1 skrll t2_base_reg = t2->tok[j].X_add_number;
6458 1.1 skrll t2_last_reg = t2_base_reg + xtensa_operand_num_regs (isa, t2->opcode, j);
6459 1.1 skrll
6460 1.1 skrll for (i = 0; i < t1->ntok; i++)
6461 1.1 skrll {
6462 1.1 skrll if (xtensa_operand_is_register (isa, t1->opcode, i) != 1)
6463 1.1 skrll continue;
6464 1.1 skrll
6465 1.1 skrll t1_regfile = xtensa_operand_regfile (isa, t1->opcode, i);
6466 1.1 skrll
6467 1.1 skrll if (t1_regfile != t2_regfile)
6468 1.1 skrll continue;
6469 1.1 skrll
6470 1.1 skrll t1_inout = xtensa_operand_inout (isa, t1->opcode, i);
6471 1.1 skrll t2_inout = xtensa_operand_inout (isa, t2->opcode, j);
6472 1.1 skrll
6473 1.1 skrll if (xtensa_operand_is_known_reg (isa, t1->opcode, i) == 0
6474 1.1 skrll || xtensa_operand_is_known_reg (isa, t2->opcode, j) == 0)
6475 1.1 skrll {
6476 1.1 skrll if (t1_inout == 'm' || t1_inout == 'o'
6477 1.1 skrll || t2_inout == 'm' || t2_inout == 'o')
6478 1.1 skrll {
6479 1.1 skrll conflict = 'a';
6480 1.1 skrll continue;
6481 1.1 skrll }
6482 1.1 skrll }
6483 1.1 skrll
6484 1.1 skrll t1_base_reg = t1->tok[i].X_add_number;
6485 1.1 skrll t1_last_reg = (t1_base_reg
6486 1.1 skrll + xtensa_operand_num_regs (isa, t1->opcode, i));
6487 1.1 skrll
6488 1.1 skrll for (t1_reg = t1_base_reg; t1_reg < t1_last_reg; t1_reg++)
6489 1.1 skrll {
6490 1.1 skrll for (t2_reg = t2_base_reg; t2_reg < t2_last_reg; t2_reg++)
6491 1.1 skrll {
6492 1.1 skrll if (t1_reg != t2_reg)
6493 1.1 skrll continue;
6494 1.1 skrll
6495 1.1 skrll if (t2_inout == 'i' && (t1_inout == 'm' || t1_inout == 'o'))
6496 1.1 skrll {
6497 1.1 skrll conflict = 'a';
6498 1.1 skrll continue;
6499 1.1 skrll }
6500 1.1 skrll
6501 1.1 skrll if (t1_inout == 'i' && (t2_inout == 'm' || t2_inout == 'o'))
6502 1.1 skrll {
6503 1.1 skrll conflict = 'a';
6504 1.1 skrll continue;
6505 1.1 skrll }
6506 1.1 skrll
6507 1.1 skrll if (t1_inout != 'i' && t2_inout != 'i')
6508 1.1 skrll return 'c';
6509 1.1 skrll }
6510 1.1 skrll }
6511 1.1 skrll }
6512 1.1 skrll }
6513 1.1 skrll
6514 1.1 skrll /* Check states. */
6515 1.1 skrll t1_states = xtensa_opcode_num_stateOperands (isa, t1->opcode);
6516 1.1 skrll t2_states = xtensa_opcode_num_stateOperands (isa, t2->opcode);
6517 1.1 skrll for (j = 0; j < t2_states; j++)
6518 1.1 skrll {
6519 1.1 skrll xtensa_state t2_so = xtensa_stateOperand_state (isa, t2->opcode, j);
6520 1.1 skrll t2_inout = xtensa_stateOperand_inout (isa, t2->opcode, j);
6521 1.1 skrll for (i = 0; i < t1_states; i++)
6522 1.1 skrll {
6523 1.1 skrll xtensa_state t1_so = xtensa_stateOperand_state (isa, t1->opcode, i);
6524 1.1 skrll t1_inout = xtensa_stateOperand_inout (isa, t1->opcode, i);
6525 1.1 skrll if (t1_so != t2_so)
6526 1.1 skrll continue;
6527 1.1 skrll
6528 1.1 skrll if (t2_inout == 'i' && (t1_inout == 'm' || t1_inout == 'o'))
6529 1.1 skrll {
6530 1.1 skrll conflict = 'a';
6531 1.1 skrll continue;
6532 1.1 skrll }
6533 1.1 skrll
6534 1.1 skrll if (t1_inout == 'i' && (t2_inout == 'm' || t2_inout == 'o'))
6535 1.1 skrll {
6536 1.1 skrll conflict = 'a';
6537 1.1 skrll continue;
6538 1.1 skrll }
6539 1.1 skrll
6540 1.1 skrll if (t1_inout != 'i' && t2_inout != 'i')
6541 1.1 skrll return 'd';
6542 1.1 skrll }
6543 1.1 skrll }
6544 1.1 skrll
6545 1.1 skrll /* Check tieports. */
6546 1.1 skrll t1_interfaces = xtensa_opcode_num_interfaceOperands (isa, t1->opcode);
6547 1.1 skrll t2_interfaces = xtensa_opcode_num_interfaceOperands (isa, t2->opcode);
6548 1.1 skrll for (j = 0; j < t2_interfaces; j++)
6549 1.1 skrll {
6550 1.1 skrll xtensa_interface t2_int
6551 1.1 skrll = xtensa_interfaceOperand_interface (isa, t2->opcode, j);
6552 1.1 skrll int t2_class = xtensa_interface_class_id (isa, t2_int);
6553 1.1 skrll
6554 1.1 skrll t2_inout = xtensa_interface_inout (isa, t2_int);
6555 1.1 skrll if (xtensa_interface_has_side_effect (isa, t2_int) == 1)
6556 1.1 skrll t2_volatile = TRUE;
6557 1.1 skrll
6558 1.1 skrll for (i = 0; i < t1_interfaces; i++)
6559 1.1 skrll {
6560 1.1 skrll xtensa_interface t1_int
6561 1.1 skrll = xtensa_interfaceOperand_interface (isa, t1->opcode, j);
6562 1.1 skrll int t1_class = xtensa_interface_class_id (isa, t1_int);
6563 1.1 skrll
6564 1.1 skrll t1_inout = xtensa_interface_inout (isa, t1_int);
6565 1.1 skrll if (xtensa_interface_has_side_effect (isa, t1_int) == 1)
6566 1.1 skrll t1_volatile = TRUE;
6567 1.1 skrll
6568 1.1 skrll if (t1_volatile && t2_volatile && (t1_class == t2_class))
6569 1.1 skrll return 'f';
6570 1.1 skrll
6571 1.1 skrll if (t1_int != t2_int)
6572 1.1 skrll continue;
6573 1.1 skrll
6574 1.1 skrll if (t2_inout == 'i' && t1_inout == 'o')
6575 1.1 skrll {
6576 1.1 skrll conflict = 'a';
6577 1.1 skrll continue;
6578 1.1 skrll }
6579 1.1 skrll
6580 1.1 skrll if (t1_inout == 'i' && t2_inout == 'o')
6581 1.1 skrll {
6582 1.1 skrll conflict = 'a';
6583 1.1 skrll continue;
6584 1.1 skrll }
6585 1.1 skrll
6586 1.1 skrll if (t1_inout != 'i' && t2_inout != 'i')
6587 1.1 skrll return 'e';
6588 1.1 skrll }
6589 1.1 skrll }
6590 1.1 skrll
6591 1.1 skrll return conflict;
6592 1.1 skrll }
6593 1.1 skrll
6594 1.1 skrll
6595 1.1 skrll static xtensa_format
6596 1.1 skrll xg_find_narrowest_format (vliw_insn *vinsn)
6597 1.1 skrll {
6598 1.1 skrll /* Right now we assume that the ops within the vinsn are properly
6599 1.1 skrll ordered for the slots that the programmer wanted them in. In
6600 1.1 skrll other words, we don't rearrange the ops in hopes of finding a
6601 1.1 skrll better format. The scheduler handles that. */
6602 1.1 skrll
6603 1.1 skrll xtensa_isa isa = xtensa_default_isa;
6604 1.1 skrll xtensa_format format;
6605 1.1 skrll vliw_insn v_copy = *vinsn;
6606 1.1 skrll xtensa_opcode nop_opcode = xtensa_nop_opcode;
6607 1.1 skrll
6608 1.1 skrll if (vinsn->num_slots == 1)
6609 1.1 skrll return xg_get_single_format (vinsn->slots[0].opcode);
6610 1.1 skrll
6611 1.1 skrll for (format = 0; format < xtensa_isa_num_formats (isa); format++)
6612 1.1 skrll {
6613 1.1 skrll v_copy = *vinsn;
6614 1.1 skrll if (xtensa_format_num_slots (isa, format) == v_copy.num_slots)
6615 1.1 skrll {
6616 1.1 skrll int slot;
6617 1.1 skrll int fit = 0;
6618 1.1 skrll for (slot = 0; slot < v_copy.num_slots; slot++)
6619 1.1 skrll {
6620 1.1 skrll if (v_copy.slots[slot].opcode == nop_opcode)
6621 1.1 skrll {
6622 1.1 skrll v_copy.slots[slot].opcode =
6623 1.1 skrll xtensa_format_slot_nop_opcode (isa, format, slot);
6624 1.1 skrll v_copy.slots[slot].ntok = 0;
6625 1.1 skrll }
6626 1.1 skrll
6627 1.1 skrll if (opcode_fits_format_slot (v_copy.slots[slot].opcode,
6628 1.1 skrll format, slot))
6629 1.1 skrll fit++;
6630 1.1 skrll else if (v_copy.num_slots > 1)
6631 1.1 skrll {
6632 1.1 skrll TInsn widened;
6633 1.1 skrll /* Try the widened version. */
6634 1.1 skrll if (!v_copy.slots[slot].keep_wide
6635 1.1 skrll && !v_copy.slots[slot].is_specific_opcode
6636 1.1 skrll && xg_is_single_relaxable_insn (&v_copy.slots[slot],
6637 1.1 skrll &widened, TRUE)
6638 1.1 skrll && opcode_fits_format_slot (widened.opcode,
6639 1.1 skrll format, slot))
6640 1.1 skrll {
6641 1.1 skrll v_copy.slots[slot] = widened;
6642 1.1 skrll fit++;
6643 1.1 skrll }
6644 1.1 skrll }
6645 1.1 skrll }
6646 1.1 skrll if (fit == v_copy.num_slots)
6647 1.1 skrll {
6648 1.1 skrll *vinsn = v_copy;
6649 1.1 skrll xtensa_format_encode (isa, format, vinsn->insnbuf);
6650 1.1 skrll vinsn->format = format;
6651 1.1 skrll break;
6652 1.1 skrll }
6653 1.1 skrll }
6654 1.1 skrll }
6655 1.1 skrll
6656 1.1 skrll if (format == xtensa_isa_num_formats (isa))
6657 1.1 skrll return XTENSA_UNDEFINED;
6658 1.1 skrll
6659 1.1 skrll return format;
6660 1.1 skrll }
6661 1.1 skrll
6662 1.1 skrll
6663 1.1 skrll /* Return the additional space needed in a frag
6664 1.1 skrll for possible relaxations of any ops in a VLIW insn.
6665 1.1 skrll Also fill out the relaxations that might be required of
6666 1.1 skrll each tinsn in the vinsn. */
6667 1.1 skrll
6668 1.1 skrll static int
6669 1.1 skrll relaxation_requirements (vliw_insn *vinsn, bfd_boolean *pfinish_frag)
6670 1.1 skrll {
6671 1.1 skrll bfd_boolean finish_frag = FALSE;
6672 1.1 skrll int extra_space = 0;
6673 1.1 skrll int slot;
6674 1.1 skrll
6675 1.1 skrll for (slot = 0; slot < vinsn->num_slots; slot++)
6676 1.1 skrll {
6677 1.1 skrll TInsn *tinsn = &vinsn->slots[slot];
6678 1.1 skrll if (!tinsn_has_symbolic_operands (tinsn))
6679 1.1 skrll {
6680 1.1 skrll /* A narrow instruction could be widened later to help
6681 1.1 skrll alignment issues. */
6682 1.1 skrll if (xg_is_single_relaxable_insn (tinsn, 0, TRUE)
6683 1.1 skrll && !tinsn->is_specific_opcode
6684 1.1 skrll && vinsn->num_slots == 1)
6685 1.1 skrll {
6686 1.1 skrll /* Difference in bytes between narrow and wide insns... */
6687 1.1 skrll extra_space += 1;
6688 1.1 skrll tinsn->subtype = RELAX_NARROW;
6689 1.1 skrll }
6690 1.1 skrll }
6691 1.1 skrll else
6692 1.1 skrll {
6693 1.1 skrll if (workaround_b_j_loop_end
6694 1.1 skrll && tinsn->opcode == xtensa_jx_opcode
6695 1.1 skrll && use_transform ())
6696 1.1 skrll {
6697 1.1 skrll /* Add 2 of these. */
6698 1.1 skrll extra_space += 3; /* for the nop size */
6699 1.1 skrll tinsn->subtype = RELAX_ADD_NOP_IF_PRE_LOOP_END;
6700 1.1 skrll }
6701 1.1 skrll
6702 1.1 skrll /* Need to assemble it with space for the relocation. */
6703 1.1 skrll if (xg_is_relaxable_insn (tinsn, 0)
6704 1.1 skrll && !tinsn->is_specific_opcode)
6705 1.1 skrll {
6706 1.1 skrll int max_size = xg_get_max_insn_widen_size (tinsn->opcode);
6707 1.1 skrll int max_literal_size =
6708 1.1 skrll xg_get_max_insn_widen_literal_size (tinsn->opcode);
6709 1.1 skrll
6710 1.1 skrll tinsn->literal_space = max_literal_size;
6711 1.1 skrll
6712 1.1 skrll tinsn->subtype = RELAX_IMMED;
6713 1.1 skrll extra_space += max_size;
6714 1.1 skrll }
6715 1.1 skrll else
6716 1.1 skrll {
6717 1.1 skrll /* A fix record will be added for this instruction prior
6718 1.1 skrll to relaxation, so make it end the frag. */
6719 1.1 skrll finish_frag = TRUE;
6720 1.1 skrll }
6721 1.1 skrll }
6722 1.1 skrll }
6723 1.1 skrll *pfinish_frag = finish_frag;
6724 1.1 skrll return extra_space;
6725 1.1 skrll }
6726 1.1 skrll
6727 1.1 skrll
6728 1.1 skrll static void
6729 1.1 skrll bundle_tinsn (TInsn *tinsn, vliw_insn *vinsn)
6730 1.1 skrll {
6731 1.1 skrll xtensa_isa isa = xtensa_default_isa;
6732 1.1 skrll int slot, chosen_slot;
6733 1.1 skrll
6734 1.1 skrll vinsn->format = xg_get_single_format (tinsn->opcode);
6735 1.1 skrll assert (vinsn->format != XTENSA_UNDEFINED);
6736 1.1 skrll vinsn->num_slots = xtensa_format_num_slots (isa, vinsn->format);
6737 1.1 skrll
6738 1.1 skrll chosen_slot = xg_get_single_slot (tinsn->opcode);
6739 1.1 skrll for (slot = 0; slot < vinsn->num_slots; slot++)
6740 1.1 skrll {
6741 1.1 skrll if (slot == chosen_slot)
6742 1.1 skrll vinsn->slots[slot] = *tinsn;
6743 1.1 skrll else
6744 1.1 skrll {
6745 1.1 skrll vinsn->slots[slot].opcode =
6746 1.1 skrll xtensa_format_slot_nop_opcode (isa, vinsn->format, slot);
6747 1.1 skrll vinsn->slots[slot].ntok = 0;
6748 1.1 skrll vinsn->slots[slot].insn_type = ITYPE_INSN;
6749 1.1 skrll }
6750 1.1 skrll }
6751 1.1 skrll }
6752 1.1 skrll
6753 1.1 skrll
6754 1.1 skrll static bfd_boolean
6755 1.1 skrll emit_single_op (TInsn *orig_insn)
6756 1.1 skrll {
6757 1.1 skrll int i;
6758 1.1 skrll IStack istack; /* put instructions into here */
6759 1.1 skrll symbolS *lit_sym = NULL;
6760 1.1 skrll symbolS *label_sym = NULL;
6761 1.1 skrll
6762 1.1 skrll istack_init (&istack);
6763 1.1 skrll
6764 1.1 skrll /* Special-case for "movi aX, foo" which is guaranteed to need relaxing.
6765 1.1 skrll Because the scheduling and bundling characteristics of movi and
6766 1.1 skrll l32r or const16 are so different, we can do much better if we relax
6767 1.1 skrll it prior to scheduling and bundling, rather than after. */
6768 1.1 skrll if ((orig_insn->opcode == xtensa_movi_opcode
6769 1.1 skrll || orig_insn->opcode == xtensa_movi_n_opcode)
6770 1.1 skrll && !cur_vinsn.inside_bundle
6771 1.1 skrll && (orig_insn->tok[1].X_op == O_symbol
6772 1.1 skrll || orig_insn->tok[1].X_op == O_pltrel
6773 1.1 skrll || orig_insn->tok[1].X_op == O_tlsfunc
6774 1.1 skrll || orig_insn->tok[1].X_op == O_tlsarg
6775 1.1 skrll || orig_insn->tok[1].X_op == O_tpoff
6776 1.1 skrll || orig_insn->tok[1].X_op == O_dtpoff)
6777 1.1 skrll && !orig_insn->is_specific_opcode && use_transform ())
6778 1.1 skrll xg_assembly_relax (&istack, orig_insn, now_seg, frag_now, 0, 1, 0);
6779 1.1 skrll else
6780 1.1 skrll if (xg_expand_assembly_insn (&istack, orig_insn))
6781 1.1 skrll return TRUE;
6782 1.1 skrll
6783 1.1 skrll for (i = 0; i < istack.ninsn; i++)
6784 1.1 skrll {
6785 1.1 skrll TInsn *insn = &istack.insn[i];
6786 1.1 skrll switch (insn->insn_type)
6787 1.1 skrll {
6788 1.1 skrll case ITYPE_LITERAL:
6789 1.1 skrll assert (lit_sym == NULL);
6790 1.1 skrll lit_sym = xg_assemble_literal (insn);
6791 1.1 skrll break;
6792 1.1 skrll case ITYPE_LABEL:
6793 1.1 skrll {
6794 1.1 skrll static int relaxed_sym_idx = 0;
6795 1.1 skrll char *label = xmalloc (strlen (FAKE_LABEL_NAME) + 12);
6796 1.1 skrll sprintf (label, "%s_rl_%x", FAKE_LABEL_NAME, relaxed_sym_idx++);
6797 1.1 skrll colon (label);
6798 1.1 skrll assert (label_sym == NULL);
6799 1.1 skrll label_sym = symbol_find_or_make (label);
6800 1.1 skrll assert (label_sym);
6801 1.1 skrll free (label);
6802 1.1 skrll }
6803 1.1 skrll break;
6804 1.1 skrll case ITYPE_INSN:
6805 1.1 skrll {
6806 1.1 skrll vliw_insn v;
6807 1.1 skrll if (lit_sym)
6808 1.1 skrll xg_resolve_literals (insn, lit_sym);
6809 1.1 skrll if (label_sym)
6810 1.1 skrll xg_resolve_labels (insn, label_sym);
6811 1.1 skrll xg_init_vinsn (&v);
6812 1.1 skrll bundle_tinsn (insn, &v);
6813 1.1 skrll finish_vinsn (&v);
6814 1.1 skrll xg_free_vinsn (&v);
6815 1.1 skrll }
6816 1.1 skrll break;
6817 1.1 skrll default:
6818 1.1 skrll assert (0);
6819 1.1 skrll break;
6820 1.1 skrll }
6821 1.1 skrll }
6822 1.1 skrll return FALSE;
6823 1.1 skrll }
6824 1.1 skrll
6825 1.1 skrll
6826 1.1 skrll static int
6827 1.1 skrll total_frag_text_expansion (fragS *fragP)
6828 1.1 skrll {
6829 1.1 skrll int slot;
6830 1.1 skrll int total_expansion = 0;
6831 1.1 skrll
6832 1.1 skrll for (slot = 0; slot < MAX_SLOTS; slot++)
6833 1.1 skrll total_expansion += fragP->tc_frag_data.text_expansion[slot];
6834 1.1 skrll
6835 1.1 skrll return total_expansion;
6836 1.1 skrll }
6837 1.1 skrll
6838 1.1 skrll
6839 1.1 skrll /* Emit a vliw instruction to the current fragment. */
6840 1.1 skrll
6841 1.1 skrll static void
6842 1.1 skrll xg_assemble_vliw_tokens (vliw_insn *vinsn)
6843 1.1 skrll {
6844 1.1 skrll bfd_boolean finish_frag;
6845 1.1 skrll bfd_boolean is_jump = FALSE;
6846 1.1 skrll bfd_boolean is_branch = FALSE;
6847 1.1 skrll xtensa_isa isa = xtensa_default_isa;
6848 1.1 skrll int insn_size;
6849 1.1 skrll int extra_space;
6850 1.1 skrll char *f = NULL;
6851 1.1 skrll int slot;
6852 1.1 skrll struct dwarf2_line_info debug_line;
6853 1.1 skrll bfd_boolean loc_directive_seen = FALSE;
6854 1.1 skrll TInsn *tinsn;
6855 1.1 skrll
6856 1.1 skrll memset (&debug_line, 0, sizeof (struct dwarf2_line_info));
6857 1.1 skrll
6858 1.1 skrll if (generating_literals)
6859 1.1 skrll {
6860 1.1 skrll static int reported = 0;
6861 1.1 skrll if (reported < 4)
6862 1.1 skrll as_bad_where (frag_now->fr_file, frag_now->fr_line,
6863 1.1 skrll _("cannot assemble into a literal fragment"));
6864 1.1 skrll if (reported == 3)
6865 1.1 skrll as_bad (_("..."));
6866 1.1 skrll reported++;
6867 1.1 skrll return;
6868 1.1 skrll }
6869 1.1 skrll
6870 1.1 skrll if (frag_now_fix () != 0
6871 1.1 skrll && (! frag_now->tc_frag_data.is_insn
6872 1.1 skrll || (vinsn_has_specific_opcodes (vinsn) && use_transform ())
6873 1.1 skrll || !use_transform () != frag_now->tc_frag_data.is_no_transform
6874 1.1 skrll || (directive_state[directive_longcalls]
6875 1.1 skrll != frag_now->tc_frag_data.use_longcalls)
6876 1.1 skrll || (directive_state[directive_absolute_literals]
6877 1.1 skrll != frag_now->tc_frag_data.use_absolute_literals)))
6878 1.1 skrll {
6879 1.1 skrll frag_wane (frag_now);
6880 1.1 skrll frag_new (0);
6881 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
6882 1.1 skrll }
6883 1.1 skrll
6884 1.1 skrll if (workaround_a0_b_retw
6885 1.1 skrll && vinsn->num_slots == 1
6886 1.1 skrll && (get_last_insn_flags (now_seg, now_subseg) & FLAG_IS_A0_WRITER) != 0
6887 1.1 skrll && xtensa_opcode_is_branch (isa, vinsn->slots[0].opcode) == 1
6888 1.1 skrll && use_transform ())
6889 1.1 skrll {
6890 1.1 skrll has_a0_b_retw = TRUE;
6891 1.1 skrll
6892 1.1 skrll /* Mark this fragment with the special RELAX_ADD_NOP_IF_A0_B_RETW.
6893 1.1 skrll After the first assembly pass we will check all of them and
6894 1.1 skrll add a nop if needed. */
6895 1.1 skrll frag_now->tc_frag_data.is_insn = TRUE;
6896 1.1 skrll frag_var (rs_machine_dependent, 4, 4,
6897 1.1 skrll RELAX_ADD_NOP_IF_A0_B_RETW,
6898 1.1 skrll frag_now->fr_symbol,
6899 1.1 skrll frag_now->fr_offset,
6900 1.1 skrll NULL);
6901 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
6902 1.1 skrll frag_now->tc_frag_data.is_insn = TRUE;
6903 1.1 skrll frag_var (rs_machine_dependent, 4, 4,
6904 1.1 skrll RELAX_ADD_NOP_IF_A0_B_RETW,
6905 1.1 skrll frag_now->fr_symbol,
6906 1.1 skrll frag_now->fr_offset,
6907 1.1 skrll NULL);
6908 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
6909 1.1 skrll }
6910 1.1 skrll
6911 1.1 skrll for (slot = 0; slot < vinsn->num_slots; slot++)
6912 1.1 skrll {
6913 1.1 skrll tinsn = &vinsn->slots[slot];
6914 1.1 skrll
6915 1.1 skrll /* See if the instruction implies an aligned section. */
6916 1.1 skrll if (xtensa_opcode_is_loop (isa, tinsn->opcode) == 1)
6917 1.1 skrll record_alignment (now_seg, 2);
6918 1.1 skrll
6919 1.1 skrll /* Determine the best line number for debug info. */
6920 1.1 skrll if ((tinsn->loc_directive_seen || !loc_directive_seen)
6921 1.1 skrll && (tinsn->debug_line.filenum != debug_line.filenum
6922 1.1 skrll || tinsn->debug_line.line < debug_line.line
6923 1.1 skrll || tinsn->debug_line.column < debug_line.column))
6924 1.1 skrll debug_line = tinsn->debug_line;
6925 1.1 skrll if (tinsn->loc_directive_seen)
6926 1.1 skrll loc_directive_seen = TRUE;
6927 1.1 skrll }
6928 1.1 skrll
6929 1.1 skrll /* Special cases for instructions that force an alignment... */
6930 1.1 skrll /* None of these opcodes are bundle-able. */
6931 1.1 skrll if (xtensa_opcode_is_loop (isa, vinsn->slots[0].opcode) == 1)
6932 1.1 skrll {
6933 1.1 skrll int max_fill;
6934 1.1 skrll
6935 1.1 skrll /* Remember the symbol that marks the end of the loop in the frag
6936 1.1 skrll that marks the start of the loop. This way we can easily find
6937 1.1 skrll the end of the loop at the beginning, without adding special code
6938 1.1 skrll to mark the loop instructions themselves. */
6939 1.1 skrll symbolS *target_sym = NULL;
6940 1.1 skrll if (vinsn->slots[0].tok[1].X_op == O_symbol)
6941 1.1 skrll target_sym = vinsn->slots[0].tok[1].X_add_symbol;
6942 1.1 skrll
6943 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
6944 1.1 skrll frag_now->tc_frag_data.is_insn = TRUE;
6945 1.1 skrll
6946 1.1 skrll max_fill = get_text_align_max_fill_size
6947 1.1 skrll (get_text_align_power (xtensa_fetch_width),
6948 1.1 skrll TRUE, frag_now->tc_frag_data.is_no_density);
6949 1.1 skrll
6950 1.1 skrll if (use_transform ())
6951 1.1 skrll frag_var (rs_machine_dependent, max_fill, max_fill,
6952 1.1 skrll RELAX_ALIGN_NEXT_OPCODE, target_sym, 0, NULL);
6953 1.1 skrll else
6954 1.1 skrll frag_var (rs_machine_dependent, 0, 0,
6955 1.1 skrll RELAX_CHECK_ALIGN_NEXT_OPCODE, target_sym, 0, NULL);
6956 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
6957 1.1 skrll }
6958 1.1 skrll
6959 1.1 skrll if (vinsn->slots[0].opcode == xtensa_entry_opcode
6960 1.1 skrll && !vinsn->slots[0].is_specific_opcode)
6961 1.1 skrll {
6962 1.1 skrll xtensa_mark_literal_pool_location ();
6963 1.1 skrll xtensa_move_labels (frag_now, 0);
6964 1.1 skrll frag_var (rs_align_test, 1, 1, 0, NULL, 2, NULL);
6965 1.1 skrll }
6966 1.1 skrll
6967 1.1 skrll if (vinsn->num_slots == 1)
6968 1.1 skrll {
6969 1.1 skrll if (workaround_a0_b_retw && use_transform ())
6970 1.1 skrll set_last_insn_flags (now_seg, now_subseg, FLAG_IS_A0_WRITER,
6971 1.1 skrll is_register_writer (&vinsn->slots[0], "a", 0));
6972 1.1 skrll
6973 1.1 skrll set_last_insn_flags (now_seg, now_subseg, FLAG_IS_BAD_LOOPEND,
6974 1.1 skrll is_bad_loopend_opcode (&vinsn->slots[0]));
6975 1.1 skrll }
6976 1.1 skrll else
6977 1.1 skrll set_last_insn_flags (now_seg, now_subseg, FLAG_IS_BAD_LOOPEND, FALSE);
6978 1.1 skrll
6979 1.1 skrll insn_size = xtensa_format_length (isa, vinsn->format);
6980 1.1 skrll
6981 1.1 skrll extra_space = relaxation_requirements (vinsn, &finish_frag);
6982 1.1 skrll
6983 1.1 skrll /* vinsn_to_insnbuf will produce the error. */
6984 1.1 skrll if (vinsn->format != XTENSA_UNDEFINED)
6985 1.1 skrll {
6986 1.1 skrll f = frag_more (insn_size + extra_space);
6987 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
6988 1.1 skrll frag_now->tc_frag_data.is_insn = TRUE;
6989 1.1 skrll }
6990 1.1 skrll
6991 1.1 skrll vinsn_to_insnbuf (vinsn, f, frag_now, FALSE);
6992 1.1 skrll if (vinsn->format == XTENSA_UNDEFINED)
6993 1.1 skrll return;
6994 1.1 skrll
6995 1.1 skrll xtensa_insnbuf_to_chars (isa, vinsn->insnbuf, (unsigned char *) f, 0);
6996 1.1 skrll
6997 1.1 skrll if (debug_type == DEBUG_DWARF2 || loc_directive_seen)
6998 1.1 skrll dwarf2_gen_line_info (frag_now_fix () - (insn_size + extra_space),
6999 1.1 skrll &debug_line);
7000 1.1 skrll
7001 1.1 skrll for (slot = 0; slot < vinsn->num_slots; slot++)
7002 1.1 skrll {
7003 1.1 skrll tinsn = &vinsn->slots[slot];
7004 1.1 skrll frag_now->tc_frag_data.slot_subtypes[slot] = tinsn->subtype;
7005 1.1 skrll frag_now->tc_frag_data.slot_symbols[slot] = tinsn->symbol;
7006 1.1 skrll frag_now->tc_frag_data.slot_offsets[slot] = tinsn->offset;
7007 1.1 skrll frag_now->tc_frag_data.literal_frags[slot] = tinsn->literal_frag;
7008 1.1 skrll if (tinsn->literal_space != 0)
7009 1.1 skrll xg_assemble_literal_space (tinsn->literal_space, slot);
7010 1.1 skrll
7011 1.1 skrll if (tinsn->subtype == RELAX_NARROW)
7012 1.1 skrll assert (vinsn->num_slots == 1);
7013 1.1 skrll if (xtensa_opcode_is_jump (isa, tinsn->opcode) == 1)
7014 1.1 skrll is_jump = TRUE;
7015 1.1 skrll if (xtensa_opcode_is_branch (isa, tinsn->opcode) == 1)
7016 1.1 skrll is_branch = TRUE;
7017 1.1 skrll
7018 1.1 skrll if (tinsn->subtype || tinsn->symbol || tinsn->offset
7019 1.1 skrll || tinsn->literal_frag || is_jump || is_branch)
7020 1.1 skrll finish_frag = TRUE;
7021 1.1 skrll }
7022 1.1 skrll
7023 1.1 skrll if (vinsn_has_specific_opcodes (vinsn) && use_transform ())
7024 1.1 skrll frag_now->tc_frag_data.is_specific_opcode = TRUE;
7025 1.1 skrll
7026 1.1 skrll if (finish_frag)
7027 1.1 skrll {
7028 1.1 skrll frag_variant (rs_machine_dependent,
7029 1.1 skrll extra_space, extra_space, RELAX_SLOTS,
7030 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, f);
7031 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
7032 1.1 skrll }
7033 1.1 skrll
7034 1.1 skrll /* Special cases for loops:
7035 1.1 skrll close_loop_end should be inserted AFTER short_loop.
7036 1.1 skrll Make sure that CLOSE loops are processed BEFORE short_loops
7037 1.1 skrll when converting them. */
7038 1.1 skrll
7039 1.1 skrll /* "short_loop": Add a NOP if the loop is < 4 bytes. */
7040 1.1 skrll if (xtensa_opcode_is_loop (isa, vinsn->slots[0].opcode) == 1
7041 1.1 skrll && !vinsn->slots[0].is_specific_opcode)
7042 1.1 skrll {
7043 1.1 skrll if (workaround_short_loop && use_transform ())
7044 1.1 skrll {
7045 1.1 skrll maybe_has_short_loop = TRUE;
7046 1.1 skrll frag_now->tc_frag_data.is_insn = TRUE;
7047 1.1 skrll frag_var (rs_machine_dependent, 4, 4,
7048 1.1 skrll RELAX_ADD_NOP_IF_SHORT_LOOP,
7049 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
7050 1.1 skrll frag_now->tc_frag_data.is_insn = TRUE;
7051 1.1 skrll frag_var (rs_machine_dependent, 4, 4,
7052 1.1 skrll RELAX_ADD_NOP_IF_SHORT_LOOP,
7053 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
7054 1.1 skrll }
7055 1.1 skrll
7056 1.1 skrll /* "close_loop_end": Add up to 12 bytes of NOPs to keep a
7057 1.1 skrll loop at least 12 bytes away from another loop's end. */
7058 1.1 skrll if (workaround_close_loop_end && use_transform ())
7059 1.1 skrll {
7060 1.1 skrll maybe_has_close_loop_end = TRUE;
7061 1.1 skrll frag_now->tc_frag_data.is_insn = TRUE;
7062 1.1 skrll frag_var (rs_machine_dependent, 12, 12,
7063 1.1 skrll RELAX_ADD_NOP_IF_CLOSE_LOOP_END,
7064 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
7065 1.1 skrll }
7066 1.1 skrll }
7067 1.1 skrll
7068 1.1 skrll if (use_transform ())
7069 1.1 skrll {
7070 1.1 skrll if (is_jump)
7071 1.1 skrll {
7072 1.1 skrll assert (finish_frag);
7073 1.1 skrll frag_var (rs_machine_dependent,
7074 1.1 skrll UNREACHABLE_MAX_WIDTH, UNREACHABLE_MAX_WIDTH,
7075 1.1 skrll RELAX_UNREACHABLE,
7076 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
7077 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
7078 1.1 skrll }
7079 1.1 skrll else if (is_branch && do_align_targets ())
7080 1.1 skrll {
7081 1.1 skrll assert (finish_frag);
7082 1.1 skrll frag_var (rs_machine_dependent,
7083 1.1 skrll UNREACHABLE_MAX_WIDTH, UNREACHABLE_MAX_WIDTH,
7084 1.1 skrll RELAX_MAYBE_UNREACHABLE,
7085 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
7086 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
7087 1.1 skrll frag_var (rs_machine_dependent,
7088 1.1 skrll 0, 0,
7089 1.1 skrll RELAX_MAYBE_DESIRE_ALIGN,
7090 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
7091 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
7092 1.1 skrll }
7093 1.1 skrll }
7094 1.1 skrll
7095 1.1 skrll /* Now, if the original opcode was a call... */
7096 1.1 skrll if (do_align_targets ()
7097 1.1 skrll && xtensa_opcode_is_call (isa, vinsn->slots[0].opcode) == 1)
7098 1.1 skrll {
7099 1.1 skrll float freq = get_subseg_total_freq (now_seg, now_subseg);
7100 1.1 skrll frag_now->tc_frag_data.is_insn = TRUE;
7101 1.1 skrll frag_var (rs_machine_dependent, 4, (int) freq, RELAX_DESIRE_ALIGN,
7102 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
7103 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
7104 1.1 skrll }
7105 1.1 skrll
7106 1.1 skrll if (vinsn_has_specific_opcodes (vinsn) && use_transform ())
7107 1.1 skrll {
7108 1.1 skrll frag_wane (frag_now);
7109 1.1 skrll frag_new (0);
7110 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
7111 1.1 skrll }
7112 1.1 skrll }
7113 1.1 skrll
7114 1.1 skrll
7115 1.1 skrll /* xtensa_end and helper functions. */
7117 1.1 skrll
7118 1.1 skrll static void xtensa_cleanup_align_frags (void);
7119 1.1 skrll static void xtensa_fix_target_frags (void);
7120 1.1 skrll static void xtensa_mark_narrow_branches (void);
7121 1.1 skrll static void xtensa_mark_zcl_first_insns (void);
7122 1.1 skrll static void xtensa_mark_difference_of_two_symbols (void);
7123 1.1 skrll static void xtensa_fix_a0_b_retw_frags (void);
7124 1.1 skrll static void xtensa_fix_b_j_loop_end_frags (void);
7125 1.1 skrll static void xtensa_fix_close_loop_end_frags (void);
7126 1.1 skrll static void xtensa_fix_short_loop_frags (void);
7127 1.1 skrll static void xtensa_sanity_check (void);
7128 1.1 skrll static void xtensa_add_config_info (void);
7129 1.1 skrll
7130 1.1 skrll void
7131 1.1 skrll xtensa_end (void)
7132 1.1 skrll {
7133 1.1 skrll directive_balance ();
7134 1.1 skrll xtensa_flush_pending_output ();
7135 1.1 skrll
7136 1.1 skrll past_xtensa_end = TRUE;
7137 1.1 skrll
7138 1.1 skrll xtensa_move_literals ();
7139 1.1 skrll
7140 1.1 skrll xtensa_reorder_segments ();
7141 1.1 skrll xtensa_cleanup_align_frags ();
7142 1.1 skrll xtensa_fix_target_frags ();
7143 1.1 skrll if (workaround_a0_b_retw && has_a0_b_retw)
7144 1.1 skrll xtensa_fix_a0_b_retw_frags ();
7145 1.1 skrll if (workaround_b_j_loop_end)
7146 1.1 skrll xtensa_fix_b_j_loop_end_frags ();
7147 1.1 skrll
7148 1.1 skrll /* "close_loop_end" should be processed BEFORE "short_loop". */
7149 1.1 skrll if (workaround_close_loop_end && maybe_has_close_loop_end)
7150 1.1 skrll xtensa_fix_close_loop_end_frags ();
7151 1.1 skrll
7152 1.1 skrll if (workaround_short_loop && maybe_has_short_loop)
7153 1.1 skrll xtensa_fix_short_loop_frags ();
7154 1.1 skrll if (align_targets)
7155 1.1 skrll xtensa_mark_narrow_branches ();
7156 1.1 skrll xtensa_mark_zcl_first_insns ();
7157 1.1 skrll
7158 1.1 skrll xtensa_sanity_check ();
7159 1.1 skrll
7160 1.1 skrll xtensa_add_config_info ();
7161 1.1 skrll }
7162 1.1 skrll
7163 1.1 skrll
7164 1.1 skrll static void
7165 1.1 skrll xtensa_cleanup_align_frags (void)
7166 1.1 skrll {
7167 1.1 skrll frchainS *frchP;
7168 1.1 skrll asection *s;
7169 1.1 skrll
7170 1.1 skrll for (s = stdoutput->sections; s; s = s->next)
7171 1.1 skrll for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7172 1.1 skrll {
7173 1.1 skrll fragS *fragP;
7174 1.1 skrll /* Walk over all of the fragments in a subsection. */
7175 1.1 skrll for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7176 1.1 skrll {
7177 1.1 skrll if ((fragP->fr_type == rs_align
7178 1.1 skrll || fragP->fr_type == rs_align_code
7179 1.1 skrll || (fragP->fr_type == rs_machine_dependent
7180 1.1 skrll && (fragP->fr_subtype == RELAX_DESIRE_ALIGN
7181 1.1 skrll || fragP->fr_subtype == RELAX_DESIRE_ALIGN_IF_TARGET)))
7182 1.1 skrll && fragP->fr_fix == 0)
7183 1.1 skrll {
7184 1.1 skrll fragS *next = fragP->fr_next;
7185 1.1 skrll
7186 1.1 skrll while (next
7187 1.1 skrll && next->fr_fix == 0
7188 1.1 skrll && next->fr_type == rs_machine_dependent
7189 1.1 skrll && next->fr_subtype == RELAX_DESIRE_ALIGN_IF_TARGET)
7190 1.1 skrll {
7191 1.1 skrll frag_wane (next);
7192 1.1 skrll next = next->fr_next;
7193 1.1 skrll }
7194 1.1 skrll }
7195 1.1 skrll /* If we don't widen branch targets, then they
7196 1.1 skrll will be easier to align. */
7197 1.1 skrll if (fragP->tc_frag_data.is_branch_target
7198 1.1 skrll && fragP->fr_opcode == fragP->fr_literal
7199 1.1 skrll && fragP->fr_type == rs_machine_dependent
7200 1.1 skrll && fragP->fr_subtype == RELAX_SLOTS
7201 1.1 skrll && fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
7202 1.1 skrll frag_wane (fragP);
7203 1.1 skrll if (fragP->fr_type == rs_machine_dependent
7204 1.1 skrll && fragP->fr_subtype == RELAX_UNREACHABLE)
7205 1.1 skrll fragP->tc_frag_data.is_unreachable = TRUE;
7206 1.1 skrll }
7207 1.1 skrll }
7208 1.1 skrll }
7209 1.1 skrll
7210 1.1 skrll
7211 1.1 skrll /* Re-process all of the fragments looking to convert all of the
7212 1.1 skrll RELAX_DESIRE_ALIGN_IF_TARGET fragments. If there is a branch
7213 1.1 skrll target in the next fragment, convert this to RELAX_DESIRE_ALIGN.
7214 1.1 skrll Otherwise, convert to a .fill 0. */
7215 1.1 skrll
7216 1.1 skrll static void
7217 1.1 skrll xtensa_fix_target_frags (void)
7218 1.1 skrll {
7219 1.1 skrll frchainS *frchP;
7220 1.1 skrll asection *s;
7221 1.1 skrll
7222 1.1 skrll /* When this routine is called, all of the subsections are still intact
7223 1.1 skrll so we walk over subsections instead of sections. */
7224 1.1 skrll for (s = stdoutput->sections; s; s = s->next)
7225 1.1 skrll for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7226 1.1 skrll {
7227 1.1 skrll fragS *fragP;
7228 1.1 skrll
7229 1.1 skrll /* Walk over all of the fragments in a subsection. */
7230 1.1 skrll for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7231 1.1 skrll {
7232 1.1 skrll if (fragP->fr_type == rs_machine_dependent
7233 1.1 skrll && fragP->fr_subtype == RELAX_DESIRE_ALIGN_IF_TARGET)
7234 1.1 skrll {
7235 1.1 skrll if (next_frag_is_branch_target (fragP))
7236 1.1 skrll fragP->fr_subtype = RELAX_DESIRE_ALIGN;
7237 1.1 skrll else
7238 1.1 skrll frag_wane (fragP);
7239 1.1 skrll }
7240 1.1 skrll }
7241 1.1 skrll }
7242 1.1 skrll }
7243 1.1 skrll
7244 1.1 skrll
7245 1.1 skrll static bfd_boolean is_narrow_branch_guaranteed_in_range (fragS *, TInsn *);
7246 1.1 skrll
7247 1.1 skrll static void
7248 1.1 skrll xtensa_mark_narrow_branches (void)
7249 1.1 skrll {
7250 1.1 skrll frchainS *frchP;
7251 1.1 skrll asection *s;
7252 1.1 skrll
7253 1.1 skrll for (s = stdoutput->sections; s; s = s->next)
7254 1.1 skrll for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7255 1.1 skrll {
7256 1.1 skrll fragS *fragP;
7257 1.1 skrll /* Walk over all of the fragments in a subsection. */
7258 1.1 skrll for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7259 1.1 skrll {
7260 1.1 skrll if (fragP->fr_type == rs_machine_dependent
7261 1.1 skrll && fragP->fr_subtype == RELAX_SLOTS
7262 1.1 skrll && fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED)
7263 1.1 skrll {
7264 1.1 skrll vliw_insn vinsn;
7265 1.1 skrll
7266 1.1 skrll vinsn_from_chars (&vinsn, fragP->fr_opcode);
7267 1.1 skrll tinsn_immed_from_frag (&vinsn.slots[0], fragP, 0);
7268 1.1 skrll
7269 1.1 skrll if (vinsn.num_slots == 1
7270 1.1 skrll && xtensa_opcode_is_branch (xtensa_default_isa,
7271 1.1 skrll vinsn.slots[0].opcode) == 1
7272 1.1 skrll && xg_get_single_size (vinsn.slots[0].opcode) == 2
7273 1.1 skrll && is_narrow_branch_guaranteed_in_range (fragP,
7274 1.1 skrll &vinsn.slots[0]))
7275 1.1 skrll {
7276 1.1 skrll fragP->fr_subtype = RELAX_SLOTS;
7277 1.1 skrll fragP->tc_frag_data.slot_subtypes[0] = RELAX_NARROW;
7278 1.1 skrll fragP->tc_frag_data.is_aligning_branch = 1;
7279 1.1 skrll }
7280 1.1 skrll }
7281 1.1 skrll }
7282 1.1 skrll }
7283 1.1 skrll }
7284 1.1 skrll
7285 1.1 skrll
7286 1.1 skrll /* A branch is typically widened only when its target is out of
7287 1.1 skrll range. However, we would like to widen them to align a subsequent
7288 1.1 skrll branch target when possible.
7289 1.1 skrll
7290 1.1 skrll Because the branch relaxation code is so convoluted, the optimal solution
7291 1.1 skrll (combining the two cases) is difficult to get right in all circumstances.
7292 1.1 skrll We therefore go with an "almost as good" solution, where we only
7293 1.1 skrll use for alignment narrow branches that definitely will not expand to a
7294 1.1 skrll jump and a branch. These functions find and mark these cases. */
7295 1.1 skrll
7296 1.1 skrll /* The range in bytes of BNEZ.N and BEQZ.N. The target operand is encoded
7297 1.1 skrll as PC + 4 + imm6, where imm6 is a 6-bit immediate ranging from 0 to 63.
7298 1.1 skrll We start counting beginning with the frag after the 2-byte branch, so the
7299 1.1 skrll maximum offset is (4 - 2) + 63 = 65. */
7300 1.1 skrll #define MAX_IMMED6 65
7301 1.1 skrll
7302 1.1 skrll static offsetT unrelaxed_frag_max_size (fragS *);
7303 1.1 skrll
7304 1.1 skrll static bfd_boolean
7305 1.1 skrll is_narrow_branch_guaranteed_in_range (fragS *fragP, TInsn *tinsn)
7306 1.1 skrll {
7307 1.1 skrll const expressionS *expr = &tinsn->tok[1];
7308 1.1 skrll symbolS *symbolP = expr->X_add_symbol;
7309 1.1 skrll offsetT max_distance = expr->X_add_number;
7310 1.1 skrll fragS *target_frag;
7311 1.1 skrll
7312 1.1 skrll if (expr->X_op != O_symbol)
7313 1.1 skrll return FALSE;
7314 1.1 skrll
7315 1.1 skrll target_frag = symbol_get_frag (symbolP);
7316 1.1 skrll
7317 1.1 skrll max_distance += (S_GET_VALUE (symbolP) - target_frag->fr_address);
7318 1.1 skrll if (is_branch_jmp_to_next (tinsn, fragP))
7319 1.1 skrll return FALSE;
7320 1.1 skrll
7321 1.1 skrll /* The branch doesn't branch over it's own frag,
7322 1.1 skrll but over the subsequent ones. */
7323 1.1 skrll fragP = fragP->fr_next;
7324 1.1 skrll while (fragP != NULL && fragP != target_frag && max_distance <= MAX_IMMED6)
7325 1.1 skrll {
7326 1.1 skrll max_distance += unrelaxed_frag_max_size (fragP);
7327 1.1 skrll fragP = fragP->fr_next;
7328 1.1 skrll }
7329 1.1 skrll if (max_distance <= MAX_IMMED6 && fragP == target_frag)
7330 1.1 skrll return TRUE;
7331 1.1 skrll return FALSE;
7332 1.1 skrll }
7333 1.1 skrll
7334 1.1 skrll
7335 1.1 skrll static void
7336 1.1 skrll xtensa_mark_zcl_first_insns (void)
7337 1.1 skrll {
7338 1.1 skrll frchainS *frchP;
7339 1.1 skrll asection *s;
7340 1.1 skrll
7341 1.1 skrll for (s = stdoutput->sections; s; s = s->next)
7342 1.1 skrll for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7343 1.1 skrll {
7344 1.1 skrll fragS *fragP;
7345 1.1 skrll /* Walk over all of the fragments in a subsection. */
7346 1.1 skrll for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7347 1.1 skrll {
7348 1.1 skrll if (fragP->fr_type == rs_machine_dependent
7349 1.1 skrll && (fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE
7350 1.1 skrll || fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE))
7351 1.1 skrll {
7352 1.1 skrll /* Find the loop frag. */
7353 1.1 skrll fragS *targ_frag = next_non_empty_frag (fragP);
7354 1.1 skrll /* Find the first insn frag. */
7355 1.1 skrll targ_frag = next_non_empty_frag (targ_frag);
7356 1.1 skrll
7357 1.1 skrll /* Of course, sometimes (mostly for toy test cases) a
7358 1.1 skrll zero-cost loop instruction is the last in a section. */
7359 1.1 skrll if (targ_frag)
7360 1.1 skrll {
7361 1.1 skrll targ_frag->tc_frag_data.is_first_loop_insn = TRUE;
7362 1.1 skrll /* Do not widen a frag that is the first instruction of a
7363 1.1 skrll zero-cost loop. It makes that loop harder to align. */
7364 1.1 skrll if (targ_frag->fr_type == rs_machine_dependent
7365 1.1 skrll && targ_frag->fr_subtype == RELAX_SLOTS
7366 1.1 skrll && (targ_frag->tc_frag_data.slot_subtypes[0]
7367 1.1 skrll == RELAX_NARROW))
7368 1.1 skrll {
7369 1.1 skrll if (targ_frag->tc_frag_data.is_aligning_branch)
7370 1.1 skrll targ_frag->tc_frag_data.slot_subtypes[0] = RELAX_IMMED;
7371 1.1 skrll else
7372 1.1 skrll {
7373 1.1 skrll frag_wane (targ_frag);
7374 1.1 skrll targ_frag->tc_frag_data.slot_subtypes[0] = 0;
7375 1.1 skrll }
7376 1.1 skrll }
7377 1.1 skrll }
7378 1.1 skrll if (fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE)
7379 1.1 skrll frag_wane (fragP);
7380 1.1 skrll }
7381 1.1 skrll }
7382 1.1 skrll }
7383 1.1 skrll }
7384 1.1 skrll
7385 1.1 skrll
7386 1.1 skrll /* When a difference-of-symbols expression is encoded as a uleb128 or
7387 1.1 skrll sleb128 value, the linker is unable to adjust that value to account for
7388 1.1 skrll link-time relaxation. Mark all the code between such symbols so that
7389 1.1 skrll its size cannot be changed by linker relaxation. */
7390 1.1 skrll
7391 1.1 skrll static void
7392 1.1 skrll xtensa_mark_difference_of_two_symbols (void)
7393 1.1 skrll {
7394 1.1 skrll symbolS *expr_sym;
7395 1.1 skrll
7396 1.1 skrll for (expr_sym = expr_symbols; expr_sym;
7397 1.1 skrll expr_sym = symbol_get_tc (expr_sym)->next_expr_symbol)
7398 1.1 skrll {
7399 1.1 skrll expressionS *expr = symbol_get_value_expression (expr_sym);
7400 1.1 skrll
7401 1.1 skrll if (expr->X_op == O_subtract)
7402 1.1 skrll {
7403 1.1 skrll symbolS *left = expr->X_add_symbol;
7404 1.1 skrll symbolS *right = expr->X_op_symbol;
7405 1.1 skrll
7406 1.1 skrll /* Difference of two symbols not in the same section
7407 1.1 skrll are handled with relocations in the linker. */
7408 1.1 skrll if (S_GET_SEGMENT (left) == S_GET_SEGMENT (right))
7409 1.1 skrll {
7410 1.1 skrll fragS *start;
7411 1.1 skrll fragS *end;
7412 1.1 skrll
7413 1.1 skrll if (symbol_get_frag (left)->fr_address
7414 1.1 skrll <= symbol_get_frag (right)->fr_address)
7415 1.1 skrll {
7416 1.1 skrll start = symbol_get_frag (left);
7417 1.1 skrll end = symbol_get_frag (right);
7418 1.1 skrll }
7419 1.1 skrll else
7420 1.1 skrll {
7421 1.1 skrll start = symbol_get_frag (right);
7422 1.1 skrll end = symbol_get_frag (left);
7423 1.1 skrll }
7424 1.1 skrll do
7425 1.1 skrll {
7426 1.1 skrll start->tc_frag_data.is_no_transform = 1;
7427 1.1 skrll start = start->fr_next;
7428 1.1 skrll }
7429 1.1 skrll while (start && start->fr_address < end->fr_address);
7430 1.1 skrll }
7431 1.1 skrll }
7432 1.1 skrll }
7433 1.1 skrll }
7434 1.1 skrll
7435 1.1 skrll
7436 1.1 skrll /* Re-process all of the fragments looking to convert all of the
7437 1.1 skrll RELAX_ADD_NOP_IF_A0_B_RETW. If the next instruction is a
7438 1.1 skrll conditional branch or a retw/retw.n, convert this frag to one that
7439 1.1 skrll will generate a NOP. In any case close it off with a .fill 0. */
7440 1.1 skrll
7441 1.1 skrll static bfd_boolean next_instrs_are_b_retw (fragS *);
7442 1.1 skrll
7443 1.1 skrll static void
7444 1.1 skrll xtensa_fix_a0_b_retw_frags (void)
7445 1.1 skrll {
7446 1.1 skrll frchainS *frchP;
7447 1.1 skrll asection *s;
7448 1.1 skrll
7449 1.1 skrll /* When this routine is called, all of the subsections are still intact
7450 1.1 skrll so we walk over subsections instead of sections. */
7451 1.1 skrll for (s = stdoutput->sections; s; s = s->next)
7452 1.1 skrll for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7453 1.1 skrll {
7454 1.1 skrll fragS *fragP;
7455 1.1 skrll
7456 1.1 skrll /* Walk over all of the fragments in a subsection. */
7457 1.1 skrll for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7458 1.1 skrll {
7459 1.1 skrll if (fragP->fr_type == rs_machine_dependent
7460 1.1 skrll && fragP->fr_subtype == RELAX_ADD_NOP_IF_A0_B_RETW)
7461 1.1 skrll {
7462 1.1 skrll if (next_instrs_are_b_retw (fragP))
7463 1.1 skrll {
7464 1.1 skrll if (fragP->tc_frag_data.is_no_transform)
7465 1.1 skrll as_bad (_("instruction sequence (write a0, branch, retw) may trigger hardware errata"));
7466 1.1 skrll else
7467 1.1 skrll relax_frag_add_nop (fragP);
7468 1.1 skrll }
7469 1.1 skrll frag_wane (fragP);
7470 1.1 skrll }
7471 1.1 skrll }
7472 1.1 skrll }
7473 1.1 skrll }
7474 1.1 skrll
7475 1.1 skrll
7476 1.1 skrll static bfd_boolean
7477 1.1 skrll next_instrs_are_b_retw (fragS *fragP)
7478 1.1 skrll {
7479 1.1 skrll xtensa_opcode opcode;
7480 1.1 skrll xtensa_format fmt;
7481 1.1 skrll const fragS *next_fragP = next_non_empty_frag (fragP);
7482 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
7483 1.1 skrll static xtensa_insnbuf slotbuf = NULL;
7484 1.1 skrll xtensa_isa isa = xtensa_default_isa;
7485 1.1 skrll int offset = 0;
7486 1.1 skrll int slot;
7487 1.1 skrll bfd_boolean branch_seen = FALSE;
7488 1.1 skrll
7489 1.1 skrll if (!insnbuf)
7490 1.1 skrll {
7491 1.1 skrll insnbuf = xtensa_insnbuf_alloc (isa);
7492 1.1 skrll slotbuf = xtensa_insnbuf_alloc (isa);
7493 1.1 skrll }
7494 1.1 skrll
7495 1.1 skrll if (next_fragP == NULL)
7496 1.1 skrll return FALSE;
7497 1.1 skrll
7498 1.1 skrll /* Check for the conditional branch. */
7499 1.1 skrll xtensa_insnbuf_from_chars
7500 1.1 skrll (isa, insnbuf, (unsigned char *) &next_fragP->fr_literal[offset], 0);
7501 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
7502 1.1 skrll if (fmt == XTENSA_UNDEFINED)
7503 1.1 skrll return FALSE;
7504 1.1 skrll
7505 1.1 skrll for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
7506 1.1 skrll {
7507 1.1 skrll xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
7508 1.1 skrll opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
7509 1.1 skrll
7510 1.1 skrll branch_seen = (branch_seen
7511 1.1 skrll || xtensa_opcode_is_branch (isa, opcode) == 1);
7512 1.1 skrll }
7513 1.1 skrll
7514 1.1 skrll if (!branch_seen)
7515 1.1 skrll return FALSE;
7516 1.1 skrll
7517 1.1 skrll offset += xtensa_format_length (isa, fmt);
7518 1.1 skrll if (offset == next_fragP->fr_fix)
7519 1.1 skrll {
7520 1.1 skrll next_fragP = next_non_empty_frag (next_fragP);
7521 1.1 skrll offset = 0;
7522 1.1 skrll }
7523 1.1 skrll
7524 1.1 skrll if (next_fragP == NULL)
7525 1.1 skrll return FALSE;
7526 1.1 skrll
7527 1.1 skrll /* Check for the retw/retw.n. */
7528 1.1 skrll xtensa_insnbuf_from_chars
7529 1.1 skrll (isa, insnbuf, (unsigned char *) &next_fragP->fr_literal[offset], 0);
7530 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
7531 1.1 skrll
7532 1.1 skrll /* Because RETW[.N] is not bundleable, a VLIW bundle here means that we
7533 1.1 skrll have no problems. */
7534 1.1 skrll if (fmt == XTENSA_UNDEFINED
7535 1.1 skrll || xtensa_format_num_slots (isa, fmt) != 1)
7536 1.1 skrll return FALSE;
7537 1.1 skrll
7538 1.1 skrll xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf);
7539 1.1 skrll opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
7540 1.1 skrll
7541 1.1 skrll if (opcode == xtensa_retw_opcode || opcode == xtensa_retw_n_opcode)
7542 1.1 skrll return TRUE;
7543 1.1 skrll
7544 1.1 skrll return FALSE;
7545 1.1 skrll }
7546 1.1 skrll
7547 1.1 skrll
7548 1.1 skrll /* Re-process all of the fragments looking to convert all of the
7549 1.1 skrll RELAX_ADD_NOP_IF_PRE_LOOP_END. If there is one instruction and a
7550 1.1 skrll loop end label, convert this frag to one that will generate a NOP.
7551 1.1 skrll In any case close it off with a .fill 0. */
7552 1.1 skrll
7553 1.1 skrll static bfd_boolean next_instr_is_loop_end (fragS *);
7554 1.1 skrll
7555 1.1 skrll static void
7556 1.1 skrll xtensa_fix_b_j_loop_end_frags (void)
7557 1.1 skrll {
7558 1.1 skrll frchainS *frchP;
7559 1.1 skrll asection *s;
7560 1.1 skrll
7561 1.1 skrll /* When this routine is called, all of the subsections are still intact
7562 1.1 skrll so we walk over subsections instead of sections. */
7563 1.1 skrll for (s = stdoutput->sections; s; s = s->next)
7564 1.1 skrll for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7565 1.1 skrll {
7566 1.1 skrll fragS *fragP;
7567 1.1 skrll
7568 1.1 skrll /* Walk over all of the fragments in a subsection. */
7569 1.1 skrll for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7570 1.1 skrll {
7571 1.1 skrll if (fragP->fr_type == rs_machine_dependent
7572 1.1 skrll && fragP->fr_subtype == RELAX_ADD_NOP_IF_PRE_LOOP_END)
7573 1.1 skrll {
7574 1.1 skrll if (next_instr_is_loop_end (fragP))
7575 1.1 skrll {
7576 1.1 skrll if (fragP->tc_frag_data.is_no_transform)
7577 1.1 skrll as_bad (_("branching or jumping to a loop end may trigger hardware errata"));
7578 1.1 skrll else
7579 1.1 skrll relax_frag_add_nop (fragP);
7580 1.1 skrll }
7581 1.1 skrll frag_wane (fragP);
7582 1.1 skrll }
7583 1.1 skrll }
7584 1.1 skrll }
7585 1.1 skrll }
7586 1.1 skrll
7587 1.1 skrll
7588 1.1 skrll static bfd_boolean
7589 1.1 skrll next_instr_is_loop_end (fragS *fragP)
7590 1.1 skrll {
7591 1.1 skrll const fragS *next_fragP;
7592 1.1 skrll
7593 1.1 skrll if (next_frag_is_loop_target (fragP))
7594 1.1 skrll return FALSE;
7595 1.1 skrll
7596 1.1 skrll next_fragP = next_non_empty_frag (fragP);
7597 1.1 skrll if (next_fragP == NULL)
7598 1.1 skrll return FALSE;
7599 1.1 skrll
7600 1.1 skrll if (!next_frag_is_loop_target (next_fragP))
7601 1.1 skrll return FALSE;
7602 1.1 skrll
7603 1.1 skrll /* If the size is >= 3 then there is more than one instruction here.
7604 1.1 skrll The hardware bug will not fire. */
7605 1.1 skrll if (next_fragP->fr_fix > 3)
7606 1.1 skrll return FALSE;
7607 1.1 skrll
7608 1.1 skrll return TRUE;
7609 1.1 skrll }
7610 1.1 skrll
7611 1.1 skrll
7612 1.1 skrll /* Re-process all of the fragments looking to convert all of the
7613 1.1 skrll RELAX_ADD_NOP_IF_CLOSE_LOOP_END. If there is an loop end that is
7614 1.1 skrll not MY loop's loop end within 12 bytes, add enough nops here to
7615 1.1 skrll make it at least 12 bytes away. In any case close it off with a
7616 1.1 skrll .fill 0. */
7617 1.1 skrll
7618 1.1 skrll static offsetT min_bytes_to_other_loop_end
7619 1.1 skrll (fragS *, fragS *, offsetT);
7620 1.1 skrll
7621 1.1 skrll static void
7622 1.1 skrll xtensa_fix_close_loop_end_frags (void)
7623 1.1 skrll {
7624 1.1 skrll frchainS *frchP;
7625 1.1 skrll asection *s;
7626 1.1 skrll
7627 1.1 skrll /* When this routine is called, all of the subsections are still intact
7628 1.1 skrll so we walk over subsections instead of sections. */
7629 1.1 skrll for (s = stdoutput->sections; s; s = s->next)
7630 1.1 skrll for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7631 1.1 skrll {
7632 1.1 skrll fragS *fragP;
7633 1.1 skrll
7634 1.1 skrll fragS *current_target = NULL;
7635 1.1 skrll
7636 1.1 skrll /* Walk over all of the fragments in a subsection. */
7637 1.1 skrll for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7638 1.1 skrll {
7639 1.1 skrll if (fragP->fr_type == rs_machine_dependent
7640 1.1 skrll && ((fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE)
7641 1.1 skrll || (fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE)))
7642 1.1 skrll current_target = symbol_get_frag (fragP->fr_symbol);
7643 1.1 skrll
7644 1.1 skrll if (current_target
7645 1.1 skrll && fragP->fr_type == rs_machine_dependent
7646 1.1 skrll && fragP->fr_subtype == RELAX_ADD_NOP_IF_CLOSE_LOOP_END)
7647 1.1 skrll {
7648 1.1 skrll offsetT min_bytes;
7649 1.1 skrll int bytes_added = 0;
7650 1.1 skrll
7651 1.1 skrll #define REQUIRED_LOOP_DIVIDING_BYTES 12
7652 1.1 skrll /* Max out at 12. */
7653 1.1 skrll min_bytes = min_bytes_to_other_loop_end
7654 1.1 skrll (fragP->fr_next, current_target, REQUIRED_LOOP_DIVIDING_BYTES);
7655 1.1 skrll
7656 1.1 skrll if (min_bytes < REQUIRED_LOOP_DIVIDING_BYTES)
7657 1.1 skrll {
7658 1.1 skrll if (fragP->tc_frag_data.is_no_transform)
7659 1.1 skrll as_bad (_("loop end too close to another loop end may trigger hardware errata"));
7660 1.1 skrll else
7661 1.1 skrll {
7662 1.1 skrll while (min_bytes + bytes_added
7663 1.1 skrll < REQUIRED_LOOP_DIVIDING_BYTES)
7664 1.1 skrll {
7665 1.1 skrll int length = 3;
7666 1.1 skrll
7667 1.1 skrll if (fragP->fr_var < length)
7668 1.1 skrll as_fatal (_("fr_var %lu < length %d"),
7669 1.1 skrll (long) fragP->fr_var, length);
7670 1.1 skrll else
7671 1.1 skrll {
7672 1.1 skrll assemble_nop (length,
7673 1.1 skrll fragP->fr_literal + fragP->fr_fix);
7674 1.1 skrll fragP->fr_fix += length;
7675 1.1 skrll fragP->fr_var -= length;
7676 1.1 skrll }
7677 1.1 skrll bytes_added += length;
7678 1.1 skrll }
7679 1.1 skrll }
7680 1.1 skrll }
7681 1.1 skrll frag_wane (fragP);
7682 1.1 skrll }
7683 1.1 skrll assert (fragP->fr_type != rs_machine_dependent
7684 1.1 skrll || fragP->fr_subtype != RELAX_ADD_NOP_IF_CLOSE_LOOP_END);
7685 1.1 skrll }
7686 1.1 skrll }
7687 1.1 skrll }
7688 1.1 skrll
7689 1.1 skrll
7690 1.1 skrll static offsetT unrelaxed_frag_min_size (fragS *);
7691 1.1 skrll
7692 1.1 skrll static offsetT
7693 1.1 skrll min_bytes_to_other_loop_end (fragS *fragP,
7694 1.1 skrll fragS *current_target,
7695 1.1 skrll offsetT max_size)
7696 1.1 skrll {
7697 1.1 skrll offsetT offset = 0;
7698 1.1 skrll fragS *current_fragP;
7699 1.1 skrll
7700 1.1 skrll for (current_fragP = fragP;
7701 1.1 skrll current_fragP;
7702 1.1 skrll current_fragP = current_fragP->fr_next)
7703 1.1 skrll {
7704 1.1 skrll if (current_fragP->tc_frag_data.is_loop_target
7705 1.1 skrll && current_fragP != current_target)
7706 1.1 skrll return offset;
7707 1.1 skrll
7708 1.1 skrll offset += unrelaxed_frag_min_size (current_fragP);
7709 1.1 skrll
7710 1.1 skrll if (offset >= max_size)
7711 1.1 skrll return max_size;
7712 1.1 skrll }
7713 1.1 skrll return max_size;
7714 1.1 skrll }
7715 1.1 skrll
7716 1.1 skrll
7717 1.1 skrll static offsetT
7718 1.1 skrll unrelaxed_frag_min_size (fragS *fragP)
7719 1.1 skrll {
7720 1.1 skrll offsetT size = fragP->fr_fix;
7721 1.1 skrll
7722 1.1 skrll /* Add fill size. */
7723 1.1 skrll if (fragP->fr_type == rs_fill)
7724 1.1 skrll size += fragP->fr_offset;
7725 1.1 skrll
7726 1.1 skrll return size;
7727 1.1 skrll }
7728 1.1 skrll
7729 1.1 skrll
7730 1.1 skrll static offsetT
7731 1.1 skrll unrelaxed_frag_max_size (fragS *fragP)
7732 1.1 skrll {
7733 1.1 skrll offsetT size = fragP->fr_fix;
7734 1.1 skrll switch (fragP->fr_type)
7735 1.1 skrll {
7736 1.1 skrll case 0:
7737 1.1 skrll /* Empty frags created by the obstack allocation scheme
7738 1.1 skrll end up with type 0. */
7739 1.1 skrll break;
7740 1.1 skrll case rs_fill:
7741 1.1 skrll case rs_org:
7742 1.1 skrll case rs_space:
7743 1.1 skrll size += fragP->fr_offset;
7744 1.1 skrll break;
7745 1.1 skrll case rs_align:
7746 1.1 skrll case rs_align_code:
7747 1.1 skrll case rs_align_test:
7748 1.1 skrll case rs_leb128:
7749 1.1 skrll case rs_cfa:
7750 1.1 skrll case rs_dwarf2dbg:
7751 1.1 skrll /* No further adjustments needed. */
7752 1.1 skrll break;
7753 1.1 skrll case rs_machine_dependent:
7754 1.1 skrll if (fragP->fr_subtype != RELAX_DESIRE_ALIGN)
7755 1.1 skrll size += fragP->fr_var;
7756 1.1 skrll break;
7757 1.1 skrll default:
7758 1.1 skrll /* We had darn well better know how big it is. */
7759 1.1 skrll assert (0);
7760 1.1 skrll break;
7761 1.1 skrll }
7762 1.1 skrll
7763 1.1 skrll return size;
7764 1.1 skrll }
7765 1.1 skrll
7766 1.1 skrll
7767 1.1 skrll /* Re-process all of the fragments looking to convert all
7768 1.1 skrll of the RELAX_ADD_NOP_IF_SHORT_LOOP. If:
7769 1.1 skrll
7770 1.1 skrll A)
7771 1.1 skrll 1) the instruction size count to the loop end label
7772 1.1 skrll is too short (<= 2 instructions),
7773 1.1 skrll 2) loop has a jump or branch in it
7774 1.1 skrll
7775 1.1 skrll or B)
7776 1.1 skrll 1) workaround_all_short_loops is TRUE
7777 1.1 skrll 2) The generating loop was a 'loopgtz' or 'loopnez'
7778 1.1 skrll 3) the instruction size count to the loop end label is too short
7779 1.1 skrll (<= 2 instructions)
7780 1.1 skrll then convert this frag (and maybe the next one) to generate a NOP.
7781 1.1 skrll In any case close it off with a .fill 0. */
7782 1.1 skrll
7783 1.1 skrll static int count_insns_to_loop_end (fragS *, bfd_boolean, int);
7784 1.1 skrll static bfd_boolean branch_before_loop_end (fragS *);
7785 1.1 skrll
7786 1.1 skrll static void
7787 1.1 skrll xtensa_fix_short_loop_frags (void)
7788 1.1 skrll {
7789 1.1 skrll frchainS *frchP;
7790 1.1 skrll asection *s;
7791 1.1 skrll
7792 1.1 skrll /* When this routine is called, all of the subsections are still intact
7793 1.1 skrll so we walk over subsections instead of sections. */
7794 1.1 skrll for (s = stdoutput->sections; s; s = s->next)
7795 1.1 skrll for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7796 1.1 skrll {
7797 1.1 skrll fragS *fragP;
7798 1.1 skrll fragS *current_target = NULL;
7799 1.1 skrll xtensa_opcode current_opcode = XTENSA_UNDEFINED;
7800 1.1 skrll
7801 1.1 skrll /* Walk over all of the fragments in a subsection. */
7802 1.1 skrll for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7803 1.1 skrll {
7804 1.1 skrll if (fragP->fr_type == rs_machine_dependent
7805 1.1 skrll && ((fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE)
7806 1.1 skrll || (fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE)))
7807 1.1 skrll {
7808 1.1 skrll TInsn t_insn;
7809 1.1 skrll fragS *loop_frag = next_non_empty_frag (fragP);
7810 1.1 skrll tinsn_from_chars (&t_insn, loop_frag->fr_opcode, 0);
7811 1.1 skrll current_target = symbol_get_frag (fragP->fr_symbol);
7812 1.1 skrll current_opcode = t_insn.opcode;
7813 1.1 skrll assert (xtensa_opcode_is_loop (xtensa_default_isa,
7814 1.1 skrll current_opcode) == 1);
7815 1.1 skrll }
7816 1.1 skrll
7817 1.1 skrll if (fragP->fr_type == rs_machine_dependent
7818 1.1 skrll && fragP->fr_subtype == RELAX_ADD_NOP_IF_SHORT_LOOP)
7819 1.1 skrll {
7820 1.1 skrll if (count_insns_to_loop_end (fragP->fr_next, TRUE, 3) < 3
7821 1.1 skrll && (branch_before_loop_end (fragP->fr_next)
7822 1.1 skrll || (workaround_all_short_loops
7823 1.1 skrll && current_opcode != XTENSA_UNDEFINED
7824 1.1 skrll && current_opcode != xtensa_loop_opcode)))
7825 1.1 skrll {
7826 1.1 skrll if (fragP->tc_frag_data.is_no_transform)
7827 1.1 skrll as_bad (_("loop containing less than three instructions may trigger hardware errata"));
7828 1.1 skrll else
7829 1.1 skrll relax_frag_add_nop (fragP);
7830 1.1 skrll }
7831 1.1 skrll frag_wane (fragP);
7832 1.1 skrll }
7833 1.1 skrll }
7834 1.1 skrll }
7835 1.1 skrll }
7836 1.1 skrll
7837 1.1 skrll
7838 1.1 skrll static int unrelaxed_frag_min_insn_count (fragS *);
7839 1.1 skrll
7840 1.1 skrll static int
7841 1.1 skrll count_insns_to_loop_end (fragS *base_fragP,
7842 1.1 skrll bfd_boolean count_relax_add,
7843 1.1 skrll int max_count)
7844 1.1 skrll {
7845 1.1 skrll fragS *fragP = NULL;
7846 1.1 skrll int insn_count = 0;
7847 1.1 skrll
7848 1.1 skrll fragP = base_fragP;
7849 1.1 skrll
7850 1.1 skrll for (; fragP && !fragP->tc_frag_data.is_loop_target; fragP = fragP->fr_next)
7851 1.1 skrll {
7852 1.1 skrll insn_count += unrelaxed_frag_min_insn_count (fragP);
7853 1.1 skrll if (insn_count >= max_count)
7854 1.1 skrll return max_count;
7855 1.1 skrll
7856 1.1 skrll if (count_relax_add)
7857 1.1 skrll {
7858 1.1 skrll if (fragP->fr_type == rs_machine_dependent
7859 1.1 skrll && fragP->fr_subtype == RELAX_ADD_NOP_IF_SHORT_LOOP)
7860 1.1 skrll {
7861 1.1 skrll /* In order to add the appropriate number of
7862 1.1 skrll NOPs, we count an instruction for downstream
7863 1.1 skrll occurrences. */
7864 1.1 skrll insn_count++;
7865 1.1 skrll if (insn_count >= max_count)
7866 1.1 skrll return max_count;
7867 1.1 skrll }
7868 1.1 skrll }
7869 1.1 skrll }
7870 1.1 skrll return insn_count;
7871 1.1 skrll }
7872 1.1 skrll
7873 1.1 skrll
7874 1.1 skrll static int
7875 1.1 skrll unrelaxed_frag_min_insn_count (fragS *fragP)
7876 1.1 skrll {
7877 1.1 skrll xtensa_isa isa = xtensa_default_isa;
7878 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
7879 1.1 skrll int insn_count = 0;
7880 1.1 skrll int offset = 0;
7881 1.1 skrll
7882 1.1 skrll if (!fragP->tc_frag_data.is_insn)
7883 1.1 skrll return insn_count;
7884 1.1 skrll
7885 1.1 skrll if (!insnbuf)
7886 1.1 skrll insnbuf = xtensa_insnbuf_alloc (isa);
7887 1.1 skrll
7888 1.1 skrll /* Decode the fixed instructions. */
7889 1.1 skrll while (offset < fragP->fr_fix)
7890 1.1 skrll {
7891 1.1 skrll xtensa_format fmt;
7892 1.1 skrll
7893 1.1 skrll xtensa_insnbuf_from_chars
7894 1.1 skrll (isa, insnbuf, (unsigned char *) fragP->fr_literal + offset, 0);
7895 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
7896 1.1 skrll
7897 1.1 skrll if (fmt == XTENSA_UNDEFINED)
7898 1.1 skrll {
7899 1.1 skrll as_fatal (_("undecodable instruction in instruction frag"));
7900 1.1 skrll return insn_count;
7901 1.1 skrll }
7902 1.1 skrll offset += xtensa_format_length (isa, fmt);
7903 1.1 skrll insn_count++;
7904 1.1 skrll }
7905 1.1 skrll
7906 1.1 skrll return insn_count;
7907 1.1 skrll }
7908 1.1 skrll
7909 1.1 skrll
7910 1.1 skrll static bfd_boolean unrelaxed_frag_has_b_j (fragS *);
7911 1.1 skrll
7912 1.1 skrll static bfd_boolean
7913 1.1 skrll branch_before_loop_end (fragS *base_fragP)
7914 1.1 skrll {
7915 1.1 skrll fragS *fragP;
7916 1.1 skrll
7917 1.1 skrll for (fragP = base_fragP;
7918 1.1 skrll fragP && !fragP->tc_frag_data.is_loop_target;
7919 1.1 skrll fragP = fragP->fr_next)
7920 1.1 skrll {
7921 1.1 skrll if (unrelaxed_frag_has_b_j (fragP))
7922 1.1 skrll return TRUE;
7923 1.1 skrll }
7924 1.1 skrll return FALSE;
7925 1.1 skrll }
7926 1.1 skrll
7927 1.1 skrll
7928 1.1 skrll static bfd_boolean
7929 1.1 skrll unrelaxed_frag_has_b_j (fragS *fragP)
7930 1.1 skrll {
7931 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
7932 1.1 skrll xtensa_isa isa = xtensa_default_isa;
7933 1.1 skrll int offset = 0;
7934 1.1 skrll
7935 1.1 skrll if (!fragP->tc_frag_data.is_insn)
7936 1.1 skrll return FALSE;
7937 1.1 skrll
7938 1.1 skrll if (!insnbuf)
7939 1.1 skrll insnbuf = xtensa_insnbuf_alloc (isa);
7940 1.1 skrll
7941 1.1 skrll /* Decode the fixed instructions. */
7942 1.1 skrll while (offset < fragP->fr_fix)
7943 1.1 skrll {
7944 1.1 skrll xtensa_format fmt;
7945 1.1 skrll int slot;
7946 1.1 skrll
7947 1.1 skrll xtensa_insnbuf_from_chars
7948 1.1 skrll (isa, insnbuf, (unsigned char *) fragP->fr_literal + offset, 0);
7949 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
7950 1.1 skrll if (fmt == XTENSA_UNDEFINED)
7951 1.1 skrll return FALSE;
7952 1.1 skrll
7953 1.1 skrll for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
7954 1.1 skrll {
7955 1.1 skrll xtensa_opcode opcode =
7956 1.1 skrll get_opcode_from_buf (fragP->fr_literal + offset, slot);
7957 1.1 skrll if (xtensa_opcode_is_branch (isa, opcode) == 1
7958 1.1 skrll || xtensa_opcode_is_jump (isa, opcode) == 1)
7959 1.1 skrll return TRUE;
7960 1.1 skrll }
7961 1.1 skrll offset += xtensa_format_length (isa, fmt);
7962 1.1 skrll }
7963 1.1 skrll return FALSE;
7964 1.1 skrll }
7965 1.1 skrll
7966 1.1 skrll
7967 1.1 skrll /* Checks to be made after initial assembly but before relaxation. */
7968 1.1 skrll
7969 1.1 skrll static bfd_boolean is_empty_loop (const TInsn *, fragS *);
7970 1.1 skrll static bfd_boolean is_local_forward_loop (const TInsn *, fragS *);
7971 1.1 skrll
7972 1.1 skrll static void
7973 1.1 skrll xtensa_sanity_check (void)
7974 1.1 skrll {
7975 1.1 skrll char *file_name;
7976 1.1 skrll unsigned line;
7977 1.1 skrll frchainS *frchP;
7978 1.1 skrll asection *s;
7979 1.1 skrll
7980 1.1 skrll as_where (&file_name, &line);
7981 1.1 skrll for (s = stdoutput->sections; s; s = s->next)
7982 1.1 skrll for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7983 1.1 skrll {
7984 1.1 skrll fragS *fragP;
7985 1.1 skrll
7986 1.1 skrll /* Walk over all of the fragments in a subsection. */
7987 1.1 skrll for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7988 1.1 skrll {
7989 1.1 skrll if (fragP->fr_type == rs_machine_dependent
7990 1.1 skrll && fragP->fr_subtype == RELAX_SLOTS
7991 1.1 skrll && fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED)
7992 1.1 skrll {
7993 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
7994 1.1 skrll TInsn t_insn;
7995 1.1 skrll
7996 1.1 skrll if (fragP->fr_opcode != NULL)
7997 1.1 skrll {
7998 1.1 skrll if (!insnbuf)
7999 1.1 skrll insnbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
8000 1.1 skrll tinsn_from_chars (&t_insn, fragP->fr_opcode, 0);
8001 1.1 skrll tinsn_immed_from_frag (&t_insn, fragP, 0);
8002 1.1 skrll
8003 1.1 skrll if (xtensa_opcode_is_loop (xtensa_default_isa,
8004 1.1 skrll t_insn.opcode) == 1)
8005 1.1 skrll {
8006 1.1 skrll if (is_empty_loop (&t_insn, fragP))
8007 1.1 skrll {
8008 1.1 skrll new_logical_line (fragP->fr_file, fragP->fr_line);
8009 1.1 skrll as_bad (_("invalid empty loop"));
8010 1.1 skrll }
8011 1.1 skrll if (!is_local_forward_loop (&t_insn, fragP))
8012 1.1 skrll {
8013 1.1 skrll new_logical_line (fragP->fr_file, fragP->fr_line);
8014 1.1 skrll as_bad (_("loop target does not follow "
8015 1.1 skrll "loop instruction in section"));
8016 1.1 skrll }
8017 1.1 skrll }
8018 1.1 skrll }
8019 1.1 skrll }
8020 1.1 skrll }
8021 1.1 skrll }
8022 1.1 skrll new_logical_line (file_name, line);
8023 1.1 skrll }
8024 1.1 skrll
8025 1.1 skrll
8026 1.1 skrll #define LOOP_IMMED_OPN 1
8027 1.1 skrll
8028 1.1 skrll /* Return TRUE if the loop target is the next non-zero fragment. */
8029 1.1 skrll
8030 1.1 skrll static bfd_boolean
8031 1.1 skrll is_empty_loop (const TInsn *insn, fragS *fragP)
8032 1.1 skrll {
8033 1.1 skrll const expressionS *expr;
8034 1.1 skrll symbolS *symbolP;
8035 1.1 skrll fragS *next_fragP;
8036 1.1 skrll
8037 1.1 skrll if (insn->insn_type != ITYPE_INSN)
8038 1.1 skrll return FALSE;
8039 1.1 skrll
8040 1.1 skrll if (xtensa_opcode_is_loop (xtensa_default_isa, insn->opcode) != 1)
8041 1.1 skrll return FALSE;
8042 1.1 skrll
8043 1.1 skrll if (insn->ntok <= LOOP_IMMED_OPN)
8044 1.1 skrll return FALSE;
8045 1.1 skrll
8046 1.1 skrll expr = &insn->tok[LOOP_IMMED_OPN];
8047 1.1 skrll
8048 1.1 skrll if (expr->X_op != O_symbol)
8049 1.1 skrll return FALSE;
8050 1.1 skrll
8051 1.1 skrll symbolP = expr->X_add_symbol;
8052 1.1 skrll if (!symbolP)
8053 1.1 skrll return FALSE;
8054 1.1 skrll
8055 1.1 skrll if (symbol_get_frag (symbolP) == NULL)
8056 1.1 skrll return FALSE;
8057 1.1 skrll
8058 1.1 skrll if (S_GET_VALUE (symbolP) != 0)
8059 1.1 skrll return FALSE;
8060 1.1 skrll
8061 1.1 skrll /* Walk through the zero-size fragments from this one. If we find
8062 1.1 skrll the target fragment, then this is a zero-size loop. */
8063 1.1 skrll
8064 1.1 skrll for (next_fragP = fragP->fr_next;
8065 1.1 skrll next_fragP != NULL;
8066 1.1 skrll next_fragP = next_fragP->fr_next)
8067 1.1 skrll {
8068 1.1 skrll if (next_fragP == symbol_get_frag (symbolP))
8069 1.1 skrll return TRUE;
8070 1.1 skrll if (next_fragP->fr_fix != 0)
8071 1.1 skrll return FALSE;
8072 1.1 skrll }
8073 1.1 skrll return FALSE;
8074 1.1 skrll }
8075 1.1 skrll
8076 1.1 skrll
8077 1.1 skrll static bfd_boolean
8078 1.1 skrll is_local_forward_loop (const TInsn *insn, fragS *fragP)
8079 1.1 skrll {
8080 1.1 skrll const expressionS *expr;
8081 1.1 skrll symbolS *symbolP;
8082 1.1 skrll fragS *next_fragP;
8083 1.1 skrll
8084 1.1 skrll if (insn->insn_type != ITYPE_INSN)
8085 1.1 skrll return FALSE;
8086 1.1 skrll
8087 1.1 skrll if (xtensa_opcode_is_loop (xtensa_default_isa, insn->opcode) != 1)
8088 1.1 skrll return FALSE;
8089 1.1 skrll
8090 1.1 skrll if (insn->ntok <= LOOP_IMMED_OPN)
8091 1.1 skrll return FALSE;
8092 1.1 skrll
8093 1.1 skrll expr = &insn->tok[LOOP_IMMED_OPN];
8094 1.1 skrll
8095 1.1 skrll if (expr->X_op != O_symbol)
8096 1.1 skrll return FALSE;
8097 1.1 skrll
8098 1.1 skrll symbolP = expr->X_add_symbol;
8099 1.1 skrll if (!symbolP)
8100 1.1 skrll return FALSE;
8101 1.1 skrll
8102 1.1 skrll if (symbol_get_frag (symbolP) == NULL)
8103 1.1 skrll return FALSE;
8104 1.1 skrll
8105 1.1 skrll /* Walk through fragments until we find the target.
8106 1.1 skrll If we do not find the target, then this is an invalid loop. */
8107 1.1 skrll
8108 1.1 skrll for (next_fragP = fragP->fr_next;
8109 1.1 skrll next_fragP != NULL;
8110 1.1 skrll next_fragP = next_fragP->fr_next)
8111 1.1 skrll {
8112 1.1 skrll if (next_fragP == symbol_get_frag (symbolP))
8113 1.1 skrll return TRUE;
8114 1.1 skrll }
8115 1.1 skrll
8116 1.1 skrll return FALSE;
8117 1.1 skrll }
8118 1.1 skrll
8119 1.1 skrll
8120 1.1 skrll #define XTINFO_NAME "Xtensa_Info"
8121 1.1 skrll #define XTINFO_NAMESZ 12
8122 1.1 skrll #define XTINFO_TYPE 1
8123 1.1 skrll
8124 1.1 skrll static void
8125 1.1 skrll xtensa_add_config_info (void)
8126 1.1 skrll {
8127 1.1 skrll asection *info_sec;
8128 1.1 skrll char *data, *p;
8129 1.1 skrll int sz;
8130 1.1 skrll
8131 1.1 skrll info_sec = subseg_new (".xtensa.info", 0);
8132 1.1 skrll bfd_set_section_flags (stdoutput, info_sec, SEC_HAS_CONTENTS | SEC_READONLY);
8133 1.1 skrll
8134 1.1 skrll data = xmalloc (100);
8135 1.1 skrll sprintf (data, "USE_ABSOLUTE_LITERALS=%d\nABI=%d\n",
8136 1.1 skrll XSHAL_USE_ABSOLUTE_LITERALS, XSHAL_ABI);
8137 1.1 skrll sz = strlen (data) + 1;
8138 1.1 skrll
8139 1.1 skrll /* Add enough null terminators to pad to a word boundary. */
8140 1.1 skrll do
8141 1.1 skrll data[sz++] = 0;
8142 1.1 skrll while ((sz & 3) != 0);
8143 1.1 skrll
8144 1.1 skrll /* Follow the standard note section layout:
8145 1.1 skrll First write the length of the name string. */
8146 1.1 skrll p = frag_more (4);
8147 1.1 skrll md_number_to_chars (p, (valueT) XTINFO_NAMESZ, 4);
8148 1.1 skrll
8149 1.1 skrll /* Next comes the length of the "descriptor", i.e., the actual data. */
8150 1.1 skrll p = frag_more (4);
8151 1.1 skrll md_number_to_chars (p, (valueT) sz, 4);
8152 1.1 skrll
8153 1.1 skrll /* Write the note type. */
8154 1.1 skrll p = frag_more (4);
8155 1.1 skrll md_number_to_chars (p, (valueT) XTINFO_TYPE, 4);
8156 1.1 skrll
8157 1.1 skrll /* Write the name field. */
8158 1.1 skrll p = frag_more (XTINFO_NAMESZ);
8159 1.1 skrll memcpy (p, XTINFO_NAME, XTINFO_NAMESZ);
8160 1.1 skrll
8161 1.1 skrll /* Finally, write the descriptor. */
8162 1.1 skrll p = frag_more (sz);
8163 1.1 skrll memcpy (p, data, sz);
8164 1.1 skrll
8165 1.1 skrll free (data);
8166 1.1 skrll }
8167 1.1 skrll
8168 1.1 skrll
8169 1.1 skrll /* Alignment Functions. */
8171 1.1 skrll
8172 1.1 skrll static int
8173 1.1 skrll get_text_align_power (unsigned target_size)
8174 1.1 skrll {
8175 1.1 skrll if (target_size <= 4)
8176 1.1 skrll return 2;
8177 1.1 skrll assert (target_size == 8);
8178 1.1 skrll return 3;
8179 1.1 skrll }
8180 1.1 skrll
8181 1.1 skrll
8182 1.1 skrll static int
8183 1.1 skrll get_text_align_max_fill_size (int align_pow,
8184 1.1 skrll bfd_boolean use_nops,
8185 1.1 skrll bfd_boolean use_no_density)
8186 1.1 skrll {
8187 1.1 skrll if (!use_nops)
8188 1.1 skrll return (1 << align_pow);
8189 1.1 skrll if (use_no_density)
8190 1.1 skrll return 3 * (1 << align_pow);
8191 1.1 skrll
8192 1.1 skrll return 1 + (1 << align_pow);
8193 1.1 skrll }
8194 1.1 skrll
8195 1.1 skrll
8196 1.1 skrll /* Calculate the minimum bytes of fill needed at "address" to align a
8197 1.1 skrll target instruction of size "target_size" so that it does not cross a
8198 1.1 skrll power-of-two boundary specified by "align_pow". If "use_nops" is FALSE,
8199 1.1 skrll the fill can be an arbitrary number of bytes. Otherwise, the space must
8200 1.1 skrll be filled by NOP instructions. */
8201 1.1 skrll
8202 1.1 skrll static int
8203 1.1 skrll get_text_align_fill_size (addressT address,
8204 1.1 skrll int align_pow,
8205 1.1 skrll int target_size,
8206 1.1 skrll bfd_boolean use_nops,
8207 1.1 skrll bfd_boolean use_no_density)
8208 1.1 skrll {
8209 1.1 skrll addressT alignment, fill, fill_limit, fill_step;
8210 1.1 skrll bfd_boolean skip_one = FALSE;
8211 1.1 skrll
8212 1.1 skrll alignment = (1 << align_pow);
8213 1.1 skrll assert (target_size > 0 && alignment >= (addressT) target_size);
8214 1.1 skrll
8215 1.1 skrll if (!use_nops)
8216 1.1 skrll {
8217 1.1 skrll fill_limit = alignment;
8218 1.1 skrll fill_step = 1;
8219 1.1 skrll }
8220 1.1 skrll else if (!use_no_density)
8221 1.1 skrll {
8222 1.1 skrll /* Combine 2- and 3-byte NOPs to fill anything larger than one. */
8223 1.1 skrll fill_limit = alignment * 2;
8224 1.1 skrll fill_step = 1;
8225 1.1 skrll skip_one = TRUE;
8226 1.1 skrll }
8227 1.1 skrll else
8228 1.1 skrll {
8229 1.1 skrll /* Fill with 3-byte NOPs -- can only fill multiples of 3. */
8230 1.1 skrll fill_limit = alignment * 3;
8231 1.1 skrll fill_step = 3;
8232 1.1 skrll }
8233 1.1 skrll
8234 1.1 skrll /* Try all fill sizes until finding one that works. */
8235 1.1 skrll for (fill = 0; fill < fill_limit; fill += fill_step)
8236 1.1 skrll {
8237 1.1 skrll if (skip_one && fill == 1)
8238 1.1 skrll continue;
8239 1.1 skrll if ((address + fill) >> align_pow
8240 1.1 skrll == (address + fill + target_size - 1) >> align_pow)
8241 1.1 skrll return fill;
8242 1.1 skrll }
8243 1.1 skrll assert (0);
8244 1.1 skrll return 0;
8245 1.1 skrll }
8246 1.1 skrll
8247 1.1 skrll
8248 1.1 skrll static int
8249 1.1 skrll branch_align_power (segT sec)
8250 1.1 skrll {
8251 1.1 skrll /* If the Xtensa processor has a fetch width of 8 bytes, and the section
8252 1.1 skrll is aligned to at least an 8-byte boundary, then a branch target need
8253 1.1 skrll only fit within an 8-byte aligned block of memory to avoid a stall.
8254 1.1 skrll Otherwise, try to fit branch targets within 4-byte aligned blocks
8255 1.1 skrll (which may be insufficient, e.g., if the section has no alignment, but
8256 1.1 skrll it's good enough). */
8257 1.1 skrll if (xtensa_fetch_width == 8)
8258 1.1 skrll {
8259 1.1 skrll if (get_recorded_alignment (sec) >= 3)
8260 1.1 skrll return 3;
8261 1.1 skrll }
8262 1.1 skrll else
8263 1.1 skrll assert (xtensa_fetch_width == 4);
8264 1.1 skrll
8265 1.1 skrll return 2;
8266 1.1 skrll }
8267 1.1 skrll
8268 1.1 skrll
8269 1.1 skrll /* This will assert if it is not possible. */
8270 1.1 skrll
8271 1.1 skrll static int
8272 1.1 skrll get_text_align_nop_count (offsetT fill_size, bfd_boolean use_no_density)
8273 1.1 skrll {
8274 1.1 skrll int count = 0;
8275 1.1 skrll
8276 1.1 skrll if (use_no_density)
8277 1.1 skrll {
8278 1.1 skrll assert (fill_size % 3 == 0);
8279 1.1 skrll return (fill_size / 3);
8280 1.1 skrll }
8281 1.1 skrll
8282 1.1 skrll assert (fill_size != 1); /* Bad argument. */
8283 1.1 skrll
8284 1.1 skrll while (fill_size > 1)
8285 1.1 skrll {
8286 1.1 skrll int insn_size = 3;
8287 1.1 skrll if (fill_size == 2 || fill_size == 4)
8288 1.1 skrll insn_size = 2;
8289 1.1 skrll fill_size -= insn_size;
8290 1.1 skrll count++;
8291 1.1 skrll }
8292 1.1 skrll assert (fill_size != 1); /* Bad algorithm. */
8293 1.1 skrll return count;
8294 1.1 skrll }
8295 1.1 skrll
8296 1.1 skrll
8297 1.1 skrll static int
8298 1.1 skrll get_text_align_nth_nop_size (offsetT fill_size,
8299 1.1 skrll int n,
8300 1.1 skrll bfd_boolean use_no_density)
8301 1.1 skrll {
8302 1.1 skrll int count = 0;
8303 1.1 skrll
8304 1.1 skrll if (use_no_density)
8305 1.1 skrll return 3;
8306 1.1 skrll
8307 1.1 skrll assert (fill_size != 1); /* Bad argument. */
8308 1.1 skrll
8309 1.1 skrll while (fill_size > 1)
8310 1.1 skrll {
8311 1.1 skrll int insn_size = 3;
8312 1.1 skrll if (fill_size == 2 || fill_size == 4)
8313 1.1 skrll insn_size = 2;
8314 1.1 skrll fill_size -= insn_size;
8315 1.1 skrll count++;
8316 1.1 skrll if (n + 1 == count)
8317 1.1 skrll return insn_size;
8318 1.1 skrll }
8319 1.1 skrll assert (0);
8320 1.1 skrll return 0;
8321 1.1 skrll }
8322 1.1 skrll
8323 1.1 skrll
8324 1.1 skrll /* For the given fragment, find the appropriate address
8325 1.1 skrll for it to begin at if we are using NOPs to align it. */
8326 1.1 skrll
8327 1.1 skrll static addressT
8328 1.1 skrll get_noop_aligned_address (fragS *fragP, addressT address)
8329 1.1 skrll {
8330 1.1 skrll /* The rule is: get next fragment's FIRST instruction. Find
8331 1.1 skrll the smallest number of bytes that need to be added to
8332 1.1 skrll ensure that the next fragment's FIRST instruction will fit
8333 1.1 skrll in a single word.
8334 1.1 skrll
8335 1.1 skrll E.G., 2 bytes : 0, 1, 2 mod 4
8336 1.1 skrll 3 bytes: 0, 1 mod 4
8337 1.1 skrll
8338 1.1 skrll If the FIRST instruction MIGHT be relaxed,
8339 1.1 skrll assume that it will become a 3-byte instruction.
8340 1.1 skrll
8341 1.1 skrll Note again here that LOOP instructions are not bundleable,
8342 1.1 skrll and this relaxation only applies to LOOP opcodes. */
8343 1.1 skrll
8344 1.1 skrll int fill_size = 0;
8345 1.1 skrll int first_insn_size;
8346 1.1 skrll int loop_insn_size;
8347 1.1 skrll addressT pre_opcode_bytes;
8348 1.1 skrll int align_power;
8349 1.1 skrll fragS *first_insn;
8350 1.1 skrll xtensa_opcode opcode;
8351 1.1 skrll bfd_boolean is_loop;
8352 1.1 skrll
8353 1.1 skrll assert (fragP->fr_type == rs_machine_dependent);
8354 1.1 skrll assert (fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE);
8355 1.1 skrll
8356 1.1 skrll /* Find the loop frag. */
8357 1.1 skrll first_insn = next_non_empty_frag (fragP);
8358 1.1 skrll /* Now find the first insn frag. */
8359 1.1 skrll first_insn = next_non_empty_frag (first_insn);
8360 1.1 skrll
8361 1.1 skrll is_loop = next_frag_opcode_is_loop (fragP, &opcode);
8362 1.1 skrll assert (is_loop);
8363 1.1 skrll loop_insn_size = xg_get_single_size (opcode);
8364 1.1 skrll
8365 1.1 skrll pre_opcode_bytes = next_frag_pre_opcode_bytes (fragP);
8366 1.1 skrll pre_opcode_bytes += loop_insn_size;
8367 1.1 skrll
8368 1.1 skrll /* For loops, the alignment depends on the size of the
8369 1.1 skrll instruction following the loop, not the LOOP instruction. */
8370 1.1 skrll
8371 1.1 skrll if (first_insn == NULL)
8372 1.1 skrll first_insn_size = xtensa_fetch_width;
8373 1.1 skrll else
8374 1.1 skrll first_insn_size = get_loop_align_size (frag_format_size (first_insn));
8375 1.1 skrll
8376 1.1 skrll /* If it was 8, then we'll need a larger alignment for the section. */
8377 1.1 skrll align_power = get_text_align_power (first_insn_size);
8378 1.1 skrll record_alignment (now_seg, align_power);
8379 1.1 skrll
8380 1.1 skrll fill_size = get_text_align_fill_size
8381 1.1 skrll (address + pre_opcode_bytes, align_power, first_insn_size, TRUE,
8382 1.1 skrll fragP->tc_frag_data.is_no_density);
8383 1.1 skrll
8384 1.1 skrll return address + fill_size;
8385 1.1 skrll }
8386 1.1 skrll
8387 1.1 skrll
8388 1.1 skrll /* 3 mechanisms for relaxing an alignment:
8389 1.1 skrll
8390 1.1 skrll Align to a power of 2.
8391 1.1 skrll Align so the next fragment's instruction does not cross a word boundary.
8392 1.1 skrll Align the current instruction so that if the next instruction
8393 1.1 skrll were 3 bytes, it would not cross a word boundary.
8394 1.1 skrll
8395 1.1 skrll We can align with:
8396 1.1 skrll
8397 1.1 skrll zeros - This is easy; always insert zeros.
8398 1.1 skrll nops - 3-byte and 2-byte instructions
8399 1.1 skrll 2 - 2-byte nop
8400 1.1 skrll 3 - 3-byte nop
8401 1.1 skrll 4 - 2 2-byte nops
8402 1.1 skrll >=5 : 3-byte instruction + fn (n-3)
8403 1.1 skrll widening - widen previous instructions. */
8404 1.1 skrll
8405 1.1 skrll static offsetT
8406 1.1 skrll get_aligned_diff (fragS *fragP, addressT address, offsetT *max_diff)
8407 1.1 skrll {
8408 1.1 skrll addressT target_address, loop_insn_offset;
8409 1.1 skrll int target_size;
8410 1.1 skrll xtensa_opcode loop_opcode;
8411 1.1 skrll bfd_boolean is_loop;
8412 1.1 skrll int align_power;
8413 1.1 skrll offsetT opt_diff;
8414 1.1 skrll offsetT branch_align;
8415 1.1 skrll fragS *loop_frag;
8416 1.1 skrll
8417 1.1 skrll assert (fragP->fr_type == rs_machine_dependent);
8418 1.1 skrll switch (fragP->fr_subtype)
8419 1.1 skrll {
8420 1.1 skrll case RELAX_DESIRE_ALIGN:
8421 1.1 skrll target_size = next_frag_format_size (fragP);
8422 1.1 skrll if (target_size == XTENSA_UNDEFINED)
8423 1.1 skrll target_size = 3;
8424 1.1 skrll align_power = branch_align_power (now_seg);
8425 1.1 skrll branch_align = 1 << align_power;
8426 1.1 skrll /* Don't count on the section alignment being as large as the target. */
8427 1.1 skrll if (target_size > branch_align)
8428 1.1 skrll target_size = branch_align;
8429 1.1 skrll opt_diff = get_text_align_fill_size (address, align_power,
8430 1.1 skrll target_size, FALSE, FALSE);
8431 1.1 skrll
8432 1.1 skrll *max_diff = (opt_diff + branch_align
8433 1.1 skrll - (target_size + ((address + opt_diff) % branch_align)));
8434 1.1 skrll assert (*max_diff >= opt_diff);
8435 1.1 skrll return opt_diff;
8436 1.1 skrll
8437 1.1 skrll case RELAX_ALIGN_NEXT_OPCODE:
8438 1.1 skrll /* The next non-empty frag after this one holds the LOOP instruction
8439 1.1 skrll that needs to be aligned. The required alignment depends on the
8440 1.1 skrll size of the next non-empty frag after the loop frag, i.e., the
8441 1.1 skrll first instruction in the loop. */
8442 1.1 skrll loop_frag = next_non_empty_frag (fragP);
8443 1.1 skrll target_size = get_loop_align_size (next_frag_format_size (loop_frag));
8444 1.1 skrll loop_insn_offset = 0;
8445 1.1 skrll is_loop = next_frag_opcode_is_loop (fragP, &loop_opcode);
8446 1.1 skrll assert (is_loop);
8447 1.1 skrll
8448 1.1 skrll /* If the loop has been expanded then the LOOP instruction
8449 1.1 skrll could be at an offset from this fragment. */
8450 1.1 skrll if (loop_frag->tc_frag_data.slot_subtypes[0] != RELAX_IMMED)
8451 1.1 skrll loop_insn_offset = get_expanded_loop_offset (loop_opcode);
8452 1.1 skrll
8453 1.1 skrll /* In an ideal world, which is what we are shooting for here,
8454 1.1 skrll we wouldn't need to use any NOPs immediately prior to the
8455 1.1 skrll LOOP instruction. If this approach fails, relax_frag_loop_align
8456 1.1 skrll will call get_noop_aligned_address. */
8457 1.1 skrll target_address =
8458 1.1 skrll address + loop_insn_offset + xg_get_single_size (loop_opcode);
8459 1.1 skrll align_power = get_text_align_power (target_size);
8460 1.1 skrll opt_diff = get_text_align_fill_size (target_address, align_power,
8461 1.1 skrll target_size, FALSE, FALSE);
8462 1.1 skrll
8463 1.1 skrll *max_diff = xtensa_fetch_width
8464 1.1 skrll - ((target_address + opt_diff) % xtensa_fetch_width)
8465 1.1 skrll - target_size + opt_diff;
8466 1.1 skrll assert (*max_diff >= opt_diff);
8467 1.1 skrll return opt_diff;
8468 1.1 skrll
8469 1.1 skrll default:
8470 1.1 skrll break;
8471 1.1 skrll }
8472 1.1 skrll assert (0);
8473 1.1 skrll return 0;
8474 1.1 skrll }
8475 1.1 skrll
8476 1.1 skrll
8477 1.1 skrll /* md_relax_frag Hook and Helper Functions. */
8479 1.1 skrll
8480 1.1 skrll static long relax_frag_loop_align (fragS *, long);
8481 1.1 skrll static long relax_frag_for_align (fragS *, long);
8482 1.1 skrll static long relax_frag_immed
8483 1.1 skrll (segT, fragS *, long, int, xtensa_format, int, int *, bfd_boolean);
8484 1.1 skrll
8485 1.1 skrll
8486 1.1 skrll /* Return the number of bytes added to this fragment, given that the
8487 1.1 skrll input has been stretched already by "stretch". */
8488 1.1 skrll
8489 1.1 skrll long
8490 1.1 skrll xtensa_relax_frag (fragS *fragP, long stretch, int *stretched_p)
8491 1.1 skrll {
8492 1.1 skrll xtensa_isa isa = xtensa_default_isa;
8493 1.1 skrll int unreported = fragP->tc_frag_data.unreported_expansion;
8494 1.1 skrll long new_stretch = 0;
8495 1.1 skrll char *file_name;
8496 1.1 skrll unsigned line;
8497 1.1 skrll int lit_size;
8498 1.1 skrll static xtensa_insnbuf vbuf = NULL;
8499 1.1 skrll int slot, num_slots;
8500 1.1 skrll xtensa_format fmt;
8501 1.1 skrll
8502 1.1 skrll as_where (&file_name, &line);
8503 1.1 skrll new_logical_line (fragP->fr_file, fragP->fr_line);
8504 1.1 skrll
8505 1.1 skrll fragP->tc_frag_data.unreported_expansion = 0;
8506 1.1 skrll
8507 1.1 skrll switch (fragP->fr_subtype)
8508 1.1 skrll {
8509 1.1 skrll case RELAX_ALIGN_NEXT_OPCODE:
8510 1.1 skrll /* Always convert. */
8511 1.1 skrll if (fragP->tc_frag_data.relax_seen)
8512 1.1 skrll new_stretch = relax_frag_loop_align (fragP, stretch);
8513 1.1 skrll break;
8514 1.1 skrll
8515 1.1 skrll case RELAX_LOOP_END:
8516 1.1 skrll /* Do nothing. */
8517 1.1 skrll break;
8518 1.1 skrll
8519 1.1 skrll case RELAX_LOOP_END_ADD_NOP:
8520 1.1 skrll /* Add a NOP and switch to .fill 0. */
8521 1.1 skrll new_stretch = relax_frag_add_nop (fragP);
8522 1.1 skrll frag_wane (fragP);
8523 1.1 skrll break;
8524 1.1 skrll
8525 1.1 skrll case RELAX_DESIRE_ALIGN:
8526 1.1 skrll /* Do nothing. The narrowing before this frag will either align
8527 1.1 skrll it or not. */
8528 1.1 skrll break;
8529 1.1 skrll
8530 1.1 skrll case RELAX_LITERAL:
8531 1.1 skrll case RELAX_LITERAL_FINAL:
8532 1.1 skrll return 0;
8533 1.1 skrll
8534 1.1 skrll case RELAX_LITERAL_NR:
8535 1.1 skrll lit_size = 4;
8536 1.1 skrll fragP->fr_subtype = RELAX_LITERAL_FINAL;
8537 1.1 skrll assert (unreported == lit_size);
8538 1.1 skrll memset (&fragP->fr_literal[fragP->fr_fix], 0, 4);
8539 1.1 skrll fragP->fr_var -= lit_size;
8540 1.1 skrll fragP->fr_fix += lit_size;
8541 1.1 skrll new_stretch = 4;
8542 1.1 skrll break;
8543 1.1 skrll
8544 1.1 skrll case RELAX_SLOTS:
8545 1.1 skrll if (vbuf == NULL)
8546 1.1 skrll vbuf = xtensa_insnbuf_alloc (isa);
8547 1.1 skrll
8548 1.1 skrll xtensa_insnbuf_from_chars
8549 1.1 skrll (isa, vbuf, (unsigned char *) fragP->fr_opcode, 0);
8550 1.1 skrll fmt = xtensa_format_decode (isa, vbuf);
8551 1.1 skrll num_slots = xtensa_format_num_slots (isa, fmt);
8552 1.1 skrll
8553 1.1 skrll for (slot = 0; slot < num_slots; slot++)
8554 1.1 skrll {
8555 1.1 skrll switch (fragP->tc_frag_data.slot_subtypes[slot])
8556 1.1 skrll {
8557 1.1 skrll case RELAX_NARROW:
8558 1.1 skrll if (fragP->tc_frag_data.relax_seen)
8559 1.1 skrll new_stretch += relax_frag_for_align (fragP, stretch);
8560 1.1 skrll break;
8561 1.1 skrll
8562 1.1 skrll case RELAX_IMMED:
8563 1.1 skrll case RELAX_IMMED_STEP1:
8564 1.1 skrll case RELAX_IMMED_STEP2:
8565 1.1 skrll case RELAX_IMMED_STEP3:
8566 1.1 skrll /* Place the immediate. */
8567 1.1 skrll new_stretch += relax_frag_immed
8568 1.1 skrll (now_seg, fragP, stretch,
8569 1.1 skrll fragP->tc_frag_data.slot_subtypes[slot] - RELAX_IMMED,
8570 1.1 skrll fmt, slot, stretched_p, FALSE);
8571 1.1 skrll break;
8572 1.1 skrll
8573 1.1 skrll default:
8574 1.1 skrll /* This is OK; see the note in xg_assemble_vliw_tokens. */
8575 1.1 skrll break;
8576 1.1 skrll }
8577 1.1 skrll }
8578 1.1 skrll break;
8579 1.1 skrll
8580 1.1 skrll case RELAX_LITERAL_POOL_BEGIN:
8581 1.1 skrll case RELAX_LITERAL_POOL_END:
8582 1.1 skrll case RELAX_MAYBE_UNREACHABLE:
8583 1.1 skrll case RELAX_MAYBE_DESIRE_ALIGN:
8584 1.1 skrll /* No relaxation required. */
8585 1.1 skrll break;
8586 1.1 skrll
8587 1.1 skrll case RELAX_FILL_NOP:
8588 1.1 skrll case RELAX_UNREACHABLE:
8589 1.1 skrll if (fragP->tc_frag_data.relax_seen)
8590 1.1 skrll new_stretch += relax_frag_for_align (fragP, stretch);
8591 1.1 skrll break;
8592 1.1 skrll
8593 1.1 skrll default:
8594 1.1 skrll as_bad (_("bad relaxation state"));
8595 1.1 skrll }
8596 1.1 skrll
8597 1.1 skrll /* Tell gas we need another relaxation pass. */
8598 1.1 skrll if (! fragP->tc_frag_data.relax_seen)
8599 1.1 skrll {
8600 1.1 skrll fragP->tc_frag_data.relax_seen = TRUE;
8601 1.1 skrll *stretched_p = 1;
8602 1.1 skrll }
8603 1.1 skrll
8604 1.1 skrll new_logical_line (file_name, line);
8605 1.1 skrll return new_stretch;
8606 1.1 skrll }
8607 1.1 skrll
8608 1.1 skrll
8609 1.1 skrll static long
8610 1.1 skrll relax_frag_loop_align (fragS *fragP, long stretch)
8611 1.1 skrll {
8612 1.1 skrll addressT old_address, old_next_address, old_size;
8613 1.1 skrll addressT new_address, new_next_address, new_size;
8614 1.1 skrll addressT growth;
8615 1.1 skrll
8616 1.1 skrll /* All the frags with relax_frag_for_alignment prior to this one in the
8617 1.1 skrll section have been done, hopefully eliminating the need for a NOP here.
8618 1.1 skrll But, this will put it in if necessary. */
8619 1.1 skrll
8620 1.1 skrll /* Calculate the old address of this fragment and the next fragment. */
8621 1.1 skrll old_address = fragP->fr_address - stretch;
8622 1.1 skrll old_next_address = (fragP->fr_address - stretch + fragP->fr_fix +
8623 1.1 skrll fragP->tc_frag_data.text_expansion[0]);
8624 1.1 skrll old_size = old_next_address - old_address;
8625 1.1 skrll
8626 1.1 skrll /* Calculate the new address of this fragment and the next fragment. */
8627 1.1 skrll new_address = fragP->fr_address;
8628 1.1 skrll new_next_address =
8629 1.1 skrll get_noop_aligned_address (fragP, fragP->fr_address + fragP->fr_fix);
8630 1.1 skrll new_size = new_next_address - new_address;
8631 1.1 skrll
8632 1.1 skrll growth = new_size - old_size;
8633 1.1 skrll
8634 1.1 skrll /* Fix up the text_expansion field and return the new growth. */
8635 1.1 skrll fragP->tc_frag_data.text_expansion[0] += growth;
8636 1.1 skrll return growth;
8637 1.1 skrll }
8638 1.1 skrll
8639 1.1 skrll
8640 1.1 skrll /* Add a NOP instruction. */
8641 1.1 skrll
8642 1.1 skrll static long
8643 1.1 skrll relax_frag_add_nop (fragS *fragP)
8644 1.1 skrll {
8645 1.1 skrll char *nop_buf = fragP->fr_literal + fragP->fr_fix;
8646 1.1 skrll int length = fragP->tc_frag_data.is_no_density ? 3 : 2;
8647 1.1 skrll assemble_nop (length, nop_buf);
8648 1.1 skrll fragP->tc_frag_data.is_insn = TRUE;
8649 1.1 skrll
8650 1.1 skrll if (fragP->fr_var < length)
8651 1.1 skrll {
8652 1.1 skrll as_fatal (_("fr_var (%ld) < length (%d)"), (long) fragP->fr_var, length);
8653 1.1 skrll return 0;
8654 1.1 skrll }
8655 1.1 skrll
8656 1.1 skrll fragP->fr_fix += length;
8657 1.1 skrll fragP->fr_var -= length;
8658 1.1 skrll return length;
8659 1.1 skrll }
8660 1.1 skrll
8661 1.1 skrll
8662 1.1 skrll static long future_alignment_required (fragS *, long);
8663 1.1 skrll
8664 1.1 skrll static long
8665 1.1 skrll relax_frag_for_align (fragS *fragP, long stretch)
8666 1.1 skrll {
8667 1.1 skrll /* Overview of the relaxation procedure for alignment:
8668 1.1 skrll We can widen with NOPs or by widening instructions or by filling
8669 1.1 skrll bytes after jump instructions. Find the opportune places and widen
8670 1.1 skrll them if necessary. */
8671 1.1 skrll
8672 1.1 skrll long stretch_me;
8673 1.1 skrll long diff;
8674 1.1 skrll
8675 1.1 skrll assert (fragP->fr_subtype == RELAX_FILL_NOP
8676 1.1 skrll || fragP->fr_subtype == RELAX_UNREACHABLE
8677 1.1 skrll || (fragP->fr_subtype == RELAX_SLOTS
8678 1.1 skrll && fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW));
8679 1.1 skrll
8680 1.1 skrll stretch_me = future_alignment_required (fragP, stretch);
8681 1.1 skrll diff = stretch_me - fragP->tc_frag_data.text_expansion[0];
8682 1.1 skrll if (diff == 0)
8683 1.1 skrll return 0;
8684 1.1 skrll
8685 1.1 skrll if (diff < 0)
8686 1.1 skrll {
8687 1.1 skrll /* We expanded on a previous pass. Can we shrink now? */
8688 1.1 skrll long shrink = fragP->tc_frag_data.text_expansion[0] - stretch_me;
8689 1.1 skrll if (shrink <= stretch && stretch > 0)
8690 1.1 skrll {
8691 1.1 skrll fragP->tc_frag_data.text_expansion[0] = stretch_me;
8692 1.1 skrll return -shrink;
8693 1.1 skrll }
8694 1.1 skrll return 0;
8695 1.1 skrll }
8696 1.1 skrll
8697 1.1 skrll /* Below here, diff > 0. */
8698 1.1 skrll fragP->tc_frag_data.text_expansion[0] = stretch_me;
8699 1.1 skrll
8700 1.1 skrll return diff;
8701 1.1 skrll }
8702 1.1 skrll
8703 1.1 skrll
8704 1.1 skrll /* Return the address of the next frag that should be aligned.
8705 1.1 skrll
8706 1.1 skrll By "address" we mean the address it _would_ be at if there
8707 1.1 skrll is no action taken to align it between here and the target frag.
8708 1.1 skrll In other words, if no narrows and no fill nops are used between
8709 1.1 skrll here and the frag to align, _even_if_ some of the frags we use
8710 1.1 skrll to align targets have already expanded on a previous relaxation
8711 1.1 skrll pass.
8712 1.1 skrll
8713 1.1 skrll Also, count each frag that may be used to help align the target.
8714 1.1 skrll
8715 1.1 skrll Return 0 if there are no frags left in the chain that need to be
8716 1.1 skrll aligned. */
8717 1.1 skrll
8718 1.1 skrll static addressT
8719 1.1 skrll find_address_of_next_align_frag (fragS **fragPP,
8720 1.1 skrll int *wide_nops,
8721 1.1 skrll int *narrow_nops,
8722 1.1 skrll int *widens,
8723 1.1 skrll bfd_boolean *paddable)
8724 1.1 skrll {
8725 1.1 skrll fragS *fragP = *fragPP;
8726 1.1 skrll addressT address = fragP->fr_address;
8727 1.1 skrll
8728 1.1 skrll /* Do not reset the counts to 0. */
8729 1.1 skrll
8730 1.1 skrll while (fragP)
8731 1.1 skrll {
8732 1.1 skrll /* Limit this to a small search. */
8733 1.1 skrll if (*widens >= (int) xtensa_fetch_width)
8734 1.1 skrll {
8735 1.1 skrll *fragPP = fragP;
8736 1.1 skrll return 0;
8737 1.1 skrll }
8738 1.1 skrll address += fragP->fr_fix;
8739 1.1 skrll
8740 1.1 skrll if (fragP->fr_type == rs_fill)
8741 1.1 skrll address += fragP->fr_offset * fragP->fr_var;
8742 1.1 skrll else if (fragP->fr_type == rs_machine_dependent)
8743 1.1 skrll {
8744 1.1 skrll switch (fragP->fr_subtype)
8745 1.1 skrll {
8746 1.1 skrll case RELAX_UNREACHABLE:
8747 1.1 skrll *paddable = TRUE;
8748 1.1 skrll break;
8749 1.1 skrll
8750 1.1 skrll case RELAX_FILL_NOP:
8751 1.1 skrll (*wide_nops)++;
8752 1.1 skrll if (!fragP->tc_frag_data.is_no_density)
8753 1.1 skrll (*narrow_nops)++;
8754 1.1 skrll break;
8755 1.1 skrll
8756 1.1 skrll case RELAX_SLOTS:
8757 1.1 skrll if (fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
8758 1.1 skrll {
8759 1.1 skrll (*widens)++;
8760 1.1 skrll break;
8761 1.1 skrll }
8762 1.1 skrll address += total_frag_text_expansion (fragP);;
8763 1.1 skrll break;
8764 1.1 skrll
8765 1.1 skrll case RELAX_IMMED:
8766 1.1 skrll address += fragP->tc_frag_data.text_expansion[0];
8767 1.1 skrll break;
8768 1.1 skrll
8769 1.1 skrll case RELAX_ALIGN_NEXT_OPCODE:
8770 1.1 skrll case RELAX_DESIRE_ALIGN:
8771 1.1 skrll *fragPP = fragP;
8772 1.1 skrll return address;
8773 1.1 skrll
8774 1.1 skrll case RELAX_MAYBE_UNREACHABLE:
8775 1.1 skrll case RELAX_MAYBE_DESIRE_ALIGN:
8776 1.1 skrll /* Do nothing. */
8777 1.1 skrll break;
8778 1.1 skrll
8779 1.1 skrll default:
8780 1.1 skrll /* Just punt if we don't know the type. */
8781 1.1 skrll *fragPP = fragP;
8782 1.1 skrll return 0;
8783 1.1 skrll }
8784 1.1 skrll }
8785 1.1 skrll else
8786 1.1 skrll {
8787 1.1 skrll /* Just punt if we don't know the type. */
8788 1.1 skrll *fragPP = fragP;
8789 1.1 skrll return 0;
8790 1.1 skrll }
8791 1.1 skrll fragP = fragP->fr_next;
8792 1.1 skrll }
8793 1.1 skrll
8794 1.1 skrll *fragPP = fragP;
8795 1.1 skrll return 0;
8796 1.1 skrll }
8797 1.1 skrll
8798 1.1 skrll
8799 1.1 skrll static long bytes_to_stretch (fragS *, int, int, int, int);
8800 1.1 skrll
8801 1.1 skrll static long
8802 1.1 skrll future_alignment_required (fragS *fragP, long stretch ATTRIBUTE_UNUSED)
8803 1.1 skrll {
8804 1.1 skrll fragS *this_frag = fragP;
8805 1.1 skrll long address;
8806 1.1 skrll int num_widens = 0;
8807 1.1 skrll int wide_nops = 0;
8808 1.1 skrll int narrow_nops = 0;
8809 1.1 skrll bfd_boolean paddable = FALSE;
8810 1.1 skrll offsetT local_opt_diff;
8811 1.1 skrll offsetT opt_diff;
8812 1.1 skrll offsetT max_diff;
8813 1.1 skrll int stretch_amount = 0;
8814 1.1 skrll int local_stretch_amount;
8815 1.1 skrll int global_stretch_amount;
8816 1.1 skrll
8817 1.1 skrll address = find_address_of_next_align_frag
8818 1.1 skrll (&fragP, &wide_nops, &narrow_nops, &num_widens, &paddable);
8819 1.1 skrll
8820 1.1 skrll if (!address)
8821 1.1 skrll {
8822 1.1 skrll if (this_frag->tc_frag_data.is_aligning_branch)
8823 1.1 skrll this_frag->tc_frag_data.slot_subtypes[0] = RELAX_IMMED;
8824 1.1 skrll else
8825 1.1 skrll frag_wane (this_frag);
8826 1.1 skrll }
8827 1.1 skrll else
8828 1.1 skrll {
8829 1.1 skrll local_opt_diff = get_aligned_diff (fragP, address, &max_diff);
8830 1.1 skrll opt_diff = local_opt_diff;
8831 1.1 skrll assert (opt_diff >= 0);
8832 1.1 skrll assert (max_diff >= opt_diff);
8833 1.1 skrll if (max_diff == 0)
8834 1.1 skrll return 0;
8835 1.1 skrll
8836 1.1 skrll if (fragP)
8837 1.1 skrll fragP = fragP->fr_next;
8838 1.1 skrll
8839 1.1 skrll while (fragP && opt_diff < max_diff && address)
8840 1.1 skrll {
8841 1.1 skrll /* We only use these to determine if we can exit early
8842 1.1 skrll because there will be plenty of ways to align future
8843 1.1 skrll align frags. */
8844 1.1 skrll int glob_widens = 0;
8845 1.1 skrll int dnn = 0;
8846 1.1 skrll int dw = 0;
8847 1.1 skrll bfd_boolean glob_pad = 0;
8848 1.1 skrll address = find_address_of_next_align_frag
8849 1.1 skrll (&fragP, &glob_widens, &dnn, &dw, &glob_pad);
8850 1.1 skrll /* If there is a padable portion, then skip. */
8851 1.1 skrll if (glob_pad || glob_widens >= (1 << branch_align_power (now_seg)))
8852 1.1 skrll address = 0;
8853 1.1 skrll
8854 1.1 skrll if (address)
8855 1.1 skrll {
8856 1.1 skrll offsetT next_m_diff;
8857 1.1 skrll offsetT next_o_diff;
8858 1.1 skrll
8859 1.1 skrll /* Downrange frags haven't had stretch added to them yet. */
8860 1.1 skrll address += stretch;
8861 1.1 skrll
8862 1.1 skrll /* The address also includes any text expansion from this
8863 1.1 skrll frag in a previous pass, but we don't want that. */
8864 1.1 skrll address -= this_frag->tc_frag_data.text_expansion[0];
8865 1.1 skrll
8866 1.1 skrll /* Assume we are going to move at least opt_diff. In
8867 1.1 skrll reality, we might not be able to, but assuming that
8868 1.1 skrll we will helps catch cases where moving opt_diff pushes
8869 1.1 skrll the next target from aligned to unaligned. */
8870 1.1 skrll address += opt_diff;
8871 1.1 skrll
8872 1.1 skrll next_o_diff = get_aligned_diff (fragP, address, &next_m_diff);
8873 1.1 skrll
8874 1.1 skrll /* Now cleanup for the adjustments to address. */
8875 1.1 skrll next_o_diff += opt_diff;
8876 1.1 skrll next_m_diff += opt_diff;
8877 1.1 skrll if (next_o_diff <= max_diff && next_o_diff > opt_diff)
8878 1.1 skrll opt_diff = next_o_diff;
8879 1.1 skrll if (next_m_diff < max_diff)
8880 1.1 skrll max_diff = next_m_diff;
8881 1.1 skrll fragP = fragP->fr_next;
8882 1.1 skrll }
8883 1.1 skrll }
8884 1.1 skrll
8885 1.1 skrll /* If there are enough wideners in between, do it. */
8886 1.1 skrll if (paddable)
8887 1.1 skrll {
8888 1.1 skrll if (this_frag->fr_subtype == RELAX_UNREACHABLE)
8889 1.1 skrll {
8890 1.1 skrll assert (opt_diff <= UNREACHABLE_MAX_WIDTH);
8891 1.1 skrll return opt_diff;
8892 1.1 skrll }
8893 1.1 skrll return 0;
8894 1.1 skrll }
8895 1.1 skrll local_stretch_amount
8896 1.1 skrll = bytes_to_stretch (this_frag, wide_nops, narrow_nops,
8897 1.1 skrll num_widens, local_opt_diff);
8898 1.1 skrll global_stretch_amount
8899 1.1 skrll = bytes_to_stretch (this_frag, wide_nops, narrow_nops,
8900 1.1 skrll num_widens, opt_diff);
8901 1.1 skrll /* If the condition below is true, then the frag couldn't
8902 1.1 skrll stretch the correct amount for the global case, so we just
8903 1.1 skrll optimize locally. We'll rely on the subsequent frags to get
8904 1.1 skrll the correct alignment in the global case. */
8905 1.1 skrll if (global_stretch_amount < local_stretch_amount)
8906 1.1 skrll stretch_amount = local_stretch_amount;
8907 1.1 skrll else
8908 1.1 skrll stretch_amount = global_stretch_amount;
8909 1.1 skrll
8910 1.1 skrll if (this_frag->fr_subtype == RELAX_SLOTS
8911 1.1 skrll && this_frag->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
8912 1.1 skrll assert (stretch_amount <= 1);
8913 1.1 skrll else if (this_frag->fr_subtype == RELAX_FILL_NOP)
8914 1.1 skrll {
8915 1.1 skrll if (this_frag->tc_frag_data.is_no_density)
8916 1.1 skrll assert (stretch_amount == 3 || stretch_amount == 0);
8917 1.1 skrll else
8918 1.1 skrll assert (stretch_amount <= 3);
8919 1.1 skrll }
8920 1.1 skrll }
8921 1.1 skrll return stretch_amount;
8922 1.1 skrll }
8923 1.1 skrll
8924 1.1 skrll
8925 1.1 skrll /* The idea: widen everything you can to get a target or loop aligned,
8926 1.1 skrll then start using NOPs.
8927 1.1 skrll
8928 1.1 skrll When we must have a NOP, here is a table of how we decide
8929 1.1 skrll (so you don't have to fight through the control flow below):
8930 1.1 skrll
8931 1.1 skrll wide_nops = the number of wide NOPs available for aligning
8932 1.1 skrll narrow_nops = the number of narrow NOPs available for aligning
8933 1.1 skrll (a subset of wide_nops)
8934 1.1 skrll widens = the number of narrow instructions that should be widened
8935 1.1 skrll
8936 1.1 skrll Desired wide narrow
8937 1.1 skrll Diff nop nop widens
8938 1.1 skrll 1 0 0 1
8939 1.1 skrll 2 0 1 0
8940 1.1 skrll 3a 1 0 0
8941 1.1 skrll b 0 1 1 (case 3a makes this case unnecessary)
8942 1.1 skrll 4a 1 0 1
8943 1.1 skrll b 0 2 0
8944 1.1 skrll c 0 1 2 (case 4a makes this case unnecessary)
8945 1.1 skrll 5a 1 0 2
8946 1.1 skrll b 1 1 0
8947 1.1 skrll c 0 2 1 (case 5b makes this case unnecessary)
8948 1.1 skrll 6a 2 0 0
8949 1.1 skrll b 1 0 3
8950 1.1 skrll c 0 1 4 (case 6b makes this case unnecessary)
8951 1.1 skrll d 1 1 1 (case 6a makes this case unnecessary)
8952 1.1 skrll e 0 2 2 (case 6a makes this case unnecessary)
8953 1.1 skrll f 0 3 0 (case 6a makes this case unnecessary)
8954 1.1 skrll 7a 1 0 4
8955 1.1 skrll b 2 0 1
8956 1.1 skrll c 1 1 2 (case 7b makes this case unnecessary)
8957 1.1 skrll d 0 1 5 (case 7a makes this case unnecessary)
8958 1.1 skrll e 0 2 3 (case 7b makes this case unnecessary)
8959 1.1 skrll f 0 3 1 (case 7b makes this case unnecessary)
8960 1.1 skrll g 1 2 1 (case 7b makes this case unnecessary)
8961 1.1 skrll */
8962 1.1 skrll
8963 1.1 skrll static long
8964 1.1 skrll bytes_to_stretch (fragS *this_frag,
8965 1.1 skrll int wide_nops,
8966 1.1 skrll int narrow_nops,
8967 1.1 skrll int num_widens,
8968 1.1 skrll int desired_diff)
8969 1.1 skrll {
8970 1.1 skrll int bytes_short = desired_diff - num_widens;
8971 1.1 skrll
8972 1.1 skrll assert (desired_diff >= 0 && desired_diff < 8);
8973 1.1 skrll if (desired_diff == 0)
8974 1.1 skrll return 0;
8975 1.1 skrll
8976 1.1 skrll assert (wide_nops > 0 || num_widens > 0);
8977 1.1 skrll
8978 1.1 skrll /* Always prefer widening to NOP-filling. */
8979 1.1 skrll if (bytes_short < 0)
8980 1.1 skrll {
8981 1.1 skrll /* There are enough RELAX_NARROW frags after this one
8982 1.1 skrll to align the target without widening this frag in any way. */
8983 1.1 skrll return 0;
8984 1.1 skrll }
8985 1.1 skrll
8986 1.1 skrll if (bytes_short == 0)
8987 1.1 skrll {
8988 1.1 skrll /* Widen every narrow between here and the align target
8989 1.1 skrll and the align target will be properly aligned. */
8990 1.1 skrll if (this_frag->fr_subtype == RELAX_FILL_NOP)
8991 1.1 skrll return 0;
8992 1.1 skrll else
8993 1.1 skrll return 1;
8994 1.1 skrll }
8995 1.1 skrll
8996 1.1 skrll /* From here we will need at least one NOP to get an alignment.
8997 1.1 skrll However, we may not be able to align at all, in which case,
8998 1.1 skrll don't widen. */
8999 1.1 skrll if (this_frag->fr_subtype == RELAX_FILL_NOP)
9000 1.1 skrll {
9001 1.1 skrll switch (desired_diff)
9002 1.1 skrll {
9003 1.1 skrll case 1:
9004 1.1 skrll return 0;
9005 1.1 skrll case 2:
9006 1.1 skrll if (!this_frag->tc_frag_data.is_no_density && narrow_nops == 1)
9007 1.1 skrll return 2; /* case 2 */
9008 1.1 skrll return 0;
9009 1.1 skrll case 3:
9010 1.1 skrll if (wide_nops > 1)
9011 1.1 skrll return 0;
9012 1.1 skrll else
9013 1.1 skrll return 3; /* case 3a */
9014 1.1 skrll case 4:
9015 1.1 skrll if (num_widens >= 1 && wide_nops == 1)
9016 1.1 skrll return 3; /* case 4a */
9017 1.1 skrll if (!this_frag->tc_frag_data.is_no_density && narrow_nops == 2)
9018 1.1 skrll return 2; /* case 4b */
9019 1.1 skrll return 0;
9020 1.1 skrll case 5:
9021 1.1 skrll if (num_widens >= 2 && wide_nops == 1)
9022 1.1 skrll return 3; /* case 5a */
9023 1.1 skrll /* We will need two nops. Are there enough nops
9024 1.1 skrll between here and the align target? */
9025 1.1 skrll if (wide_nops < 2 || narrow_nops == 0)
9026 1.1 skrll return 0;
9027 1.1 skrll /* Are there other nops closer that can serve instead? */
9028 1.1 skrll if (wide_nops > 2 && narrow_nops > 1)
9029 1.1 skrll return 0;
9030 1.1 skrll /* Take the density one first, because there might not be
9031 1.1 skrll another density one available. */
9032 1.1 skrll if (!this_frag->tc_frag_data.is_no_density)
9033 1.1 skrll return 2; /* case 5b narrow */
9034 1.1 skrll else
9035 1.1 skrll return 3; /* case 5b wide */
9036 1.1 skrll return 0;
9037 1.1 skrll case 6:
9038 1.1 skrll if (wide_nops == 2)
9039 1.1 skrll return 3; /* case 6a */
9040 1.1 skrll else if (num_widens >= 3 && wide_nops == 1)
9041 1.1 skrll return 3; /* case 6b */
9042 1.1 skrll return 0;
9043 1.1 skrll case 7:
9044 1.1 skrll if (wide_nops == 1 && num_widens >= 4)
9045 1.1 skrll return 3; /* case 7a */
9046 1.1 skrll else if (wide_nops == 2 && num_widens >= 1)
9047 1.1 skrll return 3; /* case 7b */
9048 1.1 skrll return 0;
9049 1.1 skrll default:
9050 1.1 skrll assert (0);
9051 1.1 skrll }
9052 1.1 skrll }
9053 1.1 skrll else
9054 1.1 skrll {
9055 1.1 skrll /* We will need a NOP no matter what, but should we widen
9056 1.1 skrll this instruction to help?
9057 1.1 skrll
9058 1.1 skrll This is a RELAX_NARROW frag. */
9059 1.1 skrll switch (desired_diff)
9060 1.1 skrll {
9061 1.1 skrll case 1:
9062 1.1 skrll assert (0);
9063 1.1 skrll return 0;
9064 1.1 skrll case 2:
9065 1.1 skrll case 3:
9066 1.1 skrll return 0;
9067 1.1 skrll case 4:
9068 1.1 skrll if (wide_nops >= 1 && num_widens == 1)
9069 1.1 skrll return 1; /* case 4a */
9070 1.1 skrll return 0;
9071 1.1 skrll case 5:
9072 1.1 skrll if (wide_nops >= 1 && num_widens == 2)
9073 1.1 skrll return 1; /* case 5a */
9074 1.1 skrll return 0;
9075 1.1 skrll case 6:
9076 1.1 skrll if (wide_nops >= 2)
9077 1.1 skrll return 0; /* case 6a */
9078 1.1 skrll else if (wide_nops >= 1 && num_widens == 3)
9079 1.1 skrll return 1; /* case 6b */
9080 1.1 skrll return 0;
9081 1.1 skrll case 7:
9082 1.1 skrll if (wide_nops >= 1 && num_widens == 4)
9083 1.1 skrll return 1; /* case 7a */
9084 1.1 skrll else if (wide_nops >= 2 && num_widens == 1)
9085 1.1 skrll return 1; /* case 7b */
9086 1.1 skrll return 0;
9087 1.1 skrll default:
9088 1.1 skrll assert (0);
9089 1.1 skrll return 0;
9090 1.1 skrll }
9091 1.1 skrll }
9092 1.1 skrll assert (0);
9093 1.1 skrll return 0;
9094 1.1 skrll }
9095 1.1 skrll
9096 1.1 skrll
9097 1.1 skrll static long
9098 1.1 skrll relax_frag_immed (segT segP,
9099 1.1 skrll fragS *fragP,
9100 1.1 skrll long stretch,
9101 1.1 skrll int min_steps,
9102 1.1 skrll xtensa_format fmt,
9103 1.1 skrll int slot,
9104 1.1 skrll int *stretched_p,
9105 1.1 skrll bfd_boolean estimate_only)
9106 1.1 skrll {
9107 1.1 skrll TInsn tinsn;
9108 1.1 skrll int old_size;
9109 1.1 skrll bfd_boolean negatable_branch = FALSE;
9110 1.1 skrll bfd_boolean branch_jmp_to_next = FALSE;
9111 1.1 skrll bfd_boolean from_wide_insn = FALSE;
9112 1.1 skrll xtensa_isa isa = xtensa_default_isa;
9113 1.1 skrll IStack istack;
9114 1.1 skrll offsetT frag_offset;
9115 1.1 skrll int num_steps;
9116 1.1 skrll int num_text_bytes, num_literal_bytes;
9117 1.1 skrll int literal_diff, total_text_diff, this_text_diff;
9118 1.1 skrll
9119 1.1 skrll assert (fragP->fr_opcode != NULL);
9120 1.1 skrll
9121 1.1 skrll xg_clear_vinsn (&cur_vinsn);
9122 1.1 skrll vinsn_from_chars (&cur_vinsn, fragP->fr_opcode);
9123 1.1 skrll if (cur_vinsn.num_slots > 1)
9124 1.1 skrll from_wide_insn = TRUE;
9125 1.1 skrll
9126 1.1 skrll tinsn = cur_vinsn.slots[slot];
9127 1.1 skrll tinsn_immed_from_frag (&tinsn, fragP, slot);
9128 1.1 skrll
9129 1.1 skrll if (estimate_only && xtensa_opcode_is_loop (isa, tinsn.opcode) == 1)
9130 1.1 skrll return 0;
9131 1.1 skrll
9132 1.1 skrll if (workaround_b_j_loop_end && ! fragP->tc_frag_data.is_no_transform)
9133 1.1 skrll branch_jmp_to_next = is_branch_jmp_to_next (&tinsn, fragP);
9134 1.1 skrll
9135 1.1 skrll negatable_branch = (xtensa_opcode_is_branch (isa, tinsn.opcode) == 1);
9136 1.1 skrll
9137 1.1 skrll old_size = xtensa_format_length (isa, fmt);
9138 1.1 skrll
9139 1.1 skrll /* Special case: replace a branch to the next instruction with a NOP.
9140 1.1 skrll This is required to work around a hardware bug in T1040.0 and also
9141 1.1 skrll serves as an optimization. */
9142 1.1 skrll
9143 1.1 skrll if (branch_jmp_to_next
9144 1.1 skrll && ((old_size == 2) || (old_size == 3))
9145 1.1 skrll && !next_frag_is_loop_target (fragP))
9146 1.1 skrll return 0;
9147 1.1 skrll
9148 1.1 skrll /* Here is the fun stuff: Get the immediate field from this
9149 1.1 skrll instruction. If it fits, we are done. If not, find the next
9150 1.1 skrll instruction sequence that fits. */
9151 1.1 skrll
9152 1.1 skrll frag_offset = fragP->fr_opcode - fragP->fr_literal;
9153 1.1 skrll istack_init (&istack);
9154 1.1 skrll num_steps = xg_assembly_relax (&istack, &tinsn, segP, fragP, frag_offset,
9155 1.1 skrll min_steps, stretch);
9156 1.1 skrll assert (num_steps >= min_steps && num_steps <= RELAX_IMMED_MAXSTEPS);
9157 1.1 skrll
9158 1.1 skrll fragP->tc_frag_data.slot_subtypes[slot] = (int) RELAX_IMMED + num_steps;
9159 1.1 skrll
9160 1.1 skrll /* Figure out the number of bytes needed. */
9161 1.1 skrll num_literal_bytes = get_num_stack_literal_bytes (&istack);
9162 1.1 skrll literal_diff
9163 1.1 skrll = num_literal_bytes - fragP->tc_frag_data.literal_expansion[slot];
9164 1.1 skrll num_text_bytes = get_num_stack_text_bytes (&istack);
9165 1.1 skrll
9166 1.1 skrll if (from_wide_insn)
9167 1.1 skrll {
9168 1.1 skrll int first = 0;
9169 1.1 skrll while (istack.insn[first].opcode == XTENSA_UNDEFINED)
9170 1.1 skrll first++;
9171 1.1 skrll
9172 1.1 skrll num_text_bytes += old_size;
9173 1.1 skrll if (opcode_fits_format_slot (istack.insn[first].opcode, fmt, slot))
9174 1.1 skrll num_text_bytes -= xg_get_single_size (istack.insn[first].opcode);
9175 1.1 skrll else
9176 1.1 skrll {
9177 1.1 skrll /* The first instruction in the relaxed sequence will go after
9178 1.1 skrll the current wide instruction, and thus its symbolic immediates
9179 1.1 skrll might not fit. */
9180 1.1 skrll
9181 1.1 skrll istack_init (&istack);
9182 1.1 skrll num_steps = xg_assembly_relax (&istack, &tinsn, segP, fragP,
9183 1.1 skrll frag_offset + old_size,
9184 1.1 skrll min_steps, stretch + old_size);
9185 1.1 skrll assert (num_steps >= min_steps && num_steps <= RELAX_IMMED_MAXSTEPS);
9186 1.1 skrll
9187 1.1 skrll fragP->tc_frag_data.slot_subtypes[slot]
9188 1.1 skrll = (int) RELAX_IMMED + num_steps;
9189 1.1 skrll
9190 1.1 skrll num_literal_bytes = get_num_stack_literal_bytes (&istack);
9191 1.1 skrll literal_diff
9192 1.1 skrll = num_literal_bytes - fragP->tc_frag_data.literal_expansion[slot];
9193 1.1 skrll
9194 1.1 skrll num_text_bytes = get_num_stack_text_bytes (&istack) + old_size;
9195 1.1 skrll }
9196 1.1 skrll }
9197 1.1 skrll
9198 1.1 skrll total_text_diff = num_text_bytes - old_size;
9199 1.1 skrll this_text_diff = total_text_diff - fragP->tc_frag_data.text_expansion[slot];
9200 1.1 skrll
9201 1.1 skrll /* It MUST get larger. If not, we could get an infinite loop. */
9202 1.1 skrll assert (num_text_bytes >= 0);
9203 1.1 skrll assert (literal_diff >= 0);
9204 1.1 skrll assert (total_text_diff >= 0);
9205 1.1 skrll
9206 1.1 skrll fragP->tc_frag_data.text_expansion[slot] = total_text_diff;
9207 1.1 skrll fragP->tc_frag_data.literal_expansion[slot] = num_literal_bytes;
9208 1.1 skrll assert (fragP->tc_frag_data.text_expansion[slot] >= 0);
9209 1.1 skrll assert (fragP->tc_frag_data.literal_expansion[slot] >= 0);
9210 1.1 skrll
9211 1.1 skrll /* Find the associated expandable literal for this. */
9212 1.1 skrll if (literal_diff != 0)
9213 1.1 skrll {
9214 1.1 skrll fragS *lit_fragP = fragP->tc_frag_data.literal_frags[slot];
9215 1.1 skrll if (lit_fragP)
9216 1.1 skrll {
9217 1.1 skrll assert (literal_diff == 4);
9218 1.1 skrll lit_fragP->tc_frag_data.unreported_expansion += literal_diff;
9219 1.1 skrll
9220 1.1 skrll /* We expect that the literal section state has NOT been
9221 1.1 skrll modified yet. */
9222 1.1 skrll assert (lit_fragP->fr_type == rs_machine_dependent
9223 1.1 skrll && lit_fragP->fr_subtype == RELAX_LITERAL);
9224 1.1 skrll lit_fragP->fr_subtype = RELAX_LITERAL_NR;
9225 1.1 skrll
9226 1.1 skrll /* We need to mark this section for another iteration
9227 1.1 skrll of relaxation. */
9228 1.1 skrll (*stretched_p)++;
9229 1.1 skrll }
9230 1.1 skrll }
9231 1.1 skrll
9232 1.1 skrll if (negatable_branch && istack.ninsn > 1)
9233 1.1 skrll update_next_frag_state (fragP);
9234 1.1 skrll
9235 1.1 skrll return this_text_diff;
9236 1.1 skrll }
9237 1.1 skrll
9238 1.1 skrll
9239 1.1 skrll /* md_convert_frag Hook and Helper Functions. */
9241 1.1 skrll
9242 1.1 skrll static void convert_frag_align_next_opcode (fragS *);
9243 1.1 skrll static void convert_frag_narrow (segT, fragS *, xtensa_format, int);
9244 1.1 skrll static void convert_frag_fill_nop (fragS *);
9245 1.1 skrll static void convert_frag_immed (segT, fragS *, int, xtensa_format, int);
9246 1.1 skrll
9247 1.1 skrll void
9248 1.1 skrll md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec, fragS *fragp)
9249 1.1 skrll {
9250 1.1 skrll static xtensa_insnbuf vbuf = NULL;
9251 1.1 skrll xtensa_isa isa = xtensa_default_isa;
9252 1.1 skrll int slot;
9253 1.1 skrll int num_slots;
9254 1.1 skrll xtensa_format fmt;
9255 1.1 skrll char *file_name;
9256 1.1 skrll unsigned line;
9257 1.1 skrll
9258 1.1 skrll as_where (&file_name, &line);
9259 1.1 skrll new_logical_line (fragp->fr_file, fragp->fr_line);
9260 1.1 skrll
9261 1.1 skrll switch (fragp->fr_subtype)
9262 1.1 skrll {
9263 1.1 skrll case RELAX_ALIGN_NEXT_OPCODE:
9264 1.1 skrll /* Always convert. */
9265 1.1 skrll convert_frag_align_next_opcode (fragp);
9266 1.1 skrll break;
9267 1.1 skrll
9268 1.1 skrll case RELAX_DESIRE_ALIGN:
9269 1.1 skrll /* Do nothing. If not aligned already, too bad. */
9270 1.1 skrll break;
9271 1.1 skrll
9272 1.1 skrll case RELAX_LITERAL:
9273 1.1 skrll case RELAX_LITERAL_FINAL:
9274 1.1 skrll break;
9275 1.1 skrll
9276 1.1 skrll case RELAX_SLOTS:
9277 1.1 skrll if (vbuf == NULL)
9278 1.1 skrll vbuf = xtensa_insnbuf_alloc (isa);
9279 1.1 skrll
9280 1.1 skrll xtensa_insnbuf_from_chars
9281 1.1 skrll (isa, vbuf, (unsigned char *) fragp->fr_opcode, 0);
9282 1.1 skrll fmt = xtensa_format_decode (isa, vbuf);
9283 1.1 skrll num_slots = xtensa_format_num_slots (isa, fmt);
9284 1.1 skrll
9285 1.1 skrll for (slot = 0; slot < num_slots; slot++)
9286 1.1 skrll {
9287 1.1 skrll switch (fragp->tc_frag_data.slot_subtypes[slot])
9288 1.1 skrll {
9289 1.1 skrll case RELAX_NARROW:
9290 1.1 skrll convert_frag_narrow (sec, fragp, fmt, slot);
9291 1.1 skrll break;
9292 1.1 skrll
9293 1.1 skrll case RELAX_IMMED:
9294 1.1 skrll case RELAX_IMMED_STEP1:
9295 1.1 skrll case RELAX_IMMED_STEP2:
9296 1.1 skrll case RELAX_IMMED_STEP3:
9297 1.1 skrll /* Place the immediate. */
9298 1.1 skrll convert_frag_immed
9299 1.1 skrll (sec, fragp,
9300 1.1 skrll fragp->tc_frag_data.slot_subtypes[slot] - RELAX_IMMED,
9301 1.1 skrll fmt, slot);
9302 1.1 skrll break;
9303 1.1 skrll
9304 1.1 skrll default:
9305 1.1 skrll /* This is OK because some slots could have
9306 1.1 skrll relaxations and others have none. */
9307 1.1 skrll break;
9308 1.1 skrll }
9309 1.1 skrll }
9310 1.1 skrll break;
9311 1.1 skrll
9312 1.1 skrll case RELAX_UNREACHABLE:
9313 1.1 skrll memset (&fragp->fr_literal[fragp->fr_fix], 0, fragp->fr_var);
9314 1.1 skrll fragp->fr_fix += fragp->tc_frag_data.text_expansion[0];
9315 1.1 skrll fragp->fr_var -= fragp->tc_frag_data.text_expansion[0];
9316 1.1 skrll frag_wane (fragp);
9317 1.1 skrll break;
9318 1.1 skrll
9319 1.1 skrll case RELAX_MAYBE_UNREACHABLE:
9320 1.1 skrll case RELAX_MAYBE_DESIRE_ALIGN:
9321 1.1 skrll frag_wane (fragp);
9322 1.1 skrll break;
9323 1.1 skrll
9324 1.1 skrll case RELAX_FILL_NOP:
9325 1.1 skrll convert_frag_fill_nop (fragp);
9326 1.1 skrll break;
9327 1.1 skrll
9328 1.1 skrll case RELAX_LITERAL_NR:
9329 1.1 skrll if (use_literal_section)
9330 1.1 skrll {
9331 1.1 skrll /* This should have been handled during relaxation. When
9332 1.1 skrll relaxing a code segment, literals sometimes need to be
9333 1.1 skrll added to the corresponding literal segment. If that
9334 1.1 skrll literal segment has already been relaxed, then we end up
9335 1.1 skrll in this situation. Marking the literal segments as data
9336 1.1 skrll would make this happen less often (since GAS always relaxes
9337 1.1 skrll code before data), but we could still get into trouble if
9338 1.1 skrll there are instructions in a segment that is not marked as
9339 1.1 skrll containing code. Until we can implement a better solution,
9340 1.1 skrll cheat and adjust the addresses of all the following frags.
9341 1.1 skrll This could break subsequent alignments, but the linker's
9342 1.1 skrll literal coalescing will do that anyway. */
9343 1.1 skrll
9344 1.1 skrll fragS *f;
9345 1.1 skrll fragp->fr_subtype = RELAX_LITERAL_FINAL;
9346 1.1 skrll assert (fragp->tc_frag_data.unreported_expansion == 4);
9347 1.1 skrll memset (&fragp->fr_literal[fragp->fr_fix], 0, 4);
9348 1.1 skrll fragp->fr_var -= 4;
9349 1.1 skrll fragp->fr_fix += 4;
9350 1.1 skrll for (f = fragp->fr_next; f; f = f->fr_next)
9351 1.1 skrll f->fr_address += 4;
9352 1.1 skrll }
9353 1.1 skrll else
9354 1.1 skrll as_bad (_("invalid relaxation fragment result"));
9355 1.1 skrll break;
9356 1.1 skrll }
9357 1.1 skrll
9358 1.1 skrll fragp->fr_var = 0;
9359 1.1 skrll new_logical_line (file_name, line);
9360 1.1 skrll }
9361 1.1 skrll
9362 1.1 skrll
9363 1.1 skrll static void
9364 1.1 skrll convert_frag_align_next_opcode (fragS *fragp)
9365 1.1 skrll {
9366 1.1 skrll char *nop_buf; /* Location for Writing. */
9367 1.1 skrll bfd_boolean use_no_density = fragp->tc_frag_data.is_no_density;
9368 1.1 skrll addressT aligned_address;
9369 1.1 skrll offsetT fill_size;
9370 1.1 skrll int nop, nop_count;
9371 1.1 skrll
9372 1.1 skrll aligned_address = get_noop_aligned_address (fragp, fragp->fr_address +
9373 1.1 skrll fragp->fr_fix);
9374 1.1 skrll fill_size = aligned_address - (fragp->fr_address + fragp->fr_fix);
9375 1.1 skrll nop_count = get_text_align_nop_count (fill_size, use_no_density);
9376 1.1 skrll nop_buf = fragp->fr_literal + fragp->fr_fix;
9377 1.1 skrll
9378 1.1 skrll for (nop = 0; nop < nop_count; nop++)
9379 1.1 skrll {
9380 1.1 skrll int nop_size;
9381 1.1 skrll nop_size = get_text_align_nth_nop_size (fill_size, nop, use_no_density);
9382 1.1 skrll
9383 1.1 skrll assemble_nop (nop_size, nop_buf);
9384 1.1 skrll nop_buf += nop_size;
9385 1.1 skrll }
9386 1.1 skrll
9387 1.1 skrll fragp->fr_fix += fill_size;
9388 1.1 skrll fragp->fr_var -= fill_size;
9389 1.1 skrll }
9390 1.1 skrll
9391 1.1 skrll
9392 1.1 skrll static void
9393 1.1 skrll convert_frag_narrow (segT segP, fragS *fragP, xtensa_format fmt, int slot)
9394 1.1 skrll {
9395 1.1 skrll TInsn tinsn, single_target;
9396 1.1 skrll int size, old_size, diff;
9397 1.1 skrll offsetT frag_offset;
9398 1.1 skrll
9399 1.1 skrll assert (slot == 0);
9400 1.1 skrll tinsn_from_chars (&tinsn, fragP->fr_opcode, 0);
9401 1.1 skrll
9402 1.1 skrll if (fragP->tc_frag_data.is_aligning_branch == 1)
9403 1.1 skrll {
9404 1.1 skrll assert (fragP->tc_frag_data.text_expansion[0] == 1
9405 1.1 skrll || fragP->tc_frag_data.text_expansion[0] == 0);
9406 1.1 skrll convert_frag_immed (segP, fragP, fragP->tc_frag_data.text_expansion[0],
9407 1.1 skrll fmt, slot);
9408 1.1 skrll return;
9409 1.1 skrll }
9410 1.1 skrll
9411 1.1 skrll if (fragP->tc_frag_data.text_expansion[0] == 0)
9412 1.1 skrll {
9413 1.1 skrll /* No conversion. */
9414 1.1 skrll fragP->fr_var = 0;
9415 1.1 skrll return;
9416 1.1 skrll }
9417 1.1 skrll
9418 1.1 skrll assert (fragP->fr_opcode != NULL);
9419 1.1 skrll
9420 1.1 skrll /* Frags in this relaxation state should only contain
9421 1.1 skrll single instruction bundles. */
9422 1.1 skrll tinsn_immed_from_frag (&tinsn, fragP, 0);
9423 1.1 skrll
9424 1.1 skrll /* Just convert it to a wide form.... */
9425 1.1 skrll size = 0;
9426 1.1 skrll old_size = xg_get_single_size (tinsn.opcode);
9427 1.1 skrll
9428 1.1 skrll tinsn_init (&single_target);
9429 1.1 skrll frag_offset = fragP->fr_opcode - fragP->fr_literal;
9430 1.1 skrll
9431 1.1 skrll if (! xg_is_single_relaxable_insn (&tinsn, &single_target, FALSE))
9432 1.1 skrll {
9433 1.1 skrll as_bad (_("unable to widen instruction"));
9434 1.1 skrll return;
9435 1.1 skrll }
9436 1.1 skrll
9437 1.1 skrll size = xg_get_single_size (single_target.opcode);
9438 1.1 skrll xg_emit_insn_to_buf (&single_target, fragP->fr_opcode, fragP,
9439 1.1 skrll frag_offset, TRUE);
9440 1.1 skrll
9441 1.1 skrll diff = size - old_size;
9442 1.1 skrll assert (diff >= 0);
9443 1.1 skrll assert (diff <= fragP->fr_var);
9444 1.1 skrll fragP->fr_var -= diff;
9445 1.1 skrll fragP->fr_fix += diff;
9446 1.1 skrll
9447 1.1 skrll /* clean it up */
9448 1.1 skrll fragP->fr_var = 0;
9449 1.1 skrll }
9450 1.1 skrll
9451 1.1 skrll
9452 1.1 skrll static void
9453 1.1 skrll convert_frag_fill_nop (fragS *fragP)
9454 1.1 skrll {
9455 1.1 skrll char *loc = &fragP->fr_literal[fragP->fr_fix];
9456 1.1 skrll int size = fragP->tc_frag_data.text_expansion[0];
9457 1.1 skrll assert ((unsigned) size == (fragP->fr_next->fr_address
9458 1.1 skrll - fragP->fr_address - fragP->fr_fix));
9459 1.1 skrll if (size == 0)
9460 1.1 skrll {
9461 1.1 skrll /* No conversion. */
9462 1.1 skrll fragP->fr_var = 0;
9463 1.1 skrll return;
9464 1.1 skrll }
9465 1.1 skrll assemble_nop (size, loc);
9466 1.1 skrll fragP->tc_frag_data.is_insn = TRUE;
9467 1.1 skrll fragP->fr_var -= size;
9468 1.1 skrll fragP->fr_fix += size;
9469 1.1 skrll frag_wane (fragP);
9470 1.1 skrll }
9471 1.1 skrll
9472 1.1 skrll
9473 1.1 skrll static fixS *fix_new_exp_in_seg
9474 1.1 skrll (segT, subsegT, fragS *, int, int, expressionS *, int,
9475 1.1 skrll bfd_reloc_code_real_type);
9476 1.1 skrll static void convert_frag_immed_finish_loop (segT, fragS *, TInsn *);
9477 1.1 skrll
9478 1.1 skrll static void
9479 1.1 skrll convert_frag_immed (segT segP,
9480 1.1 skrll fragS *fragP,
9481 1.1 skrll int min_steps,
9482 1.1 skrll xtensa_format fmt,
9483 1.1 skrll int slot)
9484 1.1 skrll {
9485 1.1 skrll char *immed_instr = fragP->fr_opcode;
9486 1.1 skrll TInsn orig_tinsn;
9487 1.1 skrll bfd_boolean expanded = FALSE;
9488 1.1 skrll bfd_boolean branch_jmp_to_next = FALSE;
9489 1.1 skrll char *fr_opcode = fragP->fr_opcode;
9490 1.1 skrll xtensa_isa isa = xtensa_default_isa;
9491 1.1 skrll bfd_boolean from_wide_insn = FALSE;
9492 1.1 skrll int bytes;
9493 1.1 skrll bfd_boolean is_loop;
9494 1.1 skrll
9495 1.1 skrll assert (fr_opcode != NULL);
9496 1.1 skrll
9497 1.1 skrll xg_clear_vinsn (&cur_vinsn);
9498 1.1 skrll
9499 1.1 skrll vinsn_from_chars (&cur_vinsn, fr_opcode);
9500 1.1 skrll if (cur_vinsn.num_slots > 1)
9501 1.1 skrll from_wide_insn = TRUE;
9502 1.1 skrll
9503 1.1 skrll orig_tinsn = cur_vinsn.slots[slot];
9504 1.1 skrll tinsn_immed_from_frag (&orig_tinsn, fragP, slot);
9505 1.1 skrll
9506 1.1 skrll is_loop = xtensa_opcode_is_loop (xtensa_default_isa, orig_tinsn.opcode) == 1;
9507 1.1 skrll
9508 1.1 skrll if (workaround_b_j_loop_end && ! fragP->tc_frag_data.is_no_transform)
9509 1.1 skrll branch_jmp_to_next = is_branch_jmp_to_next (&orig_tinsn, fragP);
9510 1.1 skrll
9511 1.1 skrll if (branch_jmp_to_next && !next_frag_is_loop_target (fragP))
9512 1.1 skrll {
9513 1.1 skrll /* Conversion just inserts a NOP and marks the fix as completed. */
9514 1.1 skrll bytes = xtensa_format_length (isa, fmt);
9515 1.1 skrll if (bytes >= 4)
9516 1.1 skrll {
9517 1.1 skrll cur_vinsn.slots[slot].opcode =
9518 1.1 skrll xtensa_format_slot_nop_opcode (isa, cur_vinsn.format, slot);
9519 1.1 skrll cur_vinsn.slots[slot].ntok = 0;
9520 1.1 skrll }
9521 1.1 skrll else
9522 1.1 skrll {
9523 1.1 skrll bytes += fragP->tc_frag_data.text_expansion[0];
9524 1.1 skrll assert (bytes == 2 || bytes == 3);
9525 1.1 skrll build_nop (&cur_vinsn.slots[0], bytes);
9526 1.1 skrll fragP->fr_fix += fragP->tc_frag_data.text_expansion[0];
9527 1.1 skrll }
9528 1.1 skrll vinsn_to_insnbuf (&cur_vinsn, fr_opcode, frag_now, TRUE);
9529 1.1 skrll xtensa_insnbuf_to_chars
9530 1.1 skrll (isa, cur_vinsn.insnbuf, (unsigned char *) fr_opcode, 0);
9531 1.1 skrll fragP->fr_var = 0;
9532 1.1 skrll }
9533 1.1 skrll else
9534 1.1 skrll {
9535 1.1 skrll /* Here is the fun stuff: Get the immediate field from this
9536 1.1 skrll instruction. If it fits, we're done. If not, find the next
9537 1.1 skrll instruction sequence that fits. */
9538 1.1 skrll
9539 1.1 skrll IStack istack;
9540 1.1 skrll int i;
9541 1.1 skrll symbolS *lit_sym = NULL;
9542 1.1 skrll int total_size = 0;
9543 1.1 skrll int target_offset = 0;
9544 1.1 skrll int old_size;
9545 1.1 skrll int diff;
9546 1.1 skrll symbolS *gen_label = NULL;
9547 1.1 skrll offsetT frag_offset;
9548 1.1 skrll bfd_boolean first = TRUE;
9549 1.1 skrll bfd_boolean last_is_jump;
9550 1.1 skrll
9551 1.1 skrll /* It does not fit. Find something that does and
9552 1.1 skrll convert immediately. */
9553 1.1 skrll frag_offset = fr_opcode - fragP->fr_literal;
9554 1.1 skrll istack_init (&istack);
9555 1.1 skrll xg_assembly_relax (&istack, &orig_tinsn,
9556 1.1 skrll segP, fragP, frag_offset, min_steps, 0);
9557 1.1 skrll
9558 1.1 skrll old_size = xtensa_format_length (isa, fmt);
9559 1.1 skrll
9560 1.1 skrll /* Assemble this right inline. */
9561 1.1 skrll
9562 1.1 skrll /* First, create the mapping from a label name to the REAL label. */
9563 1.1 skrll target_offset = 0;
9564 1.1 skrll for (i = 0; i < istack.ninsn; i++)
9565 1.1 skrll {
9566 1.1 skrll TInsn *tinsn = &istack.insn[i];
9567 1.1 skrll fragS *lit_frag;
9568 1.1 skrll
9569 1.1 skrll switch (tinsn->insn_type)
9570 1.1 skrll {
9571 1.1 skrll case ITYPE_LITERAL:
9572 1.1 skrll if (lit_sym != NULL)
9573 1.1 skrll as_bad (_("multiple literals in expansion"));
9574 1.1 skrll /* First find the appropriate space in the literal pool. */
9575 1.1 skrll lit_frag = fragP->tc_frag_data.literal_frags[slot];
9576 1.1 skrll if (lit_frag == NULL)
9577 1.1 skrll as_bad (_("no registered fragment for literal"));
9578 1.1 skrll if (tinsn->ntok != 1)
9579 1.1 skrll as_bad (_("number of literal tokens != 1"));
9580 1.1 skrll
9581 1.1 skrll /* Set the literal symbol and add a fixup. */
9582 1.1 skrll lit_sym = lit_frag->fr_symbol;
9583 1.1 skrll break;
9584 1.1 skrll
9585 1.1 skrll case ITYPE_LABEL:
9586 1.1 skrll if (align_targets && !is_loop)
9587 1.1 skrll {
9588 1.1 skrll fragS *unreach = fragP->fr_next;
9589 1.1 skrll while (!(unreach->fr_type == rs_machine_dependent
9590 1.1 skrll && (unreach->fr_subtype == RELAX_MAYBE_UNREACHABLE
9591 1.1 skrll || unreach->fr_subtype == RELAX_UNREACHABLE)))
9592 1.1 skrll {
9593 1.1 skrll unreach = unreach->fr_next;
9594 1.1 skrll }
9595 1.1 skrll
9596 1.1 skrll assert (unreach->fr_type == rs_machine_dependent
9597 1.1 skrll && (unreach->fr_subtype == RELAX_MAYBE_UNREACHABLE
9598 1.1 skrll || unreach->fr_subtype == RELAX_UNREACHABLE));
9599 1.1 skrll
9600 1.1 skrll target_offset += unreach->tc_frag_data.text_expansion[0];
9601 1.1 skrll }
9602 1.1 skrll assert (gen_label == NULL);
9603 1.1 skrll gen_label = symbol_new (FAKE_LABEL_NAME, now_seg,
9604 1.1 skrll fr_opcode - fragP->fr_literal
9605 1.1 skrll + target_offset, fragP);
9606 1.1 skrll break;
9607 1.1 skrll
9608 1.1 skrll case ITYPE_INSN:
9609 1.1 skrll if (first && from_wide_insn)
9610 1.1 skrll {
9611 1.1 skrll target_offset += xtensa_format_length (isa, fmt);
9612 1.1 skrll first = FALSE;
9613 1.1 skrll if (!opcode_fits_format_slot (tinsn->opcode, fmt, slot))
9614 1.1 skrll target_offset += xg_get_single_size (tinsn->opcode);
9615 1.1 skrll }
9616 1.1 skrll else
9617 1.1 skrll target_offset += xg_get_single_size (tinsn->opcode);
9618 1.1 skrll break;
9619 1.1 skrll }
9620 1.1 skrll }
9621 1.1 skrll
9622 1.1 skrll total_size = 0;
9623 1.1 skrll first = TRUE;
9624 1.1 skrll last_is_jump = FALSE;
9625 1.1 skrll for (i = 0; i < istack.ninsn; i++)
9626 1.1 skrll {
9627 1.1 skrll TInsn *tinsn = &istack.insn[i];
9628 1.1 skrll fragS *lit_frag;
9629 1.1 skrll int size;
9630 1.1 skrll segT target_seg;
9631 1.1 skrll bfd_reloc_code_real_type reloc_type;
9632 1.1 skrll
9633 1.1 skrll switch (tinsn->insn_type)
9634 1.1 skrll {
9635 1.1 skrll case ITYPE_LITERAL:
9636 1.1 skrll lit_frag = fragP->tc_frag_data.literal_frags[slot];
9637 1.1 skrll /* Already checked. */
9638 1.1 skrll assert (lit_frag != NULL);
9639 1.1 skrll assert (lit_sym != NULL);
9640 1.1 skrll assert (tinsn->ntok == 1);
9641 1.1 skrll /* Add a fixup. */
9642 1.1 skrll target_seg = S_GET_SEGMENT (lit_sym);
9643 1.1 skrll assert (target_seg);
9644 1.1 skrll reloc_type = map_operator_to_reloc (tinsn->tok[0].X_op, TRUE);
9645 1.1 skrll fix_new_exp_in_seg (target_seg, 0, lit_frag, 0, 4,
9646 1.1 skrll &tinsn->tok[0], FALSE, reloc_type);
9647 1.1 skrll break;
9648 1.1 skrll
9649 1.1 skrll case ITYPE_LABEL:
9650 1.1 skrll break;
9651 1.1 skrll
9652 1.1 skrll case ITYPE_INSN:
9653 1.1 skrll xg_resolve_labels (tinsn, gen_label);
9654 1.1 skrll xg_resolve_literals (tinsn, lit_sym);
9655 1.1 skrll if (from_wide_insn && first)
9656 1.1 skrll {
9657 1.1 skrll first = FALSE;
9658 1.1 skrll if (opcode_fits_format_slot (tinsn->opcode, fmt, slot))
9659 1.1 skrll {
9660 1.1 skrll cur_vinsn.slots[slot] = *tinsn;
9661 1.1 skrll }
9662 1.1 skrll else
9663 1.1 skrll {
9664 1.1 skrll cur_vinsn.slots[slot].opcode =
9665 1.1 skrll xtensa_format_slot_nop_opcode (isa, fmt, slot);
9666 1.1 skrll cur_vinsn.slots[slot].ntok = 0;
9667 1.1 skrll }
9668 1.1 skrll vinsn_to_insnbuf (&cur_vinsn, immed_instr, fragP, TRUE);
9669 1.1 skrll xtensa_insnbuf_to_chars (isa, cur_vinsn.insnbuf,
9670 1.1 skrll (unsigned char *) immed_instr, 0);
9671 1.1 skrll fragP->tc_frag_data.is_insn = TRUE;
9672 1.1 skrll size = xtensa_format_length (isa, fmt);
9673 1.1 skrll if (!opcode_fits_format_slot (tinsn->opcode, fmt, slot))
9674 1.1 skrll {
9675 1.1 skrll xg_emit_insn_to_buf
9676 1.1 skrll (tinsn, immed_instr + size, fragP,
9677 1.1 skrll immed_instr - fragP->fr_literal + size, TRUE);
9678 1.1 skrll size += xg_get_single_size (tinsn->opcode);
9679 1.1 skrll }
9680 1.1 skrll }
9681 1.1 skrll else
9682 1.1 skrll {
9683 1.1 skrll size = xg_get_single_size (tinsn->opcode);
9684 1.1 skrll xg_emit_insn_to_buf (tinsn, immed_instr, fragP,
9685 1.1 skrll immed_instr - fragP->fr_literal, TRUE);
9686 1.1 skrll }
9687 1.1 skrll immed_instr += size;
9688 1.1 skrll total_size += size;
9689 1.1 skrll break;
9690 1.1 skrll }
9691 1.1 skrll }
9692 1.1 skrll
9693 1.1 skrll diff = total_size - old_size;
9694 1.1 skrll assert (diff >= 0);
9695 1.1 skrll if (diff != 0)
9696 1.1 skrll expanded = TRUE;
9697 1.1 skrll assert (diff <= fragP->fr_var);
9698 1.1 skrll fragP->fr_var -= diff;
9699 1.1 skrll fragP->fr_fix += diff;
9700 1.1 skrll }
9701 1.1 skrll
9702 1.1 skrll /* Check for undefined immediates in LOOP instructions. */
9703 1.1 skrll if (is_loop)
9704 1.1 skrll {
9705 1.1 skrll symbolS *sym;
9706 1.1 skrll sym = orig_tinsn.tok[1].X_add_symbol;
9707 1.1 skrll if (sym != NULL && !S_IS_DEFINED (sym))
9708 1.1 skrll {
9709 1.1 skrll as_bad (_("unresolved loop target symbol: %s"), S_GET_NAME (sym));
9710 1.1 skrll return;
9711 1.1 skrll }
9712 1.1 skrll sym = orig_tinsn.tok[1].X_op_symbol;
9713 1.1 skrll if (sym != NULL && !S_IS_DEFINED (sym))
9714 1.1 skrll {
9715 1.1 skrll as_bad (_("unresolved loop target symbol: %s"), S_GET_NAME (sym));
9716 1.1 skrll return;
9717 1.1 skrll }
9718 1.1 skrll }
9719 1.1 skrll
9720 1.1 skrll if (expanded && xtensa_opcode_is_loop (isa, orig_tinsn.opcode) == 1)
9721 1.1 skrll convert_frag_immed_finish_loop (segP, fragP, &orig_tinsn);
9722 1.1 skrll
9723 1.1 skrll if (expanded && is_direct_call_opcode (orig_tinsn.opcode))
9724 1.1 skrll {
9725 1.1 skrll /* Add an expansion note on the expanded instruction. */
9726 1.1 skrll fix_new_exp_in_seg (now_seg, 0, fragP, fr_opcode - fragP->fr_literal, 4,
9727 1.1 skrll &orig_tinsn.tok[0], TRUE,
9728 1.1 skrll BFD_RELOC_XTENSA_ASM_EXPAND);
9729 1.1 skrll }
9730 1.1 skrll }
9731 1.1 skrll
9732 1.1 skrll
9733 1.1 skrll /* Add a new fix expression into the desired segment. We have to
9734 1.1 skrll switch to that segment to do this. */
9735 1.1 skrll
9736 1.1 skrll static fixS *
9737 1.1 skrll fix_new_exp_in_seg (segT new_seg,
9738 1.1 skrll subsegT new_subseg,
9739 1.1 skrll fragS *frag,
9740 1.1 skrll int where,
9741 1.1 skrll int size,
9742 1.1 skrll expressionS *exp,
9743 1.1 skrll int pcrel,
9744 1.1 skrll bfd_reloc_code_real_type r_type)
9745 1.1 skrll {
9746 1.1 skrll fixS *new_fix;
9747 1.1 skrll segT seg = now_seg;
9748 1.1 skrll subsegT subseg = now_subseg;
9749 1.1 skrll
9750 1.1 skrll assert (new_seg != 0);
9751 1.1 skrll subseg_set (new_seg, new_subseg);
9752 1.1 skrll
9753 1.1 skrll new_fix = fix_new_exp (frag, where, size, exp, pcrel, r_type);
9754 1.1 skrll subseg_set (seg, subseg);
9755 1.1 skrll return new_fix;
9756 1.1 skrll }
9757 1.1 skrll
9758 1.1 skrll
9759 1.1 skrll /* Relax a loop instruction so that it can span loop >256 bytes.
9760 1.1 skrll
9761 1.1 skrll loop as, .L1
9762 1.1 skrll .L0:
9763 1.1 skrll rsr as, LEND
9764 1.1 skrll wsr as, LBEG
9765 1.1 skrll addi as, as, lo8 (label-.L1)
9766 1.1 skrll addmi as, as, mid8 (label-.L1)
9767 1.1 skrll wsr as, LEND
9768 1.1 skrll isync
9769 1.1 skrll rsr as, LCOUNT
9770 1.1 skrll addi as, as, 1
9771 1.1 skrll .L1:
9772 1.1 skrll <<body>>
9773 1.1 skrll label:
9774 1.1 skrll */
9775 1.1 skrll
9776 1.1 skrll static void
9777 1.1 skrll convert_frag_immed_finish_loop (segT segP, fragS *fragP, TInsn *tinsn)
9778 1.1 skrll {
9779 1.1 skrll TInsn loop_insn;
9780 1.1 skrll TInsn addi_insn;
9781 1.1 skrll TInsn addmi_insn;
9782 1.1 skrll unsigned long target;
9783 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
9784 1.1 skrll unsigned int loop_length, loop_length_hi, loop_length_lo;
9785 1.1 skrll xtensa_isa isa = xtensa_default_isa;
9786 1.1 skrll addressT loop_offset;
9787 1.1 skrll addressT addi_offset = 9;
9788 1.1 skrll addressT addmi_offset = 12;
9789 1.1 skrll fragS *next_fragP;
9790 1.1 skrll int target_count;
9791 1.1 skrll
9792 1.1 skrll if (!insnbuf)
9793 1.1 skrll insnbuf = xtensa_insnbuf_alloc (isa);
9794 1.1 skrll
9795 1.1 skrll /* Get the loop offset. */
9796 1.1 skrll loop_offset = get_expanded_loop_offset (tinsn->opcode);
9797 1.1 skrll
9798 1.1 skrll /* Validate that there really is a LOOP at the loop_offset. Because
9799 1.1 skrll loops are not bundleable, we can assume that the instruction will be
9800 1.1 skrll in slot 0. */
9801 1.1 skrll tinsn_from_chars (&loop_insn, fragP->fr_opcode + loop_offset, 0);
9802 1.1 skrll tinsn_immed_from_frag (&loop_insn, fragP, 0);
9803 1.1 skrll
9804 1.1 skrll assert (xtensa_opcode_is_loop (isa, loop_insn.opcode) == 1);
9805 1.1 skrll addi_offset += loop_offset;
9806 1.1 skrll addmi_offset += loop_offset;
9807 1.1 skrll
9808 1.1 skrll assert (tinsn->ntok == 2);
9809 1.1 skrll if (tinsn->tok[1].X_op == O_constant)
9810 1.1 skrll target = tinsn->tok[1].X_add_number;
9811 1.1 skrll else if (tinsn->tok[1].X_op == O_symbol)
9812 1.1 skrll {
9813 1.1 skrll /* Find the fragment. */
9814 1.1 skrll symbolS *sym = tinsn->tok[1].X_add_symbol;
9815 1.1 skrll assert (S_GET_SEGMENT (sym) == segP
9816 1.1 skrll || S_GET_SEGMENT (sym) == absolute_section);
9817 1.1 skrll target = (S_GET_VALUE (sym) + tinsn->tok[1].X_add_number);
9818 1.1 skrll }
9819 1.1 skrll else
9820 1.1 skrll {
9821 1.1 skrll as_bad (_("invalid expression evaluation type %d"), tinsn->tok[1].X_op);
9822 1.1 skrll target = 0;
9823 1.1 skrll }
9824 1.1 skrll
9825 1.1 skrll loop_length = target - (fragP->fr_address + fragP->fr_fix);
9826 1.1 skrll loop_length_hi = loop_length & ~0x0ff;
9827 1.1 skrll loop_length_lo = loop_length & 0x0ff;
9828 1.1 skrll if (loop_length_lo >= 128)
9829 1.1 skrll {
9830 1.1 skrll loop_length_lo -= 256;
9831 1.1 skrll loop_length_hi += 256;
9832 1.1 skrll }
9833 1.1 skrll
9834 1.1 skrll /* Because addmi sign-extends the immediate, 'loop_length_hi' can be at most
9835 1.1 skrll 32512. If the loop is larger than that, then we just fail. */
9836 1.1 skrll if (loop_length_hi > 32512)
9837 1.1 skrll as_bad_where (fragP->fr_file, fragP->fr_line,
9838 1.1 skrll _("loop too long for LOOP instruction"));
9839 1.1 skrll
9840 1.1 skrll tinsn_from_chars (&addi_insn, fragP->fr_opcode + addi_offset, 0);
9841 1.1 skrll assert (addi_insn.opcode == xtensa_addi_opcode);
9842 1.1 skrll
9843 1.1 skrll tinsn_from_chars (&addmi_insn, fragP->fr_opcode + addmi_offset, 0);
9844 1.1 skrll assert (addmi_insn.opcode == xtensa_addmi_opcode);
9845 1.1 skrll
9846 1.1 skrll set_expr_const (&addi_insn.tok[2], loop_length_lo);
9847 1.1 skrll tinsn_to_insnbuf (&addi_insn, insnbuf);
9848 1.1 skrll
9849 1.1 skrll fragP->tc_frag_data.is_insn = TRUE;
9850 1.1 skrll xtensa_insnbuf_to_chars
9851 1.1 skrll (isa, insnbuf, (unsigned char *) fragP->fr_opcode + addi_offset, 0);
9852 1.1 skrll
9853 1.1 skrll set_expr_const (&addmi_insn.tok[2], loop_length_hi);
9854 1.1 skrll tinsn_to_insnbuf (&addmi_insn, insnbuf);
9855 1.1 skrll xtensa_insnbuf_to_chars
9856 1.1 skrll (isa, insnbuf, (unsigned char *) fragP->fr_opcode + addmi_offset, 0);
9857 1.1 skrll
9858 1.1 skrll /* Walk through all of the frags from here to the loop end
9859 1.1 skrll and mark them as no_transform to keep them from being modified
9860 1.1 skrll by the linker. If we ever have a relocation for the
9861 1.1 skrll addi/addmi of the difference of two symbols we can remove this. */
9862 1.1 skrll
9863 1.1 skrll target_count = 0;
9864 1.1 skrll for (next_fragP = fragP; next_fragP != NULL;
9865 1.1 skrll next_fragP = next_fragP->fr_next)
9866 1.1 skrll {
9867 1.1 skrll next_fragP->tc_frag_data.is_no_transform = TRUE;
9868 1.1 skrll if (next_fragP->tc_frag_data.is_loop_target)
9869 1.1 skrll target_count++;
9870 1.1 skrll if (target_count == 2)
9871 1.1 skrll break;
9872 1.1 skrll }
9873 1.1 skrll }
9874 1.1 skrll
9875 1.1 skrll
9876 1.1 skrll /* A map that keeps information on a per-subsegment basis. This is
9878 1.1 skrll maintained during initial assembly, but is invalid once the
9879 1.1 skrll subsegments are smashed together. I.E., it cannot be used during
9880 1.1 skrll the relaxation. */
9881 1.1 skrll
9882 1.1 skrll typedef struct subseg_map_struct
9883 1.1 skrll {
9884 1.1 skrll /* the key */
9885 1.1 skrll segT seg;
9886 1.1 skrll subsegT subseg;
9887 1.1 skrll
9888 1.1 skrll /* the data */
9889 1.1 skrll unsigned flags;
9890 1.1 skrll float total_freq; /* fall-through + branch target frequency */
9891 1.1 skrll float target_freq; /* branch target frequency alone */
9892 1.1 skrll
9893 1.1 skrll struct subseg_map_struct *next;
9894 1.1 skrll } subseg_map;
9895 1.1 skrll
9896 1.1 skrll
9897 1.1 skrll static subseg_map *sseg_map = NULL;
9898 1.1 skrll
9899 1.1 skrll static subseg_map *
9900 1.1 skrll get_subseg_info (segT seg, subsegT subseg)
9901 1.1 skrll {
9902 1.1 skrll subseg_map *subseg_e;
9903 1.1 skrll
9904 1.1 skrll for (subseg_e = sseg_map; subseg_e; subseg_e = subseg_e->next)
9905 1.1 skrll {
9906 1.1 skrll if (seg == subseg_e->seg && subseg == subseg_e->subseg)
9907 1.1 skrll break;
9908 1.1 skrll }
9909 1.1 skrll return subseg_e;
9910 1.1 skrll }
9911 1.1 skrll
9912 1.1 skrll
9913 1.1 skrll static subseg_map *
9914 1.1 skrll add_subseg_info (segT seg, subsegT subseg)
9915 1.1 skrll {
9916 1.1 skrll subseg_map *subseg_e = (subseg_map *) xmalloc (sizeof (subseg_map));
9917 1.1 skrll memset (subseg_e, 0, sizeof (subseg_map));
9918 1.1 skrll subseg_e->seg = seg;
9919 1.1 skrll subseg_e->subseg = subseg;
9920 1.1 skrll subseg_e->flags = 0;
9921 1.1 skrll /* Start off considering every branch target very important. */
9922 1.1 skrll subseg_e->target_freq = 1.0;
9923 1.1 skrll subseg_e->total_freq = 1.0;
9924 1.1 skrll subseg_e->next = sseg_map;
9925 1.1 skrll sseg_map = subseg_e;
9926 1.1 skrll return subseg_e;
9927 1.1 skrll }
9928 1.1 skrll
9929 1.1 skrll
9930 1.1 skrll static unsigned
9931 1.1 skrll get_last_insn_flags (segT seg, subsegT subseg)
9932 1.1 skrll {
9933 1.1 skrll subseg_map *subseg_e = get_subseg_info (seg, subseg);
9934 1.1 skrll if (subseg_e)
9935 1.1 skrll return subseg_e->flags;
9936 1.1 skrll return 0;
9937 1.1 skrll }
9938 1.1 skrll
9939 1.1 skrll
9940 1.1 skrll static void
9941 1.1 skrll set_last_insn_flags (segT seg,
9942 1.1 skrll subsegT subseg,
9943 1.1 skrll unsigned fl,
9944 1.1 skrll bfd_boolean val)
9945 1.1 skrll {
9946 1.1 skrll subseg_map *subseg_e = get_subseg_info (seg, subseg);
9947 1.1 skrll if (! subseg_e)
9948 1.1 skrll subseg_e = add_subseg_info (seg, subseg);
9949 1.1 skrll if (val)
9950 1.1 skrll subseg_e->flags |= fl;
9951 1.1 skrll else
9952 1.1 skrll subseg_e->flags &= ~fl;
9953 1.1 skrll }
9954 1.1 skrll
9955 1.1 skrll
9956 1.1 skrll static float
9957 1.1 skrll get_subseg_total_freq (segT seg, subsegT subseg)
9958 1.1 skrll {
9959 1.1 skrll subseg_map *subseg_e = get_subseg_info (seg, subseg);
9960 1.1 skrll if (subseg_e)
9961 1.1 skrll return subseg_e->total_freq;
9962 1.1 skrll return 1.0;
9963 1.1 skrll }
9964 1.1 skrll
9965 1.1 skrll
9966 1.1 skrll static float
9967 1.1 skrll get_subseg_target_freq (segT seg, subsegT subseg)
9968 1.1 skrll {
9969 1.1 skrll subseg_map *subseg_e = get_subseg_info (seg, subseg);
9970 1.1 skrll if (subseg_e)
9971 1.1 skrll return subseg_e->target_freq;
9972 1.1 skrll return 1.0;
9973 1.1 skrll }
9974 1.1 skrll
9975 1.1 skrll
9976 1.1 skrll static void
9977 1.1 skrll set_subseg_freq (segT seg, subsegT subseg, float total_f, float target_f)
9978 1.1 skrll {
9979 1.1 skrll subseg_map *subseg_e = get_subseg_info (seg, subseg);
9980 1.1 skrll if (! subseg_e)
9981 1.1 skrll subseg_e = add_subseg_info (seg, subseg);
9982 1.1 skrll subseg_e->total_freq = total_f;
9983 1.1 skrll subseg_e->target_freq = target_f;
9984 1.1 skrll }
9985 1.1 skrll
9986 1.1 skrll
9987 1.1 skrll /* Segment Lists and emit_state Stuff. */
9989 1.1 skrll
9990 1.1 skrll static void
9991 1.1 skrll xtensa_move_seg_list_to_beginning (seg_list *head)
9992 1.1 skrll {
9993 1.1 skrll head = head->next;
9994 1.1 skrll while (head)
9995 1.1 skrll {
9996 1.1 skrll segT literal_section = head->seg;
9997 1.1 skrll
9998 1.1 skrll /* Move the literal section to the front of the section list. */
9999 1.1 skrll assert (literal_section);
10000 1.1 skrll if (literal_section != stdoutput->sections)
10001 1.1 skrll {
10002 1.1 skrll bfd_section_list_remove (stdoutput, literal_section);
10003 1.1 skrll bfd_section_list_prepend (stdoutput, literal_section);
10004 1.1 skrll }
10005 1.1 skrll head = head->next;
10006 1.1 skrll }
10007 1.1 skrll }
10008 1.1 skrll
10009 1.1 skrll
10010 1.1 skrll static void mark_literal_frags (seg_list *);
10011 1.1 skrll
10012 1.1 skrll static void
10013 1.1 skrll xtensa_move_literals (void)
10014 1.1 skrll {
10015 1.1 skrll seg_list *segment;
10016 1.1 skrll frchainS *frchain_from, *frchain_to;
10017 1.1 skrll fragS *search_frag, *next_frag, *last_frag, *literal_pool, *insert_after;
10018 1.1 skrll fragS **frag_splice;
10019 1.1 skrll emit_state state;
10020 1.1 skrll segT dest_seg;
10021 1.1 skrll fixS *fix, *next_fix, **fix_splice;
10022 1.1 skrll sym_list *lit;
10023 1.1 skrll
10024 1.1 skrll mark_literal_frags (literal_head->next);
10025 1.1 skrll
10026 1.1 skrll if (use_literal_section)
10027 1.1 skrll return;
10028 1.1 skrll
10029 1.1 skrll for (segment = literal_head->next; segment; segment = segment->next)
10030 1.1 skrll {
10031 1.1 skrll /* Keep the literals for .init and .fini in separate sections. */
10032 1.1 skrll if (!strcmp (segment_name (segment->seg), INIT_SECTION_NAME)
10033 1.1 skrll || !strcmp (segment_name (segment->seg), FINI_SECTION_NAME))
10034 1.1 skrll continue;
10035 1.1 skrll
10036 1.1 skrll frchain_from = seg_info (segment->seg)->frchainP;
10037 1.1 skrll search_frag = frchain_from->frch_root;
10038 1.1 skrll literal_pool = NULL;
10039 1.1 skrll frchain_to = NULL;
10040 1.1 skrll frag_splice = &(frchain_from->frch_root);
10041 1.1 skrll
10042 1.1 skrll while (!search_frag->tc_frag_data.literal_frag)
10043 1.1 skrll {
10044 1.1 skrll assert (search_frag->fr_fix == 0
10045 1.1 skrll || search_frag->fr_type == rs_align);
10046 1.1 skrll search_frag = search_frag->fr_next;
10047 1.1 skrll }
10048 1.1 skrll
10049 1.1 skrll assert (search_frag->tc_frag_data.literal_frag->fr_subtype
10050 1.1 skrll == RELAX_LITERAL_POOL_BEGIN);
10051 1.1 skrll xtensa_switch_section_emit_state (&state, segment->seg, 0);
10052 1.1 skrll
10053 1.1 skrll /* Make sure that all the frags in this series are closed, and
10054 1.1 skrll that there is at least one left over of zero-size. This
10055 1.1 skrll prevents us from making a segment with an frchain without any
10056 1.1 skrll frags in it. */
10057 1.1 skrll frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
10058 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
10059 1.1 skrll last_frag = frag_now;
10060 1.1 skrll frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
10061 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
10062 1.1 skrll
10063 1.1 skrll while (search_frag != frag_now)
10064 1.1 skrll {
10065 1.1 skrll next_frag = search_frag->fr_next;
10066 1.1 skrll
10067 1.1 skrll /* First, move the frag out of the literal section and
10068 1.1 skrll to the appropriate place. */
10069 1.1 skrll if (search_frag->tc_frag_data.literal_frag)
10070 1.1 skrll {
10071 1.1 skrll literal_pool = search_frag->tc_frag_data.literal_frag;
10072 1.1 skrll assert (literal_pool->fr_subtype == RELAX_LITERAL_POOL_BEGIN);
10073 1.1 skrll frchain_to = literal_pool->tc_frag_data.lit_frchain;
10074 1.1 skrll assert (frchain_to);
10075 1.1 skrll }
10076 1.1 skrll insert_after = literal_pool->tc_frag_data.literal_frag;
10077 1.1 skrll dest_seg = insert_after->fr_next->tc_frag_data.lit_seg;
10078 1.1 skrll
10079 1.1 skrll *frag_splice = next_frag;
10080 1.1 skrll search_frag->fr_next = insert_after->fr_next;
10081 1.1 skrll insert_after->fr_next = search_frag;
10082 1.1 skrll search_frag->tc_frag_data.lit_seg = dest_seg;
10083 1.1 skrll literal_pool->tc_frag_data.literal_frag = search_frag;
10084 1.1 skrll
10085 1.1 skrll /* Now move any fixups associated with this frag to the
10086 1.1 skrll right section. */
10087 1.1 skrll fix = frchain_from->fix_root;
10088 1.1 skrll fix_splice = &(frchain_from->fix_root);
10089 1.1 skrll while (fix)
10090 1.1 skrll {
10091 1.1 skrll next_fix = fix->fx_next;
10092 1.1 skrll if (fix->fx_frag == search_frag)
10093 1.1 skrll {
10094 1.1 skrll *fix_splice = next_fix;
10095 1.1 skrll fix->fx_next = frchain_to->fix_root;
10096 1.1 skrll frchain_to->fix_root = fix;
10097 1.1 skrll if (frchain_to->fix_tail == NULL)
10098 1.1 skrll frchain_to->fix_tail = fix;
10099 1.1 skrll }
10100 1.1 skrll else
10101 1.1 skrll fix_splice = &(fix->fx_next);
10102 1.1 skrll fix = next_fix;
10103 1.1 skrll }
10104 1.1 skrll search_frag = next_frag;
10105 1.1 skrll }
10106 1.1 skrll
10107 1.1 skrll if (frchain_from->fix_root != NULL)
10108 1.1 skrll {
10109 1.1 skrll frchain_from = seg_info (segment->seg)->frchainP;
10110 1.1 skrll as_warn (_("fixes not all moved from %s"), segment->seg->name);
10111 1.1 skrll
10112 1.1 skrll assert (frchain_from->fix_root == NULL);
10113 1.1 skrll }
10114 1.1 skrll frchain_from->fix_tail = NULL;
10115 1.1 skrll xtensa_restore_emit_state (&state);
10116 1.1 skrll }
10117 1.1 skrll
10118 1.1 skrll /* Now fix up the SEGMENT value for all the literal symbols. */
10119 1.1 skrll for (lit = literal_syms; lit; lit = lit->next)
10120 1.1 skrll {
10121 1.1 skrll symbolS *lit_sym = lit->sym;
10122 1.1 skrll segT dest_seg = symbol_get_frag (lit_sym)->tc_frag_data.lit_seg;
10123 1.1 skrll if (dest_seg)
10124 1.1 skrll S_SET_SEGMENT (lit_sym, dest_seg);
10125 1.1 skrll }
10126 1.1 skrll }
10127 1.1 skrll
10128 1.1 skrll
10129 1.1 skrll /* Walk over all the frags for segments in a list and mark them as
10130 1.1 skrll containing literals. As clunky as this is, we can't rely on frag_var
10131 1.1 skrll and frag_variant to get called in all situations. */
10132 1.1 skrll
10133 1.1 skrll static void
10134 1.1 skrll mark_literal_frags (seg_list *segment)
10135 1.1 skrll {
10136 1.1 skrll frchainS *frchain_from;
10137 1.1 skrll fragS *search_frag;
10138 1.1 skrll
10139 1.1 skrll while (segment)
10140 1.1 skrll {
10141 1.1 skrll frchain_from = seg_info (segment->seg)->frchainP;
10142 1.1 skrll search_frag = frchain_from->frch_root;
10143 1.1 skrll while (search_frag)
10144 1.1 skrll {
10145 1.1 skrll search_frag->tc_frag_data.is_literal = TRUE;
10146 1.1 skrll search_frag = search_frag->fr_next;
10147 1.1 skrll }
10148 1.1 skrll segment = segment->next;
10149 1.1 skrll }
10150 1.1 skrll }
10151 1.1 skrll
10152 1.1 skrll
10153 1.1 skrll static void
10154 1.1 skrll xtensa_reorder_seg_list (seg_list *head, segT after)
10155 1.1 skrll {
10156 1.1 skrll /* Move all of the sections in the section list to come
10157 1.1 skrll after "after" in the gnu segment list. */
10158 1.1 skrll
10159 1.1 skrll head = head->next;
10160 1.1 skrll while (head)
10161 1.1 skrll {
10162 1.1 skrll segT literal_section = head->seg;
10163 1.1 skrll
10164 1.1 skrll /* Move the literal section after "after". */
10165 1.1 skrll assert (literal_section);
10166 1.1 skrll if (literal_section != after)
10167 1.1 skrll {
10168 1.1 skrll bfd_section_list_remove (stdoutput, literal_section);
10169 1.1 skrll bfd_section_list_insert_after (stdoutput, after, literal_section);
10170 1.1 skrll }
10171 1.1 skrll
10172 1.1 skrll head = head->next;
10173 1.1 skrll }
10174 1.1 skrll }
10175 1.1 skrll
10176 1.1 skrll
10177 1.1 skrll /* Push all the literal segments to the end of the gnu list. */
10178 1.1 skrll
10179 1.1 skrll static void
10180 1.1 skrll xtensa_reorder_segments (void)
10181 1.1 skrll {
10182 1.1 skrll segT sec;
10183 1.1 skrll segT last_sec = 0;
10184 1.1 skrll int old_count = 0;
10185 1.1 skrll int new_count = 0;
10186 1.1 skrll
10187 1.1 skrll for (sec = stdoutput->sections; sec != NULL; sec = sec->next)
10188 1.1 skrll {
10189 1.1 skrll last_sec = sec;
10190 1.1 skrll old_count++;
10191 1.1 skrll }
10192 1.1 skrll
10193 1.1 skrll /* Now that we have the last section, push all the literal
10194 1.1 skrll sections to the end. */
10195 1.1 skrll xtensa_reorder_seg_list (literal_head, last_sec);
10196 1.1 skrll
10197 1.1 skrll /* Now perform the final error check. */
10198 1.1 skrll for (sec = stdoutput->sections; sec != NULL; sec = sec->next)
10199 1.1 skrll new_count++;
10200 1.1 skrll assert (new_count == old_count);
10201 1.1 skrll }
10202 1.1 skrll
10203 1.1 skrll
10204 1.1 skrll /* Change the emit state (seg, subseg, and frag related stuff) to the
10205 1.1 skrll correct location. Return a emit_state which can be passed to
10206 1.1 skrll xtensa_restore_emit_state to return to current fragment. */
10207 1.1 skrll
10208 1.1 skrll static void
10209 1.1 skrll xtensa_switch_to_literal_fragment (emit_state *result)
10210 1.1 skrll {
10211 1.1 skrll if (directive_state[directive_absolute_literals])
10212 1.1 skrll {
10213 1.1 skrll segT lit4_seg = cache_literal_section (TRUE);
10214 1.1 skrll xtensa_switch_section_emit_state (result, lit4_seg, 0);
10215 1.1 skrll }
10216 1.1 skrll else
10217 1.1 skrll xtensa_switch_to_non_abs_literal_fragment (result);
10218 1.1 skrll
10219 1.1 skrll /* Do a 4-byte align here. */
10220 1.1 skrll frag_align (2, 0, 0);
10221 1.1 skrll record_alignment (now_seg, 2);
10222 1.1 skrll }
10223 1.1 skrll
10224 1.1 skrll
10225 1.1 skrll static void
10226 1.1 skrll xtensa_switch_to_non_abs_literal_fragment (emit_state *result)
10227 1.1 skrll {
10228 1.1 skrll static bfd_boolean recursive = FALSE;
10229 1.1 skrll fragS *pool_location = get_literal_pool_location (now_seg);
10230 1.1 skrll segT lit_seg;
10231 1.1 skrll bfd_boolean is_init =
10232 1.1 skrll (now_seg && !strcmp (segment_name (now_seg), INIT_SECTION_NAME));
10233 1.1 skrll bfd_boolean is_fini =
10234 1.1 skrll (now_seg && !strcmp (segment_name (now_seg), FINI_SECTION_NAME));
10235 1.1 skrll
10236 1.1 skrll if (pool_location == NULL
10237 1.1 skrll && !use_literal_section
10238 1.1 skrll && !recursive
10239 1.1 skrll && !is_init && ! is_fini)
10240 1.1 skrll {
10241 1.1 skrll as_bad (_("literal pool location required for text-section-literals; specify with .literal_position"));
10242 1.1 skrll
10243 1.1 skrll /* When we mark a literal pool location, we want to put a frag in
10244 1.1 skrll the literal pool that points to it. But to do that, we want to
10245 1.1 skrll switch_to_literal_fragment. But literal sections don't have
10246 1.1 skrll literal pools, so their location is always null, so we would
10247 1.1 skrll recurse forever. This is kind of hacky, but it works. */
10248 1.1 skrll
10249 1.1 skrll recursive = TRUE;
10250 1.1 skrll xtensa_mark_literal_pool_location ();
10251 1.1 skrll recursive = FALSE;
10252 1.1 skrll }
10253 1.1 skrll
10254 1.1 skrll lit_seg = cache_literal_section (FALSE);
10255 1.1 skrll xtensa_switch_section_emit_state (result, lit_seg, 0);
10256 1.1 skrll
10257 1.1 skrll if (!use_literal_section
10258 1.1 skrll && !is_init && !is_fini
10259 1.1 skrll && get_literal_pool_location (now_seg) != pool_location)
10260 1.1 skrll {
10261 1.1 skrll /* Close whatever frag is there. */
10262 1.1 skrll frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
10263 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
10264 1.1 skrll frag_now->tc_frag_data.literal_frag = pool_location;
10265 1.1 skrll frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
10266 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
10267 1.1 skrll }
10268 1.1 skrll }
10269 1.1 skrll
10270 1.1 skrll
10271 1.1 skrll /* Call this function before emitting data into the literal section.
10272 1.1 skrll This is a helper function for xtensa_switch_to_literal_fragment.
10273 1.1 skrll This is similar to a .section new_now_seg subseg. */
10274 1.1 skrll
10275 1.1 skrll static void
10276 1.1 skrll xtensa_switch_section_emit_state (emit_state *state,
10277 1.1 skrll segT new_now_seg,
10278 1.1 skrll subsegT new_now_subseg)
10279 1.1 skrll {
10280 1.1 skrll state->name = now_seg->name;
10281 1.1 skrll state->now_seg = now_seg;
10282 1.1 skrll state->now_subseg = now_subseg;
10283 1.1 skrll state->generating_literals = generating_literals;
10284 1.1 skrll generating_literals++;
10285 1.1 skrll subseg_set (new_now_seg, new_now_subseg);
10286 1.1 skrll }
10287 1.1 skrll
10288 1.1 skrll
10289 1.1 skrll /* Use to restore the emitting into the normal place. */
10290 1.1 skrll
10291 1.1 skrll static void
10292 1.1 skrll xtensa_restore_emit_state (emit_state *state)
10293 1.1 skrll {
10294 1.1 skrll generating_literals = state->generating_literals;
10295 1.1 skrll subseg_set (state->now_seg, state->now_subseg);
10296 1.1 skrll }
10297 1.1 skrll
10298 1.1 skrll
10299 1.1 skrll /* Predicate function used to look up a section in a particular group. */
10300 1.1 skrll
10301 1.1 skrll static bfd_boolean
10302 1.1 skrll match_section_group (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
10303 1.1 skrll {
10304 1.1 skrll const char *gname = inf;
10305 1.1 skrll const char *group_name = elf_group_name (sec);
10306 1.1 skrll
10307 1.1 skrll return (group_name == gname
10308 1.1 skrll || (group_name != NULL
10309 1.1 skrll && gname != NULL
10310 1.1 skrll && strcmp (group_name, gname) == 0));
10311 1.1 skrll }
10312 1.1 skrll
10313 1.1 skrll
10314 1.1 skrll /* Get the literal section to be used for the current text section.
10315 1.1 skrll The result may be cached in the default_lit_sections structure. */
10316 1.1 skrll
10317 1.1 skrll static segT
10318 1.1 skrll cache_literal_section (bfd_boolean use_abs_literals)
10319 1.1 skrll {
10320 1.1 skrll const char *text_name, *group_name = 0;
10321 1.1 skrll char *base_name, *name, *suffix;
10322 1.1 skrll segT *pcached;
10323 1.1 skrll segT seg, current_section;
10324 1.1 skrll int current_subsec;
10325 1.1 skrll bfd_boolean linkonce = FALSE;
10326 1.1 skrll
10327 1.1 skrll /* Save the current section/subsection. */
10328 1.1 skrll current_section = now_seg;
10329 1.1 skrll current_subsec = now_subseg;
10330 1.1 skrll
10331 1.1 skrll /* Clear the cached values if they are no longer valid. */
10332 1.1 skrll if (now_seg != default_lit_sections.current_text_seg)
10333 1.1 skrll {
10334 1.1 skrll default_lit_sections.current_text_seg = now_seg;
10335 1.1 skrll default_lit_sections.lit_seg = NULL;
10336 1.1 skrll default_lit_sections.lit4_seg = NULL;
10337 1.1 skrll }
10338 1.1 skrll
10339 1.1 skrll /* Check if the literal section is already cached. */
10340 1.1 skrll if (use_abs_literals)
10341 1.1 skrll pcached = &default_lit_sections.lit4_seg;
10342 1.1 skrll else
10343 1.1 skrll pcached = &default_lit_sections.lit_seg;
10344 1.1 skrll
10345 1.1 skrll if (*pcached)
10346 1.1 skrll return *pcached;
10347 1.1 skrll
10348 1.1 skrll text_name = default_lit_sections.lit_prefix;
10349 1.1 skrll if (! text_name || ! *text_name)
10350 1.1 skrll {
10351 1.1 skrll text_name = segment_name (current_section);
10352 1.1 skrll group_name = elf_group_name (current_section);
10353 1.1 skrll linkonce = (current_section->flags & SEC_LINK_ONCE) != 0;
10354 1.1 skrll }
10355 1.1 skrll
10356 1.1 skrll base_name = use_abs_literals ? ".lit4" : ".literal";
10357 1.1 skrll if (group_name)
10358 1.1 skrll {
10359 1.1 skrll name = xmalloc (strlen (base_name) + strlen (group_name) + 2);
10360 1.1 skrll sprintf (name, "%s.%s", base_name, group_name);
10361 1.1 skrll }
10362 1.1 skrll else if (strncmp (text_name, ".gnu.linkonce.", linkonce_len) == 0)
10363 1.1 skrll {
10364 1.1 skrll suffix = strchr (text_name + linkonce_len, '.');
10365 1.1 skrll
10366 1.1 skrll name = xmalloc (linkonce_len + strlen (base_name) + 1
10367 1.1 skrll + (suffix ? strlen (suffix) : 0));
10368 1.1 skrll strcpy (name, ".gnu.linkonce");
10369 1.1 skrll strcat (name, base_name);
10370 1.1 skrll if (suffix)
10371 1.1 skrll strcat (name, suffix);
10372 1.1 skrll linkonce = TRUE;
10373 1.1 skrll }
10374 1.1 skrll else
10375 1.1 skrll {
10376 1.1 skrll /* If the section name ends with ".text", then replace that suffix
10377 1.1 skrll instead of appending an additional suffix. */
10378 1.1 skrll size_t len = strlen (text_name);
10379 1.1 skrll if (len >= 5 && strcmp (text_name + len - 5, ".text") == 0)
10380 1.1 skrll len -= 5;
10381 1.1 skrll
10382 1.1 skrll name = xmalloc (len + strlen (base_name) + 1);
10383 1.1 skrll strcpy (name, text_name);
10384 1.1 skrll strcpy (name + len, base_name);
10385 1.1 skrll }
10386 1.1 skrll
10387 1.1 skrll /* Canonicalize section names to allow renaming literal sections.
10388 1.1 skrll The group name, if any, came from the current text section and
10389 1.1 skrll has already been canonicalized. */
10390 1.1 skrll name = tc_canonicalize_symbol_name (name);
10391 1.1 skrll
10392 1.1 skrll seg = bfd_get_section_by_name_if (stdoutput, name, match_section_group,
10393 1.1 skrll (void *) group_name);
10394 1.1 skrll if (! seg)
10395 1.1 skrll {
10396 1.1 skrll flagword flags;
10397 1.1 skrll
10398 1.1 skrll seg = subseg_force_new (name, 0);
10399 1.1 skrll
10400 1.1 skrll if (! use_abs_literals)
10401 1.1 skrll {
10402 1.1 skrll /* Add the newly created literal segment to the list. */
10403 1.1 skrll seg_list *n = (seg_list *) xmalloc (sizeof (seg_list));
10404 1.1 skrll n->seg = seg;
10405 1.1 skrll n->next = literal_head->next;
10406 1.1 skrll literal_head->next = n;
10407 1.1 skrll }
10408 1.1 skrll
10409 1.1 skrll flags = (SEC_HAS_CONTENTS | SEC_READONLY | SEC_ALLOC | SEC_LOAD
10410 1.1 skrll | (linkonce ? (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD) : 0)
10411 1.1 skrll | (use_abs_literals ? SEC_DATA : SEC_CODE));
10412 1.1 skrll
10413 1.1 skrll elf_group_name (seg) = group_name;
10414 1.1 skrll
10415 1.1 skrll bfd_set_section_flags (stdoutput, seg, flags);
10416 1.1 skrll bfd_set_section_alignment (stdoutput, seg, 2);
10417 1.1 skrll }
10418 1.1 skrll
10419 1.1 skrll *pcached = seg;
10420 1.1 skrll subseg_set (current_section, current_subsec);
10421 1.1 skrll return seg;
10422 1.1 skrll }
10423 1.1 skrll
10424 1.1 skrll
10425 1.1 skrll /* Property Tables Stuff. */
10427 1.1 skrll
10428 1.1 skrll #define XTENSA_INSN_SEC_NAME ".xt.insn"
10429 1.1 skrll #define XTENSA_LIT_SEC_NAME ".xt.lit"
10430 1.1 skrll #define XTENSA_PROP_SEC_NAME ".xt.prop"
10431 1.1 skrll
10432 1.1 skrll typedef bfd_boolean (*frag_predicate) (const fragS *);
10433 1.1 skrll typedef void (*frag_flags_fn) (const fragS *, frag_flags *);
10434 1.1 skrll
10435 1.1 skrll static bfd_boolean get_frag_is_literal (const fragS *);
10436 1.1 skrll static void xtensa_create_property_segments
10437 1.1 skrll (frag_predicate, frag_predicate, const char *, xt_section_type);
10438 1.1 skrll static void xtensa_create_xproperty_segments
10439 1.1 skrll (frag_flags_fn, const char *, xt_section_type);
10440 1.1 skrll static bfd_boolean exclude_section_from_property_tables (segT);
10441 1.1 skrll static bfd_boolean section_has_property (segT, frag_predicate);
10442 1.1 skrll static bfd_boolean section_has_xproperty (segT, frag_flags_fn);
10443 1.1 skrll static void add_xt_block_frags
10444 1.1 skrll (segT, xtensa_block_info **, frag_predicate, frag_predicate);
10445 1.1 skrll static bfd_boolean xtensa_frag_flags_is_empty (const frag_flags *);
10446 1.1 skrll static void xtensa_frag_flags_init (frag_flags *);
10447 1.1 skrll static void get_frag_property_flags (const fragS *, frag_flags *);
10448 1.1 skrll static bfd_vma frag_flags_to_number (const frag_flags *);
10449 1.1 skrll static void add_xt_prop_frags (segT, xtensa_block_info **, frag_flags_fn);
10450 1.1 skrll
10451 1.1 skrll /* Set up property tables after relaxation. */
10452 1.1 skrll
10453 1.1 skrll void
10454 1.1 skrll xtensa_post_relax_hook (void)
10455 1.1 skrll {
10456 1.1 skrll xtensa_move_seg_list_to_beginning (literal_head);
10457 1.1 skrll
10458 1.1 skrll xtensa_find_unmarked_state_frags ();
10459 1.1 skrll xtensa_mark_frags_for_org ();
10460 1.1 skrll xtensa_mark_difference_of_two_symbols ();
10461 1.1 skrll
10462 1.1 skrll xtensa_create_property_segments (get_frag_is_literal,
10463 1.1 skrll NULL,
10464 1.1 skrll XTENSA_LIT_SEC_NAME,
10465 1.1 skrll xt_literal_sec);
10466 1.1 skrll xtensa_create_xproperty_segments (get_frag_property_flags,
10467 1.1 skrll XTENSA_PROP_SEC_NAME,
10468 1.1 skrll xt_prop_sec);
10469 1.1 skrll
10470 1.1 skrll if (warn_unaligned_branch_targets)
10471 1.1 skrll bfd_map_over_sections (stdoutput, xtensa_find_unaligned_branch_targets, 0);
10472 1.1 skrll bfd_map_over_sections (stdoutput, xtensa_find_unaligned_loops, 0);
10473 1.1 skrll }
10474 1.1 skrll
10475 1.1 skrll
10476 1.1 skrll /* This function is only meaningful after xtensa_move_literals. */
10477 1.1 skrll
10478 1.1 skrll static bfd_boolean
10479 1.1 skrll get_frag_is_literal (const fragS *fragP)
10480 1.1 skrll {
10481 1.1 skrll assert (fragP != NULL);
10482 1.1 skrll return fragP->tc_frag_data.is_literal;
10483 1.1 skrll }
10484 1.1 skrll
10485 1.1 skrll
10486 1.1 skrll static void
10487 1.1 skrll xtensa_create_property_segments (frag_predicate property_function,
10488 1.1 skrll frag_predicate end_property_function,
10489 1.1 skrll const char *section_name_base,
10490 1.1 skrll xt_section_type sec_type)
10491 1.1 skrll {
10492 1.1 skrll segT *seclist;
10493 1.1 skrll
10494 1.1 skrll /* Walk over all of the current segments.
10495 1.1 skrll Walk over each fragment
10496 1.1 skrll For each non-empty fragment,
10497 1.1 skrll Build a property record (append where possible). */
10498 1.1 skrll
10499 1.1 skrll for (seclist = &stdoutput->sections;
10500 1.1 skrll seclist && *seclist;
10501 1.1 skrll seclist = &(*seclist)->next)
10502 1.1 skrll {
10503 1.1 skrll segT sec = *seclist;
10504 1.1 skrll
10505 1.1 skrll if (exclude_section_from_property_tables (sec))
10506 1.1 skrll continue;
10507 1.1 skrll
10508 1.1 skrll if (section_has_property (sec, property_function))
10509 1.1 skrll {
10510 1.1 skrll segment_info_type *xt_seg_info;
10511 1.1 skrll xtensa_block_info **xt_blocks;
10512 1.1 skrll segT prop_sec = xtensa_make_property_section (sec, section_name_base);
10513 1.1 skrll
10514 1.1 skrll prop_sec->output_section = prop_sec;
10515 1.1 skrll subseg_set (prop_sec, 0);
10516 1.1 skrll xt_seg_info = seg_info (prop_sec);
10517 1.1 skrll xt_blocks = &xt_seg_info->tc_segment_info_data.blocks[sec_type];
10518 1.1 skrll
10519 1.1 skrll /* Walk over all of the frchains here and add new sections. */
10520 1.1 skrll add_xt_block_frags (sec, xt_blocks, property_function,
10521 1.1 skrll end_property_function);
10522 1.1 skrll }
10523 1.1 skrll }
10524 1.1 skrll
10525 1.1 skrll /* Now we fill them out.... */
10526 1.1 skrll
10527 1.1 skrll for (seclist = &stdoutput->sections;
10528 1.1 skrll seclist && *seclist;
10529 1.1 skrll seclist = &(*seclist)->next)
10530 1.1 skrll {
10531 1.1 skrll segment_info_type *seginfo;
10532 1.1 skrll xtensa_block_info *block;
10533 1.1 skrll segT sec = *seclist;
10534 1.1 skrll
10535 1.1 skrll seginfo = seg_info (sec);
10536 1.1 skrll block = seginfo->tc_segment_info_data.blocks[sec_type];
10537 1.1 skrll
10538 1.1 skrll if (block)
10539 1.1 skrll {
10540 1.1 skrll xtensa_block_info *cur_block;
10541 1.1 skrll int num_recs = 0;
10542 1.1 skrll bfd_size_type rec_size;
10543 1.1 skrll
10544 1.1 skrll for (cur_block = block; cur_block; cur_block = cur_block->next)
10545 1.1 skrll num_recs++;
10546 1.1 skrll
10547 1.1 skrll rec_size = num_recs * 8;
10548 1.1 skrll bfd_set_section_size (stdoutput, sec, rec_size);
10549 1.1 skrll
10550 1.1 skrll if (num_recs)
10551 1.1 skrll {
10552 1.1 skrll char *frag_data;
10553 1.1 skrll int i;
10554 1.1 skrll
10555 1.1 skrll subseg_set (sec, 0);
10556 1.1 skrll frag_data = frag_more (rec_size);
10557 1.1 skrll cur_block = block;
10558 1.1 skrll for (i = 0; i < num_recs; i++)
10559 1.1 skrll {
10560 1.1 skrll fixS *fix;
10561 1.1 skrll
10562 1.1 skrll /* Write the fixup. */
10563 1.1 skrll assert (cur_block);
10564 1.1 skrll fix = fix_new (frag_now, i * 8, 4,
10565 1.1 skrll section_symbol (cur_block->sec),
10566 1.1 skrll cur_block->offset,
10567 1.1 skrll FALSE, BFD_RELOC_32);
10568 1.1 skrll fix->fx_file = "<internal>";
10569 1.1 skrll fix->fx_line = 0;
10570 1.1 skrll
10571 1.1 skrll /* Write the length. */
10572 1.1 skrll md_number_to_chars (&frag_data[4 + i * 8],
10573 1.1 skrll cur_block->size, 4);
10574 1.1 skrll cur_block = cur_block->next;
10575 1.1 skrll }
10576 1.1 skrll frag_wane (frag_now);
10577 1.1 skrll frag_new (0);
10578 1.1 skrll frag_wane (frag_now);
10579 1.1 skrll }
10580 1.1 skrll }
10581 1.1 skrll }
10582 1.1 skrll }
10583 1.1 skrll
10584 1.1 skrll
10585 1.1 skrll static void
10586 1.1 skrll xtensa_create_xproperty_segments (frag_flags_fn flag_fn,
10587 1.1 skrll const char *section_name_base,
10588 1.1 skrll xt_section_type sec_type)
10589 1.1 skrll {
10590 1.1 skrll segT *seclist;
10591 1.1 skrll
10592 1.1 skrll /* Walk over all of the current segments.
10593 1.1 skrll Walk over each fragment.
10594 1.1 skrll For each fragment that has instructions,
10595 1.1 skrll build an instruction record (append where possible). */
10596 1.1 skrll
10597 1.1 skrll for (seclist = &stdoutput->sections;
10598 1.1 skrll seclist && *seclist;
10599 1.1 skrll seclist = &(*seclist)->next)
10600 1.1 skrll {
10601 1.1 skrll segT sec = *seclist;
10602 1.1 skrll
10603 1.1 skrll if (exclude_section_from_property_tables (sec))
10604 1.1 skrll continue;
10605 1.1 skrll
10606 1.1 skrll if (section_has_xproperty (sec, flag_fn))
10607 1.1 skrll {
10608 1.1 skrll segment_info_type *xt_seg_info;
10609 1.1 skrll xtensa_block_info **xt_blocks;
10610 1.1 skrll segT prop_sec = xtensa_make_property_section (sec, section_name_base);
10611 1.1 skrll
10612 1.1 skrll prop_sec->output_section = prop_sec;
10613 1.1 skrll subseg_set (prop_sec, 0);
10614 1.1 skrll xt_seg_info = seg_info (prop_sec);
10615 1.1 skrll xt_blocks = &xt_seg_info->tc_segment_info_data.blocks[sec_type];
10616 1.1 skrll
10617 1.1 skrll /* Walk over all of the frchains here and add new sections. */
10618 1.1 skrll add_xt_prop_frags (sec, xt_blocks, flag_fn);
10619 1.1 skrll }
10620 1.1 skrll }
10621 1.1 skrll
10622 1.1 skrll /* Now we fill them out.... */
10623 1.1 skrll
10624 1.1 skrll for (seclist = &stdoutput->sections;
10625 1.1 skrll seclist && *seclist;
10626 1.1 skrll seclist = &(*seclist)->next)
10627 1.1 skrll {
10628 1.1 skrll segment_info_type *seginfo;
10629 1.1 skrll xtensa_block_info *block;
10630 1.1 skrll segT sec = *seclist;
10631 1.1 skrll
10632 1.1 skrll seginfo = seg_info (sec);
10633 1.1 skrll block = seginfo->tc_segment_info_data.blocks[sec_type];
10634 1.1 skrll
10635 1.1 skrll if (block)
10636 1.1 skrll {
10637 1.1 skrll xtensa_block_info *cur_block;
10638 1.1 skrll int num_recs = 0;
10639 1.1 skrll bfd_size_type rec_size;
10640 1.1 skrll
10641 1.1 skrll for (cur_block = block; cur_block; cur_block = cur_block->next)
10642 1.1 skrll num_recs++;
10643 1.1 skrll
10644 1.1 skrll rec_size = num_recs * (8 + 4);
10645 1.1 skrll bfd_set_section_size (stdoutput, sec, rec_size);
10646 1.1 skrll /* elf_section_data (sec)->this_hdr.sh_entsize = 12; */
10647 1.1 skrll
10648 1.1 skrll if (num_recs)
10649 1.1 skrll {
10650 1.1 skrll char *frag_data;
10651 1.1 skrll int i;
10652 1.1 skrll
10653 1.1 skrll subseg_set (sec, 0);
10654 1.1 skrll frag_data = frag_more (rec_size);
10655 1.1 skrll cur_block = block;
10656 1.1 skrll for (i = 0; i < num_recs; i++)
10657 1.1 skrll {
10658 1.1 skrll fixS *fix;
10659 1.1 skrll
10660 1.1 skrll /* Write the fixup. */
10661 1.1 skrll assert (cur_block);
10662 1.1 skrll fix = fix_new (frag_now, i * 12, 4,
10663 1.1 skrll section_symbol (cur_block->sec),
10664 1.1 skrll cur_block->offset,
10665 1.1 skrll FALSE, BFD_RELOC_32);
10666 1.1 skrll fix->fx_file = "<internal>";
10667 1.1 skrll fix->fx_line = 0;
10668 1.1 skrll
10669 1.1 skrll /* Write the length. */
10670 1.1 skrll md_number_to_chars (&frag_data[4 + i * 12],
10671 1.1 skrll cur_block->size, 4);
10672 1.1 skrll md_number_to_chars (&frag_data[8 + i * 12],
10673 1.1 skrll frag_flags_to_number (&cur_block->flags),
10674 1.1 skrll 4);
10675 1.1 skrll cur_block = cur_block->next;
10676 1.1 skrll }
10677 1.1 skrll frag_wane (frag_now);
10678 1.1 skrll frag_new (0);
10679 1.1 skrll frag_wane (frag_now);
10680 1.1 skrll }
10681 1.1 skrll }
10682 1.1 skrll }
10683 1.1 skrll }
10684 1.1 skrll
10685 1.1 skrll
10686 1.1 skrll static bfd_boolean
10687 1.1 skrll exclude_section_from_property_tables (segT sec)
10688 1.1 skrll {
10689 1.1 skrll flagword flags = bfd_get_section_flags (stdoutput, sec);
10690 1.1 skrll
10691 1.1 skrll /* Sections that don't contribute to the memory footprint are excluded. */
10692 1.1 skrll if ((flags & SEC_DEBUGGING)
10693 1.1 skrll || !(flags & SEC_ALLOC)
10694 1.1 skrll || (flags & SEC_MERGE))
10695 1.1 skrll return TRUE;
10696 1.1 skrll
10697 1.1 skrll /* Linker cie and fde optimizations mess up property entries for
10698 1.1 skrll eh_frame sections, but there is nothing inside them relevant to
10699 1.1 skrll property tables anyway. */
10700 1.1 skrll if (strcmp (sec->name, ".eh_frame") == 0)
10701 1.1 skrll return TRUE;
10702 1.1 skrll
10703 1.1 skrll return FALSE;
10704 1.1 skrll }
10705 1.1 skrll
10706 1.1 skrll
10707 1.1 skrll static bfd_boolean
10708 1.1 skrll section_has_property (segT sec, frag_predicate property_function)
10709 1.1 skrll {
10710 1.1 skrll segment_info_type *seginfo = seg_info (sec);
10711 1.1 skrll fragS *fragP;
10712 1.1 skrll
10713 1.1 skrll if (seginfo && seginfo->frchainP)
10714 1.1 skrll {
10715 1.1 skrll for (fragP = seginfo->frchainP->frch_root; fragP; fragP = fragP->fr_next)
10716 1.1 skrll {
10717 1.1 skrll if (property_function (fragP)
10718 1.1 skrll && (fragP->fr_type != rs_fill || fragP->fr_fix != 0))
10719 1.1 skrll return TRUE;
10720 1.1 skrll }
10721 1.1 skrll }
10722 1.1 skrll return FALSE;
10723 1.1 skrll }
10724 1.1 skrll
10725 1.1 skrll
10726 1.1 skrll static bfd_boolean
10727 1.1 skrll section_has_xproperty (segT sec, frag_flags_fn property_function)
10728 1.1 skrll {
10729 1.1 skrll segment_info_type *seginfo = seg_info (sec);
10730 1.1 skrll fragS *fragP;
10731 1.1 skrll
10732 1.1 skrll if (seginfo && seginfo->frchainP)
10733 1.1 skrll {
10734 1.1 skrll for (fragP = seginfo->frchainP->frch_root; fragP; fragP = fragP->fr_next)
10735 1.1 skrll {
10736 1.1 skrll frag_flags prop_flags;
10737 1.1 skrll property_function (fragP, &prop_flags);
10738 1.1 skrll if (!xtensa_frag_flags_is_empty (&prop_flags))
10739 1.1 skrll return TRUE;
10740 1.1 skrll }
10741 1.1 skrll }
10742 1.1 skrll return FALSE;
10743 1.1 skrll }
10744 1.1 skrll
10745 1.1 skrll
10746 1.1 skrll /* Two types of block sections exist right now: literal and insns. */
10747 1.1 skrll
10748 1.1 skrll static void
10749 1.1 skrll add_xt_block_frags (segT sec,
10750 1.1 skrll xtensa_block_info **xt_block,
10751 1.1 skrll frag_predicate property_function,
10752 1.1 skrll frag_predicate end_property_function)
10753 1.1 skrll {
10754 1.1 skrll bfd_vma seg_offset;
10755 1.1 skrll fragS *fragP;
10756 1.1 skrll
10757 1.1 skrll /* Build it if needed. */
10758 1.1 skrll while (*xt_block != NULL)
10759 1.1 skrll xt_block = &(*xt_block)->next;
10760 1.1 skrll /* We are either at NULL at the beginning or at the end. */
10761 1.1 skrll
10762 1.1 skrll /* Walk through the frags. */
10763 1.1 skrll seg_offset = 0;
10764 1.1 skrll
10765 1.1 skrll if (seg_info (sec)->frchainP)
10766 1.1 skrll {
10767 1.1 skrll for (fragP = seg_info (sec)->frchainP->frch_root;
10768 1.1 skrll fragP;
10769 1.1 skrll fragP = fragP->fr_next)
10770 1.1 skrll {
10771 1.1 skrll if (property_function (fragP)
10772 1.1 skrll && (fragP->fr_type != rs_fill || fragP->fr_fix != 0))
10773 1.1 skrll {
10774 1.1 skrll if (*xt_block != NULL)
10775 1.1 skrll {
10776 1.1 skrll if ((*xt_block)->offset + (*xt_block)->size
10777 1.1 skrll == fragP->fr_address)
10778 1.1 skrll (*xt_block)->size += fragP->fr_fix;
10779 1.1 skrll else
10780 1.1 skrll xt_block = &((*xt_block)->next);
10781 1.1 skrll }
10782 1.1 skrll if (*xt_block == NULL)
10783 1.1 skrll {
10784 1.1 skrll xtensa_block_info *new_block = (xtensa_block_info *)
10785 1.1 skrll xmalloc (sizeof (xtensa_block_info));
10786 1.1 skrll new_block->sec = sec;
10787 1.1 skrll new_block->offset = fragP->fr_address;
10788 1.1 skrll new_block->size = fragP->fr_fix;
10789 1.1 skrll new_block->next = NULL;
10790 1.1 skrll xtensa_frag_flags_init (&new_block->flags);
10791 1.1 skrll *xt_block = new_block;
10792 1.1 skrll }
10793 1.1 skrll if (end_property_function
10794 1.1 skrll && end_property_function (fragP))
10795 1.1 skrll {
10796 1.1 skrll xt_block = &((*xt_block)->next);
10797 1.1 skrll }
10798 1.1 skrll }
10799 1.1 skrll }
10800 1.1 skrll }
10801 1.1 skrll }
10802 1.1 skrll
10803 1.1 skrll
10804 1.1 skrll /* Break the encapsulation of add_xt_prop_frags here. */
10805 1.1 skrll
10806 1.1 skrll static bfd_boolean
10807 1.1 skrll xtensa_frag_flags_is_empty (const frag_flags *prop_flags)
10808 1.1 skrll {
10809 1.1 skrll if (prop_flags->is_literal
10810 1.1 skrll || prop_flags->is_insn
10811 1.1 skrll || prop_flags->is_data
10812 1.1 skrll || prop_flags->is_unreachable)
10813 1.1 skrll return FALSE;
10814 1.1 skrll return TRUE;
10815 1.1 skrll }
10816 1.1 skrll
10817 1.1 skrll
10818 1.1 skrll static void
10819 1.1 skrll xtensa_frag_flags_init (frag_flags *prop_flags)
10820 1.1 skrll {
10821 1.1 skrll memset (prop_flags, 0, sizeof (frag_flags));
10822 1.1 skrll }
10823 1.1 skrll
10824 1.1 skrll
10825 1.1 skrll static void
10826 1.1 skrll get_frag_property_flags (const fragS *fragP, frag_flags *prop_flags)
10827 1.1 skrll {
10828 1.1 skrll xtensa_frag_flags_init (prop_flags);
10829 1.1 skrll if (fragP->tc_frag_data.is_literal)
10830 1.1 skrll prop_flags->is_literal = TRUE;
10831 1.1 skrll if (fragP->tc_frag_data.is_specific_opcode
10832 1.1 skrll || fragP->tc_frag_data.is_no_transform)
10833 1.1 skrll {
10834 1.1 skrll prop_flags->is_no_transform = TRUE;
10835 1.1 skrll if (xtensa_frag_flags_is_empty (prop_flags))
10836 1.1 skrll prop_flags->is_data = TRUE;
10837 1.1 skrll }
10838 1.1 skrll if (fragP->tc_frag_data.is_unreachable)
10839 1.1 skrll prop_flags->is_unreachable = TRUE;
10840 1.1 skrll else if (fragP->tc_frag_data.is_insn)
10841 1.1 skrll {
10842 1.1 skrll prop_flags->is_insn = TRUE;
10843 1.1 skrll if (fragP->tc_frag_data.is_loop_target)
10844 1.1 skrll prop_flags->insn.is_loop_target = TRUE;
10845 1.1 skrll if (fragP->tc_frag_data.is_branch_target)
10846 1.1 skrll prop_flags->insn.is_branch_target = TRUE;
10847 1.1 skrll if (fragP->tc_frag_data.is_no_density)
10848 1.1 skrll prop_flags->insn.is_no_density = TRUE;
10849 1.1 skrll if (fragP->tc_frag_data.use_absolute_literals)
10850 1.1 skrll prop_flags->insn.is_abslit = TRUE;
10851 1.1 skrll }
10852 1.1 skrll if (fragP->tc_frag_data.is_align)
10853 1.1 skrll {
10854 1.1 skrll prop_flags->is_align = TRUE;
10855 1.1 skrll prop_flags->alignment = fragP->tc_frag_data.alignment;
10856 1.1 skrll if (xtensa_frag_flags_is_empty (prop_flags))
10857 1.1 skrll prop_flags->is_data = TRUE;
10858 1.1 skrll }
10859 1.1 skrll }
10860 1.1 skrll
10861 1.1 skrll
10862 1.1 skrll static bfd_vma
10863 1.1 skrll frag_flags_to_number (const frag_flags *prop_flags)
10864 1.1 skrll {
10865 1.1 skrll bfd_vma num = 0;
10866 1.1 skrll if (prop_flags->is_literal)
10867 1.1 skrll num |= XTENSA_PROP_LITERAL;
10868 1.1 skrll if (prop_flags->is_insn)
10869 1.1 skrll num |= XTENSA_PROP_INSN;
10870 1.1 skrll if (prop_flags->is_data)
10871 1.1 skrll num |= XTENSA_PROP_DATA;
10872 1.1 skrll if (prop_flags->is_unreachable)
10873 1.1 skrll num |= XTENSA_PROP_UNREACHABLE;
10874 1.1 skrll if (prop_flags->insn.is_loop_target)
10875 1.1 skrll num |= XTENSA_PROP_INSN_LOOP_TARGET;
10876 1.1 skrll if (prop_flags->insn.is_branch_target)
10877 1.1 skrll {
10878 1.1 skrll num |= XTENSA_PROP_INSN_BRANCH_TARGET;
10879 1.1 skrll num = SET_XTENSA_PROP_BT_ALIGN (num, prop_flags->insn.bt_align_priority);
10880 1.1 skrll }
10881 1.1 skrll
10882 1.1 skrll if (prop_flags->insn.is_no_density)
10883 1.1 skrll num |= XTENSA_PROP_INSN_NO_DENSITY;
10884 1.1 skrll if (prop_flags->is_no_transform)
10885 1.1 skrll num |= XTENSA_PROP_NO_TRANSFORM;
10886 1.1 skrll if (prop_flags->insn.is_no_reorder)
10887 1.1 skrll num |= XTENSA_PROP_INSN_NO_REORDER;
10888 1.1 skrll if (prop_flags->insn.is_abslit)
10889 1.1 skrll num |= XTENSA_PROP_INSN_ABSLIT;
10890 1.1 skrll
10891 1.1 skrll if (prop_flags->is_align)
10892 1.1 skrll {
10893 1.1 skrll num |= XTENSA_PROP_ALIGN;
10894 1.1 skrll num = SET_XTENSA_PROP_ALIGNMENT (num, prop_flags->alignment);
10895 1.1 skrll }
10896 1.1 skrll
10897 1.1 skrll return num;
10898 1.1 skrll }
10899 1.1 skrll
10900 1.1 skrll
10901 1.1 skrll static bfd_boolean
10902 1.1 skrll xtensa_frag_flags_combinable (const frag_flags *prop_flags_1,
10903 1.1 skrll const frag_flags *prop_flags_2)
10904 1.1 skrll {
10905 1.1 skrll /* Cannot combine with an end marker. */
10906 1.1 skrll
10907 1.1 skrll if (prop_flags_1->is_literal != prop_flags_2->is_literal)
10908 1.1 skrll return FALSE;
10909 1.1 skrll if (prop_flags_1->is_insn != prop_flags_2->is_insn)
10910 1.1 skrll return FALSE;
10911 1.1 skrll if (prop_flags_1->is_data != prop_flags_2->is_data)
10912 1.1 skrll return FALSE;
10913 1.1 skrll
10914 1.1 skrll if (prop_flags_1->is_insn)
10915 1.1 skrll {
10916 1.1 skrll /* Properties of the beginning of the frag. */
10917 1.1 skrll if (prop_flags_2->insn.is_loop_target)
10918 1.1 skrll return FALSE;
10919 1.1 skrll if (prop_flags_2->insn.is_branch_target)
10920 1.1 skrll return FALSE;
10921 1.1 skrll if (prop_flags_1->insn.is_no_density !=
10922 1.1 skrll prop_flags_2->insn.is_no_density)
10923 1.1 skrll return FALSE;
10924 1.1 skrll if (prop_flags_1->is_no_transform !=
10925 1.1 skrll prop_flags_2->is_no_transform)
10926 1.1 skrll return FALSE;
10927 1.1 skrll if (prop_flags_1->insn.is_no_reorder !=
10928 1.1 skrll prop_flags_2->insn.is_no_reorder)
10929 1.1 skrll return FALSE;
10930 1.1 skrll if (prop_flags_1->insn.is_abslit !=
10931 1.1 skrll prop_flags_2->insn.is_abslit)
10932 1.1 skrll return FALSE;
10933 1.1 skrll }
10934 1.1 skrll
10935 1.1 skrll if (prop_flags_1->is_align)
10936 1.1 skrll return FALSE;
10937 1.1 skrll
10938 1.1 skrll return TRUE;
10939 1.1 skrll }
10940 1.1 skrll
10941 1.1 skrll
10942 1.1 skrll static bfd_vma
10943 1.1 skrll xt_block_aligned_size (const xtensa_block_info *xt_block)
10944 1.1 skrll {
10945 1.1 skrll bfd_vma end_addr;
10946 1.1 skrll unsigned align_bits;
10947 1.1 skrll
10948 1.1 skrll if (!xt_block->flags.is_align)
10949 1.1 skrll return xt_block->size;
10950 1.1 skrll
10951 1.1 skrll end_addr = xt_block->offset + xt_block->size;
10952 1.1 skrll align_bits = xt_block->flags.alignment;
10953 1.1 skrll end_addr = ((end_addr + ((1 << align_bits) -1)) >> align_bits) << align_bits;
10954 1.1 skrll return end_addr - xt_block->offset;
10955 1.1 skrll }
10956 1.1 skrll
10957 1.1 skrll
10958 1.1 skrll static bfd_boolean
10959 1.1 skrll xtensa_xt_block_combine (xtensa_block_info *xt_block,
10960 1.1 skrll const xtensa_block_info *xt_block_2)
10961 1.1 skrll {
10962 1.1 skrll if (xt_block->sec != xt_block_2->sec)
10963 1.1 skrll return FALSE;
10964 1.1 skrll if (xt_block->offset + xt_block_aligned_size (xt_block)
10965 1.1 skrll != xt_block_2->offset)
10966 1.1 skrll return FALSE;
10967 1.1 skrll
10968 1.1 skrll if (xt_block_2->size == 0
10969 1.1 skrll && (!xt_block_2->flags.is_unreachable
10970 1.1 skrll || xt_block->flags.is_unreachable))
10971 1.1 skrll {
10972 1.1 skrll if (xt_block_2->flags.is_align
10973 1.1 skrll && xt_block->flags.is_align)
10974 1.1 skrll {
10975 1.1 skrll /* Nothing needed. */
10976 1.1 skrll if (xt_block->flags.alignment >= xt_block_2->flags.alignment)
10977 1.1 skrll return TRUE;
10978 1.1 skrll }
10979 1.1 skrll else
10980 1.1 skrll {
10981 1.1 skrll if (xt_block_2->flags.is_align)
10982 1.1 skrll {
10983 1.1 skrll /* Push alignment to previous entry. */
10984 1.1 skrll xt_block->flags.is_align = xt_block_2->flags.is_align;
10985 1.1 skrll xt_block->flags.alignment = xt_block_2->flags.alignment;
10986 1.1 skrll }
10987 1.1 skrll return TRUE;
10988 1.1 skrll }
10989 1.1 skrll }
10990 1.1 skrll if (!xtensa_frag_flags_combinable (&xt_block->flags,
10991 1.1 skrll &xt_block_2->flags))
10992 1.1 skrll return FALSE;
10993 1.1 skrll
10994 1.1 skrll xt_block->size += xt_block_2->size;
10995 1.1 skrll
10996 1.1 skrll if (xt_block_2->flags.is_align)
10997 1.1 skrll {
10998 1.1 skrll xt_block->flags.is_align = TRUE;
10999 1.1 skrll xt_block->flags.alignment = xt_block_2->flags.alignment;
11000 1.1 skrll }
11001 1.1 skrll
11002 1.1 skrll return TRUE;
11003 1.1 skrll }
11004 1.1 skrll
11005 1.1 skrll
11006 1.1 skrll static void
11007 1.1 skrll add_xt_prop_frags (segT sec,
11008 1.1 skrll xtensa_block_info **xt_block,
11009 1.1 skrll frag_flags_fn property_function)
11010 1.1 skrll {
11011 1.1 skrll bfd_vma seg_offset;
11012 1.1 skrll fragS *fragP;
11013 1.1 skrll
11014 1.1 skrll /* Build it if needed. */
11015 1.1 skrll while (*xt_block != NULL)
11016 1.1 skrll {
11017 1.1 skrll xt_block = &(*xt_block)->next;
11018 1.1 skrll }
11019 1.1 skrll /* We are either at NULL at the beginning or at the end. */
11020 1.1 skrll
11021 1.1 skrll /* Walk through the frags. */
11022 1.1 skrll seg_offset = 0;
11023 1.1 skrll
11024 1.1 skrll if (seg_info (sec)->frchainP)
11025 1.1 skrll {
11026 1.1 skrll for (fragP = seg_info (sec)->frchainP->frch_root; fragP;
11027 1.1 skrll fragP = fragP->fr_next)
11028 1.1 skrll {
11029 1.1 skrll xtensa_block_info tmp_block;
11030 1.1 skrll tmp_block.sec = sec;
11031 1.1 skrll tmp_block.offset = fragP->fr_address;
11032 1.1 skrll tmp_block.size = fragP->fr_fix;
11033 1.1 skrll tmp_block.next = NULL;
11034 1.1 skrll property_function (fragP, &tmp_block.flags);
11035 1.1 skrll
11036 1.1 skrll if (!xtensa_frag_flags_is_empty (&tmp_block.flags))
11037 1.1 skrll /* && fragP->fr_fix != 0) */
11038 1.1 skrll {
11039 1.1 skrll if ((*xt_block) == NULL
11040 1.1 skrll || !xtensa_xt_block_combine (*xt_block, &tmp_block))
11041 1.1 skrll {
11042 1.1 skrll xtensa_block_info *new_block;
11043 1.1 skrll if ((*xt_block) != NULL)
11044 1.1 skrll xt_block = &(*xt_block)->next;
11045 1.1 skrll new_block = (xtensa_block_info *)
11046 1.1 skrll xmalloc (sizeof (xtensa_block_info));
11047 1.1 skrll *new_block = tmp_block;
11048 1.1 skrll *xt_block = new_block;
11049 1.1 skrll }
11050 1.1 skrll }
11051 1.1 skrll }
11052 1.1 skrll }
11053 1.1 skrll }
11054 1.1 skrll
11055 1.1 skrll
11056 1.1 skrll /* op_placement_info_table */
11058 1.1 skrll
11059 1.1 skrll /* op_placement_info makes it easier to determine which
11060 1.1 skrll ops can go in which slots. */
11061 1.1 skrll
11062 1.1 skrll static void
11063 1.1 skrll init_op_placement_info_table (void)
11064 1.1 skrll {
11065 1.1 skrll xtensa_isa isa = xtensa_default_isa;
11066 1.1 skrll xtensa_insnbuf ibuf = xtensa_insnbuf_alloc (isa);
11067 1.1 skrll xtensa_opcode opcode;
11068 1.1 skrll xtensa_format fmt;
11069 1.1 skrll int slot;
11070 1.1 skrll int num_opcodes = xtensa_isa_num_opcodes (isa);
11071 1.1 skrll
11072 1.1 skrll op_placement_table = (op_placement_info_table)
11073 1.1 skrll xmalloc (sizeof (op_placement_info) * num_opcodes);
11074 1.1 skrll assert (xtensa_isa_num_formats (isa) < MAX_FORMATS);
11075 1.1 skrll
11076 1.1 skrll for (opcode = 0; opcode < num_opcodes; opcode++)
11077 1.1 skrll {
11078 1.1 skrll op_placement_info *opi = &op_placement_table[opcode];
11079 1.1 skrll /* FIXME: Make tinsn allocation dynamic. */
11080 1.1 skrll if (xtensa_opcode_num_operands (isa, opcode) >= MAX_INSN_ARGS)
11081 1.1 skrll as_fatal (_("too many operands in instruction"));
11082 1.1 skrll opi->narrowest = XTENSA_UNDEFINED;
11083 1.1 skrll opi->narrowest_size = 0x7F;
11084 1.1 skrll opi->narrowest_slot = 0;
11085 1.1 skrll opi->formats = 0;
11086 1.1 skrll opi->num_formats = 0;
11087 1.1 skrll opi->issuef = 0;
11088 1.1 skrll for (fmt = 0; fmt < xtensa_isa_num_formats (isa); fmt++)
11089 1.1 skrll {
11090 1.1 skrll opi->slots[fmt] = 0;
11091 1.1 skrll for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
11092 1.1 skrll {
11093 1.1 skrll if (xtensa_opcode_encode (isa, fmt, slot, ibuf, opcode) == 0)
11094 1.1 skrll {
11095 1.1 skrll int fmt_length = xtensa_format_length (isa, fmt);
11096 1.1 skrll opi->issuef++;
11097 1.1 skrll set_bit (fmt, opi->formats);
11098 1.1 skrll set_bit (slot, opi->slots[fmt]);
11099 1.1 skrll if (fmt_length < opi->narrowest_size
11100 1.1 skrll || (fmt_length == opi->narrowest_size
11101 1.1 skrll && (xtensa_format_num_slots (isa, fmt)
11102 1.1 skrll < xtensa_format_num_slots (isa,
11103 1.1 skrll opi->narrowest))))
11104 1.1 skrll {
11105 1.1 skrll opi->narrowest = fmt;
11106 1.1 skrll opi->narrowest_size = fmt_length;
11107 1.1 skrll opi->narrowest_slot = slot;
11108 1.1 skrll }
11109 1.1 skrll }
11110 1.1 skrll }
11111 1.1 skrll if (opi->formats)
11112 1.1 skrll opi->num_formats++;
11113 1.1 skrll }
11114 1.1 skrll }
11115 1.1 skrll xtensa_insnbuf_free (isa, ibuf);
11116 1.1 skrll }
11117 1.1 skrll
11118 1.1 skrll
11119 1.1 skrll bfd_boolean
11120 1.1 skrll opcode_fits_format_slot (xtensa_opcode opcode, xtensa_format fmt, int slot)
11121 1.1 skrll {
11122 1.1 skrll return bit_is_set (slot, op_placement_table[opcode].slots[fmt]);
11123 1.1 skrll }
11124 1.1 skrll
11125 1.1 skrll
11126 1.1 skrll /* If the opcode is available in a single slot format, return its size. */
11127 1.1 skrll
11128 1.1 skrll static int
11129 1.1 skrll xg_get_single_size (xtensa_opcode opcode)
11130 1.1 skrll {
11131 1.1 skrll return op_placement_table[opcode].narrowest_size;
11132 1.1 skrll }
11133 1.1 skrll
11134 1.1 skrll
11135 1.1 skrll static xtensa_format
11136 1.1 skrll xg_get_single_format (xtensa_opcode opcode)
11137 1.1 skrll {
11138 1.1 skrll return op_placement_table[opcode].narrowest;
11139 1.1 skrll }
11140 1.1 skrll
11141 1.1 skrll
11142 1.1 skrll static int
11143 1.1 skrll xg_get_single_slot (xtensa_opcode opcode)
11144 1.1 skrll {
11145 1.1 skrll return op_placement_table[opcode].narrowest_slot;
11146 1.1 skrll }
11147 1.1 skrll
11148 1.1 skrll
11149 1.1 skrll /* Instruction Stack Functions (from "xtensa-istack.h"). */
11151 1.1 skrll
11152 1.1 skrll void
11153 1.1 skrll istack_init (IStack *stack)
11154 1.1 skrll {
11155 1.1 skrll memset (stack, 0, sizeof (IStack));
11156 1.1 skrll stack->ninsn = 0;
11157 1.1 skrll }
11158 1.1 skrll
11159 1.1 skrll
11160 1.1 skrll bfd_boolean
11161 1.1 skrll istack_empty (IStack *stack)
11162 1.1 skrll {
11163 1.1 skrll return (stack->ninsn == 0);
11164 1.1 skrll }
11165 1.1 skrll
11166 1.1 skrll
11167 1.1 skrll bfd_boolean
11168 1.1 skrll istack_full (IStack *stack)
11169 1.1 skrll {
11170 1.1 skrll return (stack->ninsn == MAX_ISTACK);
11171 1.1 skrll }
11172 1.1 skrll
11173 1.1 skrll
11174 1.1 skrll /* Return a pointer to the top IStack entry.
11175 1.1 skrll It is an error to call this if istack_empty () is TRUE. */
11176 1.1 skrll
11177 1.1 skrll TInsn *
11178 1.1 skrll istack_top (IStack *stack)
11179 1.1 skrll {
11180 1.1 skrll int rec = stack->ninsn - 1;
11181 1.1 skrll assert (!istack_empty (stack));
11182 1.1 skrll return &stack->insn[rec];
11183 1.1 skrll }
11184 1.1 skrll
11185 1.1 skrll
11186 1.1 skrll /* Add a new TInsn to an IStack.
11187 1.1 skrll It is an error to call this if istack_full () is TRUE. */
11188 1.1 skrll
11189 1.1 skrll void
11190 1.1 skrll istack_push (IStack *stack, TInsn *insn)
11191 1.1 skrll {
11192 1.1 skrll int rec = stack->ninsn;
11193 1.1 skrll assert (!istack_full (stack));
11194 1.1 skrll stack->insn[rec] = *insn;
11195 1.1 skrll stack->ninsn++;
11196 1.1 skrll }
11197 1.1 skrll
11198 1.1 skrll
11199 1.1 skrll /* Clear space for the next TInsn on the IStack and return a pointer
11200 1.1 skrll to it. It is an error to call this if istack_full () is TRUE. */
11201 1.1 skrll
11202 1.1 skrll TInsn *
11203 1.1 skrll istack_push_space (IStack *stack)
11204 1.1 skrll {
11205 1.1 skrll int rec = stack->ninsn;
11206 1.1 skrll TInsn *insn;
11207 1.1 skrll assert (!istack_full (stack));
11208 1.1 skrll insn = &stack->insn[rec];
11209 1.1 skrll tinsn_init (insn);
11210 1.1 skrll stack->ninsn++;
11211 1.1 skrll return insn;
11212 1.1 skrll }
11213 1.1 skrll
11214 1.1 skrll
11215 1.1 skrll /* Remove the last pushed instruction. It is an error to call this if
11216 1.1 skrll istack_empty () returns TRUE. */
11217 1.1 skrll
11218 1.1 skrll void
11219 1.1 skrll istack_pop (IStack *stack)
11220 1.1 skrll {
11221 1.1 skrll int rec = stack->ninsn - 1;
11222 1.1 skrll assert (!istack_empty (stack));
11223 1.1 skrll stack->ninsn--;
11224 1.1 skrll tinsn_init (&stack->insn[rec]);
11225 1.1 skrll }
11226 1.1 skrll
11227 1.1 skrll
11228 1.1 skrll /* TInsn functions. */
11230 1.1 skrll
11231 1.1 skrll void
11232 1.1 skrll tinsn_init (TInsn *dst)
11233 1.1 skrll {
11234 1.1 skrll memset (dst, 0, sizeof (TInsn));
11235 1.1 skrll }
11236 1.1 skrll
11237 1.1 skrll
11238 1.1 skrll /* Return TRUE if ANY of the operands in the insn are symbolic. */
11239 1.1 skrll
11240 1.1 skrll static bfd_boolean
11241 1.1 skrll tinsn_has_symbolic_operands (const TInsn *insn)
11242 1.1 skrll {
11243 1.1 skrll int i;
11244 1.1 skrll int n = insn->ntok;
11245 1.1 skrll
11246 1.1 skrll assert (insn->insn_type == ITYPE_INSN);
11247 1.1 skrll
11248 1.1 skrll for (i = 0; i < n; ++i)
11249 1.1 skrll {
11250 1.1 skrll switch (insn->tok[i].X_op)
11251 1.1 skrll {
11252 1.1 skrll case O_register:
11253 1.1 skrll case O_constant:
11254 1.1 skrll break;
11255 1.1 skrll default:
11256 1.1 skrll return TRUE;
11257 1.1 skrll }
11258 1.1 skrll }
11259 1.1 skrll return FALSE;
11260 1.1 skrll }
11261 1.1 skrll
11262 1.1 skrll
11263 1.1 skrll bfd_boolean
11264 1.1 skrll tinsn_has_invalid_symbolic_operands (const TInsn *insn)
11265 1.1 skrll {
11266 1.1 skrll xtensa_isa isa = xtensa_default_isa;
11267 1.1 skrll int i;
11268 1.1 skrll int n = insn->ntok;
11269 1.1 skrll
11270 1.1 skrll assert (insn->insn_type == ITYPE_INSN);
11271 1.1 skrll
11272 1.1 skrll for (i = 0; i < n; ++i)
11273 1.1 skrll {
11274 1.1 skrll switch (insn->tok[i].X_op)
11275 1.1 skrll {
11276 1.1 skrll case O_register:
11277 1.1 skrll case O_constant:
11278 1.1 skrll break;
11279 1.1 skrll case O_big:
11280 1.1 skrll case O_illegal:
11281 1.1 skrll case O_absent:
11282 1.1 skrll /* Errors for these types are caught later. */
11283 1.1 skrll break;
11284 1.1 skrll case O_hi16:
11285 1.1 skrll case O_lo16:
11286 1.1 skrll default:
11287 1.1 skrll /* Symbolic immediates are only allowed on the last immediate
11288 1.1 skrll operand. At this time, CONST16 is the only opcode where we
11289 1.1 skrll support non-PC-relative relocations. */
11290 1.1 skrll if (i != get_relaxable_immed (insn->opcode)
11291 1.1 skrll || (xtensa_operand_is_PCrelative (isa, insn->opcode, i) != 1
11292 1.1 skrll && insn->opcode != xtensa_const16_opcode))
11293 1.1 skrll {
11294 1.1 skrll as_bad (_("invalid symbolic operand"));
11295 1.1 skrll return TRUE;
11296 1.1 skrll }
11297 1.1 skrll }
11298 1.1 skrll }
11299 1.1 skrll return FALSE;
11300 1.1 skrll }
11301 1.1 skrll
11302 1.1 skrll
11303 1.1 skrll /* For assembly code with complex expressions (e.g. subtraction),
11304 1.1 skrll we have to build them in the literal pool so that
11305 1.1 skrll their results are calculated correctly after relaxation.
11306 1.1 skrll The relaxation only handles expressions that
11307 1.1 skrll boil down to SYMBOL + OFFSET. */
11308 1.1 skrll
11309 1.1 skrll static bfd_boolean
11310 1.1 skrll tinsn_has_complex_operands (const TInsn *insn)
11311 1.1 skrll {
11312 1.1 skrll int i;
11313 1.1 skrll int n = insn->ntok;
11314 1.1 skrll assert (insn->insn_type == ITYPE_INSN);
11315 1.1 skrll for (i = 0; i < n; ++i)
11316 1.1 skrll {
11317 1.1 skrll switch (insn->tok[i].X_op)
11318 1.1 skrll {
11319 1.1 skrll case O_register:
11320 1.1 skrll case O_constant:
11321 1.1 skrll case O_symbol:
11322 1.1 skrll case O_lo16:
11323 1.1 skrll case O_hi16:
11324 1.1 skrll break;
11325 1.1 skrll default:
11326 1.1 skrll return TRUE;
11327 1.1 skrll }
11328 1.1 skrll }
11329 1.1 skrll return FALSE;
11330 1.1 skrll }
11331 1.1 skrll
11332 1.1 skrll
11333 1.1 skrll /* Encode a TInsn opcode and its constant operands into slotbuf.
11334 1.1 skrll Return TRUE if there is a symbol in the immediate field. This
11335 1.1 skrll function assumes that:
11336 1.1 skrll 1) The number of operands are correct.
11337 1.1 skrll 2) The insn_type is ITYPE_INSN.
11338 1.1 skrll 3) The opcode can be encoded in the specified format and slot.
11339 1.1 skrll 4) Operands are either O_constant or O_symbol, and all constants fit. */
11340 1.1 skrll
11341 1.1 skrll static bfd_boolean
11342 1.1 skrll tinsn_to_slotbuf (xtensa_format fmt,
11343 1.1 skrll int slot,
11344 1.1 skrll TInsn *tinsn,
11345 1.1 skrll xtensa_insnbuf slotbuf)
11346 1.1 skrll {
11347 1.1 skrll xtensa_isa isa = xtensa_default_isa;
11348 1.1 skrll xtensa_opcode opcode = tinsn->opcode;
11349 1.1 skrll bfd_boolean has_fixup = FALSE;
11350 1.1 skrll int noperands = xtensa_opcode_num_operands (isa, opcode);
11351 1.1 skrll int i;
11352 1.1 skrll
11353 1.1 skrll assert (tinsn->insn_type == ITYPE_INSN);
11354 1.1 skrll if (noperands != tinsn->ntok)
11355 1.1 skrll as_fatal (_("operand number mismatch"));
11356 1.1 skrll
11357 1.1 skrll if (xtensa_opcode_encode (isa, fmt, slot, slotbuf, opcode))
11358 1.1 skrll {
11359 1.1 skrll as_bad (_("cannot encode opcode \"%s\" in the given format \"%s\""),
11360 1.1 skrll xtensa_opcode_name (isa, opcode), xtensa_format_name (isa, fmt));
11361 1.1 skrll return FALSE;
11362 1.1 skrll }
11363 1.1 skrll
11364 1.1 skrll for (i = 0; i < noperands; i++)
11365 1.1 skrll {
11366 1.1 skrll expressionS *expr = &tinsn->tok[i];
11367 1.1 skrll int rc;
11368 1.1 skrll unsigned line;
11369 1.1 skrll char *file_name;
11370 1.1 skrll uint32 opnd_value;
11371 1.1 skrll
11372 1.1 skrll switch (expr->X_op)
11373 1.1 skrll {
11374 1.1 skrll case O_register:
11375 1.1 skrll if (xtensa_operand_is_visible (isa, opcode, i) == 0)
11376 1.1 skrll break;
11377 1.1 skrll /* The register number has already been checked in
11378 1.1 skrll expression_maybe_register, so we don't need to check here. */
11379 1.1 skrll opnd_value = expr->X_add_number;
11380 1.1 skrll (void) xtensa_operand_encode (isa, opcode, i, &opnd_value);
11381 1.1 skrll rc = xtensa_operand_set_field (isa, opcode, i, fmt, slot, slotbuf,
11382 1.1 skrll opnd_value);
11383 1.1 skrll if (rc != 0)
11384 1.1 skrll as_warn (_("xtensa-isa failure: %s"), xtensa_isa_error_msg (isa));
11385 1.1 skrll break;
11386 1.1 skrll
11387 1.1 skrll case O_constant:
11388 1.1 skrll if (xtensa_operand_is_visible (isa, opcode, i) == 0)
11389 1.1 skrll break;
11390 1.1 skrll as_where (&file_name, &line);
11391 1.1 skrll /* It is a constant and we called this function
11392 1.1 skrll then we have to try to fit it. */
11393 1.1 skrll xtensa_insnbuf_set_operand (slotbuf, fmt, slot, opcode, i,
11394 1.1 skrll expr->X_add_number, file_name, line);
11395 1.1 skrll break;
11396 1.1 skrll
11397 1.1 skrll default:
11398 1.1 skrll has_fixup = TRUE;
11399 1.1 skrll break;
11400 1.1 skrll }
11401 1.1 skrll }
11402 1.1 skrll
11403 1.1 skrll return has_fixup;
11404 1.1 skrll }
11405 1.1 skrll
11406 1.1 skrll
11407 1.1 skrll /* Encode a single TInsn into an insnbuf. If the opcode can only be encoded
11408 1.1 skrll into a multi-slot instruction, fill the other slots with NOPs.
11409 1.1 skrll Return TRUE if there is a symbol in the immediate field. See also the
11410 1.1 skrll assumptions listed for tinsn_to_slotbuf. */
11411 1.1 skrll
11412 1.1 skrll static bfd_boolean
11413 1.1 skrll tinsn_to_insnbuf (TInsn *tinsn, xtensa_insnbuf insnbuf)
11414 1.1 skrll {
11415 1.1 skrll static xtensa_insnbuf slotbuf = 0;
11416 1.1 skrll static vliw_insn vinsn;
11417 1.1 skrll xtensa_isa isa = xtensa_default_isa;
11418 1.1 skrll bfd_boolean has_fixup = FALSE;
11419 1.1 skrll int i;
11420 1.1 skrll
11421 1.1 skrll if (!slotbuf)
11422 1.1 skrll {
11423 1.1 skrll slotbuf = xtensa_insnbuf_alloc (isa);
11424 1.1 skrll xg_init_vinsn (&vinsn);
11425 1.1 skrll }
11426 1.1 skrll
11427 1.1 skrll xg_clear_vinsn (&vinsn);
11428 1.1 skrll
11429 1.1 skrll bundle_tinsn (tinsn, &vinsn);
11430 1.1 skrll
11431 1.1 skrll xtensa_format_encode (isa, vinsn.format, insnbuf);
11432 1.1 skrll
11433 1.1 skrll for (i = 0; i < vinsn.num_slots; i++)
11434 1.1 skrll {
11435 1.1 skrll /* Only one slot may have a fix-up because the rest contains NOPs. */
11436 1.1 skrll has_fixup |=
11437 1.1 skrll tinsn_to_slotbuf (vinsn.format, i, &vinsn.slots[i], vinsn.slotbuf[i]);
11438 1.1 skrll xtensa_format_set_slot (isa, vinsn.format, i, insnbuf, vinsn.slotbuf[i]);
11439 1.1 skrll }
11440 1.1 skrll
11441 1.1 skrll return has_fixup;
11442 1.1 skrll }
11443 1.1 skrll
11444 1.1 skrll
11445 1.1 skrll /* Check the instruction arguments. Return TRUE on failure. */
11446 1.1 skrll
11447 1.1 skrll static bfd_boolean
11448 1.1 skrll tinsn_check_arguments (const TInsn *insn)
11449 1.1 skrll {
11450 1.1 skrll xtensa_isa isa = xtensa_default_isa;
11451 1.1 skrll xtensa_opcode opcode = insn->opcode;
11452 1.1 skrll
11453 1.1 skrll if (opcode == XTENSA_UNDEFINED)
11454 1.1 skrll {
11455 1.1 skrll as_bad (_("invalid opcode"));
11456 1.1 skrll return TRUE;
11457 1.1 skrll }
11458 1.1 skrll
11459 1.1 skrll if (xtensa_opcode_num_operands (isa, opcode) > insn->ntok)
11460 1.1 skrll {
11461 1.1 skrll as_bad (_("too few operands"));
11462 1.1 skrll return TRUE;
11463 1.1 skrll }
11464 1.1 skrll
11465 1.1 skrll if (xtensa_opcode_num_operands (isa, opcode) < insn->ntok)
11466 1.1 skrll {
11467 1.1 skrll as_bad (_("too many operands"));
11468 1.1 skrll return TRUE;
11469 1.1 skrll }
11470 1.1 skrll return FALSE;
11471 1.1 skrll }
11472 1.1 skrll
11473 1.1 skrll
11474 1.1 skrll /* Load an instruction from its encoded form. */
11475 1.1 skrll
11476 1.1 skrll static void
11477 1.1 skrll tinsn_from_chars (TInsn *tinsn, char *f, int slot)
11478 1.1 skrll {
11479 1.1 skrll vliw_insn vinsn;
11480 1.1 skrll
11481 1.1 skrll xg_init_vinsn (&vinsn);
11482 1.1 skrll vinsn_from_chars (&vinsn, f);
11483 1.1 skrll
11484 1.1 skrll *tinsn = vinsn.slots[slot];
11485 1.1 skrll xg_free_vinsn (&vinsn);
11486 1.1 skrll }
11487 1.1 skrll
11488 1.1 skrll
11489 1.1 skrll static void
11490 1.1 skrll tinsn_from_insnbuf (TInsn *tinsn,
11491 1.1 skrll xtensa_insnbuf slotbuf,
11492 1.1 skrll xtensa_format fmt,
11493 1.1 skrll int slot)
11494 1.1 skrll {
11495 1.1 skrll int i;
11496 1.1 skrll xtensa_isa isa = xtensa_default_isa;
11497 1.1 skrll
11498 1.1 skrll /* Find the immed. */
11499 1.1 skrll tinsn_init (tinsn);
11500 1.1 skrll tinsn->insn_type = ITYPE_INSN;
11501 1.1 skrll tinsn->is_specific_opcode = FALSE; /* must not be specific */
11502 1.1 skrll tinsn->opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
11503 1.1 skrll tinsn->ntok = xtensa_opcode_num_operands (isa, tinsn->opcode);
11504 1.1 skrll for (i = 0; i < tinsn->ntok; i++)
11505 1.1 skrll {
11506 1.1 skrll set_expr_const (&tinsn->tok[i],
11507 1.1 skrll xtensa_insnbuf_get_operand (slotbuf, fmt, slot,
11508 1.1 skrll tinsn->opcode, i));
11509 1.1 skrll }
11510 1.1 skrll }
11511 1.1 skrll
11512 1.1 skrll
11513 1.1 skrll /* Read the value of the relaxable immed from the fr_symbol and fr_offset. */
11514 1.1 skrll
11515 1.1 skrll static void
11516 1.1 skrll tinsn_immed_from_frag (TInsn *tinsn, fragS *fragP, int slot)
11517 1.1 skrll {
11518 1.1 skrll xtensa_opcode opcode = tinsn->opcode;
11519 1.1 skrll int opnum;
11520 1.1 skrll
11521 1.1 skrll if (fragP->tc_frag_data.slot_symbols[slot])
11522 1.1 skrll {
11523 1.1 skrll opnum = get_relaxable_immed (opcode);
11524 1.1 skrll assert (opnum >= 0);
11525 1.1 skrll set_expr_symbol_offset (&tinsn->tok[opnum],
11526 1.1 skrll fragP->tc_frag_data.slot_symbols[slot],
11527 1.1 skrll fragP->tc_frag_data.slot_offsets[slot]);
11528 1.1 skrll }
11529 1.1 skrll }
11530 1.1 skrll
11531 1.1 skrll
11532 1.1 skrll static int
11533 1.1 skrll get_num_stack_text_bytes (IStack *istack)
11534 1.1 skrll {
11535 1.1 skrll int i;
11536 1.1 skrll int text_bytes = 0;
11537 1.1 skrll
11538 1.1 skrll for (i = 0; i < istack->ninsn; i++)
11539 1.1 skrll {
11540 1.1 skrll TInsn *tinsn = &istack->insn[i];
11541 1.1 skrll if (tinsn->insn_type == ITYPE_INSN)
11542 1.1 skrll text_bytes += xg_get_single_size (tinsn->opcode);
11543 1.1 skrll }
11544 1.1 skrll return text_bytes;
11545 1.1 skrll }
11546 1.1 skrll
11547 1.1 skrll
11548 1.1 skrll static int
11549 1.1 skrll get_num_stack_literal_bytes (IStack *istack)
11550 1.1 skrll {
11551 1.1 skrll int i;
11552 1.1 skrll int lit_bytes = 0;
11553 1.1 skrll
11554 1.1 skrll for (i = 0; i < istack->ninsn; i++)
11555 1.1 skrll {
11556 1.1 skrll TInsn *tinsn = &istack->insn[i];
11557 1.1 skrll if (tinsn->insn_type == ITYPE_LITERAL && tinsn->ntok == 1)
11558 1.1 skrll lit_bytes += 4;
11559 1.1 skrll }
11560 1.1 skrll return lit_bytes;
11561 1.1 skrll }
11562 1.1 skrll
11563 1.1 skrll
11564 1.1 skrll /* vliw_insn functions. */
11566 1.1 skrll
11567 1.1 skrll static void
11568 1.1 skrll xg_init_vinsn (vliw_insn *v)
11569 1.1 skrll {
11570 1.1 skrll int i;
11571 1.1 skrll xtensa_isa isa = xtensa_default_isa;
11572 1.1 skrll
11573 1.1 skrll xg_clear_vinsn (v);
11574 1.1 skrll
11575 1.1 skrll v->insnbuf = xtensa_insnbuf_alloc (isa);
11576 1.1 skrll if (v->insnbuf == NULL)
11577 1.1 skrll as_fatal (_("out of memory"));
11578 1.1 skrll
11579 1.1 skrll for (i = 0; i < MAX_SLOTS; i++)
11580 1.1 skrll {
11581 1.1 skrll v->slotbuf[i] = xtensa_insnbuf_alloc (isa);
11582 1.1 skrll if (v->slotbuf[i] == NULL)
11583 1.1 skrll as_fatal (_("out of memory"));
11584 1.1 skrll }
11585 1.1 skrll }
11586 1.1 skrll
11587 1.1 skrll
11588 1.1 skrll static void
11589 1.1 skrll xg_clear_vinsn (vliw_insn *v)
11590 1.1 skrll {
11591 1.1 skrll int i;
11592 1.1 skrll
11593 1.1 skrll memset (v, 0, offsetof (vliw_insn, insnbuf));
11594 1.1 skrll
11595 1.1 skrll v->format = XTENSA_UNDEFINED;
11596 1.1 skrll v->num_slots = 0;
11597 1.1 skrll v->inside_bundle = FALSE;
11598 1.1 skrll
11599 1.1 skrll if (xt_saved_debug_type != DEBUG_NONE)
11600 1.1 skrll debug_type = xt_saved_debug_type;
11601 1.1 skrll
11602 1.1 skrll for (i = 0; i < MAX_SLOTS; i++)
11603 1.1 skrll v->slots[i].opcode = XTENSA_UNDEFINED;
11604 1.1 skrll }
11605 1.1 skrll
11606 1.1 skrll
11607 1.1 skrll static bfd_boolean
11608 1.1 skrll vinsn_has_specific_opcodes (vliw_insn *v)
11609 1.1 skrll {
11610 1.1 skrll int i;
11611 1.1 skrll
11612 1.1 skrll for (i = 0; i < v->num_slots; i++)
11613 1.1 skrll {
11614 1.1 skrll if (v->slots[i].is_specific_opcode)
11615 1.1 skrll return TRUE;
11616 1.1 skrll }
11617 1.1 skrll return FALSE;
11618 1.1 skrll }
11619 1.1 skrll
11620 1.1 skrll
11621 1.1 skrll static void
11622 1.1 skrll xg_free_vinsn (vliw_insn *v)
11623 1.1 skrll {
11624 1.1 skrll int i;
11625 1.1 skrll xtensa_insnbuf_free (xtensa_default_isa, v->insnbuf);
11626 1.1 skrll for (i = 0; i < MAX_SLOTS; i++)
11627 1.1 skrll xtensa_insnbuf_free (xtensa_default_isa, v->slotbuf[i]);
11628 1.1 skrll }
11629 1.1 skrll
11630 1.1 skrll
11631 1.1 skrll /* Encode a vliw_insn into an insnbuf. Return TRUE if there are any symbolic
11632 1.1 skrll operands. See also the assumptions listed for tinsn_to_slotbuf. */
11633 1.1 skrll
11634 1.1 skrll static bfd_boolean
11635 1.1 skrll vinsn_to_insnbuf (vliw_insn *vinsn,
11636 1.1 skrll char *frag_offset,
11637 1.1 skrll fragS *fragP,
11638 1.1 skrll bfd_boolean record_fixup)
11639 1.1 skrll {
11640 1.1 skrll xtensa_isa isa = xtensa_default_isa;
11641 1.1 skrll xtensa_format fmt = vinsn->format;
11642 1.1 skrll xtensa_insnbuf insnbuf = vinsn->insnbuf;
11643 1.1 skrll int slot;
11644 1.1 skrll bfd_boolean has_fixup = FALSE;
11645 1.1 skrll
11646 1.1 skrll xtensa_format_encode (isa, fmt, insnbuf);
11647 1.1 skrll
11648 1.1 skrll for (slot = 0; slot < vinsn->num_slots; slot++)
11649 1.1 skrll {
11650 1.1 skrll TInsn *tinsn = &vinsn->slots[slot];
11651 1.1 skrll expressionS *tls_reloc = &tinsn->tls_reloc;
11652 1.1 skrll bfd_boolean tinsn_has_fixup =
11653 1.1 skrll tinsn_to_slotbuf (vinsn->format, slot, tinsn,
11654 1.1 skrll vinsn->slotbuf[slot]);
11655 1.1 skrll
11656 1.1 skrll xtensa_format_set_slot (isa, fmt, slot,
11657 1.1 skrll insnbuf, vinsn->slotbuf[slot]);
11658 1.1 skrll if (tls_reloc->X_op != O_illegal)
11659 1.1 skrll {
11660 1.1 skrll if (vinsn->num_slots != 1)
11661 1.1 skrll as_bad (_("TLS relocation not allowed in FLIX bundle"));
11662 1.1 skrll else if (record_fixup)
11663 1.1 skrll /* Instructions that generate TLS relocations should always be
11664 1.1 skrll relaxed in the front-end. If "record_fixup" is set, then this
11665 1.1 skrll function is being called during back-end relaxation, so flag
11666 1.1 skrll the unexpected behavior as an error. */
11667 1.1 skrll as_bad (_("unexpected TLS relocation"));
11668 1.1 skrll else
11669 1.1 skrll fix_new (fragP, frag_offset - fragP->fr_literal,
11670 1.1 skrll xtensa_format_length (isa, fmt),
11671 1.1 skrll tls_reloc->X_add_symbol, tls_reloc->X_add_number,
11672 1.1 skrll FALSE, map_operator_to_reloc (tls_reloc->X_op, FALSE));
11673 1.1 skrll }
11674 1.1 skrll if (tinsn_has_fixup)
11675 1.1 skrll {
11676 1.1 skrll int i;
11677 1.1 skrll xtensa_opcode opcode = tinsn->opcode;
11678 1.1 skrll int noperands = xtensa_opcode_num_operands (isa, opcode);
11679 1.1 skrll has_fixup = TRUE;
11680 1.1 skrll
11681 1.1 skrll for (i = 0; i < noperands; i++)
11682 1.1 skrll {
11683 1.1 skrll expressionS* expr = &tinsn->tok[i];
11684 1.1 skrll switch (expr->X_op)
11685 1.1 skrll {
11686 1.1 skrll case O_symbol:
11687 1.1 skrll case O_lo16:
11688 1.1 skrll case O_hi16:
11689 1.1 skrll if (get_relaxable_immed (opcode) == i)
11690 1.1 skrll {
11691 1.1 skrll /* Add a fix record for the instruction, except if this
11692 1.1 skrll function is being called prior to relaxation, i.e.,
11693 1.1 skrll if record_fixup is false, and the instruction might
11694 1.1 skrll be relaxed later. */
11695 1.1 skrll if (record_fixup
11696 1.1 skrll || tinsn->is_specific_opcode
11697 1.1 skrll || !xg_is_relaxable_insn (tinsn, 0))
11698 1.1 skrll {
11699 1.1 skrll xg_add_opcode_fix (tinsn, i, fmt, slot, expr, fragP,
11700 1.1 skrll frag_offset - fragP->fr_literal);
11701 1.1 skrll }
11702 1.1 skrll else
11703 1.1 skrll {
11704 1.1 skrll if (expr->X_op != O_symbol)
11705 1.1 skrll as_bad (_("invalid operand"));
11706 1.1 skrll tinsn->symbol = expr->X_add_symbol;
11707 1.1 skrll tinsn->offset = expr->X_add_number;
11708 1.1 skrll }
11709 1.1 skrll }
11710 1.1 skrll else
11711 1.1 skrll as_bad (_("symbolic operand not allowed"));
11712 1.1 skrll break;
11713 1.1 skrll
11714 1.1 skrll case O_constant:
11715 1.1 skrll case O_register:
11716 1.1 skrll break;
11717 1.1 skrll
11718 1.1 skrll default:
11719 1.1 skrll as_bad (_("expression too complex"));
11720 1.1 skrll break;
11721 1.1 skrll }
11722 1.1 skrll }
11723 1.1 skrll }
11724 1.1 skrll }
11725 1.1 skrll
11726 1.1 skrll return has_fixup;
11727 1.1 skrll }
11728 1.1 skrll
11729 1.1 skrll
11730 1.1 skrll static void
11731 1.1 skrll vinsn_from_chars (vliw_insn *vinsn, char *f)
11732 1.1 skrll {
11733 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
11734 1.1 skrll static xtensa_insnbuf slotbuf = NULL;
11735 1.1 skrll int i;
11736 1.1 skrll xtensa_format fmt;
11737 1.1 skrll xtensa_isa isa = xtensa_default_isa;
11738 1.1 skrll
11739 1.1 skrll if (!insnbuf)
11740 1.1 skrll {
11741 1.1 skrll insnbuf = xtensa_insnbuf_alloc (isa);
11742 1.1 skrll slotbuf = xtensa_insnbuf_alloc (isa);
11743 1.1 skrll }
11744 1.1 skrll
11745 1.1 skrll xtensa_insnbuf_from_chars (isa, insnbuf, (unsigned char *) f, 0);
11746 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
11747 1.1 skrll if (fmt == XTENSA_UNDEFINED)
11748 1.1 skrll as_fatal (_("cannot decode instruction format"));
11749 1.1 skrll vinsn->format = fmt;
11750 1.1 skrll vinsn->num_slots = xtensa_format_num_slots (isa, fmt);
11751 1.1 skrll
11752 1.1 skrll for (i = 0; i < vinsn->num_slots; i++)
11753 1.1 skrll {
11754 1.1 skrll TInsn *tinsn = &vinsn->slots[i];
11755 1.1 skrll xtensa_format_get_slot (isa, fmt, i, insnbuf, slotbuf);
11756 1.1 skrll tinsn_from_insnbuf (tinsn, slotbuf, fmt, i);
11757 1.1 skrll }
11758 1.1 skrll }
11759 1.1 skrll
11760 1.1 skrll
11761 1.1 skrll /* Expression utilities. */
11763 1.1 skrll
11764 1.1 skrll /* Return TRUE if the expression is an integer constant. */
11765 1.1 skrll
11766 1.1 skrll bfd_boolean
11767 1.1 skrll expr_is_const (const expressionS *s)
11768 1.1 skrll {
11769 1.1 skrll return (s->X_op == O_constant);
11770 1.1 skrll }
11771 1.1 skrll
11772 1.1 skrll
11773 1.1 skrll /* Get the expression constant.
11774 1.1 skrll Calling this is illegal if expr_is_const () returns TRUE. */
11775 1.1 skrll
11776 1.1 skrll offsetT
11777 1.1 skrll get_expr_const (const expressionS *s)
11778 1.1 skrll {
11779 1.1 skrll assert (expr_is_const (s));
11780 1.1 skrll return s->X_add_number;
11781 1.1 skrll }
11782 1.1 skrll
11783 1.1 skrll
11784 1.1 skrll /* Set the expression to a constant value. */
11785 1.1 skrll
11786 1.1 skrll void
11787 1.1 skrll set_expr_const (expressionS *s, offsetT val)
11788 1.1 skrll {
11789 1.1 skrll s->X_op = O_constant;
11790 1.1 skrll s->X_add_number = val;
11791 1.1 skrll s->X_add_symbol = NULL;
11792 1.1 skrll s->X_op_symbol = NULL;
11793 1.1 skrll }
11794 1.1 skrll
11795 1.1 skrll
11796 1.1 skrll bfd_boolean
11797 1.1 skrll expr_is_register (const expressionS *s)
11798 1.1 skrll {
11799 1.1 skrll return (s->X_op == O_register);
11800 1.1 skrll }
11801 1.1 skrll
11802 1.1 skrll
11803 1.1 skrll /* Get the expression constant.
11804 1.1 skrll Calling this is illegal if expr_is_const () returns TRUE. */
11805 1.1 skrll
11806 1.1 skrll offsetT
11807 1.1 skrll get_expr_register (const expressionS *s)
11808 1.1 skrll {
11809 1.1 skrll assert (expr_is_register (s));
11810 1.1 skrll return s->X_add_number;
11811 1.1 skrll }
11812 1.1 skrll
11813 1.1 skrll
11814 1.1 skrll /* Set the expression to a symbol + constant offset. */
11815 1.1 skrll
11816 1.1 skrll void
11817 1.1 skrll set_expr_symbol_offset (expressionS *s, symbolS *sym, offsetT offset)
11818 1.1 skrll {
11819 1.1 skrll s->X_op = O_symbol;
11820 1.1 skrll s->X_add_symbol = sym;
11821 1.1 skrll s->X_op_symbol = NULL; /* unused */
11822 1.1 skrll s->X_add_number = offset;
11823 1.1 skrll }
11824 1.1 skrll
11825 1.1 skrll
11826 1.1 skrll /* Return TRUE if the two expressions are equal. */
11827 1.1 skrll
11828 1.1 skrll bfd_boolean
11829 1.1 skrll expr_is_equal (expressionS *s1, expressionS *s2)
11830 1.1 skrll {
11831 1.1 skrll if (s1->X_op != s2->X_op)
11832 1.1 skrll return FALSE;
11833 1.1 skrll if (s1->X_add_symbol != s2->X_add_symbol)
11834 1.1 skrll return FALSE;
11835 1.1 skrll if (s1->X_op_symbol != s2->X_op_symbol)
11836 1.1 skrll return FALSE;
11837 1.1 skrll if (s1->X_add_number != s2->X_add_number)
11838 1.1 skrll return FALSE;
11839 1.1 skrll return TRUE;
11840 1.1 skrll }
11841 1.1 skrll
11842 1.1 skrll
11843 1.1 skrll static void
11844 1.1 skrll copy_expr (expressionS *dst, const expressionS *src)
11845 1.1 skrll {
11846 1.1 skrll memcpy (dst, src, sizeof (expressionS));
11847 1.1 skrll }
11848 1.1 skrll
11849 1.1 skrll
11850 1.1 skrll /* Support for the "--rename-section" option. */
11852 1.1 skrll
11853 1.1 skrll struct rename_section_struct
11854 1.1 skrll {
11855 1.1 skrll char *old_name;
11856 1.1 skrll char *new_name;
11857 1.1 skrll struct rename_section_struct *next;
11858 1.1 skrll };
11859 1.1 skrll
11860 1.1 skrll static struct rename_section_struct *section_rename;
11861 1.1 skrll
11862 1.1 skrll
11863 1.1 skrll /* Parse the string "oldname=new_name(:oldname2=new_name2)*" and add
11864 1.1 skrll entries to the section_rename list. Note: Specifying multiple
11865 1.1 skrll renamings separated by colons is not documented and is retained only
11866 1.1 skrll for backward compatibility. */
11867 1.1 skrll
11868 1.1 skrll static void
11869 1.1 skrll build_section_rename (const char *arg)
11870 1.1 skrll {
11871 1.1 skrll struct rename_section_struct *r;
11872 1.1 skrll char *this_arg = NULL;
11873 1.1 skrll char *next_arg = NULL;
11874 1.1 skrll
11875 1.1 skrll for (this_arg = xstrdup (arg); this_arg != NULL; this_arg = next_arg)
11876 1.1 skrll {
11877 1.1 skrll char *old_name, *new_name;
11878 1.1 skrll
11879 1.1 skrll if (this_arg)
11880 1.1 skrll {
11881 1.1 skrll next_arg = strchr (this_arg, ':');
11882 1.1 skrll if (next_arg)
11883 1.1 skrll {
11884 1.1 skrll *next_arg = '\0';
11885 1.1 skrll next_arg++;
11886 1.1 skrll }
11887 1.1 skrll }
11888 1.1 skrll
11889 1.1 skrll old_name = this_arg;
11890 1.1 skrll new_name = strchr (this_arg, '=');
11891 1.1 skrll
11892 1.1 skrll if (*old_name == '\0')
11893 1.1 skrll {
11894 1.1 skrll as_warn (_("ignoring extra '-rename-section' delimiter ':'"));
11895 1.1 skrll continue;
11896 1.1 skrll }
11897 1.1 skrll if (!new_name || new_name[1] == '\0')
11898 1.1 skrll {
11899 1.1 skrll as_warn (_("ignoring invalid '-rename-section' specification: '%s'"),
11900 1.1 skrll old_name);
11901 1.1 skrll continue;
11902 1.1 skrll }
11903 1.1 skrll *new_name = '\0';
11904 1.1 skrll new_name++;
11905 1.1 skrll
11906 1.1 skrll /* Check for invalid section renaming. */
11907 1.1 skrll for (r = section_rename; r != NULL; r = r->next)
11908 1.1 skrll {
11909 1.1 skrll if (strcmp (r->old_name, old_name) == 0)
11910 1.1 skrll as_bad (_("section %s renamed multiple times"), old_name);
11911 1.1 skrll if (strcmp (r->new_name, new_name) == 0)
11912 1.1 skrll as_bad (_("multiple sections remapped to output section %s"),
11913 1.1 skrll new_name);
11914 1.1 skrll }
11915 1.1 skrll
11916 /* Now add it. */
11917 r = (struct rename_section_struct *)
11918 xmalloc (sizeof (struct rename_section_struct));
11919 r->old_name = xstrdup (old_name);
11920 r->new_name = xstrdup (new_name);
11921 r->next = section_rename;
11922 section_rename = r;
11923 }
11924 }
11925
11926
11927 char *
11928 xtensa_section_rename (char *name)
11929 {
11930 struct rename_section_struct *r = section_rename;
11931
11932 for (r = section_rename; r != NULL; r = r->next)
11933 {
11934 if (strcmp (r->old_name, name) == 0)
11935 return r->new_name;
11936 }
11937
11938 return name;
11939 }
11940