tc-xtensa.c revision 1.1.1.8 1 1.1 skrll /* tc-xtensa.c -- Assemble Xtensa instructions.
2 1.1.1.8 christos Copyright (C) 2003-2020 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 "as.h"
22 1.1.1.3 christos #include <limits.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 "xtensa-config.h"
31 1.1.1.5 christos #include "elf/xtensa.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.1.6 christos bfd_boolean density_supported;
75 1.1.1.6 christos bfd_boolean absolute_literals_supported;
76 1.1 skrll
77 1.1 skrll static vliw_insn cur_vinsn;
78 1.1 skrll
79 1.1 skrll unsigned xtensa_num_pipe_stages;
80 1.1.1.6 christos unsigned xtensa_fetch_width;
81 1.1 skrll
82 1.1 skrll static enum debug_info_type xt_saved_debug_type = DEBUG_NONE;
83 1.1 skrll
84 1.1 skrll /* Some functions are only valid in the front end. This variable
85 1.1 skrll allows us to assert that we haven't crossed over into the
86 1.1 skrll back end. */
87 1.1 skrll static bfd_boolean past_xtensa_end = FALSE;
88 1.1 skrll
89 1.1 skrll /* Flags for properties of the last instruction in a segment. */
90 1.1 skrll #define FLAG_IS_A0_WRITER 0x1
91 1.1 skrll #define FLAG_IS_BAD_LOOPEND 0x2
92 1.1 skrll
93 1.1 skrll
94 1.1 skrll /* We define a special segment names ".literal" to place literals
95 1.1 skrll into. The .fini and .init sections are special because they
96 1.1 skrll contain code that is moved together by the linker. We give them
97 1.1 skrll their own special .fini.literal and .init.literal sections. */
98 1.1 skrll
99 1.1 skrll #define LITERAL_SECTION_NAME xtensa_section_rename (".literal")
100 1.1 skrll #define LIT4_SECTION_NAME xtensa_section_rename (".lit4")
101 1.1 skrll #define INIT_SECTION_NAME xtensa_section_rename (".init")
102 1.1 skrll #define FINI_SECTION_NAME xtensa_section_rename (".fini")
103 1.1 skrll
104 1.1 skrll
105 1.1 skrll /* This type is used for the directive_stack to keep track of the
106 1.1 skrll state of the literal collection pools. If lit_prefix is set, it is
107 1.1 skrll used to determine the literal section names; otherwise, the literal
108 1.1 skrll sections are determined based on the current text section. The
109 1.1 skrll lit_seg and lit4_seg fields cache these literal sections, with the
110 1.1 skrll current_text_seg field used a tag to indicate whether the cached
111 1.1 skrll values are valid. */
112 1.1 skrll
113 1.1 skrll typedef struct lit_state_struct
114 1.1 skrll {
115 1.1 skrll char *lit_prefix;
116 1.1 skrll segT current_text_seg;
117 1.1 skrll segT lit_seg;
118 1.1 skrll segT lit4_seg;
119 1.1 skrll } lit_state;
120 1.1 skrll
121 1.1 skrll static lit_state default_lit_sections;
122 1.1 skrll
123 1.1 skrll
124 1.1 skrll /* We keep a list of literal segments. The seg_list type is the node
125 1.1 skrll for this list. The literal_head pointer is the head of the list,
126 1.1 skrll with the literal_head_h dummy node at the start. */
127 1.1 skrll
128 1.1 skrll typedef struct seg_list_struct
129 1.1 skrll {
130 1.1 skrll struct seg_list_struct *next;
131 1.1 skrll segT seg;
132 1.1 skrll } seg_list;
133 1.1 skrll
134 1.1 skrll static seg_list literal_head_h;
135 1.1 skrll static seg_list *literal_head = &literal_head_h;
136 1.1 skrll
137 1.1 skrll
138 1.1 skrll /* Lists of symbols. We keep a list of symbols that label the current
139 1.1 skrll instruction, so that we can adjust the symbols when inserting alignment
140 1.1 skrll for various instructions. We also keep a list of all the symbols on
141 1.1 skrll literals, so that we can fix up those symbols when the literals are
142 1.1 skrll later moved into the text sections. */
143 1.1 skrll
144 1.1 skrll typedef struct sym_list_struct
145 1.1 skrll {
146 1.1 skrll struct sym_list_struct *next;
147 1.1 skrll symbolS *sym;
148 1.1 skrll } sym_list;
149 1.1 skrll
150 1.1 skrll static sym_list *insn_labels = NULL;
151 1.1 skrll static sym_list *free_insn_labels = NULL;
152 1.1 skrll static sym_list *saved_insn_labels = NULL;
153 1.1 skrll
154 1.1 skrll static sym_list *literal_syms;
155 1.1 skrll
156 1.1 skrll
157 1.1 skrll /* Flags to determine whether to prefer const16 or l32r
158 1.1 skrll if both options are available. */
159 1.1 skrll int prefer_const16 = 0;
160 1.1 skrll int prefer_l32r = 0;
161 1.1 skrll
162 1.1 skrll /* Global flag to indicate when we are emitting literals. */
163 1.1 skrll int generating_literals = 0;
164 1.1 skrll
165 1.1 skrll /* The following PROPERTY table definitions are copied from
166 1.1 skrll <elf/xtensa.h> and must be kept in sync with the code there. */
167 1.1 skrll
168 1.1 skrll /* Flags in the property tables to specify whether blocks of memory
169 1.1 skrll are literals, instructions, data, or unreachable. For
170 1.1 skrll instructions, blocks that begin loop targets and branch targets are
171 1.1 skrll designated. Blocks that do not allow density, instruction
172 1.1 skrll reordering or transformation are also specified. Finally, for
173 1.1 skrll branch targets, branch target alignment priority is included.
174 1.1 skrll Alignment of the next block is specified in the current block
175 1.1 skrll and the size of the current block does not include any fill required
176 1.1 skrll to align to the next block. */
177 1.1 skrll
178 1.1 skrll #define XTENSA_PROP_LITERAL 0x00000001
179 1.1 skrll #define XTENSA_PROP_INSN 0x00000002
180 1.1 skrll #define XTENSA_PROP_DATA 0x00000004
181 1.1 skrll #define XTENSA_PROP_UNREACHABLE 0x00000008
182 1.1 skrll /* Instruction only properties at beginning of code. */
183 1.1 skrll #define XTENSA_PROP_INSN_LOOP_TARGET 0x00000010
184 1.1 skrll #define XTENSA_PROP_INSN_BRANCH_TARGET 0x00000020
185 1.1 skrll /* Instruction only properties about code. */
186 1.1 skrll #define XTENSA_PROP_INSN_NO_DENSITY 0x00000040
187 1.1 skrll #define XTENSA_PROP_INSN_NO_REORDER 0x00000080
188 1.1 skrll /* Historically, NO_TRANSFORM was a property of instructions,
189 1.1 skrll but it should apply to literals under certain circumstances. */
190 1.1 skrll #define XTENSA_PROP_NO_TRANSFORM 0x00000100
191 1.1 skrll
192 1.1 skrll /* Branch target alignment information. This transmits information
193 1.1 skrll to the linker optimization about the priority of aligning a
194 1.1 skrll particular block for branch target alignment: None, low priority,
195 1.1 skrll high priority, or required. These only need to be checked in
196 1.1 skrll instruction blocks marked as XTENSA_PROP_INSN_BRANCH_TARGET.
197 1.1 skrll Common usage is
198 1.1 skrll
199 1.1 skrll switch (GET_XTENSA_PROP_BT_ALIGN (flags))
200 1.1 skrll case XTENSA_PROP_BT_ALIGN_NONE:
201 1.1 skrll case XTENSA_PROP_BT_ALIGN_LOW:
202 1.1 skrll case XTENSA_PROP_BT_ALIGN_HIGH:
203 1.1 skrll case XTENSA_PROP_BT_ALIGN_REQUIRE:
204 1.1 skrll */
205 1.1 skrll #define XTENSA_PROP_BT_ALIGN_MASK 0x00000600
206 1.1 skrll
207 1.1 skrll /* No branch target alignment. */
208 1.1 skrll #define XTENSA_PROP_BT_ALIGN_NONE 0x0
209 1.1 skrll /* Low priority branch target alignment. */
210 1.1 skrll #define XTENSA_PROP_BT_ALIGN_LOW 0x1
211 1.1 skrll /* High priority branch target alignment. */
212 1.1 skrll #define XTENSA_PROP_BT_ALIGN_HIGH 0x2
213 1.1 skrll /* Required branch target alignment. */
214 1.1 skrll #define XTENSA_PROP_BT_ALIGN_REQUIRE 0x3
215 1.1 skrll
216 1.1 skrll #define SET_XTENSA_PROP_BT_ALIGN(flag, align) \
217 1.1 skrll (((flag) & (~XTENSA_PROP_BT_ALIGN_MASK)) | \
218 1.1 skrll (((align) << 9) & XTENSA_PROP_BT_ALIGN_MASK))
219 1.1 skrll
220 1.1 skrll
221 1.1 skrll /* Alignment is specified in the block BEFORE the one that needs
222 1.1 skrll alignment. Up to 5 bits. Use GET_XTENSA_PROP_ALIGNMENT(flags) to
223 1.1 skrll get the required alignment specified as a power of 2. Use
224 1.1 skrll SET_XTENSA_PROP_ALIGNMENT(flags, pow2) to set the required
225 1.1 skrll alignment. Be careful of side effects since the SET will evaluate
226 1.1 skrll flags twice. Also, note that the SIZE of a block in the property
227 1.1 skrll table does not include the alignment size, so the alignment fill
228 1.1 skrll must be calculated to determine if two blocks are contiguous.
229 1.1 skrll TEXT_ALIGN is not currently implemented but is a placeholder for a
230 1.1 skrll possible future implementation. */
231 1.1 skrll
232 1.1 skrll #define XTENSA_PROP_ALIGN 0x00000800
233 1.1 skrll
234 1.1 skrll #define XTENSA_PROP_ALIGNMENT_MASK 0x0001f000
235 1.1 skrll
236 1.1 skrll #define SET_XTENSA_PROP_ALIGNMENT(flag, align) \
237 1.1 skrll (((flag) & (~XTENSA_PROP_ALIGNMENT_MASK)) | \
238 1.1 skrll (((align) << 12) & XTENSA_PROP_ALIGNMENT_MASK))
239 1.1 skrll
240 1.1 skrll #define XTENSA_PROP_INSN_ABSLIT 0x00020000
241 1.1 skrll
242 1.1 skrll
243 1.1 skrll /* Structure for saving instruction and alignment per-fragment data
244 1.1 skrll that will be written to the object file. This structure is
245 1.1 skrll equivalent to the actual data that will be written out to the file
246 1.1 skrll but is easier to use. We provide a conversion to file flags
247 1.1 skrll in frag_flags_to_number. */
248 1.1 skrll
249 1.1 skrll typedef struct frag_flags_struct frag_flags;
250 1.1 skrll
251 1.1 skrll struct frag_flags_struct
252 1.1 skrll {
253 1.1 skrll /* is_literal should only be used after xtensa_move_literals.
254 1.1 skrll If you need to check if you are generating a literal fragment,
255 1.1 skrll then use the generating_literals global. */
256 1.1 skrll
257 1.1 skrll unsigned is_literal : 1;
258 1.1 skrll unsigned is_insn : 1;
259 1.1 skrll unsigned is_data : 1;
260 1.1 skrll unsigned is_unreachable : 1;
261 1.1 skrll
262 1.1 skrll /* is_specific_opcode implies no_transform. */
263 1.1 skrll unsigned is_no_transform : 1;
264 1.1 skrll
265 1.1 skrll struct
266 1.1 skrll {
267 1.1 skrll unsigned is_loop_target : 1;
268 1.1 skrll unsigned is_branch_target : 1; /* Branch targets have a priority. */
269 1.1 skrll unsigned bt_align_priority : 2;
270 1.1 skrll
271 1.1 skrll unsigned is_no_density : 1;
272 1.1 skrll /* no_longcalls flag does not need to be placed in the object file. */
273 1.1 skrll
274 1.1 skrll unsigned is_no_reorder : 1;
275 1.1 skrll
276 1.1 skrll /* Uses absolute literal addressing for l32r. */
277 1.1 skrll unsigned is_abslit : 1;
278 1.1 skrll } insn;
279 1.1 skrll unsigned is_align : 1;
280 1.1 skrll unsigned alignment : 5;
281 1.1 skrll };
282 1.1 skrll
283 1.1 skrll
284 1.1 skrll /* Structure for saving information about a block of property data
285 1.1 skrll for frags that have the same flags. */
286 1.1 skrll struct xtensa_block_info_struct
287 1.1 skrll {
288 1.1 skrll segT sec;
289 1.1 skrll bfd_vma offset;
290 1.1 skrll size_t size;
291 1.1 skrll frag_flags flags;
292 1.1 skrll struct xtensa_block_info_struct *next;
293 1.1 skrll };
294 1.1 skrll
295 1.1 skrll
296 1.1 skrll /* Structure for saving the current state before emitting literals. */
297 1.1 skrll typedef struct emit_state_struct
298 1.1 skrll {
299 1.1 skrll const char *name;
300 1.1 skrll segT now_seg;
301 1.1 skrll subsegT now_subseg;
302 1.1 skrll int generating_literals;
303 1.1 skrll } emit_state;
304 1.1 skrll
305 1.1 skrll
306 1.1 skrll /* Opcode placement information */
307 1.1 skrll
308 1.1 skrll typedef unsigned long long bitfield;
309 1.1 skrll #define bit_is_set(bit, bf) ((bf) & (0x01ll << (bit)))
310 1.1 skrll #define set_bit(bit, bf) ((bf) |= (0x01ll << (bit)))
311 1.1 skrll #define clear_bit(bit, bf) ((bf) &= ~(0x01ll << (bit)))
312 1.1 skrll
313 1.1 skrll #define MAX_FORMATS 32
314 1.1 skrll
315 1.1 skrll typedef struct op_placement_info_struct
316 1.1 skrll {
317 1.1 skrll int num_formats;
318 1.1 skrll /* A number describing how restrictive the issue is for this
319 1.1 skrll opcode. For example, an opcode that fits lots of different
320 1.1 skrll formats has a high freedom, as does an opcode that fits
321 1.1 skrll only one format but many slots in that format. The most
322 1.1 skrll restrictive is the opcode that fits only one slot in one
323 1.1 skrll format. */
324 1.1 skrll int issuef;
325 1.1 skrll xtensa_format narrowest;
326 1.1 skrll char narrowest_size;
327 1.1 skrll char narrowest_slot;
328 1.1 skrll
329 1.1 skrll /* formats is a bitfield with the Nth bit set
330 1.1 skrll if the opcode fits in the Nth xtensa_format. */
331 1.1 skrll bitfield formats;
332 1.1 skrll
333 1.1 skrll /* slots[N]'s Mth bit is set if the op fits in the
334 1.1 skrll Mth slot of the Nth xtensa_format. */
335 1.1 skrll bitfield slots[MAX_FORMATS];
336 1.1 skrll
337 1.1 skrll /* A count of the number of slots in a given format
338 1.1 skrll an op can fit (i.e., the bitcount of the slot field above). */
339 1.1 skrll char slots_in_format[MAX_FORMATS];
340 1.1 skrll
341 1.1 skrll } op_placement_info, *op_placement_info_table;
342 1.1 skrll
343 1.1 skrll op_placement_info_table op_placement_table;
344 1.1 skrll
345 1.1 skrll
346 1.1 skrll /* Extra expression types. */
347 1.1 skrll
348 1.1 skrll #define O_pltrel O_md1 /* like O_symbol but use a PLT reloc */
349 1.1 skrll #define O_hi16 O_md2 /* use high 16 bits of symbolic value */
350 1.1 skrll #define O_lo16 O_md3 /* use low 16 bits of symbolic value */
351 1.1 skrll #define O_pcrel O_md4 /* value is a PC-relative offset */
352 1.1 skrll #define O_tlsfunc O_md5 /* TLS_FUNC/TLSDESC_FN relocation */
353 1.1 skrll #define O_tlsarg O_md6 /* TLS_ARG/TLSDESC_ARG relocation */
354 1.1 skrll #define O_tlscall O_md7 /* TLS_CALL relocation */
355 1.1 skrll #define O_tpoff O_md8 /* TPOFF relocation */
356 1.1 skrll #define O_dtpoff O_md9 /* DTPOFF relocation */
357 1.1 skrll
358 1.1 skrll struct suffix_reloc_map
359 1.1 skrll {
360 1.1.1.5 christos const char *suffix;
361 1.1 skrll int length;
362 1.1 skrll bfd_reloc_code_real_type reloc;
363 1.1.1.5 christos operatorT operator;
364 1.1 skrll };
365 1.1 skrll
366 1.1 skrll #define SUFFIX_MAP(str, reloc, op) { str, sizeof (str) - 1, reloc, op }
367 1.1 skrll
368 1.1 skrll static struct suffix_reloc_map suffix_relocs[] =
369 1.1 skrll {
370 1.1 skrll SUFFIX_MAP ("l", BFD_RELOC_LO16, O_lo16),
371 1.1 skrll SUFFIX_MAP ("h", BFD_RELOC_HI16, O_hi16),
372 1.1 skrll SUFFIX_MAP ("plt", BFD_RELOC_XTENSA_PLT, O_pltrel),
373 1.1 skrll SUFFIX_MAP ("pcrel", BFD_RELOC_32_PCREL, O_pcrel),
374 1.1 skrll SUFFIX_MAP ("tlsfunc", BFD_RELOC_XTENSA_TLS_FUNC, O_tlsfunc),
375 1.1 skrll SUFFIX_MAP ("tlsarg", BFD_RELOC_XTENSA_TLS_ARG, O_tlsarg),
376 1.1 skrll SUFFIX_MAP ("tlscall", BFD_RELOC_XTENSA_TLS_CALL, O_tlscall),
377 1.1 skrll SUFFIX_MAP ("tpoff", BFD_RELOC_XTENSA_TLS_TPOFF, O_tpoff),
378 1.1 skrll SUFFIX_MAP ("dtpoff", BFD_RELOC_XTENSA_TLS_DTPOFF, O_dtpoff),
379 1.1 skrll };
380 1.1 skrll
381 1.1 skrll
382 1.1 skrll /* Directives. */
383 1.1 skrll
384 1.1 skrll typedef enum
385 1.1 skrll {
386 1.1 skrll directive_none = 0,
387 1.1 skrll directive_literal,
388 1.1 skrll directive_density,
389 1.1 skrll directive_transform,
390 1.1 skrll directive_freeregs,
391 1.1 skrll directive_longcalls,
392 1.1 skrll directive_literal_prefix,
393 1.1 skrll directive_schedule,
394 1.1 skrll directive_absolute_literals,
395 1.1 skrll directive_last_directive
396 1.1 skrll } directiveE;
397 1.1 skrll
398 1.1 skrll typedef struct
399 1.1 skrll {
400 1.1 skrll const char *name;
401 1.1 skrll bfd_boolean can_be_negated;
402 1.1 skrll } directive_infoS;
403 1.1 skrll
404 1.1 skrll const directive_infoS directive_info[] =
405 1.1 skrll {
406 1.1 skrll { "none", FALSE },
407 1.1 skrll { "literal", FALSE },
408 1.1 skrll { "density", TRUE },
409 1.1 skrll { "transform", TRUE },
410 1.1 skrll { "freeregs", FALSE },
411 1.1 skrll { "longcalls", TRUE },
412 1.1 skrll { "literal_prefix", FALSE },
413 1.1 skrll { "schedule", TRUE },
414 1.1 skrll { "absolute-literals", TRUE }
415 1.1 skrll };
416 1.1 skrll
417 1.1 skrll bfd_boolean directive_state[] =
418 1.1 skrll {
419 1.1 skrll FALSE, /* none */
420 1.1 skrll FALSE, /* literal */
421 1.1 skrll FALSE, /* density */
422 1.1 skrll TRUE, /* transform */
423 1.1 skrll FALSE, /* freeregs */
424 1.1 skrll FALSE, /* longcalls */
425 1.1 skrll FALSE, /* literal_prefix */
426 1.1 skrll FALSE, /* schedule */
427 1.1 skrll FALSE /* absolute_literals */
428 1.1 skrll };
429 1.1 skrll
430 1.1.1.4 christos /* A circular list of all potential and actual literal pool locations
431 1.1.1.4 christos in a segment. */
432 1.1.1.4 christos struct litpool_frag
433 1.1.1.4 christos {
434 1.1.1.4 christos struct litpool_frag *next;
435 1.1.1.4 christos struct litpool_frag *prev;
436 1.1.1.4 christos fragS *fragP;
437 1.1.1.4 christos addressT addr;
438 1.1.1.4 christos short priority; /* 1, 2, or 3 -- 1 is highest */
439 1.1.1.4 christos short original_priority;
440 1.1.1.7 christos int literal_count;
441 1.1.1.4 christos };
442 1.1.1.4 christos
443 1.1.1.4 christos /* Map a segment to its litpool_frag list. */
444 1.1.1.4 christos struct litpool_seg
445 1.1.1.4 christos {
446 1.1.1.4 christos struct litpool_seg *next;
447 1.1.1.4 christos asection *seg;
448 1.1.1.4 christos struct litpool_frag frag_list;
449 1.1.1.4 christos int frag_count; /* since last litpool location */
450 1.1.1.4 christos };
451 1.1.1.4 christos
452 1.1.1.4 christos static struct litpool_seg litpool_seg_list;
453 1.1.1.4 christos
454 1.1.1.7 christos /* Limit maximal size of auto litpool by half of the j range. */
455 1.1.1.7 christos #define MAX_AUTO_POOL_LITERALS 16384
456 1.1.1.7 christos
457 1.1.1.7 christos /* Limit maximal size of explicit literal pool by l32r range. */
458 1.1.1.7 christos #define MAX_EXPLICIT_POOL_LITERALS 65536
459 1.1.1.7 christos
460 1.1.1.7 christos #define MAX_POOL_LITERALS \
461 1.1.1.7 christos (auto_litpools ? MAX_AUTO_POOL_LITERALS : MAX_EXPLICIT_POOL_LITERALS)
462 1.1 skrll
463 1.1 skrll /* Directive functions. */
464 1.1 skrll
465 1.1 skrll static void xtensa_begin_directive (int);
466 1.1 skrll static void xtensa_end_directive (int);
467 1.1 skrll static void xtensa_literal_prefix (void);
468 1.1 skrll static void xtensa_literal_position (int);
469 1.1 skrll static void xtensa_literal_pseudo (int);
470 1.1 skrll static void xtensa_frequency_pseudo (int);
471 1.1 skrll static void xtensa_elf_cons (int);
472 1.1 skrll static void xtensa_leb128 (int);
473 1.1 skrll
474 1.1 skrll /* Parsing and Idiom Translation. */
475 1.1 skrll
476 1.1 skrll static bfd_reloc_code_real_type xtensa_elf_suffix (char **, expressionS *);
477 1.1 skrll
478 1.1 skrll /* Various Other Internal Functions. */
479 1.1 skrll
480 1.1 skrll extern bfd_boolean xg_is_single_relaxable_insn (TInsn *, TInsn *, bfd_boolean);
481 1.1 skrll static bfd_boolean xg_build_to_insn (TInsn *, TInsn *, BuildInstr *);
482 1.1 skrll static void xtensa_mark_literal_pool_location (void);
483 1.1 skrll static addressT get_expanded_loop_offset (xtensa_opcode);
484 1.1 skrll static fragS *get_literal_pool_location (segT);
485 1.1 skrll static void set_literal_pool_location (segT, fragS *);
486 1.1 skrll static void xtensa_set_frag_assembly_state (fragS *);
487 1.1 skrll static void finish_vinsn (vliw_insn *);
488 1.1 skrll static bfd_boolean emit_single_op (TInsn *);
489 1.1 skrll static int total_frag_text_expansion (fragS *);
490 1.1.1.4 christos static bfd_boolean use_trampolines = TRUE;
491 1.1.1.4 christos static void xtensa_check_frag_count (void);
492 1.1.1.4 christos static void xtensa_create_trampoline_frag (bfd_boolean);
493 1.1.1.4 christos static void xtensa_maybe_create_trampoline_frag (void);
494 1.1.1.4 christos struct trampoline_frag;
495 1.1.1.6 christos static int init_trampoline_frag (fragS *);
496 1.1.1.6 christos static fixS *xg_append_jump (fragS *fragP, symbolS *sym, offsetT offset);
497 1.1.1.4 christos static void xtensa_maybe_create_literal_pool_frag (bfd_boolean, bfd_boolean);
498 1.1.1.4 christos static bfd_boolean auto_litpools = FALSE;
499 1.1.1.7 christos static int auto_litpool_limit = 0;
500 1.1.1.8 christos static bfd_boolean xtensa_is_init_fini (segT seg);
501 1.1 skrll
502 1.1 skrll /* Alignment Functions. */
503 1.1 skrll
504 1.1 skrll static int get_text_align_power (unsigned);
505 1.1 skrll static int get_text_align_max_fill_size (int, bfd_boolean, bfd_boolean);
506 1.1 skrll static int branch_align_power (segT);
507 1.1 skrll
508 1.1 skrll /* Helpers for xtensa_relax_frag(). */
509 1.1 skrll
510 1.1 skrll static long relax_frag_add_nop (fragS *);
511 1.1 skrll
512 1.1 skrll /* Accessors for additional per-subsegment information. */
513 1.1 skrll
514 1.1 skrll static unsigned get_last_insn_flags (segT, subsegT);
515 1.1 skrll static void set_last_insn_flags (segT, subsegT, unsigned, bfd_boolean);
516 1.1 skrll static float get_subseg_total_freq (segT, subsegT);
517 1.1 skrll static float get_subseg_target_freq (segT, subsegT);
518 1.1 skrll static void set_subseg_freq (segT, subsegT, float, float);
519 1.1 skrll
520 1.1 skrll /* Segment list functions. */
521 1.1 skrll
522 1.1 skrll static void xtensa_move_literals (void);
523 1.1 skrll static void xtensa_reorder_segments (void);
524 1.1 skrll static void xtensa_switch_to_literal_fragment (emit_state *);
525 1.1 skrll static void xtensa_switch_to_non_abs_literal_fragment (emit_state *);
526 1.1 skrll static void xtensa_switch_section_emit_state (emit_state *, segT, subsegT);
527 1.1 skrll static void xtensa_restore_emit_state (emit_state *);
528 1.1 skrll static segT cache_literal_section (bfd_boolean);
529 1.1 skrll
530 1.1 skrll /* op_placement_info functions. */
531 1.1 skrll
532 1.1 skrll static void init_op_placement_info_table (void);
533 1.1 skrll extern bfd_boolean opcode_fits_format_slot (xtensa_opcode, xtensa_format, int);
534 1.1 skrll static int xg_get_single_size (xtensa_opcode);
535 1.1 skrll static xtensa_format xg_get_single_format (xtensa_opcode);
536 1.1 skrll static int xg_get_single_slot (xtensa_opcode);
537 1.1 skrll
538 1.1 skrll /* TInsn and IStack functions. */
539 1.1 skrll
540 1.1 skrll static bfd_boolean tinsn_has_symbolic_operands (const TInsn *);
541 1.1 skrll static bfd_boolean tinsn_has_invalid_symbolic_operands (const TInsn *);
542 1.1 skrll static bfd_boolean tinsn_has_complex_operands (const TInsn *);
543 1.1 skrll static bfd_boolean tinsn_to_insnbuf (TInsn *, xtensa_insnbuf);
544 1.1 skrll static bfd_boolean tinsn_check_arguments (const TInsn *);
545 1.1 skrll static void tinsn_from_chars (TInsn *, char *, int);
546 1.1 skrll static void tinsn_immed_from_frag (TInsn *, fragS *, int);
547 1.1 skrll static int get_num_stack_text_bytes (IStack *);
548 1.1 skrll static int get_num_stack_literal_bytes (IStack *);
549 1.1.1.4 christos static bfd_boolean tinsn_to_slotbuf (xtensa_format, int, TInsn *, xtensa_insnbuf);
550 1.1 skrll
551 1.1 skrll /* vliw_insn functions. */
552 1.1 skrll
553 1.1 skrll static void xg_init_vinsn (vliw_insn *);
554 1.1.1.2 christos static void xg_copy_vinsn (vliw_insn *, vliw_insn *);
555 1.1 skrll static void xg_clear_vinsn (vliw_insn *);
556 1.1 skrll static bfd_boolean vinsn_has_specific_opcodes (vliw_insn *);
557 1.1 skrll static void xg_free_vinsn (vliw_insn *);
558 1.1 skrll static bfd_boolean vinsn_to_insnbuf
559 1.1 skrll (vliw_insn *, char *, fragS *, bfd_boolean);
560 1.1 skrll static void vinsn_from_chars (vliw_insn *, char *);
561 1.1 skrll
562 1.1 skrll /* Expression Utilities. */
563 1.1 skrll
564 1.1 skrll bfd_boolean expr_is_const (const expressionS *);
565 1.1 skrll offsetT get_expr_const (const expressionS *);
566 1.1 skrll void set_expr_const (expressionS *, offsetT);
567 1.1 skrll bfd_boolean expr_is_register (const expressionS *);
568 1.1 skrll offsetT get_expr_register (const expressionS *);
569 1.1 skrll void set_expr_symbol_offset (expressionS *, symbolS *, offsetT);
570 1.1 skrll bfd_boolean expr_is_equal (expressionS *, expressionS *);
571 1.1 skrll static void copy_expr (expressionS *, const expressionS *);
572 1.1 skrll
573 1.1 skrll /* Section renaming. */
574 1.1 skrll
575 1.1 skrll static void build_section_rename (const char *);
576 1.1 skrll
577 1.1 skrll
578 1.1 skrll /* ISA imported from bfd. */
579 1.1 skrll extern xtensa_isa xtensa_default_isa;
580 1.1 skrll
581 1.1 skrll extern int target_big_endian;
582 1.1 skrll
583 1.1 skrll static xtensa_opcode xtensa_addi_opcode;
584 1.1 skrll static xtensa_opcode xtensa_addmi_opcode;
585 1.1 skrll static xtensa_opcode xtensa_call0_opcode;
586 1.1 skrll static xtensa_opcode xtensa_call4_opcode;
587 1.1 skrll static xtensa_opcode xtensa_call8_opcode;
588 1.1 skrll static xtensa_opcode xtensa_call12_opcode;
589 1.1 skrll static xtensa_opcode xtensa_callx0_opcode;
590 1.1 skrll static xtensa_opcode xtensa_callx4_opcode;
591 1.1 skrll static xtensa_opcode xtensa_callx8_opcode;
592 1.1 skrll static xtensa_opcode xtensa_callx12_opcode;
593 1.1 skrll static xtensa_opcode xtensa_const16_opcode;
594 1.1 skrll static xtensa_opcode xtensa_entry_opcode;
595 1.1 skrll static xtensa_opcode xtensa_extui_opcode;
596 1.1 skrll static xtensa_opcode xtensa_movi_opcode;
597 1.1 skrll static xtensa_opcode xtensa_movi_n_opcode;
598 1.1 skrll static xtensa_opcode xtensa_isync_opcode;
599 1.1.1.2 christos static xtensa_opcode xtensa_j_opcode;
600 1.1 skrll static xtensa_opcode xtensa_jx_opcode;
601 1.1 skrll static xtensa_opcode xtensa_l32r_opcode;
602 1.1 skrll static xtensa_opcode xtensa_loop_opcode;
603 1.1 skrll static xtensa_opcode xtensa_loopnez_opcode;
604 1.1 skrll static xtensa_opcode xtensa_loopgtz_opcode;
605 1.1 skrll static xtensa_opcode xtensa_nop_opcode;
606 1.1 skrll static xtensa_opcode xtensa_nop_n_opcode;
607 1.1 skrll static xtensa_opcode xtensa_or_opcode;
608 1.1 skrll static xtensa_opcode xtensa_ret_opcode;
609 1.1 skrll static xtensa_opcode xtensa_ret_n_opcode;
610 1.1 skrll static xtensa_opcode xtensa_retw_opcode;
611 1.1 skrll static xtensa_opcode xtensa_retw_n_opcode;
612 1.1 skrll static xtensa_opcode xtensa_rsr_lcount_opcode;
613 1.1 skrll static xtensa_opcode xtensa_waiti_opcode;
614 1.1.1.2 christos static int config_max_slots = 0;
615 1.1 skrll
616 1.1 skrll
617 1.1 skrll /* Command-line Options. */
619 1.1 skrll
620 1.1.1.2 christos bfd_boolean use_literal_section = TRUE;
621 1.1 skrll enum flix_level produce_flix = FLIX_ALL;
622 1.1 skrll static bfd_boolean align_targets = TRUE;
623 1.1 skrll static bfd_boolean warn_unaligned_branch_targets = FALSE;
624 1.1 skrll static bfd_boolean has_a0_b_retw = FALSE;
625 1.1 skrll static bfd_boolean workaround_a0_b_retw = FALSE;
626 1.1 skrll static bfd_boolean workaround_b_j_loop_end = FALSE;
627 1.1 skrll static bfd_boolean workaround_short_loop = FALSE;
628 1.1 skrll static bfd_boolean maybe_has_short_loop = FALSE;
629 1.1 skrll static bfd_boolean workaround_close_loop_end = FALSE;
630 1.1 skrll static bfd_boolean maybe_has_close_loop_end = FALSE;
631 1.1.1.8 christos static bfd_boolean enforce_three_byte_loop_align = FALSE;
632 1.1 skrll static bfd_boolean opt_linkrelax = TRUE;
633 1.1 skrll
634 1.1 skrll /* When workaround_short_loops is TRUE, all loops with early exits must
635 1.1 skrll have at least 3 instructions. workaround_all_short_loops is a modifier
636 1.1 skrll to the workaround_short_loop flag. In addition to the
637 1.1 skrll workaround_short_loop actions, all straightline loopgtz and loopnez
638 1.1 skrll must have at least 3 instructions. */
639 1.1 skrll
640 1.1 skrll static bfd_boolean workaround_all_short_loops = FALSE;
641 1.1.1.7 christos
642 1.1.1.7 christos /* Generate individual property section for every section.
643 1.1.1.7 christos This option is defined in BDF library. */
644 1.1 skrll extern bfd_boolean elf32xtensa_separate_props;
645 1.1 skrll
646 1.1 skrll static void
647 1.1 skrll xtensa_setup_hw_workarounds (int earliest, int latest)
648 1.1 skrll {
649 1.1 skrll if (earliest > latest)
650 1.1 skrll as_fatal (_("illegal range of target hardware versions"));
651 1.1 skrll
652 1.1 skrll /* Enable all workarounds for pre-T1050.0 hardware. */
653 1.1 skrll if (earliest < 105000 || latest < 105000)
654 1.1 skrll {
655 1.1 skrll workaround_a0_b_retw |= TRUE;
656 1.1 skrll workaround_b_j_loop_end |= TRUE;
657 1.1 skrll workaround_short_loop |= TRUE;
658 1.1 skrll workaround_close_loop_end |= TRUE;
659 1.1 skrll workaround_all_short_loops |= TRUE;
660 1.1 skrll enforce_three_byte_loop_align = TRUE;
661 1.1 skrll }
662 1.1 skrll }
663 1.1 skrll
664 1.1 skrll
665 1.1 skrll enum
666 1.1 skrll {
667 1.1 skrll option_density = OPTION_MD_BASE,
668 1.1 skrll option_no_density,
669 1.1.1.2 christos
670 1.1.1.2 christos option_flix,
671 1.1.1.2 christos option_no_generate_flix,
672 1.1.1.2 christos option_no_flix,
673 1.1 skrll
674 1.1 skrll option_relax,
675 1.1 skrll option_no_relax,
676 1.1 skrll
677 1.1 skrll option_link_relax,
678 1.1 skrll option_no_link_relax,
679 1.1 skrll
680 1.1 skrll option_generics,
681 1.1 skrll option_no_generics,
682 1.1 skrll
683 1.1 skrll option_transform,
684 1.1 skrll option_no_transform,
685 1.1 skrll
686 1.1 skrll option_text_section_literals,
687 1.1 skrll option_no_text_section_literals,
688 1.1 skrll
689 1.1 skrll option_absolute_literals,
690 1.1 skrll option_no_absolute_literals,
691 1.1 skrll
692 1.1 skrll option_align_targets,
693 1.1 skrll option_no_align_targets,
694 1.1 skrll
695 1.1 skrll option_warn_unaligned_targets,
696 1.1 skrll
697 1.1 skrll option_longcalls,
698 1.1 skrll option_no_longcalls,
699 1.1 skrll
700 1.1 skrll option_workaround_a0_b_retw,
701 1.1 skrll option_no_workaround_a0_b_retw,
702 1.1 skrll
703 1.1 skrll option_workaround_b_j_loop_end,
704 1.1 skrll option_no_workaround_b_j_loop_end,
705 1.1 skrll
706 1.1 skrll option_workaround_short_loop,
707 1.1 skrll option_no_workaround_short_loop,
708 1.1 skrll
709 1.1 skrll option_workaround_all_short_loops,
710 1.1 skrll option_no_workaround_all_short_loops,
711 1.1 skrll
712 1.1 skrll option_workaround_close_loop_end,
713 1.1 skrll option_no_workaround_close_loop_end,
714 1.1 skrll
715 1.1 skrll option_no_workarounds,
716 1.1 skrll
717 1.1 skrll option_rename_section_name,
718 1.1 skrll
719 1.1 skrll option_prefer_l32r,
720 1.1 skrll option_prefer_const16,
721 1.1.1.4 christos
722 1.1.1.4 christos option_target_hardware,
723 1.1.1.4 christos
724 1.1.1.4 christos option_trampolines,
725 1.1.1.4 christos option_no_trampolines,
726 1.1.1.4 christos
727 1.1.1.4 christos option_auto_litpools,
728 1.1.1.4 christos option_no_auto_litpools,
729 1.1.1.7 christos option_auto_litpool_limit,
730 1.1.1.7 christos
731 1.1.1.7 christos option_separate_props,
732 1.1 skrll option_no_separate_props,
733 1.1 skrll };
734 1.1 skrll
735 1.1 skrll const char *md_shortopts = "";
736 1.1 skrll
737 1.1 skrll struct option md_longopts[] =
738 1.1 skrll {
739 1.1 skrll { "density", no_argument, NULL, option_density },
740 1.1 skrll { "no-density", no_argument, NULL, option_no_density },
741 1.1.1.2 christos
742 1.1.1.2 christos { "flix", no_argument, NULL, option_flix },
743 1.1.1.2 christos { "no-generate-flix", no_argument, NULL, option_no_generate_flix },
744 1.1.1.2 christos { "no-allow-flix", no_argument, NULL, option_no_flix },
745 1.1 skrll
746 1.1 skrll /* Both "relax" and "generics" are deprecated and treated as equivalent
747 1.1 skrll to the "transform" option. */
748 1.1 skrll { "relax", no_argument, NULL, option_relax },
749 1.1 skrll { "no-relax", no_argument, NULL, option_no_relax },
750 1.1 skrll { "generics", no_argument, NULL, option_generics },
751 1.1 skrll { "no-generics", no_argument, NULL, option_no_generics },
752 1.1 skrll
753 1.1 skrll { "transform", no_argument, NULL, option_transform },
754 1.1 skrll { "no-transform", no_argument, NULL, option_no_transform },
755 1.1 skrll { "text-section-literals", no_argument, NULL, option_text_section_literals },
756 1.1 skrll { "no-text-section-literals", no_argument, NULL,
757 1.1 skrll option_no_text_section_literals },
758 1.1 skrll { "absolute-literals", no_argument, NULL, option_absolute_literals },
759 1.1 skrll { "no-absolute-literals", no_argument, NULL, option_no_absolute_literals },
760 1.1 skrll /* This option was changed from -align-target to -target-align
761 1.1 skrll because it conflicted with the "-al" option. */
762 1.1 skrll { "target-align", no_argument, NULL, option_align_targets },
763 1.1 skrll { "no-target-align", no_argument, NULL, option_no_align_targets },
764 1.1 skrll { "warn-unaligned-targets", no_argument, NULL,
765 1.1 skrll option_warn_unaligned_targets },
766 1.1 skrll { "longcalls", no_argument, NULL, option_longcalls },
767 1.1 skrll { "no-longcalls", no_argument, NULL, option_no_longcalls },
768 1.1 skrll
769 1.1 skrll { "no-workaround-a0-b-retw", no_argument, NULL,
770 1.1 skrll option_no_workaround_a0_b_retw },
771 1.1 skrll { "workaround-a0-b-retw", no_argument, NULL, option_workaround_a0_b_retw },
772 1.1 skrll
773 1.1 skrll { "no-workaround-b-j-loop-end", no_argument, NULL,
774 1.1 skrll option_no_workaround_b_j_loop_end },
775 1.1 skrll { "workaround-b-j-loop-end", no_argument, NULL,
776 1.1 skrll option_workaround_b_j_loop_end },
777 1.1 skrll
778 1.1 skrll { "no-workaround-short-loops", no_argument, NULL,
779 1.1 skrll option_no_workaround_short_loop },
780 1.1 skrll { "workaround-short-loops", no_argument, NULL,
781 1.1 skrll option_workaround_short_loop },
782 1.1 skrll
783 1.1 skrll { "no-workaround-all-short-loops", no_argument, NULL,
784 1.1 skrll option_no_workaround_all_short_loops },
785 1.1 skrll { "workaround-all-short-loop", no_argument, NULL,
786 1.1 skrll option_workaround_all_short_loops },
787 1.1 skrll
788 1.1 skrll { "prefer-l32r", no_argument, NULL, option_prefer_l32r },
789 1.1 skrll { "prefer-const16", no_argument, NULL, option_prefer_const16 },
790 1.1 skrll
791 1.1 skrll { "no-workarounds", no_argument, NULL, option_no_workarounds },
792 1.1 skrll
793 1.1 skrll { "no-workaround-close-loop-end", no_argument, NULL,
794 1.1 skrll option_no_workaround_close_loop_end },
795 1.1 skrll { "workaround-close-loop-end", no_argument, NULL,
796 1.1 skrll option_workaround_close_loop_end },
797 1.1 skrll
798 1.1 skrll { "rename-section", required_argument, NULL, option_rename_section_name },
799 1.1 skrll
800 1.1 skrll { "link-relax", no_argument, NULL, option_link_relax },
801 1.1 skrll { "no-link-relax", no_argument, NULL, option_no_link_relax },
802 1.1 skrll
803 1.1 skrll { "target-hardware", required_argument, NULL, option_target_hardware },
804 1.1.1.4 christos
805 1.1.1.4 christos { "trampolines", no_argument, NULL, option_trampolines },
806 1.1.1.4 christos { "no-trampolines", no_argument, NULL, option_no_trampolines },
807 1.1.1.4 christos
808 1.1.1.4 christos { "auto-litpools", no_argument, NULL, option_auto_litpools },
809 1.1.1.4 christos { "no-auto-litpools", no_argument, NULL, option_no_auto_litpools },
810 1.1.1.4 christos { "auto-litpool-limit", required_argument, NULL, option_auto_litpool_limit },
811 1.1.1.7 christos
812 1.1.1.7 christos { "separate-prop-tables", no_argument, NULL, option_separate_props },
813 1.1 skrll
814 1.1 skrll { NULL, no_argument, NULL, 0 }
815 1.1 skrll };
816 1.1 skrll
817 1.1 skrll size_t md_longopts_size = sizeof md_longopts;
818 1.1 skrll
819 1.1 skrll
820 1.1.1.5 christos int
821 1.1 skrll md_parse_option (int c, const char *arg)
822 1.1 skrll {
823 1.1 skrll switch (c)
824 1.1 skrll {
825 1.1 skrll case option_density:
826 1.1 skrll as_warn (_("--density option is ignored"));
827 1.1 skrll return 1;
828 1.1 skrll case option_no_density:
829 1.1 skrll as_warn (_("--no-density option is ignored"));
830 1.1 skrll return 1;
831 1.1.1.8 christos case option_link_relax:
832 1.1 skrll opt_linkrelax = TRUE;
833 1.1 skrll return 1;
834 1.1.1.8 christos case option_no_link_relax:
835 1.1 skrll opt_linkrelax = FALSE;
836 1.1.1.2 christos return 1;
837 1.1.1.2 christos case option_flix:
838 1.1.1.2 christos produce_flix = FLIX_ALL;
839 1.1.1.2 christos return 1;
840 1.1.1.2 christos case option_no_generate_flix:
841 1.1.1.2 christos produce_flix = FLIX_NO_GENERATE;
842 1.1.1.2 christos return 1;
843 1.1.1.2 christos case option_no_flix:
844 1.1.1.2 christos produce_flix = FLIX_NONE;
845 1.1 skrll return 1;
846 1.1 skrll case option_generics:
847 1.1 skrll as_warn (_("--generics is deprecated; use --transform instead"));
848 1.1 skrll return md_parse_option (option_transform, arg);
849 1.1 skrll case option_no_generics:
850 1.1 skrll as_warn (_("--no-generics is deprecated; use --no-transform instead"));
851 1.1 skrll return md_parse_option (option_no_transform, arg);
852 1.1 skrll case option_relax:
853 1.1 skrll as_warn (_("--relax is deprecated; use --transform instead"));
854 1.1 skrll return md_parse_option (option_transform, arg);
855 1.1 skrll case option_no_relax:
856 1.1 skrll as_warn (_("--no-relax is deprecated; use --no-transform instead"));
857 1.1 skrll return md_parse_option (option_no_transform, arg);
858 1.1 skrll case option_longcalls:
859 1.1 skrll directive_state[directive_longcalls] = TRUE;
860 1.1 skrll return 1;
861 1.1 skrll case option_no_longcalls:
862 1.1 skrll directive_state[directive_longcalls] = FALSE;
863 1.1 skrll return 1;
864 1.1 skrll case option_text_section_literals:
865 1.1 skrll use_literal_section = FALSE;
866 1.1 skrll return 1;
867 1.1 skrll case option_no_text_section_literals:
868 1.1 skrll use_literal_section = TRUE;
869 1.1 skrll return 1;
870 1.1 skrll case option_absolute_literals:
871 1.1 skrll if (!absolute_literals_supported)
872 1.1 skrll {
873 1.1 skrll as_fatal (_("--absolute-literals option not supported in this Xtensa configuration"));
874 1.1 skrll return 0;
875 1.1 skrll }
876 1.1 skrll directive_state[directive_absolute_literals] = TRUE;
877 1.1 skrll return 1;
878 1.1 skrll case option_no_absolute_literals:
879 1.1 skrll directive_state[directive_absolute_literals] = FALSE;
880 1.1 skrll return 1;
881 1.1 skrll
882 1.1 skrll case option_workaround_a0_b_retw:
883 1.1 skrll workaround_a0_b_retw = TRUE;
884 1.1 skrll return 1;
885 1.1 skrll case option_no_workaround_a0_b_retw:
886 1.1 skrll workaround_a0_b_retw = FALSE;
887 1.1 skrll return 1;
888 1.1 skrll case option_workaround_b_j_loop_end:
889 1.1 skrll workaround_b_j_loop_end = TRUE;
890 1.1 skrll return 1;
891 1.1 skrll case option_no_workaround_b_j_loop_end:
892 1.1 skrll workaround_b_j_loop_end = FALSE;
893 1.1 skrll return 1;
894 1.1 skrll
895 1.1 skrll case option_workaround_short_loop:
896 1.1 skrll workaround_short_loop = TRUE;
897 1.1 skrll return 1;
898 1.1 skrll case option_no_workaround_short_loop:
899 1.1 skrll workaround_short_loop = FALSE;
900 1.1 skrll return 1;
901 1.1 skrll
902 1.1 skrll case option_workaround_all_short_loops:
903 1.1 skrll workaround_all_short_loops = TRUE;
904 1.1 skrll return 1;
905 1.1 skrll case option_no_workaround_all_short_loops:
906 1.1 skrll workaround_all_short_loops = FALSE;
907 1.1 skrll return 1;
908 1.1 skrll
909 1.1 skrll case option_workaround_close_loop_end:
910 1.1 skrll workaround_close_loop_end = TRUE;
911 1.1 skrll return 1;
912 1.1 skrll case option_no_workaround_close_loop_end:
913 1.1 skrll workaround_close_loop_end = FALSE;
914 1.1 skrll return 1;
915 1.1 skrll
916 1.1 skrll case option_no_workarounds:
917 1.1 skrll workaround_a0_b_retw = FALSE;
918 1.1 skrll workaround_b_j_loop_end = FALSE;
919 1.1 skrll workaround_short_loop = FALSE;
920 1.1 skrll workaround_all_short_loops = FALSE;
921 1.1 skrll workaround_close_loop_end = FALSE;
922 1.1 skrll return 1;
923 1.1 skrll
924 1.1 skrll case option_align_targets:
925 1.1 skrll align_targets = TRUE;
926 1.1 skrll return 1;
927 1.1 skrll case option_no_align_targets:
928 1.1 skrll align_targets = FALSE;
929 1.1 skrll return 1;
930 1.1 skrll
931 1.1 skrll case option_warn_unaligned_targets:
932 1.1 skrll warn_unaligned_branch_targets = TRUE;
933 1.1 skrll return 1;
934 1.1 skrll
935 1.1 skrll case option_rename_section_name:
936 1.1 skrll build_section_rename (arg);
937 1.1 skrll return 1;
938 1.1 skrll
939 1.1 skrll case 'Q':
940 1.1 skrll /* -Qy, -Qn: SVR4 arguments controlling whether a .comment section
941 1.1 skrll should be emitted or not. FIXME: Not implemented. */
942 1.1 skrll return 1;
943 1.1 skrll
944 1.1 skrll case option_prefer_l32r:
945 1.1 skrll if (prefer_const16)
946 1.1 skrll as_fatal (_("prefer-l32r conflicts with prefer-const16"));
947 1.1 skrll prefer_l32r = 1;
948 1.1 skrll return 1;
949 1.1 skrll
950 1.1 skrll case option_prefer_const16:
951 1.1 skrll if (prefer_l32r)
952 1.1 skrll as_fatal (_("prefer-const16 conflicts with prefer-l32r"));
953 1.1 skrll prefer_const16 = 1;
954 1.1 skrll return 1;
955 1.1 skrll
956 1.1 skrll case option_target_hardware:
957 1.1 skrll {
958 1.1.1.5 christos int earliest, latest = 0;
959 1.1 skrll char *end;
960 1.1 skrll if (*arg == 0 || *arg == '-')
961 1.1 skrll as_fatal (_("invalid target hardware version"));
962 1.1.1.5 christos
963 1.1 skrll earliest = strtol (arg, &end, 0);
964 1.1.1.5 christos
965 1.1 skrll if (*end == 0)
966 1.1.1.5 christos latest = earliest;
967 1.1 skrll else if (*end == '-')
968 1.1.1.5 christos {
969 1.1 skrll if (*++end == 0)
970 1.1.1.5 christos as_fatal (_("invalid target hardware version"));
971 1.1 skrll latest = strtol (end, &end, 0);
972 1.1.1.5 christos }
973 1.1 skrll if (*end != 0)
974 1.1 skrll as_fatal (_("invalid target hardware version"));
975 1.1 skrll
976 1.1 skrll xtensa_setup_hw_workarounds (earliest, latest);
977 1.1 skrll return 1;
978 1.1 skrll }
979 1.1 skrll
980 1.1 skrll case option_transform:
981 1.1 skrll /* This option has no affect other than to use the defaults,
982 1.1 skrll which are already set. */
983 1.1 skrll return 1;
984 1.1 skrll
985 1.1 skrll case option_no_transform:
986 1.1 skrll /* This option turns off all transformations of any kind.
987 1.1 skrll However, because we want to preserve the state of other
988 1.1 skrll directives, we only change its own field. Thus, before
989 1.1 skrll you perform any transformation, always check if transform
990 1.1 skrll is available. If you use the functions we provide for this
991 1.1 skrll purpose, you will be ok. */
992 1.1 skrll directive_state[directive_transform] = FALSE;
993 1.1 skrll return 1;
994 1.1.1.4 christos
995 1.1.1.4 christos case option_trampolines:
996 1.1.1.4 christos use_trampolines = TRUE;
997 1.1.1.4 christos return 1;
998 1.1.1.4 christos
999 1.1.1.4 christos case option_no_trampolines:
1000 1.1.1.4 christos use_trampolines = FALSE;
1001 1.1.1.4 christos return 1;
1002 1.1.1.4 christos
1003 1.1.1.4 christos case option_auto_litpools:
1004 1.1.1.4 christos auto_litpools = TRUE;
1005 1.1.1.7 christos use_literal_section = FALSE;
1006 1.1.1.7 christos if (auto_litpool_limit <= 0)
1007 1.1.1.4 christos auto_litpool_limit = MAX_AUTO_POOL_LITERALS / 2;
1008 1.1.1.4 christos return 1;
1009 1.1.1.4 christos
1010 1.1.1.4 christos case option_no_auto_litpools:
1011 1.1.1.4 christos auto_litpools = FALSE;
1012 1.1.1.4 christos auto_litpool_limit = -1;
1013 1.1.1.4 christos return 1;
1014 1.1.1.4 christos
1015 1.1.1.4 christos case option_auto_litpool_limit:
1016 1.1.1.4 christos {
1017 1.1.1.5 christos int value = 0;
1018 1.1.1.4 christos char *end;
1019 1.1.1.4 christos if (auto_litpool_limit < 0)
1020 1.1.1.4 christos as_fatal (_("no-auto-litpools is incompatible with auto-litpool-limit"));
1021 1.1.1.4 christos if (*arg == 0 || *arg == '-')
1022 1.1.1.5 christos as_fatal (_("invalid auto-litpool-limit argument"));
1023 1.1.1.5 christos value = strtol (arg, &end, 10);
1024 1.1.1.4 christos if (*end != 0)
1025 1.1.1.4 christos as_fatal (_("invalid auto-litpool-limit argument"));
1026 1.1.1.4 christos if (value < 100 || value > 10000)
1027 1.1.1.4 christos as_fatal (_("invalid auto-litpool-limit argument (range is 100-10000)"));
1028 1.1.1.4 christos auto_litpool_limit = value;
1029 1.1.1.4 christos auto_litpools = TRUE;
1030 1.1.1.4 christos use_literal_section = FALSE;
1031 1.1.1.4 christos return 1;
1032 1.1.1.4 christos }
1033 1.1.1.7 christos
1034 1.1.1.7 christos case option_separate_props:
1035 1.1.1.7 christos elf32xtensa_separate_props = TRUE;
1036 1.1.1.7 christos return 1;
1037 1.1.1.7 christos
1038 1.1.1.7 christos case option_no_separate_props:
1039 1.1.1.7 christos elf32xtensa_separate_props = FALSE;
1040 1.1.1.7 christos return 1;
1041 1.1 skrll
1042 1.1 skrll default:
1043 1.1 skrll return 0;
1044 1.1 skrll }
1045 1.1 skrll }
1046 1.1 skrll
1047 1.1 skrll
1048 1.1 skrll void
1049 1.1 skrll md_show_usage (FILE *stream)
1050 1.1 skrll {
1051 1.1 skrll fputs ("\n\
1052 1.1 skrll Xtensa options:\n\
1053 1.1 skrll --[no-]text-section-literals\n\
1054 1.1 skrll [Do not] put literals in the text section\n\
1055 1.1 skrll --[no-]absolute-literals\n\
1056 1.1 skrll [Do not] default to use non-PC-relative literals\n\
1057 1.1 skrll --[no-]target-align [Do not] try to align branch targets\n\
1058 1.1 skrll --[no-]longcalls [Do not] emit 32-bit call sequences\n\
1059 1.1.1.2 christos --[no-]transform [Do not] transform instructions\n\
1060 1.1.1.2 christos --flix both allow hand-written and generate flix bundles\n\
1061 1.1.1.2 christos --no-generate-flix allow hand-written but do not generate\n\
1062 1.1.1.2 christos flix bundles\n\
1063 1.1.1.2 christos --no-allow-flix neither allow hand-written nor generate\n\
1064 1.1.1.4 christos flix bundles\n\
1065 1.1.1.4 christos --rename-section old=new Rename section 'old' to 'new'\n\
1066 1.1.1.4 christos --[no-]trampolines [Do not] generate trampolines (jumps to jumps)\n\
1067 1.1.1.4 christos when jumps do not reach their targets\n\
1068 1.1.1.4 christos --[no-]auto-litpools [Do not] automatically create literal pools\n\
1069 1.1.1.4 christos --auto-litpool-limit=<value>\n\
1070 1.1.1.4 christos (range 100-10000) Maximum number of blocks of\n\
1071 1.1.1.7 christos instructions to emit between literal pool\n\
1072 1.1.1.7 christos locations; implies --auto-litpools flag\n\
1073 1.1.1.7 christos --[no-]separate-prop-tables\n\
1074 1.1.1.7 christos [Do not] place Xtensa property records into\n\
1075 1.1.1.7 christos individual property sections for each section.\n\
1076 1.1 skrll Default is to generate single property section.\n", stream);
1077 1.1 skrll }
1078 1.1 skrll
1079 1.1 skrll
1080 1.1 skrll /* Functions related to the list of current label symbols. */
1082 1.1 skrll
1083 1.1 skrll static void
1084 1.1 skrll xtensa_add_insn_label (symbolS *sym)
1085 1.1 skrll {
1086 1.1 skrll sym_list *l;
1087 1.1.1.5 christos
1088 1.1 skrll if (!free_insn_labels)
1089 1.1 skrll l = XNEW (sym_list);
1090 1.1 skrll else
1091 1.1 skrll {
1092 1.1 skrll l = free_insn_labels;
1093 1.1 skrll free_insn_labels = l->next;
1094 1.1 skrll }
1095 1.1 skrll
1096 1.1 skrll l->sym = sym;
1097 1.1 skrll l->next = insn_labels;
1098 1.1 skrll insn_labels = l;
1099 1.1 skrll }
1100 1.1 skrll
1101 1.1 skrll
1102 1.1 skrll static void
1103 1.1 skrll xtensa_clear_insn_labels (void)
1104 1.1 skrll {
1105 1.1 skrll sym_list **pl;
1106 1.1 skrll
1107 1.1 skrll for (pl = &free_insn_labels; *pl != NULL; pl = &(*pl)->next)
1108 1.1 skrll ;
1109 1.1 skrll *pl = insn_labels;
1110 1.1 skrll insn_labels = NULL;
1111 1.1 skrll }
1112 1.1 skrll
1113 1.1 skrll
1114 1.1 skrll static void
1115 1.1 skrll xtensa_move_labels (fragS *new_frag, valueT new_offset)
1116 1.1 skrll {
1117 1.1 skrll sym_list *lit;
1118 1.1 skrll
1119 1.1 skrll for (lit = insn_labels; lit; lit = lit->next)
1120 1.1 skrll {
1121 1.1 skrll symbolS *lit_sym = lit->sym;
1122 1.1 skrll S_SET_VALUE (lit_sym, new_offset);
1123 1.1 skrll symbol_set_frag (lit_sym, new_frag);
1124 1.1 skrll }
1125 1.1 skrll }
1126 1.1 skrll
1127 1.1 skrll
1128 1.1 skrll /* Directive data and functions. */
1130 1.1 skrll
1131 1.1 skrll typedef struct state_stackS_struct
1132 1.1 skrll {
1133 1.1 skrll directiveE directive;
1134 1.1 skrll bfd_boolean negated;
1135 1.1 skrll bfd_boolean old_state;
1136 1.1 skrll const char *file;
1137 1.1 skrll unsigned int line;
1138 1.1 skrll const void *datum;
1139 1.1 skrll struct state_stackS_struct *prev;
1140 1.1 skrll } state_stackS;
1141 1.1 skrll
1142 1.1 skrll state_stackS *directive_state_stack;
1143 1.1 skrll
1144 1.1 skrll const pseudo_typeS md_pseudo_table[] =
1145 1.1 skrll {
1146 1.1 skrll { "align", s_align_bytes, 0 }, /* Defaulting is invalid (0). */
1147 1.1 skrll { "literal_position", xtensa_literal_position, 0 },
1148 1.1 skrll { "frame", s_ignore, 0 }, /* Formerly used for STABS debugging. */
1149 1.1 skrll { "long", xtensa_elf_cons, 4 },
1150 1.1 skrll { "word", xtensa_elf_cons, 4 },
1151 1.1 skrll { "4byte", xtensa_elf_cons, 4 },
1152 1.1 skrll { "short", xtensa_elf_cons, 2 },
1153 1.1 skrll { "2byte", xtensa_elf_cons, 2 },
1154 1.1 skrll { "sleb128", xtensa_leb128, 1},
1155 1.1 skrll { "uleb128", xtensa_leb128, 0},
1156 1.1 skrll { "begin", xtensa_begin_directive, 0 },
1157 1.1 skrll { "end", xtensa_end_directive, 0 },
1158 1.1 skrll { "literal", xtensa_literal_pseudo, 0 },
1159 1.1 skrll { "frequency", xtensa_frequency_pseudo, 0 },
1160 1.1 skrll { NULL, 0, 0 },
1161 1.1 skrll };
1162 1.1 skrll
1163 1.1 skrll
1164 1.1 skrll static bfd_boolean
1165 1.1 skrll use_transform (void)
1166 1.1.1.2 christos {
1167 1.1 skrll /* After md_end, you should be checking frag by frag, rather
1168 1.1 skrll than state directives. */
1169 1.1 skrll gas_assert (!past_xtensa_end);
1170 1.1 skrll return directive_state[directive_transform];
1171 1.1 skrll }
1172 1.1 skrll
1173 1.1 skrll
1174 1.1 skrll static bfd_boolean
1175 1.1 skrll do_align_targets (void)
1176 1.1 skrll {
1177 1.1.1.2 christos /* Do not use this function after md_end; just look at align_targets
1178 1.1 skrll instead. There is no target-align directive, so alignment is either
1179 1.1 skrll enabled for all frags or not done at all. */
1180 1.1 skrll gas_assert (!past_xtensa_end);
1181 1.1 skrll return align_targets && use_transform ();
1182 1.1 skrll }
1183 1.1 skrll
1184 1.1 skrll
1185 1.1.1.5 christos static void
1186 1.1 skrll directive_push (directiveE directive, bfd_boolean negated, const void *datum)
1187 1.1.1.5 christos {
1188 1.1 skrll const char *file;
1189 1.1.1.5 christos unsigned int line;
1190 1.1 skrll state_stackS *stack = XNEW (state_stackS);
1191 1.1 skrll
1192 1.1 skrll file = as_where (&line);
1193 1.1 skrll
1194 1.1 skrll stack->directive = directive;
1195 1.1 skrll stack->negated = negated;
1196 1.1 skrll stack->old_state = directive_state[directive];
1197 1.1 skrll stack->file = file;
1198 1.1 skrll stack->line = line;
1199 1.1 skrll stack->datum = datum;
1200 1.1 skrll stack->prev = directive_state_stack;
1201 1.1 skrll directive_state_stack = stack;
1202 1.1 skrll
1203 1.1 skrll directive_state[directive] = !negated;
1204 1.1 skrll }
1205 1.1 skrll
1206 1.1 skrll
1207 1.1 skrll static void
1208 1.1 skrll directive_pop (directiveE *directive,
1209 1.1 skrll bfd_boolean *negated,
1210 1.1 skrll const char **file,
1211 1.1 skrll unsigned int *line,
1212 1.1 skrll const void **datum)
1213 1.1 skrll {
1214 1.1 skrll state_stackS *top = directive_state_stack;
1215 1.1.1.6 christos
1216 1.1 skrll if (!directive_state_stack)
1217 1.1 skrll {
1218 1.1 skrll as_bad (_("unmatched .end directive"));
1219 1.1 skrll *directive = directive_none;
1220 1.1 skrll return;
1221 1.1 skrll }
1222 1.1 skrll
1223 1.1 skrll directive_state[directive_state_stack->directive] = top->old_state;
1224 1.1 skrll *directive = top->directive;
1225 1.1 skrll *negated = top->negated;
1226 1.1 skrll *file = top->file;
1227 1.1 skrll *line = top->line;
1228 1.1 skrll *datum = top->datum;
1229 1.1 skrll directive_state_stack = top->prev;
1230 1.1 skrll free (top);
1231 1.1 skrll }
1232 1.1 skrll
1233 1.1 skrll
1234 1.1 skrll static void
1235 1.1 skrll directive_balance (void)
1236 1.1 skrll {
1237 1.1 skrll while (directive_state_stack)
1238 1.1 skrll {
1239 1.1 skrll directiveE directive;
1240 1.1 skrll bfd_boolean negated;
1241 1.1 skrll const char *file;
1242 1.1 skrll unsigned int line;
1243 1.1 skrll const void *datum;
1244 1.1 skrll
1245 1.1 skrll directive_pop (&directive, &negated, &file, &line, &datum);
1246 1.1 skrll as_warn_where ((char *) file, line,
1247 1.1 skrll _(".begin directive with no matching .end directive"));
1248 1.1 skrll }
1249 1.1 skrll }
1250 1.1 skrll
1251 1.1 skrll
1252 1.1 skrll static bfd_boolean
1253 1.1 skrll inside_directive (directiveE dir)
1254 1.1 skrll {
1255 1.1 skrll state_stackS *top = directive_state_stack;
1256 1.1 skrll
1257 1.1 skrll while (top && top->directive != dir)
1258 1.1 skrll top = top->prev;
1259 1.1 skrll
1260 1.1 skrll return (top != NULL);
1261 1.1 skrll }
1262 1.1 skrll
1263 1.1 skrll
1264 1.1 skrll static void
1265 1.1 skrll get_directive (directiveE *directive, bfd_boolean *negated)
1266 1.1.1.5 christos {
1267 1.1 skrll int len;
1268 1.1 skrll unsigned i;
1269 1.1 skrll const char *directive_string;
1270 1.1 skrll
1271 1.1 skrll if (strncmp (input_line_pointer, "no-", 3) != 0)
1272 1.1 skrll *negated = FALSE;
1273 1.1 skrll else
1274 1.1 skrll {
1275 1.1 skrll *negated = TRUE;
1276 1.1 skrll input_line_pointer += 3;
1277 1.1 skrll }
1278 1.1 skrll
1279 1.1 skrll len = strspn (input_line_pointer,
1280 1.1 skrll "abcdefghijklmnopqrstuvwxyz_-/0123456789.");
1281 1.1 skrll
1282 1.1 skrll /* This code is a hack to make .begin [no-][generics|relax] exactly
1283 1.1 skrll equivalent to .begin [no-]transform. We should remove it when
1284 1.1 skrll we stop accepting those options. */
1285 1.1 skrll
1286 1.1 skrll if (strncmp (input_line_pointer, "generics", strlen ("generics")) == 0)
1287 1.1 skrll {
1288 1.1 skrll as_warn (_("[no-]generics is deprecated; use [no-]transform instead"));
1289 1.1 skrll directive_string = "transform";
1290 1.1 skrll }
1291 1.1 skrll else if (strncmp (input_line_pointer, "relax", strlen ("relax")) == 0)
1292 1.1 skrll {
1293 1.1 skrll as_warn (_("[no-]relax is deprecated; use [no-]transform instead"));
1294 1.1 skrll directive_string = "transform";
1295 1.1 skrll }
1296 1.1 skrll else
1297 1.1 skrll directive_string = input_line_pointer;
1298 1.1 skrll
1299 1.1 skrll for (i = 0; i < sizeof (directive_info) / sizeof (*directive_info); ++i)
1300 1.1 skrll {
1301 1.1 skrll if (strncmp (directive_string, directive_info[i].name, len) == 0)
1302 1.1 skrll {
1303 1.1 skrll input_line_pointer += len;
1304 1.1 skrll *directive = (directiveE) i;
1305 1.1 skrll if (*negated && !directive_info[i].can_be_negated)
1306 1.1 skrll as_bad (_("directive %s cannot be negated"),
1307 1.1 skrll directive_info[i].name);
1308 1.1 skrll return;
1309 1.1 skrll }
1310 1.1 skrll }
1311 1.1 skrll
1312 1.1 skrll as_bad (_("unknown directive"));
1313 1.1 skrll *directive = (directiveE) XTENSA_UNDEFINED;
1314 1.1 skrll }
1315 1.1 skrll
1316 1.1 skrll
1317 1.1 skrll static void
1318 1.1 skrll xtensa_begin_directive (int ignore ATTRIBUTE_UNUSED)
1319 1.1 skrll {
1320 1.1 skrll directiveE directive;
1321 1.1 skrll bfd_boolean negated;
1322 1.1 skrll emit_state *state;
1323 1.1 skrll lit_state *ls;
1324 1.1 skrll
1325 1.1 skrll get_directive (&directive, &negated);
1326 1.1 skrll if (directive == (directiveE) XTENSA_UNDEFINED)
1327 1.1 skrll {
1328 1.1 skrll discard_rest_of_line ();
1329 1.1 skrll return;
1330 1.1 skrll }
1331 1.1 skrll
1332 1.1 skrll if (cur_vinsn.inside_bundle)
1333 1.1 skrll as_bad (_("directives are not valid inside bundles"));
1334 1.1 skrll
1335 1.1 skrll switch (directive)
1336 1.1 skrll {
1337 1.1 skrll case directive_literal:
1338 1.1 skrll if (!inside_directive (directive_literal))
1339 1.1 skrll {
1340 1.1 skrll /* Previous labels go with whatever follows this directive, not with
1341 1.1 skrll the literal, so save them now. */
1342 1.1 skrll saved_insn_labels = insn_labels;
1343 1.1.1.5 christos insn_labels = NULL;
1344 1.1 skrll }
1345 1.1 skrll as_warn (_(".begin literal is deprecated; use .literal instead"));
1346 1.1 skrll state = XNEW (emit_state);
1347 1.1 skrll xtensa_switch_to_literal_fragment (state);
1348 1.1 skrll directive_push (directive_literal, negated, state);
1349 1.1 skrll break;
1350 1.1 skrll
1351 1.1 skrll case directive_literal_prefix:
1352 1.1 skrll /* Have to flush pending output because a movi relaxed to an l32r
1353 1.1 skrll might produce a literal. */
1354 1.1 skrll md_flush_pending_output ();
1355 1.1 skrll /* Check to see if the current fragment is a literal
1356 1.1 skrll fragment. If it is, then this operation is not allowed. */
1357 1.1 skrll if (generating_literals)
1358 1.1 skrll {
1359 1.1 skrll as_bad (_("cannot set literal_prefix inside literal fragment"));
1360 1.1 skrll return;
1361 1.1 skrll }
1362 1.1.1.5 christos
1363 1.1.1.2 christos /* Allocate the literal state for this section and push
1364 1.1 skrll onto the directive stack. */
1365 1.1 skrll ls = XNEW (lit_state);
1366 1.1 skrll gas_assert (ls);
1367 1.1 skrll
1368 1.1 skrll *ls = default_lit_sections;
1369 1.1 skrll directive_push (directive_literal_prefix, negated, ls);
1370 1.1 skrll
1371 1.1 skrll /* Process the new prefix. */
1372 1.1 skrll xtensa_literal_prefix ();
1373 1.1 skrll break;
1374 1.1 skrll
1375 1.1 skrll case directive_freeregs:
1376 1.1 skrll /* This information is currently unused, but we'll accept the statement
1377 1.1 skrll and just discard the rest of the line. This won't check the syntax,
1378 1.1 skrll but it will accept every correct freeregs directive. */
1379 1.1 skrll input_line_pointer += strcspn (input_line_pointer, "\n");
1380 1.1 skrll directive_push (directive_freeregs, negated, 0);
1381 1.1 skrll break;
1382 1.1 skrll
1383 1.1 skrll case directive_schedule:
1384 1.1 skrll md_flush_pending_output ();
1385 1.1 skrll frag_var (rs_fill, 0, 0, frag_now->fr_subtype,
1386 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
1387 1.1 skrll directive_push (directive_schedule, negated, 0);
1388 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
1389 1.1 skrll break;
1390 1.1 skrll
1391 1.1 skrll case directive_density:
1392 1.1 skrll as_warn (_(".begin [no-]density is ignored"));
1393 1.1 skrll break;
1394 1.1 skrll
1395 1.1 skrll case directive_absolute_literals:
1396 1.1 skrll md_flush_pending_output ();
1397 1.1 skrll if (!absolute_literals_supported && !negated)
1398 1.1 skrll {
1399 1.1 skrll as_warn (_("Xtensa absolute literals option not supported; ignored"));
1400 1.1 skrll break;
1401 1.1 skrll }
1402 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
1403 1.1 skrll directive_push (directive, negated, 0);
1404 1.1 skrll break;
1405 1.1 skrll
1406 1.1 skrll default:
1407 1.1 skrll md_flush_pending_output ();
1408 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
1409 1.1 skrll directive_push (directive, negated, 0);
1410 1.1 skrll break;
1411 1.1 skrll }
1412 1.1 skrll
1413 1.1 skrll demand_empty_rest_of_line ();
1414 1.1 skrll }
1415 1.1 skrll
1416 1.1 skrll
1417 1.1 skrll static void
1418 1.1 skrll xtensa_end_directive (int ignore ATTRIBUTE_UNUSED)
1419 1.1 skrll {
1420 1.1 skrll directiveE begin_directive, end_directive;
1421 1.1 skrll bfd_boolean begin_negated, end_negated;
1422 1.1 skrll const char *file;
1423 1.1 skrll unsigned int line;
1424 1.1 skrll emit_state *state;
1425 1.1 skrll emit_state **state_ptr;
1426 1.1 skrll lit_state *s;
1427 1.1 skrll
1428 1.1 skrll if (cur_vinsn.inside_bundle)
1429 1.1 skrll as_bad (_("directives are not valid inside bundles"));
1430 1.1 skrll
1431 1.1 skrll get_directive (&end_directive, &end_negated);
1432 1.1.1.2 christos
1433 1.1 skrll md_flush_pending_output ();
1434 1.1.1.2 christos
1435 1.1 skrll switch ((int) end_directive)
1436 1.1 skrll {
1437 1.1 skrll case XTENSA_UNDEFINED:
1438 1.1.1.2 christos discard_rest_of_line ();
1439 1.1 skrll return;
1440 1.1 skrll
1441 1.1 skrll case (int) directive_density:
1442 1.1 skrll as_warn (_(".end [no-]density is ignored"));
1443 1.1.1.2 christos demand_empty_rest_of_line ();
1444 1.1 skrll break;
1445 1.1 skrll
1446 1.1 skrll case (int) directive_absolute_literals:
1447 1.1 skrll if (!absolute_literals_supported && !end_negated)
1448 1.1 skrll {
1449 1.1 skrll as_warn (_("Xtensa absolute literals option not supported; ignored"));
1450 1.1 skrll demand_empty_rest_of_line ();
1451 1.1 skrll return;
1452 1.1 skrll }
1453 1.1 skrll break;
1454 1.1 skrll
1455 1.1 skrll default:
1456 1.1 skrll break;
1457 1.1 skrll }
1458 1.1 skrll
1459 1.1 skrll state_ptr = &state; /* use state_ptr to avoid type-punning warning */
1460 1.1 skrll directive_pop (&begin_directive, &begin_negated, &file, &line,
1461 1.1 skrll (const void **) state_ptr);
1462 1.1 skrll
1463 1.1 skrll if (begin_directive != directive_none)
1464 1.1 skrll {
1465 1.1 skrll if (begin_directive != end_directive || begin_negated != end_negated)
1466 1.1 skrll {
1467 1.1 skrll as_bad (_("does not match begin %s%s at %s:%d"),
1468 1.1 skrll begin_negated ? "no-" : "",
1469 1.1 skrll directive_info[begin_directive].name, file, line);
1470 1.1 skrll }
1471 1.1 skrll else
1472 1.1 skrll {
1473 1.1 skrll switch (end_directive)
1474 1.1 skrll {
1475 1.1 skrll case directive_literal:
1476 1.1 skrll frag_var (rs_fill, 0, 0, 0, NULL, 0, NULL);
1477 1.1 skrll xtensa_restore_emit_state (state);
1478 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
1479 1.1 skrll free (state);
1480 1.1 skrll if (!inside_directive (directive_literal))
1481 1.1 skrll {
1482 1.1 skrll /* Restore the list of current labels. */
1483 1.1 skrll xtensa_clear_insn_labels ();
1484 1.1 skrll insn_labels = saved_insn_labels;
1485 1.1 skrll }
1486 1.1 skrll break;
1487 1.1 skrll
1488 1.1.1.2 christos case directive_literal_prefix:
1489 1.1 skrll /* Restore the default collection sections from saved state. */
1490 1.1 skrll s = (lit_state *) state;
1491 1.1 skrll gas_assert (s);
1492 1.1 skrll default_lit_sections = *s;
1493 1.1 skrll
1494 1.1 skrll /* Free the state storage. */
1495 1.1 skrll free (s->lit_prefix);
1496 1.1 skrll free (s);
1497 1.1 skrll break;
1498 1.1 skrll
1499 1.1 skrll case directive_schedule:
1500 1.1 skrll case directive_freeregs:
1501 1.1 skrll break;
1502 1.1 skrll
1503 1.1 skrll default:
1504 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
1505 1.1 skrll break;
1506 1.1 skrll }
1507 1.1 skrll }
1508 1.1 skrll }
1509 1.1 skrll
1510 1.1 skrll demand_empty_rest_of_line ();
1511 1.1 skrll }
1512 1.1 skrll
1513 1.1 skrll
1514 1.1 skrll /* Place an aligned literal fragment at the current location. */
1515 1.1 skrll
1516 1.1 skrll static void
1517 1.1 skrll xtensa_literal_position (int ignore ATTRIBUTE_UNUSED)
1518 1.1 skrll {
1519 1.1 skrll md_flush_pending_output ();
1520 1.1 skrll
1521 1.1 skrll if (inside_directive (directive_literal))
1522 1.1 skrll as_warn (_(".literal_position inside literal directive; ignoring"));
1523 1.1 skrll xtensa_mark_literal_pool_location ();
1524 1.1 skrll
1525 1.1 skrll demand_empty_rest_of_line ();
1526 1.1 skrll xtensa_clear_insn_labels ();
1527 1.1 skrll }
1528 1.1 skrll
1529 1.1 skrll
1530 1.1 skrll /* Support .literal label, expr, ... */
1531 1.1 skrll
1532 1.1 skrll static void
1533 1.1 skrll xtensa_literal_pseudo (int ignored ATTRIBUTE_UNUSED)
1534 1.1 skrll {
1535 1.1 skrll emit_state state;
1536 1.1 skrll char *p, *base_name;
1537 1.1 skrll char c;
1538 1.1 skrll
1539 1.1 skrll if (inside_directive (directive_literal))
1540 1.1 skrll {
1541 1.1 skrll as_bad (_(".literal not allowed inside .begin literal region"));
1542 1.1 skrll ignore_rest_of_line ();
1543 1.1 skrll return;
1544 1.1 skrll }
1545 1.1 skrll
1546 1.1 skrll md_flush_pending_output ();
1547 1.1 skrll
1548 1.1 skrll /* Previous labels go with whatever follows this directive, not with
1549 1.1 skrll the literal, so save them now. */
1550 1.1 skrll saved_insn_labels = insn_labels;
1551 1.1 skrll insn_labels = NULL;
1552 1.1 skrll
1553 1.1 skrll base_name = input_line_pointer;
1554 1.1 skrll
1555 1.1 skrll xtensa_switch_to_literal_fragment (&state);
1556 1.1 skrll
1557 1.1 skrll /* All literals are aligned to four-byte boundaries. */
1558 1.1.1.4 christos frag_align (2, 0, 0);
1559 1.1 skrll record_alignment (now_seg, 2);
1560 1.1 skrll
1561 1.1 skrll c = get_symbol_name (&base_name);
1562 1.1.1.4 christos /* Just after name is now '\0'. */
1563 1.1 skrll p = input_line_pointer;
1564 1.1 skrll *p = c;
1565 1.1 skrll SKIP_WHITESPACE_AFTER_NAME ();
1566 1.1 skrll
1567 1.1 skrll if (*input_line_pointer != ',' && *input_line_pointer != ':')
1568 1.1 skrll {
1569 1.1 skrll as_bad (_("expected comma or colon after symbol name; "
1570 1.1 skrll "rest of line ignored"));
1571 1.1 skrll ignore_rest_of_line ();
1572 1.1 skrll xtensa_restore_emit_state (&state);
1573 1.1.1.4 christos return;
1574 1.1 skrll }
1575 1.1 skrll
1576 1.1.1.4 christos *p = 0;
1577 1.1 skrll colon (base_name);
1578 1.1 skrll *p = c;
1579 1.1 skrll
1580 1.1 skrll input_line_pointer++; /* skip ',' or ':' */
1581 1.1 skrll
1582 1.1 skrll xtensa_elf_cons (4);
1583 1.1 skrll
1584 1.1 skrll xtensa_restore_emit_state (&state);
1585 1.1 skrll
1586 1.1 skrll /* Restore the list of current labels. */
1587 1.1 skrll xtensa_clear_insn_labels ();
1588 1.1 skrll insn_labels = saved_insn_labels;
1589 1.1 skrll }
1590 1.1 skrll
1591 1.1 skrll
1592 1.1 skrll static void
1593 1.1 skrll xtensa_literal_prefix (void)
1594 1.1 skrll {
1595 1.1 skrll char *name;
1596 1.1 skrll int len;
1597 1.1 skrll
1598 1.1 skrll /* Parse the new prefix from the input_line_pointer. */
1599 1.1 skrll SKIP_WHITESPACE ();
1600 1.1 skrll len = strspn (input_line_pointer,
1601 1.1 skrll "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
1602 1.1.1.5 christos "abcdefghijklmnopqrstuvwxyz_/0123456789.$");
1603 1.1 skrll
1604 1.1 skrll /* Get a null-terminated copy of the name. */
1605 1.1 skrll name = xmemdup0 (input_line_pointer, len);
1606 1.1 skrll
1607 1.1 skrll /* Skip the name in the input line. */
1608 1.1 skrll input_line_pointer += len;
1609 1.1 skrll
1610 1.1 skrll default_lit_sections.lit_prefix = name;
1611 1.1 skrll
1612 1.1 skrll /* Clear cached literal sections, since the prefix has changed. */
1613 1.1 skrll default_lit_sections.lit_seg = NULL;
1614 1.1 skrll default_lit_sections.lit4_seg = NULL;
1615 1.1 skrll }
1616 1.1 skrll
1617 1.1 skrll
1618 1.1 skrll /* Support ".frequency branch_target_frequency fall_through_frequency". */
1619 1.1 skrll
1620 1.1 skrll static void
1621 1.1 skrll xtensa_frequency_pseudo (int ignored ATTRIBUTE_UNUSED)
1622 1.1 skrll {
1623 1.1 skrll float fall_through_f, target_f;
1624 1.1 skrll
1625 1.1 skrll fall_through_f = (float) strtod (input_line_pointer, &input_line_pointer);
1626 1.1 skrll if (fall_through_f < 0)
1627 1.1 skrll {
1628 1.1 skrll as_bad (_("fall through frequency must be greater than 0"));
1629 1.1 skrll ignore_rest_of_line ();
1630 1.1 skrll return;
1631 1.1 skrll }
1632 1.1 skrll
1633 1.1 skrll target_f = (float) strtod (input_line_pointer, &input_line_pointer);
1634 1.1 skrll if (target_f < 0)
1635 1.1 skrll {
1636 1.1 skrll as_bad (_("branch target frequency must be greater than 0"));
1637 1.1 skrll ignore_rest_of_line ();
1638 1.1 skrll return;
1639 1.1 skrll }
1640 1.1 skrll
1641 1.1 skrll set_subseg_freq (now_seg, now_subseg, target_f + fall_through_f, target_f);
1642 1.1 skrll
1643 1.1 skrll demand_empty_rest_of_line ();
1644 1.1 skrll }
1645 1.1 skrll
1646 1.1 skrll
1647 1.1 skrll /* Like normal .long/.short/.word, except support @plt, etc.
1648 1.1 skrll Clobbers input_line_pointer, checks end-of-line. */
1649 1.1 skrll
1650 1.1 skrll static void
1651 1.1 skrll xtensa_elf_cons (int nbytes)
1652 1.1 skrll {
1653 1.1 skrll expressionS exp;
1654 1.1 skrll bfd_reloc_code_real_type reloc;
1655 1.1 skrll
1656 1.1 skrll md_flush_pending_output ();
1657 1.1 skrll
1658 1.1 skrll if (cur_vinsn.inside_bundle)
1659 1.1 skrll as_bad (_("directives are not valid inside bundles"));
1660 1.1 skrll
1661 1.1 skrll if (is_it_end_of_statement ())
1662 1.1 skrll {
1663 1.1 skrll demand_empty_rest_of_line ();
1664 1.1 skrll return;
1665 1.1 skrll }
1666 1.1 skrll
1667 1.1 skrll do
1668 1.1 skrll {
1669 1.1 skrll expression (&exp);
1670 1.1 skrll if (exp.X_op == O_symbol
1671 1.1 skrll && *input_line_pointer == '@'
1672 1.1 skrll && ((reloc = xtensa_elf_suffix (&input_line_pointer, &exp))
1673 1.1 skrll != BFD_RELOC_NONE))
1674 1.1 skrll {
1675 1.1 skrll reloc_howto_type *reloc_howto =
1676 1.1 skrll bfd_reloc_type_lookup (stdoutput, reloc);
1677 1.1 skrll
1678 1.1 skrll if (reloc == BFD_RELOC_UNUSED || !reloc_howto)
1679 1.1 skrll as_bad (_("unsupported relocation"));
1680 1.1 skrll else if ((reloc >= BFD_RELOC_XTENSA_SLOT0_OP
1681 1.1 skrll && reloc <= BFD_RELOC_XTENSA_SLOT14_OP)
1682 1.1 skrll || (reloc >= BFD_RELOC_XTENSA_SLOT0_ALT
1683 1.1 skrll && reloc <= BFD_RELOC_XTENSA_SLOT14_ALT))
1684 1.1.1.6 christos as_bad (_("opcode-specific %s relocation used outside "
1685 1.1.1.6 christos "an instruction"), reloc_howto->name);
1686 1.1.1.6 christos else if (nbytes != (int) bfd_get_reloc_size (reloc_howto))
1687 1.1 skrll as_bad (ngettext ("%s relocations do not fit in %d byte",
1688 1.1 skrll "%s relocations do not fit in %d bytes",
1689 1.1 skrll nbytes),
1690 1.1 skrll reloc_howto->name, nbytes);
1691 1.1 skrll else if (reloc == BFD_RELOC_XTENSA_TLS_FUNC
1692 1.1 skrll || reloc == BFD_RELOC_XTENSA_TLS_ARG
1693 1.1 skrll || reloc == BFD_RELOC_XTENSA_TLS_CALL)
1694 1.1 skrll as_bad (_("invalid use of %s relocation"), reloc_howto->name);
1695 1.1 skrll else
1696 1.1 skrll {
1697 1.1 skrll char *p = frag_more ((int) nbytes);
1698 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
1699 1.1 skrll fix_new_exp (frag_now, p - frag_now->fr_literal,
1700 1.1 skrll nbytes, &exp, reloc_howto->pc_relative, reloc);
1701 1.1 skrll }
1702 1.1 skrll }
1703 1.1 skrll else
1704 1.1 skrll {
1705 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
1706 1.1 skrll emit_expr (&exp, (unsigned int) nbytes);
1707 1.1 skrll }
1708 1.1 skrll }
1709 1.1 skrll while (*input_line_pointer++ == ',');
1710 1.1 skrll
1711 1.1 skrll input_line_pointer--; /* Put terminator back into stream. */
1712 1.1 skrll demand_empty_rest_of_line ();
1713 1.1 skrll }
1714 1.1 skrll
1715 1.1 skrll static bfd_boolean is_leb128_expr;
1716 1.1 skrll
1717 1.1 skrll static void
1718 1.1 skrll xtensa_leb128 (int sign)
1719 1.1 skrll {
1720 1.1 skrll is_leb128_expr = TRUE;
1721 1.1 skrll s_leb128 (sign);
1722 1.1 skrll is_leb128_expr = FALSE;
1723 1.1 skrll }
1724 1.1 skrll
1725 1.1 skrll
1726 1.1 skrll /* Parsing and Idiom Translation. */
1728 1.1 skrll
1729 1.1 skrll /* Parse @plt, etc. and return the desired relocation. */
1730 1.1 skrll static bfd_reloc_code_real_type
1731 1.1 skrll xtensa_elf_suffix (char **str_p, expressionS *exp_p)
1732 1.1 skrll {
1733 1.1 skrll char ident[20];
1734 1.1.1.5 christos char *str = *str_p;
1735 1.1 skrll char *str2;
1736 1.1 skrll int ch;
1737 1.1 skrll int len;
1738 1.1 skrll unsigned int i;
1739 1.1 skrll
1740 1.1 skrll if (*str++ != '@')
1741 1.1 skrll return BFD_RELOC_NONE;
1742 1.1 skrll
1743 1.1 skrll for (ch = *str, str2 = ident;
1744 1.1 skrll (str2 < ident + sizeof (ident) - 1
1745 1.1 skrll && (ISALNUM (ch) || ch == '@'));
1746 1.1 skrll ch = *++str)
1747 1.1 skrll {
1748 1.1 skrll *str2++ = (ISLOWER (ch)) ? ch : TOLOWER (ch);
1749 1.1 skrll }
1750 1.1 skrll
1751 1.1.1.5 christos *str2 = '\0';
1752 1.1.1.5 christos len = str2 - ident;
1753 1.1.1.5 christos
1754 1.1.1.5 christos ch = ident[0];
1755 1.1 skrll for (i = 0; i < ARRAY_SIZE (suffix_relocs); i++)
1756 1.1 skrll if (ch == suffix_relocs[i].suffix[0]
1757 1.1 skrll && len == suffix_relocs[i].length
1758 1.1 skrll && memcmp (ident, suffix_relocs[i].suffix, suffix_relocs[i].length) == 0)
1759 1.1 skrll {
1760 1.1 skrll /* Now check for "identifier@suffix+constant". */
1761 1.1 skrll if (*str == '-' || *str == '+')
1762 1.1 skrll {
1763 1.1 skrll char *orig_line = input_line_pointer;
1764 1.1 skrll expressionS new_exp;
1765 1.1 skrll
1766 1.1 skrll input_line_pointer = str;
1767 1.1 skrll expression (&new_exp);
1768 1.1 skrll if (new_exp.X_op == O_constant)
1769 1.1 skrll {
1770 1.1 skrll exp_p->X_add_number += new_exp.X_add_number;
1771 1.1 skrll str = input_line_pointer;
1772 1.1 skrll }
1773 1.1 skrll
1774 1.1 skrll if (&input_line_pointer != str_p)
1775 1.1.1.5 christos input_line_pointer = orig_line;
1776 1.1 skrll }
1777 1.1 skrll
1778 1.1 skrll *str_p = str;
1779 1.1 skrll return suffix_relocs[i].reloc;
1780 1.1 skrll }
1781 1.1 skrll
1782 1.1 skrll return BFD_RELOC_UNUSED;
1783 1.1.1.5 christos }
1784 1.1 skrll
1785 1.1 skrll
1786 1.1.1.5 christos /* Find the matching operator type. */
1787 1.1.1.5 christos static operatorT
1788 1.1.1.4 christos map_suffix_reloc_to_operator (bfd_reloc_code_real_type reloc)
1789 1.1.1.5 christos {
1790 1.1 skrll operatorT operator = O_illegal;
1791 1.1.1.5 christos unsigned int i;
1792 1.1 skrll
1793 1.1.1.5 christos for (i = 0; i < ARRAY_SIZE (suffix_relocs); i++)
1794 1.1 skrll {
1795 1.1 skrll if (suffix_relocs[i].reloc == reloc)
1796 1.1 skrll {
1797 1.1.1.5 christos operator = suffix_relocs[i].operator;
1798 1.1 skrll break;
1799 1.1 skrll }
1800 1.1 skrll }
1801 1.1 skrll gas_assert (operator != O_illegal);
1802 1.1 skrll return operator;
1803 1.1 skrll }
1804 1.1 skrll
1805 1.1 skrll
1806 1.1.1.5 christos /* Find the matching reloc type. */
1807 1.1 skrll static bfd_reloc_code_real_type
1808 1.1 skrll map_operator_to_reloc (unsigned char operator, bfd_boolean is_literal)
1809 1.1.1.5 christos {
1810 1.1 skrll unsigned int i;
1811 1.1.1.5 christos bfd_reloc_code_real_type reloc = BFD_RELOC_UNUSED;
1812 1.1 skrll
1813 1.1.1.5 christos for (i = 0; i < ARRAY_SIZE (suffix_relocs); i++)
1814 1.1 skrll {
1815 1.1 skrll if (suffix_relocs[i].operator == operator)
1816 1.1 skrll {
1817 1.1 skrll reloc = suffix_relocs[i].reloc;
1818 1.1 skrll break;
1819 1.1 skrll }
1820 1.1 skrll }
1821 1.1 skrll
1822 1.1 skrll if (is_literal)
1823 1.1 skrll {
1824 1.1 skrll if (reloc == BFD_RELOC_XTENSA_TLS_FUNC)
1825 1.1 skrll return BFD_RELOC_XTENSA_TLSDESC_FN;
1826 1.1 skrll else if (reloc == BFD_RELOC_XTENSA_TLS_ARG)
1827 1.1 skrll return BFD_RELOC_XTENSA_TLSDESC_ARG;
1828 1.1 skrll }
1829 1.1 skrll
1830 1.1 skrll if (reloc == BFD_RELOC_UNUSED)
1831 1.1 skrll return BFD_RELOC_32;
1832 1.1 skrll
1833 1.1 skrll return reloc;
1834 1.1 skrll }
1835 1.1 skrll
1836 1.1 skrll
1837 1.1 skrll static const char *
1838 1.1 skrll expression_end (const char *name)
1839 1.1 skrll {
1840 1.1 skrll while (1)
1841 1.1 skrll {
1842 1.1 skrll switch (*name)
1843 1.1 skrll {
1844 1.1 skrll case '}':
1845 1.1 skrll case ';':
1846 1.1 skrll case '\0':
1847 1.1 skrll case ',':
1848 1.1 skrll case ':':
1849 1.1 skrll return name;
1850 1.1 skrll case ' ':
1851 1.1 skrll case '\t':
1852 1.1 skrll ++name;
1853 1.1 skrll continue;
1854 1.1 skrll default:
1855 1.1 skrll return 0;
1856 1.1 skrll }
1857 1.1 skrll }
1858 1.1 skrll }
1859 1.1 skrll
1860 1.1 skrll
1861 1.1 skrll #define ERROR_REG_NUM ((unsigned) -1)
1862 1.1 skrll
1863 1.1 skrll static unsigned
1864 1.1 skrll tc_get_register (const char *prefix)
1865 1.1 skrll {
1866 1.1 skrll unsigned reg;
1867 1.1 skrll const char *next_expr;
1868 1.1 skrll const char *old_line_pointer;
1869 1.1 skrll
1870 1.1 skrll SKIP_WHITESPACE ();
1871 1.1 skrll old_line_pointer = input_line_pointer;
1872 1.1 skrll
1873 1.1 skrll if (*input_line_pointer == '$')
1874 1.1 skrll ++input_line_pointer;
1875 1.1 skrll
1876 1.1 skrll /* Accept "sp" as a synonym for "a1". */
1877 1.1 skrll if (input_line_pointer[0] == 's' && input_line_pointer[1] == 'p'
1878 1.1 skrll && expression_end (input_line_pointer + 2))
1879 1.1 skrll {
1880 1.1 skrll input_line_pointer += 2;
1881 1.1 skrll return 1; /* AR[1] */
1882 1.1 skrll }
1883 1.1 skrll
1884 1.1 skrll while (*input_line_pointer++ == *prefix++)
1885 1.1 skrll ;
1886 1.1 skrll --input_line_pointer;
1887 1.1 skrll --prefix;
1888 1.1 skrll
1889 1.1 skrll if (*prefix)
1890 1.1 skrll {
1891 1.1 skrll as_bad (_("bad register name: %s"), old_line_pointer);
1892 1.1 skrll return ERROR_REG_NUM;
1893 1.1 skrll }
1894 1.1 skrll
1895 1.1 skrll if (!ISDIGIT ((unsigned char) *input_line_pointer))
1896 1.1 skrll {
1897 1.1 skrll as_bad (_("bad register number: %s"), input_line_pointer);
1898 1.1 skrll return ERROR_REG_NUM;
1899 1.1 skrll }
1900 1.1 skrll
1901 1.1 skrll reg = 0;
1902 1.1 skrll
1903 1.1 skrll while (ISDIGIT ((int) *input_line_pointer))
1904 1.1 skrll reg = reg * 10 + *input_line_pointer++ - '0';
1905 1.1 skrll
1906 1.1 skrll if (!(next_expr = expression_end (input_line_pointer)))
1907 1.1 skrll {
1908 1.1 skrll as_bad (_("bad register name: %s"), old_line_pointer);
1909 1.1 skrll return ERROR_REG_NUM;
1910 1.1 skrll }
1911 1.1 skrll
1912 1.1 skrll input_line_pointer = (char *) next_expr;
1913 1.1 skrll
1914 1.1 skrll return reg;
1915 1.1 skrll }
1916 1.1 skrll
1917 1.1 skrll
1918 1.1 skrll static void
1919 1.1 skrll expression_maybe_register (xtensa_opcode opc, int opnd, expressionS *tok)
1920 1.1 skrll {
1921 1.1 skrll xtensa_isa isa = xtensa_default_isa;
1922 1.1 skrll
1923 1.1 skrll /* Check if this is an immediate operand. */
1924 1.1.1.2 christos if (xtensa_operand_is_register (isa, opc, opnd) == 0)
1925 1.1 skrll {
1926 1.1 skrll bfd_reloc_code_real_type reloc;
1927 1.1 skrll segT t = expression (tok);
1928 1.1.1.2 christos
1929 1.1 skrll if (t == absolute_section
1930 1.1 skrll && xtensa_operand_is_PCrelative (isa, opc, opnd) == 1)
1931 1.1 skrll {
1932 1.1 skrll gas_assert (tok->X_op == O_constant);
1933 1.1 skrll tok->X_op = O_symbol;
1934 1.1 skrll tok->X_add_symbol = &abs_symbol;
1935 1.1 skrll }
1936 1.1 skrll
1937 1.1 skrll if ((tok->X_op == O_constant || tok->X_op == O_symbol)
1938 1.1 skrll && ((reloc = xtensa_elf_suffix (&input_line_pointer, tok))
1939 1.1 skrll != BFD_RELOC_NONE))
1940 1.1 skrll {
1941 1.1 skrll switch (reloc)
1942 1.1 skrll {
1943 1.1 skrll case BFD_RELOC_LO16:
1944 1.1 skrll if (tok->X_op == O_constant)
1945 1.1 skrll {
1946 1.1 skrll tok->X_add_number &= 0xffff;
1947 1.1 skrll return;
1948 1.1 skrll }
1949 1.1 skrll break;
1950 1.1 skrll case BFD_RELOC_HI16:
1951 1.1 skrll if (tok->X_op == O_constant)
1952 1.1 skrll {
1953 1.1 skrll tok->X_add_number = ((unsigned) tok->X_add_number) >> 16;
1954 1.1 skrll return;
1955 1.1 skrll }
1956 1.1 skrll break;
1957 1.1 skrll case BFD_RELOC_UNUSED:
1958 1.1 skrll as_bad (_("unsupported relocation"));
1959 1.1 skrll return;
1960 1.1 skrll case BFD_RELOC_32_PCREL:
1961 1.1 skrll as_bad (_("pcrel relocation not allowed in an instruction"));
1962 1.1 skrll return;
1963 1.1 skrll default:
1964 1.1 skrll break;
1965 1.1 skrll }
1966 1.1 skrll tok->X_op = map_suffix_reloc_to_operator (reloc);
1967 1.1 skrll }
1968 1.1 skrll }
1969 1.1 skrll else
1970 1.1 skrll {
1971 1.1 skrll xtensa_regfile opnd_rf = xtensa_operand_regfile (isa, opc, opnd);
1972 1.1 skrll unsigned reg = tc_get_register (xtensa_regfile_shortname (isa, opnd_rf));
1973 1.1 skrll
1974 1.1 skrll if (reg != ERROR_REG_NUM) /* Already errored */
1975 1.1 skrll {
1976 1.1 skrll uint32 buf = reg;
1977 1.1 skrll if (xtensa_operand_encode (isa, opc, opnd, &buf))
1978 1.1 skrll as_bad (_("register number out of range"));
1979 1.1 skrll }
1980 1.1 skrll
1981 1.1 skrll tok->X_op = O_register;
1982 1.1 skrll tok->X_add_symbol = 0;
1983 1.1 skrll tok->X_add_number = reg;
1984 1.1 skrll }
1985 1.1 skrll }
1986 1.1 skrll
1987 1.1 skrll
1988 1.1 skrll /* Split up the arguments for an opcode or pseudo-op. */
1989 1.1 skrll
1990 1.1 skrll static int
1991 1.1 skrll tokenize_arguments (char **args, char *str)
1992 1.1 skrll {
1993 1.1 skrll char *old_input_line_pointer;
1994 1.1 skrll bfd_boolean saw_comma = FALSE;
1995 1.1 skrll bfd_boolean saw_arg = FALSE;
1996 1.1 skrll bfd_boolean saw_colon = FALSE;
1997 1.1 skrll int num_args = 0;
1998 1.1 skrll char *arg_end, *arg;
1999 1.1 skrll int arg_len;
2000 1.1 skrll
2001 1.1 skrll /* Save and restore input_line_pointer around this function. */
2002 1.1 skrll old_input_line_pointer = input_line_pointer;
2003 1.1 skrll input_line_pointer = str;
2004 1.1 skrll
2005 1.1 skrll while (*input_line_pointer)
2006 1.1 skrll {
2007 1.1 skrll SKIP_WHITESPACE ();
2008 1.1 skrll switch (*input_line_pointer)
2009 1.1 skrll {
2010 1.1 skrll case '\0':
2011 1.1 skrll case '}':
2012 1.1 skrll goto fini;
2013 1.1 skrll
2014 1.1 skrll case ':':
2015 1.1 skrll input_line_pointer++;
2016 1.1 skrll if (saw_comma || saw_colon || !saw_arg)
2017 1.1 skrll goto err;
2018 1.1 skrll saw_colon = TRUE;
2019 1.1 skrll break;
2020 1.1 skrll
2021 1.1 skrll case ',':
2022 1.1 skrll input_line_pointer++;
2023 1.1 skrll if (saw_comma || saw_colon || !saw_arg)
2024 1.1 skrll goto err;
2025 1.1 skrll saw_comma = TRUE;
2026 1.1 skrll break;
2027 1.1 skrll
2028 1.1 skrll default:
2029 1.1 skrll if (!saw_comma && !saw_colon && saw_arg)
2030 1.1 skrll goto err;
2031 1.1 skrll
2032 1.1 skrll arg_end = input_line_pointer + 1;
2033 1.1.1.5 christos while (!expression_end (arg_end))
2034 1.1 skrll arg_end += 1;
2035 1.1 skrll
2036 1.1 skrll arg_len = arg_end - input_line_pointer;
2037 1.1 skrll arg = XNEWVEC (char, (saw_colon ? 1 : 0) + arg_len + 1);
2038 1.1 skrll args[num_args] = arg;
2039 1.1 skrll
2040 1.1 skrll if (saw_colon)
2041 1.1 skrll *arg++ = ':';
2042 1.1 skrll strncpy (arg, input_line_pointer, arg_len);
2043 1.1 skrll arg[arg_len] = '\0';
2044 1.1 skrll
2045 1.1 skrll input_line_pointer = arg_end;
2046 1.1 skrll num_args += 1;
2047 1.1 skrll saw_comma = FALSE;
2048 1.1 skrll saw_colon = FALSE;
2049 1.1 skrll saw_arg = TRUE;
2050 1.1 skrll break;
2051 1.1 skrll }
2052 1.1 skrll }
2053 1.1 skrll
2054 1.1 skrll fini:
2055 1.1 skrll if (saw_comma || saw_colon)
2056 1.1 skrll goto err;
2057 1.1 skrll input_line_pointer = old_input_line_pointer;
2058 1.1 skrll return num_args;
2059 1.1 skrll
2060 1.1 skrll err:
2061 1.1 skrll if (saw_comma)
2062 1.1 skrll as_bad (_("extra comma"));
2063 1.1 skrll else if (saw_colon)
2064 1.1 skrll as_bad (_("extra colon"));
2065 1.1 skrll else if (!saw_arg)
2066 1.1 skrll as_bad (_("missing argument"));
2067 1.1 skrll else
2068 1.1 skrll as_bad (_("missing comma or colon"));
2069 1.1 skrll input_line_pointer = old_input_line_pointer;
2070 1.1 skrll return -1;
2071 1.1 skrll }
2072 1.1 skrll
2073 1.1 skrll
2074 1.1 skrll /* Parse the arguments to an opcode. Return TRUE on error. */
2075 1.1 skrll
2076 1.1 skrll static bfd_boolean
2077 1.1 skrll parse_arguments (TInsn *insn, int num_args, char **arg_strings)
2078 1.1 skrll {
2079 1.1 skrll expressionS *tok, *last_tok;
2080 1.1 skrll xtensa_opcode opcode = insn->opcode;
2081 1.1 skrll bfd_boolean had_error = TRUE;
2082 1.1 skrll xtensa_isa isa = xtensa_default_isa;
2083 1.1 skrll int n, num_regs = 0;
2084 1.1 skrll int opcode_operand_count;
2085 1.1 skrll int opnd_cnt, last_opnd_cnt;
2086 1.1 skrll unsigned int next_reg = 0;
2087 1.1 skrll char *old_input_line_pointer;
2088 1.1 skrll
2089 1.1 skrll if (insn->insn_type == ITYPE_LITERAL)
2090 1.1 skrll opcode_operand_count = 1;
2091 1.1 skrll else
2092 1.1 skrll opcode_operand_count = xtensa_opcode_num_operands (isa, opcode);
2093 1.1 skrll
2094 1.1 skrll tok = insn->tok;
2095 1.1 skrll memset (tok, 0, sizeof (*tok) * MAX_INSN_ARGS);
2096 1.1 skrll
2097 1.1 skrll /* Save and restore input_line_pointer around this function. */
2098 1.1 skrll old_input_line_pointer = input_line_pointer;
2099 1.1 skrll
2100 1.1 skrll last_tok = 0;
2101 1.1 skrll last_opnd_cnt = -1;
2102 1.1 skrll opnd_cnt = 0;
2103 1.1 skrll
2104 1.1 skrll /* Skip invisible operands. */
2105 1.1 skrll while (xtensa_operand_is_visible (isa, opcode, opnd_cnt) == 0)
2106 1.1 skrll {
2107 1.1 skrll opnd_cnt += 1;
2108 1.1 skrll tok++;
2109 1.1 skrll }
2110 1.1 skrll
2111 1.1 skrll for (n = 0; n < num_args; n++)
2112 1.1 skrll {
2113 1.1 skrll input_line_pointer = arg_strings[n];
2114 1.1 skrll if (*input_line_pointer == ':')
2115 1.1 skrll {
2116 1.1.1.2 christos xtensa_regfile opnd_rf;
2117 1.1 skrll input_line_pointer++;
2118 1.1 skrll if (num_regs == 0)
2119 1.1 skrll goto err;
2120 1.1 skrll gas_assert (opnd_cnt > 0);
2121 1.1 skrll num_regs--;
2122 1.1 skrll opnd_rf = xtensa_operand_regfile (isa, opcode, last_opnd_cnt);
2123 1.1 skrll if (next_reg
2124 1.1 skrll != tc_get_register (xtensa_regfile_shortname (isa, opnd_rf)))
2125 1.1 skrll as_warn (_("incorrect register number, ignoring"));
2126 1.1 skrll next_reg++;
2127 1.1 skrll }
2128 1.1 skrll else
2129 1.1 skrll {
2130 1.1 skrll if (opnd_cnt >= opcode_operand_count)
2131 1.1.1.2 christos {
2132 1.1 skrll as_warn (_("too many arguments"));
2133 1.1 skrll goto err;
2134 1.1 skrll }
2135 1.1 skrll gas_assert (opnd_cnt < MAX_INSN_ARGS);
2136 1.1 skrll
2137 1.1 skrll expression_maybe_register (opcode, opnd_cnt, tok);
2138 1.1 skrll next_reg = tok->X_add_number + 1;
2139 1.1 skrll
2140 1.1 skrll if (tok->X_op == O_illegal || tok->X_op == O_absent)
2141 1.1 skrll goto err;
2142 1.1 skrll if (xtensa_operand_is_register (isa, opcode, opnd_cnt) == 1)
2143 1.1 skrll {
2144 1.1 skrll num_regs = xtensa_operand_num_regs (isa, opcode, opnd_cnt) - 1;
2145 1.1 skrll /* minus 1 because we are seeing one right now */
2146 1.1 skrll }
2147 1.1 skrll else
2148 1.1.1.2 christos num_regs = 0;
2149 1.1 skrll
2150 1.1 skrll last_tok = tok;
2151 1.1 skrll last_opnd_cnt = opnd_cnt;
2152 1.1 skrll demand_empty_rest_of_line ();
2153 1.1 skrll
2154 1.1 skrll do
2155 1.1 skrll {
2156 1.1 skrll opnd_cnt += 1;
2157 1.1 skrll tok++;
2158 1.1 skrll }
2159 1.1 skrll while (xtensa_operand_is_visible (isa, opcode, opnd_cnt) == 0);
2160 1.1 skrll }
2161 1.1 skrll }
2162 1.1 skrll
2163 1.1 skrll if (num_regs > 0 && ((int) next_reg != last_tok->X_add_number + 1))
2164 1.1 skrll goto err;
2165 1.1 skrll
2166 1.1 skrll insn->ntok = tok - insn->tok;
2167 1.1 skrll had_error = FALSE;
2168 1.1 skrll
2169 1.1 skrll err:
2170 1.1 skrll input_line_pointer = old_input_line_pointer;
2171 1.1 skrll return had_error;
2172 1.1 skrll }
2173 1.1 skrll
2174 1.1 skrll
2175 1.1 skrll static int
2176 1.1 skrll get_invisible_operands (TInsn *insn)
2177 1.1 skrll {
2178 1.1 skrll xtensa_isa isa = xtensa_default_isa;
2179 1.1 skrll static xtensa_insnbuf slotbuf = NULL;
2180 1.1 skrll xtensa_format fmt;
2181 1.1 skrll xtensa_opcode opc = insn->opcode;
2182 1.1 skrll int slot, opnd, fmt_found;
2183 1.1 skrll unsigned val;
2184 1.1 skrll
2185 1.1 skrll if (!slotbuf)
2186 1.1 skrll slotbuf = xtensa_insnbuf_alloc (isa);
2187 1.1 skrll
2188 1.1 skrll /* Find format/slot where this can be encoded. */
2189 1.1 skrll fmt_found = 0;
2190 1.1 skrll slot = 0;
2191 1.1 skrll for (fmt = 0; fmt < xtensa_isa_num_formats (isa); fmt++)
2192 1.1 skrll {
2193 1.1 skrll for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
2194 1.1 skrll {
2195 1.1 skrll if (xtensa_opcode_encode (isa, fmt, slot, slotbuf, opc) == 0)
2196 1.1 skrll {
2197 1.1 skrll fmt_found = 1;
2198 1.1 skrll break;
2199 1.1 skrll }
2200 1.1 skrll }
2201 1.1 skrll if (fmt_found) break;
2202 1.1 skrll }
2203 1.1 skrll
2204 1.1 skrll if (!fmt_found)
2205 1.1 skrll {
2206 1.1 skrll as_bad (_("cannot encode opcode \"%s\""), xtensa_opcode_name (isa, opc));
2207 1.1 skrll return -1;
2208 1.1 skrll }
2209 1.1 skrll
2210 1.1 skrll /* First encode all the visible operands
2211 1.1 skrll (to deal with shared field operands). */
2212 1.1 skrll for (opnd = 0; opnd < insn->ntok; opnd++)
2213 1.1 skrll {
2214 1.1 skrll if (xtensa_operand_is_visible (isa, opc, opnd) == 1
2215 1.1 skrll && (insn->tok[opnd].X_op == O_register
2216 1.1 skrll || insn->tok[opnd].X_op == O_constant))
2217 1.1 skrll {
2218 1.1 skrll val = insn->tok[opnd].X_add_number;
2219 1.1 skrll xtensa_operand_encode (isa, opc, opnd, &val);
2220 1.1 skrll xtensa_operand_set_field (isa, opc, opnd, fmt, slot, slotbuf, val);
2221 1.1 skrll }
2222 1.1 skrll }
2223 1.1 skrll
2224 1.1 skrll /* Then pull out the values for the invisible ones. */
2225 1.1 skrll for (opnd = 0; opnd < insn->ntok; opnd++)
2226 1.1 skrll {
2227 1.1 skrll if (xtensa_operand_is_visible (isa, opc, opnd) == 0)
2228 1.1 skrll {
2229 1.1 skrll xtensa_operand_get_field (isa, opc, opnd, fmt, slot, slotbuf, &val);
2230 1.1 skrll xtensa_operand_decode (isa, opc, opnd, &val);
2231 1.1 skrll insn->tok[opnd].X_add_number = val;
2232 1.1 skrll if (xtensa_operand_is_register (isa, opc, opnd) == 1)
2233 1.1 skrll insn->tok[opnd].X_op = O_register;
2234 1.1 skrll else
2235 1.1 skrll insn->tok[opnd].X_op = O_constant;
2236 1.1 skrll }
2237 1.1 skrll }
2238 1.1 skrll
2239 1.1 skrll return 0;
2240 1.1 skrll }
2241 1.1 skrll
2242 1.1 skrll
2243 1.1 skrll static void
2244 1.1 skrll xg_reverse_shift_count (char **cnt_argp)
2245 1.1 skrll {
2246 1.1.1.6 christos char *cnt_arg, *new_arg;
2247 1.1 skrll cnt_arg = *cnt_argp;
2248 1.1 skrll
2249 1.1 skrll /* replace the argument with "31-(argument)" */
2250 1.1 skrll new_arg = concat ("31-(", cnt_arg, ")", (char *) NULL);
2251 1.1 skrll
2252 1.1 skrll free (cnt_arg);
2253 1.1 skrll *cnt_argp = new_arg;
2254 1.1 skrll }
2255 1.1 skrll
2256 1.1 skrll
2257 1.1 skrll /* If "arg" is a constant expression, return non-zero with the value
2258 1.1 skrll in *valp. */
2259 1.1 skrll
2260 1.1 skrll static int
2261 1.1 skrll xg_arg_is_constant (char *arg, offsetT *valp)
2262 1.1 skrll {
2263 1.1 skrll expressionS exp;
2264 1.1 skrll char *save_ptr = input_line_pointer;
2265 1.1 skrll
2266 1.1 skrll input_line_pointer = arg;
2267 1.1 skrll expression (&exp);
2268 1.1 skrll input_line_pointer = save_ptr;
2269 1.1 skrll
2270 1.1 skrll if (exp.X_op == O_constant)
2271 1.1 skrll {
2272 1.1 skrll *valp = exp.X_add_number;
2273 1.1 skrll return 1;
2274 1.1 skrll }
2275 1.1 skrll
2276 1.1 skrll return 0;
2277 1.1.1.5 christos }
2278 1.1 skrll
2279 1.1 skrll
2280 1.1.1.5 christos static void
2281 1.1 skrll xg_replace_opname (char **popname, const char *newop)
2282 1.1 skrll {
2283 1.1 skrll free (*popname);
2284 1.1 skrll *popname = xstrdup (newop);
2285 1.1 skrll }
2286 1.1 skrll
2287 1.1 skrll
2288 1.1 skrll static int
2289 1.1 skrll xg_check_num_args (int *pnum_args,
2290 1.1 skrll int expected_num,
2291 1.1 skrll char *opname,
2292 1.1 skrll char **arg_strings)
2293 1.1 skrll {
2294 1.1 skrll int num_args = *pnum_args;
2295 1.1 skrll
2296 1.1 skrll if (num_args < expected_num)
2297 1.1 skrll {
2298 1.1 skrll as_bad (_("not enough operands (%d) for '%s'; expected %d"),
2299 1.1 skrll num_args, opname, expected_num);
2300 1.1 skrll return -1;
2301 1.1 skrll }
2302 1.1 skrll
2303 1.1 skrll if (num_args > expected_num)
2304 1.1 skrll {
2305 1.1 skrll as_warn (_("too many operands (%d) for '%s'; expected %d"),
2306 1.1 skrll num_args, opname, expected_num);
2307 1.1 skrll while (num_args-- > expected_num)
2308 1.1 skrll {
2309 1.1 skrll free (arg_strings[num_args]);
2310 1.1 skrll arg_strings[num_args] = 0;
2311 1.1 skrll }
2312 1.1 skrll *pnum_args = expected_num;
2313 1.1 skrll return -1;
2314 1.1 skrll }
2315 1.1 skrll
2316 1.1 skrll return 0;
2317 1.1 skrll }
2318 1.1 skrll
2319 1.1 skrll
2320 1.1 skrll /* If the register is not specified as part of the opcode,
2321 1.1 skrll then get it from the operand and move it to the opcode. */
2322 1.1 skrll
2323 1.1 skrll static int
2324 1.1 skrll xg_translate_sysreg_op (char **popname, int *pnum_args, char **arg_strings)
2325 1.1 skrll {
2326 1.1 skrll xtensa_isa isa = xtensa_default_isa;
2327 1.1 skrll xtensa_sysreg sr;
2328 1.1 skrll char *opname, *new_opname;
2329 1.1 skrll const char *sr_name;
2330 1.1 skrll int is_user, is_write;
2331 1.1 skrll
2332 1.1 skrll opname = *popname;
2333 1.1 skrll if (*opname == '_')
2334 1.1 skrll opname += 1;
2335 1.1 skrll is_user = (opname[1] == 'u');
2336 1.1 skrll is_write = (opname[0] == 'w');
2337 1.1 skrll
2338 1.1 skrll /* Opname == [rw]ur or [rwx]sr... */
2339 1.1 skrll
2340 1.1 skrll if (xg_check_num_args (pnum_args, 2, opname, arg_strings))
2341 1.1 skrll return -1;
2342 1.1 skrll
2343 1.1 skrll /* Check if the argument is a symbolic register name. */
2344 1.1 skrll sr = xtensa_sysreg_lookup_name (isa, arg_strings[1]);
2345 1.1 skrll /* Handle WSR to "INTSET" as a special case. */
2346 1.1 skrll if (sr == XTENSA_UNDEFINED && is_write && !is_user
2347 1.1 skrll && !strcasecmp (arg_strings[1], "intset"))
2348 1.1 skrll sr = xtensa_sysreg_lookup_name (isa, "interrupt");
2349 1.1 skrll if (sr == XTENSA_UNDEFINED
2350 1.1 skrll || (xtensa_sysreg_is_user (isa, sr) == 1) != is_user)
2351 1.1 skrll {
2352 1.1 skrll /* Maybe it's a register number.... */
2353 1.1 skrll offsetT val;
2354 1.1 skrll if (!xg_arg_is_constant (arg_strings[1], &val))
2355 1.1 skrll {
2356 1.1 skrll as_bad (_("invalid register '%s' for '%s' instruction"),
2357 1.1 skrll arg_strings[1], opname);
2358 1.1 skrll return -1;
2359 1.1 skrll }
2360 1.1 skrll sr = xtensa_sysreg_lookup (isa, val, is_user);
2361 1.1 skrll if (sr == XTENSA_UNDEFINED)
2362 1.1 skrll {
2363 1.1 skrll as_bad (_("invalid register number (%ld) for '%s' instruction"),
2364 1.1 skrll (long) val, opname);
2365 1.1 skrll return -1;
2366 1.1 skrll }
2367 1.1 skrll }
2368 1.1 skrll
2369 1.1 skrll /* Remove the last argument, which is now part of the opcode. */
2370 1.1 skrll free (arg_strings[1]);
2371 1.1 skrll arg_strings[1] = 0;
2372 1.1 skrll *pnum_args = 1;
2373 1.1 skrll
2374 1.1 skrll /* Translate the opcode. */
2375 1.1.1.5 christos sr_name = xtensa_sysreg_name (isa, sr);
2376 1.1 skrll /* Another special case for "WSR.INTSET".... */
2377 1.1 skrll if (is_write && !is_user && !strcasecmp ("interrupt", sr_name))
2378 1.1 skrll sr_name = "intset";
2379 1.1 skrll new_opname = concat (*popname, ".", sr_name, (char *) NULL);
2380 1.1 skrll free (*popname);
2381 1.1 skrll *popname = new_opname;
2382 1.1 skrll
2383 1.1 skrll return 0;
2384 1.1 skrll }
2385 1.1 skrll
2386 1.1 skrll
2387 1.1 skrll static int
2388 1.1 skrll xtensa_translate_old_userreg_ops (char **popname)
2389 1.1 skrll {
2390 1.1 skrll xtensa_isa isa = xtensa_default_isa;
2391 1.1 skrll xtensa_sysreg sr;
2392 1.1 skrll char *opname, *new_opname;
2393 1.1 skrll const char *sr_name;
2394 1.1 skrll bfd_boolean has_underbar = FALSE;
2395 1.1 skrll
2396 1.1 skrll opname = *popname;
2397 1.1 skrll if (opname[0] == '_')
2398 1.1 skrll {
2399 1.1 skrll has_underbar = TRUE;
2400 1.1 skrll opname += 1;
2401 1.1 skrll }
2402 1.1 skrll
2403 1.1 skrll sr = xtensa_sysreg_lookup_name (isa, opname + 1);
2404 1.1 skrll if (sr != XTENSA_UNDEFINED)
2405 1.1 skrll {
2406 1.1 skrll /* The new default name ("nnn") is different from the old default
2407 1.1 skrll name ("URnnn"). The old default is handled below, and we don't
2408 1.1 skrll want to recognize [RW]nnn, so do nothing if the name is the (new)
2409 1.1 skrll default. */
2410 1.1 skrll static char namebuf[10];
2411 1.1 skrll sprintf (namebuf, "%d", xtensa_sysreg_number (isa, sr));
2412 1.1 skrll if (strcmp (namebuf, opname + 1) == 0)
2413 1.1 skrll return 0;
2414 1.1 skrll }
2415 1.1 skrll else
2416 1.1 skrll {
2417 1.1 skrll offsetT val;
2418 1.1 skrll char *end;
2419 1.1 skrll
2420 1.1 skrll /* Only continue if the reg name is "URnnn". */
2421 1.1 skrll if (opname[1] != 'u' || opname[2] != 'r')
2422 1.1 skrll return 0;
2423 1.1 skrll val = strtoul (opname + 3, &end, 10);
2424 1.1 skrll if (*end != '\0')
2425 1.1 skrll return 0;
2426 1.1 skrll
2427 1.1 skrll sr = xtensa_sysreg_lookup (isa, val, 1);
2428 1.1 skrll if (sr == XTENSA_UNDEFINED)
2429 1.1 skrll {
2430 1.1 skrll as_bad (_("invalid register number (%ld) for '%s'"),
2431 1.1 skrll (long) val, opname);
2432 1.1 skrll return -1;
2433 1.1 skrll }
2434 1.1.1.5 christos }
2435 1.1 skrll
2436 1.1 skrll /* Translate the opcode. */
2437 1.1 skrll sr_name = xtensa_sysreg_name (isa, sr);
2438 1.1 skrll new_opname = XNEWVEC (char, strlen (sr_name) + 6);
2439 1.1 skrll sprintf (new_opname, "%s%cur.%s", (has_underbar ? "_" : ""),
2440 1.1 skrll opname[0], sr_name);
2441 1.1 skrll free (*popname);
2442 1.1 skrll *popname = new_opname;
2443 1.1 skrll
2444 1.1 skrll return 0;
2445 1.1.1.5 christos }
2446 1.1.1.5 christos
2447 1.1 skrll
2448 1.1 skrll static int
2449 1.1 skrll xtensa_translate_zero_immed (const char *old_op,
2450 1.1 skrll const char *new_op,
2451 1.1 skrll char **popname,
2452 1.1 skrll int *pnum_args,
2453 1.1 skrll char **arg_strings)
2454 1.1 skrll {
2455 1.1.1.2 christos char *opname;
2456 1.1 skrll offsetT val;
2457 1.1 skrll
2458 1.1 skrll opname = *popname;
2459 1.1 skrll gas_assert (opname[0] != '_');
2460 1.1 skrll
2461 1.1 skrll if (strcmp (opname, old_op) != 0)
2462 1.1 skrll return 0;
2463 1.1 skrll
2464 1.1 skrll if (xg_check_num_args (pnum_args, 3, opname, arg_strings))
2465 1.1 skrll return -1;
2466 1.1 skrll if (xg_arg_is_constant (arg_strings[1], &val) && val == 0)
2467 1.1 skrll {
2468 1.1 skrll xg_replace_opname (popname, new_op);
2469 1.1 skrll free (arg_strings[1]);
2470 1.1 skrll arg_strings[1] = arg_strings[2];
2471 1.1 skrll arg_strings[2] = 0;
2472 1.1 skrll *pnum_args = 2;
2473 1.1 skrll }
2474 1.1 skrll
2475 1.1 skrll return 0;
2476 1.1 skrll }
2477 1.1 skrll
2478 1.1 skrll
2479 1.1 skrll /* If the instruction is an idiom (i.e., a built-in macro), translate it.
2480 1.1 skrll Returns non-zero if an error was found. */
2481 1.1 skrll
2482 1.1 skrll static int
2483 1.1 skrll xg_translate_idioms (char **popname, int *pnum_args, char **arg_strings)
2484 1.1 skrll {
2485 1.1 skrll char *opname = *popname;
2486 1.1 skrll bfd_boolean has_underbar = FALSE;
2487 1.1 skrll
2488 1.1 skrll if (*opname == '_')
2489 1.1 skrll {
2490 1.1 skrll has_underbar = TRUE;
2491 1.1 skrll opname += 1;
2492 1.1 skrll }
2493 1.1 skrll
2494 1.1 skrll if (strcmp (opname, "mov") == 0)
2495 1.1 skrll {
2496 1.1 skrll if (use_transform () && !has_underbar && density_supported)
2497 1.1 skrll xg_replace_opname (popname, "mov.n");
2498 1.1 skrll else
2499 1.1.1.5 christos {
2500 1.1 skrll if (xg_check_num_args (pnum_args, 2, opname, arg_strings))
2501 1.1 skrll return -1;
2502 1.1 skrll xg_replace_opname (popname, (has_underbar ? "_or" : "or"));
2503 1.1 skrll arg_strings[2] = xstrdup (arg_strings[1]);
2504 1.1 skrll *pnum_args = 3;
2505 1.1 skrll }
2506 1.1 skrll return 0;
2507 1.1 skrll }
2508 1.1 skrll
2509 1.1 skrll if (strcmp (opname, "bbsi.l") == 0)
2510 1.1 skrll {
2511 1.1 skrll if (xg_check_num_args (pnum_args, 3, opname, arg_strings))
2512 1.1 skrll return -1;
2513 1.1 skrll xg_replace_opname (popname, (has_underbar ? "_bbsi" : "bbsi"));
2514 1.1 skrll if (target_big_endian)
2515 1.1 skrll xg_reverse_shift_count (&arg_strings[1]);
2516 1.1 skrll return 0;
2517 1.1 skrll }
2518 1.1 skrll
2519 1.1 skrll if (strcmp (opname, "bbci.l") == 0)
2520 1.1 skrll {
2521 1.1 skrll if (xg_check_num_args (pnum_args, 3, opname, arg_strings))
2522 1.1 skrll return -1;
2523 1.1 skrll xg_replace_opname (popname, (has_underbar ? "_bbci" : "bbci"));
2524 1.1 skrll if (target_big_endian)
2525 1.1 skrll xg_reverse_shift_count (&arg_strings[1]);
2526 1.1.1.4 christos return 0;
2527 1.1 skrll }
2528 1.1 skrll
2529 1.1 skrll /* Don't do anything special with NOPs inside FLIX instructions. They
2530 1.1 skrll are handled elsewhere. Real NOP instructions are always available
2531 1.1 skrll in configurations with FLIX, so this should never be an issue but
2532 1.1 skrll check for it anyway. */
2533 1.1 skrll if (!cur_vinsn.inside_bundle && xtensa_nop_opcode == XTENSA_UNDEFINED
2534 1.1 skrll && strcmp (opname, "nop") == 0)
2535 1.1 skrll {
2536 1.1 skrll if (use_transform () && !has_underbar && density_supported)
2537 1.1 skrll xg_replace_opname (popname, "nop.n");
2538 1.1 skrll else
2539 1.1.1.5 christos {
2540 1.1.1.5 christos if (xg_check_num_args (pnum_args, 0, opname, arg_strings))
2541 1.1.1.5 christos return -1;
2542 1.1 skrll xg_replace_opname (popname, (has_underbar ? "_or" : "or"));
2543 1.1 skrll arg_strings[0] = xstrdup ("a1");
2544 1.1 skrll arg_strings[1] = xstrdup ("a1");
2545 1.1 skrll arg_strings[2] = xstrdup ("a1");
2546 1.1 skrll *pnum_args = 3;
2547 1.1 skrll }
2548 1.1 skrll return 0;
2549 1.1 skrll }
2550 1.1 skrll
2551 1.1 skrll /* Recognize [RW]UR and [RWX]SR. */
2552 1.1 skrll if ((((opname[0] == 'r' || opname[0] == 'w')
2553 1.1 skrll && (opname[1] == 'u' || opname[1] == 's'))
2554 1.1 skrll || (opname[0] == 'x' && opname[1] == 's'))
2555 1.1 skrll && opname[2] == 'r'
2556 1.1 skrll && opname[3] == '\0')
2557 1.1 skrll return xg_translate_sysreg_op (popname, pnum_args, arg_strings);
2558 1.1 skrll
2559 1.1 skrll /* Backward compatibility for RUR and WUR: Recognize [RW]UR<nnn> and
2560 1.1 skrll [RW]<name> if <name> is the non-default name of a user register. */
2561 1.1 skrll if ((opname[0] == 'r' || opname[0] == 'w')
2562 1.1 skrll && xtensa_opcode_lookup (xtensa_default_isa, opname) == XTENSA_UNDEFINED)
2563 1.1 skrll return xtensa_translate_old_userreg_ops (popname);
2564 1.1 skrll
2565 1.1 skrll /* Relax branches that don't allow comparisons against an immediate value
2566 1.1 skrll of zero to the corresponding branches with implicit zero immediates. */
2567 1.1 skrll if (!has_underbar && use_transform ())
2568 1.1 skrll {
2569 1.1 skrll if (xtensa_translate_zero_immed ("bnei", "bnez", popname,
2570 1.1 skrll pnum_args, arg_strings))
2571 1.1 skrll return -1;
2572 1.1 skrll
2573 1.1 skrll if (xtensa_translate_zero_immed ("beqi", "beqz", popname,
2574 1.1 skrll pnum_args, arg_strings))
2575 1.1 skrll return -1;
2576 1.1 skrll
2577 1.1 skrll if (xtensa_translate_zero_immed ("bgei", "bgez", popname,
2578 1.1 skrll pnum_args, arg_strings))
2579 1.1 skrll return -1;
2580 1.1 skrll
2581 1.1 skrll if (xtensa_translate_zero_immed ("blti", "bltz", popname,
2582 1.1 skrll pnum_args, arg_strings))
2583 1.1 skrll return -1;
2584 1.1 skrll }
2585 1.1 skrll
2586 1.1 skrll return 0;
2587 1.1 skrll }
2588 1.1 skrll
2589 1.1 skrll
2590 1.1 skrll /* Functions for dealing with the Xtensa ISA. */
2592 1.1 skrll
2593 1.1 skrll /* Currently the assembler only allows us to use a single target per
2594 1.1 skrll fragment. Because of this, only one operand for a given
2595 1.1 skrll instruction may be symbolic. If there is a PC-relative operand,
2596 1.1 skrll the last one is chosen. Otherwise, the result is the number of the
2597 1.1 skrll last immediate operand, and if there are none of those, we fail and
2598 1.1 skrll return -1. */
2599 1.1 skrll
2600 1.1 skrll static int
2601 1.1 skrll get_relaxable_immed (xtensa_opcode opcode)
2602 1.1 skrll {
2603 1.1 skrll int last_immed = -1;
2604 1.1 skrll int noperands, opi;
2605 1.1 skrll
2606 1.1 skrll if (opcode == XTENSA_UNDEFINED)
2607 1.1 skrll return -1;
2608 1.1 skrll
2609 1.1 skrll noperands = xtensa_opcode_num_operands (xtensa_default_isa, opcode);
2610 1.1 skrll for (opi = noperands - 1; opi >= 0; opi--)
2611 1.1 skrll {
2612 1.1 skrll if (xtensa_operand_is_visible (xtensa_default_isa, opcode, opi) == 0)
2613 1.1 skrll continue;
2614 1.1 skrll if (xtensa_operand_is_PCrelative (xtensa_default_isa, opcode, opi) == 1)
2615 1.1 skrll return opi;
2616 1.1 skrll if (last_immed == -1
2617 1.1 skrll && xtensa_operand_is_register (xtensa_default_isa, opcode, opi) == 0)
2618 1.1 skrll last_immed = opi;
2619 1.1 skrll }
2620 1.1 skrll return last_immed;
2621 1.1 skrll }
2622 1.1 skrll
2623 1.1 skrll
2624 1.1 skrll static xtensa_opcode
2625 1.1 skrll get_opcode_from_buf (const char *buf, int slot)
2626 1.1 skrll {
2627 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
2628 1.1 skrll static xtensa_insnbuf slotbuf = NULL;
2629 1.1 skrll xtensa_isa isa = xtensa_default_isa;
2630 1.1 skrll xtensa_format fmt;
2631 1.1 skrll
2632 1.1 skrll if (!insnbuf)
2633 1.1 skrll {
2634 1.1 skrll insnbuf = xtensa_insnbuf_alloc (isa);
2635 1.1 skrll slotbuf = xtensa_insnbuf_alloc (isa);
2636 1.1 skrll }
2637 1.1 skrll
2638 1.1 skrll xtensa_insnbuf_from_chars (isa, insnbuf, (const unsigned char *) buf, 0);
2639 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
2640 1.1 skrll if (fmt == XTENSA_UNDEFINED)
2641 1.1 skrll return XTENSA_UNDEFINED;
2642 1.1 skrll
2643 1.1 skrll if (slot >= xtensa_format_num_slots (isa, fmt))
2644 1.1 skrll return XTENSA_UNDEFINED;
2645 1.1 skrll
2646 1.1 skrll xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
2647 1.1 skrll return xtensa_opcode_decode (isa, fmt, slot, slotbuf);
2648 1.1 skrll }
2649 1.1 skrll
2650 1.1 skrll
2651 1.1 skrll #ifdef TENSILICA_DEBUG
2652 1.1 skrll
2653 1.1 skrll /* For debugging, print out the mapping of opcode numbers to opcodes. */
2654 1.1 skrll
2655 1.1 skrll static void
2656 1.1 skrll xtensa_print_insn_table (void)
2657 1.1 skrll {
2658 1.1 skrll int num_opcodes, num_operands;
2659 1.1 skrll xtensa_opcode opcode;
2660 1.1 skrll xtensa_isa isa = xtensa_default_isa;
2661 1.1 skrll
2662 1.1 skrll num_opcodes = xtensa_isa_num_opcodes (xtensa_default_isa);
2663 1.1 skrll for (opcode = 0; opcode < num_opcodes; opcode++)
2664 1.1 skrll {
2665 1.1 skrll int opn;
2666 1.1 skrll fprintf (stderr, "%d: %s: ", opcode, xtensa_opcode_name (isa, opcode));
2667 1.1 skrll num_operands = xtensa_opcode_num_operands (isa, opcode);
2668 1.1 skrll for (opn = 0; opn < num_operands; opn++)
2669 1.1 skrll {
2670 1.1 skrll if (xtensa_operand_is_visible (isa, opcode, opn) == 0)
2671 1.1 skrll continue;
2672 1.1 skrll if (xtensa_operand_is_register (isa, opcode, opn) == 1)
2673 1.1 skrll {
2674 1.1 skrll xtensa_regfile opnd_rf =
2675 1.1 skrll xtensa_operand_regfile (isa, opcode, opn);
2676 1.1 skrll fprintf (stderr, "%s ", xtensa_regfile_shortname (isa, opnd_rf));
2677 1.1 skrll }
2678 1.1 skrll else if (xtensa_operand_is_PCrelative (isa, opcode, opn) == 1)
2679 1.1 skrll fputs ("[lLr] ", stderr);
2680 1.1 skrll else
2681 1.1 skrll fputs ("i ", stderr);
2682 1.1 skrll }
2683 1.1 skrll fprintf (stderr, "\n");
2684 1.1 skrll }
2685 1.1 skrll }
2686 1.1 skrll
2687 1.1 skrll
2688 1.1 skrll static void
2689 1.1 skrll print_vliw_insn (xtensa_insnbuf vbuf)
2690 1.1 skrll {
2691 1.1 skrll xtensa_isa isa = xtensa_default_isa;
2692 1.1 skrll xtensa_format f = xtensa_format_decode (isa, vbuf);
2693 1.1 skrll xtensa_insnbuf sbuf = xtensa_insnbuf_alloc (isa);
2694 1.1 skrll int op;
2695 1.1 skrll
2696 1.1 skrll fprintf (stderr, "format = %d\n", f);
2697 1.1 skrll
2698 1.1 skrll for (op = 0; op < xtensa_format_num_slots (isa, f); op++)
2699 1.1 skrll {
2700 1.1 skrll xtensa_opcode opcode;
2701 1.1 skrll const char *opname;
2702 1.1 skrll int operands;
2703 1.1 skrll
2704 1.1 skrll xtensa_format_get_slot (isa, f, op, vbuf, sbuf);
2705 1.1 skrll opcode = xtensa_opcode_decode (isa, f, op, sbuf);
2706 1.1 skrll opname = xtensa_opcode_name (isa, opcode);
2707 1.1 skrll
2708 1.1 skrll fprintf (stderr, "op in slot %i is %s;\n", op, opname);
2709 1.1 skrll fprintf (stderr, " operands = ");
2710 1.1 skrll for (operands = 0;
2711 1.1 skrll operands < xtensa_opcode_num_operands (isa, opcode);
2712 1.1 skrll operands++)
2713 1.1 skrll {
2714 1.1 skrll unsigned int val;
2715 1.1 skrll if (xtensa_operand_is_visible (isa, opcode, operands) == 0)
2716 1.1 skrll continue;
2717 1.1 skrll xtensa_operand_get_field (isa, opcode, operands, f, op, sbuf, &val);
2718 1.1 skrll xtensa_operand_decode (isa, opcode, operands, &val);
2719 1.1 skrll fprintf (stderr, "%d ", val);
2720 1.1 skrll }
2721 1.1 skrll fprintf (stderr, "\n");
2722 1.1 skrll }
2723 1.1 skrll xtensa_insnbuf_free (isa, sbuf);
2724 1.1 skrll }
2725 1.1 skrll
2726 1.1 skrll #endif /* TENSILICA_DEBUG */
2727 1.1 skrll
2728 1.1 skrll
2729 1.1 skrll static bfd_boolean
2730 1.1 skrll is_direct_call_opcode (xtensa_opcode opcode)
2731 1.1 skrll {
2732 1.1 skrll xtensa_isa isa = xtensa_default_isa;
2733 1.1 skrll int n, num_operands;
2734 1.1 skrll
2735 1.1 skrll if (xtensa_opcode_is_call (isa, opcode) != 1)
2736 1.1 skrll return FALSE;
2737 1.1 skrll
2738 1.1 skrll num_operands = xtensa_opcode_num_operands (isa, opcode);
2739 1.1 skrll for (n = 0; n < num_operands; n++)
2740 1.1 skrll {
2741 1.1 skrll if (xtensa_operand_is_register (isa, opcode, n) == 0
2742 1.1 skrll && xtensa_operand_is_PCrelative (isa, opcode, n) == 1)
2743 1.1 skrll return TRUE;
2744 1.1 skrll }
2745 1.1 skrll return FALSE;
2746 1.1 skrll }
2747 1.1 skrll
2748 1.1 skrll
2749 1.1 skrll /* Convert from BFD relocation type code to slot and operand number.
2750 1.1 skrll Returns non-zero on failure. */
2751 1.1 skrll
2752 1.1 skrll static int
2753 1.1 skrll decode_reloc (bfd_reloc_code_real_type reloc, int *slot, bfd_boolean *is_alt)
2754 1.1 skrll {
2755 1.1 skrll if (reloc >= BFD_RELOC_XTENSA_SLOT0_OP
2756 1.1 skrll && reloc <= BFD_RELOC_XTENSA_SLOT14_OP)
2757 1.1 skrll {
2758 1.1 skrll *slot = reloc - BFD_RELOC_XTENSA_SLOT0_OP;
2759 1.1 skrll *is_alt = FALSE;
2760 1.1 skrll }
2761 1.1 skrll else if (reloc >= BFD_RELOC_XTENSA_SLOT0_ALT
2762 1.1 skrll && reloc <= BFD_RELOC_XTENSA_SLOT14_ALT)
2763 1.1 skrll {
2764 1.1 skrll *slot = reloc - BFD_RELOC_XTENSA_SLOT0_ALT;
2765 1.1 skrll *is_alt = TRUE;
2766 1.1 skrll }
2767 1.1 skrll else
2768 1.1 skrll return -1;
2769 1.1 skrll
2770 1.1 skrll return 0;
2771 1.1 skrll }
2772 1.1 skrll
2773 1.1 skrll
2774 1.1 skrll /* Convert from slot number to BFD relocation type code for the
2775 1.1 skrll standard PC-relative relocations. Return BFD_RELOC_NONE on
2776 1.1 skrll failure. */
2777 1.1 skrll
2778 1.1 skrll static bfd_reloc_code_real_type
2779 1.1 skrll encode_reloc (int slot)
2780 1.1 skrll {
2781 1.1 skrll if (slot < 0 || slot > 14)
2782 1.1 skrll return BFD_RELOC_NONE;
2783 1.1 skrll
2784 1.1 skrll return BFD_RELOC_XTENSA_SLOT0_OP + slot;
2785 1.1 skrll }
2786 1.1 skrll
2787 1.1 skrll
2788 1.1 skrll /* Convert from slot numbers to BFD relocation type code for the
2789 1.1 skrll "alternate" relocations. Return BFD_RELOC_NONE on failure. */
2790 1.1 skrll
2791 1.1 skrll static bfd_reloc_code_real_type
2792 1.1 skrll encode_alt_reloc (int slot)
2793 1.1 skrll {
2794 1.1 skrll if (slot < 0 || slot > 14)
2795 1.1 skrll return BFD_RELOC_NONE;
2796 1.1 skrll
2797 1.1 skrll return BFD_RELOC_XTENSA_SLOT0_ALT + slot;
2798 1.1 skrll }
2799 1.1 skrll
2800 1.1 skrll
2801 1.1 skrll static void
2802 1.1 skrll xtensa_insnbuf_set_operand (xtensa_insnbuf slotbuf,
2803 1.1 skrll xtensa_format fmt,
2804 1.1 skrll int slot,
2805 1.1 skrll xtensa_opcode opcode,
2806 1.1 skrll int operand,
2807 1.1 skrll uint32 value,
2808 1.1 skrll const char *file,
2809 1.1 skrll unsigned int line)
2810 1.1 skrll {
2811 1.1 skrll uint32 valbuf = value;
2812 1.1 skrll
2813 1.1.1.4 christos if (xtensa_operand_encode (xtensa_default_isa, opcode, operand, &valbuf))
2814 1.1 skrll {
2815 1.1 skrll if (xtensa_operand_is_PCrelative (xtensa_default_isa, opcode, operand)
2816 1.1 skrll == 1)
2817 1.1 skrll as_bad_where ((char *) file, line,
2818 1.1 skrll _("operand %d of '%s' has out of range value '%u'"),
2819 1.1 skrll operand + 1,
2820 1.1 skrll xtensa_opcode_name (xtensa_default_isa, opcode),
2821 1.1 skrll value);
2822 1.1 skrll else
2823 1.1 skrll as_bad_where ((char *) file, line,
2824 1.1 skrll _("operand %d of '%s' has invalid value '%u'"),
2825 1.1 skrll operand + 1,
2826 1.1 skrll xtensa_opcode_name (xtensa_default_isa, opcode),
2827 1.1 skrll value);
2828 1.1 skrll return;
2829 1.1 skrll }
2830 1.1 skrll
2831 1.1 skrll xtensa_operand_set_field (xtensa_default_isa, opcode, operand, fmt, slot,
2832 1.1 skrll slotbuf, valbuf);
2833 1.1 skrll }
2834 1.1 skrll
2835 1.1 skrll
2836 1.1 skrll static uint32
2837 1.1 skrll xtensa_insnbuf_get_operand (xtensa_insnbuf slotbuf,
2838 1.1 skrll xtensa_format fmt,
2839 1.1 skrll int slot,
2840 1.1 skrll xtensa_opcode opcode,
2841 1.1 skrll int opnum)
2842 1.1 skrll {
2843 1.1 skrll uint32 val = 0;
2844 1.1 skrll (void) xtensa_operand_get_field (xtensa_default_isa, opcode, opnum,
2845 1.1 skrll fmt, slot, slotbuf, &val);
2846 1.1 skrll (void) xtensa_operand_decode (xtensa_default_isa, opcode, opnum, &val);
2847 1.1 skrll return val;
2848 1.1 skrll }
2849 1.1 skrll
2850 1.1.1.2 christos
2851 1.1 skrll /* Checks for rules from xtensa-relax tables. */
2853 1.1.1.2 christos
2854 1.1 skrll /* The routine xg_instruction_matches_option_term must return TRUE
2855 1.1 skrll when a given option term is true. The meaning of all of the option
2856 1.1 skrll terms is given interpretation by this function. */
2857 1.1 skrll
2858 1.1 skrll static bfd_boolean
2859 1.1 skrll xg_instruction_matches_option_term (TInsn *insn, const ReqOrOption *option)
2860 1.1 skrll {
2861 1.1 skrll if (strcmp (option->option_name, "realnop") == 0
2862 1.1.1.2 christos || strncmp (option->option_name, "IsaUse", 6) == 0)
2863 1.1.1.2 christos {
2864 1.1 skrll /* These conditions were evaluated statically when building the
2865 1.1 skrll relaxation table. There's no need to reevaluate them now. */
2866 1.1 skrll return TRUE;
2867 1.1 skrll }
2868 1.1 skrll else if (strcmp (option->option_name, "FREEREG") == 0)
2869 1.1 skrll return insn->extra_arg.X_op == O_register;
2870 1.1 skrll else
2871 1.1 skrll {
2872 1.1 skrll as_fatal (_("internal error: unknown option name '%s'"),
2873 1.1 skrll option->option_name);
2874 1.1 skrll }
2875 1.1 skrll }
2876 1.1 skrll
2877 1.1 skrll
2878 1.1 skrll static bfd_boolean
2879 1.1 skrll xg_instruction_matches_or_options (TInsn *insn,
2880 1.1 skrll const ReqOrOptionList *or_option)
2881 1.1 skrll {
2882 1.1 skrll const ReqOrOption *option;
2883 1.1 skrll /* Must match each of the AND terms. */
2884 1.1 skrll for (option = or_option; option != NULL; option = option->next)
2885 1.1 skrll {
2886 1.1 skrll if (xg_instruction_matches_option_term (insn, option))
2887 1.1 skrll return TRUE;
2888 1.1 skrll }
2889 1.1 skrll return FALSE;
2890 1.1 skrll }
2891 1.1 skrll
2892 1.1 skrll
2893 1.1 skrll static bfd_boolean
2894 1.1 skrll xg_instruction_matches_options (TInsn *insn, const ReqOptionList *options)
2895 1.1 skrll {
2896 1.1 skrll const ReqOption *req_options;
2897 1.1 skrll /* Must match each of the AND terms. */
2898 1.1 skrll for (req_options = options;
2899 1.1 skrll req_options != NULL;
2900 1.1 skrll req_options = req_options->next)
2901 1.1 skrll {
2902 1.1 skrll /* Must match one of the OR clauses. */
2903 1.1 skrll if (!xg_instruction_matches_or_options (insn,
2904 1.1 skrll req_options->or_option_terms))
2905 1.1 skrll return FALSE;
2906 1.1 skrll }
2907 1.1 skrll return TRUE;
2908 1.1 skrll }
2909 1.1 skrll
2910 1.1 skrll
2911 1.1 skrll /* Return the transition rule that matches or NULL if none matches. */
2912 1.1 skrll
2913 1.1 skrll static bfd_boolean
2914 1.1 skrll xg_instruction_matches_rule (TInsn *insn, TransitionRule *rule)
2915 1.1 skrll {
2916 1.1 skrll PreconditionList *condition_l;
2917 1.1 skrll
2918 1.1 skrll if (rule->opcode != insn->opcode)
2919 1.1 skrll return FALSE;
2920 1.1 skrll
2921 1.1 skrll for (condition_l = rule->conditions;
2922 1.1 skrll condition_l != NULL;
2923 1.1 skrll condition_l = condition_l->next)
2924 1.1 skrll {
2925 1.1 skrll expressionS *exp1;
2926 1.1 skrll expressionS *exp2;
2927 1.1.1.2 christos Precondition *cond = condition_l->precond;
2928 1.1 skrll
2929 1.1 skrll switch (cond->typ)
2930 1.1 skrll {
2931 1.1 skrll case OP_CONSTANT:
2932 1.1 skrll /* The expression must be the constant. */
2933 1.1 skrll gas_assert (cond->op_num < insn->ntok);
2934 1.1 skrll exp1 = &insn->tok[cond->op_num];
2935 1.1 skrll if (expr_is_const (exp1))
2936 1.1 skrll {
2937 1.1 skrll switch (cond->cmp)
2938 1.1 skrll {
2939 1.1 skrll case OP_EQUAL:
2940 1.1 skrll if (get_expr_const (exp1) != cond->op_data)
2941 1.1 skrll return FALSE;
2942 1.1 skrll break;
2943 1.1 skrll case OP_NOTEQUAL:
2944 1.1 skrll if (get_expr_const (exp1) == cond->op_data)
2945 1.1 skrll return FALSE;
2946 1.1 skrll break;
2947 1.1 skrll default:
2948 1.1 skrll return FALSE;
2949 1.1 skrll }
2950 1.1 skrll }
2951 1.1 skrll else if (expr_is_register (exp1))
2952 1.1 skrll {
2953 1.1 skrll switch (cond->cmp)
2954 1.1 skrll {
2955 1.1 skrll case OP_EQUAL:
2956 1.1 skrll if (get_expr_register (exp1) != cond->op_data)
2957 1.1 skrll return FALSE;
2958 1.1 skrll break;
2959 1.1 skrll case OP_NOTEQUAL:
2960 1.1 skrll if (get_expr_register (exp1) == cond->op_data)
2961 1.1 skrll return FALSE;
2962 1.1 skrll break;
2963 1.1 skrll default:
2964 1.1 skrll return FALSE;
2965 1.1 skrll }
2966 1.1.1.2 christos }
2967 1.1.1.2 christos else
2968 1.1 skrll return FALSE;
2969 1.1 skrll break;
2970 1.1 skrll
2971 1.1 skrll case OP_OPERAND:
2972 1.1 skrll gas_assert (cond->op_num < insn->ntok);
2973 1.1 skrll gas_assert (cond->op_data < insn->ntok);
2974 1.1 skrll exp1 = &insn->tok[cond->op_num];
2975 1.1 skrll exp2 = &insn->tok[cond->op_data];
2976 1.1 skrll
2977 1.1 skrll switch (cond->cmp)
2978 1.1 skrll {
2979 1.1 skrll case OP_EQUAL:
2980 1.1 skrll if (!expr_is_equal (exp1, exp2))
2981 1.1 skrll return FALSE;
2982 1.1 skrll break;
2983 1.1 skrll case OP_NOTEQUAL:
2984 1.1 skrll if (expr_is_equal (exp1, exp2))
2985 1.1 skrll return FALSE;
2986 1.1 skrll break;
2987 1.1 skrll }
2988 1.1 skrll break;
2989 1.1 skrll
2990 1.1 skrll case OP_LITERAL:
2991 1.1 skrll case OP_LABEL:
2992 1.1 skrll default:
2993 1.1 skrll return FALSE;
2994 1.1 skrll }
2995 1.1 skrll }
2996 1.1 skrll if (!xg_instruction_matches_options (insn, rule->options))
2997 1.1 skrll return FALSE;
2998 1.1 skrll
2999 1.1 skrll return TRUE;
3000 1.1 skrll }
3001 1.1 skrll
3002 1.1 skrll
3003 1.1 skrll static int
3004 1.1 skrll transition_rule_cmp (const TransitionRule *a, const TransitionRule *b)
3005 1.1 skrll {
3006 1.1 skrll bfd_boolean a_greater = FALSE;
3007 1.1 skrll bfd_boolean b_greater = FALSE;
3008 1.1 skrll
3009 1.1 skrll ReqOptionList *l_a = a->options;
3010 1.1 skrll ReqOptionList *l_b = b->options;
3011 1.1 skrll
3012 1.1 skrll /* We only care if they both are the same except for
3013 1.1 skrll a const16 vs. an l32r. */
3014 1.1 skrll
3015 1.1 skrll while (l_a && l_b && ((l_a->next == NULL) == (l_b->next == NULL)))
3016 1.1 skrll {
3017 1.1 skrll ReqOrOptionList *l_or_a = l_a->or_option_terms;
3018 1.1 skrll ReqOrOptionList *l_or_b = l_b->or_option_terms;
3019 1.1 skrll while (l_or_a && l_or_b && ((l_a->next == NULL) == (l_b->next == NULL)))
3020 1.1 skrll {
3021 1.1 skrll if (l_or_a->is_true != l_or_b->is_true)
3022 1.1 skrll return 0;
3023 1.1 skrll if (strcmp (l_or_a->option_name, l_or_b->option_name) != 0)
3024 1.1 skrll {
3025 1.1 skrll /* This is the case we care about. */
3026 1.1 skrll if (strcmp (l_or_a->option_name, "IsaUseConst16") == 0
3027 1.1 skrll && strcmp (l_or_b->option_name, "IsaUseL32R") == 0)
3028 1.1 skrll {
3029 1.1 skrll if (prefer_const16)
3030 1.1 skrll a_greater = TRUE;
3031 1.1 skrll else
3032 1.1 skrll b_greater = TRUE;
3033 1.1 skrll }
3034 1.1 skrll else if (strcmp (l_or_a->option_name, "IsaUseL32R") == 0
3035 1.1 skrll && strcmp (l_or_b->option_name, "IsaUseConst16") == 0)
3036 1.1 skrll {
3037 1.1 skrll if (prefer_const16)
3038 1.1 skrll b_greater = TRUE;
3039 1.1 skrll else
3040 1.1 skrll a_greater = TRUE;
3041 1.1 skrll }
3042 1.1 skrll else
3043 1.1 skrll return 0;
3044 1.1 skrll }
3045 1.1 skrll l_or_a = l_or_a->next;
3046 1.1 skrll l_or_b = l_or_b->next;
3047 1.1 skrll }
3048 1.1 skrll if (l_or_a || l_or_b)
3049 1.1 skrll return 0;
3050 1.1 skrll
3051 1.1 skrll l_a = l_a->next;
3052 1.1 skrll l_b = l_b->next;
3053 1.1 skrll }
3054 1.1 skrll if (l_a || l_b)
3055 1.1 skrll return 0;
3056 1.1 skrll
3057 1.1 skrll /* Incomparable if the substitution was used differently in two cases. */
3058 1.1 skrll if (a_greater && b_greater)
3059 1.1 skrll return 0;
3060 1.1 skrll
3061 1.1 skrll if (b_greater)
3062 1.1 skrll return 1;
3063 1.1 skrll if (a_greater)
3064 1.1 skrll return -1;
3065 1.1 skrll
3066 1.1 skrll return 0;
3067 1.1 skrll }
3068 1.1 skrll
3069 1.1.1.2 christos
3070 1.1 skrll static TransitionRule *
3071 1.1 skrll xg_instruction_match (TInsn *insn)
3072 1.1 skrll {
3073 1.1 skrll TransitionTable *table = xg_build_simplify_table (&transition_rule_cmp);
3074 1.1 skrll TransitionList *l;
3075 1.1 skrll gas_assert (insn->opcode < table->num_opcodes);
3076 1.1 skrll
3077 1.1 skrll /* Walk through all of the possible transitions. */
3078 1.1 skrll for (l = table->table[insn->opcode]; l != NULL; l = l->next)
3079 1.1 skrll {
3080 1.1 skrll TransitionRule *rule = l->rule;
3081 1.1 skrll if (xg_instruction_matches_rule (insn, rule))
3082 1.1 skrll return rule;
3083 1.1 skrll }
3084 1.1 skrll return NULL;
3085 1.1 skrll }
3086 1.1 skrll
3087 1.1 skrll
3088 1.1 skrll /* Various Other Internal Functions. */
3090 1.1 skrll
3091 1.1 skrll static bfd_boolean
3092 1.1 skrll is_unique_insn_expansion (TransitionRule *r)
3093 1.1 skrll {
3094 1.1 skrll if (!r->to_instr || r->to_instr->next != NULL)
3095 1.1 skrll return FALSE;
3096 1.1 skrll if (r->to_instr->typ != INSTR_INSTR)
3097 1.1 skrll return FALSE;
3098 1.1 skrll return TRUE;
3099 1.1 skrll }
3100 1.1 skrll
3101 1.1 skrll
3102 1.1 skrll /* Check if there is exactly one relaxation for INSN that converts it to
3103 1.1 skrll another instruction of equal or larger size. If so, and if TARG is
3104 1.1 skrll non-null, go ahead and generate the relaxed instruction into TARG. If
3105 1.1 skrll NARROW_ONLY is true, then only consider relaxations that widen a narrow
3106 1.1 skrll instruction, i.e., ignore relaxations that convert to an instruction of
3107 1.1 skrll equal size. In some contexts where this function is used, only
3108 1.1 skrll a single widening is allowed and the NARROW_ONLY argument is used to
3109 1.1 skrll exclude cases like ADDI being "widened" to an ADDMI, which may
3110 1.1 skrll later be relaxed to an ADDMI/ADDI pair. */
3111 1.1 skrll
3112 1.1.1.2 christos bfd_boolean
3113 1.1.1.2 christos xg_is_single_relaxable_insn (TInsn *insn, TInsn *targ, bfd_boolean narrow_only)
3114 1.1 skrll {
3115 1.1 skrll TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3116 1.1 skrll TransitionList *l;
3117 1.1 skrll TransitionRule *match = 0;
3118 1.1 skrll
3119 1.1 skrll gas_assert (insn->insn_type == ITYPE_INSN);
3120 1.1 skrll gas_assert (insn->opcode < table->num_opcodes);
3121 1.1 skrll
3122 1.1 skrll for (l = table->table[insn->opcode]; l != NULL; l = l->next)
3123 1.1 skrll {
3124 1.1 skrll TransitionRule *rule = l->rule;
3125 1.1 skrll
3126 1.1 skrll if (xg_instruction_matches_rule (insn, rule)
3127 1.1 skrll && is_unique_insn_expansion (rule)
3128 1.1 skrll && (xg_get_single_size (insn->opcode) + (narrow_only ? 1 : 0)
3129 1.1 skrll <= xg_get_single_size (rule->to_instr->opcode)))
3130 1.1 skrll {
3131 1.1 skrll if (match)
3132 1.1 skrll return FALSE;
3133 1.1 skrll match = rule;
3134 1.1 skrll }
3135 1.1 skrll }
3136 1.1 skrll if (!match)
3137 1.1 skrll return FALSE;
3138 1.1 skrll
3139 1.1 skrll if (targ)
3140 1.1 skrll xg_build_to_insn (targ, insn, match->to_instr);
3141 1.1 skrll return TRUE;
3142 1.1 skrll }
3143 1.1 skrll
3144 1.1 skrll
3145 1.1 skrll /* Return the maximum number of bytes this opcode can expand to. */
3146 1.1 skrll
3147 1.1.1.2 christos static int
3148 1.1 skrll xg_get_max_insn_widen_size (xtensa_opcode opcode)
3149 1.1 skrll {
3150 1.1 skrll TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3151 1.1 skrll TransitionList *l;
3152 1.1 skrll int max_size = xg_get_single_size (opcode);
3153 1.1 skrll
3154 1.1 skrll gas_assert (opcode < table->num_opcodes);
3155 1.1 skrll
3156 1.1 skrll for (l = table->table[opcode]; l != NULL; l = l->next)
3157 1.1 skrll {
3158 1.1 skrll TransitionRule *rule = l->rule;
3159 1.1 skrll BuildInstr *build_list;
3160 1.1.1.2 christos int this_size = 0;
3161 1.1 skrll
3162 1.1 skrll if (!rule)
3163 1.1 skrll continue;
3164 1.1 skrll build_list = rule->to_instr;
3165 1.1 skrll if (is_unique_insn_expansion (rule))
3166 1.1 skrll {
3167 1.1 skrll gas_assert (build_list->typ == INSTR_INSTR);
3168 1.1 skrll this_size = xg_get_max_insn_widen_size (build_list->opcode);
3169 1.1 skrll }
3170 1.1 skrll else
3171 1.1 skrll for (; build_list != NULL; build_list = build_list->next)
3172 1.1 skrll {
3173 1.1 skrll switch (build_list->typ)
3174 1.1 skrll {
3175 1.1 skrll case INSTR_INSTR:
3176 1.1 skrll this_size += xg_get_single_size (build_list->opcode);
3177 1.1 skrll break;
3178 1.1 skrll case INSTR_LITERAL_DEF:
3179 1.1 skrll case INSTR_LABEL_DEF:
3180 1.1 skrll default:
3181 1.1 skrll break;
3182 1.1 skrll }
3183 1.1 skrll }
3184 1.1 skrll if (this_size > max_size)
3185 1.1 skrll max_size = this_size;
3186 1.1 skrll }
3187 1.1 skrll return max_size;
3188 1.1 skrll }
3189 1.1 skrll
3190 1.1 skrll
3191 1.1 skrll /* Return the maximum number of literal bytes this opcode can generate. */
3192 1.1 skrll
3193 1.1.1.2 christos static int
3194 1.1 skrll xg_get_max_insn_widen_literal_size (xtensa_opcode opcode)
3195 1.1 skrll {
3196 1.1 skrll TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3197 1.1 skrll TransitionList *l;
3198 1.1 skrll int max_size = 0;
3199 1.1 skrll
3200 1.1 skrll gas_assert (opcode < table->num_opcodes);
3201 1.1 skrll
3202 1.1 skrll for (l = table->table[opcode]; l != NULL; l = l->next)
3203 1.1 skrll {
3204 1.1 skrll TransitionRule *rule = l->rule;
3205 1.1 skrll BuildInstr *build_list;
3206 1.1.1.2 christos int this_size = 0;
3207 1.1 skrll
3208 1.1 skrll if (!rule)
3209 1.1 skrll continue;
3210 1.1 skrll build_list = rule->to_instr;
3211 1.1 skrll if (is_unique_insn_expansion (rule))
3212 1.1 skrll {
3213 1.1 skrll gas_assert (build_list->typ == INSTR_INSTR);
3214 1.1 skrll this_size = xg_get_max_insn_widen_literal_size (build_list->opcode);
3215 1.1 skrll }
3216 1.1 skrll else
3217 1.1 skrll for (; build_list != NULL; build_list = build_list->next)
3218 1.1 skrll {
3219 1.1 skrll switch (build_list->typ)
3220 1.1 skrll {
3221 1.1 skrll case INSTR_LITERAL_DEF:
3222 1.1 skrll /* Hard-coded 4-byte literal. */
3223 1.1 skrll this_size += 4;
3224 1.1 skrll break;
3225 1.1 skrll case INSTR_INSTR:
3226 1.1 skrll case INSTR_LABEL_DEF:
3227 1.1 skrll default:
3228 1.1 skrll break;
3229 1.1 skrll }
3230 1.1 skrll }
3231 1.1 skrll if (this_size > max_size)
3232 1.1 skrll max_size = this_size;
3233 1.1 skrll }
3234 1.1 skrll return max_size;
3235 1.1 skrll }
3236 1.1 skrll
3237 1.1 skrll
3238 1.1.1.2 christos static bfd_boolean
3239 1.1.1.2 christos xg_is_relaxable_insn (TInsn *insn, int lateral_steps)
3240 1.1 skrll {
3241 1.1 skrll int steps_taken = 0;
3242 1.1 skrll TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3243 1.1 skrll TransitionList *l;
3244 1.1 skrll
3245 1.1 skrll gas_assert (insn->insn_type == ITYPE_INSN);
3246 1.1 skrll gas_assert (insn->opcode < table->num_opcodes);
3247 1.1 skrll
3248 1.1 skrll for (l = table->table[insn->opcode]; l != NULL; l = l->next)
3249 1.1 skrll {
3250 1.1 skrll TransitionRule *rule = l->rule;
3251 1.1 skrll
3252 1.1 skrll if (xg_instruction_matches_rule (insn, rule))
3253 1.1 skrll {
3254 1.1 skrll if (steps_taken == lateral_steps)
3255 1.1 skrll return TRUE;
3256 1.1 skrll steps_taken++;
3257 1.1 skrll }
3258 1.1 skrll }
3259 1.1 skrll return FALSE;
3260 1.1 skrll }
3261 1.1 skrll
3262 1.1 skrll
3263 1.1 skrll static symbolS *
3264 1.1 skrll get_special_literal_symbol (void)
3265 1.1 skrll {
3266 1.1 skrll static symbolS *sym = NULL;
3267 1.1 skrll
3268 1.1 skrll if (sym == NULL)
3269 1.1 skrll sym = symbol_find_or_make ("SPECIAL_LITERAL0\001");
3270 1.1 skrll return sym;
3271 1.1 skrll }
3272 1.1 skrll
3273 1.1 skrll
3274 1.1 skrll static symbolS *
3275 1.1 skrll get_special_label_symbol (void)
3276 1.1 skrll {
3277 1.1 skrll static symbolS *sym = NULL;
3278 1.1 skrll
3279 1.1 skrll if (sym == NULL)
3280 1.1 skrll sym = symbol_find_or_make ("SPECIAL_LABEL0\001");
3281 1.1 skrll return sym;
3282 1.1 skrll }
3283 1.1 skrll
3284 1.1 skrll
3285 1.1 skrll static bfd_boolean
3286 1.1 skrll xg_valid_literal_expression (const expressionS *exp)
3287 1.1 skrll {
3288 1.1 skrll switch (exp->X_op)
3289 1.1 skrll {
3290 1.1 skrll case O_constant:
3291 1.1 skrll case O_symbol:
3292 1.1 skrll case O_big:
3293 1.1 skrll case O_uminus:
3294 1.1 skrll case O_subtract:
3295 1.1 skrll case O_pltrel:
3296 1.1 skrll case O_pcrel:
3297 1.1 skrll case O_tlsfunc:
3298 1.1 skrll case O_tlsarg:
3299 1.1 skrll case O_tpoff:
3300 1.1 skrll case O_dtpoff:
3301 1.1 skrll return TRUE;
3302 1.1 skrll default:
3303 1.1 skrll return FALSE;
3304 1.1 skrll }
3305 1.1 skrll }
3306 1.1 skrll
3307 1.1 skrll
3308 1.1 skrll /* This will check to see if the value can be converted into the
3309 1.1 skrll operand type. It will return TRUE if it does not fit. */
3310 1.1 skrll
3311 1.1 skrll static bfd_boolean
3312 1.1 skrll xg_check_operand (int32 value, xtensa_opcode opcode, int operand)
3313 1.1 skrll {
3314 1.1 skrll uint32 valbuf = value;
3315 1.1 skrll if (xtensa_operand_encode (xtensa_default_isa, opcode, operand, &valbuf))
3316 1.1 skrll return TRUE;
3317 1.1 skrll return FALSE;
3318 1.1 skrll }
3319 1.1 skrll
3320 1.1 skrll
3321 1.1 skrll /* Assumes: All immeds are constants. Check that all constants fit
3322 1.1 skrll into their immeds; return FALSE if not. */
3323 1.1 skrll
3324 1.1.1.2 christos static bfd_boolean
3325 1.1 skrll xg_immeds_fit (const TInsn *insn)
3326 1.1 skrll {
3327 1.1.1.2 christos xtensa_isa isa = xtensa_default_isa;
3328 1.1.1.2 christos int i;
3329 1.1 skrll
3330 1.1 skrll int n = insn->ntok;
3331 1.1 skrll gas_assert (insn->insn_type == ITYPE_INSN);
3332 1.1.1.2 christos for (i = 0; i < n; ++i)
3333 1.1 skrll {
3334 1.1 skrll const expressionS *exp = &insn->tok[i];
3335 1.1 skrll
3336 1.1.1.2 christos if (xtensa_operand_is_register (isa, insn->opcode, i) == 1)
3337 1.1 skrll continue;
3338 1.1 skrll
3339 1.1 skrll switch (exp->X_op)
3340 1.1 skrll {
3341 1.1 skrll case O_register:
3342 1.1.1.2 christos case O_constant:
3343 1.1 skrll if (xg_check_operand (exp->X_add_number, insn->opcode, i))
3344 1.1 skrll return FALSE;
3345 1.1 skrll break;
3346 1.1 skrll
3347 1.1 skrll default:
3348 1.1 skrll /* The symbol should have a fixup associated with it. */
3349 1.1 skrll gas_assert (FALSE);
3350 1.1 skrll break;
3351 1.1 skrll }
3352 1.1 skrll }
3353 1.1 skrll return TRUE;
3354 1.1 skrll }
3355 1.1 skrll
3356 1.1 skrll
3357 1.1 skrll /* This should only be called after we have an initial
3358 1.1 skrll estimate of the addresses. */
3359 1.1 skrll
3360 1.1 skrll static bfd_boolean
3361 1.1 skrll xg_symbolic_immeds_fit (const TInsn *insn,
3362 1.1 skrll segT pc_seg,
3363 1.1 skrll fragS *pc_frag,
3364 1.1 skrll offsetT pc_offset,
3365 1.1 skrll long stretch)
3366 1.1 skrll {
3367 1.1 skrll xtensa_isa isa = xtensa_default_isa;
3368 1.1.1.2 christos symbolS *symbolP;
3369 1.1 skrll fragS *sym_frag;
3370 1.1 skrll offsetT target, pc;
3371 1.1 skrll uint32 new_offset;
3372 1.1.1.2 christos int i;
3373 1.1.1.2 christos int n = insn->ntok;
3374 1.1 skrll
3375 1.1 skrll gas_assert (insn->insn_type == ITYPE_INSN);
3376 1.1 skrll
3377 1.1.1.2 christos for (i = 0; i < n; ++i)
3378 1.1 skrll {
3379 1.1 skrll const expressionS *exp = &insn->tok[i];
3380 1.1 skrll
3381 1.1.1.2 christos if (xtensa_operand_is_register (isa, insn->opcode, i) == 1)
3382 1.1 skrll continue;
3383 1.1 skrll
3384 1.1 skrll switch (exp->X_op)
3385 1.1 skrll {
3386 1.1 skrll case O_register:
3387 1.1 skrll case O_constant:
3388 1.1 skrll if (xg_check_operand (exp->X_add_number, insn->opcode, i))
3389 1.1 skrll return FALSE;
3390 1.1 skrll break;
3391 1.1 skrll
3392 1.1 skrll case O_lo16:
3393 1.1 skrll case O_hi16:
3394 1.1 skrll /* Check for the worst case. */
3395 1.1 skrll if (xg_check_operand (0xffff, insn->opcode, i))
3396 1.1 skrll return FALSE;
3397 1.1 skrll break;
3398 1.1 skrll
3399 1.1 skrll case O_symbol:
3400 1.1 skrll /* We only allow symbols for PC-relative references.
3401 1.1.1.2 christos If pc_frag == 0, then we don't have frag locations yet. */
3402 1.1.1.2 christos if (pc_frag == 0
3403 1.1 skrll || xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 0)
3404 1.1 skrll return FALSE;
3405 1.1 skrll
3406 1.1 skrll /* If it is a weak symbol or a symbol in a different section,
3407 1.1 skrll it cannot be known to fit at assembly time. */
3408 1.1 skrll if (S_IS_WEAK (exp->X_add_symbol)
3409 1.1 skrll || S_GET_SEGMENT (exp->X_add_symbol) != pc_seg)
3410 1.1 skrll {
3411 1.1 skrll /* For a direct call with --no-longcalls, be optimistic and
3412 1.1.1.2 christos assume it will be in range. If the symbol is weak and
3413 1.1.1.2 christos undefined, it may remain undefined at link-time, in which
3414 1.1 skrll case it will have a zero value and almost certainly be out
3415 1.1 skrll of range for a direct call; thus, relax for undefined weak
3416 1.1 skrll symbols even if longcalls is not enabled. */
3417 1.1 skrll if (is_direct_call_opcode (insn->opcode)
3418 1.1 skrll && ! pc_frag->tc_frag_data.use_longcalls
3419 1.1.1.2 christos && (! S_IS_WEAK (exp->X_add_symbol)
3420 1.1 skrll || S_IS_DEFINED (exp->X_add_symbol)))
3421 1.1.1.2 christos return TRUE;
3422 1.1 skrll
3423 1.1 skrll return FALSE;
3424 1.1 skrll }
3425 1.1 skrll
3426 1.1 skrll symbolP = exp->X_add_symbol;
3427 1.1 skrll sym_frag = symbol_get_frag (symbolP);
3428 1.1 skrll target = S_GET_VALUE (symbolP) + exp->X_add_number;
3429 1.1 skrll pc = pc_frag->fr_address + pc_offset;
3430 1.1 skrll
3431 1.1 skrll /* If frag has yet to be reached on this pass, assume it
3432 1.1 skrll will move by STRETCH just as we did. If this is not so,
3433 1.1 skrll it will be because some frag between grows, and that will
3434 1.1 skrll force another pass. Beware zero-length frags. There
3435 1.1 skrll should be a faster way to do this. */
3436 1.1 skrll
3437 1.1 skrll if (stretch != 0
3438 1.1 skrll && sym_frag->relax_marker != pc_frag->relax_marker
3439 1.1 skrll && S_GET_SEGMENT (symbolP) == pc_seg)
3440 1.1 skrll {
3441 1.1 skrll target += stretch;
3442 1.1 skrll }
3443 1.1 skrll
3444 1.1 skrll new_offset = target;
3445 1.1 skrll xtensa_operand_do_reloc (isa, insn->opcode, i, &new_offset, pc);
3446 1.1 skrll if (xg_check_operand (new_offset, insn->opcode, i))
3447 1.1 skrll return FALSE;
3448 1.1 skrll break;
3449 1.1 skrll
3450 1.1 skrll default:
3451 1.1 skrll /* The symbol should have a fixup associated with it. */
3452 1.1 skrll return FALSE;
3453 1.1 skrll }
3454 1.1 skrll }
3455 1.1 skrll
3456 1.1 skrll return TRUE;
3457 1.1 skrll }
3458 1.1 skrll
3459 1.1 skrll
3460 1.1 skrll /* Return TRUE on success. */
3461 1.1 skrll
3462 1.1 skrll static bfd_boolean
3463 1.1 skrll xg_build_to_insn (TInsn *targ, TInsn *insn, BuildInstr *bi)
3464 1.1 skrll {
3465 1.1 skrll BuildOp *op;
3466 1.1 skrll symbolS *sym;
3467 1.1 skrll
3468 1.1 skrll tinsn_init (targ);
3469 1.1 skrll targ->debug_line = insn->debug_line;
3470 1.1 skrll targ->loc_directive_seen = insn->loc_directive_seen;
3471 1.1 skrll switch (bi->typ)
3472 1.1 skrll {
3473 1.1 skrll case INSTR_INSTR:
3474 1.1 skrll op = bi->ops;
3475 1.1 skrll targ->opcode = bi->opcode;
3476 1.1 skrll targ->insn_type = ITYPE_INSN;
3477 1.1.1.2 christos targ->is_specific_opcode = FALSE;
3478 1.1 skrll
3479 1.1 skrll for (; op != NULL; op = op->next)
3480 1.1 skrll {
3481 1.1 skrll int op_num = op->op_num;
3482 1.1 skrll int op_data = op->op_data;
3483 1.1 skrll
3484 1.1 skrll gas_assert (op->op_num < MAX_INSN_ARGS);
3485 1.1 skrll
3486 1.1 skrll if (targ->ntok <= op_num)
3487 1.1 skrll targ->ntok = op_num + 1;
3488 1.1.1.2 christos
3489 1.1 skrll switch (op->typ)
3490 1.1 skrll {
3491 1.1.1.2 christos case OP_CONSTANT:
3492 1.1.1.2 christos set_expr_const (&targ->tok[op_num], op_data);
3493 1.1.1.2 christos break;
3494 1.1.1.2 christos case OP_OPERAND:
3495 1.1.1.2 christos gas_assert (op_data < insn->ntok);
3496 1.1 skrll copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3497 1.1 skrll break;
3498 1.1 skrll case OP_FREEREG:
3499 1.1 skrll if (insn->extra_arg.X_op != O_register)
3500 1.1 skrll return FALSE;
3501 1.1.1.2 christos copy_expr (&targ->tok[op_num], &insn->extra_arg);
3502 1.1 skrll break;
3503 1.1 skrll case OP_LITERAL:
3504 1.1 skrll sym = get_special_literal_symbol ();
3505 1.1 skrll set_expr_symbol_offset (&targ->tok[op_num], sym, 0);
3506 1.1 skrll if (insn->tok[op_data].X_op == O_tlsfunc
3507 1.1 skrll || insn->tok[op_data].X_op == O_tlsarg)
3508 1.1 skrll copy_expr (&targ->extra_arg, &insn->tok[op_data]);
3509 1.1.1.2 christos break;
3510 1.1 skrll case OP_LABEL:
3511 1.1 skrll sym = get_special_label_symbol ();
3512 1.1 skrll set_expr_symbol_offset (&targ->tok[op_num], sym, 0);
3513 1.1 skrll break;
3514 1.1 skrll case OP_OPERAND_HI16U:
3515 1.1 skrll case OP_OPERAND_LOW16U:
3516 1.1 skrll gas_assert (op_data < insn->ntok);
3517 1.1 skrll if (expr_is_const (&insn->tok[op_data]))
3518 1.1 skrll {
3519 1.1 skrll long val;
3520 1.1 skrll copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3521 1.1 skrll val = xg_apply_userdef_op_fn (op->typ,
3522 1.1 skrll targ->tok[op_num].
3523 1.1 skrll X_add_number);
3524 1.1 skrll targ->tok[op_num].X_add_number = val;
3525 1.1.1.2 christos }
3526 1.1 skrll else
3527 1.1 skrll {
3528 1.1 skrll /* For const16 we can create relocations for these. */
3529 1.1 skrll if (targ->opcode == XTENSA_UNDEFINED
3530 1.1 skrll || (targ->opcode != xtensa_const16_opcode))
3531 1.1 skrll return FALSE;
3532 1.1 skrll gas_assert (op_data < insn->ntok);
3533 1.1 skrll /* Need to build a O_lo16 or O_hi16. */
3534 1.1 skrll copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3535 1.1 skrll if (targ->tok[op_num].X_op == O_symbol)
3536 1.1 skrll {
3537 1.1 skrll if (op->typ == OP_OPERAND_HI16U)
3538 1.1 skrll targ->tok[op_num].X_op = O_hi16;
3539 1.1 skrll else if (op->typ == OP_OPERAND_LOW16U)
3540 1.1 skrll targ->tok[op_num].X_op = O_lo16;
3541 1.1 skrll else
3542 1.1 skrll return FALSE;
3543 1.1 skrll }
3544 1.1 skrll }
3545 1.1 skrll break;
3546 1.1.1.2 christos default:
3547 1.1 skrll /* currently handles:
3548 1.1 skrll OP_OPERAND_LOW8
3549 1.1 skrll OP_OPERAND_HI24S
3550 1.1 skrll OP_OPERAND_F32MINUS */
3551 1.1 skrll if (xg_has_userdef_op_fn (op->typ))
3552 1.1 skrll {
3553 1.1 skrll gas_assert (op_data < insn->ntok);
3554 1.1 skrll if (expr_is_const (&insn->tok[op_data]))
3555 1.1 skrll {
3556 1.1 skrll long val;
3557 1.1 skrll copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3558 1.1 skrll val = xg_apply_userdef_op_fn (op->typ,
3559 1.1 skrll targ->tok[op_num].
3560 1.1.1.2 christos X_add_number);
3561 1.1 skrll targ->tok[op_num].X_add_number = val;
3562 1.1 skrll }
3563 1.1 skrll else
3564 1.1 skrll return FALSE; /* We cannot use a relocation for this. */
3565 1.1 skrll break;
3566 1.1 skrll }
3567 1.1 skrll gas_assert (0);
3568 1.1 skrll break;
3569 1.1 skrll }
3570 1.1 skrll }
3571 1.1 skrll break;
3572 1.1 skrll
3573 1.1 skrll case INSTR_LITERAL_DEF:
3574 1.1 skrll op = bi->ops;
3575 1.1.1.2 christos targ->opcode = XTENSA_UNDEFINED;
3576 1.1 skrll targ->insn_type = ITYPE_LITERAL;
3577 1.1 skrll targ->is_specific_opcode = FALSE;
3578 1.1 skrll for (; op != NULL; op = op->next)
3579 1.1 skrll {
3580 1.1 skrll int op_num = op->op_num;
3581 1.1 skrll int op_data = op->op_data;
3582 1.1 skrll gas_assert (op->op_num < MAX_INSN_ARGS);
3583 1.1.1.2 christos
3584 1.1 skrll if (targ->ntok <= op_num)
3585 1.1 skrll targ->ntok = op_num + 1;
3586 1.1 skrll
3587 1.1 skrll switch (op->typ)
3588 1.1 skrll {
3589 1.1 skrll case OP_OPERAND:
3590 1.1 skrll gas_assert (op_data < insn->ntok);
3591 1.1 skrll /* We can only pass resolvable literals through. */
3592 1.1 skrll if (!xg_valid_literal_expression (&insn->tok[op_data]))
3593 1.1.1.2 christos return FALSE;
3594 1.1 skrll copy_expr (&targ->tok[op_num], &insn->tok[op_data]);
3595 1.1 skrll break;
3596 1.1 skrll case OP_LITERAL:
3597 1.1 skrll case OP_CONSTANT:
3598 1.1 skrll case OP_LABEL:
3599 1.1 skrll default:
3600 1.1 skrll gas_assert (0);
3601 1.1 skrll break;
3602 1.1 skrll }
3603 1.1 skrll }
3604 1.1 skrll break;
3605 1.1.1.2 christos
3606 1.1 skrll case INSTR_LABEL_DEF:
3607 1.1 skrll op = bi->ops;
3608 1.1 skrll targ->opcode = XTENSA_UNDEFINED;
3609 1.1.1.2 christos targ->insn_type = ITYPE_LABEL;
3610 1.1 skrll targ->is_specific_opcode = FALSE;
3611 1.1 skrll /* Literal with no ops is a label? */
3612 1.1 skrll gas_assert (op == NULL);
3613 1.1 skrll break;
3614 1.1 skrll
3615 1.1 skrll default:
3616 1.1 skrll gas_assert (0);
3617 1.1 skrll }
3618 1.1 skrll
3619 1.1 skrll return TRUE;
3620 1.1 skrll }
3621 1.1 skrll
3622 1.1 skrll
3623 1.1 skrll /* Return TRUE on success. */
3624 1.1 skrll
3625 1.1 skrll static bfd_boolean
3626 1.1 skrll xg_build_to_stack (IStack *istack, TInsn *insn, BuildInstr *bi)
3627 1.1 skrll {
3628 1.1 skrll for (; bi != NULL; bi = bi->next)
3629 1.1 skrll {
3630 1.1 skrll TInsn *next_insn = istack_push_space (istack);
3631 1.1 skrll
3632 1.1 skrll if (!xg_build_to_insn (next_insn, insn, bi))
3633 1.1 skrll return FALSE;
3634 1.1 skrll }
3635 1.1 skrll return TRUE;
3636 1.1 skrll }
3637 1.1 skrll
3638 1.1 skrll
3639 1.1 skrll /* Return TRUE on valid expansion. */
3640 1.1 skrll
3641 1.1 skrll static bfd_boolean
3642 1.1.1.2 christos xg_expand_to_stack (IStack *istack, TInsn *insn, int lateral_steps)
3643 1.1.1.2 christos {
3644 1.1 skrll int stack_size = istack->ninsn;
3645 1.1 skrll int steps_taken = 0;
3646 1.1 skrll TransitionTable *table = xg_build_widen_table (&transition_rule_cmp);
3647 1.1 skrll TransitionList *l;
3648 1.1 skrll
3649 1.1 skrll gas_assert (insn->insn_type == ITYPE_INSN);
3650 1.1 skrll gas_assert (insn->opcode < table->num_opcodes);
3651 1.1 skrll
3652 1.1 skrll for (l = table->table[insn->opcode]; l != NULL; l = l->next)
3653 1.1 skrll {
3654 1.1 skrll TransitionRule *rule = l->rule;
3655 1.1 skrll
3656 1.1 skrll if (xg_instruction_matches_rule (insn, rule))
3657 1.1 skrll {
3658 1.1 skrll if (lateral_steps == steps_taken)
3659 1.1 skrll {
3660 1.1 skrll int i;
3661 1.1 skrll
3662 1.1.1.2 christos /* This is it. Expand the rule to the stack. */
3663 1.1 skrll if (!xg_build_to_stack (istack, insn, rule->to_instr))
3664 1.1.1.2 christos return FALSE;
3665 1.1.1.2 christos
3666 1.1.1.2 christos /* Check to see if it fits. */
3667 1.1 skrll for (i = stack_size; i < istack->ninsn; i++)
3668 1.1 skrll {
3669 1.1 skrll TInsn *tinsn = &istack->insn[i];
3670 1.1 skrll
3671 1.1 skrll if (tinsn->insn_type == ITYPE_INSN
3672 1.1 skrll && !tinsn_has_symbolic_operands (tinsn)
3673 1.1 skrll && !xg_immeds_fit (tinsn))
3674 1.1 skrll {
3675 1.1 skrll istack->ninsn = stack_size;
3676 1.1 skrll return FALSE;
3677 1.1 skrll }
3678 1.1 skrll }
3679 1.1 skrll return TRUE;
3680 1.1 skrll }
3681 1.1 skrll steps_taken++;
3682 1.1 skrll }
3683 1.1 skrll }
3684 1.1 skrll return FALSE;
3685 1.1 skrll }
3686 1.1 skrll
3687 1.1 skrll
3688 1.1 skrll /* Relax the assembly instruction at least "min_steps".
3690 1.1 skrll Return the number of steps taken.
3691 1.1 skrll
3692 1.1 skrll For relaxation to correctly terminate, every relaxation chain must
3693 1.1 skrll terminate in one of two ways:
3694 1.1 skrll
3695 1.1 skrll 1. If the chain from one instruction to the next consists entirely of
3696 1.1 skrll single instructions, then the chain *must* handle all possible
3697 1.1 skrll immediates without failing. It must not ever fail because an
3698 1.1 skrll immediate is out of range. The MOVI.N -> MOVI -> L32R relaxation
3699 1.1 skrll chain is one example. L32R loads 32 bits, and there cannot be an
3700 1.1 skrll immediate larger than 32 bits, so it satisfies this condition.
3701 1.1 skrll Single instruction relaxation chains are as defined by
3702 1.1 skrll xg_is_single_relaxable_instruction.
3703 1.1 skrll
3704 1.1 skrll 2. Otherwise, the chain must end in a multi-instruction expansion: e.g.,
3705 1.1 skrll BNEZ.N -> BNEZ -> BNEZ.W15 -> BENZ.N/J
3706 1.1 skrll
3707 1.1 skrll Strictly speaking, in most cases you can violate condition 1 and be OK
3708 1.1 skrll -- in particular when the last two instructions have the same single
3709 1.1 skrll size. But nevertheless, you should guarantee the above two conditions.
3710 1.1 skrll
3711 1.1 skrll We could fix this so that single-instruction expansions correctly
3712 1.1 skrll terminate when they can't handle the range, but the error messages are
3713 1.1 skrll worse, and it actually turns out that in every case but one (18-bit wide
3714 1.1 skrll branches), you need a multi-instruction expansion to get the full range
3715 1.1 skrll anyway. And because 18-bit branches are handled identically to 15-bit
3716 1.1 skrll branches, there isn't any point in changing it. */
3717 1.1 skrll
3718 1.1 skrll static int
3719 1.1 skrll xg_assembly_relax (IStack *istack,
3720 1.1 skrll TInsn *insn,
3721 1.1 skrll segT pc_seg,
3722 1.1 skrll fragS *pc_frag, /* if pc_frag == 0, not pc-relative */
3723 1.1 skrll offsetT pc_offset, /* offset in fragment */
3724 1.1 skrll int min_steps, /* minimum conversion steps */
3725 1.1 skrll long stretch) /* number of bytes stretched so far */
3726 1.1 skrll {
3727 1.1 skrll int steps_taken = 0;
3728 1.1 skrll
3729 1.1 skrll /* Some of its immeds don't fit. Try to build a relaxed version.
3730 1.1 skrll This may go through a couple of stages of single instruction
3731 1.1 skrll transformations before we get there. */
3732 1.1 skrll
3733 1.1 skrll TInsn single_target;
3734 1.1 skrll TInsn current_insn;
3735 1.1 skrll int lateral_steps = 0;
3736 1.1 skrll int istack_size = istack->ninsn;
3737 1.1 skrll
3738 1.1 skrll if (xg_symbolic_immeds_fit (insn, pc_seg, pc_frag, pc_offset, stretch)
3739 1.1 skrll && steps_taken >= min_steps)
3740 1.1 skrll {
3741 1.1 skrll istack_push (istack, insn);
3742 1.1 skrll return steps_taken;
3743 1.1 skrll }
3744 1.1 skrll current_insn = *insn;
3745 1.1 skrll
3746 1.1 skrll /* Walk through all of the single instruction expansions. */
3747 1.1 skrll while (xg_is_single_relaxable_insn (¤t_insn, &single_target, FALSE))
3748 1.1 skrll {
3749 1.1 skrll steps_taken++;
3750 1.1 skrll if (xg_symbolic_immeds_fit (&single_target, pc_seg, pc_frag, pc_offset,
3751 1.1 skrll stretch))
3752 1.1 skrll {
3753 1.1 skrll if (steps_taken >= min_steps)
3754 1.1 skrll {
3755 1.1 skrll istack_push (istack, &single_target);
3756 1.1 skrll return steps_taken;
3757 1.1 skrll }
3758 1.1 skrll }
3759 1.1 skrll current_insn = single_target;
3760 1.1 skrll }
3761 1.1 skrll
3762 1.1 skrll /* Now check for a multi-instruction expansion. */
3763 1.1 skrll while (xg_is_relaxable_insn (¤t_insn, lateral_steps))
3764 1.1 skrll {
3765 1.1 skrll if (xg_symbolic_immeds_fit (¤t_insn, pc_seg, pc_frag, pc_offset,
3766 1.1 skrll stretch))
3767 1.1 skrll {
3768 1.1 skrll if (steps_taken >= min_steps)
3769 1.1 skrll {
3770 1.1 skrll istack_push (istack, ¤t_insn);
3771 1.1 skrll return steps_taken;
3772 1.1 skrll }
3773 1.1 skrll }
3774 1.1 skrll steps_taken++;
3775 1.1 skrll if (xg_expand_to_stack (istack, ¤t_insn, lateral_steps))
3776 1.1 skrll {
3777 1.1 skrll if (steps_taken >= min_steps)
3778 1.1 skrll return steps_taken;
3779 1.1 skrll }
3780 1.1 skrll lateral_steps++;
3781 1.1 skrll istack->ninsn = istack_size;
3782 1.1 skrll }
3783 1.1 skrll
3784 1.1 skrll /* It's not going to work -- use the original. */
3785 1.1 skrll istack_push (istack, insn);
3786 1.1 skrll return steps_taken;
3787 1.1 skrll }
3788 1.1 skrll
3789 1.1 skrll
3790 1.1 skrll static void
3791 1.1 skrll xg_finish_frag (char *last_insn,
3792 1.1 skrll enum xtensa_relax_statesE frag_state,
3793 1.1 skrll enum xtensa_relax_statesE slot0_state,
3794 1.1 skrll int max_growth,
3795 1.1 skrll bfd_boolean is_insn)
3796 1.1 skrll {
3797 1.1 skrll /* Finish off this fragment so that it has at LEAST the desired
3798 1.1 skrll max_growth. If it doesn't fit in this fragment, close this one
3799 1.1 skrll and start a new one. In either case, return a pointer to the
3800 1.1 skrll beginning of the growth area. */
3801 1.1 skrll
3802 1.1 skrll fragS *old_frag;
3803 1.1 skrll
3804 1.1 skrll frag_grow (max_growth);
3805 1.1 skrll old_frag = frag_now;
3806 1.1 skrll
3807 1.1 skrll frag_now->fr_opcode = last_insn;
3808 1.1 skrll if (is_insn)
3809 1.1 skrll frag_now->tc_frag_data.is_insn = TRUE;
3810 1.1.1.2 christos
3811 1.1 skrll frag_var (rs_machine_dependent, max_growth, max_growth,
3812 1.1 skrll frag_state, frag_now->fr_symbol, frag_now->fr_offset, last_insn);
3813 1.1 skrll
3814 1.1 skrll old_frag->tc_frag_data.slot_subtypes[0] = slot0_state;
3815 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
3816 1.1 skrll
3817 1.1 skrll /* Just to make sure that we did not split it up. */
3818 1.1 skrll gas_assert (old_frag->fr_next == frag_now);
3819 1.1 skrll }
3820 1.1 skrll
3821 1.1 skrll
3822 1.1 skrll /* Return TRUE if the target frag is one of the next non-empty frags. */
3823 1.1 skrll
3824 1.1 skrll static bfd_boolean
3825 1.1 skrll is_next_frag_target (const fragS *fragP, const fragS *target)
3826 1.1 skrll {
3827 1.1 skrll if (fragP == NULL)
3828 1.1 skrll return FALSE;
3829 1.1 skrll
3830 1.1 skrll for (; fragP; fragP = fragP->fr_next)
3831 1.1 skrll {
3832 1.1 skrll if (fragP == target)
3833 1.1 skrll return TRUE;
3834 1.1 skrll if (fragP->fr_fix != 0)
3835 1.1 skrll return FALSE;
3836 1.1 skrll if (fragP->fr_type == rs_fill && fragP->fr_offset != 0)
3837 1.1 skrll return FALSE;
3838 1.1 skrll if ((fragP->fr_type == rs_align || fragP->fr_type == rs_align_code)
3839 1.1 skrll && ((fragP->fr_address % (1 << fragP->fr_offset)) != 0))
3840 1.1 skrll return FALSE;
3841 1.1 skrll if (fragP->fr_type == rs_space)
3842 1.1 skrll return FALSE;
3843 1.1 skrll }
3844 1.1 skrll return FALSE;
3845 1.1 skrll }
3846 1.1 skrll
3847 1.1 skrll
3848 1.1 skrll static bfd_boolean
3849 1.1 skrll is_branch_jmp_to_next (TInsn *insn, fragS *fragP)
3850 1.1 skrll {
3851 1.1 skrll xtensa_isa isa = xtensa_default_isa;
3852 1.1 skrll int i;
3853 1.1 skrll int num_ops = xtensa_opcode_num_operands (isa, insn->opcode);
3854 1.1 skrll int target_op = -1;
3855 1.1 skrll symbolS *sym;
3856 1.1 skrll fragS *target_frag;
3857 1.1 skrll
3858 1.1 skrll if (xtensa_opcode_is_branch (isa, insn->opcode) != 1
3859 1.1 skrll && xtensa_opcode_is_jump (isa, insn->opcode) != 1)
3860 1.1 skrll return FALSE;
3861 1.1 skrll
3862 1.1 skrll for (i = 0; i < num_ops; i++)
3863 1.1 skrll {
3864 1.1 skrll if (xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 1)
3865 1.1 skrll {
3866 1.1 skrll target_op = i;
3867 1.1 skrll break;
3868 1.1 skrll }
3869 1.1 skrll }
3870 1.1 skrll if (target_op == -1)
3871 1.1 skrll return FALSE;
3872 1.1 skrll
3873 1.1 skrll if (insn->ntok <= target_op)
3874 1.1 skrll return FALSE;
3875 1.1 skrll
3876 1.1 skrll if (insn->tok[target_op].X_op != O_symbol)
3877 1.1 skrll return FALSE;
3878 1.1 skrll
3879 1.1 skrll sym = insn->tok[target_op].X_add_symbol;
3880 1.1 skrll if (sym == NULL)
3881 1.1 skrll return FALSE;
3882 1.1 skrll
3883 1.1 skrll if (insn->tok[target_op].X_add_number != 0)
3884 1.1 skrll return FALSE;
3885 1.1 skrll
3886 1.1 skrll target_frag = symbol_get_frag (sym);
3887 1.1 skrll if (target_frag == NULL)
3888 1.1 skrll return FALSE;
3889 1.1 skrll
3890 1.1 skrll if (is_next_frag_target (fragP->fr_next, target_frag)
3891 1.1 skrll && S_GET_VALUE (sym) == target_frag->fr_address)
3892 1.1 skrll return TRUE;
3893 1.1 skrll
3894 1.1 skrll return FALSE;
3895 1.1 skrll }
3896 1.1 skrll
3897 1.1 skrll
3898 1.1 skrll static void
3899 1.1 skrll xg_add_branch_and_loop_targets (TInsn *insn)
3900 1.1 skrll {
3901 1.1 skrll xtensa_isa isa = xtensa_default_isa;
3902 1.1 skrll int num_ops = xtensa_opcode_num_operands (isa, insn->opcode);
3903 1.1 skrll
3904 1.1 skrll if (xtensa_opcode_is_loop (isa, insn->opcode) == 1)
3905 1.1 skrll {
3906 1.1 skrll int i = 1;
3907 1.1 skrll if (xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 1
3908 1.1 skrll && insn->tok[i].X_op == O_symbol)
3909 1.1 skrll symbol_get_tc (insn->tok[i].X_add_symbol)->is_loop_target = TRUE;
3910 1.1 skrll return;
3911 1.1 skrll }
3912 1.1 skrll
3913 1.1 skrll if (xtensa_opcode_is_branch (isa, insn->opcode) == 1
3914 1.1 skrll || xtensa_opcode_is_loop (isa, insn->opcode) == 1)
3915 1.1 skrll {
3916 1.1 skrll int i;
3917 1.1 skrll
3918 1.1 skrll for (i = 0; i < insn->ntok && i < num_ops; i++)
3919 1.1 skrll {
3920 1.1 skrll if (xtensa_operand_is_PCrelative (isa, insn->opcode, i) == 1
3921 1.1 skrll && insn->tok[i].X_op == O_symbol)
3922 1.1 skrll {
3923 1.1 skrll symbolS *sym = insn->tok[i].X_add_symbol;
3924 1.1 skrll symbol_get_tc (sym)->is_branch_target = TRUE;
3925 1.1 skrll if (S_IS_DEFINED (sym))
3926 1.1 skrll symbol_get_frag (sym)->tc_frag_data.is_branch_target = TRUE;
3927 1.1 skrll }
3928 1.1 skrll }
3929 1.1 skrll }
3930 1.1 skrll }
3931 1.1 skrll
3932 1.1 skrll
3933 1.1 skrll /* Return FALSE if no error. */
3934 1.1 skrll
3935 1.1 skrll static bfd_boolean
3936 1.1 skrll xg_build_token_insn (BuildInstr *instr_spec, TInsn *old_insn, TInsn *new_insn)
3937 1.1 skrll {
3938 1.1 skrll int num_ops = 0;
3939 1.1 skrll BuildOp *b_op;
3940 1.1 skrll
3941 1.1 skrll switch (instr_spec->typ)
3942 1.1 skrll {
3943 1.1 skrll case INSTR_INSTR:
3944 1.1 skrll new_insn->insn_type = ITYPE_INSN;
3945 1.1 skrll new_insn->opcode = instr_spec->opcode;
3946 1.1 skrll break;
3947 1.1 skrll case INSTR_LITERAL_DEF:
3948 1.1 skrll new_insn->insn_type = ITYPE_LITERAL;
3949 1.1 skrll new_insn->opcode = XTENSA_UNDEFINED;
3950 1.1 skrll break;
3951 1.1 skrll case INSTR_LABEL_DEF:
3952 1.1 skrll abort ();
3953 1.1 skrll }
3954 1.1 skrll new_insn->is_specific_opcode = FALSE;
3955 1.1 skrll new_insn->debug_line = old_insn->debug_line;
3956 1.1 skrll new_insn->loc_directive_seen = old_insn->loc_directive_seen;
3957 1.1 skrll
3958 1.1 skrll for (b_op = instr_spec->ops; b_op != NULL; b_op = b_op->next)
3959 1.1 skrll {
3960 1.1.1.2 christos expressionS *exp;
3961 1.1 skrll const expressionS *src_exp;
3962 1.1 skrll
3963 1.1 skrll num_ops++;
3964 1.1 skrll switch (b_op->typ)
3965 1.1 skrll {
3966 1.1.1.2 christos case OP_CONSTANT:
3967 1.1.1.2 christos /* The expression must be the constant. */
3968 1.1 skrll gas_assert (b_op->op_num < MAX_INSN_ARGS);
3969 1.1 skrll exp = &new_insn->tok[b_op->op_num];
3970 1.1 skrll set_expr_const (exp, b_op->op_data);
3971 1.1 skrll break;
3972 1.1 skrll
3973 1.1 skrll case OP_OPERAND:
3974 1.1 skrll gas_assert (b_op->op_num < MAX_INSN_ARGS);
3975 1.1 skrll gas_assert (b_op->op_data < (unsigned) old_insn->ntok);
3976 1.1.1.2 christos src_exp = &old_insn->tok[b_op->op_data];
3977 1.1 skrll exp = &new_insn->tok[b_op->op_num];
3978 1.1 skrll copy_expr (exp, src_exp);
3979 1.1 skrll break;
3980 1.1.1.2 christos
3981 1.1 skrll case OP_LITERAL:
3982 1.1 skrll case OP_LABEL:
3983 1.1 skrll as_bad (_("can't handle generation of literal/labels yet"));
3984 1.1 skrll gas_assert (0);
3985 1.1 skrll
3986 1.1 skrll default:
3987 1.1 skrll as_bad (_("can't handle undefined OP TYPE"));
3988 1.1 skrll gas_assert (0);
3989 1.1 skrll }
3990 1.1 skrll }
3991 1.1 skrll
3992 1.1 skrll new_insn->ntok = num_ops;
3993 1.1 skrll return FALSE;
3994 1.1 skrll }
3995 1.1 skrll
3996 1.1 skrll
3997 1.1 skrll /* Return TRUE if it was simplified. */
3998 1.1 skrll
3999 1.1 skrll static bfd_boolean
4000 1.1 skrll xg_simplify_insn (TInsn *old_insn, TInsn *new_insn)
4001 1.1 skrll {
4002 1.1 skrll TransitionRule *rule;
4003 1.1 skrll BuildInstr *insn_spec;
4004 1.1 skrll
4005 1.1 skrll if (old_insn->is_specific_opcode || !density_supported)
4006 1.1.1.2 christos return FALSE;
4007 1.1.1.2 christos
4008 1.1 skrll rule = xg_instruction_match (old_insn);
4009 1.1 skrll if (rule == NULL)
4010 1.1 skrll return FALSE;
4011 1.1 skrll
4012 1.1 skrll insn_spec = rule->to_instr;
4013 1.1 skrll /* There should only be one. */
4014 1.1 skrll gas_assert (insn_spec != NULL);
4015 1.1 skrll gas_assert (insn_spec->next == NULL);
4016 1.1 skrll if (insn_spec->next != NULL)
4017 1.1 skrll return FALSE;
4018 1.1 skrll
4019 1.1 skrll xg_build_token_insn (insn_spec, old_insn, new_insn);
4020 1.1 skrll
4021 1.1 skrll return TRUE;
4022 1.1 skrll }
4023 1.1 skrll
4024 1.1 skrll
4025 1.1 skrll /* xg_expand_assembly_insn: (1) Simplify the instruction, i.e., l32i ->
4026 1.1 skrll l32i.n. (2) Check the number of operands. (3) Place the instruction
4027 1.1 skrll tokens into the stack or relax it and place multiple
4028 1.1 skrll instructions/literals onto the stack. Return FALSE if no error. */
4029 1.1 skrll
4030 1.1 skrll static bfd_boolean
4031 1.1 skrll xg_expand_assembly_insn (IStack *istack, TInsn *orig_insn)
4032 1.1 skrll {
4033 1.1 skrll int noperands;
4034 1.1 skrll TInsn new_insn;
4035 1.1 skrll bfd_boolean do_expand;
4036 1.1 skrll
4037 1.1 skrll tinsn_init (&new_insn);
4038 1.1 skrll
4039 1.1 skrll /* Narrow it if we can. xg_simplify_insn now does all the
4040 1.1.1.6 christos appropriate checking (e.g., for the density option). */
4041 1.1.1.6 christos if (xg_simplify_insn (orig_insn, &new_insn))
4042 1.1.1.6 christos orig_insn = &new_insn;
4043 1.1 skrll
4044 1.1 skrll noperands = xtensa_opcode_num_operands (xtensa_default_isa,
4045 1.1 skrll orig_insn->opcode);
4046 1.1 skrll if (orig_insn->ntok < noperands)
4047 1.1 skrll {
4048 1.1 skrll as_bad (ngettext ("found %d operand for '%s': Expected %d",
4049 1.1.1.6 christos "found %d operands for '%s': Expected %d",
4050 1.1.1.6 christos orig_insn->ntok),
4051 1.1.1.6 christos orig_insn->ntok,
4052 1.1 skrll xtensa_opcode_name (xtensa_default_isa, orig_insn->opcode),
4053 1.1 skrll noperands);
4054 1.1 skrll return TRUE;
4055 1.1 skrll }
4056 1.1 skrll if (orig_insn->ntok > noperands)
4057 1.1 skrll as_warn (ngettext ("found %d operand for '%s': Expected %d",
4058 1.1 skrll "found %d operands for '%s': Expected %d",
4059 1.1 skrll orig_insn->ntok),
4060 1.1 skrll orig_insn->ntok,
4061 1.1 skrll xtensa_opcode_name (xtensa_default_isa, orig_insn->opcode),
4062 1.1 skrll noperands);
4063 1.1 skrll
4064 1.1 skrll /* If there are not enough operands, we will assert above. If there
4065 1.1 skrll are too many, just cut out the extras here. */
4066 1.1 skrll orig_insn->ntok = noperands;
4067 1.1 skrll
4068 1.1 skrll if (tinsn_has_invalid_symbolic_operands (orig_insn))
4069 1.1 skrll return TRUE;
4070 1.1 skrll
4071 1.1 skrll /* Special case for extui opcode which has constraints not handled
4072 1.1 skrll by the ordinary operand encoding checks. The number of operands
4073 1.1 skrll and related syntax issues have already been checked. */
4074 1.1 skrll if (orig_insn->opcode == xtensa_extui_opcode)
4075 1.1 skrll {
4076 1.1 skrll int shiftimm = orig_insn->tok[2].X_add_number;
4077 1.1 skrll int maskimm = orig_insn->tok[3].X_add_number;
4078 1.1 skrll if (shiftimm + maskimm > 32)
4079 1.1 skrll {
4080 1.1 skrll as_bad (_("immediate operands sum to greater than 32"));
4081 1.1 skrll return TRUE;
4082 1.1 skrll }
4083 1.1 skrll }
4084 1.1 skrll
4085 1.1 skrll /* If the instruction will definitely need to be relaxed, it is better
4086 1.1 skrll to expand it now for better scheduling. Decide whether to expand
4087 1.1 skrll now.... */
4088 1.1 skrll do_expand = (!orig_insn->is_specific_opcode && use_transform ());
4089 1.1 skrll
4090 1.1 skrll /* Calls should be expanded to longcalls only in the backend relaxation
4091 1.1 skrll so that the assembly scheduler will keep the L32R/CALLX instructions
4092 1.1 skrll adjacent. */
4093 1.1 skrll if (is_direct_call_opcode (orig_insn->opcode))
4094 1.1 skrll do_expand = FALSE;
4095 1.1 skrll
4096 1.1 skrll if (tinsn_has_symbolic_operands (orig_insn))
4097 1.1 skrll {
4098 1.1 skrll /* The values of symbolic operands are not known yet, so only expand
4099 1.1 skrll now if an operand is "complex" (e.g., difference of symbols) and
4100 1.1 skrll will have to be stored as a literal regardless of the value. */
4101 1.1 skrll if (!tinsn_has_complex_operands (orig_insn))
4102 1.1 skrll do_expand = FALSE;
4103 1.1 skrll }
4104 1.1 skrll else if (xg_immeds_fit (orig_insn))
4105 1.1 skrll do_expand = FALSE;
4106 1.1 skrll
4107 1.1 skrll if (do_expand)
4108 1.1 skrll xg_assembly_relax (istack, orig_insn, 0, 0, 0, 0, 0);
4109 1.1 skrll else
4110 1.1 skrll istack_push (istack, orig_insn);
4111 1.1 skrll
4112 1.1 skrll return FALSE;
4113 1.1 skrll }
4114 1.1 skrll
4115 1.1 skrll
4116 1.1 skrll /* Return TRUE if the section flags are marked linkonce
4117 1.1 skrll or the name is .gnu.linkonce.*. */
4118 1.1.1.8 christos
4119 1.1 skrll static int linkonce_len = sizeof (".gnu.linkonce.") - 1;
4120 1.1 skrll
4121 1.1 skrll static bfd_boolean
4122 1.1 skrll get_is_linkonce_section (bfd *abfd ATTRIBUTE_UNUSED, segT sec)
4123 1.1 skrll {
4124 1.1 skrll flagword flags, link_once_flags;
4125 1.1 skrll
4126 1.1 skrll flags = bfd_section_flags (sec);
4127 1.1 skrll link_once_flags = (flags & SEC_LINK_ONCE);
4128 1.1 skrll
4129 1.1 skrll /* Flags might not be set yet. */
4130 1.1 skrll if (!link_once_flags
4131 1.1 skrll && strncmp (segment_name (sec), ".gnu.linkonce.", linkonce_len) == 0)
4132 1.1 skrll link_once_flags = SEC_LINK_ONCE;
4133 1.1 skrll
4134 1.1 skrll return (link_once_flags != 0);
4135 1.1.1.5 christos }
4136 1.1 skrll
4137 1.1 skrll
4138 1.1 skrll static void
4139 1.1 skrll xtensa_add_literal_sym (symbolS *sym)
4140 1.1 skrll {
4141 1.1 skrll sym_list *l;
4142 1.1 skrll
4143 1.1 skrll l = XNEW (sym_list);
4144 1.1 skrll l->sym = sym;
4145 1.1 skrll l->next = literal_syms;
4146 1.1 skrll literal_syms = l;
4147 1.1 skrll }
4148 1.1 skrll
4149 1.1 skrll
4150 1.1 skrll static symbolS *
4151 1.1 skrll xtensa_create_literal_symbol (segT sec, fragS *frag)
4152 1.1 skrll {
4153 1.1 skrll static int lit_num = 0;
4154 1.1 skrll static char name[256];
4155 1.1 skrll symbolS *symbolP;
4156 1.1 skrll
4157 1.1 skrll sprintf (name, ".L_lit_sym%d", lit_num);
4158 1.1 skrll
4159 1.1 skrll /* Create a local symbol. If it is in a linkonce section, we have to
4160 1.1 skrll be careful to make sure that if it is used in a relocation that the
4161 1.1 skrll symbol will be in the output file. */
4162 1.1 skrll if (get_is_linkonce_section (stdoutput, sec))
4163 1.1 skrll {
4164 1.1 skrll symbolP = symbol_new (name, sec, 0, frag);
4165 1.1 skrll S_CLEAR_EXTERNAL (symbolP);
4166 1.1 skrll /* symbolP->local = 1; */
4167 1.1 skrll }
4168 1.1 skrll else
4169 1.1 skrll symbolP = symbol_new (name, sec, 0, frag);
4170 1.1 skrll
4171 1.1 skrll xtensa_add_literal_sym (symbolP);
4172 1.1 skrll
4173 1.1 skrll lit_num++;
4174 1.1 skrll return symbolP;
4175 1.1 skrll }
4176 1.1 skrll
4177 1.1 skrll
4178 1.1 skrll /* Currently all literals that are generated here are 32-bit L32R targets. */
4179 1.1 skrll
4180 1.1 skrll static symbolS *
4181 1.1 skrll xg_assemble_literal (/* const */ TInsn *insn)
4182 1.1 skrll {
4183 1.1 skrll emit_state state;
4184 1.1 skrll symbolS *lit_sym = NULL;
4185 1.1 skrll bfd_reloc_code_real_type reloc;
4186 1.1 skrll bfd_boolean pcrel = FALSE;
4187 1.1 skrll char *p;
4188 1.1 skrll
4189 1.1 skrll /* size = 4 for L32R. It could easily be larger when we move to
4190 1.1.1.2 christos larger constants. Add a parameter later. */
4191 1.1.1.2 christos offsetT litsize = 4;
4192 1.1 skrll offsetT litalign = 2; /* 2^2 = 4 */
4193 1.1 skrll expressionS saved_loc;
4194 1.1 skrll expressionS * emit_val;
4195 1.1 skrll
4196 1.1 skrll set_expr_symbol_offset (&saved_loc, frag_now->fr_symbol, frag_now_fix ());
4197 1.1 skrll
4198 1.1 skrll gas_assert (insn->insn_type == ITYPE_LITERAL);
4199 1.1 skrll gas_assert (insn->ntok == 1); /* must be only one token here */
4200 1.1 skrll
4201 1.1 skrll xtensa_switch_to_literal_fragment (&state);
4202 1.1 skrll
4203 1.1 skrll emit_val = &insn->tok[0];
4204 1.1 skrll if (emit_val->X_op == O_big)
4205 1.1 skrll {
4206 1.1 skrll int size = emit_val->X_add_number * CHARS_PER_LITTLENUM;
4207 1.1 skrll if (size > litsize)
4208 1.1 skrll {
4209 1.1 skrll /* This happens when someone writes a "movi a2, big_number". */
4210 1.1 skrll as_bad_where (frag_now->fr_file, frag_now->fr_line,
4211 1.1 skrll _("invalid immediate"));
4212 1.1 skrll xtensa_restore_emit_state (&state);
4213 1.1 skrll return NULL;
4214 1.1 skrll }
4215 1.1 skrll }
4216 1.1 skrll
4217 1.1 skrll /* Force a 4-byte align here. Note that this opens a new frag, so all
4218 1.1 skrll literals done with this function have a frag to themselves. That's
4219 1.1 skrll important for the way text section literals work. */
4220 1.1 skrll frag_align (litalign, 0, 0);
4221 1.1 skrll record_alignment (now_seg, litalign);
4222 1.1 skrll
4223 1.1 skrll switch (emit_val->X_op)
4224 1.1 skrll {
4225 1.1 skrll case O_pcrel:
4226 1.1 skrll pcrel = TRUE;
4227 1.1 skrll /* fall through */
4228 1.1 skrll case O_pltrel:
4229 1.1 skrll case O_tlsfunc:
4230 1.1 skrll case O_tlsarg:
4231 1.1 skrll case O_tpoff:
4232 1.1 skrll case O_dtpoff:
4233 1.1 skrll p = frag_more (litsize);
4234 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
4235 1.1 skrll reloc = map_operator_to_reloc (emit_val->X_op, TRUE);
4236 1.1 skrll if (emit_val->X_add_symbol)
4237 1.1 skrll emit_val->X_op = O_symbol;
4238 1.1 skrll else
4239 1.1 skrll emit_val->X_op = O_constant;
4240 1.1 skrll fix_new_exp (frag_now, p - frag_now->fr_literal,
4241 1.1.1.2 christos litsize, emit_val, pcrel, reloc);
4242 1.1 skrll break;
4243 1.1 skrll
4244 1.1 skrll default:
4245 1.1 skrll emit_expr (emit_val, litsize);
4246 1.1 skrll break;
4247 1.1 skrll }
4248 1.1 skrll
4249 1.1 skrll gas_assert (frag_now->tc_frag_data.literal_frag == NULL);
4250 1.1 skrll frag_now->tc_frag_data.literal_frag = get_literal_pool_location (now_seg);
4251 1.1 skrll frag_now->fr_symbol = xtensa_create_literal_symbol (now_seg, frag_now);
4252 1.1 skrll lit_sym = frag_now->fr_symbol;
4253 1.1 skrll
4254 1.1 skrll /* Go back. */
4255 1.1 skrll xtensa_restore_emit_state (&state);
4256 1.1 skrll return lit_sym;
4257 1.1 skrll }
4258 1.1 skrll
4259 1.1 skrll
4260 1.1 skrll static void
4261 1.1.1.2 christos xg_assemble_literal_space (/* const */ int size, int slot)
4262 1.1 skrll {
4263 1.1 skrll emit_state state;
4264 1.1 skrll /* We might have to do something about this alignment. It only
4265 1.1 skrll takes effect if something is placed here. */
4266 1.1 skrll offsetT litalign = 2; /* 2^2 = 4 */
4267 1.1 skrll fragS *lit_saved_frag;
4268 1.1 skrll
4269 1.1 skrll gas_assert (size % 4 == 0);
4270 1.1 skrll
4271 1.1 skrll xtensa_switch_to_literal_fragment (&state);
4272 1.1 skrll
4273 1.1 skrll /* Force a 4-byte align here. */
4274 1.1 skrll frag_align (litalign, 0, 0);
4275 1.1 skrll record_alignment (now_seg, litalign);
4276 1.1 skrll
4277 1.1 skrll frag_grow (size);
4278 1.1 skrll
4279 1.1 skrll lit_saved_frag = frag_now;
4280 1.1 skrll frag_now->tc_frag_data.literal_frag = get_literal_pool_location (now_seg);
4281 1.1 skrll frag_now->fr_symbol = xtensa_create_literal_symbol (now_seg, frag_now);
4282 1.1 skrll xg_finish_frag (0, RELAX_LITERAL, 0, size, FALSE);
4283 1.1 skrll
4284 1.1 skrll /* Go back. */
4285 1.1 skrll xtensa_restore_emit_state (&state);
4286 1.1 skrll frag_now->tc_frag_data.literal_frags[slot] = lit_saved_frag;
4287 1.1 skrll }
4288 1.1 skrll
4289 1.1 skrll
4290 1.1.1.2 christos /* Put in a fixup record based on the opcode.
4291 1.1 skrll Return TRUE on success. */
4292 1.1 skrll
4293 1.1 skrll static bfd_boolean
4294 1.1 skrll xg_add_opcode_fix (TInsn *tinsn,
4295 1.1 skrll int opnum,
4296 1.1 skrll xtensa_format fmt,
4297 1.1 skrll int slot,
4298 1.1 skrll expressionS *exp,
4299 1.1 skrll fragS *fragP,
4300 1.1 skrll offsetT offset)
4301 1.1 skrll {
4302 1.1 skrll xtensa_opcode opcode = tinsn->opcode;
4303 1.1 skrll bfd_reloc_code_real_type reloc;
4304 1.1 skrll reloc_howto_type *howto;
4305 1.1 skrll int fmt_length;
4306 1.1 skrll fixS *the_fix;
4307 1.1 skrll
4308 1.1 skrll reloc = BFD_RELOC_NONE;
4309 1.1 skrll
4310 1.1.1.2 christos /* First try the special cases for "alternate" relocs. */
4311 1.1 skrll if (opcode == xtensa_l32r_opcode)
4312 1.1 skrll {
4313 1.1.1.2 christos if (fragP->tc_frag_data.use_absolute_literals)
4314 1.1 skrll reloc = encode_alt_reloc (slot);
4315 1.1.1.2 christos }
4316 1.1 skrll else if (opcode == xtensa_const16_opcode)
4317 1.1 skrll {
4318 1.1.1.2 christos if (exp->X_op == O_lo16)
4319 1.1 skrll {
4320 1.1 skrll reloc = encode_reloc (slot);
4321 1.1 skrll exp->X_op = O_symbol;
4322 1.1 skrll }
4323 1.1 skrll else if (exp->X_op == O_hi16)
4324 1.1 skrll {
4325 1.1 skrll reloc = encode_alt_reloc (slot);
4326 1.1 skrll exp->X_op = O_symbol;
4327 1.1 skrll }
4328 1.1 skrll }
4329 1.1 skrll
4330 1.1 skrll if (opnum != get_relaxable_immed (opcode))
4331 1.1 skrll {
4332 1.1.1.2 christos as_bad (_("invalid relocation for operand %i of '%s'"),
4333 1.1 skrll opnum + 1, xtensa_opcode_name (xtensa_default_isa, opcode));
4334 1.1 skrll return FALSE;
4335 1.1 skrll }
4336 1.1 skrll
4337 1.1 skrll /* Handle erroneous "@h" and "@l" expressions here before they propagate
4338 1.1 skrll into the symbol table where the generic portions of the assembler
4339 1.1 skrll won't know what to do with them. */
4340 1.1 skrll if (exp->X_op == O_lo16 || exp->X_op == O_hi16)
4341 1.1 skrll {
4342 1.1 skrll as_bad (_("invalid expression for operand %i of '%s'"),
4343 1.1 skrll opnum + 1, xtensa_opcode_name (xtensa_default_isa, opcode));
4344 1.1 skrll return FALSE;
4345 1.1 skrll }
4346 1.1 skrll
4347 1.1 skrll /* Next try the generic relocs. */
4348 1.1 skrll if (reloc == BFD_RELOC_NONE)
4349 1.1 skrll reloc = encode_reloc (slot);
4350 1.1 skrll if (reloc == BFD_RELOC_NONE)
4351 1.1 skrll {
4352 1.1 skrll as_bad (_("invalid relocation in instruction slot %i"), slot);
4353 1.1 skrll return FALSE;
4354 1.1 skrll }
4355 1.1 skrll
4356 1.1 skrll howto = bfd_reloc_type_lookup (stdoutput, reloc);
4357 1.1.1.2 christos if (!howto)
4358 1.1 skrll {
4359 1.1 skrll as_bad (_("undefined symbol for opcode \"%s\""),
4360 1.1.1.2 christos xtensa_opcode_name (xtensa_default_isa, opcode));
4361 1.1.1.2 christos return FALSE;
4362 1.1 skrll }
4363 1.1 skrll
4364 1.1 skrll fmt_length = xtensa_format_length (xtensa_default_isa, fmt);
4365 1.1 skrll the_fix = fix_new_exp (fragP, offset, fmt_length, exp,
4366 1.1 skrll howto->pc_relative, reloc);
4367 1.1 skrll the_fix->fx_no_overflow = 1;
4368 1.1 skrll the_fix->tc_fix_data.X_add_symbol = exp->X_add_symbol;
4369 1.1 skrll the_fix->tc_fix_data.X_add_number = exp->X_add_number;
4370 1.1 skrll the_fix->tc_fix_data.slot = slot;
4371 1.1 skrll
4372 1.1 skrll return TRUE;
4373 1.1 skrll }
4374 1.1 skrll
4375 1.1 skrll
4376 1.1 skrll static bfd_boolean
4377 1.1 skrll xg_emit_insn_to_buf (TInsn *tinsn,
4378 1.1 skrll char *buf,
4379 1.1 skrll fragS *fragP,
4380 1.1 skrll offsetT offset,
4381 1.1 skrll bfd_boolean build_fix)
4382 1.1 skrll {
4383 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
4384 1.1 skrll bfd_boolean has_symbolic_immed = FALSE;
4385 1.1 skrll bfd_boolean ok = TRUE;
4386 1.1 skrll
4387 1.1 skrll if (!insnbuf)
4388 1.1 skrll insnbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
4389 1.1 skrll
4390 1.1 skrll has_symbolic_immed = tinsn_to_insnbuf (tinsn, insnbuf);
4391 1.1 skrll if (has_symbolic_immed && build_fix)
4392 1.1 skrll {
4393 1.1 skrll /* Add a fixup. */
4394 1.1 skrll xtensa_format fmt = xg_get_single_format (tinsn->opcode);
4395 1.1 skrll int slot = xg_get_single_slot (tinsn->opcode);
4396 1.1 skrll int opnum = get_relaxable_immed (tinsn->opcode);
4397 1.1 skrll expressionS *exp = &tinsn->tok[opnum];
4398 1.1 skrll
4399 1.1 skrll if (!xg_add_opcode_fix (tinsn, opnum, fmt, slot, exp, fragP, offset))
4400 1.1 skrll ok = FALSE;
4401 1.1 skrll }
4402 1.1 skrll fragP->tc_frag_data.is_insn = TRUE;
4403 1.1 skrll xtensa_insnbuf_to_chars (xtensa_default_isa, insnbuf,
4404 1.1 skrll (unsigned char *) buf, 0);
4405 1.1 skrll return ok;
4406 1.1 skrll }
4407 1.1 skrll
4408 1.1.1.2 christos
4409 1.1 skrll static void
4410 1.1 skrll xg_resolve_literals (TInsn *insn, symbolS *lit_sym)
4411 1.1 skrll {
4412 1.1 skrll symbolS *sym = get_special_literal_symbol ();
4413 1.1 skrll int i;
4414 1.1 skrll if (lit_sym == 0)
4415 1.1 skrll return;
4416 1.1 skrll gas_assert (insn->insn_type == ITYPE_INSN);
4417 1.1 skrll for (i = 0; i < insn->ntok; i++)
4418 1.1 skrll if (insn->tok[i].X_add_symbol == sym)
4419 1.1 skrll insn->tok[i].X_add_symbol = lit_sym;
4420 1.1 skrll
4421 1.1 skrll }
4422 1.1 skrll
4423 1.1 skrll
4424 1.1 skrll static void
4425 1.1 skrll xg_resolve_labels (TInsn *insn, symbolS *label_sym)
4426 1.1 skrll {
4427 1.1 skrll symbolS *sym = get_special_label_symbol ();
4428 1.1 skrll int i;
4429 1.1 skrll for (i = 0; i < insn->ntok; i++)
4430 1.1 skrll if (insn->tok[i].X_add_symbol == sym)
4431 1.1 skrll insn->tok[i].X_add_symbol = label_sym;
4432 1.1 skrll
4433 1.1 skrll }
4434 1.1 skrll
4435 1.1 skrll
4436 1.1 skrll /* Return TRUE if the instruction can write to the specified
4437 1.1 skrll integer register. */
4438 1.1 skrll
4439 1.1 skrll static bfd_boolean
4440 1.1 skrll is_register_writer (const TInsn *insn, const char *regset, int regnum)
4441 1.1 skrll {
4442 1.1 skrll int i;
4443 1.1 skrll int num_ops;
4444 1.1 skrll xtensa_isa isa = xtensa_default_isa;
4445 1.1 skrll
4446 1.1 skrll num_ops = xtensa_opcode_num_operands (isa, insn->opcode);
4447 1.1 skrll
4448 1.1 skrll for (i = 0; i < num_ops; i++)
4449 1.1 skrll {
4450 1.1 skrll char inout;
4451 1.1 skrll inout = xtensa_operand_inout (isa, insn->opcode, i);
4452 1.1 skrll if ((inout == 'o' || inout == 'm')
4453 1.1 skrll && xtensa_operand_is_register (isa, insn->opcode, i) == 1)
4454 1.1 skrll {
4455 1.1 skrll xtensa_regfile opnd_rf =
4456 1.1 skrll xtensa_operand_regfile (isa, insn->opcode, i);
4457 1.1 skrll if (!strcmp (xtensa_regfile_shortname (isa, opnd_rf), regset))
4458 1.1 skrll {
4459 1.1 skrll if ((insn->tok[i].X_op == O_register)
4460 1.1 skrll && (insn->tok[i].X_add_number == regnum))
4461 1.1 skrll return TRUE;
4462 1.1 skrll }
4463 1.1 skrll }
4464 1.1 skrll }
4465 1.1 skrll return FALSE;
4466 1.1 skrll }
4467 1.1 skrll
4468 1.1 skrll
4469 1.1 skrll static bfd_boolean
4470 1.1 skrll is_bad_loopend_opcode (const TInsn *tinsn)
4471 1.1 skrll {
4472 1.1 skrll xtensa_opcode opcode = tinsn->opcode;
4473 1.1 skrll
4474 1.1 skrll if (opcode == XTENSA_UNDEFINED)
4475 1.1 skrll return FALSE;
4476 1.1 skrll
4477 1.1 skrll if (opcode == xtensa_call0_opcode
4478 1.1 skrll || opcode == xtensa_callx0_opcode
4479 1.1 skrll || opcode == xtensa_call4_opcode
4480 1.1 skrll || opcode == xtensa_callx4_opcode
4481 1.1 skrll || opcode == xtensa_call8_opcode
4482 1.1 skrll || opcode == xtensa_callx8_opcode
4483 1.1 skrll || opcode == xtensa_call12_opcode
4484 1.1 skrll || opcode == xtensa_callx12_opcode
4485 1.1 skrll || opcode == xtensa_isync_opcode
4486 1.1 skrll || opcode == xtensa_ret_opcode
4487 1.1 skrll || opcode == xtensa_ret_n_opcode
4488 1.1 skrll || opcode == xtensa_retw_opcode
4489 1.1 skrll || opcode == xtensa_retw_n_opcode
4490 1.1 skrll || opcode == xtensa_waiti_opcode
4491 1.1 skrll || opcode == xtensa_rsr_lcount_opcode)
4492 1.1 skrll return TRUE;
4493 1.1 skrll
4494 1.1 skrll return FALSE;
4495 1.1 skrll }
4496 1.1 skrll
4497 1.1 skrll
4498 1.1 skrll /* Labels that begin with ".Ln" or ".LM" are unaligned.
4499 1.1 skrll This allows the debugger to add unaligned labels.
4500 1.1 skrll Also, the assembler generates stabs labels that need
4501 1.1 skrll not be aligned: FAKE_LABEL_NAME . {"F", "L", "endfunc"}. */
4502 1.1 skrll
4503 1.1 skrll static bfd_boolean
4504 1.1 skrll is_unaligned_label (symbolS *sym)
4505 1.1 skrll {
4506 1.1 skrll const char *name = S_GET_NAME (sym);
4507 1.1 skrll static size_t fake_size = 0;
4508 1.1 skrll
4509 1.1 skrll if (name
4510 1.1 skrll && name[0] == '.'
4511 1.1 skrll && name[1] == 'L' && (name[2] == 'n' || name[2] == 'M'))
4512 1.1 skrll return TRUE;
4513 1.1 skrll
4514 1.1 skrll /* FAKE_LABEL_NAME followed by "F", "L" or "endfunc" */
4515 1.1 skrll if (fake_size == 0)
4516 1.1 skrll fake_size = strlen (FAKE_LABEL_NAME);
4517 1.1 skrll
4518 1.1 skrll if (name
4519 1.1 skrll && strncmp (FAKE_LABEL_NAME, name, fake_size) == 0
4520 1.1 skrll && (name[fake_size] == 'F'
4521 1.1 skrll || name[fake_size] == 'L'
4522 1.1 skrll || (name[fake_size] == 'e'
4523 1.1 skrll && strncmp ("endfunc", name+fake_size, 7) == 0)))
4524 1.1 skrll return TRUE;
4525 1.1 skrll
4526 1.1 skrll return FALSE;
4527 1.1 skrll }
4528 1.1 skrll
4529 1.1 skrll
4530 1.1 skrll static fragS *
4531 1.1 skrll next_non_empty_frag (const fragS *fragP)
4532 1.1 skrll {
4533 1.1 skrll fragS *next_fragP = fragP->fr_next;
4534 1.1 skrll
4535 1.1 skrll /* Sometimes an empty will end up here due storage allocation issues.
4536 1.1 skrll So we have to skip until we find something legit. */
4537 1.1 skrll while (next_fragP && next_fragP->fr_fix == 0)
4538 1.1 skrll next_fragP = next_fragP->fr_next;
4539 1.1 skrll
4540 1.1 skrll if (next_fragP == NULL || next_fragP->fr_fix == 0)
4541 1.1 skrll return NULL;
4542 1.1 skrll
4543 1.1 skrll return next_fragP;
4544 1.1 skrll }
4545 1.1 skrll
4546 1.1 skrll
4547 1.1 skrll static bfd_boolean
4548 1.1 skrll next_frag_opcode_is_loop (const fragS *fragP, xtensa_opcode *opcode)
4549 1.1 skrll {
4550 1.1 skrll xtensa_opcode out_opcode;
4551 1.1 skrll const fragS *next_fragP = next_non_empty_frag (fragP);
4552 1.1 skrll
4553 1.1 skrll if (next_fragP == NULL)
4554 1.1 skrll return FALSE;
4555 1.1 skrll
4556 1.1 skrll out_opcode = get_opcode_from_buf (next_fragP->fr_literal, 0);
4557 1.1 skrll if (xtensa_opcode_is_loop (xtensa_default_isa, out_opcode) == 1)
4558 1.1 skrll {
4559 1.1 skrll *opcode = out_opcode;
4560 1.1 skrll return TRUE;
4561 1.1 skrll }
4562 1.1 skrll return FALSE;
4563 1.1 skrll }
4564 1.1 skrll
4565 1.1 skrll
4566 1.1 skrll static int
4567 1.1 skrll frag_format_size (const fragS *fragP)
4568 1.1 skrll {
4569 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
4570 1.1 skrll xtensa_isa isa = xtensa_default_isa;
4571 1.1 skrll xtensa_format fmt;
4572 1.1 skrll int fmt_size;
4573 1.1 skrll
4574 1.1 skrll if (!insnbuf)
4575 1.1 skrll insnbuf = xtensa_insnbuf_alloc (isa);
4576 1.1 skrll
4577 1.1 skrll if (fragP == NULL)
4578 1.1 skrll return XTENSA_UNDEFINED;
4579 1.1 skrll
4580 1.1 skrll xtensa_insnbuf_from_chars (isa, insnbuf,
4581 1.1 skrll (unsigned char *) fragP->fr_literal, 0);
4582 1.1 skrll
4583 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
4584 1.1 skrll if (fmt == XTENSA_UNDEFINED)
4585 1.1 skrll return XTENSA_UNDEFINED;
4586 1.1 skrll fmt_size = xtensa_format_length (isa, fmt);
4587 1.1 skrll
4588 1.1 skrll /* If the next format won't be changing due to relaxation, just
4589 1.1 skrll return the length of the first format. */
4590 1.1 skrll if (fragP->fr_opcode != fragP->fr_literal)
4591 1.1 skrll return fmt_size;
4592 1.1 skrll
4593 1.1 skrll /* If during relaxation we have to pull an instruction out of a
4594 1.1 skrll multi-slot instruction, we will return the more conservative
4595 1.1 skrll number. This works because alignment on bigger instructions
4596 1.1 skrll is more restrictive than alignment on smaller instructions.
4597 1.1 skrll This is more conservative than we would like, but it happens
4598 1.1 skrll infrequently. */
4599 1.1 skrll
4600 1.1 skrll if (xtensa_format_num_slots (xtensa_default_isa, fmt) > 1)
4601 1.1 skrll return fmt_size;
4602 1.1 skrll
4603 1.1 skrll /* If we aren't doing one of our own relaxations or it isn't
4604 1.1 skrll slot-based, then the insn size won't change. */
4605 1.1 skrll if (fragP->fr_type != rs_machine_dependent)
4606 1.1 skrll return fmt_size;
4607 1.1 skrll if (fragP->fr_subtype != RELAX_SLOTS)
4608 1.1 skrll return fmt_size;
4609 1.1 skrll
4610 1.1 skrll /* If an instruction is about to grow, return the longer size. */
4611 1.1 skrll if (fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED_STEP1
4612 1.1 skrll || fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED_STEP2
4613 1.1 skrll || fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED_STEP3)
4614 1.1 skrll {
4615 1.1 skrll /* For most frags at RELAX_IMMED_STEPX, with X > 0, the first
4616 1.1 skrll instruction in the relaxed version is of length 3. (The case
4617 1.1 skrll where we have to pull the instruction out of a FLIX bundle
4618 1.1 skrll is handled conservatively above.) However, frags with opcodes
4619 1.1.1.2 christos that are expanding to wide branches end up having formats that
4620 1.1 skrll are not determinable by the RELAX_IMMED_STEPX enumeration, and
4621 1.1.1.2 christos we can't tell directly what format the relaxer picked. This
4622 1.1.1.2 christos is a wart in the design of the relaxer that should someday be
4623 1.1.1.2 christos fixed, but would require major changes, or at least should
4624 1.1.1.2 christos be accompanied by major changes to make use of that data.
4625 1.1.1.2 christos
4626 1.1.1.2 christos In any event, we can tell that we are expanding from a single-slot
4627 1.1.1.2 christos format to a wider one with the logic below. */
4628 1.1.1.2 christos
4629 1.1.1.2 christos int i;
4630 1.1.1.2 christos int relaxed_size = fmt_size + fragP->tc_frag_data.text_expansion[0];
4631 1.1 skrll
4632 1.1 skrll for (i = 0; i < xtensa_isa_num_formats (isa); i++)
4633 1.1 skrll {
4634 1.1 skrll if (relaxed_size == xtensa_format_length (isa, i))
4635 1.1 skrll return relaxed_size;
4636 1.1 skrll }
4637 1.1 skrll
4638 1.1 skrll return 3;
4639 1.1 skrll }
4640 1.1 skrll
4641 1.1 skrll if (fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
4642 1.1 skrll return 2 + fragP->tc_frag_data.text_expansion[0];
4643 1.1 skrll
4644 1.1 skrll return fmt_size;
4645 1.1 skrll }
4646 1.1 skrll
4647 1.1 skrll
4648 1.1 skrll static int
4649 1.1 skrll next_frag_format_size (const fragS *fragP)
4650 1.1 skrll {
4651 1.1 skrll const fragS *next_fragP = next_non_empty_frag (fragP);
4652 1.1 skrll return frag_format_size (next_fragP);
4653 1.1 skrll }
4654 1.1 skrll
4655 1.1 skrll
4656 1.1 skrll /* In early Xtensa Processors, for reasons that are unclear, the ISA
4657 1.1 skrll required two-byte instructions to be treated as three-byte instructions
4658 1.1 skrll for loop instruction alignment. This restriction was removed beginning
4659 1.1 skrll with Xtensa LX. Now the only requirement on loop instruction alignment
4660 1.1 skrll is that the first instruction of the loop must appear at an address that
4661 1.1 skrll does not cross a fetch boundary. */
4662 1.1 skrll
4663 1.1 skrll static int
4664 1.1 skrll get_loop_align_size (int insn_size)
4665 1.1 skrll {
4666 1.1 skrll if (insn_size == XTENSA_UNDEFINED)
4667 1.1 skrll return xtensa_fetch_width;
4668 1.1 skrll
4669 1.1 skrll if (enforce_three_byte_loop_align && insn_size == 2)
4670 1.1 skrll return 3;
4671 1.1 skrll
4672 1.1 skrll return insn_size;
4673 1.1 skrll }
4674 1.1 skrll
4675 1.1 skrll
4676 1.1 skrll /* If the next legit fragment is an end-of-loop marker,
4677 1.1 skrll switch its state so it will instantiate a NOP. */
4678 1.1 skrll
4679 1.1 skrll static void
4680 1.1 skrll update_next_frag_state (fragS *fragP)
4681 1.1 skrll {
4682 1.1 skrll fragS *next_fragP = fragP->fr_next;
4683 1.1 skrll fragS *new_target = NULL;
4684 1.1 skrll
4685 1.1.1.2 christos if (align_targets)
4686 1.1 skrll {
4687 1.1 skrll /* We are guaranteed there will be one of these... */
4688 1.1 skrll while (!(next_fragP->fr_type == rs_machine_dependent
4689 1.1 skrll && (next_fragP->fr_subtype == RELAX_MAYBE_UNREACHABLE
4690 1.1 skrll || next_fragP->fr_subtype == RELAX_UNREACHABLE)))
4691 1.1 skrll next_fragP = next_fragP->fr_next;
4692 1.1 skrll
4693 1.1 skrll gas_assert (next_fragP->fr_type == rs_machine_dependent
4694 1.1 skrll && (next_fragP->fr_subtype == RELAX_MAYBE_UNREACHABLE
4695 1.1 skrll || next_fragP->fr_subtype == RELAX_UNREACHABLE));
4696 1.1.1.2 christos
4697 1.1 skrll /* ...and one of these. */
4698 1.1 skrll new_target = next_fragP->fr_next;
4699 1.1 skrll while (!(new_target->fr_type == rs_machine_dependent
4700 1.1 skrll && (new_target->fr_subtype == RELAX_MAYBE_DESIRE_ALIGN
4701 1.1 skrll || new_target->fr_subtype == RELAX_DESIRE_ALIGN)))
4702 1.1 skrll new_target = new_target->fr_next;
4703 1.1 skrll
4704 1.1 skrll gas_assert (new_target->fr_type == rs_machine_dependent
4705 1.1 skrll && (new_target->fr_subtype == RELAX_MAYBE_DESIRE_ALIGN
4706 1.1 skrll || new_target->fr_subtype == RELAX_DESIRE_ALIGN));
4707 1.1 skrll }
4708 1.1 skrll
4709 1.1 skrll while (next_fragP && next_fragP->fr_fix == 0)
4710 1.1 skrll {
4711 1.1 skrll if (next_fragP->fr_type == rs_machine_dependent
4712 1.1 skrll && next_fragP->fr_subtype == RELAX_LOOP_END)
4713 1.1 skrll {
4714 1.1 skrll next_fragP->fr_subtype = RELAX_LOOP_END_ADD_NOP;
4715 1.1 skrll return;
4716 1.1 skrll }
4717 1.1 skrll
4718 1.1 skrll next_fragP = next_fragP->fr_next;
4719 1.1 skrll }
4720 1.1 skrll }
4721 1.1 skrll
4722 1.1 skrll
4723 1.1 skrll static bfd_boolean
4724 1.1 skrll next_frag_is_branch_target (const fragS *fragP)
4725 1.1 skrll {
4726 1.1 skrll /* Sometimes an empty will end up here due to storage allocation issues,
4727 1.1 skrll so we have to skip until we find something legit. */
4728 1.1 skrll for (fragP = fragP->fr_next; fragP; fragP = fragP->fr_next)
4729 1.1 skrll {
4730 1.1 skrll if (fragP->tc_frag_data.is_branch_target)
4731 1.1 skrll return TRUE;
4732 1.1 skrll if (fragP->fr_fix != 0)
4733 1.1 skrll break;
4734 1.1 skrll }
4735 1.1 skrll return FALSE;
4736 1.1 skrll }
4737 1.1 skrll
4738 1.1 skrll
4739 1.1 skrll static bfd_boolean
4740 1.1 skrll next_frag_is_loop_target (const fragS *fragP)
4741 1.1 skrll {
4742 1.1 skrll /* Sometimes an empty will end up here due storage allocation issues.
4743 1.1 skrll So we have to skip until we find something legit. */
4744 1.1 skrll for (fragP = fragP->fr_next; fragP; fragP = fragP->fr_next)
4745 1.1 skrll {
4746 1.1 skrll if (fragP->tc_frag_data.is_loop_target)
4747 1.1.1.2 christos return TRUE;
4748 1.1.1.2 christos if (fragP->fr_fix != 0)
4749 1.1.1.2 christos break;
4750 1.1.1.2 christos }
4751 1.1.1.2 christos return FALSE;
4752 1.1.1.2 christos }
4753 1.1 skrll
4754 1.1 skrll
4755 1.1 skrll /* As specified in the relaxation table, when a loop instruction is
4756 1.1 skrll relaxed, there are 24 bytes between the loop instruction itself and
4757 1.1 skrll the first instruction in the loop. */
4758 1.1 skrll
4759 1.1 skrll #define RELAXED_LOOP_INSN_BYTES 24
4760 1.1 skrll
4761 1.1 skrll static addressT
4762 1.1 skrll next_frag_pre_opcode_bytes (const fragS *fragp)
4763 1.1 skrll {
4764 1.1 skrll const fragS *next_fragp = fragp->fr_next;
4765 1.1 skrll xtensa_opcode next_opcode;
4766 1.1 skrll
4767 1.1 skrll if (!next_frag_opcode_is_loop (fragp, &next_opcode))
4768 1.1 skrll return 0;
4769 1.1 skrll
4770 1.1 skrll /* Sometimes an empty will end up here due to storage allocation issues,
4771 1.1 skrll so we have to skip until we find something legit. */
4772 1.1 skrll while (next_fragp->fr_fix == 0)
4773 1.1 skrll next_fragp = next_fragp->fr_next;
4774 1.1 skrll
4775 1.1.1.2 christos if (next_fragp->fr_type != rs_machine_dependent)
4776 1.1 skrll return 0;
4777 1.1 skrll
4778 1.1 skrll /* There is some implicit knowledge encoded in here.
4779 1.1 skrll The LOOP instructions that are NOT RELAX_IMMED have
4780 1.1 skrll been relaxed. Note that we can assume that the LOOP
4781 1.1 skrll instruction is in slot 0 because loops aren't bundleable. */
4782 1.1 skrll if (next_fragp->tc_frag_data.slot_subtypes[0] > RELAX_IMMED)
4783 1.1 skrll return get_expanded_loop_offset (next_opcode) + RELAXED_LOOP_INSN_BYTES;
4784 1.1 skrll
4785 1.1 skrll return 0;
4786 1.1 skrll }
4787 1.1 skrll
4788 1.1 skrll
4789 1.1 skrll /* Mark a location where we can later insert literal frags. Update
4790 1.1 skrll the section's literal_pool_loc, so subsequent literals can be
4791 1.1 skrll placed nearest to their use. */
4792 1.1 skrll
4793 1.1 skrll static void
4794 1.1 skrll xtensa_mark_literal_pool_location (void)
4795 1.1 skrll {
4796 1.1 skrll /* Any labels pointing to the current location need
4797 1.1 skrll to be adjusted to after the literal pool. */
4798 1.1 skrll fragS *pool_location;
4799 1.1 skrll
4800 1.1.1.4 christos if (use_literal_section)
4801 1.1.1.4 christos return;
4802 1.1 skrll
4803 1.1 skrll /* We stash info in these frags so we can later move the literal's
4804 1.1 skrll fixes into this frchain's fix list. */
4805 1.1 skrll pool_location = frag_now;
4806 1.1 skrll frag_now->tc_frag_data.lit_frchain = frchain_now;
4807 1.1 skrll frag_now->tc_frag_data.literal_frag = frag_now;
4808 1.1 skrll /* Just record this frag. */
4809 1.1 skrll xtensa_maybe_create_literal_pool_frag (FALSE, FALSE);
4810 1.1 skrll frag_variant (rs_machine_dependent, 0, 0,
4811 1.1 skrll RELAX_LITERAL_POOL_BEGIN, NULL, 0, NULL);
4812 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
4813 1.1 skrll frag_now->tc_frag_data.lit_seg = now_seg;
4814 1.1 skrll frag_variant (rs_machine_dependent, 0, 0,
4815 1.1 skrll RELAX_LITERAL_POOL_END, NULL, 0, NULL);
4816 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
4817 1.1 skrll
4818 1.1 skrll set_literal_pool_location (now_seg, pool_location);
4819 1.1 skrll }
4820 1.1 skrll
4821 1.1 skrll
4822 1.1 skrll /* Build a nop of the correct size into tinsn. */
4823 1.1 skrll
4824 1.1 skrll static void
4825 1.1 skrll build_nop (TInsn *tinsn, int size)
4826 1.1 skrll {
4827 1.1 skrll tinsn_init (tinsn);
4828 1.1 skrll switch (size)
4829 1.1 skrll {
4830 1.1 skrll case 2:
4831 1.1 skrll tinsn->opcode = xtensa_nop_n_opcode;
4832 1.1 skrll tinsn->ntok = 0;
4833 1.1 skrll if (tinsn->opcode == XTENSA_UNDEFINED)
4834 1.1 skrll as_fatal (_("opcode 'NOP.N' unavailable in this configuration"));
4835 1.1 skrll break;
4836 1.1 skrll
4837 1.1 skrll case 3:
4838 1.1 skrll if (xtensa_nop_opcode == XTENSA_UNDEFINED)
4839 1.1 skrll {
4840 1.1 skrll tinsn->opcode = xtensa_or_opcode;
4841 1.1.1.2 christos set_expr_const (&tinsn->tok[0], 1);
4842 1.1 skrll set_expr_const (&tinsn->tok[1], 1);
4843 1.1 skrll set_expr_const (&tinsn->tok[2], 1);
4844 1.1 skrll tinsn->ntok = 3;
4845 1.1 skrll }
4846 1.1 skrll else
4847 1.1 skrll tinsn->opcode = xtensa_nop_opcode;
4848 1.1 skrll
4849 1.1 skrll gas_assert (tinsn->opcode != XTENSA_UNDEFINED);
4850 1.1 skrll }
4851 1.1 skrll }
4852 1.1 skrll
4853 1.1 skrll
4854 1.1 skrll /* Assemble a NOP of the requested size in the buffer. User must have
4855 1.1 skrll allocated "buf" with at least "size" bytes. */
4856 1.1 skrll
4857 1.1 skrll static void
4858 1.1 skrll assemble_nop (int size, char *buf)
4859 1.1 skrll {
4860 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
4861 1.1 skrll TInsn tinsn;
4862 1.1 skrll
4863 1.1 skrll build_nop (&tinsn, size);
4864 1.1 skrll
4865 1.1 skrll if (!insnbuf)
4866 1.1 skrll insnbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
4867 1.1 skrll
4868 1.1 skrll tinsn_to_insnbuf (&tinsn, insnbuf);
4869 1.1 skrll xtensa_insnbuf_to_chars (xtensa_default_isa, insnbuf,
4870 1.1 skrll (unsigned char *) buf, 0);
4871 1.1 skrll }
4872 1.1 skrll
4873 1.1 skrll
4874 1.1 skrll /* Return the number of bytes for the offset of the expanded loop
4875 1.1 skrll instruction. This should be incorporated into the relaxation
4876 1.1 skrll specification but is hard-coded here. This is used to auto-align
4877 1.1 skrll the loop instruction. It is invalid to call this function if the
4878 1.1 skrll configuration does not have loops or if the opcode is not a loop
4879 1.1.1.2 christos opcode. */
4880 1.1 skrll
4881 1.1 skrll static addressT
4882 1.1 skrll get_expanded_loop_offset (xtensa_opcode opcode)
4883 1.1 skrll {
4884 1.1 skrll /* This is the OFFSET of the loop instruction in the expanded loop.
4885 1.1 skrll This MUST correspond directly to the specification of the loop
4886 1.1 skrll expansion. It will be validated on fragment conversion. */
4887 1.1 skrll gas_assert (opcode != XTENSA_UNDEFINED);
4888 1.1 skrll if (opcode == xtensa_loop_opcode)
4889 1.1 skrll return 0;
4890 1.1 skrll if (opcode == xtensa_loopnez_opcode)
4891 1.1 skrll return 3;
4892 1.1 skrll if (opcode == xtensa_loopgtz_opcode)
4893 1.1 skrll return 6;
4894 1.1.1.8 christos as_fatal (_("get_expanded_loop_offset: invalid opcode"));
4895 1.1.1.4 christos return 0;
4896 1.1.1.8 christos }
4897 1.1.1.8 christos
4898 1.1.1.8 christos
4899 1.1.1.8 christos static fragS *
4900 1.1.1.8 christos get_literal_pool_location (segT seg)
4901 1.1.1.8 christos {
4902 1.1.1.8 christos if (auto_litpools)
4903 1.1.1.8 christos {
4904 1.1.1.8 christos struct litpool_seg *lps = litpool_seg_list.next;
4905 1.1.1.8 christos struct litpool_frag *lpf;
4906 1.1.1.8 christos for ( ; lps && lps->seg->id != seg->id; lps = lps->next)
4907 1.1.1.8 christos ;
4908 1.1.1.8 christos if (lps)
4909 1.1.1.8 christos {
4910 1.1.1.8 christos for (lpf = lps->frag_list.prev; lpf->fragP; lpf = lpf->prev)
4911 1.1.1.8 christos { /* Skip "candidates" for now. */
4912 1.1.1.8 christos if (lpf->fragP->fr_subtype == RELAX_LITERAL_POOL_BEGIN &&
4913 1.1.1.8 christos lpf->priority == 1)
4914 1.1.1.8 christos return lpf->fragP;
4915 1.1.1.8 christos }
4916 1.1.1.8 christos /* Must convert a lower-priority pool. */
4917 1.1.1.8 christos for (lpf = lps->frag_list.prev; lpf->fragP; lpf = lpf->prev)
4918 1.1.1.8 christos {
4919 1.1.1.8 christos if (lpf->fragP->fr_subtype == RELAX_LITERAL_POOL_BEGIN)
4920 1.1.1.4 christos return lpf->fragP;
4921 1.1.1.4 christos }
4922 1.1 skrll /* Still no match -- try for a low priority pool. */
4923 1.1 skrll for (lpf = lps->frag_list.prev; lpf->fragP; lpf = lpf->prev)
4924 1.1 skrll {
4925 1.1 skrll if (lpf->fragP->fr_subtype == RELAX_LITERAL_POOL_CANDIDATE_BEGIN)
4926 1.1 skrll return lpf->fragP;
4927 1.1 skrll }
4928 1.1 skrll }
4929 1.1 skrll }
4930 1.1 skrll return seg_info (seg)->tc_segment_info_data.literal_pool_loc;
4931 1.1 skrll }
4932 1.1 skrll
4933 1.1 skrll
4934 1.1 skrll static void
4935 1.1 skrll set_literal_pool_location (segT seg, fragS *literal_pool_loc)
4936 1.1 skrll {
4937 1.1 skrll seg_info (seg)->tc_segment_info_data.literal_pool_loc = literal_pool_loc;
4938 1.1 skrll }
4939 1.1 skrll
4940 1.1 skrll
4941 1.1 skrll /* Set frag assembly state should be called when a new frag is
4942 1.1 skrll opened and after a frag has been closed. */
4943 1.1 skrll
4944 1.1 skrll static void
4945 1.1 skrll xtensa_set_frag_assembly_state (fragS *fragP)
4946 1.1 skrll {
4947 1.1 skrll if (!density_supported)
4948 1.1 skrll fragP->tc_frag_data.is_no_density = TRUE;
4949 1.1 skrll
4950 1.1 skrll /* This function is called from subsegs_finish, which is called
4951 1.1 skrll after xtensa_end, so we can't use "use_transform" or
4952 1.1 skrll "use_schedule" here. */
4953 1.1 skrll if (!directive_state[directive_transform])
4954 1.1 skrll fragP->tc_frag_data.is_no_transform = TRUE;
4955 1.1 skrll if (directive_state[directive_longcalls])
4956 1.1 skrll fragP->tc_frag_data.use_longcalls = TRUE;
4957 1.1 skrll fragP->tc_frag_data.use_absolute_literals =
4958 1.1 skrll directive_state[directive_absolute_literals];
4959 1.1 skrll fragP->tc_frag_data.is_assembly_state_set = TRUE;
4960 1.1 skrll }
4961 1.1 skrll
4962 1.1 skrll
4963 1.1 skrll static bfd_boolean
4964 1.1 skrll relaxable_section (asection *sec)
4965 1.1 skrll {
4966 1.1 skrll return ((sec->flags & SEC_DEBUGGING) == 0
4967 1.1 skrll && strcmp (sec->name, ".eh_frame") != 0);
4968 1.1 skrll }
4969 1.1 skrll
4970 1.1 skrll
4971 1.1 skrll static void
4972 1.1 skrll xtensa_mark_frags_for_org (void)
4973 1.1 skrll {
4974 1.1 skrll segT *seclist;
4975 1.1 skrll
4976 1.1 skrll /* Walk over each fragment of all of the current segments. If we find
4977 1.1 skrll a .org frag in any of the segments, mark all frags prior to it as
4978 1.1 skrll "no transform", which will prevent linker optimizations from messing
4979 1.1 skrll up the .org distance. This should be done after
4980 1.1 skrll xtensa_find_unmarked_state_frags, because we don't want to worry here
4981 1.1 skrll about that function trashing the data we save here. */
4982 1.1 skrll
4983 1.1.1.8 christos for (seclist = &stdoutput->sections;
4984 1.1 skrll seclist && *seclist;
4985 1.1 skrll seclist = &(*seclist)->next)
4986 1.1 skrll {
4987 1.1 skrll segT sec = *seclist;
4988 1.1 skrll segment_info_type *seginfo;
4989 1.1 skrll fragS *fragP;
4990 1.1 skrll flagword flags;
4991 1.1 skrll flags = bfd_section_flags (sec);
4992 1.1 skrll if (flags & SEC_DEBUGGING)
4993 1.1 skrll continue;
4994 1.1 skrll if (!(flags & SEC_ALLOC))
4995 1.1 skrll continue;
4996 1.1 skrll
4997 1.1 skrll seginfo = seg_info (sec);
4998 1.1 skrll if (seginfo && seginfo->frchainP)
4999 1.1 skrll {
5000 1.1 skrll fragS *last_fragP = seginfo->frchainP->frch_root;
5001 1.1 skrll for (fragP = seginfo->frchainP->frch_root; fragP;
5002 1.1 skrll fragP = fragP->fr_next)
5003 1.1 skrll {
5004 1.1 skrll /* cvt_frag_to_fill has changed the fr_type of org frags to
5005 1.1 skrll rs_fill, so use the value as cached in rs_subtype here. */
5006 1.1 skrll if (fragP->fr_subtype == RELAX_ORG)
5007 1.1 skrll {
5008 1.1 skrll while (last_fragP != fragP->fr_next)
5009 1.1 skrll {
5010 1.1 skrll last_fragP->tc_frag_data.is_no_transform = TRUE;
5011 1.1 skrll last_fragP = last_fragP->fr_next;
5012 1.1 skrll }
5013 1.1 skrll }
5014 1.1 skrll }
5015 1.1 skrll }
5016 1.1 skrll }
5017 1.1 skrll }
5018 1.1 skrll
5019 1.1 skrll
5020 1.1 skrll static void
5021 1.1 skrll xtensa_find_unmarked_state_frags (void)
5022 1.1 skrll {
5023 1.1 skrll segT *seclist;
5024 1.1 skrll
5025 1.1 skrll /* Walk over each fragment of all of the current segments. For each
5026 1.1 skrll unmarked fragment, mark it with the same info as the previous
5027 1.1 skrll fragment. */
5028 1.1.1.8 christos for (seclist = &stdoutput->sections;
5029 1.1 skrll seclist && *seclist;
5030 1.1 skrll seclist = &(*seclist)->next)
5031 1.1 skrll {
5032 1.1 skrll segT sec = *seclist;
5033 1.1 skrll segment_info_type *seginfo;
5034 1.1 skrll fragS *fragP;
5035 1.1 skrll flagword flags;
5036 1.1 skrll flags = bfd_section_flags (sec);
5037 1.1 skrll if (flags & SEC_DEBUGGING)
5038 1.1 skrll continue;
5039 1.1 skrll if (!(flags & SEC_ALLOC))
5040 1.1 skrll continue;
5041 1.1 skrll
5042 1.1 skrll seginfo = seg_info (sec);
5043 1.1 skrll if (seginfo && seginfo->frchainP)
5044 1.1 skrll {
5045 1.1 skrll fragS *last_fragP = 0;
5046 1.1 skrll for (fragP = seginfo->frchainP->frch_root; fragP;
5047 1.1 skrll fragP = fragP->fr_next)
5048 1.1 skrll {
5049 1.1 skrll if (fragP->fr_fix != 0
5050 1.1 skrll && !fragP->tc_frag_data.is_assembly_state_set)
5051 1.1 skrll {
5052 1.1 skrll if (last_fragP == 0)
5053 1.1 skrll {
5054 1.1 skrll as_warn_where (fragP->fr_file, fragP->fr_line,
5055 1.1 skrll _("assembly state not set for first frag in section %s"),
5056 1.1 skrll sec->name);
5057 1.1 skrll }
5058 1.1 skrll else
5059 1.1 skrll {
5060 1.1 skrll fragP->tc_frag_data.is_assembly_state_set = TRUE;
5061 1.1 skrll fragP->tc_frag_data.is_no_density =
5062 1.1 skrll last_fragP->tc_frag_data.is_no_density;
5063 1.1 skrll fragP->tc_frag_data.is_no_transform =
5064 1.1 skrll last_fragP->tc_frag_data.is_no_transform;
5065 1.1 skrll fragP->tc_frag_data.use_longcalls =
5066 1.1 skrll last_fragP->tc_frag_data.use_longcalls;
5067 1.1 skrll fragP->tc_frag_data.use_absolute_literals =
5068 1.1 skrll last_fragP->tc_frag_data.use_absolute_literals;
5069 1.1 skrll }
5070 1.1 skrll }
5071 1.1 skrll if (fragP->tc_frag_data.is_assembly_state_set)
5072 1.1 skrll last_fragP = fragP;
5073 1.1 skrll }
5074 1.1 skrll }
5075 1.1 skrll }
5076 1.1.1.8 christos }
5077 1.1 skrll
5078 1.1 skrll
5079 1.1 skrll static void
5080 1.1 skrll xtensa_find_unaligned_branch_targets (bfd *abfd ATTRIBUTE_UNUSED,
5081 1.1 skrll asection *sec,
5082 1.1 skrll void *unused ATTRIBUTE_UNUSED)
5083 1.1 skrll {
5084 1.1 skrll flagword flags = bfd_section_flags (sec);
5085 1.1 skrll segment_info_type *seginfo = seg_info (sec);
5086 1.1 skrll fragS *frag = seginfo->frchainP->frch_root;
5087 1.1 skrll
5088 1.1 skrll if (flags & SEC_CODE)
5089 1.1 skrll {
5090 1.1 skrll xtensa_isa isa = xtensa_default_isa;
5091 1.1 skrll xtensa_insnbuf insnbuf = xtensa_insnbuf_alloc (isa);
5092 1.1 skrll while (frag != NULL)
5093 1.1 skrll {
5094 1.1 skrll if (frag->tc_frag_data.is_branch_target)
5095 1.1 skrll {
5096 1.1 skrll int op_size;
5097 1.1 skrll addressT branch_align, frag_addr;
5098 1.1 skrll xtensa_format fmt;
5099 1.1 skrll
5100 1.1 skrll xtensa_insnbuf_from_chars
5101 1.1 skrll (isa, insnbuf, (unsigned char *) frag->fr_literal, 0);
5102 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
5103 1.1 skrll op_size = xtensa_format_length (isa, fmt);
5104 1.1 skrll branch_align = 1 << branch_align_power (sec);
5105 1.1 skrll frag_addr = frag->fr_address % branch_align;
5106 1.1 skrll if (frag_addr + op_size > branch_align)
5107 1.1 skrll as_warn_where (frag->fr_file, frag->fr_line,
5108 1.1 skrll _("unaligned branch target: %d bytes at 0x%lx"),
5109 1.1 skrll op_size, (long) frag->fr_address);
5110 1.1 skrll }
5111 1.1 skrll frag = frag->fr_next;
5112 1.1 skrll }
5113 1.1 skrll xtensa_insnbuf_free (isa, insnbuf);
5114 1.1 skrll }
5115 1.1.1.8 christos }
5116 1.1 skrll
5117 1.1 skrll
5118 1.1 skrll static void
5119 1.1 skrll xtensa_find_unaligned_loops (bfd *abfd ATTRIBUTE_UNUSED,
5120 1.1 skrll asection *sec,
5121 1.1 skrll void *unused ATTRIBUTE_UNUSED)
5122 1.1 skrll {
5123 1.1 skrll flagword flags = bfd_section_flags (sec);
5124 1.1 skrll segment_info_type *seginfo = seg_info (sec);
5125 1.1 skrll fragS *frag = seginfo->frchainP->frch_root;
5126 1.1 skrll xtensa_isa isa = xtensa_default_isa;
5127 1.1 skrll
5128 1.1 skrll if (flags & SEC_CODE)
5129 1.1 skrll {
5130 1.1 skrll xtensa_insnbuf insnbuf = xtensa_insnbuf_alloc (isa);
5131 1.1.1.2 christos while (frag != NULL)
5132 1.1.1.2 christos {
5133 1.1.1.4 christos if (frag->tc_frag_data.is_first_loop_insn)
5134 1.1.1.2 christos {
5135 1.1.1.2 christos int op_size;
5136 1.1.1.2 christos addressT frag_addr;
5137 1.1.1.2 christos xtensa_format fmt;
5138 1.1.1.2 christos
5139 1.1.1.2 christos if (frag->fr_fix == 0)
5140 1.1.1.2 christos frag = next_non_empty_frag (frag);
5141 1.1.1.4 christos
5142 1.1.1.2 christos if (frag)
5143 1.1.1.2 christos {
5144 1.1.1.2 christos xtensa_insnbuf_from_chars
5145 1.1.1.2 christos (isa, insnbuf, (unsigned char *) frag->fr_literal, 0);
5146 1.1.1.2 christos fmt = xtensa_format_decode (isa, insnbuf);
5147 1.1 skrll op_size = xtensa_format_length (isa, fmt);
5148 1.1 skrll frag_addr = frag->fr_address % xtensa_fetch_width;
5149 1.1 skrll
5150 1.1 skrll if (frag_addr + op_size > xtensa_fetch_width)
5151 1.1 skrll as_warn_where (frag->fr_file, frag->fr_line,
5152 1.1 skrll _("unaligned loop: %d bytes at 0x%lx"),
5153 1.1 skrll op_size, (long) frag->fr_address);
5154 1.1 skrll }
5155 1.1 skrll }
5156 1.1 skrll frag = frag->fr_next;
5157 1.1 skrll }
5158 1.1 skrll xtensa_insnbuf_free (isa, insnbuf);
5159 1.1 skrll }
5160 1.1 skrll }
5161 1.1 skrll
5162 1.1 skrll
5163 1.1 skrll static int
5164 1.1 skrll xg_apply_fix_value (fixS *fixP, valueT val)
5165 1.1 skrll {
5166 1.1 skrll xtensa_isa isa = xtensa_default_isa;
5167 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
5168 1.1 skrll static xtensa_insnbuf slotbuf = NULL;
5169 1.1 skrll xtensa_format fmt;
5170 1.1 skrll int slot;
5171 1.1 skrll bfd_boolean alt_reloc;
5172 1.1 skrll xtensa_opcode opcode;
5173 1.1 skrll char *const fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
5174 1.1 skrll
5175 1.1 skrll if (decode_reloc (fixP->fx_r_type, &slot, &alt_reloc)
5176 1.1 skrll || alt_reloc)
5177 1.1 skrll as_fatal (_("unexpected fix"));
5178 1.1 skrll
5179 1.1 skrll if (!insnbuf)
5180 1.1 skrll {
5181 1.1 skrll insnbuf = xtensa_insnbuf_alloc (isa);
5182 1.1 skrll slotbuf = xtensa_insnbuf_alloc (isa);
5183 1.1 skrll }
5184 1.1 skrll
5185 1.1 skrll xtensa_insnbuf_from_chars (isa, insnbuf, (unsigned char *) fixpos, 0);
5186 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
5187 1.1 skrll if (fmt == XTENSA_UNDEFINED)
5188 1.1 skrll as_fatal (_("undecodable fix"));
5189 1.1 skrll xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
5190 1.1 skrll opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
5191 1.1 skrll if (opcode == XTENSA_UNDEFINED)
5192 1.1 skrll as_fatal (_("undecodable fix"));
5193 1.1 skrll
5194 1.1 skrll /* CONST16 immediates are not PC-relative, despite the fact that we
5195 1.1 skrll reuse the normal PC-relative operand relocations for the low part
5196 1.1 skrll of a CONST16 operand. */
5197 1.1 skrll if (opcode == xtensa_const16_opcode)
5198 1.1 skrll return 0;
5199 1.1 skrll
5200 1.1 skrll xtensa_insnbuf_set_operand (slotbuf, fmt, slot, opcode,
5201 1.1 skrll get_relaxable_immed (opcode), val,
5202 1.1 skrll fixP->fx_file, fixP->fx_line);
5203 1.1 skrll
5204 1.1 skrll xtensa_format_set_slot (isa, fmt, slot, insnbuf, slotbuf);
5205 1.1 skrll xtensa_insnbuf_to_chars (isa, insnbuf, (unsigned char *) fixpos, 0);
5206 1.1 skrll
5207 1.1 skrll return 1;
5208 1.1 skrll }
5209 1.1 skrll
5210 1.1 skrll
5211 1.1 skrll /* External Functions and Other GAS Hooks. */
5213 1.1 skrll
5214 1.1 skrll const char *
5215 1.1 skrll xtensa_target_format (void)
5216 1.1 skrll {
5217 1.1 skrll return (target_big_endian ? "elf32-xtensa-be" : "elf32-xtensa-le");
5218 1.1 skrll }
5219 1.1 skrll
5220 1.1 skrll
5221 1.1 skrll void
5222 1.1 skrll xtensa_file_arch_init (bfd *abfd)
5223 1.1 skrll {
5224 1.1 skrll bfd_set_private_flags (abfd, 0x100 | 0x200);
5225 1.1 skrll }
5226 1.1 skrll
5227 1.1 skrll
5228 1.1.1.6 christos void
5229 1.1.1.6 christos md_number_to_chars (char *buf, valueT val, int n)
5230 1.1.1.6 christos {
5231 1.1.1.6 christos if (target_big_endian)
5232 1.1.1.6 christos number_to_chars_bigendian (buf, val, n);
5233 1.1.1.6 christos else
5234 1.1.1.6 christos number_to_chars_littleendian (buf, val, n);
5235 1.1.1.6 christos }
5236 1.1.1.6 christos
5237 1.1.1.6 christos static void
5238 1.1.1.6 christos xg_init_global_config (void)
5239 1.1.1.6 christos {
5240 1.1.1.6 christos target_big_endian = XCHAL_HAVE_BE;
5241 1.1.1.6 christos
5242 1.1.1.6 christos density_supported = XCHAL_HAVE_DENSITY;
5243 1.1.1.6 christos absolute_literals_supported = XSHAL_USE_ABSOLUTE_LITERALS;
5244 1.1.1.6 christos xtensa_fetch_width = XCHAL_INST_FETCH_WIDTH;
5245 1.1.1.6 christos
5246 1.1 skrll directive_state[directive_density] = XCHAL_HAVE_DENSITY;
5247 1.1 skrll directive_state[directive_absolute_literals] = XSHAL_USE_ABSOLUTE_LITERALS;
5248 1.1 skrll }
5249 1.1 skrll
5250 1.1 skrll void
5251 1.1 skrll xtensa_init (int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED)
5252 1.1 skrll {
5253 1.1 skrll xg_init_global_config ();
5254 1.1 skrll }
5255 1.1 skrll
5256 1.1 skrll /* This function is called once, at assembler startup time. It should
5257 1.1.1.2 christos set up all the tables, etc. that the MD part of the assembler will
5258 1.1 skrll need. */
5259 1.1 skrll
5260 1.1 skrll void
5261 1.1 skrll md_begin (void)
5262 1.1.1.8 christos {
5263 1.1 skrll segT current_section = now_seg;
5264 1.1 skrll int current_subsec = now_subseg;
5265 1.1 skrll xtensa_isa isa;
5266 1.1 skrll int i;
5267 1.1 skrll
5268 1.1 skrll xtensa_default_isa = xtensa_isa_init (0, 0);
5269 1.1 skrll isa = xtensa_default_isa;
5270 1.1 skrll
5271 1.1 skrll linkrelax = opt_linkrelax;
5272 1.1 skrll
5273 1.1 skrll /* Set up the literal sections. */
5274 1.1 skrll memset (&default_lit_sections, 0, sizeof (default_lit_sections));
5275 1.1 skrll
5276 1.1 skrll subseg_set (current_section, current_subsec);
5277 1.1 skrll
5278 1.1 skrll xtensa_addi_opcode = xtensa_opcode_lookup (isa, "addi");
5279 1.1 skrll xtensa_addmi_opcode = xtensa_opcode_lookup (isa, "addmi");
5280 1.1 skrll xtensa_call0_opcode = xtensa_opcode_lookup (isa, "call0");
5281 1.1 skrll xtensa_call4_opcode = xtensa_opcode_lookup (isa, "call4");
5282 1.1 skrll xtensa_call8_opcode = xtensa_opcode_lookup (isa, "call8");
5283 1.1 skrll xtensa_call12_opcode = xtensa_opcode_lookup (isa, "call12");
5284 1.1 skrll xtensa_callx0_opcode = xtensa_opcode_lookup (isa, "callx0");
5285 1.1.1.2 christos xtensa_callx4_opcode = xtensa_opcode_lookup (isa, "callx4");
5286 1.1 skrll xtensa_callx8_opcode = xtensa_opcode_lookup (isa, "callx8");
5287 1.1 skrll xtensa_callx12_opcode = xtensa_opcode_lookup (isa, "callx12");
5288 1.1 skrll xtensa_const16_opcode = xtensa_opcode_lookup (isa, "const16");
5289 1.1 skrll xtensa_entry_opcode = xtensa_opcode_lookup (isa, "entry");
5290 1.1 skrll xtensa_extui_opcode = xtensa_opcode_lookup (isa, "extui");
5291 1.1 skrll xtensa_movi_opcode = xtensa_opcode_lookup (isa, "movi");
5292 1.1 skrll xtensa_movi_n_opcode = xtensa_opcode_lookup (isa, "movi.n");
5293 1.1 skrll xtensa_isync_opcode = xtensa_opcode_lookup (isa, "isync");
5294 1.1 skrll xtensa_j_opcode = xtensa_opcode_lookup (isa, "j");
5295 1.1 skrll xtensa_jx_opcode = xtensa_opcode_lookup (isa, "jx");
5296 1.1 skrll xtensa_l32r_opcode = xtensa_opcode_lookup (isa, "l32r");
5297 1.1 skrll xtensa_loop_opcode = xtensa_opcode_lookup (isa, "loop");
5298 1.1 skrll xtensa_loopnez_opcode = xtensa_opcode_lookup (isa, "loopnez");
5299 1.1 skrll xtensa_loopgtz_opcode = xtensa_opcode_lookup (isa, "loopgtz");
5300 1.1 skrll xtensa_nop_opcode = xtensa_opcode_lookup (isa, "nop");
5301 1.1.1.4 christos xtensa_nop_n_opcode = xtensa_opcode_lookup (isa, "nop.n");
5302 1.1.1.2 christos xtensa_or_opcode = xtensa_opcode_lookup (isa, "or");
5303 1.1.1.2 christos xtensa_ret_opcode = xtensa_opcode_lookup (isa, "ret");
5304 1.1.1.2 christos xtensa_ret_n_opcode = xtensa_opcode_lookup (isa, "ret.n");
5305 1.1.1.2 christos xtensa_retw_opcode = xtensa_opcode_lookup (isa, "retw");
5306 1.1.1.2 christos xtensa_retw_n_opcode = xtensa_opcode_lookup (isa, "retw.n");
5307 1.1.1.2 christos xtensa_rsr_lcount_opcode = xtensa_opcode_lookup (isa, "rsr.lcount");
5308 1.1.1.2 christos xtensa_waiti_opcode = xtensa_opcode_lookup (isa, "waiti");
5309 1.1.1.2 christos
5310 1.1 skrll for (i = 0; i < xtensa_isa_num_formats (isa); i++)
5311 1.1 skrll {
5312 1.1 skrll int format_slots = xtensa_format_num_slots (isa, i);
5313 1.1 skrll if (format_slots > config_max_slots)
5314 1.1 skrll config_max_slots = format_slots;
5315 1.1 skrll }
5316 1.1 skrll
5317 1.1.1.8 christos xg_init_vinsn (&cur_vinsn);
5318 1.1.1.8 christos
5319 1.1.1.8 christos xtensa_num_pipe_stages = xtensa_isa_num_pipe_stages (isa);
5320 1.1 skrll
5321 1.1 skrll init_op_placement_info_table ();
5322 1.1 skrll
5323 1.1 skrll /* Set up the assembly state. */
5324 1.1 skrll if (!frag_now->tc_frag_data.is_assembly_state_set)
5325 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
5326 1.1 skrll
5327 1.1 skrll if (!use_literal_section)
5328 1.1 skrll xtensa_mark_literal_pool_location ();
5329 1.1 skrll }
5330 1.1 skrll
5331 1.1 skrll
5332 1.1 skrll /* TC_INIT_FIX_DATA hook */
5333 1.1 skrll
5334 1.1 skrll void
5335 1.1 skrll xtensa_init_fix_data (fixS *x)
5336 1.1 skrll {
5337 1.1 skrll x->tc_fix_data.slot = 0;
5338 1.1 skrll x->tc_fix_data.X_add_symbol = NULL;
5339 1.1 skrll x->tc_fix_data.X_add_number = 0;
5340 1.1 skrll }
5341 1.1 skrll
5342 1.1 skrll
5343 1.1 skrll /* tc_frob_label hook */
5344 1.1 skrll
5345 1.1 skrll void
5346 1.1 skrll xtensa_frob_label (symbolS *sym)
5347 1.1 skrll {
5348 1.1 skrll float freq;
5349 1.1 skrll
5350 1.1 skrll if (cur_vinsn.inside_bundle)
5351 1.1 skrll {
5352 1.1 skrll as_bad (_("labels are not valid inside bundles"));
5353 1.1 skrll return;
5354 1.1 skrll }
5355 1.1 skrll
5356 1.1 skrll freq = get_subseg_target_freq (now_seg, now_subseg);
5357 1.1 skrll
5358 1.1 skrll /* Since the label was already attached to a frag associated with the
5359 1.1 skrll previous basic block, it now needs to be reset to the current frag. */
5360 1.1 skrll symbol_set_frag (sym, frag_now);
5361 1.1 skrll S_SET_VALUE (sym, (valueT) frag_now_fix ());
5362 1.1 skrll
5363 1.1 skrll if (generating_literals)
5364 1.1 skrll xtensa_add_literal_sym (sym);
5365 1.1 skrll else
5366 1.1 skrll xtensa_add_insn_label (sym);
5367 1.1 skrll
5368 1.1 skrll if (symbol_get_tc (sym)->is_loop_target)
5369 1.1 skrll {
5370 1.1 skrll if ((get_last_insn_flags (now_seg, now_subseg)
5371 1.1 skrll & FLAG_IS_BAD_LOOPEND) != 0)
5372 1.1 skrll as_bad (_("invalid last instruction for a zero-overhead loop"));
5373 1.1 skrll
5374 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
5375 1.1 skrll frag_var (rs_machine_dependent, 4, 4, RELAX_LOOP_END,
5376 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
5377 1.1 skrll
5378 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
5379 1.1 skrll xtensa_move_labels (frag_now, 0);
5380 1.1.1.2 christos }
5381 1.1.1.2 christos
5382 1.1.1.2 christos /* No target aligning in the absolute section. */
5383 1.1.1.2 christos if (now_seg != absolute_section
5384 1.1.1.2 christos && !is_unaligned_label (sym)
5385 1.1.1.2 christos && !generating_literals)
5386 1.1.1.2 christos {
5387 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
5388 1.1 skrll
5389 1.1 skrll if (do_align_targets ())
5390 1.1 skrll frag_var (rs_machine_dependent, 0, (int) freq,
5391 1.1 skrll RELAX_DESIRE_ALIGN_IF_TARGET, frag_now->fr_symbol,
5392 1.1 skrll frag_now->fr_offset, NULL);
5393 1.1 skrll else
5394 1.1 skrll frag_var (rs_fill, 0, 0, frag_now->fr_subtype,
5395 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
5396 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
5397 1.1 skrll xtensa_move_labels (frag_now, 0);
5398 1.1 skrll }
5399 1.1 skrll
5400 1.1 skrll /* We need to mark the following properties even if we aren't aligning. */
5401 1.1 skrll
5402 1.1 skrll /* If the label is already known to be a branch target, i.e., a
5403 1.1 skrll forward branch, mark the frag accordingly. Backward branches
5404 1.1 skrll are handled by xg_add_branch_and_loop_targets. */
5405 1.1 skrll if (symbol_get_tc (sym)->is_branch_target)
5406 1.1 skrll symbol_get_frag (sym)->tc_frag_data.is_branch_target = TRUE;
5407 1.1 skrll
5408 1.1 skrll /* Loops only go forward, so they can be identified here. */
5409 1.1 skrll if (symbol_get_tc (sym)->is_loop_target)
5410 1.1 skrll symbol_get_frag (sym)->tc_frag_data.is_loop_target = TRUE;
5411 1.1 skrll
5412 1.1 skrll dwarf2_emit_label (sym);
5413 1.1 skrll }
5414 1.1 skrll
5415 1.1 skrll
5416 1.1 skrll /* tc_unrecognized_line hook */
5417 1.1 skrll
5418 1.1 skrll int
5419 1.1 skrll xtensa_unrecognized_line (int ch)
5420 1.1 skrll {
5421 1.1 skrll switch (ch)
5422 1.1 skrll {
5423 1.1 skrll case '{' :
5424 1.1 skrll if (cur_vinsn.inside_bundle == 0)
5425 1.1 skrll {
5426 1.1 skrll /* PR8110: Cannot emit line number info inside a FLIX bundle
5427 1.1 skrll when using --gstabs. Temporarily disable debug info. */
5428 1.1 skrll generate_lineno_debug ();
5429 1.1 skrll if (debug_type == DEBUG_STABS)
5430 1.1 skrll {
5431 1.1 skrll xt_saved_debug_type = debug_type;
5432 1.1 skrll debug_type = DEBUG_NONE;
5433 1.1 skrll }
5434 1.1 skrll
5435 1.1 skrll cur_vinsn.inside_bundle = 1;
5436 1.1 skrll }
5437 1.1 skrll else
5438 1.1 skrll {
5439 1.1 skrll as_bad (_("extra opening brace"));
5440 1.1 skrll return 0;
5441 1.1 skrll }
5442 1.1 skrll break;
5443 1.1 skrll
5444 1.1 skrll case '}' :
5445 1.1 skrll if (cur_vinsn.inside_bundle)
5446 1.1 skrll finish_vinsn (&cur_vinsn);
5447 1.1 skrll else
5448 1.1 skrll {
5449 1.1 skrll as_bad (_("extra closing brace"));
5450 1.1 skrll return 0;
5451 1.1 skrll }
5452 1.1 skrll break;
5453 1.1 skrll default:
5454 1.1 skrll as_bad (_("syntax error"));
5455 1.1 skrll return 0;
5456 1.1 skrll }
5457 1.1 skrll return 1;
5458 1.1 skrll }
5459 1.1 skrll
5460 1.1 skrll
5461 1.1 skrll /* md_flush_pending_output hook */
5462 1.1 skrll
5463 1.1 skrll void
5464 1.1 skrll xtensa_flush_pending_output (void)
5465 1.1 skrll {
5466 1.1 skrll /* This line fixes a bug where automatically generated gstabs info
5467 1.1 skrll separates a function label from its entry instruction, ending up
5468 1.1 skrll with the literal position between the function label and the entry
5469 1.1 skrll instruction and crashing code. It only happens with --gstabs and
5470 1.1 skrll --text-section-literals, and when several other obscure relaxation
5471 1.1 skrll conditions are met. */
5472 1.1 skrll if (outputting_stabs_line_debug)
5473 1.1 skrll return;
5474 1.1 skrll
5475 1.1 skrll if (cur_vinsn.inside_bundle)
5476 1.1 skrll as_bad (_("missing closing brace"));
5477 1.1 skrll
5478 1.1 skrll /* If there is a non-zero instruction fragment, close it. */
5479 1.1 skrll if (frag_now_fix () != 0 && frag_now->tc_frag_data.is_insn)
5480 1.1 skrll {
5481 1.1 skrll frag_wane (frag_now);
5482 1.1 skrll frag_new (0);
5483 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
5484 1.1 skrll }
5485 1.1 skrll frag_now->tc_frag_data.is_insn = FALSE;
5486 1.1 skrll
5487 1.1 skrll xtensa_clear_insn_labels ();
5488 1.1 skrll }
5489 1.1 skrll
5490 1.1 skrll
5491 1.1 skrll /* We had an error while parsing an instruction. The string might look
5492 1.1 skrll like this: "insn arg1, arg2 }". If so, we need to see the closing
5493 1.1 skrll brace and reset some fields. Otherwise, the vinsn never gets closed
5494 1.1 skrll and the num_slots field will grow past the end of the array of slots,
5495 1.1 skrll and bad things happen. */
5496 1.1 skrll
5497 1.1 skrll static void
5498 1.1 skrll error_reset_cur_vinsn (void)
5499 1.1 skrll {
5500 1.1 skrll if (cur_vinsn.inside_bundle)
5501 1.1 skrll {
5502 1.1 skrll if (*input_line_pointer == '}'
5503 1.1 skrll || *(input_line_pointer - 1) == '}'
5504 1.1 skrll || *(input_line_pointer - 2) == '}')
5505 1.1 skrll xg_clear_vinsn (&cur_vinsn);
5506 1.1 skrll }
5507 1.1 skrll }
5508 1.1 skrll
5509 1.1 skrll
5510 1.1 skrll void
5511 1.1 skrll md_assemble (char *str)
5512 1.1 skrll {
5513 1.1 skrll xtensa_isa isa = xtensa_default_isa;
5514 1.1 skrll char *opname;
5515 1.1 skrll unsigned opnamelen;
5516 1.1.1.5 christos bfd_boolean has_underbar = FALSE;
5517 1.1 skrll char *arg_strings[MAX_INSN_ARGS];
5518 1.1 skrll int num_args;
5519 1.1 skrll TInsn orig_insn; /* Original instruction from the input. */
5520 1.1 skrll
5521 1.1 skrll tinsn_init (&orig_insn);
5522 1.1 skrll
5523 1.1 skrll /* Split off the opcode. */
5524 1.1 skrll opnamelen = strspn (str, "abcdefghijklmnopqrstuvwxyz_/0123456789.");
5525 1.1 skrll opname = xstrndup (str, opnamelen);
5526 1.1 skrll
5527 1.1 skrll num_args = tokenize_arguments (arg_strings, str + opnamelen);
5528 1.1 skrll if (num_args == -1)
5529 1.1 skrll {
5530 1.1 skrll as_bad (_("syntax error"));
5531 1.1 skrll return;
5532 1.1 skrll }
5533 1.1 skrll
5534 1.1 skrll if (xg_translate_idioms (&opname, &num_args, arg_strings))
5535 1.1 skrll return;
5536 1.1 skrll
5537 1.1 skrll /* Check for an underbar prefix. */
5538 1.1 skrll if (*opname == '_')
5539 1.1 skrll {
5540 1.1.1.6 christos has_underbar = TRUE;
5541 1.1 skrll opname += 1;
5542 1.1 skrll }
5543 1.1 skrll
5544 1.1 skrll orig_insn.insn_type = ITYPE_INSN;
5545 1.1 skrll orig_insn.ntok = 0;
5546 1.1 skrll orig_insn.is_specific_opcode = (has_underbar || !use_transform ());
5547 1.1 skrll orig_insn.opcode = xtensa_opcode_lookup (isa, opname);
5548 1.1 skrll
5549 1.1 skrll /* Special case: Check for "CALLXn.TLS" pseudo op. If found, grab its
5550 1.1 skrll extra argument and set the opcode to "CALLXn". */
5551 1.1 skrll if (orig_insn.opcode == XTENSA_UNDEFINED
5552 1.1 skrll && strncasecmp (opname, "callx", 5) == 0)
5553 1.1 skrll {
5554 1.1 skrll unsigned long window_size;
5555 1.1 skrll char *suffix;
5556 1.1 skrll
5557 1.1 skrll window_size = strtoul (opname + 5, &suffix, 10);
5558 1.1 skrll if (suffix != opname + 5
5559 1.1 skrll && (window_size == 0
5560 1.1 skrll || window_size == 4
5561 1.1 skrll || window_size == 8
5562 1.1 skrll || window_size == 12)
5563 1.1 skrll && strcasecmp (suffix, ".tls") == 0)
5564 1.1 skrll {
5565 1.1 skrll switch (window_size)
5566 1.1 skrll {
5567 1.1 skrll case 0: orig_insn.opcode = xtensa_callx0_opcode; break;
5568 1.1 skrll case 4: orig_insn.opcode = xtensa_callx4_opcode; break;
5569 1.1 skrll case 8: orig_insn.opcode = xtensa_callx8_opcode; break;
5570 1.1.1.2 christos case 12: orig_insn.opcode = xtensa_callx12_opcode; break;
5571 1.1 skrll }
5572 1.1 skrll
5573 1.1 skrll if (num_args != 2)
5574 1.1 skrll as_bad (_("wrong number of operands for '%s'"), opname);
5575 1.1.1.2 christos else
5576 1.1 skrll {
5577 1.1 skrll bfd_reloc_code_real_type reloc;
5578 1.1 skrll char *old_input_line_pointer;
5579 1.1 skrll expressionS *tok = &orig_insn.extra_arg;
5580 1.1 skrll
5581 1.1 skrll old_input_line_pointer = input_line_pointer;
5582 1.1 skrll input_line_pointer = arg_strings[num_args - 1];
5583 1.1 skrll
5584 1.1 skrll expression (tok);
5585 1.1 skrll if (tok->X_op == O_symbol
5586 1.1 skrll && ((reloc = xtensa_elf_suffix (&input_line_pointer, tok))
5587 1.1 skrll == BFD_RELOC_XTENSA_TLS_CALL))
5588 1.1 skrll tok->X_op = map_suffix_reloc_to_operator (reloc);
5589 1.1.1.6 christos else
5590 1.1.1.2 christos as_bad (_("bad relocation expression for '%s'"), opname);
5591 1.1.1.2 christos
5592 1.1.1.2 christos input_line_pointer = old_input_line_pointer;
5593 1.1.1.2 christos num_args -= 1;
5594 1.1.1.2 christos }
5595 1.1.1.2 christos }
5596 1.1.1.2 christos }
5597 1.1.1.2 christos
5598 1.1.1.2 christos /* Special case: Check for "j.l" pseudo op. */
5599 1.1.1.2 christos if (orig_insn.opcode == XTENSA_UNDEFINED
5600 1.1.1.2 christos && strncasecmp (opname, "j.l", 3) == 0)
5601 1.1.1.2 christos {
5602 1.1.1.2 christos if (num_args != 2)
5603 1.1.1.2 christos as_bad (_("wrong number of operands for '%s'"), opname);
5604 1.1.1.2 christos else
5605 1.1.1.2 christos {
5606 1.1.1.2 christos char *old_input_line_pointer;
5607 1.1.1.2 christos expressionS *tok = &orig_insn.extra_arg;
5608 1.1.1.2 christos
5609 1.1.1.2 christos old_input_line_pointer = input_line_pointer;
5610 1.1.1.2 christos input_line_pointer = arg_strings[num_args - 1];
5611 1.1 skrll
5612 1.1 skrll expression_maybe_register (xtensa_jx_opcode, 0, tok);
5613 1.1 skrll input_line_pointer = old_input_line_pointer;
5614 1.1 skrll
5615 1.1 skrll num_args -= 1;
5616 1.1 skrll orig_insn.opcode = xtensa_j_opcode;
5617 1.1 skrll }
5618 1.1 skrll }
5619 1.1 skrll
5620 1.1 skrll if (orig_insn.opcode == XTENSA_UNDEFINED)
5621 1.1 skrll {
5622 1.1 skrll xtensa_format fmt = xtensa_format_lookup (isa, opname);
5623 1.1 skrll if (fmt == XTENSA_UNDEFINED)
5624 1.1 skrll {
5625 1.1 skrll as_bad (_("unknown opcode or format name '%s'"), opname);
5626 1.1 skrll error_reset_cur_vinsn ();
5627 1.1 skrll return;
5628 1.1 skrll }
5629 1.1 skrll if (!cur_vinsn.inside_bundle)
5630 1.1 skrll {
5631 1.1 skrll as_bad (_("format names only valid inside bundles"));
5632 1.1 skrll error_reset_cur_vinsn ();
5633 1.1 skrll return;
5634 1.1 skrll }
5635 1.1 skrll if (cur_vinsn.format != XTENSA_UNDEFINED)
5636 1.1 skrll as_warn (_("multiple formats specified for one bundle; using '%s'"),
5637 1.1 skrll opname);
5638 1.1 skrll cur_vinsn.format = fmt;
5639 1.1 skrll free (has_underbar ? opname - 1 : opname);
5640 1.1 skrll error_reset_cur_vinsn ();
5641 1.1 skrll return;
5642 1.1 skrll }
5643 1.1 skrll
5644 1.1 skrll /* Parse the arguments. */
5645 1.1 skrll if (parse_arguments (&orig_insn, num_args, arg_strings))
5646 1.1 skrll {
5647 1.1 skrll as_bad (_("syntax error"));
5648 1.1 skrll error_reset_cur_vinsn ();
5649 1.1 skrll return;
5650 1.1 skrll }
5651 1.1 skrll
5652 1.1 skrll /* Free the opcode and argument strings, now that they've been parsed. */
5653 1.1 skrll free (has_underbar ? opname - 1 : opname);
5654 1.1 skrll opname = 0;
5655 1.1 skrll while (num_args-- > 0)
5656 1.1 skrll free (arg_strings[num_args]);
5657 1.1 skrll
5658 1.1 skrll /* Get expressions for invisible operands. */
5659 1.1 skrll if (get_invisible_operands (&orig_insn))
5660 1.1 skrll {
5661 1.1 skrll error_reset_cur_vinsn ();
5662 1.1 skrll return;
5663 1.1 skrll }
5664 1.1 skrll
5665 1.1 skrll /* Check for the right number and type of arguments. */
5666 1.1 skrll if (tinsn_check_arguments (&orig_insn))
5667 1.1 skrll {
5668 1.1 skrll error_reset_cur_vinsn ();
5669 1.1 skrll return;
5670 1.1 skrll }
5671 1.1 skrll
5672 1.1 skrll /* Record the line number for each TInsn, because a FLIX bundle may be
5673 1.1 skrll spread across multiple input lines and individual instructions may be
5674 1.1 skrll moved around in some cases. */
5675 1.1 skrll orig_insn.loc_directive_seen = dwarf2_loc_directive_seen;
5676 1.1 skrll dwarf2_where (&orig_insn.debug_line);
5677 1.1 skrll dwarf2_consume_line_info ();
5678 1.1 skrll
5679 1.1 skrll xg_add_branch_and_loop_targets (&orig_insn);
5680 1.1 skrll
5681 1.1 skrll /* Check that immediate value for ENTRY is >= 16. */
5682 1.1 skrll if (orig_insn.opcode == xtensa_entry_opcode && orig_insn.ntok >= 3)
5683 1.1 skrll {
5684 1.1 skrll expressionS *exp = &orig_insn.tok[2];
5685 1.1 skrll if (exp->X_op == O_constant && exp->X_add_number < 16)
5686 1.1 skrll as_warn (_("entry instruction with stack decrement < 16"));
5687 1.1 skrll }
5688 1.1 skrll
5689 1.1 skrll /* Finish it off:
5690 1.1 skrll assemble_tokens (opcode, tok, ntok);
5691 1.1 skrll expand the tokens from the orig_insn into the
5692 1.1 skrll stack of instructions that will not expand
5693 1.1 skrll unless required at relaxation time. */
5694 1.1 skrll
5695 1.1 skrll if (!cur_vinsn.inside_bundle)
5696 1.1 skrll emit_single_op (&orig_insn);
5697 1.1 skrll else /* We are inside a bundle. */
5698 1.1 skrll {
5699 1.1 skrll cur_vinsn.slots[cur_vinsn.num_slots] = orig_insn;
5700 1.1.1.4 christos cur_vinsn.num_slots++;
5701 1.1.1.4 christos if (*input_line_pointer == '}'
5702 1.1 skrll || *(input_line_pointer - 1) == '}'
5703 1.1 skrll || *(input_line_pointer - 2) == '}')
5704 1.1 skrll finish_vinsn (&cur_vinsn);
5705 1.1 skrll }
5706 1.1 skrll
5707 1.1 skrll /* We've just emitted a new instruction so clear the list of labels. */
5708 1.1 skrll xtensa_clear_insn_labels ();
5709 1.1 skrll
5710 1.1 skrll xtensa_check_frag_count ();
5711 1.1 skrll }
5712 1.1 skrll
5713 1.1 skrll
5714 1.1 skrll /* HANDLE_ALIGN hook */
5715 1.1 skrll
5716 1.1 skrll /* For a .align directive, we mark the previous block with the alignment
5717 1.1 skrll information. This will be placed in the object file in the
5718 1.1 skrll property section corresponding to this section. */
5719 1.1 skrll
5720 1.1 skrll void
5721 1.1 skrll xtensa_handle_align (fragS *fragP)
5722 1.1 skrll {
5723 1.1 skrll if (linkrelax
5724 1.1 skrll && ! fragP->tc_frag_data.is_literal
5725 1.1 skrll && (fragP->fr_type == rs_align
5726 1.1 skrll || fragP->fr_type == rs_align_code)
5727 1.1 skrll && fragP->fr_offset > 0
5728 1.1 skrll && now_seg != bss_section)
5729 1.1 skrll {
5730 1.1 skrll fragP->tc_frag_data.is_align = TRUE;
5731 1.1 skrll fragP->tc_frag_data.alignment = fragP->fr_offset;
5732 1.1 skrll }
5733 1.1 skrll
5734 1.1 skrll if (fragP->fr_type == rs_align_test)
5735 1.1 skrll {
5736 1.1 skrll int count;
5737 1.1 skrll count = fragP->fr_next->fr_address - fragP->fr_address - fragP->fr_fix;
5738 1.1 skrll if (count != 0)
5739 1.1 skrll as_bad_where (fragP->fr_file, fragP->fr_line,
5740 1.1 skrll _("unaligned entry instruction"));
5741 1.1 skrll }
5742 1.1 skrll
5743 1.1 skrll if (linkrelax && fragP->fr_type == rs_org)
5744 1.1 skrll fragP->fr_subtype = RELAX_ORG;
5745 1.1 skrll }
5746 1.1 skrll
5747 1.1 skrll
5748 1.1 skrll /* TC_FRAG_INIT hook */
5749 1.1 skrll
5750 1.1 skrll void
5751 1.1 skrll xtensa_frag_init (fragS *frag)
5752 1.1 skrll {
5753 1.1 skrll xtensa_set_frag_assembly_state (frag);
5754 1.1 skrll }
5755 1.1 skrll
5756 1.1 skrll
5757 1.1 skrll symbolS *
5758 1.1 skrll md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
5759 1.1 skrll {
5760 1.1 skrll return NULL;
5761 1.1 skrll }
5762 1.1 skrll
5763 1.1 skrll
5764 1.1 skrll /* Round up a section size to the appropriate boundary. */
5765 1.1 skrll
5766 1.1 skrll valueT
5767 1.1 skrll md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
5768 1.1 skrll {
5769 1.1 skrll return size; /* Byte alignment is fine. */
5770 1.1 skrll }
5771 1.1 skrll
5772 1.1 skrll
5773 1.1 skrll long
5774 1.1 skrll md_pcrel_from (fixS *fixP)
5775 1.1 skrll {
5776 1.1 skrll char *insn_p;
5777 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
5778 1.1 skrll static xtensa_insnbuf slotbuf = NULL;
5779 1.1 skrll int opnum;
5780 1.1 skrll uint32 opnd_value;
5781 1.1 skrll xtensa_opcode opcode;
5782 1.1 skrll xtensa_format fmt;
5783 1.1 skrll int slot;
5784 1.1 skrll xtensa_isa isa = xtensa_default_isa;
5785 1.1 skrll valueT addr = fixP->fx_where + fixP->fx_frag->fr_address;
5786 1.1 skrll bfd_boolean alt_reloc;
5787 1.1 skrll
5788 1.1 skrll if (fixP->fx_r_type == BFD_RELOC_XTENSA_ASM_EXPAND)
5789 1.1 skrll return 0;
5790 1.1 skrll
5791 1.1 skrll if (fixP->fx_r_type == BFD_RELOC_32_PCREL)
5792 1.1 skrll return addr;
5793 1.1 skrll
5794 1.1 skrll if (!insnbuf)
5795 1.1 skrll {
5796 1.1 skrll insnbuf = xtensa_insnbuf_alloc (isa);
5797 1.1 skrll slotbuf = xtensa_insnbuf_alloc (isa);
5798 1.1 skrll }
5799 1.1 skrll
5800 1.1 skrll insn_p = &fixP->fx_frag->fr_literal[fixP->fx_where];
5801 1.1 skrll xtensa_insnbuf_from_chars (isa, insnbuf, (unsigned char *) insn_p, 0);
5802 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
5803 1.1 skrll
5804 1.1 skrll if (fmt == XTENSA_UNDEFINED)
5805 1.1 skrll as_fatal (_("bad instruction format"));
5806 1.1 skrll
5807 1.1 skrll if (decode_reloc (fixP->fx_r_type, &slot, &alt_reloc) != 0)
5808 1.1 skrll as_fatal (_("invalid relocation"));
5809 1.1 skrll
5810 1.1 skrll xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
5811 1.1 skrll opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
5812 1.1 skrll
5813 1.1 skrll /* Check for "alternate" relocations (operand not specified). None
5814 1.1 skrll of the current uses for these are really PC-relative. */
5815 1.1 skrll if (alt_reloc || opcode == xtensa_const16_opcode)
5816 1.1 skrll {
5817 1.1 skrll if (opcode != xtensa_l32r_opcode
5818 1.1 skrll && opcode != xtensa_const16_opcode)
5819 1.1 skrll as_fatal (_("invalid relocation for '%s' instruction"),
5820 1.1 skrll xtensa_opcode_name (isa, opcode));
5821 1.1 skrll return 0;
5822 1.1 skrll }
5823 1.1 skrll
5824 1.1 skrll opnum = get_relaxable_immed (opcode);
5825 1.1 skrll opnd_value = 0;
5826 1.1 skrll if (xtensa_operand_is_PCrelative (isa, opcode, opnum) != 1
5827 1.1 skrll || xtensa_operand_do_reloc (isa, opcode, opnum, &opnd_value, addr))
5828 1.1 skrll {
5829 1.1 skrll as_bad_where (fixP->fx_file,
5830 1.1 skrll fixP->fx_line,
5831 1.1 skrll _("invalid relocation for operand %d of '%s'"),
5832 1.1 skrll opnum, xtensa_opcode_name (isa, opcode));
5833 1.1 skrll return 0;
5834 1.1 skrll }
5835 1.1 skrll return 0 - opnd_value;
5836 1.1 skrll }
5837 1.1 skrll
5838 1.1 skrll
5839 1.1 skrll /* TC_FORCE_RELOCATION hook */
5840 1.1 skrll
5841 1.1 skrll int
5842 1.1 skrll xtensa_force_relocation (fixS *fix)
5843 1.1 skrll {
5844 1.1 skrll switch (fix->fx_r_type)
5845 1.1 skrll {
5846 1.1 skrll case BFD_RELOC_XTENSA_ASM_EXPAND:
5847 1.1 skrll case BFD_RELOC_XTENSA_SLOT0_ALT:
5848 1.1 skrll case BFD_RELOC_XTENSA_SLOT1_ALT:
5849 1.1 skrll case BFD_RELOC_XTENSA_SLOT2_ALT:
5850 1.1 skrll case BFD_RELOC_XTENSA_SLOT3_ALT:
5851 1.1 skrll case BFD_RELOC_XTENSA_SLOT4_ALT:
5852 1.1 skrll case BFD_RELOC_XTENSA_SLOT5_ALT:
5853 1.1 skrll case BFD_RELOC_XTENSA_SLOT6_ALT:
5854 1.1 skrll case BFD_RELOC_XTENSA_SLOT7_ALT:
5855 1.1 skrll case BFD_RELOC_XTENSA_SLOT8_ALT:
5856 1.1 skrll case BFD_RELOC_XTENSA_SLOT9_ALT:
5857 1.1 skrll case BFD_RELOC_XTENSA_SLOT10_ALT:
5858 1.1 skrll case BFD_RELOC_XTENSA_SLOT11_ALT:
5859 1.1 skrll case BFD_RELOC_XTENSA_SLOT12_ALT:
5860 1.1 skrll case BFD_RELOC_XTENSA_SLOT13_ALT:
5861 1.1 skrll case BFD_RELOC_XTENSA_SLOT14_ALT:
5862 1.1 skrll return 1;
5863 1.1 skrll default:
5864 1.1 skrll break;
5865 1.1 skrll }
5866 1.1 skrll
5867 1.1 skrll if (linkrelax && fix->fx_addsy
5868 1.1 skrll && relaxable_section (S_GET_SEGMENT (fix->fx_addsy)))
5869 1.1 skrll return 1;
5870 1.1 skrll
5871 1.1 skrll return generic_force_reloc (fix);
5872 1.1 skrll }
5873 1.1 skrll
5874 1.1 skrll
5875 1.1 skrll /* TC_VALIDATE_FIX_SUB hook */
5876 1.1 skrll
5877 1.1 skrll int
5878 1.1 skrll xtensa_validate_fix_sub (fixS *fix)
5879 1.1 skrll {
5880 1.1 skrll segT add_symbol_segment, sub_symbol_segment;
5881 1.1 skrll
5882 1.1 skrll /* The difference of two symbols should be resolved by the assembler when
5883 1.1 skrll linkrelax is not set. If the linker may relax the section containing
5884 1.1 skrll the symbols, then an Xtensa DIFF relocation must be generated so that
5885 1.1 skrll the linker knows to adjust the difference value. */
5886 1.1 skrll if (!linkrelax || fix->fx_addsy == NULL)
5887 1.1 skrll return 0;
5888 1.1 skrll
5889 1.1 skrll /* Make sure both symbols are in the same segment, and that segment is
5890 1.1 skrll "normal" and relaxable. If the segment is not "normal", then the
5891 1.1 skrll fix is not valid. If the segment is not "relaxable", then the fix
5892 1.1 skrll should have been handled earlier. */
5893 1.1 skrll add_symbol_segment = S_GET_SEGMENT (fix->fx_addsy);
5894 1.1 skrll if (! SEG_NORMAL (add_symbol_segment) ||
5895 1.1 skrll ! relaxable_section (add_symbol_segment))
5896 1.1 skrll return 0;
5897 1.1 skrll sub_symbol_segment = S_GET_SEGMENT (fix->fx_subsy);
5898 1.1 skrll return (sub_symbol_segment == add_symbol_segment);
5899 1.1 skrll }
5900 1.1 skrll
5901 1.1 skrll
5902 1.1 skrll /* NO_PSEUDO_DOT hook */
5903 1.1 skrll
5904 1.1 skrll /* This function has nothing to do with pseudo dots, but this is the
5905 1.1 skrll nearest macro to where the check needs to take place. FIXME: This
5906 1.1 skrll seems wrong. */
5907 1.1 skrll
5908 1.1 skrll bfd_boolean
5909 1.1 skrll xtensa_check_inside_bundle (void)
5910 1.1 skrll {
5911 1.1 skrll if (cur_vinsn.inside_bundle && input_line_pointer[-1] == '.')
5912 1.1 skrll as_bad (_("directives are not valid inside bundles"));
5913 1.1 skrll
5914 1.1 skrll /* This function must always return FALSE because it is called via a
5915 1.1 skrll macro that has nothing to do with bundling. */
5916 1.1 skrll return FALSE;
5917 1.1 skrll }
5918 1.1 skrll
5919 1.1.1.8 christos
5920 1.1.1.8 christos /* md_elf_section_change_hook */
5921 1.1.1.8 christos
5922 1.1.1.8 christos void
5923 1.1.1.8 christos xtensa_elf_section_change_hook (void)
5924 1.1 skrll {
5925 1.1 skrll /* Set up the assembly state. */
5926 1.1 skrll if (!frag_now->tc_frag_data.is_assembly_state_set)
5927 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
5928 1.1 skrll
5929 1.1 skrll if (!use_literal_section
5930 1.1 skrll && seg_info (now_seg)->tc_segment_info_data.literal_pool_loc == NULL
5931 1.1 skrll && !xtensa_is_init_fini (now_seg))
5932 1.1 skrll xtensa_mark_literal_pool_location ();
5933 1.1 skrll }
5934 1.1 skrll
5935 1.1 skrll
5936 1.1 skrll /* tc_fix_adjustable hook */
5937 1.1 skrll
5938 1.1 skrll bfd_boolean
5939 1.1 skrll xtensa_fix_adjustable (fixS *fixP)
5940 1.1 skrll {
5941 1.1 skrll /* We need the symbol name for the VTABLE entries. */
5942 1.1 skrll if (fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
5943 1.1 skrll || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
5944 1.1 skrll return 0;
5945 1.1.1.4 christos
5946 1.1 skrll return 1;
5947 1.1 skrll }
5948 1.1 skrll
5949 1.1 skrll
5950 1.1 skrll /* tc_symbol_new_hook */
5951 1.1 skrll
5952 1.1 skrll symbolS *expr_symbols = NULL;
5953 1.1 skrll
5954 1.1 skrll void
5955 1.1 skrll xtensa_symbol_new_hook (symbolS *sym)
5956 1.1 skrll {
5957 1.1 skrll if (is_leb128_expr && S_GET_SEGMENT (sym) == expr_section)
5958 1.1 skrll {
5959 1.1 skrll symbol_get_tc (sym)->next_expr_symbol = expr_symbols;
5960 1.1 skrll expr_symbols = sym;
5961 1.1 skrll }
5962 1.1 skrll }
5963 1.1 skrll
5964 1.1 skrll
5965 1.1 skrll void
5966 1.1 skrll md_apply_fix (fixS *fixP, valueT *valP, segT seg)
5967 1.1 skrll {
5968 1.1 skrll char *const fixpos = fixP->fx_frag->fr_literal + fixP->fx_where;
5969 1.1 skrll valueT val = 0;
5970 1.1 skrll
5971 1.1 skrll /* Subtracted symbols are only allowed for a few relocation types, and
5972 1.1 skrll unless linkrelax is enabled, they should not make it to this point. */
5973 1.1 skrll if (fixP->fx_subsy && !(linkrelax && (fixP->fx_r_type == BFD_RELOC_32
5974 1.1 skrll || fixP->fx_r_type == BFD_RELOC_16
5975 1.1 skrll || fixP->fx_r_type == BFD_RELOC_8)))
5976 1.1 skrll as_bad_where (fixP->fx_file, fixP->fx_line, _("expression too complex"));
5977 1.1 skrll
5978 1.1 skrll switch (fixP->fx_r_type)
5979 1.1 skrll {
5980 1.1 skrll case BFD_RELOC_32_PCREL:
5981 1.1.1.5 christos case BFD_RELOC_32:
5982 1.1 skrll case BFD_RELOC_16:
5983 1.1 skrll case BFD_RELOC_8:
5984 1.1 skrll if (fixP->fx_subsy)
5985 1.1.1.5 christos {
5986 1.1 skrll switch (fixP->fx_r_type)
5987 1.1 skrll {
5988 1.1 skrll case BFD_RELOC_8:
5989 1.1.1.5 christos fixP->fx_r_type = BFD_RELOC_XTENSA_DIFF8;
5990 1.1 skrll fixP->fx_signed = 0;
5991 1.1 skrll break;
5992 1.1 skrll case BFD_RELOC_16:
5993 1.1 skrll fixP->fx_r_type = BFD_RELOC_XTENSA_DIFF16;
5994 1.1 skrll fixP->fx_signed = 0;
5995 1.1 skrll break;
5996 1.1 skrll case BFD_RELOC_32:
5997 1.1 skrll fixP->fx_r_type = BFD_RELOC_XTENSA_DIFF32;
5998 1.1 skrll fixP->fx_signed = 0;
5999 1.1 skrll break;
6000 1.1 skrll default:
6001 1.1 skrll break;
6002 1.1 skrll }
6003 1.1 skrll
6004 1.1 skrll val = (S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset
6005 1.1 skrll - S_GET_VALUE (fixP->fx_subsy));
6006 1.1 skrll
6007 1.1 skrll /* The difference value gets written out, and the DIFF reloc
6008 1.1 skrll identifies the address of the subtracted symbol (i.e., the one
6009 1.1 skrll with the lowest address). */
6010 1.1.1.8 christos *valP = val;
6011 1.1.1.8 christos fixP->fx_offset -= val;
6012 1.1.1.8 christos fixP->fx_subsy = NULL;
6013 1.1.1.8 christos }
6014 1.1.1.8 christos else if (! fixP->fx_addsy)
6015 1.1.1.8 christos {
6016 1.1 skrll val = *valP;
6017 1.1 skrll fixP->fx_done = 1;
6018 1.1 skrll }
6019 1.1 skrll else if (S_GET_SEGMENT (fixP->fx_addsy) == absolute_section)
6020 1.1 skrll {
6021 1.1 skrll val = S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset;
6022 1.1 skrll *valP = val;
6023 1.1 skrll fixP->fx_done = 1;
6024 1.1 skrll }
6025 1.1 skrll /* fall through */
6026 1.1 skrll
6027 1.1 skrll case BFD_RELOC_XTENSA_PLT:
6028 1.1 skrll md_number_to_chars (fixpos, val, fixP->fx_size);
6029 1.1 skrll fixP->fx_no_overflow = 0; /* Use the standard overflow check. */
6030 1.1 skrll break;
6031 1.1 skrll
6032 1.1 skrll case BFD_RELOC_XTENSA_TLSDESC_FN:
6033 1.1 skrll case BFD_RELOC_XTENSA_TLSDESC_ARG:
6034 1.1 skrll case BFD_RELOC_XTENSA_TLS_TPOFF:
6035 1.1 skrll case BFD_RELOC_XTENSA_TLS_DTPOFF:
6036 1.1 skrll S_SET_THREAD_LOCAL (fixP->fx_addsy);
6037 1.1 skrll md_number_to_chars (fixpos, 0, fixP->fx_size);
6038 1.1 skrll fixP->fx_no_overflow = 0; /* Use the standard overflow check. */
6039 1.1 skrll break;
6040 1.1 skrll
6041 1.1 skrll case BFD_RELOC_XTENSA_SLOT0_OP:
6042 1.1 skrll case BFD_RELOC_XTENSA_SLOT1_OP:
6043 1.1 skrll case BFD_RELOC_XTENSA_SLOT2_OP:
6044 1.1 skrll case BFD_RELOC_XTENSA_SLOT3_OP:
6045 1.1 skrll case BFD_RELOC_XTENSA_SLOT4_OP:
6046 1.1 skrll case BFD_RELOC_XTENSA_SLOT5_OP:
6047 1.1 skrll case BFD_RELOC_XTENSA_SLOT6_OP:
6048 1.1 skrll case BFD_RELOC_XTENSA_SLOT7_OP:
6049 1.1 skrll case BFD_RELOC_XTENSA_SLOT8_OP:
6050 1.1 skrll case BFD_RELOC_XTENSA_SLOT9_OP:
6051 1.1 skrll case BFD_RELOC_XTENSA_SLOT10_OP:
6052 1.1 skrll case BFD_RELOC_XTENSA_SLOT11_OP:
6053 1.1 skrll case BFD_RELOC_XTENSA_SLOT12_OP:
6054 1.1.1.2 christos case BFD_RELOC_XTENSA_SLOT13_OP:
6055 1.1 skrll case BFD_RELOC_XTENSA_SLOT14_OP:
6056 1.1 skrll if (linkrelax)
6057 1.1 skrll {
6058 1.1 skrll /* Write the tentative value of a PC-relative relocation to a
6059 1.1 skrll local symbol into the instruction. The value will be ignored
6060 1.1 skrll by the linker, and it makes the object file disassembly
6061 1.1 skrll readable when all branch targets are encoded in relocations. */
6062 1.1 skrll
6063 1.1 skrll gas_assert (fixP->fx_addsy);
6064 1.1 skrll if (S_GET_SEGMENT (fixP->fx_addsy) == seg
6065 1.1 skrll && !S_FORCE_RELOC (fixP->fx_addsy, 1))
6066 1.1 skrll {
6067 1.1 skrll val = (S_GET_VALUE (fixP->fx_addsy) + fixP->fx_offset
6068 1.1 skrll - md_pcrel_from (fixP));
6069 1.1 skrll (void) xg_apply_fix_value (fixP, val);
6070 1.1 skrll }
6071 1.1 skrll }
6072 1.1 skrll else if (! fixP->fx_addsy)
6073 1.1 skrll {
6074 1.1 skrll val = *valP;
6075 1.1 skrll if (xg_apply_fix_value (fixP, val))
6076 1.1 skrll fixP->fx_done = 1;
6077 1.1 skrll }
6078 1.1 skrll break;
6079 1.1 skrll
6080 1.1 skrll case BFD_RELOC_XTENSA_ASM_EXPAND:
6081 1.1 skrll case BFD_RELOC_XTENSA_TLS_FUNC:
6082 1.1 skrll case BFD_RELOC_XTENSA_TLS_ARG:
6083 1.1 skrll case BFD_RELOC_XTENSA_TLS_CALL:
6084 1.1 skrll case BFD_RELOC_XTENSA_SLOT0_ALT:
6085 1.1 skrll case BFD_RELOC_XTENSA_SLOT1_ALT:
6086 1.1 skrll case BFD_RELOC_XTENSA_SLOT2_ALT:
6087 1.1 skrll case BFD_RELOC_XTENSA_SLOT3_ALT:
6088 1.1 skrll case BFD_RELOC_XTENSA_SLOT4_ALT:
6089 1.1 skrll case BFD_RELOC_XTENSA_SLOT5_ALT:
6090 1.1 skrll case BFD_RELOC_XTENSA_SLOT6_ALT:
6091 1.1 skrll case BFD_RELOC_XTENSA_SLOT7_ALT:
6092 1.1 skrll case BFD_RELOC_XTENSA_SLOT8_ALT:
6093 1.1 skrll case BFD_RELOC_XTENSA_SLOT9_ALT:
6094 1.1 skrll case BFD_RELOC_XTENSA_SLOT10_ALT:
6095 1.1 skrll case BFD_RELOC_XTENSA_SLOT11_ALT:
6096 1.1 skrll case BFD_RELOC_XTENSA_SLOT12_ALT:
6097 1.1 skrll case BFD_RELOC_XTENSA_SLOT13_ALT:
6098 1.1 skrll case BFD_RELOC_XTENSA_SLOT14_ALT:
6099 1.1 skrll /* These all need to be resolved at link-time. Do nothing now. */
6100 1.1 skrll break;
6101 1.1 skrll
6102 1.1 skrll case BFD_RELOC_VTABLE_INHERIT:
6103 1.1 skrll case BFD_RELOC_VTABLE_ENTRY:
6104 1.1 skrll fixP->fx_done = 0;
6105 1.1.1.5 christos break;
6106 1.1 skrll
6107 1.1 skrll default:
6108 1.1 skrll as_bad (_("unhandled local relocation fix %s"),
6109 1.1 skrll bfd_get_reloc_code_name (fixP->fx_r_type));
6110 1.1 skrll }
6111 1.1 skrll }
6112 1.1 skrll
6113 1.1 skrll
6114 1.1 skrll const char *
6115 1.1 skrll md_atof (int type, char *litP, int *sizeP)
6116 1.1 skrll {
6117 1.1 skrll return ieee_md_atof (type, litP, sizeP, target_big_endian);
6118 1.1 skrll }
6119 1.1 skrll
6120 1.1 skrll
6121 1.1 skrll int
6122 1.1 skrll md_estimate_size_before_relax (fragS *fragP, segT seg ATTRIBUTE_UNUSED)
6123 1.1 skrll {
6124 1.1 skrll return total_frag_text_expansion (fragP);
6125 1.1 skrll }
6126 1.1 skrll
6127 1.1.1.5 christos
6128 1.1.1.5 christos /* Translate internal representation of relocation info to BFD target
6129 1.1 skrll format. */
6130 1.1 skrll
6131 1.1 skrll arelent *
6132 1.1 skrll tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
6133 1.1 skrll {
6134 1.1.1.2 christos arelent *reloc;
6135 1.1 skrll
6136 1.1 skrll reloc = XNEW (arelent);
6137 1.1 skrll reloc->sym_ptr_ptr = XNEW (asymbol *);
6138 1.1 skrll *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
6139 1.1 skrll reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
6140 1.1 skrll
6141 1.1 skrll /* Make sure none of our internal relocations make it this far.
6142 1.1 skrll They'd better have been fully resolved by this point. */
6143 1.1 skrll gas_assert ((int) fixp->fx_r_type > 0);
6144 1.1 skrll
6145 1.1 skrll reloc->addend = fixp->fx_offset;
6146 1.1 skrll
6147 1.1 skrll reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
6148 1.1 skrll if (reloc->howto == NULL)
6149 1.1 skrll {
6150 1.1 skrll as_bad_where (fixp->fx_file, fixp->fx_line,
6151 1.1 skrll _("cannot represent `%s' relocation in object file"),
6152 1.1 skrll bfd_get_reloc_code_name (fixp->fx_r_type));
6153 1.1 skrll free (reloc->sym_ptr_ptr);
6154 1.1 skrll free (reloc);
6155 1.1 skrll return NULL;
6156 1.1 skrll }
6157 1.1 skrll
6158 1.1 skrll if (!fixp->fx_pcrel != !reloc->howto->pc_relative)
6159 1.1 skrll as_fatal (_("internal error; cannot generate `%s' relocation"),
6160 1.1 skrll bfd_get_reloc_code_name (fixp->fx_r_type));
6161 1.1 skrll
6162 1.1 skrll return reloc;
6163 1.1 skrll }
6164 1.1 skrll
6165 1.1 skrll
6166 1.1 skrll /* Checks for resource conflicts between instructions. */
6168 1.1 skrll
6169 1.1 skrll /* The func unit stuff could be implemented as bit-vectors rather
6170 1.1 skrll than the iterative approach here. If it ends up being too
6171 1.1 skrll slow, we will switch it. */
6172 1.1 skrll
6173 1.1.1.5 christos resource_table *
6174 1.1 skrll new_resource_table (void *data,
6175 1.1 skrll int cycles,
6176 1.1 skrll int nu,
6177 1.1 skrll unit_num_copies_func uncf,
6178 1.1 skrll opcode_num_units_func onuf,
6179 1.1 skrll opcode_funcUnit_use_unit_func ouuf,
6180 1.1 skrll opcode_funcUnit_use_stage_func ousf)
6181 1.1 skrll {
6182 1.1 skrll int i;
6183 1.1.1.5 christos resource_table *rt = XNEW (resource_table);
6184 1.1 skrll rt->data = data;
6185 1.1.1.5 christos rt->cycles = cycles;
6186 1.1 skrll rt->allocated_cycles = cycles;
6187 1.1 skrll rt->num_units = nu;
6188 1.1 skrll rt->unit_num_copies = uncf;
6189 1.1 skrll rt->opcode_num_units = onuf;
6190 1.1 skrll rt->opcode_unit_use = ouuf;
6191 1.1 skrll rt->opcode_unit_stage = ousf;
6192 1.1 skrll
6193 1.1 skrll rt->units = XCNEWVEC (unsigned char *, cycles);
6194 1.1 skrll for (i = 0; i < cycles; i++)
6195 1.1 skrll rt->units[i] = XCNEWVEC (unsigned char, nu);
6196 1.1 skrll
6197 1.1 skrll return rt;
6198 1.1 skrll }
6199 1.1 skrll
6200 1.1 skrll
6201 1.1 skrll void
6202 1.1 skrll clear_resource_table (resource_table *rt)
6203 1.1 skrll {
6204 1.1 skrll int i, j;
6205 1.1 skrll for (i = 0; i < rt->allocated_cycles; i++)
6206 1.1 skrll for (j = 0; j < rt->num_units; j++)
6207 1.1 skrll rt->units[i][j] = 0;
6208 1.1 skrll }
6209 1.1 skrll
6210 1.1 skrll
6211 1.1 skrll /* We never shrink it, just fake it into thinking so. */
6212 1.1 skrll
6213 1.1 skrll void
6214 1.1 skrll resize_resource_table (resource_table *rt, int cycles)
6215 1.1.1.5 christos {
6216 1.1 skrll int i, old_cycles;
6217 1.1.1.5 christos
6218 1.1 skrll rt->cycles = cycles;
6219 1.1.1.5 christos if (cycles <= rt->allocated_cycles)
6220 1.1 skrll return;
6221 1.1 skrll
6222 1.1 skrll old_cycles = rt->allocated_cycles;
6223 1.1 skrll rt->allocated_cycles = cycles;
6224 1.1 skrll
6225 1.1 skrll rt->units = XRESIZEVEC (unsigned char *, rt->units, rt->allocated_cycles);
6226 1.1 skrll for (i = 0; i < old_cycles; i++)
6227 1.1 skrll rt->units[i] = XRESIZEVEC (unsigned char, rt->units[i], rt->num_units);
6228 1.1 skrll for (i = old_cycles; i < cycles; i++)
6229 1.1 skrll rt->units[i] = XCNEWVEC (unsigned char, rt->num_units);
6230 1.1 skrll }
6231 1.1 skrll
6232 1.1 skrll
6233 1.1 skrll bfd_boolean
6234 1.1 skrll resources_available (resource_table *rt, xtensa_opcode opcode, int cycle)
6235 1.1 skrll {
6236 1.1 skrll int i;
6237 1.1 skrll int uses = (rt->opcode_num_units) (rt->data, opcode);
6238 1.1 skrll
6239 1.1 skrll for (i = 0; i < uses; i++)
6240 1.1 skrll {
6241 1.1 skrll xtensa_funcUnit unit = (rt->opcode_unit_use) (rt->data, opcode, i);
6242 1.1 skrll int stage = (rt->opcode_unit_stage) (rt->data, opcode, i);
6243 1.1 skrll int copies_in_use = rt->units[stage + cycle][unit];
6244 1.1 skrll int copies = (rt->unit_num_copies) (rt->data, unit);
6245 1.1 skrll if (copies_in_use >= copies)
6246 1.1 skrll return FALSE;
6247 1.1 skrll }
6248 1.1 skrll return TRUE;
6249 1.1 skrll }
6250 1.1 skrll
6251 1.1 skrll
6252 1.1 skrll void
6253 1.1 skrll reserve_resources (resource_table *rt, xtensa_opcode opcode, int cycle)
6254 1.1 skrll {
6255 1.1 skrll int i;
6256 1.1 skrll int uses = (rt->opcode_num_units) (rt->data, opcode);
6257 1.1 skrll
6258 1.1 skrll for (i = 0; i < uses; i++)
6259 1.1 skrll {
6260 1.1 skrll xtensa_funcUnit unit = (rt->opcode_unit_use) (rt->data, opcode, i);
6261 1.1 skrll int stage = (rt->opcode_unit_stage) (rt->data, opcode, i);
6262 1.1 skrll /* Note that this allows resources to be oversubscribed. That's
6263 1.1 skrll essential to the way the optional scheduler works.
6264 1.1 skrll resources_available reports when a resource is over-subscribed,
6265 1.1 skrll so it's easy to tell. */
6266 1.1 skrll rt->units[stage + cycle][unit]++;
6267 1.1 skrll }
6268 1.1 skrll }
6269 1.1 skrll
6270 1.1 skrll
6271 1.1.1.2 christos void
6272 1.1 skrll release_resources (resource_table *rt, xtensa_opcode opcode, int cycle)
6273 1.1 skrll {
6274 1.1 skrll int i;
6275 1.1 skrll int uses = (rt->opcode_num_units) (rt->data, opcode);
6276 1.1 skrll
6277 1.1 skrll for (i = 0; i < uses; i++)
6278 1.1 skrll {
6279 1.1 skrll xtensa_funcUnit unit = (rt->opcode_unit_use) (rt->data, opcode, i);
6280 1.1 skrll int stage = (rt->opcode_unit_stage) (rt->data, opcode, i);
6281 1.1 skrll gas_assert (rt->units[stage + cycle][unit] > 0);
6282 1.1 skrll rt->units[stage + cycle][unit]--;
6283 1.1 skrll }
6284 1.1 skrll }
6285 1.1 skrll
6286 1.1 skrll
6287 1.1 skrll /* Wrapper functions make parameterized resource reservation
6288 1.1 skrll more convenient. */
6289 1.1 skrll
6290 1.1 skrll int
6291 1.1 skrll opcode_funcUnit_use_unit (void *data, xtensa_opcode opcode, int idx)
6292 1.1 skrll {
6293 1.1 skrll xtensa_funcUnit_use *use = xtensa_opcode_funcUnit_use (data, opcode, idx);
6294 1.1 skrll return use->unit;
6295 1.1 skrll }
6296 1.1 skrll
6297 1.1 skrll
6298 1.1 skrll int
6299 1.1 skrll opcode_funcUnit_use_stage (void *data, xtensa_opcode opcode, int idx)
6300 1.1 skrll {
6301 1.1 skrll xtensa_funcUnit_use *use = xtensa_opcode_funcUnit_use (data, opcode, idx);
6302 1.1 skrll return use->stage;
6303 1.1 skrll }
6304 1.1 skrll
6305 1.1 skrll
6306 1.1 skrll /* Note that this function does not check issue constraints, but
6307 1.1 skrll solely whether the hardware is available to execute the given
6308 1.1 skrll instructions together. It also doesn't check if the tinsns
6309 1.1 skrll write the same state, or access the same tieports. That is
6310 1.1 skrll checked by check_t1_t2_reads_and_writes. */
6311 1.1 skrll
6312 1.1 skrll static bfd_boolean
6313 1.1 skrll resources_conflict (vliw_insn *vinsn)
6314 1.1 skrll {
6315 1.1 skrll int i;
6316 1.1 skrll static resource_table *rt = NULL;
6317 1.1 skrll
6318 1.1 skrll /* This is the most common case by far. Optimize it. */
6319 1.1 skrll if (vinsn->num_slots == 1)
6320 1.1 skrll return FALSE;
6321 1.1 skrll
6322 1.1 skrll if (rt == NULL)
6323 1.1 skrll {
6324 1.1 skrll xtensa_isa isa = xtensa_default_isa;
6325 1.1 skrll rt = new_resource_table
6326 1.1 skrll (isa, xtensa_num_pipe_stages,
6327 1.1 skrll xtensa_isa_num_funcUnits (isa),
6328 1.1 skrll (unit_num_copies_func) xtensa_funcUnit_num_copies,
6329 1.1 skrll (opcode_num_units_func) xtensa_opcode_num_funcUnit_uses,
6330 1.1 skrll opcode_funcUnit_use_unit,
6331 1.1 skrll opcode_funcUnit_use_stage);
6332 1.1 skrll }
6333 1.1 skrll
6334 1.1 skrll clear_resource_table (rt);
6335 1.1 skrll
6336 1.1 skrll for (i = 0; i < vinsn->num_slots; i++)
6337 1.1 skrll {
6338 1.1 skrll if (!resources_available (rt, vinsn->slots[i].opcode, 0))
6339 1.1 skrll return TRUE;
6340 1.1 skrll reserve_resources (rt, vinsn->slots[i].opcode, 0);
6341 1.1 skrll }
6342 1.1 skrll
6343 1.1 skrll return FALSE;
6344 1.1 skrll }
6345 1.1 skrll
6346 1.1 skrll
6347 1.1 skrll /* finish_vinsn, emit_single_op and helper functions. */
6349 1.1 skrll
6350 1.1 skrll static bfd_boolean find_vinsn_conflicts (vliw_insn *);
6351 1.1.1.6 christos static xtensa_format xg_find_narrowest_format (vliw_insn *);
6352 1.1 skrll static void xg_assemble_vliw_tokens (vliw_insn *);
6353 1.1 skrll
6354 1.1 skrll
6355 1.1 skrll /* We have reached the end of a bundle; emit into the frag. */
6356 1.1 skrll
6357 1.1 skrll static void
6358 1.1 skrll finish_vinsn (vliw_insn *vinsn)
6359 1.1 skrll {
6360 1.1 skrll IStack slotstack;
6361 1.1 skrll int i;
6362 1.1 skrll int slots;
6363 1.1.1.6 christos
6364 1.1.1.6 christos if (find_vinsn_conflicts (vinsn))
6365 1.1.1.2 christos {
6366 1.1.1.2 christos xg_clear_vinsn (vinsn);
6367 1.1.1.2 christos return;
6368 1.1.1.2 christos }
6369 1.1.1.2 christos
6370 1.1.1.2 christos /* First, find a format that works. */
6371 1.1.1.2 christos if (vinsn->format == XTENSA_UNDEFINED)
6372 1.1 skrll vinsn->format = xg_find_narrowest_format (vinsn);
6373 1.1 skrll
6374 1.1.1.5 christos slots = xtensa_format_num_slots (xtensa_default_isa, vinsn->format);
6375 1.1 skrll if (slots > 1
6376 1.1 skrll && produce_flix == FLIX_NONE)
6377 1.1 skrll {
6378 1.1 skrll as_bad (_("The option \"--no-allow-flix\" prohibits multi-slot flix."));
6379 1.1 skrll xg_clear_vinsn (vinsn);
6380 1.1 skrll return;
6381 1.1 skrll }
6382 1.1 skrll
6383 1.1 skrll if (vinsn->format == XTENSA_UNDEFINED)
6384 1.1 skrll {
6385 1.1.1.6 christos as_bad (_("couldn't find a valid instruction format"));
6386 1.1 skrll fprintf (stderr, _(" ops were: "));
6387 1.1.1.6 christos for (i = 0; i < vinsn->num_slots; i++)
6388 1.1 skrll fprintf (stderr, _(" %s;"),
6389 1.1.1.6 christos xtensa_opcode_name (xtensa_default_isa,
6390 1.1 skrll vinsn->slots[i].opcode));
6391 1.1 skrll fprintf (stderr, _("\n"));
6392 1.1 skrll xg_clear_vinsn (vinsn);
6393 1.1 skrll return;
6394 1.1 skrll }
6395 1.1 skrll
6396 1.1.1.5 christos if (vinsn->num_slots != slots)
6397 1.1 skrll {
6398 1.1 skrll as_bad (_("mismatch for format '%s': #slots = %d, #opcodes = %d"),
6399 1.1 skrll xtensa_format_name (xtensa_default_isa, vinsn->format),
6400 1.1 skrll slots, vinsn->num_slots);
6401 1.1 skrll xg_clear_vinsn (vinsn);
6402 1.1 skrll return;
6403 1.1 skrll }
6404 1.1 skrll
6405 1.1 skrll if (resources_conflict (vinsn))
6406 1.1 skrll {
6407 1.1 skrll as_bad (_("illegal resource usage in bundle"));
6408 1.1 skrll fprintf (stderr, " ops were: ");
6409 1.1 skrll for (i = 0; i < vinsn->num_slots; i++)
6410 1.1 skrll fprintf (stderr, " %s;",
6411 1.1 skrll xtensa_opcode_name (xtensa_default_isa,
6412 1.1 skrll vinsn->slots[i].opcode));
6413 1.1 skrll fprintf (stderr, "\n");
6414 1.1 skrll xg_clear_vinsn (vinsn);
6415 1.1 skrll return;
6416 1.1 skrll }
6417 1.1 skrll
6418 1.1 skrll for (i = 0; i < vinsn->num_slots; i++)
6419 1.1 skrll {
6420 1.1 skrll if (vinsn->slots[i].opcode != XTENSA_UNDEFINED)
6421 1.1 skrll {
6422 1.1 skrll symbolS *lit_sym = NULL;
6423 1.1 skrll int j;
6424 1.1 skrll bfd_boolean e = FALSE;
6425 1.1 skrll bfd_boolean saved_density = density_supported;
6426 1.1 skrll
6427 1.1 skrll /* We don't want to narrow ops inside multi-slot bundles. */
6428 1.1 skrll if (vinsn->num_slots > 1)
6429 1.1 skrll density_supported = FALSE;
6430 1.1 skrll
6431 1.1 skrll istack_init (&slotstack);
6432 1.1 skrll if (vinsn->slots[i].opcode == xtensa_nop_opcode)
6433 1.1 skrll {
6434 1.1 skrll vinsn->slots[i].opcode =
6435 1.1 skrll xtensa_format_slot_nop_opcode (xtensa_default_isa,
6436 1.1 skrll vinsn->format, i);
6437 1.1 skrll vinsn->slots[i].ntok = 0;
6438 1.1 skrll }
6439 1.1 skrll
6440 1.1 skrll if (xg_expand_assembly_insn (&slotstack, &vinsn->slots[i]))
6441 1.1 skrll {
6442 1.1 skrll e = TRUE;
6443 1.1 skrll continue;
6444 1.1 skrll }
6445 1.1 skrll
6446 1.1 skrll density_supported = saved_density;
6447 1.1 skrll
6448 1.1.1.2 christos if (e)
6449 1.1 skrll {
6450 1.1 skrll xg_clear_vinsn (vinsn);
6451 1.1 skrll return;
6452 1.1 skrll }
6453 1.1.1.2 christos
6454 1.1 skrll for (j = 0; j < slotstack.ninsn; j++)
6455 1.1 skrll {
6456 1.1 skrll TInsn *insn = &slotstack.insn[j];
6457 1.1 skrll if (insn->insn_type == ITYPE_LITERAL)
6458 1.1 skrll {
6459 1.1 skrll gas_assert (lit_sym == NULL);
6460 1.1 skrll lit_sym = xg_assemble_literal (insn);
6461 1.1 skrll }
6462 1.1 skrll else
6463 1.1 skrll {
6464 1.1 skrll gas_assert (insn->insn_type == ITYPE_INSN);
6465 1.1 skrll if (lit_sym)
6466 1.1 skrll xg_resolve_literals (insn, lit_sym);
6467 1.1 skrll if (j != slotstack.ninsn - 1)
6468 1.1 skrll emit_single_op (insn);
6469 1.1 skrll }
6470 1.1 skrll }
6471 1.1 skrll
6472 1.1 skrll if (vinsn->num_slots > 1)
6473 1.1 skrll {
6474 1.1 skrll if (opcode_fits_format_slot
6475 1.1 skrll (slotstack.insn[slotstack.ninsn - 1].opcode,
6476 1.1 skrll vinsn->format, i))
6477 1.1 skrll {
6478 1.1 skrll vinsn->slots[i] = slotstack.insn[slotstack.ninsn - 1];
6479 1.1 skrll }
6480 1.1 skrll else
6481 1.1 skrll {
6482 1.1 skrll emit_single_op (&slotstack.insn[slotstack.ninsn - 1]);
6483 1.1 skrll if (vinsn->format == XTENSA_UNDEFINED)
6484 1.1 skrll vinsn->slots[i].opcode = xtensa_nop_opcode;
6485 1.1 skrll else
6486 1.1 skrll vinsn->slots[i].opcode
6487 1.1 skrll = xtensa_format_slot_nop_opcode (xtensa_default_isa,
6488 1.1 skrll vinsn->format, i);
6489 1.1 skrll
6490 1.1 skrll vinsn->slots[i].ntok = 0;
6491 1.1 skrll }
6492 1.1 skrll }
6493 1.1.1.5 christos else
6494 1.1 skrll {
6495 1.1 skrll vinsn->slots[0] = slotstack.insn[slotstack.ninsn - 1];
6496 1.1 skrll vinsn->format = XTENSA_UNDEFINED;
6497 1.1 skrll }
6498 1.1 skrll }
6499 1.1 skrll }
6500 1.1 skrll
6501 1.1 skrll /* Now check resource conflicts on the modified bundle. */
6502 1.1 skrll if (resources_conflict (vinsn))
6503 1.1 skrll {
6504 1.1 skrll as_bad (_("illegal resource usage in bundle"));
6505 1.1 skrll fprintf (stderr, " ops were: ");
6506 1.1 skrll for (i = 0; i < vinsn->num_slots; i++)
6507 1.1 skrll fprintf (stderr, " %s;",
6508 1.1 skrll xtensa_opcode_name (xtensa_default_isa,
6509 1.1 skrll vinsn->slots[i].opcode));
6510 1.1 skrll fprintf (stderr, "\n");
6511 1.1.1.4 christos xg_clear_vinsn (vinsn);
6512 1.1.1.4 christos return;
6513 1.1 skrll }
6514 1.1 skrll
6515 1.1 skrll /* First, find a format that works. */
6516 1.1 skrll if (vinsn->format == XTENSA_UNDEFINED)
6517 1.1 skrll vinsn->format = xg_find_narrowest_format (vinsn);
6518 1.1 skrll
6519 1.1 skrll xg_assemble_vliw_tokens (vinsn);
6520 1.1 skrll
6521 1.1 skrll xg_clear_vinsn (vinsn);
6522 1.1 skrll
6523 1.1 skrll xtensa_check_frag_count ();
6524 1.1 skrll }
6525 1.1 skrll
6526 1.1 skrll
6527 1.1 skrll /* Given an vliw instruction, what conflicts are there in register
6528 1.1 skrll usage and in writes to states and queues?
6529 1.1 skrll
6530 1.1 skrll This function does two things:
6531 1.1 skrll 1. Reports an error when a vinsn contains illegal combinations
6532 1.1 skrll of writes to registers states or queues.
6533 1.1 skrll 2. Marks individual tinsns as not relaxable if the combination
6534 1.1 skrll contains antidependencies.
6535 1.1 skrll
6536 1.1 skrll Job 2 handles things like swap semantics in instructions that need
6537 1.1 skrll to be relaxed. For example,
6538 1.1 skrll
6539 1.1 skrll addi a0, a1, 100000
6540 1.1 skrll
6541 1.1 skrll normally would be relaxed to
6542 1.1 skrll
6543 1.1 skrll l32r a0, some_label
6544 1.1 skrll add a0, a1, a0
6545 1.1 skrll
6546 1.1 skrll _but_, if the above instruction is bundled with an a0 reader, e.g.,
6547 1.1 skrll
6548 1.1 skrll { addi a0, a1, 10000 ; add a2, a0, a4 ; }
6549 1.1 skrll
6550 1.1 skrll then we can't relax it into
6551 1.1 skrll
6552 1.1 skrll l32r a0, some_label
6553 1.1 skrll { add a0, a1, a0 ; add a2, a0, a4 ; }
6554 1.1 skrll
6555 1.1.1.2 christos because the value of a0 is trashed before the second add can read it. */
6556 1.1 skrll
6557 1.1 skrll static char check_t1_t2_reads_and_writes (TInsn *, TInsn *);
6558 1.1 skrll
6559 1.1 skrll static bfd_boolean
6560 1.1 skrll find_vinsn_conflicts (vliw_insn *vinsn)
6561 1.1 skrll {
6562 1.1 skrll int i, j;
6563 1.1 skrll int branches = 0;
6564 1.1 skrll xtensa_isa isa = xtensa_default_isa;
6565 1.1 skrll
6566 1.1 skrll gas_assert (!past_xtensa_end);
6567 1.1 skrll
6568 1.1 skrll for (i = 0 ; i < vinsn->num_slots; i++)
6569 1.1 skrll {
6570 1.1 skrll TInsn *op1 = &vinsn->slots[i];
6571 1.1 skrll if (op1->is_specific_opcode)
6572 1.1 skrll op1->keep_wide = TRUE;
6573 1.1 skrll else
6574 1.1 skrll op1->keep_wide = FALSE;
6575 1.1 skrll }
6576 1.1 skrll
6577 1.1 skrll for (i = 0 ; i < vinsn->num_slots; i++)
6578 1.1 skrll {
6579 1.1 skrll TInsn *op1 = &vinsn->slots[i];
6580 1.1 skrll
6581 1.1 skrll if (xtensa_opcode_is_branch (isa, op1->opcode) == 1)
6582 1.1 skrll branches++;
6583 1.1 skrll
6584 1.1 skrll for (j = 0; j < vinsn->num_slots; j++)
6585 1.1 skrll {
6586 1.1 skrll if (i != j)
6587 1.1 skrll {
6588 1.1 skrll TInsn *op2 = &vinsn->slots[j];
6589 1.1 skrll char conflict_type = check_t1_t2_reads_and_writes (op1, op2);
6590 1.1 skrll switch (conflict_type)
6591 1.1 skrll {
6592 1.1 skrll case 'c':
6593 1.1 skrll as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) write the same register"),
6594 1.1 skrll xtensa_opcode_name (isa, op1->opcode), i,
6595 1.1 skrll xtensa_opcode_name (isa, op2->opcode), j);
6596 1.1 skrll return TRUE;
6597 1.1 skrll case 'd':
6598 1.1 skrll as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) write the same state"),
6599 1.1 skrll xtensa_opcode_name (isa, op1->opcode), i,
6600 1.1 skrll xtensa_opcode_name (isa, op2->opcode), j);
6601 1.1 skrll return TRUE;
6602 1.1 skrll case 'e':
6603 1.1 skrll as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) write the same port"),
6604 1.1 skrll xtensa_opcode_name (isa, op1->opcode), i,
6605 1.1 skrll xtensa_opcode_name (isa, op2->opcode), j);
6606 1.1 skrll return TRUE;
6607 1.1 skrll case 'f':
6608 1.1 skrll as_bad (_("opcodes '%s' (slot %d) and '%s' (slot %d) both have volatile port accesses"),
6609 1.1 skrll xtensa_opcode_name (isa, op1->opcode), i,
6610 1.1 skrll xtensa_opcode_name (isa, op2->opcode), j);
6611 1.1 skrll return TRUE;
6612 1.1 skrll default:
6613 1.1 skrll /* Everything is OK. */
6614 1.1 skrll break;
6615 1.1 skrll }
6616 1.1 skrll op2->is_specific_opcode = (op2->is_specific_opcode
6617 1.1 skrll || conflict_type == 'a');
6618 1.1 skrll }
6619 1.1 skrll }
6620 1.1 skrll }
6621 1.1 skrll
6622 1.1 skrll if (branches > 1)
6623 1.1 skrll {
6624 1.1 skrll as_bad (_("multiple branches or jumps in the same bundle"));
6625 1.1 skrll return TRUE;
6626 1.1 skrll }
6627 1.1 skrll
6628 1.1 skrll return FALSE;
6629 1.1 skrll }
6630 1.1 skrll
6631 1.1 skrll
6632 1.1 skrll /* Check how the state used by t1 and t2 relate.
6633 1.1 skrll Cases found are:
6634 1.1 skrll
6635 1.1 skrll case A: t1 reads a register t2 writes (an antidependency within a bundle)
6636 1.1 skrll case B: no relationship between what is read and written (both could
6637 1.1 skrll read the same reg though)
6638 1.1 skrll case C: t1 writes a register t2 writes (a register conflict within a
6639 1.1 skrll bundle)
6640 1.1 skrll case D: t1 writes a state that t2 also writes
6641 1.1 skrll case E: t1 writes a tie queue that t2 also writes
6642 1.1 skrll case F: two volatile queue accesses
6643 1.1 skrll */
6644 1.1 skrll
6645 1.1 skrll static char
6646 1.1 skrll check_t1_t2_reads_and_writes (TInsn *t1, TInsn *t2)
6647 1.1 skrll {
6648 1.1 skrll xtensa_isa isa = xtensa_default_isa;
6649 1.1 skrll xtensa_regfile t1_regfile, t2_regfile;
6650 1.1 skrll int t1_reg, t2_reg;
6651 1.1 skrll int t1_base_reg, t1_last_reg;
6652 1.1 skrll int t2_base_reg, t2_last_reg;
6653 1.1 skrll char t1_inout, t2_inout;
6654 1.1 skrll int i, j;
6655 1.1 skrll char conflict = 'b';
6656 1.1 skrll int t1_states;
6657 1.1 skrll int t2_states;
6658 1.1 skrll int t1_interfaces;
6659 1.1 skrll int t2_interfaces;
6660 1.1 skrll bfd_boolean t1_volatile = FALSE;
6661 1.1 skrll bfd_boolean t2_volatile = FALSE;
6662 1.1 skrll
6663 1.1 skrll /* Check registers. */
6664 1.1 skrll for (j = 0; j < t2->ntok; j++)
6665 1.1 skrll {
6666 1.1 skrll if (xtensa_operand_is_register (isa, t2->opcode, j) != 1)
6667 1.1 skrll continue;
6668 1.1 skrll
6669 1.1 skrll t2_regfile = xtensa_operand_regfile (isa, t2->opcode, j);
6670 1.1 skrll t2_base_reg = t2->tok[j].X_add_number;
6671 1.1 skrll t2_last_reg = t2_base_reg + xtensa_operand_num_regs (isa, t2->opcode, j);
6672 1.1 skrll
6673 1.1 skrll for (i = 0; i < t1->ntok; i++)
6674 1.1 skrll {
6675 1.1 skrll if (xtensa_operand_is_register (isa, t1->opcode, i) != 1)
6676 1.1 skrll continue;
6677 1.1 skrll
6678 1.1 skrll t1_regfile = xtensa_operand_regfile (isa, t1->opcode, i);
6679 1.1 skrll
6680 1.1 skrll if (t1_regfile != t2_regfile)
6681 1.1 skrll continue;
6682 1.1 skrll
6683 1.1 skrll t1_inout = xtensa_operand_inout (isa, t1->opcode, i);
6684 1.1 skrll t2_inout = xtensa_operand_inout (isa, t2->opcode, j);
6685 1.1 skrll
6686 1.1 skrll if (xtensa_operand_is_known_reg (isa, t1->opcode, i) == 0
6687 1.1 skrll || xtensa_operand_is_known_reg (isa, t2->opcode, j) == 0)
6688 1.1 skrll {
6689 1.1 skrll if (t1_inout == 'm' || t1_inout == 'o'
6690 1.1 skrll || t2_inout == 'm' || t2_inout == 'o')
6691 1.1 skrll {
6692 1.1 skrll conflict = 'a';
6693 1.1 skrll continue;
6694 1.1 skrll }
6695 1.1 skrll }
6696 1.1 skrll
6697 1.1 skrll t1_base_reg = t1->tok[i].X_add_number;
6698 1.1 skrll t1_last_reg = (t1_base_reg
6699 1.1 skrll + xtensa_operand_num_regs (isa, t1->opcode, i));
6700 1.1 skrll
6701 1.1 skrll for (t1_reg = t1_base_reg; t1_reg < t1_last_reg; t1_reg++)
6702 1.1 skrll {
6703 1.1 skrll for (t2_reg = t2_base_reg; t2_reg < t2_last_reg; t2_reg++)
6704 1.1 skrll {
6705 1.1 skrll if (t1_reg != t2_reg)
6706 1.1 skrll continue;
6707 1.1 skrll
6708 1.1 skrll if (t2_inout == 'i' && (t1_inout == 'm' || t1_inout == 'o'))
6709 1.1 skrll {
6710 1.1 skrll conflict = 'a';
6711 1.1 skrll continue;
6712 1.1 skrll }
6713 1.1 skrll
6714 1.1 skrll if (t1_inout == 'i' && (t2_inout == 'm' || t2_inout == 'o'))
6715 1.1 skrll {
6716 1.1 skrll conflict = 'a';
6717 1.1 skrll continue;
6718 1.1 skrll }
6719 1.1 skrll
6720 1.1 skrll if (t1_inout != 'i' && t2_inout != 'i')
6721 1.1 skrll return 'c';
6722 1.1 skrll }
6723 1.1 skrll }
6724 1.1 skrll }
6725 1.1 skrll }
6726 1.1 skrll
6727 1.1.1.2 christos /* Check states. */
6728 1.1 skrll t1_states = xtensa_opcode_num_stateOperands (isa, t1->opcode);
6729 1.1 skrll t2_states = xtensa_opcode_num_stateOperands (isa, t2->opcode);
6730 1.1 skrll for (j = 0; j < t2_states; j++)
6731 1.1 skrll {
6732 1.1 skrll xtensa_state t2_so = xtensa_stateOperand_state (isa, t2->opcode, j);
6733 1.1 skrll t2_inout = xtensa_stateOperand_inout (isa, t2->opcode, j);
6734 1.1 skrll for (i = 0; i < t1_states; i++)
6735 1.1 skrll {
6736 1.1 skrll xtensa_state t1_so = xtensa_stateOperand_state (isa, t1->opcode, i);
6737 1.1 skrll t1_inout = xtensa_stateOperand_inout (isa, t1->opcode, i);
6738 1.1 skrll if (t1_so != t2_so || xtensa_state_is_shared_or (isa, t1_so) == 1)
6739 1.1 skrll continue;
6740 1.1 skrll
6741 1.1 skrll if (t2_inout == 'i' && (t1_inout == 'm' || t1_inout == 'o'))
6742 1.1 skrll {
6743 1.1 skrll conflict = 'a';
6744 1.1 skrll continue;
6745 1.1 skrll }
6746 1.1 skrll
6747 1.1 skrll if (t1_inout == 'i' && (t2_inout == 'm' || t2_inout == 'o'))
6748 1.1 skrll {
6749 1.1 skrll conflict = 'a';
6750 1.1 skrll continue;
6751 1.1 skrll }
6752 1.1 skrll
6753 1.1 skrll if (t1_inout != 'i' && t2_inout != 'i')
6754 1.1 skrll return 'd';
6755 1.1 skrll }
6756 1.1 skrll }
6757 1.1 skrll
6758 1.1 skrll /* Check tieports. */
6759 1.1 skrll t1_interfaces = xtensa_opcode_num_interfaceOperands (isa, t1->opcode);
6760 1.1 skrll t2_interfaces = xtensa_opcode_num_interfaceOperands (isa, t2->opcode);
6761 1.1 skrll for (j = 0; j < t2_interfaces; j++)
6762 1.1 skrll {
6763 1.1 skrll xtensa_interface t2_int
6764 1.1 skrll = xtensa_interfaceOperand_interface (isa, t2->opcode, j);
6765 1.1 skrll int t2_class = xtensa_interface_class_id (isa, t2_int);
6766 1.1 skrll
6767 1.1 skrll t2_inout = xtensa_interface_inout (isa, t2_int);
6768 1.1 skrll if (xtensa_interface_has_side_effect (isa, t2_int) == 1)
6769 1.1 skrll t2_volatile = TRUE;
6770 1.1 skrll
6771 1.1 skrll for (i = 0; i < t1_interfaces; i++)
6772 1.1 skrll {
6773 1.1 skrll xtensa_interface t1_int
6774 1.1 skrll = xtensa_interfaceOperand_interface (isa, t1->opcode, j);
6775 1.1 skrll int t1_class = xtensa_interface_class_id (isa, t1_int);
6776 1.1 skrll
6777 1.1 skrll t1_inout = xtensa_interface_inout (isa, t1_int);
6778 1.1 skrll if (xtensa_interface_has_side_effect (isa, t1_int) == 1)
6779 1.1 skrll t1_volatile = TRUE;
6780 1.1 skrll
6781 1.1 skrll if (t1_volatile && t2_volatile && (t1_class == t2_class))
6782 1.1 skrll return 'f';
6783 1.1 skrll
6784 1.1 skrll if (t1_int != t2_int)
6785 1.1 skrll continue;
6786 1.1 skrll
6787 1.1 skrll if (t2_inout == 'i' && t1_inout == 'o')
6788 1.1 skrll {
6789 1.1 skrll conflict = 'a';
6790 1.1 skrll continue;
6791 1.1 skrll }
6792 1.1 skrll
6793 1.1 skrll if (t1_inout == 'i' && t2_inout == 'o')
6794 1.1 skrll {
6795 1.1 skrll conflict = 'a';
6796 1.1 skrll continue;
6797 1.1 skrll }
6798 1.1 skrll
6799 1.1 skrll if (t1_inout != 'i' && t2_inout != 'i')
6800 1.1 skrll return 'e';
6801 1.1 skrll }
6802 1.1 skrll }
6803 1.1 skrll
6804 1.1 skrll return conflict;
6805 1.1 skrll }
6806 1.1 skrll
6807 1.1 skrll
6808 1.1 skrll static xtensa_format
6809 1.1 skrll xg_find_narrowest_format (vliw_insn *vinsn)
6810 1.1 skrll {
6811 1.1 skrll /* Right now we assume that the ops within the vinsn are properly
6812 1.1 skrll ordered for the slots that the programmer wanted them in. In
6813 1.1 skrll other words, we don't rearrange the ops in hopes of finding a
6814 1.1.1.2 christos better format. The scheduler handles that. */
6815 1.1.1.2 christos
6816 1.1 skrll xtensa_isa isa = xtensa_default_isa;
6817 1.1 skrll xtensa_format format;
6818 1.1 skrll xtensa_opcode nop_opcode = xtensa_nop_opcode;
6819 1.1 skrll
6820 1.1 skrll if (vinsn->num_slots == 1)
6821 1.1 skrll return xg_get_single_format (vinsn->slots[0].opcode);
6822 1.1 skrll
6823 1.1 skrll for (format = 0; format < xtensa_isa_num_formats (isa); format++)
6824 1.1 skrll {
6825 1.1 skrll vliw_insn v_copy;
6826 1.1 skrll xg_copy_vinsn (&v_copy, vinsn);
6827 1.1 skrll if (xtensa_format_num_slots (isa, format) == v_copy.num_slots)
6828 1.1 skrll {
6829 1.1 skrll int slot;
6830 1.1 skrll int fit = 0;
6831 1.1 skrll for (slot = 0; slot < v_copy.num_slots; slot++)
6832 1.1 skrll {
6833 1.1 skrll if (v_copy.slots[slot].opcode == nop_opcode)
6834 1.1 skrll {
6835 1.1 skrll v_copy.slots[slot].opcode =
6836 1.1 skrll xtensa_format_slot_nop_opcode (isa, format, slot);
6837 1.1 skrll v_copy.slots[slot].ntok = 0;
6838 1.1 skrll }
6839 1.1 skrll
6840 1.1 skrll if (opcode_fits_format_slot (v_copy.slots[slot].opcode,
6841 1.1 skrll format, slot))
6842 1.1 skrll fit++;
6843 1.1 skrll else if (v_copy.num_slots > 1)
6844 1.1 skrll {
6845 1.1 skrll TInsn widened;
6846 1.1 skrll /* Try the widened version. */
6847 1.1 skrll if (!v_copy.slots[slot].keep_wide
6848 1.1 skrll && !v_copy.slots[slot].is_specific_opcode
6849 1.1 skrll && xg_is_single_relaxable_insn (&v_copy.slots[slot],
6850 1.1.1.2 christos &widened, TRUE)
6851 1.1 skrll && opcode_fits_format_slot (widened.opcode,
6852 1.1 skrll format, slot))
6853 1.1 skrll {
6854 1.1 skrll v_copy.slots[slot] = widened;
6855 1.1 skrll fit++;
6856 1.1 skrll }
6857 1.1 skrll }
6858 1.1 skrll }
6859 1.1 skrll if (fit == v_copy.num_slots)
6860 1.1 skrll {
6861 1.1 skrll xg_copy_vinsn (vinsn, &v_copy);
6862 1.1 skrll xtensa_format_encode (isa, format, vinsn->insnbuf);
6863 1.1 skrll vinsn->format = format;
6864 1.1 skrll break;
6865 1.1 skrll }
6866 1.1 skrll }
6867 1.1 skrll }
6868 1.1 skrll
6869 1.1 skrll if (format == xtensa_isa_num_formats (isa))
6870 1.1 skrll return XTENSA_UNDEFINED;
6871 1.1 skrll
6872 1.1 skrll return format;
6873 1.1 skrll }
6874 1.1 skrll
6875 1.1 skrll
6876 1.1 skrll /* Return the additional space needed in a frag
6877 1.1 skrll for possible relaxations of any ops in a VLIW insn.
6878 1.1 skrll Also fill out the relaxations that might be required of
6879 1.1 skrll each tinsn in the vinsn. */
6880 1.1 skrll
6881 1.1 skrll static int
6882 1.1 skrll relaxation_requirements (vliw_insn *vinsn, bfd_boolean *pfinish_frag)
6883 1.1 skrll {
6884 1.1 skrll bfd_boolean finish_frag = FALSE;
6885 1.1 skrll int extra_space = 0;
6886 1.1 skrll int slot;
6887 1.1 skrll
6888 1.1 skrll for (slot = 0; slot < vinsn->num_slots; slot++)
6889 1.1 skrll {
6890 1.1 skrll TInsn *tinsn = &vinsn->slots[slot];
6891 1.1 skrll if (!tinsn_has_symbolic_operands (tinsn))
6892 1.1 skrll {
6893 1.1 skrll /* A narrow instruction could be widened later to help
6894 1.1 skrll alignment issues. */
6895 1.1 skrll if (xg_is_single_relaxable_insn (tinsn, 0, TRUE)
6896 1.1 skrll && !tinsn->is_specific_opcode
6897 1.1 skrll && vinsn->num_slots == 1)
6898 1.1 skrll {
6899 1.1 skrll /* Difference in bytes between narrow and wide insns... */
6900 1.1 skrll extra_space += 1;
6901 1.1 skrll tinsn->subtype = RELAX_NARROW;
6902 1.1 skrll }
6903 1.1 skrll }
6904 1.1 skrll else
6905 1.1 skrll {
6906 1.1 skrll if (workaround_b_j_loop_end
6907 1.1 skrll && tinsn->opcode == xtensa_jx_opcode
6908 1.1 skrll && use_transform ())
6909 1.1 skrll {
6910 1.1 skrll /* Add 2 of these. */
6911 1.1 skrll extra_space += 3; /* for the nop size */
6912 1.1 skrll tinsn->subtype = RELAX_ADD_NOP_IF_PRE_LOOP_END;
6913 1.1 skrll }
6914 1.1 skrll
6915 1.1 skrll /* Need to assemble it with space for the relocation. */
6916 1.1 skrll if (xg_is_relaxable_insn (tinsn, 0)
6917 1.1 skrll && !tinsn->is_specific_opcode)
6918 1.1 skrll {
6919 1.1 skrll int max_size = xg_get_max_insn_widen_size (tinsn->opcode);
6920 1.1 skrll int max_literal_size =
6921 1.1 skrll xg_get_max_insn_widen_literal_size (tinsn->opcode);
6922 1.1 skrll
6923 1.1 skrll tinsn->literal_space = max_literal_size;
6924 1.1 skrll
6925 1.1 skrll tinsn->subtype = RELAX_IMMED;
6926 1.1 skrll extra_space += max_size;
6927 1.1 skrll }
6928 1.1 skrll else
6929 1.1 skrll {
6930 1.1 skrll /* A fix record will be added for this instruction prior
6931 1.1 skrll to relaxation, so make it end the frag. */
6932 1.1 skrll finish_frag = TRUE;
6933 1.1 skrll }
6934 1.1 skrll }
6935 1.1 skrll }
6936 1.1 skrll *pfinish_frag = finish_frag;
6937 1.1.1.2 christos return extra_space;
6938 1.1 skrll }
6939 1.1 skrll
6940 1.1 skrll
6941 1.1 skrll static void
6942 1.1 skrll bundle_tinsn (TInsn *tinsn, vliw_insn *vinsn)
6943 1.1 skrll {
6944 1.1 skrll xtensa_isa isa = xtensa_default_isa;
6945 1.1 skrll int slot, chosen_slot;
6946 1.1 skrll
6947 1.1 skrll vinsn->format = xg_get_single_format (tinsn->opcode);
6948 1.1 skrll gas_assert (vinsn->format != XTENSA_UNDEFINED);
6949 1.1 skrll vinsn->num_slots = xtensa_format_num_slots (isa, vinsn->format);
6950 1.1 skrll
6951 1.1 skrll chosen_slot = xg_get_single_slot (tinsn->opcode);
6952 1.1 skrll for (slot = 0; slot < vinsn->num_slots; slot++)
6953 1.1 skrll {
6954 1.1 skrll if (slot == chosen_slot)
6955 1.1 skrll vinsn->slots[slot] = *tinsn;
6956 1.1 skrll else
6957 1.1 skrll {
6958 1.1 skrll vinsn->slots[slot].opcode =
6959 1.1 skrll xtensa_format_slot_nop_opcode (isa, vinsn->format, slot);
6960 1.1 skrll vinsn->slots[slot].ntok = 0;
6961 1.1 skrll vinsn->slots[slot].insn_type = ITYPE_INSN;
6962 1.1 skrll }
6963 1.1 skrll }
6964 1.1 skrll }
6965 1.1 skrll
6966 1.1 skrll
6967 1.1 skrll static bfd_boolean
6968 1.1 skrll emit_single_op (TInsn *orig_insn)
6969 1.1 skrll {
6970 1.1 skrll int i;
6971 1.1 skrll IStack istack; /* put instructions into here */
6972 1.1 skrll symbolS *lit_sym = NULL;
6973 1.1 skrll symbolS *label_sym = NULL;
6974 1.1 skrll
6975 1.1 skrll istack_init (&istack);
6976 1.1 skrll
6977 1.1 skrll /* Special-case for "movi aX, foo" which is guaranteed to need relaxing.
6978 1.1 skrll Because the scheduling and bundling characteristics of movi and
6979 1.1 skrll l32r or const16 are so different, we can do much better if we relax
6980 1.1 skrll it prior to scheduling and bundling, rather than after. */
6981 1.1 skrll if ((orig_insn->opcode == xtensa_movi_opcode
6982 1.1 skrll || orig_insn->opcode == xtensa_movi_n_opcode)
6983 1.1 skrll && !cur_vinsn.inside_bundle
6984 1.1 skrll && (orig_insn->tok[1].X_op == O_symbol
6985 1.1 skrll || orig_insn->tok[1].X_op == O_pltrel
6986 1.1 skrll || orig_insn->tok[1].X_op == O_tlsfunc
6987 1.1 skrll || orig_insn->tok[1].X_op == O_tlsarg
6988 1.1 skrll || orig_insn->tok[1].X_op == O_tpoff
6989 1.1 skrll || orig_insn->tok[1].X_op == O_dtpoff)
6990 1.1 skrll && !orig_insn->is_specific_opcode && use_transform ())
6991 1.1.1.2 christos xg_assembly_relax (&istack, orig_insn, now_seg, frag_now, 0, 1, 0);
6992 1.1 skrll else
6993 1.1 skrll if (xg_expand_assembly_insn (&istack, orig_insn))
6994 1.1 skrll return TRUE;
6995 1.1 skrll
6996 1.1 skrll for (i = 0; i < istack.ninsn; i++)
6997 1.1.1.5 christos {
6998 1.1 skrll TInsn *insn = &istack.insn[i];
6999 1.1 skrll switch (insn->insn_type)
7000 1.1.1.2 christos {
7001 1.1 skrll case ITYPE_LITERAL:
7002 1.1.1.2 christos gas_assert (lit_sym == NULL);
7003 1.1 skrll lit_sym = xg_assemble_literal (insn);
7004 1.1 skrll break;
7005 1.1 skrll case ITYPE_LABEL:
7006 1.1 skrll {
7007 1.1 skrll static int relaxed_sym_idx = 0;
7008 1.1 skrll char *label = XNEWVEC (char, strlen (FAKE_LABEL_NAME) + 12);
7009 1.1 skrll sprintf (label, "%s_rl_%x", FAKE_LABEL_NAME, relaxed_sym_idx++);
7010 1.1 skrll colon (label);
7011 1.1 skrll gas_assert (label_sym == NULL);
7012 1.1 skrll label_sym = symbol_find_or_make (label);
7013 1.1 skrll gas_assert (label_sym);
7014 1.1 skrll free (label);
7015 1.1 skrll }
7016 1.1 skrll break;
7017 1.1 skrll case ITYPE_INSN:
7018 1.1 skrll {
7019 1.1 skrll vliw_insn v;
7020 1.1.1.2 christos if (lit_sym)
7021 1.1 skrll xg_resolve_literals (insn, lit_sym);
7022 1.1 skrll if (label_sym)
7023 1.1 skrll xg_resolve_labels (insn, label_sym);
7024 1.1 skrll xg_init_vinsn (&v);
7025 1.1 skrll bundle_tinsn (insn, &v);
7026 1.1 skrll finish_vinsn (&v);
7027 1.1 skrll xg_free_vinsn (&v);
7028 1.1 skrll }
7029 1.1 skrll break;
7030 1.1 skrll default:
7031 1.1 skrll gas_assert (0);
7032 1.1 skrll break;
7033 1.1 skrll }
7034 1.1.1.2 christos }
7035 1.1 skrll return FALSE;
7036 1.1 skrll }
7037 1.1 skrll
7038 1.1 skrll
7039 1.1 skrll static int
7040 1.1 skrll total_frag_text_expansion (fragS *fragP)
7041 1.1 skrll {
7042 1.1 skrll int slot;
7043 1.1 skrll int total_expansion = 0;
7044 1.1 skrll
7045 1.1 skrll for (slot = 0; slot < config_max_slots; slot++)
7046 1.1 skrll total_expansion += fragP->tc_frag_data.text_expansion[slot];
7047 1.1 skrll
7048 1.1 skrll return total_expansion;
7049 1.1 skrll }
7050 1.1 skrll
7051 1.1 skrll
7052 1.1 skrll /* Emit a vliw instruction to the current fragment. */
7053 1.1 skrll
7054 1.1 skrll static void
7055 1.1 skrll xg_assemble_vliw_tokens (vliw_insn *vinsn)
7056 1.1 skrll {
7057 1.1 skrll bfd_boolean finish_frag;
7058 1.1 skrll bfd_boolean is_jump = FALSE;
7059 1.1 skrll bfd_boolean is_branch = FALSE;
7060 1.1 skrll xtensa_isa isa = xtensa_default_isa;
7061 1.1 skrll int insn_size;
7062 1.1 skrll int extra_space;
7063 1.1 skrll char *f = NULL;
7064 1.1 skrll int slot;
7065 1.1 skrll struct dwarf2_line_info debug_line;
7066 1.1 skrll bfd_boolean loc_directive_seen = FALSE;
7067 1.1 skrll TInsn *tinsn;
7068 1.1 skrll
7069 1.1 skrll memset (&debug_line, 0, sizeof (struct dwarf2_line_info));
7070 1.1 skrll
7071 1.1 skrll if (generating_literals)
7072 1.1 skrll {
7073 1.1 skrll static int reported = 0;
7074 1.1 skrll if (reported < 4)
7075 1.1.1.4 christos as_bad_where (frag_now->fr_file, frag_now->fr_line,
7076 1.1 skrll _("cannot assemble into a literal fragment"));
7077 1.1 skrll if (reported == 3)
7078 1.1 skrll as_bad (_("..."));
7079 1.1 skrll reported++;
7080 1.1 skrll return;
7081 1.1 skrll }
7082 1.1 skrll
7083 1.1 skrll if (frag_now_fix () != 0
7084 1.1 skrll && (! frag_now->tc_frag_data.is_insn
7085 1.1 skrll || (vinsn_has_specific_opcodes (vinsn) && use_transform ())
7086 1.1 skrll || (!use_transform ()) != frag_now->tc_frag_data.is_no_transform
7087 1.1 skrll || (directive_state[directive_longcalls]
7088 1.1 skrll != frag_now->tc_frag_data.use_longcalls)
7089 1.1 skrll || (directive_state[directive_absolute_literals]
7090 1.1 skrll != frag_now->tc_frag_data.use_absolute_literals)))
7091 1.1 skrll {
7092 1.1 skrll frag_wane (frag_now);
7093 1.1 skrll frag_new (0);
7094 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
7095 1.1 skrll }
7096 1.1 skrll
7097 1.1 skrll if (workaround_a0_b_retw
7098 1.1 skrll && vinsn->num_slots == 1
7099 1.1 skrll && (get_last_insn_flags (now_seg, now_subseg) & FLAG_IS_A0_WRITER) != 0
7100 1.1 skrll && xtensa_opcode_is_branch (isa, vinsn->slots[0].opcode) == 1
7101 1.1 skrll && use_transform ())
7102 1.1 skrll {
7103 1.1 skrll has_a0_b_retw = TRUE;
7104 1.1 skrll
7105 1.1 skrll /* Mark this fragment with the special RELAX_ADD_NOP_IF_A0_B_RETW.
7106 1.1 skrll After the first assembly pass we will check all of them and
7107 1.1 skrll add a nop if needed. */
7108 1.1 skrll frag_now->tc_frag_data.is_insn = TRUE;
7109 1.1 skrll frag_var (rs_machine_dependent, 4, 4,
7110 1.1 skrll RELAX_ADD_NOP_IF_A0_B_RETW,
7111 1.1 skrll frag_now->fr_symbol,
7112 1.1 skrll frag_now->fr_offset,
7113 1.1 skrll NULL);
7114 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
7115 1.1 skrll frag_now->tc_frag_data.is_insn = TRUE;
7116 1.1 skrll frag_var (rs_machine_dependent, 4, 4,
7117 1.1 skrll RELAX_ADD_NOP_IF_A0_B_RETW,
7118 1.1 skrll frag_now->fr_symbol,
7119 1.1 skrll frag_now->fr_offset,
7120 1.1 skrll NULL);
7121 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
7122 1.1 skrll }
7123 1.1 skrll
7124 1.1 skrll for (slot = 0; slot < vinsn->num_slots; slot++)
7125 1.1 skrll {
7126 1.1 skrll tinsn = &vinsn->slots[slot];
7127 1.1 skrll
7128 1.1 skrll /* See if the instruction implies an aligned section. */
7129 1.1 skrll if (xtensa_opcode_is_loop (isa, tinsn->opcode) == 1)
7130 1.1 skrll record_alignment (now_seg, 2);
7131 1.1 skrll
7132 1.1 skrll /* Determine the best line number for debug info. */
7133 1.1 skrll if ((tinsn->loc_directive_seen || !loc_directive_seen)
7134 1.1 skrll && (tinsn->debug_line.filenum != debug_line.filenum
7135 1.1 skrll || tinsn->debug_line.line < debug_line.line
7136 1.1 skrll || tinsn->debug_line.column < debug_line.column))
7137 1.1 skrll debug_line = tinsn->debug_line;
7138 1.1 skrll if (tinsn->loc_directive_seen)
7139 1.1 skrll loc_directive_seen = TRUE;
7140 1.1 skrll }
7141 1.1 skrll
7142 1.1 skrll /* Special cases for instructions that force an alignment... */
7143 1.1 skrll /* None of these opcodes are bundle-able. */
7144 1.1 skrll if (xtensa_opcode_is_loop (isa, vinsn->slots[0].opcode) == 1)
7145 1.1 skrll {
7146 1.1 skrll int max_fill;
7147 1.1 skrll
7148 1.1 skrll /* Remember the symbol that marks the end of the loop in the frag
7149 1.1 skrll that marks the start of the loop. This way we can easily find
7150 1.1 skrll the end of the loop at the beginning, without adding special code
7151 1.1 skrll to mark the loop instructions themselves. */
7152 1.1 skrll symbolS *target_sym = NULL;
7153 1.1 skrll if (vinsn->slots[0].tok[1].X_op == O_symbol)
7154 1.1 skrll target_sym = vinsn->slots[0].tok[1].X_add_symbol;
7155 1.1 skrll
7156 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
7157 1.1 skrll frag_now->tc_frag_data.is_insn = TRUE;
7158 1.1 skrll
7159 1.1 skrll max_fill = get_text_align_max_fill_size
7160 1.1 skrll (get_text_align_power (xtensa_fetch_width),
7161 1.1 skrll TRUE, frag_now->tc_frag_data.is_no_density);
7162 1.1 skrll
7163 1.1 skrll if (use_transform ())
7164 1.1 skrll frag_var (rs_machine_dependent, max_fill, max_fill,
7165 1.1 skrll RELAX_ALIGN_NEXT_OPCODE, target_sym, 0, NULL);
7166 1.1 skrll else
7167 1.1 skrll frag_var (rs_machine_dependent, 0, 0,
7168 1.1 skrll RELAX_CHECK_ALIGN_NEXT_OPCODE, target_sym, 0, NULL);
7169 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
7170 1.1 skrll }
7171 1.1 skrll
7172 1.1 skrll if (vinsn->slots[0].opcode == xtensa_entry_opcode
7173 1.1 skrll && !vinsn->slots[0].is_specific_opcode)
7174 1.1 skrll {
7175 1.1 skrll xtensa_mark_literal_pool_location ();
7176 1.1 skrll xtensa_move_labels (frag_now, 0);
7177 1.1 skrll frag_var (rs_align_test, 1, 1, 0, NULL, 2, NULL);
7178 1.1 skrll }
7179 1.1 skrll
7180 1.1 skrll if (vinsn->num_slots == 1)
7181 1.1 skrll {
7182 1.1 skrll if (workaround_a0_b_retw && use_transform ())
7183 1.1 skrll set_last_insn_flags (now_seg, now_subseg, FLAG_IS_A0_WRITER,
7184 1.1 skrll is_register_writer (&vinsn->slots[0], "a", 0));
7185 1.1 skrll
7186 1.1 skrll set_last_insn_flags (now_seg, now_subseg, FLAG_IS_BAD_LOOPEND,
7187 1.1 skrll is_bad_loopend_opcode (&vinsn->slots[0]));
7188 1.1 skrll }
7189 1.1 skrll else
7190 1.1 skrll set_last_insn_flags (now_seg, now_subseg, FLAG_IS_BAD_LOOPEND, FALSE);
7191 1.1 skrll
7192 1.1 skrll insn_size = xtensa_format_length (isa, vinsn->format);
7193 1.1 skrll
7194 1.1 skrll extra_space = relaxation_requirements (vinsn, &finish_frag);
7195 1.1 skrll
7196 1.1 skrll /* vinsn_to_insnbuf will produce the error. */
7197 1.1 skrll if (vinsn->format != XTENSA_UNDEFINED)
7198 1.1 skrll {
7199 1.1 skrll f = frag_more (insn_size + extra_space);
7200 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
7201 1.1 skrll frag_now->tc_frag_data.is_insn = TRUE;
7202 1.1 skrll }
7203 1.1 skrll
7204 1.1 skrll vinsn_to_insnbuf (vinsn, f, frag_now, FALSE);
7205 1.1 skrll if (vinsn->format == XTENSA_UNDEFINED)
7206 1.1 skrll return;
7207 1.1 skrll
7208 1.1 skrll xtensa_insnbuf_to_chars (isa, vinsn->insnbuf, (unsigned char *) f, 0);
7209 1.1 skrll
7210 1.1.1.4 christos if (debug_type == DEBUG_DWARF2 || loc_directive_seen)
7211 1.1.1.8 christos dwarf2_gen_line_info (frag_now_fix () - (insn_size + extra_space),
7212 1.1.1.8 christos &debug_line);
7213 1.1 skrll
7214 1.1 skrll for (slot = 0; slot < vinsn->num_slots; slot++)
7215 1.1.1.2 christos {
7216 1.1 skrll tinsn = &vinsn->slots[slot];
7217 1.1 skrll frag_now->tc_frag_data.slot_subtypes[slot] = tinsn->subtype;
7218 1.1.1.2 christos frag_now->tc_frag_data.slot_symbols[slot] = tinsn->symbol;
7219 1.1 skrll frag_now->tc_frag_data.slot_offsets[slot] = tinsn->offset;
7220 1.1 skrll frag_now->tc_frag_data.literal_frags[slot] = tinsn->literal_frag;
7221 1.1 skrll if (tinsn->opcode == xtensa_l32r_opcode)
7222 1.1 skrll frag_now->tc_frag_data.literal_frags[slot]
7223 1.1 skrll = symbol_get_frag (tinsn->tok[1].X_add_symbol);
7224 1.1 skrll if (tinsn->literal_space != 0)
7225 1.1 skrll xg_assemble_literal_space (tinsn->literal_space, slot);
7226 1.1 skrll frag_now->tc_frag_data.free_reg[slot] = tinsn->extra_arg;
7227 1.1 skrll
7228 1.1 skrll if (tinsn->subtype == RELAX_NARROW)
7229 1.1 skrll gas_assert (vinsn->num_slots == 1);
7230 1.1 skrll if (xtensa_opcode_is_jump (isa, tinsn->opcode) == 1)
7231 1.1 skrll is_jump = TRUE;
7232 1.1 skrll if (xtensa_opcode_is_branch (isa, tinsn->opcode) == 1)
7233 1.1 skrll is_branch = TRUE;
7234 1.1 skrll
7235 1.1 skrll if (tinsn->subtype || tinsn->symbol || tinsn->offset
7236 1.1 skrll || tinsn->literal_frag || is_jump || is_branch)
7237 1.1 skrll finish_frag = TRUE;
7238 1.1 skrll }
7239 1.1 skrll
7240 1.1 skrll if (vinsn_has_specific_opcodes (vinsn) && use_transform ())
7241 1.1 skrll frag_now->tc_frag_data.is_specific_opcode = TRUE;
7242 1.1 skrll
7243 1.1 skrll if (finish_frag)
7244 1.1 skrll {
7245 1.1 skrll frag_variant (rs_machine_dependent,
7246 1.1 skrll extra_space, extra_space, RELAX_SLOTS,
7247 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, f);
7248 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
7249 1.1 skrll }
7250 1.1 skrll
7251 1.1 skrll /* Special cases for loops:
7252 1.1 skrll close_loop_end should be inserted AFTER short_loop.
7253 1.1 skrll Make sure that CLOSE loops are processed BEFORE short_loops
7254 1.1 skrll when converting them. */
7255 1.1 skrll
7256 1.1 skrll /* "short_loop": Add a NOP if the loop is < 4 bytes. */
7257 1.1 skrll if (xtensa_opcode_is_loop (isa, vinsn->slots[0].opcode) == 1
7258 1.1 skrll && !vinsn->slots[0].is_specific_opcode)
7259 1.1 skrll {
7260 1.1 skrll if (workaround_short_loop && use_transform ())
7261 1.1 skrll {
7262 1.1 skrll maybe_has_short_loop = TRUE;
7263 1.1 skrll frag_now->tc_frag_data.is_insn = TRUE;
7264 1.1 skrll frag_var (rs_machine_dependent, 4, 4,
7265 1.1 skrll RELAX_ADD_NOP_IF_SHORT_LOOP,
7266 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
7267 1.1 skrll frag_now->tc_frag_data.is_insn = TRUE;
7268 1.1 skrll frag_var (rs_machine_dependent, 4, 4,
7269 1.1 skrll RELAX_ADD_NOP_IF_SHORT_LOOP,
7270 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
7271 1.1 skrll }
7272 1.1 skrll
7273 1.1 skrll /* "close_loop_end": Add up to 12 bytes of NOPs to keep a
7274 1.1 skrll loop at least 12 bytes away from another loop's end. */
7275 1.1 skrll if (workaround_close_loop_end && use_transform ())
7276 1.1 skrll {
7277 1.1 skrll maybe_has_close_loop_end = TRUE;
7278 1.1.1.2 christos frag_now->tc_frag_data.is_insn = TRUE;
7279 1.1 skrll frag_var (rs_machine_dependent, 12, 12,
7280 1.1.1.2 christos RELAX_ADD_NOP_IF_CLOSE_LOOP_END,
7281 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
7282 1.1 skrll }
7283 1.1 skrll }
7284 1.1.1.4 christos
7285 1.1.1.4 christos if (use_transform ())
7286 1.1.1.4 christos {
7287 1.1 skrll if (is_jump)
7288 1.1 skrll {
7289 1.1 skrll gas_assert (finish_frag);
7290 1.1.1.2 christos frag_var (rs_machine_dependent,
7291 1.1 skrll xtensa_fetch_width, xtensa_fetch_width,
7292 1.1.1.2 christos RELAX_UNREACHABLE,
7293 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
7294 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
7295 1.1 skrll xtensa_maybe_create_trampoline_frag ();
7296 1.1 skrll /* Always create one here. */
7297 1.1 skrll xtensa_maybe_create_literal_pool_frag (TRUE, FALSE);
7298 1.1 skrll }
7299 1.1 skrll else if (is_branch && do_align_targets ())
7300 1.1 skrll {
7301 1.1 skrll gas_assert (finish_frag);
7302 1.1 skrll frag_var (rs_machine_dependent,
7303 1.1 skrll xtensa_fetch_width, xtensa_fetch_width,
7304 1.1 skrll RELAX_MAYBE_UNREACHABLE,
7305 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
7306 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
7307 1.1 skrll frag_var (rs_machine_dependent,
7308 1.1 skrll 0, 0,
7309 1.1 skrll RELAX_MAYBE_DESIRE_ALIGN,
7310 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
7311 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
7312 1.1 skrll }
7313 1.1 skrll }
7314 1.1 skrll
7315 1.1 skrll /* Now, if the original opcode was a call... */
7316 1.1 skrll if (do_align_targets ()
7317 1.1 skrll && xtensa_opcode_is_call (isa, vinsn->slots[0].opcode) == 1)
7318 1.1 skrll {
7319 1.1 skrll float freq = get_subseg_total_freq (now_seg, now_subseg);
7320 1.1 skrll frag_now->tc_frag_data.is_insn = TRUE;
7321 1.1 skrll frag_var (rs_machine_dependent, 4, (int) freq, RELAX_DESIRE_ALIGN,
7322 1.1 skrll frag_now->fr_symbol, frag_now->fr_offset, NULL);
7323 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
7324 1.1 skrll }
7325 1.1 skrll
7326 1.1 skrll if (vinsn_has_specific_opcodes (vinsn) && use_transform ())
7327 1.1 skrll {
7328 1.1 skrll frag_wane (frag_now);
7329 1.1 skrll frag_new (0);
7330 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
7331 1.1 skrll }
7332 1.1 skrll }
7333 1.1 skrll
7334 1.1 skrll
7335 1.1 skrll /* xtensa_end and helper functions. */
7337 1.1 skrll
7338 1.1 skrll static void xtensa_cleanup_align_frags (void);
7339 1.1 skrll static void xtensa_fix_target_frags (void);
7340 1.1 skrll static void xtensa_mark_narrow_branches (void);
7341 1.1 skrll static void xtensa_mark_zcl_first_insns (void);
7342 1.1 skrll static void xtensa_mark_difference_of_two_symbols (void);
7343 1.1 skrll static void xtensa_fix_a0_b_retw_frags (void);
7344 1.1 skrll static void xtensa_fix_b_j_loop_end_frags (void);
7345 1.1 skrll static void xtensa_fix_close_loop_end_frags (void);
7346 1.1 skrll static void xtensa_fix_short_loop_frags (void);
7347 1.1 skrll static void xtensa_sanity_check (void);
7348 1.1 skrll static void xtensa_add_config_info (void);
7349 1.1 skrll
7350 1.1 skrll void
7351 1.1 skrll xtensa_end (void)
7352 1.1 skrll {
7353 1.1 skrll directive_balance ();
7354 1.1 skrll xtensa_flush_pending_output ();
7355 1.1 skrll
7356 1.1 skrll past_xtensa_end = TRUE;
7357 1.1 skrll
7358 1.1 skrll xtensa_move_literals ();
7359 1.1 skrll
7360 1.1 skrll xtensa_reorder_segments ();
7361 1.1 skrll xtensa_cleanup_align_frags ();
7362 1.1 skrll xtensa_fix_target_frags ();
7363 1.1 skrll if (workaround_a0_b_retw && has_a0_b_retw)
7364 1.1 skrll xtensa_fix_a0_b_retw_frags ();
7365 1.1 skrll if (workaround_b_j_loop_end)
7366 1.1 skrll xtensa_fix_b_j_loop_end_frags ();
7367 1.1 skrll
7368 1.1 skrll /* "close_loop_end" should be processed BEFORE "short_loop". */
7369 1.1.1.4 christos if (workaround_close_loop_end && maybe_has_close_loop_end)
7370 1.1.1.4 christos xtensa_fix_close_loop_end_frags ();
7371 1.1 skrll
7372 1.1 skrll if (workaround_short_loop && maybe_has_short_loop)
7373 1.1.1.6 christos xtensa_fix_short_loop_frags ();
7374 1.1.1.6 christos if (align_targets)
7375 1.1.1.6 christos xtensa_mark_narrow_branches ();
7376 1.1.1.6 christos xtensa_mark_zcl_first_insns ();
7377 1.1.1.6 christos
7378 1.1 skrll xtensa_sanity_check ();
7379 1.1.1.6 christos
7380 1.1.1.6 christos xtensa_add_config_info ();
7381 1.1.1.6 christos
7382 1.1.1.6 christos xtensa_check_frag_count ();
7383 1.1.1.6 christos }
7384 1.1.1.6 christos
7385 1.1.1.6 christos struct trampoline_chain_entry
7386 1.1.1.6 christos {
7387 1.1.1.6 christos symbolS *sym;
7388 1.1.1.6 christos addressT offset;
7389 1.1.1.6 christos };
7390 1.1.1.6 christos
7391 1.1.1.6 christos /* Trampoline chain for a given (sym, offset) pair is a sorted array
7392 1.1.1.6 christos of locations of trampoline jumps leading there. Jumps are represented
7393 1.1.1.4 christos as pairs (sym, offset): trampoline frag symbol and offset of the jump
7394 1.1.1.6 christos inside the frag. */
7395 1.1.1.6 christos struct trampoline_chain
7396 1.1.1.6 christos {
7397 1.1.1.6 christos struct trampoline_chain_entry target;
7398 1.1.1.6 christos struct trampoline_chain_entry *entry;
7399 1.1.1.6 christos size_t n_entries;
7400 1.1.1.6 christos size_t n_max;
7401 1.1.1.6 christos bfd_boolean needs_sorting;
7402 1.1.1.6 christos };
7403 1.1.1.6 christos
7404 1.1.1.6 christos struct trampoline_chain_index
7405 1.1.1.4 christos {
7406 1.1.1.4 christos struct trampoline_chain *entry;
7407 1.1.1.4 christos size_t n_entries;
7408 1.1.1.4 christos size_t n_max;
7409 1.1.1.4 christos bfd_boolean needs_sorting;
7410 1.1.1.4 christos };
7411 1.1.1.6 christos
7412 1.1.1.6 christos struct trampoline_index
7413 1.1.1.6 christos {
7414 1.1.1.6 christos fragS **entry;
7415 1.1.1.4 christos size_t n_entries;
7416 1.1.1.4 christos size_t n_max;
7417 1.1.1.4 christos };
7418 1.1.1.4 christos
7419 1.1.1.6 christos struct trampoline_seg
7420 1.1.1.4 christos {
7421 1.1.1.4 christos struct trampoline_seg *next;
7422 1.1.1.4 christos asection *seg;
7423 1.1.1.4 christos /* Trampolines ordered by their frag fr_address */
7424 1.1.1.4 christos struct trampoline_index index;
7425 1.1.1.4 christos /* Known trampoline chains ordered by (sym, offset) pair */
7426 1.1.1.4 christos struct trampoline_chain_index chain_index;
7427 1.1.1.4 christos };
7428 1.1.1.4 christos
7429 1.1.1.4 christos static struct trampoline_seg trampoline_seg_list;
7430 1.1.1.4 christos #define J_RANGE (128 * 1024)
7431 1.1.1.4 christos #define J_MARGIN 4096
7432 1.1.1.4 christos
7433 1.1.1.4 christos static int unreachable_count = 0;
7434 1.1.1.4 christos
7435 1.1.1.4 christos
7436 1.1.1.4 christos static void
7437 1.1.1.4 christos xtensa_maybe_create_trampoline_frag (void)
7438 1.1.1.4 christos {
7439 1.1.1.4 christos if (!use_trampolines)
7440 1.1.1.4 christos return;
7441 1.1.1.4 christos
7442 1.1.1.4 christos /* We create an area for possible trampolines every 10 unreachable frags.
7443 1.1.1.4 christos These are preferred over the ones not preceded by an unreachable frag,
7444 1.1.1.4 christos because we don't have to jump around them. This function is called after
7445 1.1.1.4 christos each RELAX_UNREACHABLE frag is created. */
7446 1.1.1.4 christos
7447 1.1.1.4 christos if (++unreachable_count > 10)
7448 1.1.1.4 christos {
7449 1.1.1.4 christos xtensa_create_trampoline_frag (FALSE);
7450 1.1.1.4 christos clear_frag_count ();
7451 1.1.1.4 christos unreachable_count = 0;
7452 1.1.1.4 christos }
7453 1.1.1.4 christos }
7454 1.1.1.4 christos
7455 1.1.1.4 christos static void
7456 1.1.1.4 christos xtensa_check_frag_count (void)
7457 1.1.1.4 christos {
7458 1.1.1.4 christos if (!use_trampolines || frag_now->tc_frag_data.is_no_transform)
7459 1.1.1.4 christos return;
7460 1.1.1.4 christos
7461 1.1.1.4 christos /* We create an area for possible trampolines every 8000 frags or so. This
7462 1.1.1.4 christos is an estimate based on the max range of a "j" insn (+/-128K) divided
7463 1.1.1.4 christos by a typical frag byte count (16), minus a few for safety. This function
7464 1.1.1.4 christos is called after each source line is processed. */
7465 1.1.1.4 christos
7466 1.1.1.4 christos if (get_frag_count () > 8000)
7467 1.1.1.4 christos {
7468 1.1.1.4 christos xtensa_create_trampoline_frag (TRUE);
7469 1.1.1.4 christos clear_frag_count ();
7470 1.1.1.4 christos unreachable_count = 0;
7471 1.1.1.4 christos }
7472 1.1.1.4 christos
7473 1.1.1.4 christos /* We create an area for a possible literal pool every N (default 5000)
7474 1.1.1.6 christos frags or so. */
7475 1.1.1.6 christos xtensa_maybe_create_literal_pool_frag (TRUE, TRUE);
7476 1.1.1.6 christos }
7477 1.1.1.6 christos
7478 1.1.1.6 christos static xtensa_insnbuf trampoline_buf = NULL;
7479 1.1.1.6 christos static xtensa_insnbuf trampoline_slotbuf = NULL;
7480 1.1.1.6 christos
7481 1.1.1.6 christos static xtensa_insnbuf litpool_buf = NULL;
7482 1.1.1.6 christos static xtensa_insnbuf litpool_slotbuf = NULL;
7483 1.1.1.6 christos
7484 1.1.1.6 christos #define TRAMPOLINE_FRAG_SIZE 3000
7485 1.1.1.6 christos
7486 1.1.1.6 christos static struct trampoline_seg *
7487 1.1.1.6 christos find_trampoline_seg (asection *seg)
7488 1.1.1.6 christos {
7489 1.1.1.6 christos struct trampoline_seg *ts = trampoline_seg_list.next;
7490 1.1.1.6 christos static struct trampoline_seg *mr;
7491 1.1.1.6 christos
7492 1.1.1.6 christos if (mr && mr->seg == seg)
7493 1.1.1.6 christos return mr;
7494 1.1.1.6 christos
7495 1.1.1.6 christos for ( ; ts; ts = ts->next)
7496 1.1.1.6 christos {
7497 1.1.1.6 christos if (ts->seg == seg)
7498 1.1.1.6 christos {
7499 1.1.1.6 christos mr = ts;
7500 1.1.1.6 christos return ts;
7501 1.1.1.6 christos }
7502 1.1.1.6 christos }
7503 1.1.1.6 christos
7504 1.1.1.6 christos return NULL;
7505 1.1.1.6 christos }
7506 1.1.1.6 christos
7507 1.1.1.6 christos static size_t xg_find_trampoline (const struct trampoline_index *idx,
7508 1.1.1.6 christos addressT addr)
7509 1.1.1.6 christos {
7510 1.1.1.6 christos size_t a = 0;
7511 1.1.1.6 christos size_t b = idx->n_entries;
7512 1.1.1.6 christos
7513 1.1.1.6 christos while (b - a > 1)
7514 1.1.1.6 christos {
7515 1.1.1.6 christos size_t c = (a + b) / 2;
7516 1.1.1.6 christos
7517 1.1.1.6 christos if (idx->entry[c]->fr_address <= addr)
7518 1.1.1.6 christos a = c;
7519 1.1.1.6 christos else
7520 1.1.1.6 christos b = c;
7521 1.1.1.6 christos }
7522 1.1.1.6 christos return a;
7523 1.1.1.6 christos }
7524 1.1.1.6 christos
7525 1.1.1.6 christos static void xg_add_trampoline_to_index (struct trampoline_index *idx,
7526 1.1.1.6 christos fragS *fragP)
7527 1.1.1.6 christos {
7528 1.1.1.6 christos if (idx->n_entries == idx->n_max)
7529 1.1.1.6 christos {
7530 1.1.1.6 christos idx->n_max = (idx->n_entries + 1) * 2;
7531 1.1.1.6 christos idx->entry = xrealloc (idx->entry,
7532 1.1.1.6 christos sizeof (*idx->entry) * idx->n_max);
7533 1.1.1.6 christos }
7534 1.1.1.6 christos idx->entry[idx->n_entries] = fragP;
7535 1.1.1.6 christos ++idx->n_entries;
7536 1.1.1.6 christos }
7537 1.1.1.6 christos
7538 1.1.1.6 christos static void xg_remove_trampoline_from_index (struct trampoline_index *idx,
7539 1.1.1.6 christos size_t i)
7540 1.1.1.6 christos {
7541 1.1.1.4 christos gas_assert (i < idx->n_entries);
7542 1.1.1.4 christos memmove (idx->entry + i, idx->entry + i + 1,
7543 1.1.1.4 christos (idx->n_entries - i - 1) * sizeof (*idx->entry));
7544 1.1.1.4 christos --idx->n_entries;
7545 1.1.1.4 christos }
7546 1.1.1.4 christos
7547 1.1.1.4 christos static void xg_add_trampoline_to_seg (struct trampoline_seg *ts,
7548 1.1.1.4 christos fragS *fragP)
7549 1.1.1.4 christos {
7550 1.1.1.6 christos xg_add_trampoline_to_index (&ts->index, fragP);
7551 1.1.1.4 christos }
7552 1.1.1.4 christos
7553 1.1.1.4 christos static void
7554 1.1.1.4 christos xtensa_create_trampoline_frag (bfd_boolean needs_jump_around)
7555 1.1.1.4 christos {
7556 1.1.1.4 christos /* Emit a frag where we can place intermediate jump instructions,
7557 1.1.1.5 christos in case we need to jump farther than 128K bytes.
7558 1.1.1.4 christos Each jump instruction takes three bytes.
7559 1.1.1.4 christos We allocate enough for 1000 trampolines in each frag.
7560 1.1.1.4 christos If that's not enough, oh well. */
7561 1.1.1.4 christos
7562 1.1.1.4 christos struct trampoline_seg *ts = find_trampoline_seg (now_seg);
7563 1.1.1.4 christos char *varP;
7564 1.1.1.4 christos fragS *fragP;
7565 1.1.1.4 christos int size = TRAMPOLINE_FRAG_SIZE;
7566 1.1.1.4 christos
7567 1.1.1.4 christos if (ts == NULL)
7568 1.1.1.4 christos {
7569 1.1.1.4 christos ts = XCNEW(struct trampoline_seg);
7570 1.1.1.4 christos ts->next = trampoline_seg_list.next;
7571 1.1.1.4 christos trampoline_seg_list.next = ts;
7572 1.1.1.4 christos ts->seg = now_seg;
7573 1.1.1.6 christos }
7574 1.1.1.6 christos
7575 1.1.1.4 christos frag_wane (frag_now);
7576 1.1.1.4 christos frag_new (0);
7577 1.1.1.6 christos xtensa_set_frag_assembly_state (frag_now);
7578 1.1.1.6 christos varP = frag_var (rs_machine_dependent, size, size, RELAX_TRAMPOLINE, NULL, 0, NULL);
7579 1.1.1.6 christos fragP = (fragS *)(varP - SIZEOF_STRUCT_FRAG);
7580 1.1.1.6 christos if (trampoline_buf == NULL)
7581 1.1.1.4 christos {
7582 1.1.1.6 christos trampoline_buf = xtensa_insnbuf_alloc (xtensa_default_isa);
7583 1.1.1.4 christos trampoline_slotbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
7584 1.1.1.6 christos }
7585 1.1.1.6 christos fragP->tc_frag_data.needs_jump_around = needs_jump_around;
7586 1.1.1.4 christos xg_add_trampoline_to_seg (ts, fragP);
7587 1.1.1.8 christos }
7588 1.1.1.8 christos
7589 1.1.1.8 christos static bfd_boolean xg_is_trampoline_frag_full (const fragS *fragP)
7590 1.1.1.8 christos {
7591 1.1.1.8 christos return fragP->fr_var < 3;
7592 1.1.1.8 christos }
7593 1.1.1.8 christos
7594 1.1.1.8 christos static int xg_order_trampoline_chain_entry (const void *a, const void *b)
7595 1.1.1.8 christos {
7596 1.1.1.8 christos const struct trampoline_chain_entry *pa = a;
7597 1.1.1.8 christos const struct trampoline_chain_entry *pb = b;
7598 1.1.1.6 christos
7599 1.1.1.6 christos if (pa->sym != pb->sym)
7600 1.1.1.6 christos {
7601 1.1.1.6 christos valueT aval = S_GET_VALUE (pa->sym);
7602 1.1.1.6 christos valueT bval = S_GET_VALUE (pb->sym);
7603 1.1.1.6 christos
7604 1.1.1.6 christos if (aval != bval)
7605 1.1.1.6 christos return aval < bval ? -1 : 1;
7606 1.1.1.6 christos }
7607 1.1.1.6 christos if (pa->offset != pb->offset)
7608 1.1.1.6 christos return pa->offset < pb->offset ? -1 : 1;
7609 1.1.1.6 christos return 0;
7610 1.1.1.6 christos }
7611 1.1.1.6 christos
7612 1.1.1.6 christos static void xg_sort_trampoline_chain (struct trampoline_chain *tc)
7613 1.1.1.6 christos {
7614 1.1.1.6 christos qsort (tc->entry, tc->n_entries, sizeof (*tc->entry),
7615 1.1.1.6 christos xg_order_trampoline_chain_entry);
7616 1.1.1.6 christos tc->needs_sorting = FALSE;
7617 1.1.1.6 christos }
7618 1.1.1.4 christos
7619 1.1.1.6 christos /* Find entry index in the given chain with maximal address <= source. */
7620 1.1.1.6 christos static size_t xg_find_chain_entry (struct trampoline_chain *tc,
7621 1.1.1.6 christos addressT source)
7622 1.1.1.6 christos {
7623 1.1.1.6 christos size_t a = 0;
7624 1.1.1.6 christos size_t b = tc->n_entries;
7625 1.1.1.6 christos
7626 1.1.1.4 christos if (tc->needs_sorting)
7627 1.1.1.6 christos xg_sort_trampoline_chain (tc);
7628 1.1.1.6 christos
7629 1.1.1.4 christos while (b - a > 1)
7630 1.1.1.6 christos {
7631 1.1.1.6 christos size_t c = (a + b) / 2;
7632 1.1.1.6 christos struct trampoline_chain_entry *e = tc->entry + c;
7633 1.1.1.6 christos
7634 1.1.1.6 christos if (S_GET_VALUE(e->sym) + e->offset <= source)
7635 1.1.1.6 christos a = c;
7636 1.1.1.6 christos else
7637 1.1.1.6 christos b = c;
7638 1.1.1.6 christos }
7639 1.1.1.6 christos return a;
7640 1.1.1.6 christos }
7641 1.1.1.6 christos
7642 1.1.1.6 christos /* Find the best jump target for the source in the given trampoline chain.
7643 1.1.1.6 christos The best jump target is the one that results in the shortest path to the
7644 1.1.1.6 christos final target, it's the location of the jump closest to the final target,
7645 1.1.1.6 christos but within the J_RANGE - J_MARGIN from the source. */
7646 1.1.1.6 christos static struct trampoline_chain_entry *
7647 1.1.1.6 christos xg_get_best_chain_entry (struct trampoline_chain *tc, addressT source)
7648 1.1.1.6 christos {
7649 1.1.1.6 christos addressT target = S_GET_VALUE(tc->target.sym) + tc->target.offset;
7650 1.1.1.6 christos size_t i = xg_find_chain_entry (tc, source);
7651 1.1.1.6 christos struct trampoline_chain_entry *e = tc->entry + i;
7652 1.1.1.6 christos int step = target < source ? -1 : 1;
7653 1.1.1.6 christos addressT chained_target;
7654 1.1.1.6 christos offsetT off;
7655 1.1.1.6 christos
7656 1.1.1.6 christos if (target > source &&
7657 1.1.1.6 christos S_GET_VALUE(e->sym) + e->offset <= source &&
7658 1.1.1.6 christos i + 1 < tc->n_entries)
7659 1.1.1.6 christos ++i;
7660 1.1.1.6 christos
7661 1.1.1.6 christos while (i + step < tc->n_entries)
7662 1.1.1.6 christos {
7663 1.1.1.6 christos struct trampoline_chain_entry *next = tc->entry + i + step;
7664 1.1.1.6 christos
7665 1.1.1.6 christos chained_target = S_GET_VALUE(next->sym) + next->offset;
7666 1.1.1.6 christos off = source - chained_target;
7667 1.1.1.6 christos
7668 1.1.1.6 christos if (labs (off) >= J_RANGE - J_MARGIN)
7669 1.1.1.6 christos break;
7670 1.1.1.4 christos
7671 1.1.1.4 christos i += step;
7672 1.1.1.6 christos }
7673 1.1.1.6 christos
7674 1.1.1.6 christos e = tc->entry + i;
7675 1.1.1.6 christos chained_target = S_GET_VALUE(e->sym) + e->offset;
7676 1.1.1.6 christos off = source - chained_target;
7677 1.1.1.6 christos
7678 1.1.1.6 christos if (labs (off) < J_MARGIN ||
7679 1.1.1.6 christos labs (off) >= J_RANGE - J_MARGIN)
7680 1.1.1.6 christos return &tc->target;
7681 1.1.1.8 christos return tc->entry + i;
7682 1.1.1.8 christos }
7683 1.1.1.8 christos
7684 1.1.1.8 christos static int xg_order_trampoline_chain (const void *a, const void *b)
7685 1.1.1.8 christos {
7686 1.1.1.8 christos const struct trampoline_chain *_pa = a;
7687 1.1.1.8 christos const struct trampoline_chain *_pb = b;
7688 1.1.1.8 christos const struct trampoline_chain_entry *pa = &_pa->target;
7689 1.1.1.8 christos const struct trampoline_chain_entry *pb = &_pb->target;
7690 1.1.1.6 christos symbolS *s1 = pa->sym;
7691 1.1.1.8 christos symbolS *s2 = pb->sym;
7692 1.1.1.8 christos
7693 1.1.1.8 christos if (s1 != s2)
7694 1.1.1.8 christos {
7695 1.1.1.8 christos symbolS *tmp = symbol_symbolS (s1);
7696 1.1.1.8 christos if (tmp)
7697 1.1.1.8 christos s1 = tmp;
7698 1.1.1.6 christos
7699 1.1.1.6 christos tmp = symbol_symbolS (s2);
7700 1.1.1.6 christos if (tmp)
7701 1.1.1.6 christos s2 = tmp;
7702 1.1.1.6 christos
7703 1.1.1.6 christos if (s1 != s2)
7704 1.1.1.6 christos return s1 < s2 ? -1 : 1;
7705 1.1.1.6 christos }
7706 1.1.1.6 christos
7707 1.1.1.6 christos if (pa->offset != pb->offset)
7708 1.1.1.6 christos return pa->offset < pb->offset ? -1 : 1;
7709 1.1.1.6 christos return 0;
7710 1.1.1.6 christos }
7711 1.1.1.6 christos
7712 1.1.1.6 christos static struct trampoline_chain *
7713 1.1.1.6 christos xg_get_trampoline_chain (struct trampoline_seg *ts,
7714 1.1.1.6 christos symbolS *sym,
7715 1.1.1.6 christos addressT offset)
7716 1.1.1.6 christos {
7717 1.1.1.6 christos struct trampoline_chain_index *idx = &ts->chain_index;
7718 1.1.1.6 christos struct trampoline_chain c;
7719 1.1.1.6 christos
7720 1.1.1.6 christos if (idx->needs_sorting)
7721 1.1.1.6 christos {
7722 1.1.1.6 christos qsort (idx->entry, idx->n_entries, sizeof (*idx->entry),
7723 1.1.1.6 christos xg_order_trampoline_chain);
7724 1.1.1.6 christos idx->needs_sorting = FALSE;
7725 1.1.1.6 christos }
7726 1.1.1.6 christos c.target.sym = sym;
7727 1.1.1.6 christos c.target.offset = offset;
7728 1.1.1.6 christos return bsearch (&c, idx->entry, idx->n_entries,
7729 1.1.1.6 christos sizeof (struct trampoline_chain),
7730 1.1.1.6 christos xg_order_trampoline_chain);
7731 1.1.1.6 christos }
7732 1.1.1.6 christos
7733 1.1.1.6 christos /* Find trampoline chain in the given trampoline segment that is going
7734 1.1.1.6 christos to the *sym + *offset. If found, replace *sym and *offset with the
7735 1.1.1.6 christos best jump target in that chain. */
7736 1.1.1.6 christos static struct trampoline_chain *
7737 1.1.1.6 christos xg_find_best_eq_target (struct trampoline_seg *ts,
7738 1.1.1.6 christos addressT source, symbolS **sym,
7739 1.1.1.6 christos addressT *offset)
7740 1.1.1.6 christos {
7741 1.1.1.6 christos struct trampoline_chain *tc = xg_get_trampoline_chain (ts, *sym, *offset);
7742 1.1.1.6 christos
7743 1.1.1.6 christos if (tc)
7744 1.1.1.6 christos {
7745 1.1.1.6 christos struct trampoline_chain_entry *e = xg_get_best_chain_entry (tc, source);
7746 1.1.1.6 christos
7747 1.1.1.6 christos *sym = e->sym;
7748 1.1.1.6 christos *offset = e->offset;
7749 1.1.1.6 christos }
7750 1.1.1.6 christos return tc;
7751 1.1.1.6 christos }
7752 1.1.1.6 christos
7753 1.1.1.6 christos static void xg_add_location_to_chain (struct trampoline_chain *tc,
7754 1.1.1.6 christos symbolS *sym, addressT offset)
7755 1.1.1.6 christos {
7756 1.1.1.6 christos struct trampoline_chain_entry *e;
7757 1.1.1.6 christos
7758 1.1.1.6 christos if (tc->n_entries == tc->n_max)
7759 1.1.1.6 christos {
7760 1.1.1.6 christos tc->n_max = (tc->n_max + 1) * 2;
7761 1.1.1.6 christos tc->entry = xrealloc (tc->entry, sizeof (*tc->entry) * tc->n_max);
7762 1.1.1.6 christos }
7763 1.1.1.6 christos e = tc->entry + tc->n_entries;
7764 1.1.1.6 christos e->sym = sym;
7765 1.1.1.6 christos e->offset = offset;
7766 1.1.1.6 christos ++tc->n_entries;
7767 1.1.1.6 christos tc->needs_sorting = TRUE;
7768 1.1.1.6 christos }
7769 1.1.1.6 christos
7770 1.1.1.6 christos static struct trampoline_chain *
7771 1.1.1.6 christos xg_create_trampoline_chain (struct trampoline_seg *ts,
7772 1.1.1.6 christos symbolS *sym, addressT offset)
7773 1.1.1.6 christos {
7774 1.1.1.6 christos struct trampoline_chain_index *idx = &ts->chain_index;
7775 1.1.1.6 christos struct trampoline_chain *tc;
7776 1.1.1.6 christos
7777 1.1.1.6 christos if (idx->n_entries == idx->n_max)
7778 1.1.1.6 christos {
7779 1.1.1.6 christos idx->n_max = (idx->n_max + 1) * 2;
7780 1.1.1.6 christos idx->entry = xrealloc (idx->entry,
7781 1.1.1.6 christos sizeof (*idx->entry) * idx->n_max);
7782 1.1.1.6 christos }
7783 1.1.1.6 christos
7784 1.1.1.6 christos tc = idx->entry + idx->n_entries;
7785 1.1.1.4 christos tc->target.sym = sym;
7786 1.1.1.4 christos tc->target.offset = offset;
7787 1.1.1.4 christos tc->entry = NULL;
7788 1.1.1.4 christos tc->n_entries = 0;
7789 1.1.1.4 christos tc->n_max = 0;
7790 1.1.1.4 christos xg_add_location_to_chain (tc, sym, offset);
7791 1.1.1.4 christos
7792 1.1.1.4 christos ++idx->n_entries;
7793 1.1.1.4 christos idx->needs_sorting = TRUE;
7794 1.1.1.4 christos
7795 1.1.1.6 christos return tc;
7796 1.1.1.4 christos }
7797 1.1.1.4 christos
7798 1.1.1.4 christos void dump_trampolines (void);
7799 1.1.1.4 christos
7800 1.1.1.4 christos void
7801 1.1.1.6 christos dump_trampolines (void)
7802 1.1.1.6 christos {
7803 1.1.1.4 christos struct trampoline_seg *ts = trampoline_seg_list.next;
7804 1.1.1.6 christos
7805 1.1.1.6 christos for ( ; ts; ts = ts->next)
7806 1.1.1.4 christos {
7807 1.1.1.6 christos size_t i;
7808 1.1.1.6 christos asection *seg = ts->seg;
7809 1.1.1.4 christos
7810 1.1.1.4 christos if (seg == NULL)
7811 1.1.1.4 christos continue;
7812 1.1.1.4 christos fprintf(stderr, "SECTION %s\n", seg->name);
7813 1.1.1.4 christos
7814 1.1.1.4 christos for (i = 0; i < ts->index.n_entries; ++i)
7815 1.1.1.4 christos {
7816 1.1.1.4 christos fragS *tf = ts->index.entry[i];
7817 1.1.1.4 christos
7818 1.1.1.4 christos fprintf(stderr, " 0x%08x: fix=%d, jump_around=%s\n",
7819 1.1.1.4 christos (int)tf->fr_address, (int)tf->fr_fix,
7820 1.1.1.4 christos tf->tc_frag_data.needs_jump_around ? "T" : "F");
7821 1.1.1.4 christos }
7822 1.1.1.4 christos }
7823 1.1.1.4 christos }
7824 1.1.1.4 christos
7825 1.1.1.4 christos static void dump_litpools (void) __attribute__ ((unused));
7826 1.1.1.4 christos
7827 1.1.1.4 christos static void
7828 1.1.1.4 christos dump_litpools (void)
7829 1.1.1.4 christos {
7830 1.1.1.4 christos struct litpool_seg *lps = litpool_seg_list.next;
7831 1.1.1.4 christos struct litpool_frag *lpf;
7832 1.1.1.4 christos
7833 1.1.1.4 christos for ( ; lps ; lps = lps->next )
7834 1.1.1.4 christos {
7835 1.1.1.4 christos printf("litpool seg %s\n", lps->seg->name);
7836 1.1.1.4 christos for ( lpf = lps->frag_list.next; lpf->fragP; lpf = lpf->next )
7837 1.1.1.4 christos {
7838 1.1.1.4 christos fragS *litfrag = lpf->fragP->fr_next;
7839 1.1.1.4 christos int count = 0;
7840 1.1.1.4 christos while (litfrag && litfrag->fr_subtype != RELAX_LITERAL_POOL_END)
7841 1.1.1.4 christos {
7842 1.1.1.4 christos if (litfrag->fr_fix == 4)
7843 1.1.1.4 christos count++;
7844 1.1.1.4 christos litfrag = litfrag->fr_next;
7845 1.1.1.4 christos }
7846 1.1.1.4 christos printf(" %ld <%d:%d> (%d) [%d]: ",
7847 1.1.1.4 christos lpf->addr, lpf->priority, lpf->original_priority,
7848 1.1.1.4 christos lpf->fragP->fr_line, count);
7849 1.1.1.4 christos //dump_frag(lpf->fragP);
7850 1.1.1.4 christos }
7851 1.1.1.4 christos }
7852 1.1.1.4 christos }
7853 1.1.1.4 christos
7854 1.1.1.4 christos static void
7855 1.1.1.4 christos xtensa_maybe_create_literal_pool_frag (bfd_boolean create,
7856 1.1.1.4 christos bfd_boolean only_if_needed)
7857 1.1.1.4 christos {
7858 1.1.1.4 christos struct litpool_seg *lps = litpool_seg_list.next;
7859 1.1.1.4 christos fragS *fragP;
7860 1.1.1.4 christos struct litpool_frag *lpf;
7861 1.1.1.4 christos bfd_boolean needed = FALSE;
7862 1.1.1.5 christos
7863 1.1.1.4 christos if (use_literal_section || !auto_litpools)
7864 1.1.1.4 christos return;
7865 1.1.1.4 christos
7866 1.1.1.4 christos for ( ; lps ; lps = lps->next )
7867 1.1.1.4 christos {
7868 1.1.1.6 christos if (lps->seg == now_seg)
7869 1.1.1.6 christos break;
7870 1.1.1.6 christos }
7871 1.1.1.6 christos
7872 1.1.1.4 christos if (lps == NULL)
7873 1.1.1.4 christos {
7874 1.1.1.4 christos lps = XCNEW (struct litpool_seg);
7875 1.1.1.4 christos lps->next = litpool_seg_list.next;
7876 1.1.1.4 christos litpool_seg_list.next = lps;
7877 1.1.1.4 christos lps->seg = now_seg;
7878 1.1.1.4 christos lps->frag_list.next = &lps->frag_list;
7879 1.1.1.4 christos lps->frag_list.prev = &lps->frag_list;
7880 1.1.1.4 christos /* Put candidate literal pool at the beginning of every section,
7881 1.1.1.4 christos so that even when section starts with literal load there's a
7882 1.1.1.4 christos literal pool available. */
7883 1.1.1.4 christos lps->frag_count = auto_litpool_limit;
7884 1.1.1.4 christos }
7885 1.1.1.4 christos
7886 1.1.1.4 christos lps->frag_count++;
7887 1.1.1.4 christos
7888 1.1.1.4 christos if (create)
7889 1.1.1.4 christos {
7890 1.1.1.4 christos if (only_if_needed)
7891 1.1.1.4 christos {
7892 1.1.1.4 christos if (past_xtensa_end || !use_transform() ||
7893 1.1.1.4 christos frag_now->tc_frag_data.is_no_transform)
7894 1.1.1.4 christos {
7895 1.1.1.4 christos return;
7896 1.1.1.4 christos }
7897 1.1.1.4 christos if (auto_litpool_limit <= 0)
7898 1.1.1.4 christos {
7899 1.1.1.4 christos /* Don't create a litpool based only on frag count. */
7900 1.1.1.4 christos return;
7901 1.1.1.4 christos }
7902 1.1.1.4 christos else if (lps->frag_count > auto_litpool_limit)
7903 1.1.1.4 christos {
7904 1.1.1.4 christos needed = TRUE;
7905 1.1.1.4 christos }
7906 1.1.1.4 christos else
7907 1.1.1.4 christos {
7908 1.1.1.4 christos return;
7909 1.1.1.4 christos }
7910 1.1.1.4 christos }
7911 1.1.1.4 christos else
7912 1.1.1.4 christos {
7913 1.1.1.4 christos needed = TRUE;
7914 1.1.1.4 christos }
7915 1.1.1.4 christos }
7916 1.1.1.4 christos
7917 1.1.1.4 christos if (needed)
7918 1.1.1.4 christos {
7919 1.1.1.4 christos int size = (only_if_needed) ? 3 : 0; /* Space for a "j" insn. */
7920 1.1.1.4 christos /* Create a potential site for a literal pool. */
7921 1.1.1.4 christos frag_wane (frag_now);
7922 1.1.1.4 christos frag_new (0);
7923 1.1.1.4 christos xtensa_set_frag_assembly_state (frag_now);
7924 1.1.1.4 christos fragP = frag_now;
7925 1.1.1.4 christos fragP->tc_frag_data.lit_frchain = frchain_now;
7926 1.1.1.4 christos fragP->tc_frag_data.literal_frag = fragP;
7927 1.1.1.4 christos frag_var (rs_machine_dependent, size, size,
7928 1.1.1.4 christos (only_if_needed) ?
7929 1.1.1.4 christos RELAX_LITERAL_POOL_CANDIDATE_BEGIN :
7930 1.1.1.4 christos RELAX_LITERAL_POOL_BEGIN,
7931 1.1.1.4 christos NULL, 0, NULL);
7932 1.1.1.5 christos frag_now->tc_frag_data.lit_seg = now_seg;
7933 1.1.1.4 christos frag_variant (rs_machine_dependent, 0, 0,
7934 1.1.1.4 christos RELAX_LITERAL_POOL_END, NULL, 0, NULL);
7935 1.1.1.4 christos xtensa_set_frag_assembly_state (frag_now);
7936 1.1.1.4 christos }
7937 1.1.1.4 christos else
7938 1.1.1.4 christos {
7939 1.1.1.4 christos /* RELAX_LITERAL_POOL_BEGIN frag is being created;
7940 1.1.1.4 christos just record it here. */
7941 1.1.1.4 christos fragP = frag_now;
7942 1.1.1.7 christos }
7943 1.1.1.4 christos
7944 1.1.1.4 christos lpf = XNEW (struct litpool_frag);
7945 1.1.1.4 christos /* Insert at tail of circular list. */
7946 1.1.1.4 christos lpf->addr = 0;
7947 1.1 skrll lps->frag_list.prev->next = lpf;
7948 1.1 skrll lpf->next = &lps->frag_list;
7949 1.1 skrll lpf->prev = lps->frag_list.prev;
7950 1.1 skrll lps->frag_list.prev = lpf;
7951 1.1 skrll lpf->fragP = fragP;
7952 1.1 skrll lpf->priority = (needed) ? (only_if_needed) ? 3 : 2 : 1;
7953 1.1 skrll lpf->original_priority = lpf->priority;
7954 1.1 skrll lpf->literal_count = 0;
7955 1.1 skrll
7956 1.1 skrll lps->frag_count = 0;
7957 1.1 skrll }
7958 1.1 skrll
7959 1.1 skrll static void
7960 1.1 skrll xtensa_cleanup_align_frags (void)
7961 1.1 skrll {
7962 1.1 skrll frchainS *frchP;
7963 1.1 skrll asection *s;
7964 1.1 skrll
7965 1.1 skrll for (s = stdoutput->sections; s; s = s->next)
7966 1.1 skrll for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
7967 1.1 skrll {
7968 1.1 skrll fragS *fragP;
7969 1.1 skrll /* Walk over all of the fragments in a subsection. */
7970 1.1 skrll for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
7971 1.1 skrll {
7972 1.1 skrll if ((fragP->fr_type == rs_align
7973 1.1 skrll || fragP->fr_type == rs_align_code
7974 1.1 skrll || (fragP->fr_type == rs_machine_dependent
7975 1.1 skrll && (fragP->fr_subtype == RELAX_DESIRE_ALIGN
7976 1.1 skrll || fragP->fr_subtype == RELAX_DESIRE_ALIGN_IF_TARGET)))
7977 1.1 skrll && fragP->fr_fix == 0)
7978 1.1 skrll {
7979 1.1 skrll fragS *next = fragP->fr_next;
7980 1.1 skrll
7981 1.1 skrll while (next
7982 1.1 skrll && next->fr_fix == 0
7983 1.1 skrll && next->fr_type == rs_machine_dependent
7984 1.1 skrll && next->fr_subtype == RELAX_DESIRE_ALIGN_IF_TARGET)
7985 1.1 skrll {
7986 1.1 skrll frag_wane (next);
7987 1.1 skrll next = next->fr_next;
7988 1.1 skrll }
7989 1.1 skrll }
7990 1.1 skrll /* If we don't widen branch targets, then they
7991 1.1 skrll will be easier to align. */
7992 1.1 skrll if (fragP->tc_frag_data.is_branch_target
7993 1.1 skrll && fragP->fr_opcode == fragP->fr_literal
7994 1.1 skrll && fragP->fr_type == rs_machine_dependent
7995 1.1 skrll && fragP->fr_subtype == RELAX_SLOTS
7996 1.1 skrll && fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
7997 1.1 skrll frag_wane (fragP);
7998 1.1 skrll if (fragP->fr_type == rs_machine_dependent
7999 1.1 skrll && fragP->fr_subtype == RELAX_UNREACHABLE)
8000 1.1 skrll fragP->tc_frag_data.is_unreachable = TRUE;
8001 1.1 skrll }
8002 1.1 skrll }
8003 1.1 skrll }
8004 1.1 skrll
8005 1.1 skrll
8006 1.1 skrll /* Re-process all of the fragments looking to convert all of the
8007 1.1 skrll RELAX_DESIRE_ALIGN_IF_TARGET fragments. If there is a branch
8008 1.1 skrll target in the next fragment, convert this to RELAX_DESIRE_ALIGN.
8009 1.1 skrll Otherwise, convert to a .fill 0. */
8010 1.1 skrll
8011 1.1 skrll static void
8012 1.1 skrll xtensa_fix_target_frags (void)
8013 1.1 skrll {
8014 1.1 skrll frchainS *frchP;
8015 1.1 skrll asection *s;
8016 1.1 skrll
8017 1.1 skrll /* When this routine is called, all of the subsections are still intact
8018 1.1 skrll so we walk over subsections instead of sections. */
8019 1.1 skrll for (s = stdoutput->sections; s; s = s->next)
8020 1.1 skrll for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
8021 1.1 skrll {
8022 1.1 skrll fragS *fragP;
8023 1.1 skrll
8024 1.1 skrll /* Walk over all of the fragments in a subsection. */
8025 1.1 skrll for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
8026 1.1 skrll {
8027 1.1 skrll if (fragP->fr_type == rs_machine_dependent
8028 1.1 skrll && fragP->fr_subtype == RELAX_DESIRE_ALIGN_IF_TARGET)
8029 1.1 skrll {
8030 1.1 skrll if (next_frag_is_branch_target (fragP))
8031 1.1 skrll fragP->fr_subtype = RELAX_DESIRE_ALIGN;
8032 1.1 skrll else
8033 1.1 skrll frag_wane (fragP);
8034 1.1 skrll }
8035 1.1 skrll }
8036 1.1 skrll }
8037 1.1 skrll }
8038 1.1 skrll
8039 1.1 skrll
8040 1.1 skrll static bfd_boolean is_narrow_branch_guaranteed_in_range (fragS *, TInsn *);
8041 1.1 skrll
8042 1.1 skrll static void
8043 1.1 skrll xtensa_mark_narrow_branches (void)
8044 1.1 skrll {
8045 1.1 skrll frchainS *frchP;
8046 1.1 skrll asection *s;
8047 1.1 skrll
8048 1.1 skrll for (s = stdoutput->sections; s; s = s->next)
8049 1.1 skrll for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
8050 1.1 skrll {
8051 1.1 skrll fragS *fragP;
8052 1.1 skrll /* Walk over all of the fragments in a subsection. */
8053 1.1 skrll for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
8054 1.1 skrll {
8055 1.1 skrll if (fragP->fr_type == rs_machine_dependent
8056 1.1 skrll && fragP->fr_subtype == RELAX_SLOTS
8057 1.1 skrll && fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED)
8058 1.1 skrll {
8059 1.1 skrll vliw_insn vinsn;
8060 1.1 skrll
8061 1.1 skrll vinsn_from_chars (&vinsn, fragP->fr_opcode);
8062 1.1 skrll tinsn_immed_from_frag (&vinsn.slots[0], fragP, 0);
8063 1.1 skrll
8064 1.1 skrll if (vinsn.num_slots == 1
8065 1.1 skrll && xtensa_opcode_is_branch (xtensa_default_isa,
8066 1.1 skrll vinsn.slots[0].opcode) == 1
8067 1.1 skrll && xg_get_single_size (vinsn.slots[0].opcode) == 2
8068 1.1 skrll && is_narrow_branch_guaranteed_in_range (fragP,
8069 1.1 skrll &vinsn.slots[0]))
8070 1.1 skrll {
8071 1.1 skrll fragP->fr_subtype = RELAX_SLOTS;
8072 1.1 skrll fragP->tc_frag_data.slot_subtypes[0] = RELAX_NARROW;
8073 1.1 skrll fragP->tc_frag_data.is_aligning_branch = 1;
8074 1.1 skrll }
8075 1.1 skrll }
8076 1.1 skrll }
8077 1.1 skrll }
8078 1.1 skrll }
8079 1.1 skrll
8080 1.1 skrll
8081 1.1 skrll /* A branch is typically widened only when its target is out of
8082 1.1 skrll range. However, we would like to widen them to align a subsequent
8083 1.1 skrll branch target when possible.
8084 1.1 skrll
8085 1.1 skrll Because the branch relaxation code is so convoluted, the optimal solution
8086 1.1 skrll (combining the two cases) is difficult to get right in all circumstances.
8087 1.1 skrll We therefore go with an "almost as good" solution, where we only
8088 1.1 skrll use for alignment narrow branches that definitely will not expand to a
8089 1.1 skrll jump and a branch. These functions find and mark these cases. */
8090 1.1.1.2 christos
8091 1.1.1.2 christos /* The range in bytes of BNEZ.N and BEQZ.N. The target operand is encoded
8092 1.1.1.2 christos as PC + 4 + imm6, where imm6 is a 6-bit immediate ranging from 0 to 63.
8093 1.1 skrll We start counting beginning with the frag after the 2-byte branch, so the
8094 1.1 skrll maximum offset is (4 - 2) + 63 = 65. */
8095 1.1.1.2 christos #define MAX_IMMED6 65
8096 1.1 skrll
8097 1.1 skrll static offsetT unrelaxed_frag_max_size (fragS *);
8098 1.1 skrll
8099 1.1 skrll static bfd_boolean
8100 1.1 skrll is_narrow_branch_guaranteed_in_range (fragS *fragP, TInsn *tinsn)
8101 1.1 skrll {
8102 1.1 skrll const expressionS *exp = &tinsn->tok[1];
8103 1.1 skrll symbolS *symbolP = exp->X_add_symbol;
8104 1.1 skrll offsetT max_distance = exp->X_add_number;
8105 1.1 skrll fragS *target_frag;
8106 1.1 skrll
8107 1.1 skrll if (exp->X_op != O_symbol)
8108 1.1 skrll return FALSE;
8109 1.1 skrll
8110 1.1 skrll target_frag = symbol_get_frag (symbolP);
8111 1.1 skrll
8112 1.1 skrll max_distance += (S_GET_VALUE (symbolP) - target_frag->fr_address);
8113 1.1 skrll if (is_branch_jmp_to_next (tinsn, fragP))
8114 1.1 skrll return FALSE;
8115 1.1 skrll
8116 1.1 skrll /* The branch doesn't branch over it's own frag,
8117 1.1 skrll but over the subsequent ones. */
8118 1.1 skrll fragP = fragP->fr_next;
8119 1.1 skrll while (fragP != NULL && fragP != target_frag && max_distance <= MAX_IMMED6)
8120 1.1 skrll {
8121 1.1 skrll max_distance += unrelaxed_frag_max_size (fragP);
8122 1.1 skrll fragP = fragP->fr_next;
8123 1.1 skrll }
8124 1.1 skrll if (max_distance <= MAX_IMMED6 && fragP == target_frag)
8125 1.1 skrll return TRUE;
8126 1.1 skrll return FALSE;
8127 1.1 skrll }
8128 1.1 skrll
8129 1.1 skrll
8130 1.1 skrll static void
8131 1.1 skrll xtensa_mark_zcl_first_insns (void)
8132 1.1 skrll {
8133 1.1 skrll frchainS *frchP;
8134 1.1 skrll asection *s;
8135 1.1 skrll
8136 1.1.1.2 christos for (s = stdoutput->sections; s; s = s->next)
8137 1.1 skrll for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
8138 1.1.1.2 christos {
8139 1.1.1.2 christos fragS *fragP;
8140 1.1.1.2 christos /* Walk over all of the fragments in a subsection. */
8141 1.1.1.2 christos for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
8142 1.1.1.4 christos {
8143 1.1.1.2 christos if (fragP->fr_type == rs_machine_dependent
8144 1.1.1.2 christos && (fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE
8145 1.1.1.2 christos || fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE))
8146 1.1.1.2 christos {
8147 1.1.1.2 christos /* Find the loop frag. */
8148 1.1.1.2 christos fragS *loop_frag = next_non_empty_frag (fragP);
8149 1.1.1.2 christos /* Find the first insn frag. */
8150 1.1.1.2 christos fragS *targ_frag = next_non_empty_frag (loop_frag);
8151 1.1.1.2 christos
8152 1.1.1.2 christos /* Handle a corner case that comes up in hardware
8153 1.1.1.2 christos diagnostics. The original assembly looks like this:
8154 1.1.1.2 christos
8155 1.1.1.2 christos loop aX, LabelA
8156 1.1.1.2 christos <empty_frag>--not found by next_non_empty_frag
8157 1.1.1.2 christos loop aY, LabelB
8158 1.1.1.2 christos
8159 1.1.1.2 christos Depending on the start address, the assembler may or
8160 1.1.1.4 christos may not change it to look something like this:
8161 1.1.1.2 christos
8162 1.1.1.2 christos loop aX, LabelA
8163 1.1.1.2 christos nop--frag isn't empty anymore
8164 1.1.1.2 christos loop aY, LabelB
8165 1.1.1.2 christos
8166 1.1 skrll So set up to check the alignment of the nop if it
8167 1.1 skrll exists */
8168 1.1 skrll while (loop_frag != targ_frag)
8169 1.1 skrll {
8170 1.1 skrll if (loop_frag->fr_type == rs_machine_dependent
8171 1.1 skrll && (loop_frag->fr_subtype == RELAX_ALIGN_NEXT_OPCODE
8172 1.1 skrll || loop_frag->fr_subtype
8173 1.1 skrll == RELAX_CHECK_ALIGN_NEXT_OPCODE))
8174 1.1 skrll targ_frag = loop_frag;
8175 1.1 skrll else
8176 1.1 skrll loop_frag = loop_frag->fr_next;
8177 1.1 skrll }
8178 1.1 skrll
8179 1.1 skrll /* Of course, sometimes (mostly for toy test cases) a
8180 1.1 skrll zero-cost loop instruction is the last in a section. */
8181 1.1 skrll if (targ_frag)
8182 1.1 skrll {
8183 1.1 skrll targ_frag->tc_frag_data.is_first_loop_insn = TRUE;
8184 1.1 skrll /* Do not widen a frag that is the first instruction of a
8185 1.1 skrll zero-cost loop. It makes that loop harder to align. */
8186 1.1 skrll if (targ_frag->fr_type == rs_machine_dependent
8187 1.1 skrll && targ_frag->fr_subtype == RELAX_SLOTS
8188 1.1 skrll && (targ_frag->tc_frag_data.slot_subtypes[0]
8189 1.1 skrll == RELAX_NARROW))
8190 1.1 skrll {
8191 1.1 skrll if (targ_frag->tc_frag_data.is_aligning_branch)
8192 1.1 skrll targ_frag->tc_frag_data.slot_subtypes[0] = RELAX_IMMED;
8193 1.1 skrll else
8194 1.1 skrll {
8195 1.1 skrll frag_wane (targ_frag);
8196 1.1 skrll targ_frag->tc_frag_data.slot_subtypes[0] = 0;
8197 1.1 skrll }
8198 1.1 skrll }
8199 1.1 skrll }
8200 1.1.1.4 christos if (fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE)
8201 1.1 skrll frag_wane (fragP);
8202 1.1 skrll }
8203 1.1 skrll }
8204 1.1 skrll }
8205 1.1 skrll }
8206 1.1.1.4 christos
8207 1.1 skrll
8208 1.1 skrll /* When a difference-of-symbols expression is encoded as a uleb128 or
8209 1.1.1.2 christos sleb128 value, the linker is unable to adjust that value to account for
8210 1.1 skrll link-time relaxation. Mark all the code between such symbols so that
8211 1.1.1.2 christos its size cannot be changed by linker relaxation. */
8212 1.1 skrll
8213 1.1.1.2 christos static void
8214 1.1.1.2 christos xtensa_mark_difference_of_two_symbols (void)
8215 1.1.1.4 christos {
8216 1.1 skrll symbolS *expr_sym;
8217 1.1 skrll
8218 1.1 skrll for (expr_sym = expr_symbols; expr_sym;
8219 1.1 skrll expr_sym = symbol_get_tc (expr_sym)->next_expr_symbol)
8220 1.1 skrll {
8221 1.1 skrll expressionS *exp = symbol_get_value_expression (expr_sym);
8222 1.1.1.2 christos
8223 1.1 skrll if (exp->X_op == O_subtract)
8224 1.1.1.4 christos {
8225 1.1 skrll symbolS *left = exp->X_add_symbol;
8226 1.1 skrll symbolS *right = exp->X_op_symbol;
8227 1.1 skrll
8228 1.1 skrll /* Difference of two symbols not in the same section
8229 1.1 skrll are handled with relocations in the linker. */
8230 1.1 skrll if (S_GET_SEGMENT (left) == S_GET_SEGMENT (right))
8231 1.1 skrll {
8232 1.1 skrll fragS *start;
8233 1.1 skrll fragS *end;
8234 1.1 skrll fragS *walk;
8235 1.1.1.2 christos
8236 1.1.1.2 christos if (symbol_get_frag (left)->fr_address
8237 1.1.1.2 christos <= symbol_get_frag (right)->fr_address)
8238 1.1.1.2 christos {
8239 1.1.1.2 christos start = symbol_get_frag (left);
8240 1.1.1.4 christos end = symbol_get_frag (right);
8241 1.1 skrll }
8242 1.1.1.2 christos else
8243 1.1.1.2 christos {
8244 1.1 skrll start = symbol_get_frag (right);
8245 1.1.1.2 christos end = symbol_get_frag (left);
8246 1.1.1.2 christos }
8247 1.1.1.2 christos
8248 1.1 skrll if (start->tc_frag_data.no_transform_end != NULL)
8249 1.1 skrll walk = start->tc_frag_data.no_transform_end;
8250 1.1 skrll else
8251 1.1 skrll walk = start;
8252 1.1 skrll do
8253 1.1 skrll {
8254 1.1 skrll walk->tc_frag_data.is_no_transform = 1;
8255 1.1 skrll walk = walk->fr_next;
8256 1.1 skrll }
8257 1.1 skrll while (walk && walk->fr_address < end->fr_address);
8258 1.1 skrll
8259 1.1 skrll start->tc_frag_data.no_transform_end = walk;
8260 1.1 skrll }
8261 1.1 skrll }
8262 1.1 skrll }
8263 1.1 skrll }
8264 1.1 skrll
8265 1.1 skrll
8266 1.1 skrll /* Re-process all of the fragments looking to convert all of the
8267 1.1 skrll RELAX_ADD_NOP_IF_A0_B_RETW. If the next instruction is a
8268 1.1 skrll conditional branch or a retw/retw.n, convert this frag to one that
8269 1.1 skrll will generate a NOP. In any case close it off with a .fill 0. */
8270 1.1 skrll
8271 1.1 skrll static bfd_boolean next_instrs_are_b_retw (fragS *);
8272 1.1 skrll
8273 1.1 skrll static void
8274 1.1 skrll xtensa_fix_a0_b_retw_frags (void)
8275 1.1 skrll {
8276 1.1 skrll frchainS *frchP;
8277 1.1 skrll asection *s;
8278 1.1 skrll
8279 1.1 skrll /* When this routine is called, all of the subsections are still intact
8280 1.1 skrll so we walk over subsections instead of sections. */
8281 1.1 skrll for (s = stdoutput->sections; s; s = s->next)
8282 1.1 skrll for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
8283 1.1 skrll {
8284 1.1 skrll fragS *fragP;
8285 1.1 skrll
8286 1.1 skrll /* Walk over all of the fragments in a subsection. */
8287 1.1 skrll for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
8288 1.1 skrll {
8289 1.1 skrll if (fragP->fr_type == rs_machine_dependent
8290 1.1 skrll && fragP->fr_subtype == RELAX_ADD_NOP_IF_A0_B_RETW)
8291 1.1 skrll {
8292 1.1 skrll if (next_instrs_are_b_retw (fragP))
8293 1.1 skrll {
8294 1.1 skrll if (fragP->tc_frag_data.is_no_transform)
8295 1.1 skrll as_bad (_("instruction sequence (write a0, branch, retw) may trigger hardware errata"));
8296 1.1 skrll else
8297 1.1 skrll relax_frag_add_nop (fragP);
8298 1.1 skrll }
8299 1.1 skrll frag_wane (fragP);
8300 1.1 skrll }
8301 1.1 skrll }
8302 1.1 skrll }
8303 1.1.1.8 christos }
8304 1.1 skrll
8305 1.1 skrll
8306 1.1 skrll static bfd_boolean
8307 1.1 skrll next_instrs_are_b_retw (fragS *fragP)
8308 1.1 skrll {
8309 1.1 skrll xtensa_opcode opcode;
8310 1.1 skrll xtensa_format fmt;
8311 1.1 skrll const fragS *next_fragP = next_non_empty_frag (fragP);
8312 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
8313 1.1 skrll static xtensa_insnbuf slotbuf = NULL;
8314 1.1 skrll xtensa_isa isa = xtensa_default_isa;
8315 1.1 skrll unsigned int offset = 0;
8316 1.1 skrll int slot;
8317 1.1 skrll bfd_boolean branch_seen = FALSE;
8318 1.1 skrll
8319 1.1 skrll if (!insnbuf)
8320 1.1 skrll {
8321 1.1 skrll insnbuf = xtensa_insnbuf_alloc (isa);
8322 1.1 skrll slotbuf = xtensa_insnbuf_alloc (isa);
8323 1.1 skrll }
8324 1.1 skrll
8325 1.1 skrll if (next_fragP == NULL)
8326 1.1 skrll return FALSE;
8327 1.1 skrll
8328 1.1 skrll /* Check for the conditional branch. */
8329 1.1 skrll xtensa_insnbuf_from_chars
8330 1.1 skrll (isa, insnbuf, (unsigned char *) &next_fragP->fr_literal[offset], 0);
8331 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
8332 1.1 skrll if (fmt == XTENSA_UNDEFINED)
8333 1.1 skrll return FALSE;
8334 1.1 skrll
8335 1.1 skrll for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
8336 1.1 skrll {
8337 1.1 skrll xtensa_format_get_slot (isa, fmt, slot, insnbuf, slotbuf);
8338 1.1 skrll opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
8339 1.1 skrll
8340 1.1 skrll branch_seen = (branch_seen
8341 1.1 skrll || xtensa_opcode_is_branch (isa, opcode) == 1);
8342 1.1 skrll }
8343 1.1 skrll
8344 1.1 skrll if (!branch_seen)
8345 1.1 skrll return FALSE;
8346 1.1 skrll
8347 1.1 skrll offset += xtensa_format_length (isa, fmt);
8348 1.1 skrll if (offset == next_fragP->fr_fix)
8349 1.1 skrll {
8350 1.1 skrll next_fragP = next_non_empty_frag (next_fragP);
8351 1.1 skrll offset = 0;
8352 1.1 skrll }
8353 1.1 skrll
8354 1.1 skrll if (next_fragP == NULL)
8355 1.1 skrll return FALSE;
8356 1.1 skrll
8357 1.1 skrll /* Check for the retw/retw.n. */
8358 1.1 skrll xtensa_insnbuf_from_chars
8359 1.1 skrll (isa, insnbuf, (unsigned char *) &next_fragP->fr_literal[offset], 0);
8360 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
8361 1.1 skrll
8362 1.1 skrll /* Because RETW[.N] is not bundleable, a VLIW bundle here means that we
8363 1.1 skrll have no problems. */
8364 1.1 skrll if (fmt == XTENSA_UNDEFINED
8365 1.1 skrll || xtensa_format_num_slots (isa, fmt) != 1)
8366 1.1 skrll return FALSE;
8367 1.1 skrll
8368 1.1 skrll xtensa_format_get_slot (isa, fmt, 0, insnbuf, slotbuf);
8369 1.1 skrll opcode = xtensa_opcode_decode (isa, fmt, 0, slotbuf);
8370 1.1 skrll
8371 1.1 skrll if (opcode == xtensa_retw_opcode || opcode == xtensa_retw_n_opcode)
8372 1.1 skrll return TRUE;
8373 1.1 skrll
8374 1.1 skrll return FALSE;
8375 1.1 skrll }
8376 1.1 skrll
8377 1.1 skrll
8378 1.1 skrll /* Re-process all of the fragments looking to convert all of the
8379 1.1 skrll RELAX_ADD_NOP_IF_PRE_LOOP_END. If there is one instruction and a
8380 1.1 skrll loop end label, convert this frag to one that will generate a NOP.
8381 1.1 skrll In any case close it off with a .fill 0. */
8382 1.1 skrll
8383 1.1 skrll static bfd_boolean next_instr_is_loop_end (fragS *);
8384 1.1 skrll
8385 1.1 skrll static void
8386 1.1 skrll xtensa_fix_b_j_loop_end_frags (void)
8387 1.1 skrll {
8388 1.1 skrll frchainS *frchP;
8389 1.1 skrll asection *s;
8390 1.1 skrll
8391 1.1 skrll /* When this routine is called, all of the subsections are still intact
8392 1.1 skrll so we walk over subsections instead of sections. */
8393 1.1 skrll for (s = stdoutput->sections; s; s = s->next)
8394 1.1 skrll for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
8395 1.1 skrll {
8396 1.1 skrll fragS *fragP;
8397 1.1 skrll
8398 1.1 skrll /* Walk over all of the fragments in a subsection. */
8399 1.1 skrll for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
8400 1.1 skrll {
8401 1.1 skrll if (fragP->fr_type == rs_machine_dependent
8402 1.1 skrll && fragP->fr_subtype == RELAX_ADD_NOP_IF_PRE_LOOP_END)
8403 1.1 skrll {
8404 1.1 skrll if (next_instr_is_loop_end (fragP))
8405 1.1 skrll {
8406 1.1 skrll if (fragP->tc_frag_data.is_no_transform)
8407 1.1 skrll as_bad (_("branching or jumping to a loop end may trigger hardware errata"));
8408 1.1 skrll else
8409 1.1 skrll relax_frag_add_nop (fragP);
8410 1.1 skrll }
8411 1.1 skrll frag_wane (fragP);
8412 1.1 skrll }
8413 1.1 skrll }
8414 1.1 skrll }
8415 1.1 skrll }
8416 1.1 skrll
8417 1.1 skrll
8418 1.1 skrll static bfd_boolean
8419 1.1 skrll next_instr_is_loop_end (fragS *fragP)
8420 1.1 skrll {
8421 1.1 skrll const fragS *next_fragP;
8422 1.1 skrll
8423 1.1 skrll if (next_frag_is_loop_target (fragP))
8424 1.1 skrll return FALSE;
8425 1.1 skrll
8426 1.1 skrll next_fragP = next_non_empty_frag (fragP);
8427 1.1 skrll if (next_fragP == NULL)
8428 1.1 skrll return FALSE;
8429 1.1 skrll
8430 1.1 skrll if (!next_frag_is_loop_target (next_fragP))
8431 1.1 skrll return FALSE;
8432 1.1 skrll
8433 1.1 skrll /* If the size is >= 3 then there is more than one instruction here.
8434 1.1 skrll The hardware bug will not fire. */
8435 1.1 skrll if (next_fragP->fr_fix > 3)
8436 1.1 skrll return FALSE;
8437 1.1 skrll
8438 1.1 skrll return TRUE;
8439 1.1 skrll }
8440 1.1 skrll
8441 1.1 skrll
8442 1.1 skrll /* Re-process all of the fragments looking to convert all of the
8443 1.1 skrll RELAX_ADD_NOP_IF_CLOSE_LOOP_END. If there is an loop end that is
8444 1.1 skrll not MY loop's loop end within 12 bytes, add enough nops here to
8445 1.1 skrll make it at least 12 bytes away. In any case close it off with a
8446 1.1 skrll .fill 0. */
8447 1.1 skrll
8448 1.1 skrll static offsetT min_bytes_to_other_loop_end
8449 1.1 skrll (fragS *, fragS *, offsetT);
8450 1.1 skrll
8451 1.1 skrll static void
8452 1.1 skrll xtensa_fix_close_loop_end_frags (void)
8453 1.1 skrll {
8454 1.1 skrll frchainS *frchP;
8455 1.1 skrll asection *s;
8456 1.1 skrll
8457 1.1 skrll /* When this routine is called, all of the subsections are still intact
8458 1.1 skrll so we walk over subsections instead of sections. */
8459 1.1 skrll for (s = stdoutput->sections; s; s = s->next)
8460 1.1 skrll for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
8461 1.1 skrll {
8462 1.1 skrll fragS *fragP;
8463 1.1 skrll
8464 1.1 skrll fragS *current_target = NULL;
8465 1.1 skrll
8466 1.1 skrll /* Walk over all of the fragments in a subsection. */
8467 1.1 skrll for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
8468 1.1 skrll {
8469 1.1 skrll if (fragP->fr_type == rs_machine_dependent
8470 1.1 skrll && ((fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE)
8471 1.1 skrll || (fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE)))
8472 1.1 skrll current_target = symbol_get_frag (fragP->fr_symbol);
8473 1.1 skrll
8474 1.1 skrll if (current_target
8475 1.1 skrll && fragP->fr_type == rs_machine_dependent
8476 1.1 skrll && fragP->fr_subtype == RELAX_ADD_NOP_IF_CLOSE_LOOP_END)
8477 1.1 skrll {
8478 1.1 skrll offsetT min_bytes;
8479 1.1 skrll int bytes_added = 0;
8480 1.1 skrll
8481 1.1 skrll #define REQUIRED_LOOP_DIVIDING_BYTES 12
8482 1.1 skrll /* Max out at 12. */
8483 1.1 skrll min_bytes = min_bytes_to_other_loop_end
8484 1.1 skrll (fragP->fr_next, current_target, REQUIRED_LOOP_DIVIDING_BYTES);
8485 1.1 skrll
8486 1.1 skrll if (min_bytes < REQUIRED_LOOP_DIVIDING_BYTES)
8487 1.1 skrll {
8488 1.1 skrll if (fragP->tc_frag_data.is_no_transform)
8489 1.1 skrll as_bad (_("loop end too close to another loop end may trigger hardware errata"));
8490 1.1 skrll else
8491 1.1 skrll {
8492 1.1 skrll while (min_bytes + bytes_added
8493 1.1 skrll < REQUIRED_LOOP_DIVIDING_BYTES)
8494 1.1 skrll {
8495 1.1 skrll int length = 3;
8496 1.1 skrll
8497 1.1 skrll if (fragP->fr_var < length)
8498 1.1 skrll as_fatal (_("fr_var %lu < length %d"),
8499 1.1 skrll (long) fragP->fr_var, length);
8500 1.1 skrll else
8501 1.1.1.2 christos {
8502 1.1 skrll assemble_nop (length,
8503 1.1 skrll fragP->fr_literal + fragP->fr_fix);
8504 1.1 skrll fragP->fr_fix += length;
8505 1.1 skrll fragP->fr_var -= length;
8506 1.1 skrll }
8507 1.1 skrll bytes_added += length;
8508 1.1 skrll }
8509 1.1 skrll }
8510 1.1 skrll }
8511 1.1 skrll frag_wane (fragP);
8512 1.1 skrll }
8513 1.1 skrll gas_assert (fragP->fr_type != rs_machine_dependent
8514 1.1 skrll || fragP->fr_subtype != RELAX_ADD_NOP_IF_CLOSE_LOOP_END);
8515 1.1 skrll }
8516 1.1 skrll }
8517 1.1 skrll }
8518 1.1 skrll
8519 1.1 skrll
8520 1.1 skrll static offsetT unrelaxed_frag_min_size (fragS *);
8521 1.1 skrll
8522 1.1 skrll static offsetT
8523 1.1 skrll min_bytes_to_other_loop_end (fragS *fragP,
8524 1.1 skrll fragS *current_target,
8525 1.1 skrll offsetT max_size)
8526 1.1 skrll {
8527 1.1 skrll offsetT offset = 0;
8528 1.1 skrll fragS *current_fragP;
8529 1.1 skrll
8530 1.1 skrll for (current_fragP = fragP;
8531 1.1 skrll current_fragP;
8532 1.1 skrll current_fragP = current_fragP->fr_next)
8533 1.1 skrll {
8534 1.1 skrll if (current_fragP->tc_frag_data.is_loop_target
8535 1.1 skrll && current_fragP != current_target)
8536 1.1 skrll return offset;
8537 1.1 skrll
8538 1.1 skrll offset += unrelaxed_frag_min_size (current_fragP);
8539 1.1 skrll
8540 1.1 skrll if (offset >= max_size)
8541 1.1 skrll return max_size;
8542 1.1 skrll }
8543 1.1 skrll return max_size;
8544 1.1 skrll }
8545 1.1 skrll
8546 1.1 skrll
8547 1.1 skrll static offsetT
8548 1.1 skrll unrelaxed_frag_min_size (fragS *fragP)
8549 1.1 skrll {
8550 1.1 skrll offsetT size = fragP->fr_fix;
8551 1.1 skrll
8552 1.1 skrll /* Add fill size. */
8553 1.1 skrll if (fragP->fr_type == rs_fill)
8554 1.1 skrll size += fragP->fr_offset;
8555 1.1 skrll
8556 1.1 skrll return size;
8557 1.1 skrll }
8558 1.1 skrll
8559 1.1 skrll
8560 1.1 skrll static offsetT
8561 1.1 skrll unrelaxed_frag_max_size (fragS *fragP)
8562 1.1 skrll {
8563 1.1 skrll offsetT size = fragP->fr_fix;
8564 1.1 skrll switch (fragP->fr_type)
8565 1.1 skrll {
8566 1.1 skrll case 0:
8567 1.1 skrll /* Empty frags created by the obstack allocation scheme
8568 1.1 skrll end up with type 0. */
8569 1.1 skrll break;
8570 1.1 skrll case rs_fill:
8571 1.1 skrll case rs_org:
8572 1.1 skrll case rs_space:
8573 1.1 skrll size += fragP->fr_offset;
8574 1.1 skrll break;
8575 1.1 skrll case rs_align:
8576 1.1 skrll case rs_align_code:
8577 1.1.1.2 christos case rs_align_test:
8578 1.1 skrll case rs_leb128:
8579 1.1 skrll case rs_cfa:
8580 1.1 skrll case rs_dwarf2dbg:
8581 1.1 skrll /* No further adjustments needed. */
8582 1.1 skrll break;
8583 1.1 skrll case rs_machine_dependent:
8584 1.1 skrll if (fragP->fr_subtype != RELAX_DESIRE_ALIGN)
8585 1.1 skrll size += fragP->fr_var;
8586 1.1 skrll break;
8587 1.1 skrll default:
8588 1.1 skrll /* We had darn well better know how big it is. */
8589 1.1 skrll gas_assert (0);
8590 1.1 skrll break;
8591 1.1 skrll }
8592 1.1 skrll
8593 1.1 skrll return size;
8594 1.1 skrll }
8595 1.1 skrll
8596 1.1 skrll
8597 1.1 skrll /* Re-process all of the fragments looking to convert all
8598 1.1 skrll of the RELAX_ADD_NOP_IF_SHORT_LOOP. If:
8599 1.1 skrll
8600 1.1 skrll A)
8601 1.1 skrll 1) the instruction size count to the loop end label
8602 1.1 skrll is too short (<= 2 instructions),
8603 1.1 skrll 2) loop has a jump or branch in it
8604 1.1 skrll
8605 1.1 skrll or B)
8606 1.1 skrll 1) workaround_all_short_loops is TRUE
8607 1.1 skrll 2) The generating loop was a 'loopgtz' or 'loopnez'
8608 1.1 skrll 3) the instruction size count to the loop end label is too short
8609 1.1 skrll (<= 2 instructions)
8610 1.1 skrll then convert this frag (and maybe the next one) to generate a NOP.
8611 1.1 skrll In any case close it off with a .fill 0. */
8612 1.1 skrll
8613 1.1 skrll static int count_insns_to_loop_end (fragS *, bfd_boolean, int);
8614 1.1 skrll static bfd_boolean branch_before_loop_end (fragS *);
8615 1.1 skrll
8616 1.1 skrll static void
8617 1.1 skrll xtensa_fix_short_loop_frags (void)
8618 1.1 skrll {
8619 1.1 skrll frchainS *frchP;
8620 1.1 skrll asection *s;
8621 1.1 skrll
8622 1.1 skrll /* When this routine is called, all of the subsections are still intact
8623 1.1 skrll so we walk over subsections instead of sections. */
8624 1.1 skrll for (s = stdoutput->sections; s; s = s->next)
8625 1.1 skrll for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
8626 1.1 skrll {
8627 1.1 skrll fragS *fragP;
8628 1.1 skrll xtensa_opcode current_opcode = XTENSA_UNDEFINED;
8629 1.1.1.2 christos
8630 1.1 skrll /* Walk over all of the fragments in a subsection. */
8631 1.1 skrll for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
8632 1.1 skrll {
8633 1.1 skrll if (fragP->fr_type == rs_machine_dependent
8634 1.1 skrll && ((fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE)
8635 1.1 skrll || (fragP->fr_subtype == RELAX_CHECK_ALIGN_NEXT_OPCODE)))
8636 1.1 skrll {
8637 1.1 skrll TInsn t_insn;
8638 1.1 skrll fragS *loop_frag = next_non_empty_frag (fragP);
8639 1.1 skrll tinsn_from_chars (&t_insn, loop_frag->fr_opcode, 0);
8640 1.1 skrll current_opcode = t_insn.opcode;
8641 1.1 skrll gas_assert (xtensa_opcode_is_loop (xtensa_default_isa,
8642 1.1 skrll current_opcode) == 1);
8643 1.1 skrll }
8644 1.1 skrll
8645 1.1 skrll if (fragP->fr_type == rs_machine_dependent
8646 1.1 skrll && fragP->fr_subtype == RELAX_ADD_NOP_IF_SHORT_LOOP)
8647 1.1 skrll {
8648 1.1 skrll if (count_insns_to_loop_end (fragP->fr_next, TRUE, 3) < 3
8649 1.1 skrll && (branch_before_loop_end (fragP->fr_next)
8650 1.1 skrll || (workaround_all_short_loops
8651 1.1 skrll && current_opcode != XTENSA_UNDEFINED
8652 1.1 skrll && current_opcode != xtensa_loop_opcode)))
8653 1.1 skrll {
8654 1.1 skrll if (fragP->tc_frag_data.is_no_transform)
8655 1.1 skrll as_bad (_("loop containing less than three instructions may trigger hardware errata"));
8656 1.1 skrll else
8657 1.1 skrll relax_frag_add_nop (fragP);
8658 1.1 skrll }
8659 1.1 skrll frag_wane (fragP);
8660 1.1 skrll }
8661 1.1 skrll }
8662 1.1 skrll }
8663 1.1 skrll }
8664 1.1 skrll
8665 1.1 skrll
8666 1.1 skrll static int unrelaxed_frag_min_insn_count (fragS *);
8667 1.1 skrll
8668 1.1 skrll static int
8669 1.1 skrll count_insns_to_loop_end (fragS *base_fragP,
8670 1.1 skrll bfd_boolean count_relax_add,
8671 1.1 skrll int max_count)
8672 1.1 skrll {
8673 1.1 skrll fragS *fragP = NULL;
8674 1.1 skrll int insn_count = 0;
8675 1.1 skrll
8676 1.1 skrll fragP = base_fragP;
8677 1.1 skrll
8678 1.1 skrll for (; fragP && !fragP->tc_frag_data.is_loop_target; fragP = fragP->fr_next)
8679 1.1 skrll {
8680 1.1 skrll insn_count += unrelaxed_frag_min_insn_count (fragP);
8681 1.1 skrll if (insn_count >= max_count)
8682 1.1 skrll return max_count;
8683 1.1 skrll
8684 1.1 skrll if (count_relax_add)
8685 1.1 skrll {
8686 1.1 skrll if (fragP->fr_type == rs_machine_dependent
8687 1.1 skrll && fragP->fr_subtype == RELAX_ADD_NOP_IF_SHORT_LOOP)
8688 1.1 skrll {
8689 1.1 skrll /* In order to add the appropriate number of
8690 1.1 skrll NOPs, we count an instruction for downstream
8691 1.1 skrll occurrences. */
8692 1.1 skrll insn_count++;
8693 1.1 skrll if (insn_count >= max_count)
8694 1.1 skrll return max_count;
8695 1.1 skrll }
8696 1.1.1.8 christos }
8697 1.1 skrll }
8698 1.1 skrll return insn_count;
8699 1.1 skrll }
8700 1.1 skrll
8701 1.1 skrll
8702 1.1 skrll static int
8703 1.1 skrll unrelaxed_frag_min_insn_count (fragS *fragP)
8704 1.1 skrll {
8705 1.1 skrll xtensa_isa isa = xtensa_default_isa;
8706 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
8707 1.1 skrll int insn_count = 0;
8708 1.1 skrll unsigned int offset = 0;
8709 1.1 skrll
8710 1.1 skrll if (!fragP->tc_frag_data.is_insn)
8711 1.1 skrll return insn_count;
8712 1.1 skrll
8713 1.1 skrll if (!insnbuf)
8714 1.1 skrll insnbuf = xtensa_insnbuf_alloc (isa);
8715 1.1 skrll
8716 1.1 skrll /* Decode the fixed instructions. */
8717 1.1 skrll while (offset < fragP->fr_fix)
8718 1.1 skrll {
8719 1.1 skrll xtensa_format fmt;
8720 1.1 skrll
8721 1.1 skrll xtensa_insnbuf_from_chars
8722 1.1 skrll (isa, insnbuf, (unsigned char *) fragP->fr_literal + offset, 0);
8723 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
8724 1.1 skrll
8725 1.1 skrll if (fmt == XTENSA_UNDEFINED)
8726 1.1 skrll {
8727 1.1 skrll as_fatal (_("undecodable instruction in instruction frag"));
8728 1.1 skrll return insn_count;
8729 1.1 skrll }
8730 1.1 skrll offset += xtensa_format_length (isa, fmt);
8731 1.1 skrll insn_count++;
8732 1.1 skrll }
8733 1.1 skrll
8734 1.1 skrll return insn_count;
8735 1.1 skrll }
8736 1.1 skrll
8737 1.1 skrll
8738 1.1 skrll static bfd_boolean unrelaxed_frag_has_b_j (fragS *);
8739 1.1 skrll
8740 1.1 skrll static bfd_boolean
8741 1.1 skrll branch_before_loop_end (fragS *base_fragP)
8742 1.1 skrll {
8743 1.1 skrll fragS *fragP;
8744 1.1 skrll
8745 1.1 skrll for (fragP = base_fragP;
8746 1.1 skrll fragP && !fragP->tc_frag_data.is_loop_target;
8747 1.1 skrll fragP = fragP->fr_next)
8748 1.1 skrll {
8749 1.1.1.8 christos if (unrelaxed_frag_has_b_j (fragP))
8750 1.1 skrll return TRUE;
8751 1.1 skrll }
8752 1.1 skrll return FALSE;
8753 1.1 skrll }
8754 1.1 skrll
8755 1.1 skrll
8756 1.1 skrll static bfd_boolean
8757 1.1 skrll unrelaxed_frag_has_b_j (fragS *fragP)
8758 1.1 skrll {
8759 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
8760 1.1 skrll xtensa_isa isa = xtensa_default_isa;
8761 1.1 skrll unsigned int offset = 0;
8762 1.1 skrll
8763 1.1 skrll if (!fragP->tc_frag_data.is_insn)
8764 1.1 skrll return FALSE;
8765 1.1 skrll
8766 1.1 skrll if (!insnbuf)
8767 1.1 skrll insnbuf = xtensa_insnbuf_alloc (isa);
8768 1.1 skrll
8769 1.1 skrll /* Decode the fixed instructions. */
8770 1.1 skrll while (offset < fragP->fr_fix)
8771 1.1 skrll {
8772 1.1 skrll xtensa_format fmt;
8773 1.1 skrll int slot;
8774 1.1 skrll
8775 1.1 skrll xtensa_insnbuf_from_chars
8776 1.1 skrll (isa, insnbuf, (unsigned char *) fragP->fr_literal + offset, 0);
8777 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
8778 1.1 skrll if (fmt == XTENSA_UNDEFINED)
8779 1.1 skrll return FALSE;
8780 1.1 skrll
8781 1.1 skrll for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
8782 1.1 skrll {
8783 1.1 skrll xtensa_opcode opcode =
8784 1.1 skrll get_opcode_from_buf (fragP->fr_literal + offset, slot);
8785 1.1 skrll if (xtensa_opcode_is_branch (isa, opcode) == 1
8786 1.1 skrll || xtensa_opcode_is_jump (isa, opcode) == 1)
8787 1.1 skrll return TRUE;
8788 1.1 skrll }
8789 1.1 skrll offset += xtensa_format_length (isa, fmt);
8790 1.1 skrll }
8791 1.1.1.5 christos return FALSE;
8792 1.1 skrll }
8793 1.1 skrll
8794 1.1 skrll
8795 1.1 skrll /* Checks to be made after initial assembly but before relaxation. */
8796 1.1.1.5 christos
8797 1.1 skrll static bfd_boolean is_empty_loop (const TInsn *, fragS *);
8798 1.1 skrll static bfd_boolean is_local_forward_loop (const TInsn *, fragS *);
8799 1.1 skrll
8800 1.1 skrll static void
8801 1.1 skrll xtensa_sanity_check (void)
8802 1.1 skrll {
8803 1.1 skrll const char *file_name;
8804 1.1 skrll unsigned line;
8805 1.1 skrll frchainS *frchP;
8806 1.1.1.4 christos asection *s;
8807 1.1 skrll
8808 1.1 skrll file_name = as_where (&line);
8809 1.1 skrll for (s = stdoutput->sections; s; s = s->next)
8810 1.1 skrll for (frchP = seg_info (s)->frchainP; frchP; frchP = frchP->frch_next)
8811 1.1 skrll {
8812 1.1 skrll fragS *fragP;
8813 1.1 skrll
8814 1.1 skrll /* Walk over all of the fragments in a subsection. */
8815 1.1 skrll for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
8816 1.1 skrll {
8817 1.1 skrll if (fragP->fr_type == rs_machine_dependent
8818 1.1 skrll && fragP->fr_subtype == RELAX_SLOTS
8819 1.1 skrll && fragP->tc_frag_data.slot_subtypes[0] == RELAX_IMMED)
8820 1.1 skrll {
8821 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
8822 1.1 skrll TInsn t_insn;
8823 1.1 skrll
8824 1.1 skrll if (fragP->fr_opcode != NULL)
8825 1.1 skrll {
8826 1.1 skrll if (!insnbuf)
8827 1.1 skrll insnbuf = xtensa_insnbuf_alloc (xtensa_default_isa);
8828 1.1 skrll tinsn_from_chars (&t_insn, fragP->fr_opcode, 0);
8829 1.1 skrll tinsn_immed_from_frag (&t_insn, fragP, 0);
8830 1.1 skrll
8831 1.1 skrll if (xtensa_opcode_is_loop (xtensa_default_isa,
8832 1.1 skrll t_insn.opcode) == 1)
8833 1.1 skrll {
8834 1.1 skrll if (is_empty_loop (&t_insn, fragP))
8835 1.1 skrll {
8836 1.1 skrll new_logical_line (fragP->fr_file, fragP->fr_line);
8837 1.1 skrll as_bad (_("invalid empty loop"));
8838 1.1 skrll }
8839 1.1 skrll if (!is_local_forward_loop (&t_insn, fragP))
8840 1.1 skrll {
8841 1.1 skrll new_logical_line (fragP->fr_file, fragP->fr_line);
8842 1.1 skrll as_bad (_("loop target does not follow "
8843 1.1 skrll "loop instruction in section"));
8844 1.1 skrll }
8845 1.1 skrll }
8846 1.1 skrll }
8847 1.1 skrll }
8848 1.1 skrll }
8849 1.1.1.2 christos }
8850 1.1 skrll new_logical_line (file_name, line);
8851 1.1 skrll }
8852 1.1 skrll
8853 1.1 skrll
8854 1.1 skrll #define LOOP_IMMED_OPN 1
8855 1.1 skrll
8856 1.1 skrll /* Return TRUE if the loop target is the next non-zero fragment. */
8857 1.1 skrll
8858 1.1 skrll static bfd_boolean
8859 1.1 skrll is_empty_loop (const TInsn *insn, fragS *fragP)
8860 1.1 skrll {
8861 1.1 skrll const expressionS *exp;
8862 1.1.1.2 christos symbolS *symbolP;
8863 1.1 skrll fragS *next_fragP;
8864 1.1.1.2 christos
8865 1.1 skrll if (insn->insn_type != ITYPE_INSN)
8866 1.1 skrll return FALSE;
8867 1.1.1.2 christos
8868 1.1 skrll if (xtensa_opcode_is_loop (xtensa_default_isa, insn->opcode) != 1)
8869 1.1 skrll return FALSE;
8870 1.1 skrll
8871 1.1 skrll if (insn->ntok <= LOOP_IMMED_OPN)
8872 1.1 skrll return FALSE;
8873 1.1 skrll
8874 1.1 skrll exp = &insn->tok[LOOP_IMMED_OPN];
8875 1.1 skrll
8876 1.1 skrll if (exp->X_op != O_symbol)
8877 1.1 skrll return FALSE;
8878 1.1 skrll
8879 1.1 skrll symbolP = exp->X_add_symbol;
8880 1.1 skrll if (!symbolP)
8881 1.1 skrll return FALSE;
8882 1.1 skrll
8883 1.1 skrll if (symbol_get_frag (symbolP) == NULL)
8884 1.1 skrll return FALSE;
8885 1.1 skrll
8886 1.1 skrll if (S_GET_VALUE (symbolP) != 0)
8887 1.1 skrll return FALSE;
8888 1.1 skrll
8889 1.1 skrll /* Walk through the zero-size fragments from this one. If we find
8890 1.1 skrll the target fragment, then this is a zero-size loop. */
8891 1.1 skrll
8892 1.1 skrll for (next_fragP = fragP->fr_next;
8893 1.1 skrll next_fragP != NULL;
8894 1.1 skrll next_fragP = next_fragP->fr_next)
8895 1.1 skrll {
8896 1.1.1.2 christos if (next_fragP == symbol_get_frag (symbolP))
8897 1.1 skrll return TRUE;
8898 1.1 skrll if (next_fragP->fr_fix != 0)
8899 1.1 skrll return FALSE;
8900 1.1 skrll }
8901 1.1 skrll return FALSE;
8902 1.1 skrll }
8903 1.1 skrll
8904 1.1 skrll
8905 1.1 skrll static bfd_boolean
8906 1.1 skrll is_local_forward_loop (const TInsn *insn, fragS *fragP)
8907 1.1 skrll {
8908 1.1 skrll const expressionS *exp;
8909 1.1.1.2 christos symbolS *symbolP;
8910 1.1 skrll fragS *next_fragP;
8911 1.1.1.2 christos
8912 1.1 skrll if (insn->insn_type != ITYPE_INSN)
8913 1.1 skrll return FALSE;
8914 1.1.1.2 christos
8915 1.1 skrll if (xtensa_opcode_is_loop (xtensa_default_isa, insn->opcode) != 1)
8916 1.1 skrll return FALSE;
8917 1.1 skrll
8918 1.1 skrll if (insn->ntok <= LOOP_IMMED_OPN)
8919 1.1 skrll return FALSE;
8920 1.1 skrll
8921 1.1 skrll exp = &insn->tok[LOOP_IMMED_OPN];
8922 1.1 skrll
8923 1.1 skrll if (exp->X_op != O_symbol)
8924 1.1 skrll return FALSE;
8925 1.1 skrll
8926 1.1 skrll symbolP = exp->X_add_symbol;
8927 1.1 skrll if (!symbolP)
8928 1.1 skrll return FALSE;
8929 1.1 skrll
8930 1.1 skrll if (symbol_get_frag (symbolP) == NULL)
8931 1.1 skrll return FALSE;
8932 1.1 skrll
8933 1.1 skrll /* Walk through fragments until we find the target.
8934 1.1 skrll If we do not find the target, then this is an invalid loop. */
8935 1.1 skrll
8936 1.1 skrll for (next_fragP = fragP->fr_next;
8937 1.1 skrll next_fragP != NULL;
8938 1.1 skrll next_fragP = next_fragP->fr_next)
8939 1.1 skrll {
8940 1.1 skrll if (next_fragP == symbol_get_frag (symbolP))
8941 1.1 skrll return TRUE;
8942 1.1 skrll }
8943 1.1 skrll
8944 1.1 skrll return FALSE;
8945 1.1 skrll }
8946 1.1 skrll
8947 1.1 skrll
8948 1.1.1.8 christos #define XTINFO_NAME "Xtensa_Info"
8949 1.1 skrll #define XTINFO_NAMESZ 12
8950 1.1.1.5 christos #define XTINFO_TYPE 1
8951 1.1 skrll
8952 1.1 skrll static void
8953 1.1 skrll xtensa_add_config_info (void)
8954 1.1 skrll {
8955 1.1 skrll asection *info_sec;
8956 1.1 skrll char *data, *p;
8957 1.1 skrll int sz;
8958 1.1 skrll
8959 1.1 skrll info_sec = subseg_new (".xtensa.info", 0);
8960 1.1 skrll bfd_set_section_flags (info_sec, SEC_HAS_CONTENTS | SEC_READONLY);
8961 1.1 skrll
8962 1.1 skrll data = XNEWVEC (char, 100);
8963 1.1 skrll sprintf (data, "USE_ABSOLUTE_LITERALS=%d\nABI=%d\n",
8964 1.1 skrll XSHAL_USE_ABSOLUTE_LITERALS, XSHAL_ABI);
8965 1.1 skrll sz = strlen (data) + 1;
8966 1.1 skrll
8967 1.1 skrll /* Add enough null terminators to pad to a word boundary. */
8968 1.1 skrll do
8969 1.1 skrll data[sz++] = 0;
8970 1.1 skrll while ((sz & 3) != 0);
8971 1.1 skrll
8972 1.1 skrll /* Follow the standard note section layout:
8973 1.1 skrll First write the length of the name string. */
8974 1.1 skrll p = frag_more (4);
8975 1.1 skrll md_number_to_chars (p, (valueT) XTINFO_NAMESZ, 4);
8976 1.1 skrll
8977 1.1 skrll /* Next comes the length of the "descriptor", i.e., the actual data. */
8978 1.1 skrll p = frag_more (4);
8979 1.1 skrll md_number_to_chars (p, (valueT) sz, 4);
8980 1.1 skrll
8981 1.1 skrll /* Write the note type. */
8982 1.1 skrll p = frag_more (4);
8983 1.1 skrll md_number_to_chars (p, (valueT) XTINFO_TYPE, 4);
8984 1.1 skrll
8985 1.1 skrll /* Write the name field. */
8986 1.1 skrll p = frag_more (XTINFO_NAMESZ);
8987 1.1 skrll memcpy (p, XTINFO_NAME, XTINFO_NAMESZ);
8988 1.1 skrll
8989 1.1 skrll /* Finally, write the descriptor. */
8990 1.1 skrll p = frag_more (sz);
8991 1.1 skrll memcpy (p, data, sz);
8992 1.1.1.2 christos
8993 1.1.1.2 christos free (data);
8994 1.1.1.2 christos }
8995 1.1.1.2 christos
8996 1.1.1.2 christos
8997 1.1.1.2 christos /* Alignment Functions. */
8999 1.1.1.2 christos
9000 1.1.1.2 christos static int
9001 1.1.1.2 christos get_text_align_power (unsigned target_size)
9002 1.1.1.2 christos {
9003 1.1.1.2 christos if (target_size <= 4)
9004 1.1.1.2 christos return 2;
9005 1.1.1.2 christos
9006 1.1.1.2 christos if (target_size <= 8)
9007 1.1.1.2 christos return 3;
9008 1.1.1.2 christos
9009 1.1.1.2 christos if (target_size <= 16)
9010 1.1.1.2 christos return 4;
9011 1.1.1.2 christos
9012 1.1.1.2 christos if (target_size <= 32)
9013 1.1.1.2 christos return 5;
9014 1.1.1.2 christos
9015 1.1.1.2 christos if (target_size <= 64)
9016 1.1.1.2 christos return 6;
9017 1.1.1.2 christos
9018 1.1.1.2 christos if (target_size <= 128)
9019 1.1 skrll return 7;
9020 1.1 skrll
9021 1.1 skrll if (target_size <= 256)
9022 1.1 skrll return 8;
9023 1.1 skrll
9024 1.1 skrll if (target_size <= 512)
9025 1.1 skrll return 9;
9026 1.1 skrll
9027 1.1 skrll if (target_size <= 1024)
9028 1.1 skrll return 10;
9029 1.1 skrll
9030 1.1 skrll gas_assert (0);
9031 1.1 skrll return 0;
9032 1.1 skrll }
9033 1.1 skrll
9034 1.1 skrll
9035 1.1 skrll static int
9036 1.1 skrll get_text_align_max_fill_size (int align_pow,
9037 1.1 skrll bfd_boolean use_nops,
9038 1.1 skrll bfd_boolean use_no_density)
9039 1.1 skrll {
9040 1.1 skrll if (!use_nops)
9041 1.1 skrll return (1 << align_pow);
9042 1.1 skrll if (use_no_density)
9043 1.1 skrll return 3 * (1 << align_pow);
9044 1.1 skrll
9045 1.1 skrll return 1 + (1 << align_pow);
9046 1.1 skrll }
9047 1.1 skrll
9048 1.1 skrll
9049 1.1 skrll /* Calculate the minimum bytes of fill needed at "address" to align a
9050 1.1 skrll target instruction of size "target_size" so that it does not cross a
9051 1.1 skrll power-of-two boundary specified by "align_pow". If "use_nops" is FALSE,
9052 1.1 skrll the fill can be an arbitrary number of bytes. Otherwise, the space must
9053 1.1.1.2 christos be filled by NOP instructions. */
9054 1.1 skrll
9055 1.1 skrll static int
9056 1.1 skrll get_text_align_fill_size (addressT address,
9057 1.1 skrll int align_pow,
9058 1.1 skrll int target_size,
9059 1.1 skrll bfd_boolean use_nops,
9060 1.1 skrll bfd_boolean use_no_density)
9061 1.1 skrll {
9062 1.1 skrll addressT alignment, fill, fill_limit, fill_step;
9063 1.1 skrll bfd_boolean skip_one = FALSE;
9064 1.1 skrll
9065 1.1 skrll alignment = (1 << align_pow);
9066 1.1 skrll gas_assert (target_size > 0 && alignment >= (addressT) target_size);
9067 1.1 skrll
9068 1.1 skrll if (!use_nops)
9069 1.1 skrll {
9070 1.1 skrll fill_limit = alignment;
9071 1.1 skrll fill_step = 1;
9072 1.1 skrll }
9073 1.1 skrll else if (!use_no_density)
9074 1.1 skrll {
9075 1.1 skrll /* Combine 2- and 3-byte NOPs to fill anything larger than one. */
9076 1.1 skrll fill_limit = alignment * 2;
9077 1.1 skrll fill_step = 1;
9078 1.1 skrll skip_one = TRUE;
9079 1.1 skrll }
9080 1.1 skrll else
9081 1.1 skrll {
9082 1.1 skrll /* Fill with 3-byte NOPs -- can only fill multiples of 3. */
9083 1.1.1.2 christos fill_limit = alignment * 3;
9084 1.1 skrll fill_step = 3;
9085 1.1 skrll }
9086 1.1 skrll
9087 1.1 skrll /* Try all fill sizes until finding one that works. */
9088 1.1 skrll for (fill = 0; fill < fill_limit; fill += fill_step)
9089 1.1 skrll {
9090 1.1 skrll if (skip_one && fill == 1)
9091 1.1.1.2 christos continue;
9092 1.1.1.2 christos if ((address + fill) >> align_pow
9093 1.1.1.2 christos == (address + fill + target_size - 1) >> align_pow)
9094 1.1.1.2 christos return fill;
9095 1.1.1.2 christos }
9096 1.1.1.2 christos gas_assert (0);
9097 1.1.1.2 christos return 0;
9098 1.1.1.2 christos }
9099 1.1.1.2 christos
9100 1.1.1.2 christos
9101 1.1.1.2 christos static int
9102 1.1 skrll branch_align_power (segT sec)
9103 1.1 skrll {
9104 1.1 skrll /* If the Xtensa processor has a fetch width of X, and
9105 1.1 skrll the section is aligned to at least that boundary, then a branch
9106 1.1 skrll target need only fit within that aligned block of memory to avoid
9107 1.1 skrll a stall. Otherwise, try to fit branch targets within 4-byte
9108 1.1 skrll aligned blocks (which may be insufficient, e.g., if the section
9109 1.1 skrll has no alignment, but it's good enough). */
9110 1.1 skrll int fetch_align = get_text_align_power(xtensa_fetch_width);
9111 1.1 skrll int sec_align = get_recorded_alignment (sec);
9112 1.1 skrll
9113 1.1 skrll if (sec_align >= fetch_align)
9114 1.1 skrll return fetch_align;
9115 1.1 skrll
9116 1.1.1.2 christos return 2;
9117 1.1 skrll }
9118 1.1 skrll
9119 1.1 skrll
9120 1.1.1.2 christos /* This will assert if it is not possible. */
9121 1.1 skrll
9122 1.1 skrll static int
9123 1.1 skrll get_text_align_nop_count (offsetT fill_size, bfd_boolean use_no_density)
9124 1.1 skrll {
9125 1.1 skrll int count = 0;
9126 1.1 skrll
9127 1.1 skrll if (use_no_density)
9128 1.1 skrll {
9129 1.1 skrll gas_assert (fill_size % 3 == 0);
9130 1.1.1.2 christos return (fill_size / 3);
9131 1.1 skrll }
9132 1.1 skrll
9133 1.1 skrll gas_assert (fill_size != 1); /* Bad argument. */
9134 1.1 skrll
9135 1.1 skrll while (fill_size > 1)
9136 1.1 skrll {
9137 1.1 skrll int insn_size = 3;
9138 1.1 skrll if (fill_size == 2 || fill_size == 4)
9139 1.1 skrll insn_size = 2;
9140 1.1 skrll fill_size -= insn_size;
9141 1.1 skrll count++;
9142 1.1 skrll }
9143 1.1 skrll gas_assert (fill_size != 1); /* Bad algorithm. */
9144 1.1 skrll return count;
9145 1.1.1.2 christos }
9146 1.1 skrll
9147 1.1 skrll
9148 1.1 skrll static int
9149 1.1 skrll get_text_align_nth_nop_size (offsetT fill_size,
9150 1.1 skrll int n,
9151 1.1 skrll bfd_boolean use_no_density)
9152 1.1 skrll {
9153 1.1 skrll int count = 0;
9154 1.1 skrll
9155 1.1 skrll if (use_no_density)
9156 1.1 skrll return 3;
9157 1.1.1.2 christos
9158 1.1 skrll gas_assert (fill_size != 1); /* Bad argument. */
9159 1.1 skrll
9160 1.1 skrll while (fill_size > 1)
9161 1.1 skrll {
9162 1.1 skrll int insn_size = 3;
9163 1.1 skrll if (fill_size == 2 || fill_size == 4)
9164 1.1 skrll insn_size = 2;
9165 1.1 skrll fill_size -= insn_size;
9166 1.1 skrll count++;
9167 1.1 skrll if (n + 1 == count)
9168 1.1 skrll return insn_size;
9169 1.1 skrll }
9170 1.1 skrll gas_assert (0);
9171 1.1 skrll return 0;
9172 1.1 skrll }
9173 1.1 skrll
9174 1.1 skrll
9175 1.1 skrll /* For the given fragment, find the appropriate address
9176 1.1 skrll for it to begin at if we are using NOPs to align it. */
9177 1.1 skrll
9178 1.1 skrll static addressT
9179 1.1 skrll get_noop_aligned_address (fragS *fragP, addressT address)
9180 1.1 skrll {
9181 1.1 skrll /* The rule is: get next fragment's FIRST instruction. Find
9182 1.1 skrll the smallest number of bytes that need to be added to
9183 1.1 skrll ensure that the next fragment's FIRST instruction will fit
9184 1.1 skrll in a single word.
9185 1.1 skrll
9186 1.1 skrll E.G., 2 bytes : 0, 1, 2 mod 4
9187 1.1 skrll 3 bytes: 0, 1 mod 4
9188 1.1 skrll
9189 1.1 skrll If the FIRST instruction MIGHT be relaxed,
9190 1.1 skrll assume that it will become a 3-byte instruction.
9191 1.1.1.2 christos
9192 1.1.1.2 christos Note again here that LOOP instructions are not bundleable,
9193 1.1 skrll and this relaxation only applies to LOOP opcodes. */
9194 1.1 skrll
9195 1.1 skrll int fill_size = 0;
9196 1.1 skrll int first_insn_size;
9197 1.1 skrll int loop_insn_size;
9198 1.1 skrll addressT pre_opcode_bytes;
9199 1.1 skrll int align_power;
9200 1.1.1.2 christos fragS *first_insn;
9201 1.1 skrll xtensa_opcode opcode;
9202 1.1 skrll bfd_boolean is_loop;
9203 1.1 skrll
9204 1.1 skrll gas_assert (fragP->fr_type == rs_machine_dependent);
9205 1.1 skrll gas_assert (fragP->fr_subtype == RELAX_ALIGN_NEXT_OPCODE);
9206 1.1 skrll
9207 1.1 skrll /* Find the loop frag. */
9208 1.1 skrll first_insn = next_non_empty_frag (fragP);
9209 1.1 skrll /* Now find the first insn frag. */
9210 1.1 skrll first_insn = next_non_empty_frag (first_insn);
9211 1.1 skrll
9212 1.1 skrll is_loop = next_frag_opcode_is_loop (fragP, &opcode);
9213 1.1 skrll gas_assert (is_loop);
9214 1.1 skrll loop_insn_size = xg_get_single_size (opcode);
9215 1.1 skrll
9216 1.1 skrll pre_opcode_bytes = next_frag_pre_opcode_bytes (fragP);
9217 1.1 skrll pre_opcode_bytes += loop_insn_size;
9218 1.1 skrll
9219 1.1 skrll /* For loops, the alignment depends on the size of the
9220 1.1 skrll instruction following the loop, not the LOOP instruction. */
9221 1.1 skrll
9222 1.1 skrll if (first_insn == NULL)
9223 1.1 skrll first_insn_size = xtensa_fetch_width;
9224 1.1 skrll else
9225 1.1 skrll first_insn_size = get_loop_align_size (frag_format_size (first_insn));
9226 1.1 skrll
9227 1.1 skrll /* If it was 8, then we'll need a larger alignment for the section. */
9228 1.1 skrll align_power = get_text_align_power (first_insn_size);
9229 1.1 skrll record_alignment (now_seg, align_power);
9230 1.1 skrll
9231 1.1 skrll fill_size = get_text_align_fill_size
9232 1.1 skrll (address + pre_opcode_bytes, align_power, first_insn_size, TRUE,
9233 1.1 skrll fragP->tc_frag_data.is_no_density);
9234 1.1 skrll
9235 1.1 skrll return address + fill_size;
9236 1.1 skrll }
9237 1.1 skrll
9238 1.1 skrll
9239 1.1 skrll /* 3 mechanisms for relaxing an alignment:
9240 1.1 skrll
9241 1.1 skrll Align to a power of 2.
9242 1.1 skrll Align so the next fragment's instruction does not cross a word boundary.
9243 1.1 skrll Align the current instruction so that if the next instruction
9244 1.1 skrll were 3 bytes, it would not cross a word boundary.
9245 1.1 skrll
9246 1.1 skrll We can align with:
9247 1.1 skrll
9248 1.1 skrll zeros - This is easy; always insert zeros.
9249 1.1 skrll nops - 3-byte and 2-byte instructions
9250 1.1 skrll 2 - 2-byte nop
9251 1.1 skrll 3 - 3-byte nop
9252 1.1 skrll 4 - 2 2-byte nops
9253 1.1 skrll >=5 : 3-byte instruction + fn (n-3)
9254 1.1 skrll widening - widen previous instructions. */
9255 1.1.1.2 christos
9256 1.1 skrll static offsetT
9257 1.1 skrll get_aligned_diff (fragS *fragP, addressT address, offsetT *max_diff)
9258 1.1 skrll {
9259 1.1 skrll addressT target_address, loop_insn_offset;
9260 1.1 skrll int target_size;
9261 1.1 skrll xtensa_opcode loop_opcode;
9262 1.1 skrll bfd_boolean is_loop;
9263 1.1 skrll int align_power;
9264 1.1 skrll offsetT opt_diff;
9265 1.1 skrll offsetT branch_align;
9266 1.1 skrll fragS *loop_frag;
9267 1.1 skrll
9268 1.1 skrll gas_assert (fragP->fr_type == rs_machine_dependent);
9269 1.1 skrll switch (fragP->fr_subtype)
9270 1.1 skrll {
9271 1.1 skrll case RELAX_DESIRE_ALIGN:
9272 1.1.1.2 christos target_size = next_frag_format_size (fragP);
9273 1.1 skrll if (target_size == XTENSA_UNDEFINED)
9274 1.1 skrll target_size = 3;
9275 1.1 skrll align_power = branch_align_power (now_seg);
9276 1.1 skrll branch_align = 1 << align_power;
9277 1.1 skrll /* Don't count on the section alignment being as large as the target. */
9278 1.1 skrll if (target_size > branch_align)
9279 1.1 skrll target_size = branch_align;
9280 1.1 skrll opt_diff = get_text_align_fill_size (address, align_power,
9281 1.1 skrll target_size, FALSE, FALSE);
9282 1.1 skrll
9283 1.1 skrll *max_diff = (opt_diff + branch_align
9284 1.1.1.2 christos - (target_size + ((address + opt_diff) % branch_align)));
9285 1.1 skrll gas_assert (*max_diff >= opt_diff);
9286 1.1 skrll return opt_diff;
9287 1.1 skrll
9288 1.1 skrll case RELAX_ALIGN_NEXT_OPCODE:
9289 1.1 skrll /* The next non-empty frag after this one holds the LOOP instruction
9290 1.1 skrll that needs to be aligned. The required alignment depends on the
9291 1.1 skrll size of the next non-empty frag after the loop frag, i.e., the
9292 1.1 skrll first instruction in the loop. */
9293 1.1 skrll loop_frag = next_non_empty_frag (fragP);
9294 1.1 skrll target_size = get_loop_align_size (next_frag_format_size (loop_frag));
9295 1.1 skrll loop_insn_offset = 0;
9296 1.1 skrll is_loop = next_frag_opcode_is_loop (fragP, &loop_opcode);
9297 1.1 skrll gas_assert (is_loop);
9298 1.1 skrll
9299 1.1 skrll /* If the loop has been expanded then the LOOP instruction
9300 1.1 skrll could be at an offset from this fragment. */
9301 1.1 skrll if (loop_frag->tc_frag_data.slot_subtypes[0] != RELAX_IMMED)
9302 1.1 skrll loop_insn_offset = get_expanded_loop_offset (loop_opcode);
9303 1.1 skrll
9304 1.1.1.2 christos /* In an ideal world, which is what we are shooting for here,
9305 1.1 skrll we wouldn't need to use any NOPs immediately prior to the
9306 1.1 skrll LOOP instruction. If this approach fails, relax_frag_loop_align
9307 1.1 skrll will call get_noop_aligned_address. */
9308 1.1 skrll target_address =
9309 1.1 skrll address + loop_insn_offset + xg_get_single_size (loop_opcode);
9310 1.1.1.2 christos align_power = get_text_align_power (target_size);
9311 1.1 skrll opt_diff = get_text_align_fill_size (target_address, align_power,
9312 1.1 skrll target_size, FALSE, FALSE);
9313 1.1 skrll
9314 1.1 skrll *max_diff = xtensa_fetch_width
9315 1.1 skrll - ((target_address + opt_diff) % xtensa_fetch_width)
9316 1.1 skrll - target_size + opt_diff;
9317 1.1 skrll gas_assert (*max_diff >= opt_diff);
9318 1.1 skrll return opt_diff;
9319 1.1 skrll
9320 1.1 skrll default:
9321 1.1 skrll break;
9322 1.1.1.6 christos }
9323 1.1.1.6 christos gas_assert (0);
9324 1.1.1.6 christos return 0;
9325 1.1.1.6 christos }
9326 1.1.1.6 christos
9327 1.1.1.6 christos
9328 1.1.1.6 christos /* md_relax_frag Hook and Helper Functions. */
9330 1.1.1.6 christos
9331 1.1.1.6 christos static long relax_frag_loop_align (fragS *, long);
9332 1.1.1.6 christos static long relax_frag_for_align (fragS *, long);
9333 1.1.1.6 christos static long relax_frag_immed
9334 1.1.1.6 christos (segT, fragS *, long, int, xtensa_format, int, int *, bfd_boolean);
9335 1.1.1.6 christos
9336 1.1.1.6 christos /* Get projected address for the first fulcrum on a path from source to
9337 1.1.1.6 christos target. */
9338 1.1.1.6 christos static addressT xg_get_fulcrum (addressT source, addressT target)
9339 1.1.1.6 christos {
9340 1.1.1.6 christos offsetT delta = target - source;
9341 1.1.1.6 christos int n;
9342 1.1.1.6 christos
9343 1.1.1.6 christos n = (labs (delta) + J_RANGE - J_MARGIN - 1) / (J_RANGE - J_MARGIN);
9344 1.1.1.6 christos return source + delta / n;
9345 1.1.1.6 christos }
9346 1.1.1.4 christos
9347 1.1.1.6 christos /* Given trampoline index, source and target of a jump find the best
9348 1.1.1.6 christos candidate trampoline for the first fulcrum. The best trampoline is
9349 1.1.1.6 christos the one in the reach of "j' instruction from the source, closest to
9350 1.1.1.6 christos the projected fulcrum address, and preferrably w/o a jump around or
9351 1.1.1.6 christos with already initialized jump around. */
9352 1.1.1.4 christos static size_t xg_find_best_trampoline (struct trampoline_index *idx,
9353 1.1.1.6 christos addressT source, addressT target)
9354 1.1.1.4 christos {
9355 1.1.1.6 christos addressT fulcrum = xg_get_fulcrum (source, target);
9356 1.1.1.6 christos size_t dist = 0;
9357 1.1.1.6 christos size_t best = -1;
9358 1.1.1.6 christos size_t base_tr = xg_find_trampoline (idx, fulcrum);
9359 1.1.1.6 christos int checked = 1;
9360 1.1.1.6 christos
9361 1.1.1.6 christos /* Check trampoline frags around the base_tr to find the best. */
9362 1.1.1.4 christos for (dist = 0; checked; ++dist)
9363 1.1.1.6 christos {
9364 1.1.1.6 christos int i;
9365 1.1.1.6 christos size_t tr = base_tr - dist;
9366 1.1.1.6 christos
9367 1.1.1.6 christos checked = 0;
9368 1.1.1.6 christos
9369 1.1.1.6 christos /* Trampolines are checked in the following order:
9370 1.1.1.7 christos base_tr, base_tr + 1, base_tr - 1, base_tr + 2, base_tr - 2 */
9371 1.1.1.7 christos for (i = 0; i < 2; ++i, tr = base_tr + dist + 1)
9372 1.1.1.7 christos if (tr < idx->n_entries)
9373 1.1.1.7 christos {
9374 1.1.1.7 christos fragS *trampoline_frag = idx->entry[tr];
9375 1.1.1.7 christos offsetT off;
9376 1.1.1.6 christos
9377 1.1.1.6 christos /* Don't check trampolines outside source - target interval. */
9378 1.1.1.6 christos if ((trampoline_frag->fr_address < source &&
9379 1.1.1.6 christos trampoline_frag->fr_address < target) ||
9380 1.1.1.6 christos (trampoline_frag->fr_address > source &&
9381 1.1.1.6 christos trampoline_frag->fr_address > target))
9382 1.1.1.6 christos continue;
9383 1.1.1.6 christos
9384 1.1.1.6 christos /* Don't choose trampoline that contains the source. */
9385 1.1.1.6 christos if (source >= trampoline_frag->fr_address
9386 1.1.1.6 christos && source <= trampoline_frag->fr_address +
9387 1.1.1.6 christos trampoline_frag->fr_fix)
9388 1.1.1.6 christos continue;
9389 1.1.1.6 christos
9390 1.1.1.6 christos off = trampoline_frag->fr_address - fulcrum;
9391 1.1.1.6 christos /* Stop if some trampoline is found and the search is more than
9392 1.1.1.6 christos J_RANGE / 4 from the projected fulcrum. A trampoline w/o jump
9393 1.1.1.6 christos around is nice, but it shouldn't have much overhead. */
9394 1.1.1.6 christos if (best < idx->n_entries && labs (off) > J_RANGE / 4)
9395 1.1.1.6 christos return best;
9396 1.1.1.4 christos
9397 1.1.1.6 christos off = trampoline_frag->fr_address - source;
9398 1.1.1.6 christos if (labs (off) < J_RANGE - J_MARGIN)
9399 1.1.1.6 christos {
9400 1.1.1.6 christos ++checked;
9401 1.1.1.6 christos /* Stop if a trampoline w/o jump around is found or initialized
9402 1.1.1.6 christos trampoline with jump around is found. */
9403 1.1.1.6 christos if (!trampoline_frag->tc_frag_data.needs_jump_around ||
9404 1.1.1.6 christos trampoline_frag->fr_fix)
9405 1.1.1.6 christos return tr;
9406 1.1.1.6 christos else if (best >= idx->n_entries)
9407 1.1.1.6 christos best = tr;
9408 1.1.1.6 christos }
9409 1.1.1.6 christos }
9410 1.1.1.6 christos }
9411 1.1.1.6 christos
9412 1.1.1.6 christos if (best < idx->n_entries)
9413 1.1.1.6 christos return best;
9414 1.1.1.6 christos else
9415 1.1.1.6 christos as_fatal (_("cannot find suitable trampoline"));
9416 1.1.1.6 christos }
9417 1.1.1.6 christos
9418 1.1.1.6 christos static fixS *xg_relax_fixup (struct trampoline_index *idx, fixS *fixP)
9419 1.1.1.6 christos {
9420 1.1.1.6 christos symbolS *s = fixP->fx_addsy;
9421 1.1.1.6 christos addressT source = fixP->fx_frag->fr_address;
9422 1.1.1.6 christos addressT target = S_GET_VALUE (s) + fixP->fx_offset;
9423 1.1.1.6 christos size_t tr = xg_find_best_trampoline (idx, source, target);
9424 1.1.1.6 christos fragS *trampoline_frag = idx->entry[tr];
9425 1.1.1.6 christos fixS *newfixP;
9426 1.1.1.6 christos
9427 1.1.1.6 christos init_trampoline_frag (trampoline_frag);
9428 1.1.1.6 christos newfixP = xg_append_jump (trampoline_frag,
9429 1.1.1.6 christos fixP->fx_addsy, fixP->fx_offset);
9430 1.1.1.4 christos
9431 1.1.1.4 christos /* Adjust the fixup for the original "j" instruction to
9432 1.1.1.6 christos point to the newly added jump. */
9433 1.1.1.4 christos fixP->fx_addsy = trampoline_frag->fr_symbol;
9434 1.1.1.4 christos fixP->fx_offset = trampoline_frag->fr_fix - 3;
9435 1.1.1.6 christos fixP->tc_fix_data.X_add_symbol = trampoline_frag->fr_symbol;
9436 1.1.1.6 christos fixP->tc_fix_data.X_add_number = trampoline_frag->fr_fix - 3;
9437 1.1.1.6 christos
9438 1.1.1.4 christos trampoline_frag->tc_frag_data.relax_seen = FALSE;
9439 1.1.1.4 christos
9440 1.1.1.4 christos if (xg_is_trampoline_frag_full (trampoline_frag))
9441 1.1.1.4 christos xg_remove_trampoline_from_index (idx, tr);
9442 1.1.1.4 christos
9443 1.1.1.4 christos return newfixP;
9444 1.1.1.4 christos }
9445 1.1.1.4 christos
9446 1.1.1.6 christos static bfd_boolean xg_is_relaxable_fixup (fixS *fixP)
9447 1.1.1.6 christos {
9448 1.1.1.4 christos xtensa_isa isa = xtensa_default_isa;
9449 1.1.1.4 christos addressT addr = fixP->fx_frag->fr_address;
9450 1.1.1.6 christos addressT target;
9451 1.1.1.4 christos offsetT delta;
9452 1.1.1.4 christos symbolS *s = fixP->fx_addsy;
9453 1.1.1.4 christos int slot;
9454 1.1.1.4 christos xtensa_format fmt;
9455 1.1.1.4 christos xtensa_opcode opcode;
9456 1.1.1.4 christos
9457 1.1.1.4 christos if (fixP->fx_r_type < BFD_RELOC_XTENSA_SLOT0_OP ||
9458 1.1.1.4 christos fixP->fx_r_type > BFD_RELOC_XTENSA_SLOT14_OP)
9459 1.1.1.4 christos return FALSE;
9460 1.1.1.4 christos
9461 1.1.1.6 christos target = S_GET_VALUE (s) + fixP->fx_offset;
9462 1.1.1.4 christos delta = target - addr;
9463 1.1.1.4 christos
9464 1.1.1.6 christos if (labs (delta) < J_RANGE - J_MARGIN)
9465 1.1.1.4 christos return FALSE;
9466 1.1.1.6 christos
9467 1.1.1.6 christos xtensa_insnbuf_from_chars (isa, trampoline_buf,
9468 1.1.1.6 christos (unsigned char *) fixP->fx_frag->fr_literal +
9469 1.1.1.4 christos fixP->fx_where, 0);
9470 1.1.1.6 christos fmt = xtensa_format_decode (isa, trampoline_buf);
9471 1.1.1.4 christos gas_assert (fmt != XTENSA_UNDEFINED);
9472 1.1.1.6 christos slot = fixP->tc_fix_data.slot;
9473 1.1.1.6 christos xtensa_format_get_slot (isa, fmt, slot, trampoline_buf, trampoline_slotbuf);
9474 1.1.1.4 christos opcode = xtensa_opcode_decode (isa, fmt, slot, trampoline_slotbuf);
9475 1.1.1.6 christos return opcode == xtensa_j_opcode;
9476 1.1.1.6 christos }
9477 1.1.1.6 christos
9478 1.1.1.6 christos static void xg_relax_fixups (struct trampoline_seg *ts)
9479 1.1.1.6 christos {
9480 1.1.1.6 christos struct trampoline_index *idx = &ts->index;
9481 1.1.1.6 christos segment_info_type *seginfo = seg_info (now_seg);
9482 1.1.1.6 christos fixS *fx;
9483 1.1.1.6 christos
9484 1.1.1.4 christos for (fx = seginfo->fix_root; fx; fx = fx->fx_next)
9485 1.1.1.6 christos {
9486 1.1.1.6 christos fixS *fixP = fx;
9487 1.1.1.6 christos struct trampoline_chain *tc = NULL;
9488 1.1.1.6 christos
9489 1.1.1.6 christos if (xg_is_relaxable_fixup (fixP))
9490 1.1.1.6 christos {
9491 1.1.1.4 christos tc = xg_find_best_eq_target (ts, fixP->fx_frag->fr_address,
9492 1.1.1.4 christos &fixP->fx_addsy, &fixP->fx_offset);
9493 1.1.1.4 christos if (!tc)
9494 1.1.1.6 christos tc = xg_create_trampoline_chain (ts, fixP->fx_addsy,
9495 1.1.1.6 christos fixP->fx_offset);
9496 1.1.1.6 christos gas_assert (tc);
9497 1.1.1.6 christos }
9498 1.1.1.6 christos
9499 1.1.1.6 christos while (xg_is_relaxable_fixup (fixP))
9500 1.1.1.6 christos {
9501 1.1.1.6 christos fixP = xg_relax_fixup (idx, fixP);
9502 1.1.1.4 christos xg_add_location_to_chain (tc, fixP->fx_frag->fr_symbol,
9503 1.1.1.6 christos fixP->fx_where);
9504 1.1.1.4 christos }
9505 1.1.1.6 christos }
9506 1.1.1.6 christos }
9507 1.1.1.4 christos
9508 1.1 skrll /* Given a trampoline frag relax all jumps that might want to use this
9509 1.1 skrll trampoline. Only do real work once per relaxation cycle, when
9510 1.1 skrll xg_relax_trampoline is called for the first trampoline in the now_seg.
9511 1.1 skrll Don't use stretch, don't update new_stretch: place fulcrums with a
9512 1.1 skrll slack to tolerate code movement. In the worst case if a jump between
9513 1.1 skrll two trampolines wouldn't reach the next relaxation pass will fix it. */
9514 1.1 skrll static void xg_relax_trampoline (fragS *fragP, long stretch ATTRIBUTE_UNUSED,
9515 1.1 skrll long *new_stretch ATTRIBUTE_UNUSED)
9516 1.1 skrll {
9517 1.1 skrll struct trampoline_seg *ts = find_trampoline_seg (now_seg);
9518 1.1.1.5 christos
9519 1.1 skrll if (ts->index.n_entries && ts->index.entry[0] == fragP)
9520 1.1 skrll xg_relax_fixups (ts);
9521 1.1 skrll }
9522 1.1 skrll
9523 1.1 skrll /* Return the number of bytes added to this fragment, given that the
9524 1.1 skrll input has been stretched already by "stretch". */
9525 1.1.1.5 christos
9526 1.1 skrll long
9527 1.1 skrll xtensa_relax_frag (fragS *fragP, long stretch, int *stretched_p)
9528 1.1 skrll {
9529 1.1 skrll xtensa_isa isa = xtensa_default_isa;
9530 1.1 skrll int unreported = fragP->tc_frag_data.unreported_expansion;
9531 1.1 skrll long new_stretch = 0;
9532 1.1 skrll const char *file_name;
9533 1.1 skrll unsigned line;
9534 1.1 skrll int lit_size;
9535 1.1 skrll static xtensa_insnbuf vbuf = NULL;
9536 1.1 skrll int slot, num_slots;
9537 1.1 skrll xtensa_format fmt;
9538 1.1 skrll
9539 1.1 skrll file_name = as_where (&line);
9540 1.1 skrll new_logical_line (fragP->fr_file, fragP->fr_line);
9541 1.1 skrll
9542 1.1 skrll fragP->tc_frag_data.unreported_expansion = 0;
9543 1.1 skrll
9544 1.1 skrll switch (fragP->fr_subtype)
9545 1.1 skrll {
9546 1.1 skrll case RELAX_ALIGN_NEXT_OPCODE:
9547 1.1 skrll /* Always convert. */
9548 1.1 skrll if (fragP->tc_frag_data.relax_seen)
9549 1.1 skrll new_stretch = relax_frag_loop_align (fragP, stretch);
9550 1.1 skrll break;
9551 1.1 skrll
9552 1.1 skrll case RELAX_LOOP_END:
9553 1.1 skrll /* Do nothing. */
9554 1.1 skrll break;
9555 1.1 skrll
9556 1.1 skrll case RELAX_LOOP_END_ADD_NOP:
9557 1.1 skrll /* Add a NOP and switch to .fill 0. */
9558 1.1 skrll new_stretch = relax_frag_add_nop (fragP);
9559 1.1 skrll frag_wane (fragP);
9560 1.1.1.2 christos break;
9561 1.1 skrll
9562 1.1 skrll case RELAX_DESIRE_ALIGN:
9563 1.1 skrll /* Do nothing. The narrowing before this frag will either align
9564 1.1 skrll it or not. */
9565 1.1 skrll break;
9566 1.1 skrll
9567 1.1 skrll case RELAX_LITERAL:
9568 1.1 skrll case RELAX_LITERAL_FINAL:
9569 1.1 skrll return 0;
9570 1.1 skrll
9571 1.1 skrll case RELAX_LITERAL_NR:
9572 1.1 skrll lit_size = 4;
9573 1.1 skrll fragP->fr_subtype = RELAX_LITERAL_FINAL;
9574 1.1 skrll gas_assert (unreported == lit_size);
9575 1.1 skrll memset (&fragP->fr_literal[fragP->fr_fix], 0, 4);
9576 1.1 skrll fragP->fr_var -= lit_size;
9577 1.1 skrll fragP->fr_fix += lit_size;
9578 1.1 skrll new_stretch = 4;
9579 1.1 skrll break;
9580 1.1 skrll
9581 1.1 skrll case RELAX_SLOTS:
9582 1.1 skrll if (vbuf == NULL)
9583 1.1 skrll vbuf = xtensa_insnbuf_alloc (isa);
9584 1.1 skrll
9585 1.1 skrll xtensa_insnbuf_from_chars
9586 1.1 skrll (isa, vbuf, (unsigned char *) fragP->fr_opcode, 0);
9587 1.1 skrll fmt = xtensa_format_decode (isa, vbuf);
9588 1.1 skrll num_slots = xtensa_format_num_slots (isa, fmt);
9589 1.1 skrll
9590 1.1 skrll for (slot = 0; slot < num_slots; slot++)
9591 1.1 skrll {
9592 1.1 skrll switch (fragP->tc_frag_data.slot_subtypes[slot])
9593 1.1 skrll {
9594 1.1 skrll case RELAX_NARROW:
9595 1.1 skrll if (fragP->tc_frag_data.relax_seen)
9596 1.1 skrll new_stretch += relax_frag_for_align (fragP, stretch);
9597 1.1 skrll break;
9598 1.1 skrll
9599 1.1 skrll case RELAX_IMMED:
9600 1.1 skrll case RELAX_IMMED_STEP1:
9601 1.1 skrll case RELAX_IMMED_STEP2:
9602 1.1 skrll case RELAX_IMMED_STEP3:
9603 1.1 skrll /* Place the immediate. */
9604 1.1.1.4 christos new_stretch += relax_frag_immed
9605 1.1.1.4 christos (now_seg, fragP, stretch,
9606 1.1.1.4 christos fragP->tc_frag_data.slot_subtypes[slot] - RELAX_IMMED,
9607 1.1.1.4 christos fmt, slot, stretched_p, FALSE);
9608 1.1.1.4 christos break;
9609 1.1.1.4 christos
9610 1.1.1.4 christos default:
9611 1.1.1.4 christos /* This is OK; see the note in xg_assemble_vliw_tokens. */
9612 1.1.1.4 christos break;
9613 1.1.1.4 christos }
9614 1.1.1.4 christos }
9615 1.1.1.4 christos break;
9616 1.1.1.4 christos
9617 1.1.1.4 christos case RELAX_LITERAL_POOL_BEGIN:
9618 1.1.1.4 christos if (fragP->fr_var != 0)
9619 1.1.1.4 christos {
9620 1.1.1.4 christos /* We have a converted "candidate" literal pool;
9621 1.1.1.4 christos assemble a jump around it. */
9622 1.1.1.4 christos TInsn insn;
9623 1.1.1.4 christos if (!litpool_slotbuf)
9624 1.1.1.4 christos {
9625 1.1.1.4 christos litpool_buf = xtensa_insnbuf_alloc (isa);
9626 1.1.1.4 christos litpool_slotbuf = xtensa_insnbuf_alloc (isa);
9627 1.1.1.4 christos }
9628 1.1.1.4 christos new_stretch += 3;
9629 1.1.1.4 christos fragP->tc_frag_data.relax_seen = FALSE; /* Need another pass. */
9630 1.1.1.4 christos fragP->tc_frag_data.is_insn = TRUE;
9631 1.1.1.4 christos tinsn_init (&insn);
9632 1.1.1.4 christos insn.insn_type = ITYPE_INSN;
9633 1.1.1.4 christos insn.opcode = xtensa_j_opcode;
9634 1.1.1.4 christos insn.ntok = 1;
9635 1.1.1.4 christos set_expr_symbol_offset (&insn.tok[0], fragP->fr_symbol,
9636 1.1.1.4 christos fragP->fr_fix);
9637 1.1 skrll fmt = xg_get_single_format (xtensa_j_opcode);
9638 1.1.1.4 christos tinsn_to_slotbuf (fmt, 0, &insn, litpool_slotbuf);
9639 1.1 skrll xtensa_format_set_slot (isa, fmt, 0, litpool_buf, litpool_slotbuf);
9640 1.1 skrll xtensa_insnbuf_to_chars (isa, litpool_buf,
9641 1.1 skrll (unsigned char *)fragP->fr_literal +
9642 1.1 skrll fragP->fr_fix, 3);
9643 1.1 skrll fragP->fr_fix += 3;
9644 1.1 skrll fragP->fr_var -= 3;
9645 1.1 skrll /* Add a fix-up. */
9646 1.1 skrll fix_new (fragP, 0, 3, fragP->fr_symbol, 0, TRUE,
9647 1.1 skrll BFD_RELOC_XTENSA_SLOT0_OP);
9648 1.1 skrll }
9649 1.1 skrll break;
9650 1.1.1.4 christos
9651 1.1.1.4 christos case RELAX_LITERAL_POOL_END:
9652 1.1.1.6 christos case RELAX_LITERAL_POOL_CANDIDATE_BEGIN:
9653 1.1.1.4 christos case RELAX_MAYBE_UNREACHABLE:
9654 1.1.1.4 christos case RELAX_MAYBE_DESIRE_ALIGN:
9655 1.1 skrll /* No relaxation required. */
9656 1.1 skrll break;
9657 1.1 skrll
9658 1.1 skrll case RELAX_FILL_NOP:
9659 1.1 skrll case RELAX_UNREACHABLE:
9660 1.1 skrll if (fragP->tc_frag_data.relax_seen)
9661 1.1 skrll new_stretch += relax_frag_for_align (fragP, stretch);
9662 1.1 skrll break;
9663 1.1 skrll
9664 1.1 skrll case RELAX_TRAMPOLINE:
9665 1.1 skrll if (fragP->tc_frag_data.relax_seen)
9666 1.1 skrll xg_relax_trampoline (fragP, stretch, &new_stretch);
9667 1.1 skrll break;
9668 1.1 skrll
9669 1.1 skrll default:
9670 1.1 skrll as_bad (_("bad relaxation state"));
9671 1.1 skrll }
9672 1.1 skrll
9673 1.1 skrll /* Tell gas we need another relaxation pass. */
9674 1.1 skrll if (! fragP->tc_frag_data.relax_seen)
9675 1.1 skrll {
9676 1.1 skrll fragP->tc_frag_data.relax_seen = TRUE;
9677 1.1 skrll *stretched_p = 1;
9678 1.1 skrll }
9679 1.1 skrll
9680 1.1 skrll new_logical_line (file_name, line);
9681 1.1 skrll return new_stretch;
9682 1.1 skrll }
9683 1.1 skrll
9684 1.1 skrll
9685 1.1 skrll static long
9686 1.1 skrll relax_frag_loop_align (fragS *fragP, long stretch)
9687 1.1 skrll {
9688 1.1 skrll addressT old_address, old_next_address, old_size;
9689 1.1 skrll addressT new_address, new_next_address, new_size;
9690 1.1 skrll addressT growth;
9691 1.1 skrll
9692 1.1 skrll /* All the frags with relax_frag_for_alignment prior to this one in the
9693 1.1 skrll section have been done, hopefully eliminating the need for a NOP here.
9694 1.1 skrll But, this will put it in if necessary. */
9695 1.1 skrll
9696 1.1 skrll /* Calculate the old address of this fragment and the next fragment. */
9697 1.1 skrll old_address = fragP->fr_address - stretch;
9698 1.1 skrll old_next_address = (fragP->fr_address - stretch + fragP->fr_fix +
9699 1.1 skrll fragP->tc_frag_data.text_expansion[0]);
9700 1.1 skrll old_size = old_next_address - old_address;
9701 1.1 skrll
9702 1.1 skrll /* Calculate the new address of this fragment and the next fragment. */
9703 1.1 skrll new_address = fragP->fr_address;
9704 1.1 skrll new_next_address =
9705 1.1 skrll get_noop_aligned_address (fragP, fragP->fr_address + fragP->fr_fix);
9706 1.1 skrll new_size = new_next_address - new_address;
9707 1.1 skrll
9708 1.1 skrll growth = new_size - old_size;
9709 1.1 skrll
9710 1.1 skrll /* Fix up the text_expansion field and return the new growth. */
9711 1.1 skrll fragP->tc_frag_data.text_expansion[0] += growth;
9712 1.1 skrll return growth;
9713 1.1 skrll }
9714 1.1 skrll
9715 1.1 skrll
9716 1.1 skrll /* Add a NOP instruction. */
9717 1.1 skrll
9718 1.1 skrll static long
9719 1.1 skrll relax_frag_add_nop (fragS *fragP)
9720 1.1 skrll {
9721 1.1 skrll char *nop_buf = fragP->fr_literal + fragP->fr_fix;
9722 1.1 skrll int length = fragP->tc_frag_data.is_no_density ? 3 : 2;
9723 1.1 skrll assemble_nop (length, nop_buf);
9724 1.1 skrll fragP->tc_frag_data.is_insn = TRUE;
9725 1.1 skrll
9726 1.1 skrll if (fragP->fr_var < length)
9727 1.1 skrll {
9728 1.1 skrll as_fatal (_("fr_var (%ld) < length (%d)"), (long) fragP->fr_var, length);
9729 1.1 skrll return 0;
9730 1.1 skrll }
9731 1.1 skrll
9732 1.1 skrll fragP->fr_fix += length;
9733 1.1 skrll fragP->fr_var -= length;
9734 1.1 skrll return length;
9735 1.1 skrll }
9736 1.1 skrll
9737 1.1.1.2 christos
9738 1.1 skrll static long future_alignment_required (fragS *, long);
9739 1.1 skrll
9740 1.1 skrll static long
9741 1.1 skrll relax_frag_for_align (fragS *fragP, long stretch)
9742 1.1 skrll {
9743 1.1 skrll /* Overview of the relaxation procedure for alignment:
9744 1.1 skrll We can widen with NOPs or by widening instructions or by filling
9745 1.1 skrll bytes after jump instructions. Find the opportune places and widen
9746 1.1 skrll them if necessary. */
9747 1.1 skrll
9748 1.1 skrll long stretch_me;
9749 1.1 skrll long diff;
9750 1.1 skrll
9751 1.1 skrll gas_assert (fragP->fr_subtype == RELAX_FILL_NOP
9752 1.1 skrll || fragP->fr_subtype == RELAX_UNREACHABLE
9753 1.1 skrll || (fragP->fr_subtype == RELAX_SLOTS
9754 1.1 skrll && fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW));
9755 1.1 skrll
9756 1.1 skrll stretch_me = future_alignment_required (fragP, stretch);
9757 1.1 skrll diff = stretch_me - fragP->tc_frag_data.text_expansion[0];
9758 1.1 skrll if (diff == 0)
9759 1.1 skrll return 0;
9760 1.1 skrll
9761 1.1 skrll if (diff < 0)
9762 1.1 skrll {
9763 1.1 skrll /* We expanded on a previous pass. Can we shrink now? */
9764 1.1 skrll long shrink = fragP->tc_frag_data.text_expansion[0] - stretch_me;
9765 1.1 skrll if (shrink <= stretch && stretch > 0)
9766 1.1 skrll {
9767 1.1 skrll fragP->tc_frag_data.text_expansion[0] = stretch_me;
9768 1.1 skrll return -shrink;
9769 1.1 skrll }
9770 1.1 skrll return 0;
9771 1.1 skrll }
9772 1.1 skrll
9773 1.1 skrll /* Below here, diff > 0. */
9774 1.1 skrll fragP->tc_frag_data.text_expansion[0] = stretch_me;
9775 1.1 skrll
9776 1.1 skrll return diff;
9777 1.1 skrll }
9778 1.1 skrll
9779 1.1 skrll
9780 1.1 skrll /* Return the address of the next frag that should be aligned.
9781 1.1 skrll
9782 1.1 skrll By "address" we mean the address it _would_ be at if there
9783 1.1 skrll is no action taken to align it between here and the target frag.
9784 1.1 skrll In other words, if no narrows and no fill nops are used between
9785 1.1 skrll here and the frag to align, _even_if_ some of the frags we use
9786 1.1 skrll to align targets have already expanded on a previous relaxation
9787 1.1 skrll pass.
9788 1.1 skrll
9789 1.1 skrll Also, count each frag that may be used to help align the target.
9790 1.1 skrll
9791 1.1 skrll Return 0 if there are no frags left in the chain that need to be
9792 1.1 skrll aligned. */
9793 1.1 skrll
9794 1.1 skrll static addressT
9795 1.1 skrll find_address_of_next_align_frag (fragS **fragPP,
9796 1.1 skrll int *wide_nops,
9797 1.1 skrll int *narrow_nops,
9798 1.1 skrll int *widens,
9799 1.1 skrll bfd_boolean *paddable)
9800 1.1 skrll {
9801 1.1 skrll fragS *fragP = *fragPP;
9802 1.1 skrll addressT address = fragP->fr_address;
9803 1.1 skrll
9804 1.1 skrll /* Do not reset the counts to 0. */
9805 1.1 skrll
9806 1.1 skrll while (fragP)
9807 1.1 skrll {
9808 1.1 skrll /* Limit this to a small search. */
9809 1.1 skrll if (*widens >= (int) xtensa_fetch_width)
9810 1.1 skrll {
9811 1.1 skrll *fragPP = fragP;
9812 1.1 skrll return 0;
9813 1.1 skrll }
9814 1.1 skrll address += fragP->fr_fix;
9815 1.1 skrll
9816 1.1 skrll if (fragP->fr_type == rs_fill)
9817 1.1 skrll address += fragP->fr_offset * fragP->fr_var;
9818 1.1 skrll else if (fragP->fr_type == rs_machine_dependent)
9819 1.1 skrll {
9820 1.1 skrll switch (fragP->fr_subtype)
9821 1.1 skrll {
9822 1.1 skrll case RELAX_UNREACHABLE:
9823 1.1 skrll *paddable = TRUE;
9824 1.1.1.4 christos break;
9825 1.1 skrll
9826 1.1 skrll case RELAX_FILL_NOP:
9827 1.1 skrll (*wide_nops)++;
9828 1.1 skrll if (!fragP->tc_frag_data.is_no_density)
9829 1.1 skrll (*narrow_nops)++;
9830 1.1 skrll break;
9831 1.1 skrll
9832 1.1 skrll case RELAX_SLOTS:
9833 1.1 skrll if (fragP->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
9834 1.1 skrll {
9835 1.1 skrll (*widens)++;
9836 1.1 skrll break;
9837 1.1 skrll }
9838 1.1 skrll address += total_frag_text_expansion (fragP);
9839 1.1 skrll break;
9840 1.1 skrll
9841 1.1 skrll case RELAX_IMMED:
9842 1.1 skrll address += fragP->tc_frag_data.text_expansion[0];
9843 1.1 skrll break;
9844 1.1 skrll
9845 1.1 skrll case RELAX_ALIGN_NEXT_OPCODE:
9846 1.1 skrll case RELAX_DESIRE_ALIGN:
9847 1.1 skrll *fragPP = fragP;
9848 1.1 skrll return address;
9849 1.1 skrll
9850 1.1 skrll case RELAX_MAYBE_UNREACHABLE:
9851 1.1 skrll case RELAX_MAYBE_DESIRE_ALIGN:
9852 1.1 skrll /* Do nothing. */
9853 1.1 skrll break;
9854 1.1 skrll
9855 1.1 skrll default:
9856 1.1 skrll /* Just punt if we don't know the type. */
9857 1.1 skrll *fragPP = fragP;
9858 1.1 skrll return 0;
9859 1.1 skrll }
9860 1.1 skrll }
9861 1.1 skrll else
9862 1.1 skrll {
9863 1.1 skrll /* Just punt if we don't know the type. */
9864 1.1 skrll *fragPP = fragP;
9865 1.1 skrll return 0;
9866 1.1 skrll }
9867 1.1 skrll fragP = fragP->fr_next;
9868 1.1 skrll }
9869 1.1 skrll
9870 1.1 skrll *fragPP = fragP;
9871 1.1 skrll return 0;
9872 1.1 skrll }
9873 1.1 skrll
9874 1.1 skrll
9875 1.1 skrll static long bytes_to_stretch (fragS *, int, int, int, int);
9876 1.1 skrll
9877 1.1 skrll static long
9878 1.1 skrll future_alignment_required (fragS *fragP, long stretch ATTRIBUTE_UNUSED)
9879 1.1 skrll {
9880 1.1 skrll fragS *this_frag = fragP;
9881 1.1 skrll long address;
9882 1.1 skrll int num_widens = 0;
9883 1.1 skrll int wide_nops = 0;
9884 1.1 skrll int narrow_nops = 0;
9885 1.1 skrll bfd_boolean paddable = FALSE;
9886 1.1 skrll offsetT local_opt_diff;
9887 1.1 skrll offsetT opt_diff;
9888 1.1 skrll offsetT max_diff;
9889 1.1 skrll int stretch_amount = 0;
9890 1.1 skrll int local_stretch_amount;
9891 1.1 skrll int global_stretch_amount;
9892 1.1 skrll
9893 1.1.1.2 christos address = find_address_of_next_align_frag
9894 1.1.1.2 christos (&fragP, &wide_nops, &narrow_nops, &num_widens, &paddable);
9895 1.1 skrll
9896 1.1 skrll if (!address)
9897 1.1 skrll {
9898 1.1 skrll if (this_frag->tc_frag_data.is_aligning_branch)
9899 1.1 skrll this_frag->tc_frag_data.slot_subtypes[0] = RELAX_IMMED;
9900 1.1 skrll else
9901 1.1 skrll frag_wane (this_frag);
9902 1.1 skrll }
9903 1.1 skrll else
9904 1.1 skrll {
9905 1.1 skrll local_opt_diff = get_aligned_diff (fragP, address, &max_diff);
9906 1.1 skrll opt_diff = local_opt_diff;
9907 1.1 skrll gas_assert (opt_diff >= 0);
9908 1.1 skrll gas_assert (max_diff >= opt_diff);
9909 1.1 skrll if (max_diff == 0)
9910 1.1 skrll return 0;
9911 1.1 skrll
9912 1.1 skrll if (fragP)
9913 1.1 skrll fragP = fragP->fr_next;
9914 1.1 skrll
9915 1.1 skrll while (fragP && opt_diff < max_diff && address)
9916 1.1 skrll {
9917 1.1 skrll /* We only use these to determine if we can exit early
9918 1.1 skrll because there will be plenty of ways to align future
9919 1.1 skrll align frags. */
9920 1.1 skrll int glob_widens = 0;
9921 1.1 skrll int dnn = 0;
9922 1.1 skrll int dw = 0;
9923 1.1 skrll bfd_boolean glob_pad = 0;
9924 1.1 skrll address = find_address_of_next_align_frag
9925 1.1 skrll (&fragP, &glob_widens, &dnn, &dw, &glob_pad);
9926 1.1 skrll /* If there is a padable portion, then skip. */
9927 1.1 skrll if (glob_pad || glob_widens >= (1 << branch_align_power (now_seg)))
9928 1.1 skrll address = 0;
9929 1.1 skrll
9930 1.1 skrll if (address)
9931 1.1 skrll {
9932 1.1 skrll offsetT next_m_diff;
9933 1.1 skrll offsetT next_o_diff;
9934 1.1 skrll
9935 1.1 skrll /* Downrange frags haven't had stretch added to them yet. */
9936 1.1 skrll address += stretch;
9937 1.1 skrll
9938 1.1 skrll /* The address also includes any text expansion from this
9939 1.1 skrll frag in a previous pass, but we don't want that. */
9940 1.1 skrll address -= this_frag->tc_frag_data.text_expansion[0];
9941 1.1 skrll
9942 1.1 skrll /* Assume we are going to move at least opt_diff. In
9943 1.1 skrll reality, we might not be able to, but assuming that
9944 1.1 skrll we will helps catch cases where moving opt_diff pushes
9945 1.1 skrll the next target from aligned to unaligned. */
9946 1.1 skrll address += opt_diff;
9947 1.1 skrll
9948 1.1 skrll next_o_diff = get_aligned_diff (fragP, address, &next_m_diff);
9949 1.1 skrll
9950 1.1 skrll /* Now cleanup for the adjustments to address. */
9951 1.1 skrll next_o_diff += opt_diff;
9952 1.1.1.2 christos next_m_diff += opt_diff;
9953 1.1 skrll if (next_o_diff <= max_diff && next_o_diff > opt_diff)
9954 1.1 skrll opt_diff = next_o_diff;
9955 1.1 skrll if (next_m_diff < max_diff)
9956 1.1 skrll max_diff = next_m_diff;
9957 1.1 skrll fragP = fragP->fr_next;
9958 1.1 skrll }
9959 1.1 skrll }
9960 1.1 skrll
9961 1.1 skrll /* If there are enough wideners in between, do it. */
9962 1.1 skrll if (paddable)
9963 1.1 skrll {
9964 1.1 skrll if (this_frag->fr_subtype == RELAX_UNREACHABLE)
9965 1.1 skrll {
9966 1.1 skrll gas_assert (opt_diff <= (signed) xtensa_fetch_width);
9967 1.1 skrll return opt_diff;
9968 1.1 skrll }
9969 1.1 skrll return 0;
9970 1.1 skrll }
9971 1.1 skrll local_stretch_amount
9972 1.1 skrll = bytes_to_stretch (this_frag, wide_nops, narrow_nops,
9973 1.1 skrll num_widens, local_opt_diff);
9974 1.1.1.2 christos global_stretch_amount
9975 1.1 skrll = bytes_to_stretch (this_frag, wide_nops, narrow_nops,
9976 1.1 skrll num_widens, opt_diff);
9977 1.1 skrll /* If the condition below is true, then the frag couldn't
9978 1.1.1.2 christos stretch the correct amount for the global case, so we just
9979 1.1 skrll optimize locally. We'll rely on the subsequent frags to get
9980 1.1.1.2 christos the correct alignment in the global case. */
9981 1.1 skrll if (global_stretch_amount < local_stretch_amount)
9982 1.1 skrll stretch_amount = local_stretch_amount;
9983 1.1 skrll else
9984 1.1 skrll stretch_amount = global_stretch_amount;
9985 1.1 skrll
9986 1.1 skrll if (this_frag->fr_subtype == RELAX_SLOTS
9987 1.1 skrll && this_frag->tc_frag_data.slot_subtypes[0] == RELAX_NARROW)
9988 1.1 skrll gas_assert (stretch_amount <= 1);
9989 1.1 skrll else if (this_frag->fr_subtype == RELAX_FILL_NOP)
9990 1.1 skrll {
9991 1.1 skrll if (this_frag->tc_frag_data.is_no_density)
9992 1.1 skrll gas_assert (stretch_amount == 3 || stretch_amount == 0);
9993 1.1 skrll else
9994 1.1 skrll gas_assert (stretch_amount <= 3);
9995 1.1 skrll }
9996 1.1 skrll }
9997 1.1 skrll return stretch_amount;
9998 1.1 skrll }
9999 1.1 skrll
10000 1.1 skrll
10001 1.1 skrll /* The idea: widen everything you can to get a target or loop aligned,
10002 1.1 skrll then start using NOPs.
10003 1.1 skrll
10004 1.1.1.2 christos wide_nops = the number of wide NOPs available for aligning
10005 1.1.1.2 christos narrow_nops = the number of narrow NOPs available for aligning
10006 1.1.1.2 christos (a subset of wide_nops)
10007 1.1 skrll widens = the number of narrow instructions that should be widened
10008 1.1 skrll
10009 1.1.1.4 christos */
10010 1.1.1.2 christos
10011 1.1 skrll static long
10012 1.1 skrll bytes_to_stretch (fragS *this_frag,
10013 1.1 skrll int wide_nops,
10014 1.1.1.2 christos int narrow_nops,
10015 1.1 skrll int num_widens,
10016 1.1 skrll int desired_diff)
10017 1.1 skrll {
10018 1.1 skrll int nops_needed;
10019 1.1 skrll int nop_bytes;
10020 1.1 skrll int extra_bytes;
10021 1.1 skrll int bytes_short = desired_diff - num_widens;
10022 1.1 skrll
10023 1.1 skrll gas_assert (desired_diff >= 0
10024 1.1 skrll && desired_diff < (signed) xtensa_fetch_width);
10025 1.1 skrll if (desired_diff == 0)
10026 1.1 skrll return 0;
10027 1.1 skrll
10028 1.1 skrll gas_assert (wide_nops > 0 || num_widens > 0);
10029 1.1 skrll
10030 1.1 skrll /* Always prefer widening to NOP-filling. */
10031 1.1 skrll if (bytes_short < 0)
10032 1.1 skrll {
10033 1.1 skrll /* There are enough RELAX_NARROW frags after this one
10034 1.1 skrll to align the target without widening this frag in any way. */
10035 1.1 skrll return 0;
10036 1.1 skrll }
10037 1.1.1.2 christos
10038 1.1.1.2 christos if (bytes_short == 0)
10039 1.1.1.2 christos {
10040 1.1.1.2 christos /* Widen every narrow between here and the align target
10041 1.1.1.2 christos and the align target will be properly aligned. */
10042 1.1.1.2 christos if (this_frag->fr_subtype == RELAX_FILL_NOP)
10043 1.1.1.2 christos return 0;
10044 1.1.1.2 christos else
10045 1.1.1.2 christos return 1;
10046 1.1.1.2 christos }
10047 1.1.1.2 christos
10048 1.1 skrll /* From here we will need at least one NOP to get an alignment.
10049 1.1.1.2 christos However, we may not be able to align at all, in which case,
10050 1.1.1.2 christos don't widen. */
10051 1.1.1.2 christos nops_needed = desired_diff / 3;
10052 1.1.1.2 christos
10053 1.1.1.2 christos /* If there aren't enough nops, don't widen. */
10054 1.1 skrll if (nops_needed > wide_nops)
10055 1.1.1.2 christos return 0;
10056 1.1.1.2 christos
10057 1.1.1.2 christos /* First try it with all wide nops. */
10058 1.1.1.2 christos nop_bytes = nops_needed * 3;
10059 1.1.1.2 christos extra_bytes = desired_diff - nop_bytes;
10060 1.1.1.2 christos
10061 1.1.1.2 christos if (nop_bytes + num_widens >= desired_diff)
10062 1.1.1.2 christos {
10063 1.1.1.2 christos if (this_frag->fr_subtype == RELAX_FILL_NOP)
10064 1.1 skrll return 3;
10065 1.1.1.2 christos else if (num_widens == extra_bytes)
10066 1.1.1.2 christos return 1;
10067 1.1.1.2 christos return 0;
10068 1.1.1.2 christos }
10069 1.1.1.2 christos
10070 1.1.1.2 christos /* Add a narrow nop. */
10071 1.1 skrll nops_needed++;
10072 1.1.1.2 christos nop_bytes += 2;
10073 1.1.1.2 christos extra_bytes -= 2;
10074 1.1.1.2 christos if (narrow_nops == 0 || nops_needed > wide_nops)
10075 1.1.1.2 christos return 0;
10076 1.1.1.2 christos
10077 1.1.1.2 christos if (nop_bytes + num_widens >= desired_diff && extra_bytes >= 0)
10078 1.1.1.2 christos {
10079 1.1.1.2 christos if (this_frag->fr_subtype == RELAX_FILL_NOP)
10080 1.1.1.2 christos return !this_frag->tc_frag_data.is_no_density ? 2 : 3;
10081 1.1.1.2 christos else if (num_widens == extra_bytes)
10082 1.1.1.2 christos return 1;
10083 1.1.1.2 christos return 0;
10084 1.1.1.2 christos }
10085 1.1 skrll
10086 1.1.1.2 christos /* Replace a wide nop with a narrow nop--we can get here if
10087 1.1.1.2 christos extra_bytes was negative in the previous conditional. */
10088 1.1.1.2 christos if (narrow_nops == 1)
10089 1.1 skrll return 0;
10090 1.1 skrll nop_bytes--;
10091 1.1 skrll extra_bytes++;
10092 1.1 skrll if (nop_bytes + num_widens >= desired_diff)
10093 1.1.1.6 christos {
10094 1.1.1.6 christos if (this_frag->fr_subtype == RELAX_FILL_NOP)
10095 1.1.1.4 christos return !this_frag->tc_frag_data.is_no_density ? 2 : 3;
10096 1.1.1.4 christos else if (num_widens == extra_bytes)
10097 1.1.1.6 christos return 1;
10098 1.1.1.6 christos return 0;
10099 1.1.1.6 christos }
10100 1.1.1.6 christos
10101 1.1.1.4 christos /* If we can't satisfy any of the above cases, then we can't align
10102 1.1.1.6 christos using padding or fill nops. */
10103 1.1.1.6 christos return 0;
10104 1.1.1.4 christos }
10105 1.1.1.6 christos
10106 1.1.1.4 christos
10107 1.1.1.6 christos static fragS *
10108 1.1.1.4 christos xg_find_best_trampoline_for_tinsn (TInsn *tinsn, fragS *fragP)
10109 1.1.1.4 christos {
10110 1.1.1.4 christos symbolS *sym = tinsn->tok[0].X_add_symbol;
10111 1.1.1.6 christos addressT source = fragP->fr_address;
10112 1.1.1.6 christos addressT target = S_GET_VALUE (sym) + tinsn->tok[0].X_add_number;
10113 1.1.1.6 christos struct trampoline_seg *ts = find_trampoline_seg (now_seg);
10114 1.1.1.6 christos size_t i;
10115 1.1.1.6 christos
10116 1.1.1.4 christos if (!ts || !ts->index.n_entries)
10117 1.1.1.6 christos return NULL;
10118 1.1.1.6 christos
10119 1.1.1.6 christos i = xg_find_best_trampoline (&ts->index, source, target);
10120 1.1.1.6 christos
10121 1.1.1.4 christos return ts->index.entry[i];
10122 1.1.1.6 christos }
10123 1.1.1.6 christos
10124 1.1.1.6 christos
10125 1.1.1.6 christos /* Append jump to sym + offset to the end of the trampoline frag fragP.
10126 1.1.1.6 christos Adjust fragP's jump around if it's present. Adjust fragP's fr_fix/fr_var
10127 1.1.1.6 christos and finish the frag if it's full (but don't remove it from the trampoline
10128 1.1.1.6 christos frag index). Return fixup for the newly created jump. */
10129 1.1.1.6 christos static fixS *xg_append_jump (fragS *fragP, symbolS *sym, offsetT offset)
10130 1.1.1.6 christos {
10131 1.1.1.6 christos fixS *fixP;
10132 1.1.1.6 christos TInsn insn;
10133 1.1.1.6 christos xtensa_format fmt;
10134 1.1.1.6 christos xtensa_isa isa = xtensa_default_isa;
10135 1.1.1.6 christos
10136 1.1.1.6 christos gas_assert (fragP->fr_var >= 3);
10137 1.1.1.6 christos tinsn_init (&insn);
10138 1.1.1.6 christos insn.insn_type = ITYPE_INSN;
10139 1.1.1.6 christos insn.opcode = xtensa_j_opcode;
10140 1.1.1.6 christos insn.ntok = 1;
10141 1.1.1.6 christos set_expr_symbol_offset (&insn.tok[0], sym, offset);
10142 1.1.1.6 christos fmt = xg_get_single_format (xtensa_j_opcode);
10143 1.1.1.4 christos tinsn_to_slotbuf (fmt, 0, &insn, trampoline_slotbuf);
10144 1.1.1.6 christos xtensa_format_set_slot (isa, fmt, 0, trampoline_buf, trampoline_slotbuf);
10145 1.1.1.6 christos xtensa_insnbuf_to_chars (isa, trampoline_buf,
10146 1.1.1.4 christos (unsigned char *)fragP->fr_literal + fragP->fr_fix, 3);
10147 1.1.1.6 christos fixP = fix_new (fragP, fragP->fr_fix, 3, sym, offset, TRUE,
10148 1.1.1.6 christos BFD_RELOC_XTENSA_SLOT0_OP);
10149 1.1.1.4 christos fixP->tc_fix_data.slot = 0;
10150 1.1.1.6 christos
10151 1.1.1.6 christos fragP->fr_fix += 3;
10152 1.1.1.4 christos fragP->fr_var -= 3;
10153 1.1.1.4 christos
10154 1.1.1.4 christos /* Adjust the jump around this trampoline (if present). */
10155 1.1.1.4 christos if (fragP->tc_frag_data.jump_around_fix)
10156 1.1.1.6 christos fragP->tc_frag_data.jump_around_fix->fx_offset += 3;
10157 1.1.1.4 christos
10158 1.1.1.4 christos /* Do we have room for more? */
10159 1.1.1.4 christos if (xg_is_trampoline_frag_full (fragP))
10160 1.1.1.4 christos {
10161 1.1.1.4 christos frag_wane (fragP);
10162 1.1.1.4 christos fragP->fr_subtype = 0;
10163 1.1.1.4 christos }
10164 1.1.1.4 christos
10165 1.1.1.6 christos return fixP;
10166 1.1.1.4 christos }
10167 1.1.1.4 christos
10168 1.1.1.6 christos
10169 1.1.1.4 christos static int
10170 1.1.1.6 christos init_trampoline_frag (fragS *fp)
10171 1.1.1.4 christos {
10172 1.1.1.4 christos int growth = 0;
10173 1.1.1.4 christos
10174 1.1.1.4 christos if (fp->fr_fix == 0)
10175 1.1.1.4 christos {
10176 1.1.1.4 christos symbolS *lsym;
10177 1.1.1.4 christos char label[10 + 2 * sizeof(fp)];
10178 1.1.1.6 christos
10179 1.1.1.6 christos sprintf (label, ".L0_TR_%p", fp);
10180 1.1.1.6 christos lsym = (symbolS *)local_symbol_make (label, now_seg, 0, fp);
10181 1.1.1.6 christos fp->fr_symbol = lsym;
10182 1.1.1.6 christos if (fp->tc_frag_data.needs_jump_around)
10183 1.1.1.6 christos {
10184 1.1.1.6 christos fp->tc_frag_data.jump_around_fix = xg_append_jump (fp, lsym, 3);
10185 1.1.1.6 christos growth = 3;
10186 1.1.1.6 christos }
10187 1.1.1.6 christos }
10188 1.1.1.6 christos return growth;
10189 1.1.1.6 christos }
10190 1.1.1.6 christos
10191 1.1.1.6 christos static int
10192 1.1.1.6 christos xg_get_single_symbol_slot (fragS *fragP)
10193 1.1.1.6 christos {
10194 1.1.1.6 christos int i;
10195 1.1.1.6 christos int slot = -1;
10196 1.1.1.6 christos
10197 1.1.1.4 christos for (i = 0; i < MAX_SLOTS; ++i)
10198 1.1.1.6 christos if (fragP->tc_frag_data.slot_symbols[i])
10199 1.1.1.4 christos {
10200 1.1.1.4 christos gas_assert (slot == -1);
10201 1.1.1.4 christos slot = i;
10202 1.1.1.6 christos }
10203 1.1.1.6 christos
10204 1.1.1.6 christos gas_assert (slot >= 0 && slot < MAX_SLOTS);
10205 1.1.1.6 christos
10206 1.1.1.4 christos return slot;
10207 1.1.1.6 christos }
10208 1.1.1.6 christos
10209 1.1.1.6 christos static fixS *
10210 1.1.1.4 christos add_jump_to_trampoline (fragS *tramp, fragS *origfrag)
10211 1.1.1.6 christos {
10212 1.1.1.6 christos int slot = xg_get_single_symbol_slot (origfrag);
10213 1.1.1.6 christos fixS *fixP;
10214 1.1.1.6 christos
10215 1.1.1.4 christos /* Assemble a jump to the target label in the trampoline frag. */
10216 1.1.1.6 christos fixP = xg_append_jump (tramp,
10217 1.1.1.6 christos origfrag->tc_frag_data.slot_symbols[slot],
10218 1.1.1.6 christos origfrag->tc_frag_data.slot_offsets[slot]);
10219 1.1.1.6 christos
10220 1.1.1.6 christos /* Modify the original j to point here. */
10221 1.1.1.4 christos origfrag->tc_frag_data.slot_symbols[slot] = tramp->fr_symbol;
10222 1.1.1.4 christos origfrag->tc_frag_data.slot_offsets[slot] = tramp->fr_fix - 3;
10223 1.1.1.4 christos
10224 1.1 skrll /* If trampoline is full, remove it from the list. */
10225 1.1 skrll if (xg_is_trampoline_frag_full (tramp))
10226 1.1 skrll {
10227 1.1 skrll struct trampoline_seg *ts = find_trampoline_seg (now_seg);
10228 1.1 skrll size_t tr = xg_find_trampoline (&ts->index, tramp->fr_address);
10229 1.1 skrll
10230 1.1 skrll gas_assert (ts->index.entry[tr] == tramp);
10231 1.1 skrll xg_remove_trampoline_from_index (&ts->index, tr);
10232 1.1 skrll }
10233 1.1 skrll
10234 1.1 skrll return fixP;
10235 1.1 skrll }
10236 1.1 skrll
10237 1.1 skrll
10238 1.1 skrll static long
10239 1.1 skrll relax_frag_immed (segT segP,
10240 1.1 skrll fragS *fragP,
10241 1.1 skrll long stretch,
10242 1.1 skrll int min_steps,
10243 1.1 skrll xtensa_format fmt,
10244 1.1 skrll int slot,
10245 1.1 skrll int *stretched_p,
10246 1.1.1.2 christos bfd_boolean estimate_only)
10247 1.1 skrll {
10248 1.1 skrll TInsn tinsn;
10249 1.1 skrll int old_size;
10250 1.1 skrll bfd_boolean negatable_branch = FALSE;
10251 1.1 skrll bfd_boolean branch_jmp_to_next = FALSE;
10252 1.1 skrll bfd_boolean from_wide_insn = FALSE;
10253 1.1 skrll xtensa_isa isa = xtensa_default_isa;
10254 1.1 skrll IStack istack;
10255 1.1 skrll offsetT frag_offset;
10256 1.1 skrll int num_steps;
10257 1.1 skrll int num_text_bytes, num_literal_bytes;
10258 1.1 skrll int literal_diff, total_text_diff, this_text_diff;
10259 1.1 skrll
10260 1.1 skrll gas_assert (fragP->fr_opcode != NULL);
10261 1.1 skrll
10262 1.1 skrll xg_clear_vinsn (&cur_vinsn);
10263 1.1 skrll vinsn_from_chars (&cur_vinsn, fragP->fr_opcode);
10264 1.1 skrll if (cur_vinsn.num_slots > 1)
10265 1.1 skrll from_wide_insn = TRUE;
10266 1.1 skrll
10267 1.1 skrll tinsn = cur_vinsn.slots[slot];
10268 1.1 skrll tinsn_immed_from_frag (&tinsn, fragP, slot);
10269 1.1 skrll
10270 1.1 skrll if (estimate_only && xtensa_opcode_is_loop (isa, tinsn.opcode) == 1)
10271 1.1 skrll return 0;
10272 1.1 skrll
10273 1.1 skrll if (workaround_b_j_loop_end && ! fragP->tc_frag_data.is_no_transform)
10274 1.1 skrll branch_jmp_to_next = is_branch_jmp_to_next (&tinsn, fragP);
10275 1.1 skrll
10276 1.1 skrll negatable_branch = (xtensa_opcode_is_branch (isa, tinsn.opcode) == 1);
10277 1.1 skrll
10278 1.1 skrll old_size = xtensa_format_length (isa, fmt);
10279 1.1 skrll
10280 1.1 skrll /* Special case: replace a branch to the next instruction with a NOP.
10281 1.1 skrll This is required to work around a hardware bug in T1040.0 and also
10282 1.1 skrll serves as an optimization. */
10283 1.1.1.2 christos
10284 1.1 skrll if (branch_jmp_to_next
10285 1.1 skrll && ((old_size == 2) || (old_size == 3))
10286 1.1 skrll && !next_frag_is_loop_target (fragP))
10287 1.1 skrll return 0;
10288 1.1 skrll
10289 1.1 skrll /* Here is the fun stuff: Get the immediate field from this
10290 1.1 skrll instruction. If it fits, we are done. If not, find the next
10291 1.1 skrll instruction sequence that fits. */
10292 1.1 skrll
10293 1.1 skrll frag_offset = fragP->fr_opcode - fragP->fr_literal;
10294 1.1 skrll istack_init (&istack);
10295 1.1 skrll num_steps = xg_assembly_relax (&istack, &tinsn, segP, fragP, frag_offset,
10296 1.1 skrll min_steps, stretch);
10297 1.1 skrll gas_assert (num_steps >= min_steps && num_steps <= RELAX_IMMED_MAXSTEPS);
10298 1.1 skrll
10299 1.1 skrll fragP->tc_frag_data.slot_subtypes[slot] = (int) RELAX_IMMED + num_steps;
10300 1.1 skrll
10301 1.1 skrll /* Figure out the number of bytes needed. */
10302 1.1 skrll num_literal_bytes = get_num_stack_literal_bytes (&istack);
10303 1.1 skrll literal_diff
10304 1.1 skrll = num_literal_bytes - fragP->tc_frag_data.literal_expansion[slot];
10305 1.1 skrll num_text_bytes = get_num_stack_text_bytes (&istack);
10306 1.1 skrll
10307 1.1.1.4 christos if (from_wide_insn)
10308 1.1 skrll {
10309 1.1.1.4 christos int first = 0;
10310 1.1 skrll while (istack.insn[first].opcode == XTENSA_UNDEFINED)
10311 1.1 skrll first++;
10312 1.1.1.2 christos
10313 1.1 skrll num_text_bytes += old_size;
10314 1.1.1.4 christos if (opcode_fits_format_slot (istack.insn[first].opcode, fmt, slot))
10315 1.1 skrll num_text_bytes -= xg_get_single_size (istack.insn[first].opcode);
10316 1.1 skrll else
10317 1.1 skrll {
10318 1.1.1.4 christos /* The first instruction in the relaxed sequence will go after
10319 1.1 skrll the current wide instruction, and thus its symbolic immediates
10320 1.1.1.4 christos might not fit. */
10321 1.1 skrll
10322 1.1 skrll istack_init (&istack);
10323 1.1 skrll num_steps = xg_assembly_relax (&istack, &tinsn, segP, fragP,
10324 1.1 skrll frag_offset + old_size,
10325 1.1 skrll min_steps, stretch + old_size);
10326 1.1 skrll gas_assert (num_steps >= min_steps && num_steps <= RELAX_IMMED_MAXSTEPS);
10327 1.1 skrll
10328 1.1 skrll fragP->tc_frag_data.slot_subtypes[slot]
10329 1.1.1.2 christos = (int) RELAX_IMMED + num_steps;
10330 1.1.1.2 christos
10331 1.1.1.2 christos num_literal_bytes = get_num_stack_literal_bytes (&istack);
10332 1.1 skrll literal_diff
10333 1.1 skrll = num_literal_bytes - fragP->tc_frag_data.literal_expansion[slot];
10334 1.1 skrll
10335 1.1.1.2 christos num_text_bytes = get_num_stack_text_bytes (&istack) + old_size;
10336 1.1.1.2 christos }
10337 1.1 skrll }
10338 1.1 skrll
10339 1.1 skrll total_text_diff = num_text_bytes - old_size;
10340 1.1 skrll this_text_diff = total_text_diff - fragP->tc_frag_data.text_expansion[slot];
10341 1.1 skrll
10342 1.1 skrll /* It MUST get larger. If not, we could get an infinite loop. */
10343 1.1 skrll gas_assert (num_text_bytes >= 0);
10344 1.1.1.2 christos gas_assert (literal_diff >= 0);
10345 1.1 skrll gas_assert (total_text_diff >= 0);
10346 1.1 skrll
10347 1.1 skrll fragP->tc_frag_data.text_expansion[slot] = total_text_diff;
10348 1.1 skrll fragP->tc_frag_data.literal_expansion[slot] = num_literal_bytes;
10349 1.1.1.2 christos gas_assert (fragP->tc_frag_data.text_expansion[slot] >= 0);
10350 1.1 skrll gas_assert (fragP->tc_frag_data.literal_expansion[slot] >= 0);
10351 1.1 skrll
10352 1.1 skrll /* Find the associated expandable literal for this. */
10353 1.1 skrll if (literal_diff != 0)
10354 1.1 skrll {
10355 1.1 skrll fragS *lit_fragP = fragP->tc_frag_data.literal_frags[slot];
10356 1.1 skrll if (lit_fragP)
10357 1.1 skrll {
10358 1.1 skrll gas_assert (literal_diff == 4);
10359 1.1 skrll lit_fragP->tc_frag_data.unreported_expansion += literal_diff;
10360 1.1 skrll
10361 1.1 skrll /* We expect that the literal section state has NOT been
10362 1.1.1.4 christos modified yet. */
10363 1.1.1.4 christos gas_assert (lit_fragP->fr_type == rs_machine_dependent
10364 1.1.1.4 christos && lit_fragP->fr_subtype == RELAX_LITERAL);
10365 1.1.1.4 christos lit_fragP->fr_subtype = RELAX_LITERAL_NR;
10366 1.1.1.4 christos
10367 1.1.1.4 christos /* We need to mark this section for another iteration
10368 1.1.1.4 christos of relaxation. */
10369 1.1.1.6 christos (*stretched_p)++;
10370 1.1.1.6 christos }
10371 1.1.1.4 christos }
10372 1.1.1.6 christos
10373 1.1.1.6 christos if (negatable_branch && istack.ninsn > 1)
10374 1.1.1.6 christos update_next_frag_state (fragP);
10375 1.1.1.4 christos
10376 1.1.1.6 christos /* If last insn is a jump, and it cannot reach its target, try to find a trampoline. */
10377 1.1.1.6 christos if (istack.ninsn > 2 &&
10378 1.1.1.6 christos istack.insn[istack.ninsn - 1].insn_type == ITYPE_LABEL &&
10379 1.1.1.6 christos istack.insn[istack.ninsn - 2].insn_type == ITYPE_INSN &&
10380 1.1.1.6 christos istack.insn[istack.ninsn - 2].opcode == xtensa_j_opcode)
10381 1.1.1.6 christos {
10382 1.1.1.6 christos TInsn *jinsn = &istack.insn[istack.ninsn - 2];
10383 1.1.1.6 christos struct trampoline_seg *ts = find_trampoline_seg (segP);
10384 1.1.1.6 christos struct trampoline_chain *tc = NULL;
10385 1.1.1.6 christos
10386 1.1.1.6 christos if (ts &&
10387 1.1.1.6 christos !xg_symbolic_immeds_fit (jinsn, segP, fragP, fragP->fr_offset,
10388 1.1.1.6 christos total_text_diff))
10389 1.1.1.6 christos {
10390 1.1.1.6 christos int s = xg_get_single_symbol_slot (fragP);
10391 1.1.1.6 christos addressT offset = fragP->tc_frag_data.slot_offsets[s];
10392 1.1.1.6 christos
10393 1.1.1.6 christos tc = xg_find_best_eq_target (ts, fragP->fr_address,
10394 1.1.1.6 christos &fragP->tc_frag_data.slot_symbols[s],
10395 1.1.1.4 christos &offset);
10396 1.1.1.4 christos
10397 1.1.1.4 christos if (!tc)
10398 1.1.1.6 christos tc = xg_create_trampoline_chain (ts,
10399 1.1.1.6 christos fragP->tc_frag_data.slot_symbols[s],
10400 1.1.1.6 christos offset);
10401 1.1.1.6 christos fragP->tc_frag_data.slot_offsets[s] = offset;
10402 1.1.1.6 christos tinsn_immed_from_frag (jinsn, fragP, s);
10403 1.1.1.6 christos }
10404 1.1.1.6 christos
10405 1.1.1.4 christos if (!xg_symbolic_immeds_fit (jinsn, segP, fragP, fragP->fr_offset,
10406 1.1.1.4 christos total_text_diff))
10407 1.1.1.4 christos {
10408 1.1.1.4 christos fragS *tf = xg_find_best_trampoline_for_tinsn (jinsn, fragP);
10409 1.1.1.4 christos
10410 1.1.1.4 christos if (tf)
10411 1.1.1.4 christos {
10412 1.1.1.4 christos fixS *fixP;
10413 1.1.1.4 christos
10414 1.1.1.4 christos this_text_diff += init_trampoline_frag (tf) + 3;
10415 1.1.1.4 christos fixP = add_jump_to_trampoline (tf, fragP);
10416 1.1.1.4 christos xg_add_location_to_chain (tc, fixP->fx_frag->fr_symbol,
10417 1.1.1.4 christos fixP->fx_where);
10418 1.1.1.4 christos fragP->tc_frag_data.relax_seen = FALSE;
10419 1.1.1.4 christos }
10420 1.1 skrll else
10421 1.1 skrll {
10422 1.1 skrll /* If target symbol is undefined, assume it will reach once linked. */
10423 1.1 skrll expressionS *exp = &istack.insn[istack.ninsn - 2].tok[0];
10424 1.1 skrll
10425 1.1 skrll if (exp->X_op == O_symbol && S_IS_DEFINED (exp->X_add_symbol))
10426 1.1 skrll {
10427 1.1 skrll as_bad_where (fragP->fr_file, fragP->fr_line,
10428 1.1 skrll _("jump target out of range; no usable trampoline found"));
10429 1.1 skrll }
10430 1.1 skrll }
10431 1.1 skrll }
10432 1.1 skrll }
10433 1.1 skrll
10434 1.1 skrll return this_text_diff;
10435 1.1 skrll }
10436 1.1 skrll
10437 1.1 skrll
10438 1.1 skrll /* md_convert_frag Hook and Helper Functions. */
10440 1.1 skrll
10441 1.1 skrll static void convert_frag_align_next_opcode (fragS *);
10442 1.1.1.5 christos static void convert_frag_narrow (segT, fragS *, xtensa_format, int);
10443 1.1 skrll static void convert_frag_fill_nop (fragS *);
10444 1.1 skrll static void convert_frag_immed (segT, fragS *, int, xtensa_format, int);
10445 1.1 skrll
10446 1.1 skrll void
10447 1.1 skrll md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT sec, fragS *fragp)
10448 1.1 skrll {
10449 1.1 skrll static xtensa_insnbuf vbuf = NULL;
10450 1.1 skrll xtensa_isa isa = xtensa_default_isa;
10451 1.1 skrll int slot;
10452 1.1 skrll int num_slots;
10453 1.1 skrll xtensa_format fmt;
10454 1.1 skrll const char *file_name;
10455 1.1 skrll unsigned line;
10456 1.1 skrll
10457 1.1 skrll file_name = as_where (&line);
10458 1.1 skrll new_logical_line (fragp->fr_file, fragp->fr_line);
10459 1.1 skrll
10460 1.1 skrll switch (fragp->fr_subtype)
10461 1.1 skrll {
10462 1.1 skrll case RELAX_ALIGN_NEXT_OPCODE:
10463 1.1 skrll /* Always convert. */
10464 1.1 skrll convert_frag_align_next_opcode (fragp);
10465 1.1 skrll break;
10466 1.1 skrll
10467 1.1 skrll case RELAX_DESIRE_ALIGN:
10468 1.1 skrll /* Do nothing. If not aligned already, too bad. */
10469 1.1 skrll break;
10470 1.1 skrll
10471 1.1 skrll case RELAX_LITERAL:
10472 1.1 skrll case RELAX_LITERAL_FINAL:
10473 1.1 skrll break;
10474 1.1 skrll
10475 1.1 skrll case RELAX_SLOTS:
10476 1.1 skrll if (vbuf == NULL)
10477 1.1 skrll vbuf = xtensa_insnbuf_alloc (isa);
10478 1.1 skrll
10479 1.1 skrll xtensa_insnbuf_from_chars
10480 1.1 skrll (isa, vbuf, (unsigned char *) fragp->fr_opcode, 0);
10481 1.1 skrll fmt = xtensa_format_decode (isa, vbuf);
10482 1.1 skrll num_slots = xtensa_format_num_slots (isa, fmt);
10483 1.1 skrll
10484 1.1 skrll for (slot = 0; slot < num_slots; slot++)
10485 1.1 skrll {
10486 1.1 skrll switch (fragp->tc_frag_data.slot_subtypes[slot])
10487 1.1 skrll {
10488 1.1 skrll case RELAX_NARROW:
10489 1.1 skrll convert_frag_narrow (sec, fragp, fmt, slot);
10490 1.1 skrll break;
10491 1.1 skrll
10492 1.1 skrll case RELAX_IMMED:
10493 1.1 skrll case RELAX_IMMED_STEP1:
10494 1.1 skrll case RELAX_IMMED_STEP2:
10495 1.1 skrll case RELAX_IMMED_STEP3:
10496 1.1 skrll /* Place the immediate. */
10497 1.1 skrll convert_frag_immed
10498 1.1 skrll (sec, fragp,
10499 1.1 skrll fragp->tc_frag_data.slot_subtypes[slot] - RELAX_IMMED,
10500 1.1 skrll fmt, slot);
10501 1.1 skrll break;
10502 1.1 skrll
10503 1.1 skrll default:
10504 1.1 skrll /* This is OK because some slots could have
10505 1.1 skrll relaxations and others have none. */
10506 1.1 skrll break;
10507 1.1 skrll }
10508 1.1 skrll }
10509 1.1 skrll break;
10510 1.1 skrll
10511 1.1 skrll case RELAX_UNREACHABLE:
10512 1.1 skrll memset (&fragp->fr_literal[fragp->fr_fix], 0, fragp->fr_var);
10513 1.1 skrll fragp->fr_fix += fragp->tc_frag_data.text_expansion[0];
10514 1.1 skrll fragp->fr_var -= fragp->tc_frag_data.text_expansion[0];
10515 1.1 skrll frag_wane (fragp);
10516 1.1 skrll break;
10517 1.1 skrll
10518 1.1 skrll case RELAX_MAYBE_UNREACHABLE:
10519 1.1 skrll case RELAX_MAYBE_DESIRE_ALIGN:
10520 1.1 skrll frag_wane (fragp);
10521 1.1 skrll break;
10522 1.1 skrll
10523 1.1 skrll case RELAX_FILL_NOP:
10524 1.1 skrll convert_frag_fill_nop (fragp);
10525 1.1 skrll break;
10526 1.1 skrll
10527 1.1 skrll case RELAX_LITERAL_NR:
10528 1.1 skrll if (use_literal_section)
10529 1.1 skrll {
10530 1.1.1.2 christos /* This should have been handled during relaxation. When
10531 1.1 skrll relaxing a code segment, literals sometimes need to be
10532 1.1 skrll added to the corresponding literal segment. If that
10533 1.1 skrll literal segment has already been relaxed, then we end up
10534 1.1 skrll in this situation. Marking the literal segments as data
10535 1.1 skrll would make this happen less often (since GAS always relaxes
10536 1.1 skrll code before data), but we could still get into trouble if
10537 1.1 skrll there are instructions in a segment that is not marked as
10538 1.1 skrll containing code. Until we can implement a better solution,
10539 1.1 skrll cheat and adjust the addresses of all the following frags.
10540 1.1.1.4 christos This could break subsequent alignments, but the linker's
10541 1.1.1.4 christos literal coalescing will do that anyway. */
10542 1.1.1.4 christos
10543 1.1 skrll fragS *f;
10544 1.1 skrll fragp->fr_subtype = RELAX_LITERAL_FINAL;
10545 1.1 skrll gas_assert (fragp->tc_frag_data.unreported_expansion == 4);
10546 1.1 skrll memset (&fragp->fr_literal[fragp->fr_fix], 0, 4);
10547 1.1 skrll fragp->fr_var -= 4;
10548 1.1 skrll fragp->fr_fix += 4;
10549 1.1 skrll for (f = fragp->fr_next; f; f = f->fr_next)
10550 1.1 skrll f->fr_address += 4;
10551 1.1 skrll }
10552 1.1 skrll else
10553 1.1 skrll as_bad (_("invalid relaxation fragment result"));
10554 1.1 skrll break;
10555 1.1 skrll
10556 1.1 skrll case RELAX_TRAMPOLINE:
10557 1.1 skrll break;
10558 1.1 skrll }
10559 1.1 skrll
10560 1.1 skrll fragp->fr_var = 0;
10561 1.1 skrll new_logical_line (file_name, line);
10562 1.1 skrll }
10563 1.1 skrll
10564 1.1 skrll
10565 1.1 skrll static void
10566 1.1 skrll convert_frag_align_next_opcode (fragS *fragp)
10567 1.1 skrll {
10568 1.1 skrll char *nop_buf; /* Location for Writing. */
10569 1.1 skrll bfd_boolean use_no_density = fragp->tc_frag_data.is_no_density;
10570 1.1 skrll addressT aligned_address;
10571 1.1 skrll offsetT fill_size;
10572 1.1 skrll int nop, nop_count;
10573 1.1 skrll
10574 1.1 skrll aligned_address = get_noop_aligned_address (fragp, fragp->fr_address +
10575 1.1 skrll fragp->fr_fix);
10576 1.1 skrll fill_size = aligned_address - (fragp->fr_address + fragp->fr_fix);
10577 1.1 skrll nop_count = get_text_align_nop_count (fill_size, use_no_density);
10578 1.1 skrll nop_buf = fragp->fr_literal + fragp->fr_fix;
10579 1.1 skrll
10580 1.1 skrll for (nop = 0; nop < nop_count; nop++)
10581 1.1 skrll {
10582 1.1 skrll int nop_size;
10583 1.1 skrll nop_size = get_text_align_nth_nop_size (fill_size, nop, use_no_density);
10584 1.1 skrll
10585 1.1 skrll assemble_nop (nop_size, nop_buf);
10586 1.1.1.2 christos nop_buf += nop_size;
10587 1.1 skrll }
10588 1.1 skrll
10589 1.1 skrll fragp->fr_fix += fill_size;
10590 1.1 skrll fragp->fr_var -= fill_size;
10591 1.1.1.2 christos }
10592 1.1 skrll
10593 1.1 skrll
10594 1.1 skrll static void
10595 1.1 skrll convert_frag_narrow (segT segP, fragS *fragP, xtensa_format fmt, int slot)
10596 1.1 skrll {
10597 1.1 skrll TInsn tinsn, single_target;
10598 1.1 skrll int size, old_size, diff;
10599 1.1 skrll offsetT frag_offset;
10600 1.1 skrll
10601 1.1 skrll gas_assert (slot == 0);
10602 1.1 skrll tinsn_from_chars (&tinsn, fragP->fr_opcode, 0);
10603 1.1 skrll
10604 1.1 skrll if (fragP->tc_frag_data.is_aligning_branch == 1)
10605 1.1.1.2 christos {
10606 1.1 skrll gas_assert (fragP->tc_frag_data.text_expansion[0] == 1
10607 1.1 skrll || fragP->tc_frag_data.text_expansion[0] == 0);
10608 1.1 skrll convert_frag_immed (segP, fragP, fragP->tc_frag_data.text_expansion[0],
10609 1.1 skrll fmt, slot);
10610 1.1 skrll return;
10611 1.1 skrll }
10612 1.1 skrll
10613 1.1 skrll if (fragP->tc_frag_data.text_expansion[0] == 0)
10614 1.1 skrll {
10615 1.1 skrll /* No conversion. */
10616 1.1 skrll fragP->fr_var = 0;
10617 1.1 skrll return;
10618 1.1 skrll }
10619 1.1 skrll
10620 1.1 skrll gas_assert (fragP->fr_opcode != NULL);
10621 1.1 skrll
10622 1.1 skrll /* Frags in this relaxation state should only contain
10623 1.1 skrll single instruction bundles. */
10624 1.1 skrll tinsn_immed_from_frag (&tinsn, fragP, 0);
10625 1.1 skrll
10626 1.1 skrll /* Just convert it to a wide form.... */
10627 1.1 skrll size = 0;
10628 1.1 skrll old_size = xg_get_single_size (tinsn.opcode);
10629 1.1.1.2 christos
10630 1.1.1.2 christos tinsn_init (&single_target);
10631 1.1 skrll frag_offset = fragP->fr_opcode - fragP->fr_literal;
10632 1.1 skrll
10633 1.1 skrll if (! xg_is_single_relaxable_insn (&tinsn, &single_target, FALSE))
10634 1.1 skrll {
10635 1.1 skrll as_bad (_("unable to widen instruction"));
10636 1.1 skrll return;
10637 1.1 skrll }
10638 1.1 skrll
10639 1.1 skrll size = xg_get_single_size (single_target.opcode);
10640 1.1 skrll xg_emit_insn_to_buf (&single_target, fragP->fr_opcode, fragP,
10641 1.1 skrll frag_offset, TRUE);
10642 1.1 skrll
10643 1.1 skrll diff = size - old_size;
10644 1.1.1.2 christos gas_assert (diff >= 0);
10645 1.1 skrll gas_assert (diff <= fragP->fr_var);
10646 1.1 skrll fragP->fr_var -= diff;
10647 1.1 skrll fragP->fr_fix += diff;
10648 1.1 skrll
10649 1.1 skrll /* clean it up */
10650 1.1 skrll fragP->fr_var = 0;
10651 1.1 skrll }
10652 1.1 skrll
10653 1.1 skrll
10654 1.1 skrll static void
10655 1.1 skrll convert_frag_fill_nop (fragS *fragP)
10656 1.1 skrll {
10657 1.1 skrll char *loc = &fragP->fr_literal[fragP->fr_fix];
10658 1.1 skrll int size = fragP->tc_frag_data.text_expansion[0];
10659 1.1 skrll gas_assert ((unsigned) size == (fragP->fr_next->fr_address
10660 1.1 skrll - fragP->fr_address - fragP->fr_fix));
10661 1.1 skrll if (size == 0)
10662 1.1 skrll {
10663 1.1 skrll /* No conversion. */
10664 1.1 skrll fragP->fr_var = 0;
10665 1.1 skrll return;
10666 1.1 skrll }
10667 1.1 skrll assemble_nop (size, loc);
10668 1.1 skrll fragP->tc_frag_data.is_insn = TRUE;
10669 1.1 skrll fragP->fr_var -= size;
10670 1.1 skrll fragP->fr_fix += size;
10671 1.1 skrll frag_wane (fragP);
10672 1.1 skrll }
10673 1.1 skrll
10674 1.1 skrll
10675 1.1 skrll static fixS *fix_new_exp_in_seg
10676 1.1 skrll (segT, subsegT, fragS *, int, int, expressionS *, int,
10677 1.1 skrll bfd_reloc_code_real_type);
10678 1.1 skrll
10679 1.1 skrll static void
10680 1.1 skrll convert_frag_immed (segT segP,
10681 1.1.1.2 christos fragS *fragP,
10682 1.1 skrll int min_steps,
10683 1.1 skrll xtensa_format fmt,
10684 1.1 skrll int slot)
10685 1.1 skrll {
10686 1.1 skrll char *immed_instr = fragP->fr_opcode;
10687 1.1 skrll TInsn orig_tinsn;
10688 1.1 skrll bfd_boolean expanded = FALSE;
10689 1.1 skrll bfd_boolean branch_jmp_to_next = FALSE;
10690 1.1 skrll char *fr_opcode = fragP->fr_opcode;
10691 1.1 skrll xtensa_isa isa = xtensa_default_isa;
10692 1.1 skrll bfd_boolean from_wide_insn = FALSE;
10693 1.1 skrll int bytes;
10694 1.1 skrll bfd_boolean is_loop;
10695 1.1 skrll
10696 1.1 skrll gas_assert (fr_opcode != NULL);
10697 1.1 skrll
10698 1.1 skrll xg_clear_vinsn (&cur_vinsn);
10699 1.1 skrll
10700 1.1 skrll vinsn_from_chars (&cur_vinsn, fr_opcode);
10701 1.1 skrll if (cur_vinsn.num_slots > 1)
10702 1.1 skrll from_wide_insn = TRUE;
10703 1.1 skrll
10704 1.1 skrll orig_tinsn = cur_vinsn.slots[slot];
10705 1.1 skrll tinsn_immed_from_frag (&orig_tinsn, fragP, slot);
10706 1.1 skrll
10707 1.1 skrll is_loop = xtensa_opcode_is_loop (xtensa_default_isa, orig_tinsn.opcode) == 1;
10708 1.1 skrll
10709 1.1 skrll if (workaround_b_j_loop_end && ! fragP->tc_frag_data.is_no_transform)
10710 1.1.1.2 christos branch_jmp_to_next = is_branch_jmp_to_next (&orig_tinsn, fragP);
10711 1.1 skrll
10712 1.1 skrll if (branch_jmp_to_next && !next_frag_is_loop_target (fragP))
10713 1.1 skrll {
10714 1.1 skrll /* Conversion just inserts a NOP and marks the fix as completed. */
10715 1.1 skrll bytes = xtensa_format_length (isa, fmt);
10716 1.1 skrll if (bytes >= 4)
10717 1.1 skrll {
10718 1.1 skrll cur_vinsn.slots[slot].opcode =
10719 1.1 skrll xtensa_format_slot_nop_opcode (isa, cur_vinsn.format, slot);
10720 1.1 skrll cur_vinsn.slots[slot].ntok = 0;
10721 1.1 skrll }
10722 1.1 skrll else
10723 1.1 skrll {
10724 1.1 skrll bytes += fragP->tc_frag_data.text_expansion[0];
10725 1.1 skrll gas_assert (bytes == 2 || bytes == 3);
10726 1.1 skrll build_nop (&cur_vinsn.slots[0], bytes);
10727 1.1 skrll fragP->fr_fix += fragP->tc_frag_data.text_expansion[0];
10728 1.1 skrll }
10729 1.1 skrll vinsn_to_insnbuf (&cur_vinsn, fr_opcode, frag_now, TRUE);
10730 1.1 skrll xtensa_insnbuf_to_chars
10731 1.1 skrll (isa, cur_vinsn.insnbuf, (unsigned char *) fr_opcode, 0);
10732 1.1 skrll fragP->fr_var = 0;
10733 1.1 skrll }
10734 1.1 skrll else
10735 1.1 skrll {
10736 1.1 skrll /* Here is the fun stuff: Get the immediate field from this
10737 1.1 skrll instruction. If it fits, we're done. If not, find the next
10738 1.1 skrll instruction sequence that fits. */
10739 1.1 skrll
10740 1.1 skrll IStack istack;
10741 1.1 skrll int i;
10742 1.1 skrll symbolS *lit_sym = NULL;
10743 1.1 skrll int total_size = 0;
10744 1.1 skrll int target_offset = 0;
10745 1.1 skrll int old_size;
10746 1.1 skrll int diff;
10747 1.1 skrll symbolS *gen_label = NULL;
10748 1.1 skrll offsetT frag_offset;
10749 1.1 skrll bfd_boolean first = TRUE;
10750 1.1 skrll
10751 1.1 skrll /* It does not fit. Find something that does and
10752 1.1 skrll convert immediately. */
10753 1.1 skrll frag_offset = fr_opcode - fragP->fr_literal;
10754 1.1 skrll istack_init (&istack);
10755 1.1 skrll xg_assembly_relax (&istack, &orig_tinsn,
10756 1.1 skrll segP, fragP, frag_offset, min_steps, 0);
10757 1.1 skrll
10758 1.1 skrll old_size = xtensa_format_length (isa, fmt);
10759 1.1 skrll
10760 1.1 skrll /* Assemble this right inline. */
10761 1.1 skrll
10762 1.1 skrll /* First, create the mapping from a label name to the REAL label. */
10763 1.1 skrll target_offset = 0;
10764 1.1 skrll for (i = 0; i < istack.ninsn; i++)
10765 1.1 skrll {
10766 1.1 skrll TInsn *tinsn = &istack.insn[i];
10767 1.1 skrll fragS *lit_frag;
10768 1.1 skrll
10769 1.1 skrll switch (tinsn->insn_type)
10770 1.1 skrll {
10771 1.1 skrll case ITYPE_LITERAL:
10772 1.1 skrll if (lit_sym != NULL)
10773 1.1 skrll as_bad (_("multiple literals in expansion"));
10774 1.1 skrll /* First find the appropriate space in the literal pool. */
10775 1.1 skrll lit_frag = fragP->tc_frag_data.literal_frags[slot];
10776 1.1 skrll if (lit_frag == NULL)
10777 1.1 skrll as_bad (_("no registered fragment for literal"));
10778 1.1 skrll if (tinsn->ntok != 1)
10779 1.1 skrll as_bad (_("number of literal tokens != 1"));
10780 1.1 skrll
10781 1.1.1.2 christos /* Set the literal symbol and add a fixup. */
10782 1.1 skrll lit_sym = lit_frag->fr_symbol;
10783 1.1 skrll break;
10784 1.1 skrll
10785 1.1 skrll case ITYPE_LABEL:
10786 1.1 skrll if (align_targets && !is_loop)
10787 1.1.1.2 christos {
10788 1.1 skrll fragS *unreach = fragP->fr_next;
10789 1.1 skrll while (!(unreach->fr_type == rs_machine_dependent
10790 1.1 skrll && (unreach->fr_subtype == RELAX_MAYBE_UNREACHABLE
10791 1.1 skrll || unreach->fr_subtype == RELAX_UNREACHABLE)))
10792 1.1 skrll {
10793 1.1 skrll unreach = unreach->fr_next;
10794 1.1 skrll }
10795 1.1 skrll
10796 1.1 skrll gas_assert (unreach->fr_type == rs_machine_dependent
10797 1.1 skrll && (unreach->fr_subtype == RELAX_MAYBE_UNREACHABLE
10798 1.1 skrll || unreach->fr_subtype == RELAX_UNREACHABLE));
10799 1.1 skrll
10800 1.1 skrll target_offset += unreach->tc_frag_data.text_expansion[0];
10801 1.1 skrll }
10802 1.1 skrll gas_assert (gen_label == NULL);
10803 1.1 skrll gen_label = symbol_new (FAKE_LABEL_NAME, now_seg,
10804 1.1 skrll fr_opcode - fragP->fr_literal
10805 1.1 skrll + target_offset, fragP);
10806 1.1 skrll break;
10807 1.1 skrll
10808 1.1 skrll case ITYPE_INSN:
10809 1.1 skrll if (first && from_wide_insn)
10810 1.1 skrll {
10811 1.1 skrll target_offset += xtensa_format_length (isa, fmt);
10812 1.1 skrll first = FALSE;
10813 1.1 skrll if (!opcode_fits_format_slot (tinsn->opcode, fmt, slot))
10814 1.1 skrll target_offset += xg_get_single_size (tinsn->opcode);
10815 1.1 skrll }
10816 1.1 skrll else
10817 1.1 skrll target_offset += xg_get_single_size (tinsn->opcode);
10818 1.1 skrll break;
10819 1.1 skrll }
10820 1.1 skrll }
10821 1.1 skrll
10822 1.1.1.2 christos total_size = 0;
10823 1.1.1.2 christos first = TRUE;
10824 1.1.1.2 christos for (i = 0; i < istack.ninsn; i++)
10825 1.1 skrll {
10826 1.1 skrll TInsn *tinsn = &istack.insn[i];
10827 1.1.1.2 christos fragS *lit_frag;
10828 1.1 skrll int size;
10829 1.1 skrll segT target_seg;
10830 1.1 skrll bfd_reloc_code_real_type reloc_type;
10831 1.1 skrll
10832 1.1 skrll switch (tinsn->insn_type)
10833 1.1 skrll {
10834 1.1 skrll case ITYPE_LITERAL:
10835 1.1 skrll lit_frag = fragP->tc_frag_data.literal_frags[slot];
10836 1.1 skrll /* Already checked. */
10837 1.1 skrll gas_assert (lit_frag != NULL);
10838 1.1 skrll gas_assert (lit_sym != NULL);
10839 1.1 skrll gas_assert (tinsn->ntok == 1);
10840 1.1 skrll /* Add a fixup. */
10841 1.1 skrll target_seg = S_GET_SEGMENT (lit_sym);
10842 1.1 skrll gas_assert (target_seg);
10843 1.1 skrll reloc_type = map_operator_to_reloc (tinsn->tok[0].X_op, TRUE);
10844 1.1 skrll fix_new_exp_in_seg (target_seg, 0, lit_frag, 0, 4,
10845 1.1 skrll &tinsn->tok[0], FALSE, reloc_type);
10846 1.1 skrll break;
10847 1.1 skrll
10848 1.1 skrll case ITYPE_LABEL:
10849 1.1 skrll break;
10850 1.1 skrll
10851 1.1 skrll case ITYPE_INSN:
10852 1.1 skrll xg_resolve_labels (tinsn, gen_label);
10853 1.1 skrll xg_resolve_literals (tinsn, lit_sym);
10854 1.1 skrll if (from_wide_insn && first)
10855 1.1 skrll {
10856 1.1 skrll first = FALSE;
10857 1.1 skrll if (opcode_fits_format_slot (tinsn->opcode, fmt, slot))
10858 1.1 skrll {
10859 1.1 skrll cur_vinsn.slots[slot] = *tinsn;
10860 1.1 skrll }
10861 1.1 skrll else
10862 1.1 skrll {
10863 1.1 skrll cur_vinsn.slots[slot].opcode =
10864 1.1 skrll xtensa_format_slot_nop_opcode (isa, fmt, slot);
10865 1.1 skrll cur_vinsn.slots[slot].ntok = 0;
10866 1.1 skrll }
10867 1.1 skrll vinsn_to_insnbuf (&cur_vinsn, immed_instr, fragP, TRUE);
10868 1.1 skrll xtensa_insnbuf_to_chars (isa, cur_vinsn.insnbuf,
10869 1.1 skrll (unsigned char *) immed_instr, 0);
10870 1.1 skrll fragP->tc_frag_data.is_insn = TRUE;
10871 1.1 skrll size = xtensa_format_length (isa, fmt);
10872 1.1 skrll if (!opcode_fits_format_slot (tinsn->opcode, fmt, slot))
10873 1.1 skrll {
10874 1.1 skrll xg_emit_insn_to_buf
10875 1.1 skrll (tinsn, immed_instr + size, fragP,
10876 1.1 skrll immed_instr - fragP->fr_literal + size, TRUE);
10877 1.1 skrll size += xg_get_single_size (tinsn->opcode);
10878 1.1.1.2 christos }
10879 1.1 skrll }
10880 1.1 skrll else
10881 1.1.1.2 christos {
10882 1.1 skrll size = xg_get_single_size (tinsn->opcode);
10883 1.1 skrll xg_emit_insn_to_buf (tinsn, immed_instr, fragP,
10884 1.1 skrll immed_instr - fragP->fr_literal, TRUE);
10885 1.1 skrll }
10886 1.1 skrll immed_instr += size;
10887 1.1 skrll total_size += size;
10888 1.1 skrll break;
10889 1.1 skrll }
10890 1.1 skrll }
10891 1.1 skrll
10892 1.1 skrll diff = total_size - old_size;
10893 1.1 skrll gas_assert (diff >= 0);
10894 1.1 skrll if (diff != 0)
10895 1.1 skrll expanded = TRUE;
10896 1.1 skrll gas_assert (diff <= fragP->fr_var);
10897 1.1 skrll fragP->fr_var -= diff;
10898 1.1 skrll fragP->fr_fix += diff;
10899 1.1 skrll }
10900 1.1 skrll
10901 1.1 skrll /* Check for undefined immediates in LOOP instructions. */
10902 1.1 skrll if (is_loop)
10903 1.1 skrll {
10904 1.1 skrll symbolS *sym;
10905 1.1 skrll sym = orig_tinsn.tok[1].X_add_symbol;
10906 1.1 skrll if (sym != NULL && !S_IS_DEFINED (sym))
10907 1.1 skrll {
10908 1.1 skrll as_bad (_("unresolved loop target symbol: %s"), S_GET_NAME (sym));
10909 1.1 skrll return;
10910 1.1 skrll }
10911 1.1 skrll sym = orig_tinsn.tok[1].X_op_symbol;
10912 1.1 skrll if (sym != NULL && !S_IS_DEFINED (sym))
10913 1.1 skrll {
10914 1.1 skrll as_bad (_("unresolved loop target symbol: %s"), S_GET_NAME (sym));
10915 1.1 skrll return;
10916 1.1 skrll }
10917 1.1 skrll }
10918 1.1 skrll
10919 1.1 skrll if (expanded && is_direct_call_opcode (orig_tinsn.opcode))
10920 1.1 skrll {
10921 1.1 skrll /* Add an expansion note on the expanded instruction. */
10922 1.1 skrll fix_new_exp_in_seg (now_seg, 0, fragP, fr_opcode - fragP->fr_literal, 4,
10923 1.1 skrll &orig_tinsn.tok[0], TRUE,
10924 1.1 skrll BFD_RELOC_XTENSA_ASM_EXPAND);
10925 1.1 skrll }
10926 1.1 skrll }
10927 1.1 skrll
10928 1.1 skrll
10929 1.1 skrll /* Add a new fix expression into the desired segment. We have to
10930 1.1 skrll switch to that segment to do this. */
10931 1.1.1.2 christos
10932 1.1 skrll static fixS *
10933 1.1 skrll fix_new_exp_in_seg (segT new_seg,
10934 1.1 skrll subsegT new_subseg,
10935 1.1 skrll fragS *frag,
10936 1.1 skrll int where,
10937 1.1 skrll int size,
10938 1.1 skrll expressionS *exp,
10939 1.1 skrll int pcrel,
10940 1.1 skrll bfd_reloc_code_real_type r_type)
10941 1.1 skrll {
10942 1.1 skrll fixS *new_fix;
10943 1.1 skrll segT seg = now_seg;
10944 1.1 skrll subsegT subseg = now_subseg;
10945 1.1 skrll
10946 1.1 skrll gas_assert (new_seg != 0);
10947 1.1 skrll subseg_set (new_seg, new_subseg);
10948 1.1 skrll
10949 1.1 skrll new_fix = fix_new_exp (frag, where, size, exp, pcrel, r_type);
10950 1.1 skrll subseg_set (seg, subseg);
10951 1.1 skrll return new_fix;
10952 1.1 skrll }
10953 1.1 skrll
10954 1.1 skrll
10955 1.1 skrll
10956 1.1 skrll /* A map that keeps information on a per-subsegment basis. This is
10958 1.1 skrll maintained during initial assembly, but is invalid once the
10959 1.1 skrll subsegments are smashed together. I.E., it cannot be used during
10960 1.1 skrll the relaxation. */
10961 1.1 skrll
10962 1.1 skrll typedef struct subseg_map_struct
10963 1.1 skrll {
10964 1.1 skrll /* the key */
10965 1.1 skrll segT seg;
10966 1.1 skrll subsegT subseg;
10967 1.1 skrll
10968 1.1 skrll /* the data */
10969 1.1 skrll unsigned flags;
10970 1.1 skrll float total_freq; /* fall-through + branch target frequency */
10971 1.1 skrll float target_freq; /* branch target frequency alone */
10972 1.1 skrll
10973 1.1 skrll struct subseg_map_struct *next;
10974 1.1 skrll } subseg_map;
10975 1.1 skrll
10976 1.1 skrll
10977 1.1 skrll static subseg_map *sseg_map = NULL;
10978 1.1 skrll
10979 1.1 skrll static subseg_map *
10980 1.1.1.5 christos get_subseg_info (segT seg, subsegT subseg)
10981 1.1 skrll {
10982 1.1 skrll subseg_map *subseg_e;
10983 1.1 skrll
10984 1.1 skrll for (subseg_e = sseg_map; subseg_e; subseg_e = subseg_e->next)
10985 1.1 skrll {
10986 1.1 skrll if (seg == subseg_e->seg && subseg == subseg_e->subseg)
10987 1.1 skrll break;
10988 1.1 skrll }
10989 1.1 skrll return subseg_e;
10990 1.1 skrll }
10991 1.1 skrll
10992 1.1 skrll
10993 1.1 skrll static subseg_map *
10994 1.1 skrll add_subseg_info (segT seg, subsegT subseg)
10995 1.1 skrll {
10996 1.1 skrll subseg_map *subseg_e = XNEW (subseg_map);
10997 1.1 skrll memset (subseg_e, 0, sizeof (subseg_map));
10998 1.1 skrll subseg_e->seg = seg;
10999 1.1 skrll subseg_e->subseg = subseg;
11000 1.1 skrll subseg_e->flags = 0;
11001 1.1 skrll /* Start off considering every branch target very important. */
11002 1.1 skrll subseg_e->target_freq = 1.0;
11003 1.1 skrll subseg_e->total_freq = 1.0;
11004 1.1 skrll subseg_e->next = sseg_map;
11005 1.1 skrll sseg_map = subseg_e;
11006 1.1 skrll return subseg_e;
11007 1.1 skrll }
11008 1.1 skrll
11009 1.1 skrll
11010 1.1 skrll static unsigned
11011 1.1 skrll get_last_insn_flags (segT seg, subsegT subseg)
11012 1.1 skrll {
11013 1.1 skrll subseg_map *subseg_e = get_subseg_info (seg, subseg);
11014 1.1 skrll if (subseg_e)
11015 1.1 skrll return subseg_e->flags;
11016 1.1 skrll return 0;
11017 1.1 skrll }
11018 1.1 skrll
11019 1.1 skrll
11020 1.1 skrll static void
11021 1.1 skrll set_last_insn_flags (segT seg,
11022 1.1 skrll subsegT subseg,
11023 1.1 skrll unsigned fl,
11024 1.1 skrll bfd_boolean val)
11025 1.1 skrll {
11026 1.1 skrll subseg_map *subseg_e = get_subseg_info (seg, subseg);
11027 1.1 skrll if (! subseg_e)
11028 1.1 skrll subseg_e = add_subseg_info (seg, subseg);
11029 1.1 skrll if (val)
11030 1.1 skrll subseg_e->flags |= fl;
11031 1.1 skrll else
11032 1.1 skrll subseg_e->flags &= ~fl;
11033 1.1 skrll }
11034 1.1 skrll
11035 1.1 skrll
11036 1.1 skrll static float
11037 1.1 skrll get_subseg_total_freq (segT seg, subsegT subseg)
11038 1.1 skrll {
11039 1.1 skrll subseg_map *subseg_e = get_subseg_info (seg, subseg);
11040 1.1 skrll if (subseg_e)
11041 1.1 skrll return subseg_e->total_freq;
11042 1.1 skrll return 1.0;
11043 1.1 skrll }
11044 1.1 skrll
11045 1.1 skrll
11046 1.1 skrll static float
11047 1.1 skrll get_subseg_target_freq (segT seg, subsegT subseg)
11048 1.1 skrll {
11049 1.1 skrll subseg_map *subseg_e = get_subseg_info (seg, subseg);
11050 1.1 skrll if (subseg_e)
11051 1.1 skrll return subseg_e->target_freq;
11052 1.1 skrll return 1.0;
11053 1.1 skrll }
11054 1.1 skrll
11055 1.1 skrll
11056 1.1 skrll static void
11057 1.1 skrll set_subseg_freq (segT seg, subsegT subseg, float total_f, float target_f)
11058 1.1 skrll {
11059 1.1 skrll subseg_map *subseg_e = get_subseg_info (seg, subseg);
11060 1.1 skrll if (! subseg_e)
11061 1.1 skrll subseg_e = add_subseg_info (seg, subseg);
11062 1.1.1.2 christos subseg_e->total_freq = total_f;
11063 1.1 skrll subseg_e->target_freq = target_f;
11064 1.1 skrll }
11065 1.1 skrll
11066 1.1 skrll
11067 1.1 skrll /* Segment Lists and emit_state Stuff. */
11069 1.1 skrll
11070 1.1 skrll static void
11071 1.1 skrll xtensa_move_seg_list_to_beginning (seg_list *head)
11072 1.1 skrll {
11073 1.1 skrll head = head->next;
11074 1.1 skrll while (head)
11075 1.1 skrll {
11076 1.1.1.6 christos segT literal_section = head->seg;
11077 1.1.1.6 christos
11078 1.1.1.6 christos /* Move the literal section to the front of the section list. */
11079 1.1.1.6 christos gas_assert (literal_section);
11080 1.1.1.6 christos if (literal_section != stdoutput->sections)
11081 1.1.1.6 christos {
11082 1.1.1.6 christos bfd_section_list_remove (stdoutput, literal_section);
11083 1.1.1.6 christos bfd_section_list_prepend (stdoutput, literal_section);
11084 1.1.1.6 christos }
11085 1.1.1.6 christos head = head->next;
11086 1.1.1.6 christos }
11087 1.1.1.6 christos }
11088 1.1.1.6 christos
11089 1.1.1.6 christos
11090 1.1.1.6 christos static void mark_literal_frags (seg_list *);
11091 1.1.1.6 christos
11092 1.1.1.6 christos static void
11093 1.1.1.6 christos xg_promote_candidate_litpool (struct litpool_seg *lps,
11094 1.1.1.6 christos struct litpool_frag *lp)
11095 1.1.1.6 christos {
11096 1.1.1.6 christos fragS *poolbeg;
11097 1.1.1.6 christos fragS *poolend;
11098 1.1.1.6 christos symbolS *lsym;
11099 1.1.1.7 christos char label[10 + 2 * sizeof (fragS *)];
11100 1.1.1.7 christos
11101 1.1.1.7 christos poolbeg = lp->fragP;
11102 1.1.1.7 christos lp->priority = 1;
11103 1.1.1.7 christos poolbeg->fr_subtype = RELAX_LITERAL_POOL_BEGIN;
11104 1.1.1.7 christos poolend = poolbeg->fr_next;
11105 1.1.1.7 christos gas_assert (poolend->fr_type == rs_machine_dependent &&
11106 1.1.1.7 christos poolend->fr_subtype == RELAX_LITERAL_POOL_END);
11107 1.1.1.7 christos /* Create a local symbol pointing to the
11108 1.1.1.7 christos end of the pool. */
11109 1.1.1.7 christos sprintf (label, ".L0_LT_%p", poolbeg);
11110 1.1.1.7 christos lsym = (symbolS *)local_symbol_make (label, lps->seg,
11111 1.1.1.7 christos 0, poolend);
11112 1.1.1.7 christos poolbeg->fr_symbol = lsym;
11113 1.1.1.7 christos /* Rest is done in xtensa_relax_frag. */
11114 1.1.1.7 christos }
11115 1.1.1.7 christos
11116 1.1.1.7 christos static struct litpool_frag *xg_find_litpool (struct litpool_seg *lps,
11117 1.1.1.7 christos struct litpool_frag *lpf,
11118 1.1.1.7 christos addressT addr)
11119 1.1.1.7 christos {
11120 1.1.1.7 christos struct litpool_frag *lp = lpf->prev;
11121 1.1.1.7 christos
11122 1.1.1.7 christos gas_assert (lp->fragP);
11123 1.1.1.7 christos
11124 1.1.1.7 christos while (lp->fragP->fr_subtype == RELAX_LITERAL_POOL_CANDIDATE_BEGIN)
11125 1.1.1.7 christos {
11126 1.1.1.7 christos lp = lp->prev;
11127 1.1.1.7 christos if (lp->fragP == NULL)
11128 1.1.1.7 christos {
11129 1.1.1.7 christos /* End of list; have to bite the bullet.
11130 1.1.1.7 christos Take the nearest. */
11131 1.1.1.7 christos lp = lpf->prev;
11132 1.1.1.7 christos break;
11133 1.1.1.7 christos }
11134 1.1.1.7 christos /* Does it (conservatively) reach? */
11135 1.1.1.7 christos if (addr - lp->addr <= 128 * 1024)
11136 1.1.1.7 christos {
11137 1.1.1.7 christos if (lp->fragP->fr_subtype == RELAX_LITERAL_POOL_BEGIN &&
11138 1.1.1.7 christos lp->literal_count < MAX_POOL_LITERALS)
11139 1.1.1.7 christos {
11140 1.1.1.7 christos /* Found a good one. */
11141 1.1.1.7 christos break;
11142 1.1.1.7 christos }
11143 1.1.1.7 christos else if (lp->prev->fragP &&
11144 1.1.1.7 christos addr - lp->prev->addr > 128 * 1024 &&
11145 1.1.1.7 christos lp->prev->literal_count < MAX_POOL_LITERALS)
11146 1.1.1.7 christos {
11147 1.1.1.7 christos /* This is still a "candidate" but the next one
11148 1.1.1.7 christos will be too far away, so revert to the nearest
11149 1.1.1.7 christos one, convert it and add the jump around. */
11150 1.1.1.7 christos lp = lpf->prev;
11151 1.1.1.7 christos break;
11152 1.1.1.7 christos }
11153 1.1.1.7 christos }
11154 1.1.1.7 christos }
11155 1.1.1.7 christos
11156 1.1.1.7 christos if (lp->literal_count >= MAX_POOL_LITERALS)
11157 1.1.1.7 christos {
11158 1.1.1.7 christos lp = lpf->prev;
11159 1.1.1.7 christos while (lp && lp->fragP && lp->literal_count >= MAX_POOL_LITERALS)
11160 1.1.1.7 christos {
11161 1.1.1.7 christos lp = lp->prev;
11162 1.1.1.7 christos }
11163 1.1.1.7 christos gas_assert (lp);
11164 1.1.1.7 christos }
11165 1.1.1.7 christos
11166 1.1.1.7 christos gas_assert (lp && lp->fragP && lp->literal_count < MAX_POOL_LITERALS);
11167 1.1.1.6 christos ++lp->literal_count;
11168 1.1.1.8 christos
11169 1.1 skrll /* Convert candidate and add the jump around. */
11170 1.1.1.4 christos if (lp->fragP->fr_subtype == RELAX_LITERAL_POOL_CANDIDATE_BEGIN)
11171 1.1.1.4 christos xg_promote_candidate_litpool (lps, lp);
11172 1.1.1.4 christos
11173 1.1.1.4 christos return lp;
11174 1.1.1.4 christos }
11175 1.1.1.4 christos
11176 1.1.1.4 christos static bfd_boolean xtensa_is_init_fini (segT seg)
11177 1.1.1.4 christos {
11178 1.1.1.7 christos if (!seg)
11179 1.1.1.7 christos return 0;
11180 1.1.1.7 christos return strcmp (segment_name (seg), INIT_SECTION_NAME) == 0
11181 1.1.1.4 christos || strcmp (segment_name (seg), FINI_SECTION_NAME) == 0;
11182 1.1.1.4 christos }
11183 1.1.1.4 christos
11184 1.1.1.4 christos static void
11185 1.1.1.4 christos xtensa_assign_litpool_addresses (void)
11186 1.1.1.4 christos {
11187 1.1.1.4 christos struct litpool_seg *lps;
11188 1.1.1.4 christos
11189 1.1.1.4 christos for (lps = litpool_seg_list.next; lps; lps = lps->next)
11190 1.1.1.4 christos {
11191 1.1.1.4 christos frchainS *frchP = seg_info (lps->seg)->frchainP;
11192 1.1.1.4 christos struct litpool_frag *lpf = lps->frag_list.next;
11193 1.1.1.4 christos addressT addr = 0;
11194 1.1.1.4 christos
11195 1.1.1.4 christos if (xtensa_is_init_fini (lps->seg))
11196 1.1.1.4 christos continue;
11197 1.1.1.4 christos
11198 1.1.1.4 christos for ( ; frchP; frchP = frchP->frch_next)
11199 1.1.1.4 christos {
11200 1.1.1.4 christos fragS *fragP;
11201 1.1.1.7 christos for (fragP = frchP->frch_root; fragP; fragP = fragP->fr_next)
11202 1.1.1.7 christos {
11203 1.1.1.7 christos if (lpf && fragP == lpf->fragP)
11204 1.1.1.7 christos {
11205 1.1.1.7 christos gas_assert(fragP->fr_type == rs_machine_dependent &&
11206 1.1.1.4 christos (fragP->fr_subtype == RELAX_LITERAL_POOL_BEGIN ||
11207 1.1.1.7 christos fragP->fr_subtype == RELAX_LITERAL_POOL_CANDIDATE_BEGIN));
11208 1.1.1.7 christos /* Found a litpool location. */
11209 1.1.1.7 christos lpf->addr = addr;
11210 1.1.1.7 christos lpf = lpf->next;
11211 1.1.1.7 christos }
11212 1.1.1.7 christos if (fragP->fr_type == rs_machine_dependent &&
11213 1.1.1.7 christos fragP->fr_subtype == RELAX_SLOTS)
11214 1.1.1.7 christos {
11215 1.1.1.7 christos int slot;
11216 1.1.1.7 christos for (slot = 0; slot < MAX_SLOTS; slot++)
11217 1.1.1.7 christos {
11218 1.1.1.4 christos fragS *litfrag = fragP->tc_frag_data.literal_frags[slot];
11219 1.1.1.4 christos
11220 1.1.1.4 christos if (litfrag
11221 1.1.1.4 christos && litfrag->tc_frag_data.is_literal
11222 1.1.1.4 christos && !litfrag->tc_frag_data.literal_frag)
11223 1.1.1.4 christos {
11224 1.1.1.4 christos /* L32R referring .literal or generated as a result
11225 1.1.1.4 christos of relaxation. Point its literal to the nearest
11226 1.1.1.4 christos litpool preferring non-"candidate" positions to
11227 1.1.1.8 christos avoid the jump-around. */
11228 1.1.1.8 christos
11229 1.1.1.8 christos struct litpool_frag *lp;
11230 1.1.1.8 christos
11231 1.1.1.8 christos lp = xg_find_litpool (lps, lpf, addr);
11232 1.1.1.8 christos /* Take earliest use of this literal to avoid
11233 1.1.1.8 christos forward refs. */
11234 1.1.1.8 christos litfrag->tc_frag_data.literal_frag = lp->fragP;
11235 1.1.1.8 christos }
11236 1.1.1.8 christos }
11237 1.1.1.8 christos }
11238 1.1.1.8 christos addr += fragP->fr_fix;
11239 1.1.1.8 christos if (fragP->fr_type == rs_fill)
11240 1.1.1.8 christos addr += fragP->fr_offset;
11241 1.1.1.8 christos }
11242 1.1.1.8 christos }
11243 1.1.1.8 christos }
11244 1.1.1.8 christos }
11245 1.1.1.8 christos
11246 1.1.1.8 christos static void
11247 1.1.1.8 christos xtensa_move_literals (void)
11248 1.1.1.8 christos {
11249 1.1.1.4 christos seg_list *segment;
11250 1.1.1.8 christos frchainS *frchain_from, *frchain_to;
11251 1.1.1.8 christos fragS *search_frag, *next_frag, *literal_pool, *insert_after;
11252 1.1.1.8 christos fragS **frag_splice;
11253 1.1.1.8 christos emit_state state;
11254 1.1.1.8 christos segT dest_seg;
11255 1.1.1.8 christos fixS *fix, *next_fix, **fix_splice;
11256 1.1 skrll sym_list *lit;
11257 1.1 skrll const char *init_name = INIT_SECTION_NAME;
11258 1.1.1.5 christos const char *fini_name = FINI_SECTION_NAME;
11259 1.1.1.5 christos int init_name_len = strlen(init_name);
11260 1.1 skrll int fini_name_len = strlen(fini_name);
11261 1.1.1.5 christos
11262 1.1.1.5 christos mark_literal_frags (literal_head->next);
11263 1.1.1.5 christos
11264 1.1.1.5 christos if (use_literal_section)
11265 1.1 skrll return;
11266 1.1 skrll
11267 1.1 skrll /* Assign addresses (rough estimates) to the potential literal pool locations
11268 1.1 skrll and create new ones if the gaps are too large. */
11269 1.1 skrll
11270 1.1 skrll xtensa_assign_litpool_addresses ();
11271 1.1 skrll
11272 1.1 skrll /* Walk through the literal segments. */
11273 1.1.1.4 christos for (segment = literal_head->next; segment; segment = segment->next)
11274 1.1 skrll {
11275 1.1.1.2 christos const char *seg_name = segment_name (segment->seg);
11276 1.1 skrll
11277 1.1 skrll /* Keep the literals for .init and .fini in separate sections. */
11278 1.1 skrll if ((!memcmp (seg_name, init_name, init_name_len) &&
11279 1.1 skrll !strcmp (seg_name + init_name_len, ".literal")) ||
11280 1.1.1.4 christos (!memcmp (seg_name, fini_name, fini_name_len) &&
11281 1.1.1.8 christos !strcmp (seg_name + fini_name_len, ".literal")))
11282 1.1.1.4 christos continue;
11283 1.1.1.2 christos
11284 1.1 skrll frchain_from = seg_info (segment->seg)->frchainP;
11285 1.1 skrll search_frag = frchain_from->frch_root;
11286 1.1 skrll literal_pool = NULL;
11287 1.1 skrll frchain_to = NULL;
11288 1.1 skrll frag_splice = &(frchain_from->frch_root);
11289 1.1 skrll
11290 1.1 skrll while (search_frag && !search_frag->tc_frag_data.literal_frag)
11291 1.1 skrll {
11292 1.1 skrll gas_assert (search_frag->fr_fix == 0
11293 1.1 skrll || search_frag->fr_type == rs_align);
11294 1.1 skrll search_frag = search_frag->fr_next;
11295 1.1 skrll }
11296 1.1 skrll
11297 1.1 skrll if (!search_frag)
11298 1.1 skrll continue;
11299 1.1 skrll
11300 1.1 skrll gas_assert (search_frag->tc_frag_data.literal_frag->fr_subtype
11301 1.1 skrll == RELAX_LITERAL_POOL_BEGIN);
11302 1.1.1.2 christos xtensa_switch_section_emit_state (&state, segment->seg, 0);
11303 1.1 skrll
11304 1.1.1.2 christos /* Make sure that all the frags in this series are closed, and
11305 1.1 skrll that there is at least one left over of zero-size. This
11306 1.1.1.4 christos prevents us from making a segment with an frchain without any
11307 1.1.1.4 christos frags in it. */
11308 1.1.1.4 christos frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
11309 1.1.1.4 christos xtensa_set_frag_assembly_state (frag_now);
11310 1.1.1.4 christos frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
11311 1.1.1.4 christos xtensa_set_frag_assembly_state (frag_now);
11312 1.1.1.4 christos
11313 1.1.1.4 christos while (search_frag != frag_now)
11314 1.1.1.4 christos {
11315 1.1.1.4 christos next_frag = search_frag->fr_next;
11316 1.1.1.4 christos if (search_frag->tc_frag_data.literal_frag)
11317 1.1.1.4 christos {
11318 1.1.1.4 christos literal_pool = search_frag->tc_frag_data.literal_frag;
11319 1.1.1.4 christos gas_assert (literal_pool->fr_subtype == RELAX_LITERAL_POOL_BEGIN);
11320 1.1.1.4 christos frchain_to = literal_pool->tc_frag_data.lit_frchain;
11321 1.1.1.4 christos gas_assert (frchain_to);
11322 1.1.1.4 christos }
11323 1.1.1.4 christos
11324 1.1.1.4 christos if (search_frag->fr_type == rs_fill && search_frag->fr_fix == 0)
11325 1.1.1.4 christos {
11326 1.1.1.4 christos /* Skip empty fill frags. */
11327 1.1.1.4 christos *frag_splice = next_frag;
11328 1.1.1.6 christos search_frag = next_frag;
11329 1.1.1.4 christos continue;
11330 1.1.1.4 christos }
11331 1.1.1.4 christos
11332 1.1.1.4 christos if (search_frag->fr_type == rs_align)
11333 1.1.1.4 christos {
11334 1.1.1.4 christos /* Skip alignment frags, because the pool as a whole will be
11335 1.1.1.4 christos aligned if used, and we don't want to force alignment if the
11336 1.1.1.4 christos pool is unused. */
11337 1.1.1.4 christos *frag_splice = next_frag;
11338 1.1.1.4 christos search_frag = next_frag;
11339 1.1.1.4 christos continue;
11340 1.1.1.4 christos }
11341 1.1.1.4 christos
11342 1.1.1.4 christos /* First, move the frag out of the literal section and
11343 1.1.1.4 christos to the appropriate place. */
11344 1.1.1.4 christos
11345 1.1.1.4 christos /* Insert an alignment frag at start of pool. */
11346 1.1.1.4 christos if (literal_pool->fr_next->fr_type == rs_machine_dependent &&
11347 1.1.1.4 christos literal_pool->fr_next->fr_subtype == RELAX_LITERAL_POOL_END)
11348 1.1.1.4 christos {
11349 1.1 skrll segT pool_seg = literal_pool->fr_next->tc_frag_data.lit_seg;
11350 1.1 skrll emit_state prev_state;
11351 1.1.1.4 christos fragS *prev_frag;
11352 1.1.1.4 christos fragS *align_frag;
11353 1.1.1.4 christos xtensa_switch_section_emit_state (&prev_state, pool_seg, 0);
11354 1.1.1.4 christos prev_frag = frag_now;
11355 1.1.1.4 christos frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
11356 1.1 skrll align_frag = frag_now;
11357 1.1 skrll frag_align (2, 0, 0);
11358 1.1 skrll /* Splice it into the right place. */
11359 1.1 skrll prev_frag->fr_next = align_frag->fr_next;
11360 1.1 skrll align_frag->fr_next = literal_pool->fr_next;
11361 1.1 skrll literal_pool->fr_next = align_frag;
11362 1.1 skrll /* Insert after this one. */
11363 1.1 skrll literal_pool->tc_frag_data.literal_frag = align_frag;
11364 1.1 skrll xtensa_restore_emit_state (&prev_state);
11365 1.1 skrll }
11366 1.1 skrll insert_after = literal_pool->tc_frag_data.literal_frag;
11367 1.1 skrll dest_seg = insert_after->fr_next->tc_frag_data.lit_seg;
11368 1.1 skrll /* Skip align frag. */
11369 1.1 skrll if (insert_after->fr_next->fr_type == rs_align)
11370 1.1 skrll {
11371 1.1 skrll insert_after = insert_after->fr_next;
11372 1.1 skrll }
11373 1.1 skrll
11374 1.1 skrll *frag_splice = next_frag;
11375 1.1 skrll search_frag->fr_next = insert_after->fr_next;
11376 1.1 skrll insert_after->fr_next = search_frag;
11377 1.1 skrll search_frag->tc_frag_data.lit_seg = dest_seg;
11378 1.1 skrll literal_pool->tc_frag_data.literal_frag = search_frag;
11379 1.1 skrll
11380 1.1 skrll /* Now move any fixups associated with this frag to the
11381 1.1 skrll right section. */
11382 1.1 skrll fix = frchain_from->fix_root;
11383 1.1 skrll fix_splice = &(frchain_from->fix_root);
11384 1.1 skrll while (fix)
11385 1.1 skrll {
11386 1.1 skrll next_fix = fix->fx_next;
11387 1.1 skrll if (fix->fx_frag == search_frag)
11388 1.1 skrll {
11389 1.1 skrll *fix_splice = next_fix;
11390 1.1.1.2 christos fix->fx_next = frchain_to->fix_root;
11391 1.1 skrll frchain_to->fix_root = fix;
11392 1.1 skrll if (frchain_to->fix_tail == NULL)
11393 1.1 skrll frchain_to->fix_tail = fix;
11394 1.1 skrll }
11395 1.1 skrll else
11396 1.1 skrll fix_splice = &(fix->fx_next);
11397 1.1 skrll fix = next_fix;
11398 1.1 skrll }
11399 1.1 skrll search_frag = next_frag;
11400 1.1.1.2 christos }
11401 1.1.1.2 christos
11402 1.1.1.2 christos if (frchain_from->fix_root != NULL)
11403 1.1 skrll {
11404 1.1 skrll frchain_from = seg_info (segment->seg)->frchainP;
11405 1.1 skrll as_warn (_("fixes not all moved from %s"), segment->seg->name);
11406 1.1 skrll
11407 1.1 skrll gas_assert (frchain_from->fix_root == NULL);
11408 1.1 skrll }
11409 1.1 skrll frchain_from->fix_tail = NULL;
11410 1.1 skrll xtensa_restore_emit_state (&state);
11411 1.1 skrll }
11412 1.1 skrll
11413 1.1 skrll /* Now fix up the SEGMENT value for all the literal symbols. */
11414 1.1 skrll for (lit = literal_syms; lit; lit = lit->next)
11415 1.1 skrll {
11416 1.1 skrll symbolS *lit_sym = lit->sym;
11417 1.1 skrll segT dseg = symbol_get_frag (lit_sym)->tc_frag_data.lit_seg;
11418 1.1 skrll if (dseg)
11419 1.1 skrll S_SET_SEGMENT (lit_sym, dseg);
11420 1.1 skrll }
11421 1.1 skrll }
11422 1.1 skrll
11423 1.1 skrll
11424 1.1 skrll /* Walk over all the frags for segments in a list and mark them as
11425 1.1 skrll containing literals. As clunky as this is, we can't rely on frag_var
11426 1.1 skrll and frag_variant to get called in all situations. */
11427 1.1 skrll
11428 1.1 skrll static void
11429 1.1 skrll mark_literal_frags (seg_list *segment)
11430 1.1 skrll {
11431 1.1 skrll frchainS *frchain_from;
11432 1.1 skrll fragS *search_frag;
11433 1.1 skrll
11434 1.1 skrll while (segment)
11435 1.1 skrll {
11436 1.1 skrll frchain_from = seg_info (segment->seg)->frchainP;
11437 1.1 skrll search_frag = frchain_from->frch_root;
11438 1.1 skrll while (search_frag)
11439 1.1 skrll {
11440 1.1 skrll search_frag->tc_frag_data.is_literal = TRUE;
11441 1.1 skrll search_frag = search_frag->fr_next;
11442 1.1 skrll }
11443 1.1.1.2 christos segment = segment->next;
11444 1.1 skrll }
11445 1.1 skrll }
11446 1.1 skrll
11447 1.1 skrll
11448 1.1 skrll static void
11449 1.1 skrll xtensa_reorder_seg_list (seg_list *head, segT after)
11450 1.1 skrll {
11451 1.1 skrll /* Move all of the sections in the section list to come
11452 1.1 skrll after "after" in the gnu segment list. */
11453 1.1 skrll
11454 1.1 skrll head = head->next;
11455 1.1 skrll while (head)
11456 1.1 skrll {
11457 1.1 skrll segT literal_section = head->seg;
11458 1.1 skrll
11459 1.1 skrll /* Move the literal section after "after". */
11460 1.1 skrll gas_assert (literal_section);
11461 1.1 skrll if (literal_section != after)
11462 1.1 skrll {
11463 1.1 skrll bfd_section_list_remove (stdoutput, literal_section);
11464 1.1 skrll bfd_section_list_insert_after (stdoutput, after, literal_section);
11465 1.1 skrll }
11466 1.1 skrll
11467 1.1 skrll head = head->next;
11468 1.1 skrll }
11469 1.1 skrll }
11470 1.1 skrll
11471 1.1 skrll
11472 1.1 skrll /* Push all the literal segments to the end of the gnu list. */
11473 1.1 skrll
11474 1.1 skrll static void
11475 1.1 skrll xtensa_reorder_segments (void)
11476 1.1 skrll {
11477 1.1 skrll segT sec;
11478 1.1.1.2 christos segT last_sec = 0;
11479 1.1 skrll int old_count = 0;
11480 1.1 skrll int new_count = 0;
11481 1.1 skrll
11482 1.1 skrll for (sec = stdoutput->sections; sec != NULL; sec = sec->next)
11483 1.1 skrll {
11484 1.1 skrll last_sec = sec;
11485 1.1 skrll old_count++;
11486 1.1 skrll }
11487 1.1 skrll
11488 1.1 skrll /* Now that we have the last section, push all the literal
11489 1.1 skrll sections to the end. */
11490 1.1 skrll xtensa_reorder_seg_list (literal_head, last_sec);
11491 1.1 skrll
11492 1.1 skrll /* Now perform the final error check. */
11493 1.1 skrll for (sec = stdoutput->sections; sec != NULL; sec = sec->next)
11494 1.1 skrll new_count++;
11495 1.1 skrll gas_assert (new_count == old_count);
11496 1.1 skrll }
11497 1.1 skrll
11498 1.1 skrll
11499 1.1 skrll /* Change the emit state (seg, subseg, and frag related stuff) to the
11500 1.1 skrll correct location. Return a emit_state which can be passed to
11501 1.1 skrll xtensa_restore_emit_state to return to current fragment. */
11502 1.1 skrll
11503 1.1 skrll static void
11504 1.1 skrll xtensa_switch_to_literal_fragment (emit_state *result)
11505 1.1 skrll {
11506 1.1 skrll if (directive_state[directive_absolute_literals])
11507 1.1 skrll {
11508 1.1.1.7 christos segT lit4_seg = cache_literal_section (TRUE);
11509 1.1 skrll xtensa_switch_section_emit_state (result, lit4_seg, 0);
11510 1.1 skrll }
11511 1.1 skrll else
11512 1.1.1.7 christos xtensa_switch_to_non_abs_literal_fragment (result);
11513 1.1 skrll
11514 1.1.1.4 christos /* Do a 4-byte align here. */
11515 1.1.1.4 christos frag_align (2, 0, 0);
11516 1.1.1.4 christos record_alignment (now_seg, 2);
11517 1.1.1.4 christos }
11518 1.1.1.6 christos
11519 1.1.1.6 christos
11520 1.1 skrll static void
11521 1.1 skrll xtensa_switch_to_non_abs_literal_fragment (emit_state *result)
11522 1.1 skrll {
11523 1.1 skrll fragS *pool_location = get_literal_pool_location (now_seg);
11524 1.1 skrll segT lit_seg;
11525 1.1 skrll bfd_boolean is_init_fini = xtensa_is_init_fini (now_seg);
11526 1.1.1.7 christos
11527 1.1 skrll if (pool_location == NULL
11528 1.1 skrll && !use_literal_section
11529 1.1 skrll && !is_init_fini)
11530 1.1 skrll {
11531 1.1 skrll if (!auto_litpools)
11532 1.1 skrll {
11533 1.1 skrll as_bad (_("literal pool location required for text-section-literals; specify with .literal_position"));
11534 1.1 skrll }
11535 1.1 skrll xtensa_maybe_create_literal_pool_frag (TRUE, TRUE);
11536 1.1 skrll pool_location = get_literal_pool_location (now_seg);
11537 1.1 skrll }
11538 1.1 skrll
11539 1.1 skrll lit_seg = cache_literal_section (FALSE);
11540 1.1 skrll xtensa_switch_section_emit_state (result, lit_seg, 0);
11541 1.1 skrll
11542 1.1 skrll if (!use_literal_section
11543 1.1 skrll && !is_init_fini
11544 1.1 skrll && get_literal_pool_location (now_seg) != pool_location)
11545 1.1 skrll {
11546 1.1 skrll /* Close whatever frag is there. */
11547 1.1 skrll frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
11548 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
11549 1.1 skrll frag_now->tc_frag_data.literal_frag = pool_location;
11550 1.1 skrll frag_variant (rs_fill, 0, 0, 0, NULL, 0, NULL);
11551 1.1 skrll xtensa_set_frag_assembly_state (frag_now);
11552 1.1 skrll }
11553 1.1 skrll }
11554 1.1 skrll
11555 1.1 skrll
11556 1.1 skrll /* Call this function before emitting data into the literal section.
11557 1.1 skrll This is a helper function for xtensa_switch_to_literal_fragment.
11558 1.1 skrll This is similar to a .section new_now_seg subseg. */
11559 1.1 skrll
11560 1.1 skrll static void
11561 1.1 skrll xtensa_switch_section_emit_state (emit_state *state,
11562 1.1 skrll segT new_now_seg,
11563 1.1 skrll subsegT new_now_subseg)
11564 1.1 skrll {
11565 1.1 skrll state->name = now_seg->name;
11566 1.1 skrll state->now_seg = now_seg;
11567 1.1 skrll state->now_subseg = now_subseg;
11568 1.1 skrll state->generating_literals = generating_literals;
11569 1.1 skrll generating_literals++;
11570 1.1 skrll subseg_set (new_now_seg, new_now_subseg);
11571 1.1 skrll }
11572 1.1 skrll
11573 1.1 skrll
11574 1.1.1.4 christos /* Use to restore the emitting into the normal place. */
11575 1.1 skrll
11576 1.1 skrll static void
11577 1.1 skrll xtensa_restore_emit_state (emit_state *state)
11578 1.1 skrll {
11579 1.1 skrll generating_literals = state->generating_literals;
11580 1.1 skrll subseg_set (state->now_seg, state->now_subseg);
11581 1.1 skrll }
11582 1.1 skrll
11583 1.1 skrll
11584 1.1 skrll /* Predicate function used to look up a section in a particular group. */
11585 1.1 skrll
11586 1.1 skrll static bfd_boolean
11587 1.1 skrll match_section_group (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
11588 1.1 skrll {
11589 1.1.1.5 christos const char *gname = inf;
11590 1.1.1.5 christos const char *group_name = elf_group_name (sec);
11591 1.1 skrll
11592 1.1 skrll return (group_name == gname
11593 1.1 skrll || (group_name != NULL
11594 1.1 skrll && gname != NULL
11595 1.1 skrll && strcmp (group_name, gname) == 0));
11596 1.1 skrll }
11597 1.1 skrll
11598 1.1 skrll
11599 1.1 skrll /* Get the literal section to be used for the current text section.
11600 1.1 skrll The result may be cached in the default_lit_sections structure. */
11601 1.1 skrll
11602 1.1 skrll static segT
11603 1.1 skrll cache_literal_section (bfd_boolean use_abs_literals)
11604 1.1 skrll {
11605 1.1 skrll const char *text_name, *group_name = 0;
11606 1.1 skrll const char *base_name, *suffix;
11607 1.1 skrll char *name;
11608 1.1 skrll segT *pcached;
11609 1.1 skrll segT seg, current_section;
11610 1.1 skrll int current_subsec;
11611 1.1 skrll bfd_boolean linkonce = FALSE;
11612 1.1 skrll
11613 1.1 skrll /* Save the current section/subsection. */
11614 1.1 skrll current_section = now_seg;
11615 1.1 skrll current_subsec = now_subseg;
11616 1.1.1.4 christos
11617 1.1 skrll /* Clear the cached values if they are no longer valid. */
11618 1.1 skrll if (now_seg != default_lit_sections.current_text_seg)
11619 1.1 skrll {
11620 1.1 skrll default_lit_sections.current_text_seg = now_seg;
11621 1.1 skrll default_lit_sections.lit_seg = NULL;
11622 1.1 skrll default_lit_sections.lit4_seg = NULL;
11623 1.1 skrll }
11624 1.1 skrll
11625 1.1 skrll /* Check if the literal section is already cached. */
11626 1.1 skrll if (use_abs_literals)
11627 1.1 skrll pcached = &default_lit_sections.lit4_seg;
11628 1.1.1.5 christos else
11629 1.1 skrll pcached = &default_lit_sections.lit_seg;
11630 1.1 skrll
11631 1.1 skrll if (*pcached)
11632 1.1 skrll return *pcached;
11633 1.1 skrll
11634 1.1.1.5 christos text_name = default_lit_sections.lit_prefix;
11635 1.1.1.5 christos if (! text_name || ! *text_name)
11636 1.1 skrll {
11637 1.1 skrll text_name = segment_name (current_section);
11638 1.1 skrll group_name = elf_group_name (current_section);
11639 1.1 skrll linkonce = (current_section->flags & SEC_LINK_ONCE) != 0;
11640 1.1.1.2 christos }
11641 1.1.1.2 christos
11642 1.1 skrll base_name = use_abs_literals ? ".lit4" : ".literal";
11643 1.1.1.2 christos if (group_name)
11644 1.1.1.2 christos {
11645 1.1.1.2 christos name = concat (base_name, ".", group_name, (char *) NULL);
11646 1.1 skrll }
11647 1.1 skrll else if (strncmp (text_name, ".gnu.linkonce.", linkonce_len) == 0)
11648 1.1.1.5 christos {
11649 1.1.1.2 christos suffix = strchr (text_name + linkonce_len, '.');
11650 1.1.1.2 christos
11651 1.1.1.2 christos name = concat (".gnu.linkonce", base_name, suffix ? suffix : "",
11652 1.1.1.2 christos (char *) NULL);
11653 1.1.1.2 christos linkonce = TRUE;
11654 1.1.1.2 christos }
11655 1.1.1.2 christos else
11656 1.1.1.2 christos {
11657 1.1.1.2 christos /* If the section name begins or ends with ".text", then replace
11658 1.1.1.2 christos that portion instead of appending an additional suffix. */
11659 1.1 skrll size_t len = strlen (text_name);
11660 1.1 skrll if (len >= 5
11661 1.1 skrll && (strcmp (text_name + len - 5, ".text") == 0
11662 1.1 skrll || strncmp (text_name, ".text", 5) == 0))
11663 1.1 skrll len -= 5;
11664 1.1 skrll
11665 1.1 skrll name = XNEWVEC (char, len + strlen (base_name) + 1);
11666 1.1 skrll if (strncmp (text_name, ".text", 5) == 0)
11667 1.1 skrll {
11668 1.1 skrll strcpy (name, base_name);
11669 1.1 skrll strcat (name, text_name + 5);
11670 1.1 skrll }
11671 1.1 skrll else
11672 1.1 skrll {
11673 1.1 skrll strcpy (name, text_name);
11674 1.1 skrll strcpy (name + len, base_name);
11675 1.1 skrll }
11676 1.1 skrll }
11677 1.1.1.5 christos
11678 1.1 skrll /* Canonicalize section names to allow renaming literal sections.
11679 1.1 skrll The group name, if any, came from the current text section and
11680 1.1 skrll has already been canonicalized. */
11681 1.1 skrll name = tc_canonicalize_symbol_name (name);
11682 1.1 skrll
11683 1.1 skrll seg = bfd_get_section_by_name_if (stdoutput, name, match_section_group,
11684 1.1 skrll (void *) group_name);
11685 1.1 skrll if (! seg)
11686 1.1 skrll {
11687 1.1 skrll flagword flags;
11688 1.1 skrll
11689 1.1.1.8 christos seg = subseg_force_new (name, 0);
11690 1.1.1.8 christos
11691 1.1 skrll if (! use_abs_literals)
11692 1.1 skrll {
11693 1.1 skrll /* Add the newly created literal segment to the list. */
11694 1.1 skrll seg_list *n = XNEW (seg_list);
11695 1.1 skrll n->seg = seg;
11696 1.1 skrll n->next = literal_head->next;
11697 1.1 skrll literal_head->next = n;
11698 1.1 skrll }
11699 1.1 skrll
11700 1.1 skrll flags = (SEC_HAS_CONTENTS | SEC_READONLY | SEC_ALLOC | SEC_LOAD
11701 1.1 skrll | (linkonce ? (SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD) : 0)
11702 1.1 skrll | (use_abs_literals ? SEC_DATA : SEC_CODE));
11703 1.1 skrll
11704 1.1 skrll elf_group_name (seg) = group_name;
11705 1.1 skrll
11706 1.1 skrll bfd_set_section_flags (seg, flags);
11707 1.1 skrll bfd_set_section_alignment (seg, 2);
11708 1.1 skrll }
11709 1.1 skrll
11710 1.1 skrll *pcached = seg;
11711 1.1 skrll subseg_set (current_section, current_subsec);
11712 1.1 skrll return seg;
11713 1.1 skrll }
11714 1.1 skrll
11715 1.1 skrll
11716 1.1 skrll /* Property Tables Stuff. */
11718 1.1 skrll
11719 1.1 skrll #define XTENSA_INSN_SEC_NAME ".xt.insn"
11720 1.1 skrll #define XTENSA_LIT_SEC_NAME ".xt.lit"
11721 1.1.1.2 christos #define XTENSA_PROP_SEC_NAME ".xt.prop"
11722 1.1 skrll
11723 1.1 skrll typedef bfd_boolean (*frag_predicate) (const fragS *);
11724 1.1 skrll typedef void (*frag_flags_fn) (const fragS *, frag_flags *);
11725 1.1 skrll
11726 1.1 skrll static bfd_boolean get_frag_is_literal (const fragS *);
11727 1.1 skrll static void xtensa_create_property_segments
11728 1.1 skrll (frag_predicate, frag_predicate, const char *, xt_section_type);
11729 1.1 skrll static void xtensa_create_xproperty_segments
11730 1.1 skrll (frag_flags_fn, const char *, xt_section_type);
11731 1.1 skrll static bfd_boolean exclude_section_from_property_tables (segT);
11732 1.1 skrll static bfd_boolean section_has_property (segT, frag_predicate);
11733 1.1 skrll static bfd_boolean section_has_xproperty (segT, frag_flags_fn);
11734 1.1 skrll static void add_xt_block_frags
11735 1.1 skrll (segT, xtensa_block_info **, frag_predicate, frag_predicate);
11736 1.1 skrll static bfd_boolean xtensa_frag_flags_is_empty (const frag_flags *);
11737 1.1 skrll static void xtensa_frag_flags_init (frag_flags *);
11738 1.1 skrll static void get_frag_property_flags (const fragS *, frag_flags *);
11739 1.1 skrll static flagword frag_flags_to_number (const frag_flags *);
11740 1.1 skrll static void add_xt_prop_frags (segT, xtensa_block_info **, frag_flags_fn);
11741 1.1 skrll
11742 1.1 skrll /* Set up property tables after relaxation. */
11743 1.1 skrll
11744 1.1 skrll void
11745 1.1 skrll xtensa_post_relax_hook (void)
11746 1.1 skrll {
11747 1.1 skrll xtensa_move_seg_list_to_beginning (literal_head);
11748 1.1 skrll
11749 1.1 skrll xtensa_find_unmarked_state_frags ();
11750 1.1 skrll xtensa_mark_frags_for_org ();
11751 1.1 skrll xtensa_mark_difference_of_two_symbols ();
11752 1.1 skrll
11753 1.1 skrll xtensa_create_property_segments (get_frag_is_literal,
11754 1.1.1.2 christos NULL,
11755 1.1 skrll XTENSA_LIT_SEC_NAME,
11756 1.1 skrll xt_literal_sec);
11757 1.1 skrll xtensa_create_xproperty_segments (get_frag_property_flags,
11758 1.1 skrll XTENSA_PROP_SEC_NAME,
11759 1.1 skrll xt_prop_sec);
11760 1.1 skrll
11761 1.1 skrll if (warn_unaligned_branch_targets)
11762 1.1 skrll bfd_map_over_sections (stdoutput, xtensa_find_unaligned_branch_targets, 0);
11763 1.1 skrll bfd_map_over_sections (stdoutput, xtensa_find_unaligned_loops, 0);
11764 1.1 skrll }
11765 1.1 skrll
11766 1.1 skrll
11767 1.1 skrll /* This function is only meaningful after xtensa_move_literals. */
11768 1.1 skrll
11769 1.1 skrll static bfd_boolean
11770 1.1 skrll get_frag_is_literal (const fragS *fragP)
11771 1.1 skrll {
11772 1.1 skrll gas_assert (fragP != NULL);
11773 1.1 skrll return fragP->tc_frag_data.is_literal;
11774 1.1 skrll }
11775 1.1 skrll
11776 1.1 skrll
11777 1.1 skrll static void
11778 1.1 skrll xtensa_create_property_segments (frag_predicate property_function,
11779 1.1 skrll frag_predicate end_property_function,
11780 1.1 skrll const char *section_name_base,
11781 1.1 skrll xt_section_type sec_type)
11782 1.1 skrll {
11783 1.1 skrll segT *seclist;
11784 1.1 skrll
11785 1.1 skrll /* Walk over all of the current segments.
11786 1.1 skrll Walk over each fragment
11787 1.1 skrll For each non-empty fragment,
11788 1.1 skrll Build a property record (append where possible). */
11789 1.1 skrll
11790 1.1 skrll for (seclist = &stdoutput->sections;
11791 1.1 skrll seclist && *seclist;
11792 1.1 skrll seclist = &(*seclist)->next)
11793 1.1 skrll {
11794 1.1 skrll segT sec = *seclist;
11795 1.1 skrll
11796 1.1 skrll if (exclude_section_from_property_tables (sec))
11797 1.1 skrll continue;
11798 1.1 skrll
11799 1.1 skrll if (section_has_property (sec, property_function))
11800 1.1 skrll {
11801 1.1 skrll segment_info_type *xt_seg_info;
11802 1.1 skrll xtensa_block_info **xt_blocks;
11803 1.1 skrll segT prop_sec = xtensa_make_property_section (sec, section_name_base);
11804 1.1 skrll
11805 1.1 skrll prop_sec->output_section = prop_sec;
11806 1.1 skrll subseg_set (prop_sec, 0);
11807 1.1 skrll xt_seg_info = seg_info (prop_sec);
11808 1.1 skrll xt_blocks = &xt_seg_info->tc_segment_info_data.blocks[sec_type];
11809 1.1 skrll
11810 1.1 skrll /* Walk over all of the frchains here and add new sections. */
11811 1.1 skrll add_xt_block_frags (sec, xt_blocks, property_function,
11812 1.1 skrll end_property_function);
11813 1.1 skrll }
11814 1.1 skrll }
11815 1.1 skrll
11816 1.1 skrll /* Now we fill them out.... */
11817 1.1 skrll
11818 1.1 skrll for (seclist = &stdoutput->sections;
11819 1.1 skrll seclist && *seclist;
11820 1.1 skrll seclist = &(*seclist)->next)
11821 1.1.1.8 christos {
11822 1.1 skrll segment_info_type *seginfo;
11823 1.1 skrll xtensa_block_info *block;
11824 1.1 skrll segT sec = *seclist;
11825 1.1 skrll
11826 1.1 skrll seginfo = seg_info (sec);
11827 1.1 skrll block = seginfo->tc_segment_info_data.blocks[sec_type];
11828 1.1 skrll
11829 1.1 skrll if (block)
11830 1.1 skrll {
11831 1.1 skrll xtensa_block_info *cur_block;
11832 1.1 skrll int num_recs = 0;
11833 1.1 skrll bfd_size_type rec_size;
11834 1.1 skrll
11835 1.1 skrll for (cur_block = block; cur_block; cur_block = cur_block->next)
11836 1.1.1.2 christos num_recs++;
11837 1.1 skrll
11838 1.1 skrll rec_size = num_recs * 8;
11839 1.1 skrll bfd_set_section_size (sec, rec_size);
11840 1.1 skrll
11841 1.1 skrll if (num_recs)
11842 1.1 skrll {
11843 1.1 skrll char *frag_data;
11844 1.1 skrll int i;
11845 1.1 skrll
11846 1.1 skrll subseg_set (sec, 0);
11847 1.1 skrll frag_data = frag_more (rec_size);
11848 1.1 skrll cur_block = block;
11849 1.1 skrll for (i = 0; i < num_recs; i++)
11850 1.1 skrll {
11851 1.1 skrll fixS *fix;
11852 1.1 skrll
11853 1.1 skrll /* Write the fixup. */
11854 1.1 skrll gas_assert (cur_block);
11855 1.1 skrll fix = fix_new (frag_now, i * 8, 4,
11856 1.1 skrll section_symbol (cur_block->sec),
11857 1.1 skrll cur_block->offset,
11858 1.1 skrll FALSE, BFD_RELOC_32);
11859 1.1 skrll fix->fx_file = "<internal>";
11860 1.1 skrll fix->fx_line = 0;
11861 1.1 skrll
11862 1.1 skrll /* Write the length. */
11863 1.1 skrll md_number_to_chars (&frag_data[4 + i * 8],
11864 1.1 skrll cur_block->size, 4);
11865 1.1 skrll cur_block = cur_block->next;
11866 1.1 skrll }
11867 1.1 skrll frag_wane (frag_now);
11868 1.1 skrll frag_new (0);
11869 1.1 skrll frag_wane (frag_now);
11870 1.1 skrll }
11871 1.1 skrll }
11872 1.1 skrll }
11873 1.1 skrll }
11874 1.1 skrll
11875 1.1 skrll
11876 1.1 skrll static void
11877 1.1 skrll xtensa_create_xproperty_segments (frag_flags_fn flag_fn,
11878 1.1 skrll const char *section_name_base,
11879 1.1 skrll xt_section_type sec_type)
11880 1.1 skrll {
11881 1.1 skrll segT *seclist;
11882 1.1 skrll
11883 1.1 skrll /* Walk over all of the current segments.
11884 1.1 skrll Walk over each fragment.
11885 1.1 skrll For each fragment that has instructions,
11886 1.1 skrll build an instruction record (append where possible). */
11887 1.1 skrll
11888 1.1 skrll for (seclist = &stdoutput->sections;
11889 1.1 skrll seclist && *seclist;
11890 1.1 skrll seclist = &(*seclist)->next)
11891 1.1 skrll {
11892 1.1 skrll segT sec = *seclist;
11893 1.1 skrll
11894 1.1 skrll if (exclude_section_from_property_tables (sec))
11895 1.1 skrll continue;
11896 1.1 skrll
11897 1.1 skrll if (section_has_xproperty (sec, flag_fn))
11898 1.1 skrll {
11899 1.1 skrll segment_info_type *xt_seg_info;
11900 1.1 skrll xtensa_block_info **xt_blocks;
11901 1.1 skrll segT prop_sec = xtensa_make_property_section (sec, section_name_base);
11902 1.1 skrll
11903 1.1 skrll prop_sec->output_section = prop_sec;
11904 1.1 skrll subseg_set (prop_sec, 0);
11905 1.1 skrll xt_seg_info = seg_info (prop_sec);
11906 1.1 skrll xt_blocks = &xt_seg_info->tc_segment_info_data.blocks[sec_type];
11907 1.1 skrll
11908 1.1 skrll /* Walk over all of the frchains here and add new sections. */
11909 1.1 skrll add_xt_prop_frags (sec, xt_blocks, flag_fn);
11910 1.1 skrll }
11911 1.1 skrll }
11912 1.1 skrll
11913 1.1 skrll /* Now we fill them out.... */
11914 1.1 skrll
11915 1.1 skrll for (seclist = &stdoutput->sections;
11916 1.1 skrll seclist && *seclist;
11917 1.1 skrll seclist = &(*seclist)->next)
11918 1.1.1.8 christos {
11919 1.1 skrll segment_info_type *seginfo;
11920 1.1 skrll xtensa_block_info *block;
11921 1.1 skrll segT sec = *seclist;
11922 1.1 skrll
11923 1.1 skrll seginfo = seg_info (sec);
11924 1.1 skrll block = seginfo->tc_segment_info_data.blocks[sec_type];
11925 1.1 skrll
11926 1.1 skrll if (block)
11927 1.1 skrll {
11928 1.1 skrll xtensa_block_info *cur_block;
11929 1.1 skrll int num_recs = 0;
11930 1.1 skrll bfd_size_type rec_size;
11931 1.1 skrll
11932 1.1 skrll for (cur_block = block; cur_block; cur_block = cur_block->next)
11933 1.1 skrll num_recs++;
11934 1.1.1.2 christos
11935 1.1 skrll rec_size = num_recs * (8 + 4);
11936 1.1 skrll bfd_set_section_size (sec, rec_size);
11937 1.1 skrll /* elf_section_data (sec)->this_hdr.sh_entsize = 12; */
11938 1.1 skrll
11939 1.1 skrll if (num_recs)
11940 1.1 skrll {
11941 1.1 skrll char *frag_data;
11942 1.1 skrll int i;
11943 1.1 skrll
11944 1.1 skrll subseg_set (sec, 0);
11945 1.1 skrll frag_data = frag_more (rec_size);
11946 1.1 skrll cur_block = block;
11947 1.1.1.2 christos for (i = 0; i < num_recs; i++)
11948 1.1 skrll {
11949 1.1 skrll fixS *fix;
11950 1.1 skrll
11951 1.1 skrll /* Write the fixup. */
11952 1.1 skrll gas_assert (cur_block);
11953 1.1 skrll fix = fix_new (frag_now, i * 12, 4,
11954 1.1 skrll section_symbol (cur_block->sec),
11955 1.1 skrll cur_block->offset,
11956 1.1 skrll FALSE, BFD_RELOC_32);
11957 1.1 skrll fix->fx_file = "<internal>";
11958 1.1 skrll fix->fx_line = 0;
11959 1.1 skrll
11960 1.1 skrll /* Write the length. */
11961 1.1 skrll md_number_to_chars (&frag_data[4 + i * 12],
11962 1.1.1.8 christos cur_block->size, 4);
11963 1.1 skrll md_number_to_chars (&frag_data[8 + i * 12],
11964 1.1 skrll frag_flags_to_number (&cur_block->flags),
11965 1.1 skrll sizeof (flagword));
11966 1.1 skrll cur_block = cur_block->next;
11967 1.1 skrll }
11968 1.1 skrll frag_wane (frag_now);
11969 1.1 skrll frag_new (0);
11970 1.1 skrll frag_wane (frag_now);
11971 1.1 skrll }
11972 1.1 skrll }
11973 1.1 skrll }
11974 1.1 skrll }
11975 1.1 skrll
11976 1.1 skrll
11977 1.1 skrll static bfd_boolean
11978 1.1 skrll exclude_section_from_property_tables (segT sec)
11979 1.1 skrll {
11980 1.1 skrll flagword flags = bfd_section_flags (sec);
11981 1.1 skrll
11982 1.1 skrll /* Sections that don't contribute to the memory footprint are excluded. */
11983 1.1 skrll if ((flags & SEC_DEBUGGING)
11984 1.1 skrll || !(flags & SEC_ALLOC)
11985 1.1 skrll || (flags & SEC_MERGE))
11986 1.1 skrll return TRUE;
11987 1.1 skrll
11988 1.1 skrll /* Linker cie and fde optimizations mess up property entries for
11989 1.1 skrll eh_frame sections, but there is nothing inside them relevant to
11990 1.1 skrll property tables anyway. */
11991 1.1 skrll if (strcmp (sec->name, ".eh_frame") == 0)
11992 1.1 skrll return TRUE;
11993 1.1 skrll
11994 1.1 skrll return FALSE;
11995 1.1 skrll }
11996 1.1 skrll
11997 1.1 skrll
11998 1.1 skrll static bfd_boolean
11999 1.1 skrll section_has_property (segT sec, frag_predicate property_function)
12000 1.1 skrll {
12001 1.1 skrll segment_info_type *seginfo = seg_info (sec);
12002 1.1 skrll fragS *fragP;
12003 1.1 skrll
12004 1.1 skrll if (seginfo && seginfo->frchainP)
12005 1.1 skrll {
12006 1.1 skrll for (fragP = seginfo->frchainP->frch_root; fragP; fragP = fragP->fr_next)
12007 1.1 skrll {
12008 1.1 skrll if (property_function (fragP)
12009 1.1 skrll && (fragP->fr_type != rs_fill || fragP->fr_fix != 0))
12010 1.1 skrll return TRUE;
12011 1.1 skrll }
12012 1.1 skrll }
12013 1.1 skrll return FALSE;
12014 1.1 skrll }
12015 1.1 skrll
12016 1.1 skrll
12017 1.1 skrll static bfd_boolean
12018 1.1 skrll section_has_xproperty (segT sec, frag_flags_fn property_function)
12019 1.1 skrll {
12020 1.1 skrll segment_info_type *seginfo = seg_info (sec);
12021 1.1 skrll fragS *fragP;
12022 1.1 skrll
12023 1.1 skrll if (seginfo && seginfo->frchainP)
12024 1.1 skrll {
12025 1.1 skrll for (fragP = seginfo->frchainP->frch_root; fragP; fragP = fragP->fr_next)
12026 1.1 skrll {
12027 1.1 skrll frag_flags prop_flags;
12028 1.1 skrll property_function (fragP, &prop_flags);
12029 1.1 skrll if (!xtensa_frag_flags_is_empty (&prop_flags))
12030 1.1 skrll return TRUE;
12031 1.1 skrll }
12032 1.1 skrll }
12033 1.1 skrll return FALSE;
12034 1.1 skrll }
12035 1.1 skrll
12036 1.1 skrll
12037 1.1 skrll /* Two types of block sections exist right now: literal and insns. */
12038 1.1 skrll
12039 1.1 skrll static void
12040 1.1 skrll add_xt_block_frags (segT sec,
12041 1.1 skrll xtensa_block_info **xt_block,
12042 1.1 skrll frag_predicate property_function,
12043 1.1 skrll frag_predicate end_property_function)
12044 1.1 skrll {
12045 1.1 skrll fragS *fragP;
12046 1.1 skrll
12047 1.1 skrll /* Build it if needed. */
12048 1.1 skrll while (*xt_block != NULL)
12049 1.1 skrll xt_block = &(*xt_block)->next;
12050 1.1 skrll /* We are either at NULL at the beginning or at the end. */
12051 1.1 skrll
12052 1.1 skrll /* Walk through the frags. */
12053 1.1 skrll if (seg_info (sec)->frchainP)
12054 1.1.1.5 christos {
12055 1.1 skrll for (fragP = seg_info (sec)->frchainP->frch_root;
12056 1.1 skrll fragP;
12057 1.1 skrll fragP = fragP->fr_next)
12058 1.1 skrll {
12059 1.1 skrll if (property_function (fragP)
12060 1.1 skrll && (fragP->fr_type != rs_fill || fragP->fr_fix != 0))
12061 1.1 skrll {
12062 1.1 skrll if (*xt_block != NULL)
12063 1.1 skrll {
12064 1.1 skrll if ((*xt_block)->offset + (*xt_block)->size
12065 1.1 skrll == fragP->fr_address)
12066 1.1 skrll (*xt_block)->size += fragP->fr_fix;
12067 1.1 skrll else
12068 1.1 skrll xt_block = &((*xt_block)->next);
12069 1.1 skrll }
12070 1.1 skrll if (*xt_block == NULL)
12071 1.1 skrll {
12072 1.1 skrll xtensa_block_info *new_block = XNEW (xtensa_block_info);
12073 1.1 skrll new_block->sec = sec;
12074 1.1 skrll new_block->offset = fragP->fr_address;
12075 1.1 skrll new_block->size = fragP->fr_fix;
12076 1.1 skrll new_block->next = NULL;
12077 1.1 skrll xtensa_frag_flags_init (&new_block->flags);
12078 1.1 skrll *xt_block = new_block;
12079 1.1 skrll }
12080 1.1 skrll if (end_property_function
12081 1.1 skrll && end_property_function (fragP))
12082 1.1 skrll {
12083 1.1 skrll xt_block = &((*xt_block)->next);
12084 1.1 skrll }
12085 1.1 skrll }
12086 1.1 skrll }
12087 1.1 skrll }
12088 1.1 skrll }
12089 1.1 skrll
12090 1.1 skrll
12091 1.1 skrll /* Break the encapsulation of add_xt_prop_frags here. */
12092 1.1 skrll
12093 1.1 skrll static bfd_boolean
12094 1.1 skrll xtensa_frag_flags_is_empty (const frag_flags *prop_flags)
12095 1.1 skrll {
12096 1.1 skrll if (prop_flags->is_literal
12097 1.1 skrll || prop_flags->is_insn
12098 1.1 skrll || prop_flags->is_data
12099 1.1 skrll || prop_flags->is_unreachable)
12100 1.1 skrll return FALSE;
12101 1.1 skrll return TRUE;
12102 1.1 skrll }
12103 1.1 skrll
12104 1.1 skrll
12105 1.1 skrll static void
12106 1.1 skrll xtensa_frag_flags_init (frag_flags *prop_flags)
12107 1.1 skrll {
12108 1.1 skrll memset (prop_flags, 0, sizeof (frag_flags));
12109 1.1 skrll }
12110 1.1 skrll
12111 1.1 skrll
12112 1.1 skrll static void
12113 1.1 skrll get_frag_property_flags (const fragS *fragP, frag_flags *prop_flags)
12114 1.1 skrll {
12115 1.1 skrll xtensa_frag_flags_init (prop_flags);
12116 1.1 skrll if (fragP->tc_frag_data.is_literal)
12117 1.1 skrll prop_flags->is_literal = TRUE;
12118 1.1 skrll if (fragP->tc_frag_data.is_specific_opcode
12119 1.1 skrll || fragP->tc_frag_data.is_no_transform)
12120 1.1 skrll {
12121 1.1 skrll prop_flags->is_no_transform = TRUE;
12122 1.1 skrll if (xtensa_frag_flags_is_empty (prop_flags))
12123 1.1 skrll prop_flags->is_data = TRUE;
12124 1.1 skrll }
12125 1.1 skrll if (fragP->tc_frag_data.is_unreachable)
12126 1.1 skrll prop_flags->is_unreachable = TRUE;
12127 1.1 skrll else if (fragP->tc_frag_data.is_insn)
12128 1.1 skrll {
12129 1.1 skrll prop_flags->is_insn = TRUE;
12130 1.1 skrll if (fragP->tc_frag_data.is_loop_target)
12131 1.1.1.2 christos prop_flags->insn.is_loop_target = TRUE;
12132 1.1 skrll if (fragP->tc_frag_data.is_branch_target)
12133 1.1 skrll prop_flags->insn.is_branch_target = TRUE;
12134 1.1.1.2 christos if (fragP->tc_frag_data.is_no_density)
12135 1.1 skrll prop_flags->insn.is_no_density = TRUE;
12136 1.1 skrll if (fragP->tc_frag_data.use_absolute_literals)
12137 1.1 skrll prop_flags->insn.is_abslit = TRUE;
12138 1.1 skrll }
12139 1.1 skrll if (fragP->tc_frag_data.is_align)
12140 1.1 skrll {
12141 1.1 skrll prop_flags->is_align = TRUE;
12142 1.1 skrll prop_flags->alignment = fragP->tc_frag_data.alignment;
12143 1.1 skrll if (xtensa_frag_flags_is_empty (prop_flags))
12144 1.1 skrll prop_flags->is_data = TRUE;
12145 1.1 skrll }
12146 1.1 skrll }
12147 1.1 skrll
12148 1.1 skrll
12149 1.1 skrll static flagword
12150 1.1 skrll frag_flags_to_number (const frag_flags *prop_flags)
12151 1.1 skrll {
12152 1.1 skrll flagword num = 0;
12153 1.1 skrll if (prop_flags->is_literal)
12154 1.1 skrll num |= XTENSA_PROP_LITERAL;
12155 1.1 skrll if (prop_flags->is_insn)
12156 1.1 skrll num |= XTENSA_PROP_INSN;
12157 1.1 skrll if (prop_flags->is_data)
12158 1.1 skrll num |= XTENSA_PROP_DATA;
12159 1.1 skrll if (prop_flags->is_unreachable)
12160 1.1 skrll num |= XTENSA_PROP_UNREACHABLE;
12161 1.1 skrll if (prop_flags->insn.is_loop_target)
12162 1.1 skrll num |= XTENSA_PROP_INSN_LOOP_TARGET;
12163 1.1 skrll if (prop_flags->insn.is_branch_target)
12164 1.1 skrll {
12165 1.1 skrll num |= XTENSA_PROP_INSN_BRANCH_TARGET;
12166 1.1 skrll num = SET_XTENSA_PROP_BT_ALIGN (num, prop_flags->insn.bt_align_priority);
12167 1.1 skrll }
12168 1.1 skrll
12169 1.1 skrll if (prop_flags->insn.is_no_density)
12170 1.1 skrll num |= XTENSA_PROP_INSN_NO_DENSITY;
12171 1.1 skrll if (prop_flags->is_no_transform)
12172 1.1 skrll num |= XTENSA_PROP_NO_TRANSFORM;
12173 1.1 skrll if (prop_flags->insn.is_no_reorder)
12174 1.1 skrll num |= XTENSA_PROP_INSN_NO_REORDER;
12175 1.1 skrll if (prop_flags->insn.is_abslit)
12176 1.1 skrll num |= XTENSA_PROP_INSN_ABSLIT;
12177 1.1 skrll
12178 1.1 skrll if (prop_flags->is_align)
12179 1.1 skrll {
12180 1.1 skrll num |= XTENSA_PROP_ALIGN;
12181 1.1 skrll num = SET_XTENSA_PROP_ALIGNMENT (num, prop_flags->alignment);
12182 1.1 skrll }
12183 1.1 skrll
12184 1.1 skrll return num;
12185 1.1 skrll }
12186 1.1 skrll
12187 1.1 skrll
12188 1.1 skrll static bfd_boolean
12189 1.1 skrll xtensa_frag_flags_combinable (const frag_flags *prop_flags_1,
12190 1.1 skrll const frag_flags *prop_flags_2)
12191 1.1 skrll {
12192 1.1 skrll /* Cannot combine with an end marker. */
12193 1.1 skrll
12194 1.1 skrll if (prop_flags_1->is_literal != prop_flags_2->is_literal)
12195 1.1 skrll return FALSE;
12196 1.1 skrll if (prop_flags_1->is_insn != prop_flags_2->is_insn)
12197 1.1 skrll return FALSE;
12198 1.1 skrll if (prop_flags_1->is_data != prop_flags_2->is_data)
12199 1.1 skrll return FALSE;
12200 1.1 skrll
12201 1.1 skrll if (prop_flags_1->is_insn)
12202 1.1 skrll {
12203 1.1 skrll /* Properties of the beginning of the frag. */
12204 1.1 skrll if (prop_flags_2->insn.is_loop_target)
12205 1.1 skrll return FALSE;
12206 1.1 skrll if (prop_flags_2->insn.is_branch_target)
12207 1.1 skrll return FALSE;
12208 1.1 skrll if (prop_flags_1->insn.is_no_density !=
12209 1.1 skrll prop_flags_2->insn.is_no_density)
12210 1.1 skrll return FALSE;
12211 1.1 skrll if (prop_flags_1->is_no_transform !=
12212 1.1 skrll prop_flags_2->is_no_transform)
12213 1.1 skrll return FALSE;
12214 1.1 skrll if (prop_flags_1->insn.is_no_reorder !=
12215 1.1 skrll prop_flags_2->insn.is_no_reorder)
12216 1.1 skrll return FALSE;
12217 1.1 skrll if (prop_flags_1->insn.is_abslit !=
12218 1.1 skrll prop_flags_2->insn.is_abslit)
12219 1.1 skrll return FALSE;
12220 1.1 skrll }
12221 1.1 skrll
12222 1.1 skrll if (prop_flags_1->is_align)
12223 1.1 skrll return FALSE;
12224 1.1 skrll
12225 1.1 skrll return TRUE;
12226 1.1 skrll }
12227 1.1 skrll
12228 1.1 skrll
12229 1.1 skrll static bfd_vma
12230 1.1 skrll xt_block_aligned_size (const xtensa_block_info *xt_block)
12231 1.1 skrll {
12232 1.1 skrll bfd_vma end_addr;
12233 1.1 skrll unsigned align_bits;
12234 1.1 skrll
12235 1.1 skrll if (!xt_block->flags.is_align)
12236 1.1 skrll return xt_block->size;
12237 1.1 skrll
12238 1.1 skrll end_addr = xt_block->offset + xt_block->size;
12239 1.1 skrll align_bits = xt_block->flags.alignment;
12240 1.1 skrll end_addr = ((end_addr + ((1 << align_bits) -1)) >> align_bits) << align_bits;
12241 1.1 skrll return end_addr - xt_block->offset;
12242 1.1 skrll }
12243 1.1 skrll
12244 1.1 skrll
12245 1.1 skrll static bfd_boolean
12246 1.1 skrll xtensa_xt_block_combine (xtensa_block_info *xt_block,
12247 1.1 skrll const xtensa_block_info *xt_block_2)
12248 1.1 skrll {
12249 1.1 skrll if (xt_block->sec != xt_block_2->sec)
12250 1.1 skrll return FALSE;
12251 1.1 skrll if (xt_block->offset + xt_block_aligned_size (xt_block)
12252 1.1 skrll != xt_block_2->offset)
12253 1.1 skrll return FALSE;
12254 1.1 skrll
12255 1.1 skrll if (xt_block_2->size == 0
12256 1.1 skrll && (!xt_block_2->flags.is_unreachable
12257 1.1 skrll || xt_block->flags.is_unreachable))
12258 1.1 skrll {
12259 1.1 skrll if (xt_block_2->flags.is_align
12260 1.1 skrll && xt_block->flags.is_align)
12261 1.1 skrll {
12262 1.1 skrll /* Nothing needed. */
12263 1.1 skrll if (xt_block->flags.alignment >= xt_block_2->flags.alignment)
12264 1.1 skrll return TRUE;
12265 1.1 skrll }
12266 1.1 skrll else
12267 1.1 skrll {
12268 1.1 skrll if (xt_block_2->flags.is_align)
12269 1.1 skrll {
12270 1.1 skrll /* Push alignment to previous entry. */
12271 1.1 skrll xt_block->flags.is_align = xt_block_2->flags.is_align;
12272 1.1 skrll xt_block->flags.alignment = xt_block_2->flags.alignment;
12273 1.1 skrll }
12274 1.1 skrll return TRUE;
12275 1.1 skrll }
12276 1.1 skrll }
12277 1.1 skrll if (!xtensa_frag_flags_combinable (&xt_block->flags,
12278 1.1 skrll &xt_block_2->flags))
12279 1.1 skrll return FALSE;
12280 1.1 skrll
12281 1.1 skrll xt_block->size += xt_block_2->size;
12282 1.1 skrll
12283 1.1 skrll if (xt_block_2->flags.is_align)
12284 1.1 skrll {
12285 1.1 skrll xt_block->flags.is_align = TRUE;
12286 1.1 skrll xt_block->flags.alignment = xt_block_2->flags.alignment;
12287 1.1 skrll }
12288 1.1 skrll
12289 1.1 skrll return TRUE;
12290 1.1 skrll }
12291 1.1 skrll
12292 1.1 skrll
12293 1.1 skrll static void
12294 1.1 skrll add_xt_prop_frags (segT sec,
12295 1.1 skrll xtensa_block_info **xt_block,
12296 1.1 skrll frag_flags_fn property_function)
12297 1.1 skrll {
12298 1.1 skrll fragS *fragP;
12299 1.1 skrll
12300 1.1 skrll /* Build it if needed. */
12301 1.1 skrll while (*xt_block != NULL)
12302 1.1 skrll {
12303 1.1 skrll xt_block = &(*xt_block)->next;
12304 1.1 skrll }
12305 1.1 skrll /* We are either at NULL at the beginning or at the end. */
12306 1.1 skrll
12307 1.1 skrll /* Walk through the frags. */
12308 1.1 skrll if (seg_info (sec)->frchainP)
12309 1.1 skrll {
12310 1.1 skrll for (fragP = seg_info (sec)->frchainP->frch_root; fragP;
12311 1.1.1.5 christos fragP = fragP->fr_next)
12312 1.1 skrll {
12313 1.1 skrll xtensa_block_info tmp_block;
12314 1.1 skrll tmp_block.sec = sec;
12315 1.1 skrll tmp_block.offset = fragP->fr_address;
12316 1.1 skrll tmp_block.size = fragP->fr_fix;
12317 1.1 skrll tmp_block.next = NULL;
12318 1.1 skrll property_function (fragP, &tmp_block.flags);
12319 1.1 skrll
12320 1.1 skrll if (!xtensa_frag_flags_is_empty (&tmp_block.flags))
12321 1.1 skrll /* && fragP->fr_fix != 0) */
12322 1.1 skrll {
12323 1.1 skrll if ((*xt_block) == NULL
12324 1.1 skrll || !xtensa_xt_block_combine (*xt_block, &tmp_block))
12325 1.1 skrll {
12326 1.1 skrll xtensa_block_info *new_block;
12327 1.1 skrll if ((*xt_block) != NULL)
12328 1.1 skrll xt_block = &(*xt_block)->next;
12329 1.1 skrll new_block = XNEW (xtensa_block_info);
12330 1.1 skrll *new_block = tmp_block;
12331 1.1 skrll *xt_block = new_block;
12332 1.1 skrll }
12333 1.1 skrll }
12334 1.1 skrll }
12335 1.1 skrll }
12336 1.1.1.5 christos }
12337 1.1.1.2 christos
12338 1.1 skrll
12339 1.1 skrll /* op_placement_info_table */
12341 1.1 skrll
12342 1.1 skrll /* op_placement_info makes it easier to determine which
12343 1.1.1.2 christos ops can go in which slots. */
12344 1.1 skrll
12345 1.1 skrll static void
12346 1.1 skrll init_op_placement_info_table (void)
12347 1.1 skrll {
12348 1.1 skrll xtensa_isa isa = xtensa_default_isa;
12349 1.1 skrll xtensa_insnbuf ibuf = xtensa_insnbuf_alloc (isa);
12350 1.1 skrll xtensa_opcode opcode;
12351 1.1 skrll xtensa_format fmt;
12352 1.1 skrll int slot;
12353 1.1 skrll int num_opcodes = xtensa_isa_num_opcodes (isa);
12354 1.1 skrll
12355 1.1 skrll op_placement_table = XNEWVEC (op_placement_info, num_opcodes);
12356 1.1 skrll gas_assert (xtensa_isa_num_formats (isa) < MAX_FORMATS);
12357 1.1 skrll
12358 1.1 skrll for (opcode = 0; opcode < num_opcodes; opcode++)
12359 1.1 skrll {
12360 1.1 skrll op_placement_info *opi = &op_placement_table[opcode];
12361 1.1 skrll /* FIXME: Make tinsn allocation dynamic. */
12362 1.1 skrll if (xtensa_opcode_num_operands (isa, opcode) > MAX_INSN_ARGS)
12363 1.1 skrll as_fatal (_("too many operands in instruction"));
12364 1.1 skrll opi->narrowest = XTENSA_UNDEFINED;
12365 1.1 skrll opi->narrowest_size = 0x7F;
12366 1.1 skrll opi->narrowest_slot = 0;
12367 1.1 skrll opi->formats = 0;
12368 1.1 skrll opi->num_formats = 0;
12369 1.1 skrll opi->issuef = 0;
12370 1.1 skrll for (fmt = 0; fmt < xtensa_isa_num_formats (isa); fmt++)
12371 1.1 skrll {
12372 1.1 skrll opi->slots[fmt] = 0;
12373 1.1 skrll for (slot = 0; slot < xtensa_format_num_slots (isa, fmt); slot++)
12374 1.1 skrll {
12375 1.1 skrll if (xtensa_opcode_encode (isa, fmt, slot, ibuf, opcode) == 0)
12376 1.1 skrll {
12377 1.1 skrll int fmt_length = xtensa_format_length (isa, fmt);
12378 1.1 skrll opi->issuef++;
12379 1.1 skrll set_bit (fmt, opi->formats);
12380 1.1 skrll set_bit (slot, opi->slots[fmt]);
12381 1.1 skrll if (fmt_length < opi->narrowest_size
12382 1.1 skrll || (fmt_length == opi->narrowest_size
12383 1.1 skrll && (xtensa_format_num_slots (isa, fmt)
12384 1.1 skrll < xtensa_format_num_slots (isa,
12385 1.1 skrll opi->narrowest))))
12386 1.1 skrll {
12387 1.1 skrll opi->narrowest = fmt;
12388 1.1 skrll opi->narrowest_size = fmt_length;
12389 1.1 skrll opi->narrowest_slot = slot;
12390 1.1 skrll }
12391 1.1 skrll }
12392 1.1 skrll }
12393 1.1 skrll if (opi->formats)
12394 1.1 skrll opi->num_formats++;
12395 1.1 skrll }
12396 1.1 skrll }
12397 1.1 skrll xtensa_insnbuf_free (isa, ibuf);
12398 1.1 skrll }
12399 1.1 skrll
12400 1.1 skrll
12401 1.1 skrll bfd_boolean
12402 1.1 skrll opcode_fits_format_slot (xtensa_opcode opcode, xtensa_format fmt, int slot)
12403 1.1 skrll {
12404 1.1 skrll return bit_is_set (slot, op_placement_table[opcode].slots[fmt]);
12405 1.1 skrll }
12406 1.1 skrll
12407 1.1 skrll
12408 1.1 skrll /* If the opcode is available in a single slot format, return its size. */
12409 1.1 skrll
12410 1.1 skrll static int
12411 1.1 skrll xg_get_single_size (xtensa_opcode opcode)
12412 1.1 skrll {
12413 1.1 skrll return op_placement_table[opcode].narrowest_size;
12414 1.1 skrll }
12415 1.1 skrll
12416 1.1 skrll
12417 1.1 skrll static xtensa_format
12418 1.1 skrll xg_get_single_format (xtensa_opcode opcode)
12419 1.1 skrll {
12420 1.1 skrll return op_placement_table[opcode].narrowest;
12421 1.1 skrll }
12422 1.1 skrll
12423 1.1 skrll
12424 1.1 skrll static int
12425 1.1 skrll xg_get_single_slot (xtensa_opcode opcode)
12426 1.1 skrll {
12427 1.1 skrll return op_placement_table[opcode].narrowest_slot;
12428 1.1 skrll }
12429 1.1 skrll
12430 1.1 skrll
12431 1.1 skrll /* Instruction Stack Functions (from "xtensa-istack.h"). */
12433 1.1 skrll
12434 1.1 skrll void
12435 1.1 skrll istack_init (IStack *stack)
12436 1.1 skrll {
12437 1.1 skrll stack->ninsn = 0;
12438 1.1 skrll }
12439 1.1 skrll
12440 1.1 skrll
12441 1.1 skrll bfd_boolean
12442 1.1.1.2 christos istack_empty (IStack *stack)
12443 1.1 skrll {
12444 1.1 skrll return (stack->ninsn == 0);
12445 1.1 skrll }
12446 1.1 skrll
12447 1.1 skrll
12448 1.1 skrll bfd_boolean
12449 1.1 skrll istack_full (IStack *stack)
12450 1.1 skrll {
12451 1.1 skrll return (stack->ninsn == MAX_ISTACK);
12452 1.1 skrll }
12453 1.1 skrll
12454 1.1.1.2 christos
12455 1.1 skrll /* Return a pointer to the top IStack entry.
12456 1.1 skrll It is an error to call this if istack_empty () is TRUE. */
12457 1.1 skrll
12458 1.1 skrll TInsn *
12459 1.1 skrll istack_top (IStack *stack)
12460 1.1 skrll {
12461 1.1 skrll int rec = stack->ninsn - 1;
12462 1.1 skrll gas_assert (!istack_empty (stack));
12463 1.1 skrll return &stack->insn[rec];
12464 1.1 skrll }
12465 1.1 skrll
12466 1.1 skrll
12467 1.1 skrll /* Add a new TInsn to an IStack.
12468 1.1.1.2 christos It is an error to call this if istack_full () is TRUE. */
12469 1.1 skrll
12470 1.1 skrll void
12471 1.1 skrll istack_push (IStack *stack, TInsn *insn)
12472 1.1 skrll {
12473 1.1 skrll int rec = stack->ninsn;
12474 1.1 skrll gas_assert (!istack_full (stack));
12475 1.1 skrll stack->insn[rec] = *insn;
12476 1.1 skrll stack->ninsn++;
12477 1.1 skrll }
12478 1.1 skrll
12479 1.1 skrll
12480 1.1 skrll /* Clear space for the next TInsn on the IStack and return a pointer
12481 1.1 skrll to it. It is an error to call this if istack_full () is TRUE. */
12482 1.1 skrll
12483 1.1.1.2 christos TInsn *
12484 1.1 skrll istack_push_space (IStack *stack)
12485 1.1 skrll {
12486 1.1 skrll int rec = stack->ninsn;
12487 1.1 skrll TInsn *insn;
12488 1.1 skrll gas_assert (!istack_full (stack));
12489 1.1 skrll insn = &stack->insn[rec];
12490 1.1 skrll tinsn_init (insn);
12491 1.1 skrll stack->ninsn++;
12492 1.1 skrll return insn;
12493 1.1 skrll }
12494 1.1 skrll
12495 1.1 skrll
12496 1.1 skrll /* Remove the last pushed instruction. It is an error to call this if
12497 1.1 skrll istack_empty () returns TRUE. */
12498 1.1 skrll
12499 1.1 skrll void
12500 1.1 skrll istack_pop (IStack *stack)
12501 1.1 skrll {
12502 1.1 skrll int rec = stack->ninsn - 1;
12503 1.1 skrll gas_assert (!istack_empty (stack));
12504 1.1 skrll stack->ninsn--;
12505 1.1 skrll tinsn_init (&stack->insn[rec]);
12506 1.1.1.2 christos }
12507 1.1 skrll
12508 1.1 skrll
12509 1.1 skrll /* TInsn functions. */
12511 1.1 skrll
12512 1.1 skrll void
12513 1.1 skrll tinsn_init (TInsn *dst)
12514 1.1 skrll {
12515 1.1 skrll memset (dst, 0, sizeof (TInsn));
12516 1.1 skrll }
12517 1.1 skrll
12518 1.1 skrll
12519 1.1 skrll /* Return TRUE if ANY of the operands in the insn are symbolic. */
12520 1.1 skrll
12521 1.1 skrll static bfd_boolean
12522 1.1 skrll tinsn_has_symbolic_operands (const TInsn *insn)
12523 1.1 skrll {
12524 1.1 skrll int i;
12525 1.1 skrll int n = insn->ntok;
12526 1.1 skrll
12527 1.1 skrll gas_assert (insn->insn_type == ITYPE_INSN);
12528 1.1 skrll
12529 1.1 skrll for (i = 0; i < n; ++i)
12530 1.1.1.2 christos {
12531 1.1 skrll switch (insn->tok[i].X_op)
12532 1.1 skrll {
12533 1.1 skrll case O_register:
12534 1.1 skrll case O_constant:
12535 1.1 skrll break;
12536 1.1 skrll default:
12537 1.1 skrll return TRUE;
12538 1.1 skrll }
12539 1.1 skrll }
12540 1.1 skrll return FALSE;
12541 1.1 skrll }
12542 1.1 skrll
12543 1.1 skrll
12544 1.1 skrll bfd_boolean
12545 1.1 skrll tinsn_has_invalid_symbolic_operands (const TInsn *insn)
12546 1.1 skrll {
12547 1.1 skrll xtensa_isa isa = xtensa_default_isa;
12548 1.1 skrll int i;
12549 1.1 skrll int n = insn->ntok;
12550 1.1 skrll
12551 1.1 skrll gas_assert (insn->insn_type == ITYPE_INSN);
12552 1.1 skrll
12553 1.1 skrll for (i = 0; i < n; ++i)
12554 1.1 skrll {
12555 1.1 skrll switch (insn->tok[i].X_op)
12556 1.1 skrll {
12557 1.1 skrll case O_register:
12558 1.1 skrll case O_constant:
12559 1.1 skrll break;
12560 1.1 skrll case O_big:
12561 1.1 skrll case O_illegal:
12562 1.1 skrll case O_absent:
12563 1.1 skrll /* Errors for these types are caught later. */
12564 1.1 skrll break;
12565 1.1 skrll case O_hi16:
12566 1.1 skrll case O_lo16:
12567 1.1 skrll default:
12568 1.1 skrll /* Symbolic immediates are only allowed on the last immediate
12569 1.1 skrll operand. At this time, CONST16 is the only opcode where we
12570 1.1 skrll support non-PC-relative relocations. */
12571 1.1 skrll if (i != get_relaxable_immed (insn->opcode)
12572 1.1 skrll || (xtensa_operand_is_PCrelative (isa, insn->opcode, i) != 1
12573 1.1 skrll && insn->opcode != xtensa_const16_opcode))
12574 1.1.1.2 christos {
12575 1.1 skrll as_bad (_("invalid symbolic operand"));
12576 1.1 skrll return TRUE;
12577 1.1 skrll }
12578 1.1 skrll }
12579 1.1 skrll }
12580 1.1 skrll return FALSE;
12581 1.1 skrll }
12582 1.1 skrll
12583 1.1 skrll
12584 1.1 skrll /* For assembly code with complex expressions (e.g. subtraction),
12585 1.1 skrll we have to build them in the literal pool so that
12586 1.1 skrll their results are calculated correctly after relaxation.
12587 1.1 skrll The relaxation only handles expressions that
12588 1.1 skrll boil down to SYMBOL + OFFSET. */
12589 1.1 skrll
12590 1.1 skrll static bfd_boolean
12591 1.1 skrll tinsn_has_complex_operands (const TInsn *insn)
12592 1.1 skrll {
12593 1.1 skrll int i;
12594 1.1 skrll int n = insn->ntok;
12595 1.1 skrll gas_assert (insn->insn_type == ITYPE_INSN);
12596 1.1 skrll for (i = 0; i < n; ++i)
12597 1.1 skrll {
12598 1.1 skrll switch (insn->tok[i].X_op)
12599 1.1 skrll {
12600 1.1 skrll case O_register:
12601 1.1 skrll case O_constant:
12602 1.1 skrll case O_symbol:
12603 1.1 skrll case O_lo16:
12604 1.1 skrll case O_hi16:
12605 1.1 skrll break;
12606 1.1 skrll default:
12607 1.1 skrll return TRUE;
12608 1.1 skrll }
12609 1.1 skrll }
12610 1.1 skrll return FALSE;
12611 1.1 skrll }
12612 1.1 skrll
12613 1.1.1.2 christos
12614 1.1 skrll /* Encode a TInsn opcode and its constant operands into slotbuf.
12615 1.1 skrll Return TRUE if there is a symbol in the immediate field. This
12616 1.1 skrll function assumes that:
12617 1.1 skrll 1) The number of operands are correct.
12618 1.1 skrll 2) The insn_type is ITYPE_INSN.
12619 1.1 skrll 3) The opcode can be encoded in the specified format and slot.
12620 1.1 skrll 4) Operands are either O_constant or O_symbol, and all constants fit. */
12621 1.1 skrll
12622 1.1 skrll static bfd_boolean
12623 1.1 skrll tinsn_to_slotbuf (xtensa_format fmt,
12624 1.1 skrll int slot,
12625 1.1 skrll TInsn *tinsn,
12626 1.1.1.2 christos xtensa_insnbuf slotbuf)
12627 1.1 skrll {
12628 1.1 skrll xtensa_isa isa = xtensa_default_isa;
12629 1.1.1.5 christos xtensa_opcode opcode = tinsn->opcode;
12630 1.1 skrll bfd_boolean has_fixup = FALSE;
12631 1.1 skrll int noperands = xtensa_opcode_num_operands (isa, opcode);
12632 1.1.1.2 christos int i;
12633 1.1 skrll
12634 1.1 skrll gas_assert (tinsn->insn_type == ITYPE_INSN);
12635 1.1 skrll if (noperands != tinsn->ntok)
12636 1.1 skrll as_fatal (_("operand number mismatch"));
12637 1.1 skrll
12638 1.1 skrll if (xtensa_opcode_encode (isa, fmt, slot, slotbuf, opcode))
12639 1.1.1.2 christos {
12640 1.1 skrll as_bad (_("cannot encode opcode \"%s\" in the given format \"%s\""),
12641 1.1 skrll xtensa_opcode_name (isa, opcode), xtensa_format_name (isa, fmt));
12642 1.1 skrll return FALSE;
12643 1.1 skrll }
12644 1.1 skrll
12645 1.1 skrll for (i = 0; i < noperands; i++)
12646 1.1 skrll {
12647 1.1 skrll expressionS *exp = &tinsn->tok[i];
12648 1.1 skrll int rc;
12649 1.1 skrll unsigned line;
12650 1.1.1.5 christos const char *file_name;
12651 1.1 skrll uint32 opnd_value;
12652 1.1 skrll
12653 1.1 skrll switch (exp->X_op)
12654 1.1.1.2 christos {
12655 1.1 skrll case O_register:
12656 1.1 skrll if (xtensa_operand_is_visible (isa, opcode, i) == 0)
12657 1.1 skrll break;
12658 1.1 skrll /* The register number has already been checked in
12659 1.1 skrll expression_maybe_register, so we don't need to check here. */
12660 1.1 skrll opnd_value = exp->X_add_number;
12661 1.1 skrll (void) xtensa_operand_encode (isa, opcode, i, &opnd_value);
12662 1.1 skrll rc = xtensa_operand_set_field (isa, opcode, i, fmt, slot, slotbuf,
12663 1.1 skrll opnd_value);
12664 1.1 skrll if (rc != 0)
12665 1.1 skrll as_warn (_("xtensa-isa failure: %s"), xtensa_isa_error_msg (isa));
12666 1.1 skrll break;
12667 1.1 skrll
12668 1.1 skrll case O_constant:
12669 1.1 skrll if (xtensa_operand_is_visible (isa, opcode, i) == 0)
12670 1.1 skrll break;
12671 1.1 skrll file_name = as_where (&line);
12672 1.1 skrll /* It is a constant and we called this function
12673 1.1 skrll then we have to try to fit it. */
12674 1.1 skrll xtensa_insnbuf_set_operand (slotbuf, fmt, slot, opcode, i,
12675 1.1 skrll exp->X_add_number, file_name, line);
12676 1.1 skrll break;
12677 1.1 skrll
12678 1.1 skrll default:
12679 1.1 skrll has_fixup = TRUE;
12680 1.1 skrll break;
12681 1.1 skrll }
12682 1.1 skrll }
12683 1.1 skrll
12684 1.1 skrll return has_fixup;
12685 1.1 skrll }
12686 1.1 skrll
12687 1.1 skrll
12688 1.1 skrll /* Encode a single TInsn into an insnbuf. If the opcode can only be encoded
12689 1.1 skrll into a multi-slot instruction, fill the other slots with NOPs.
12690 1.1 skrll Return TRUE if there is a symbol in the immediate field. See also the
12691 1.1 skrll assumptions listed for tinsn_to_slotbuf. */
12692 1.1 skrll
12693 1.1 skrll static bfd_boolean
12694 1.1 skrll tinsn_to_insnbuf (TInsn *tinsn, xtensa_insnbuf insnbuf)
12695 1.1 skrll {
12696 1.1 skrll static xtensa_insnbuf slotbuf = 0;
12697 1.1 skrll static vliw_insn vinsn;
12698 1.1 skrll xtensa_isa isa = xtensa_default_isa;
12699 1.1 skrll bfd_boolean has_fixup = FALSE;
12700 1.1 skrll int i;
12701 1.1 skrll
12702 1.1 skrll if (!slotbuf)
12703 1.1 skrll {
12704 1.1 skrll slotbuf = xtensa_insnbuf_alloc (isa);
12705 1.1 skrll xg_init_vinsn (&vinsn);
12706 1.1 skrll }
12707 1.1 skrll
12708 1.1 skrll xg_clear_vinsn (&vinsn);
12709 1.1 skrll
12710 1.1 skrll bundle_tinsn (tinsn, &vinsn);
12711 1.1 skrll
12712 1.1.1.2 christos xtensa_format_encode (isa, vinsn.format, insnbuf);
12713 1.1.1.2 christos
12714 1.1.1.2 christos for (i = 0; i < vinsn.num_slots; i++)
12715 1.1.1.2 christos {
12716 1.1.1.2 christos /* Only one slot may have a fix-up because the rest contains NOPs. */
12717 1.1.1.2 christos has_fixup |=
12718 1.1 skrll tinsn_to_slotbuf (vinsn.format, i, &vinsn.slots[i], vinsn.slotbuf[i]);
12719 1.1 skrll xtensa_format_set_slot (isa, vinsn.format, i, insnbuf, vinsn.slotbuf[i]);
12720 1.1 skrll }
12721 1.1 skrll
12722 1.1 skrll return has_fixup;
12723 1.1 skrll }
12724 1.1 skrll
12725 1.1 skrll
12726 1.1 skrll /* Check the instruction arguments. Return TRUE on failure. */
12727 1.1 skrll
12728 1.1 skrll static bfd_boolean
12729 1.1 skrll tinsn_check_arguments (const TInsn *insn)
12730 1.1 skrll {
12731 1.1 skrll xtensa_isa isa = xtensa_default_isa;
12732 1.1 skrll xtensa_opcode opcode = insn->opcode;
12733 1.1 skrll xtensa_regfile t1_regfile, t2_regfile;
12734 1.1 skrll int t1_reg, t2_reg;
12735 1.1 skrll int t1_base_reg, t1_last_reg;
12736 1.1.1.2 christos int t2_base_reg, t2_last_reg;
12737 1.1.1.2 christos char t1_inout, t2_inout;
12738 1.1.1.2 christos int i, j;
12739 1.1.1.2 christos
12740 1.1.1.2 christos if (opcode == XTENSA_UNDEFINED)
12741 1.1.1.2 christos {
12742 1.1.1.2 christos as_bad (_("invalid opcode"));
12743 1.1.1.2 christos return TRUE;
12744 1.1.1.2 christos }
12745 1.1.1.2 christos
12746 1.1.1.2 christos if (xtensa_opcode_num_operands (isa, opcode) > insn->ntok)
12747 1.1.1.2 christos {
12748 1.1.1.2 christos as_bad (_("too few operands"));
12749 1.1.1.2 christos return TRUE;
12750 1.1.1.2 christos }
12751 1.1.1.2 christos
12752 1.1.1.2 christos if (xtensa_opcode_num_operands (isa, opcode) < insn->ntok)
12753 1.1.1.2 christos {
12754 1.1.1.2 christos as_bad (_("too many operands"));
12755 1.1.1.2 christos return TRUE;
12756 1.1.1.2 christos }
12757 1.1.1.2 christos
12758 1.1.1.2 christos /* Check registers. */
12759 1.1.1.2 christos for (j = 0; j < insn->ntok; j++)
12760 1.1.1.2 christos {
12761 1.1.1.2 christos if (xtensa_operand_is_register (isa, insn->opcode, j) != 1)
12762 1.1.1.2 christos continue;
12763 1.1.1.2 christos
12764 1.1.1.2 christos t2_regfile = xtensa_operand_regfile (isa, insn->opcode, j);
12765 1.1.1.2 christos t2_base_reg = insn->tok[j].X_add_number;
12766 1.1.1.2 christos t2_last_reg
12767 1.1.1.2 christos = t2_base_reg + xtensa_operand_num_regs (isa, insn->opcode, j);
12768 1.1.1.2 christos
12769 1.1.1.2 christos for (i = 0; i < insn->ntok; i++)
12770 1.1.1.2 christos {
12771 1.1.1.2 christos if (i == j)
12772 1.1.1.2 christos continue;
12773 1.1.1.2 christos
12774 1.1.1.2 christos if (xtensa_operand_is_register (isa, insn->opcode, i) != 1)
12775 1.1.1.2 christos continue;
12776 1.1.1.2 christos
12777 1.1.1.2 christos t1_regfile = xtensa_operand_regfile (isa, insn->opcode, i);
12778 1.1.1.2 christos
12779 1.1.1.2 christos if (t1_regfile != t2_regfile)
12780 1.1.1.2 christos continue;
12781 1.1.1.2 christos
12782 1.1.1.2 christos t1_inout = xtensa_operand_inout (isa, insn->opcode, i);
12783 1.1.1.2 christos t2_inout = xtensa_operand_inout (isa, insn->opcode, j);
12784 1.1 skrll
12785 1.1 skrll t1_base_reg = insn->tok[i].X_add_number;
12786 1.1 skrll t1_last_reg = (t1_base_reg
12787 1.1 skrll + xtensa_operand_num_regs (isa, insn->opcode, i));
12788 1.1 skrll
12789 1.1 skrll for (t1_reg = t1_base_reg; t1_reg < t1_last_reg; t1_reg++)
12790 1.1 skrll {
12791 1.1 skrll for (t2_reg = t2_base_reg; t2_reg < t2_last_reg; t2_reg++)
12792 1.1 skrll {
12793 1.1 skrll if (t1_reg != t2_reg)
12794 1.1 skrll continue;
12795 1.1 skrll
12796 1.1 skrll if (t1_inout != 'i' && t2_inout != 'i')
12797 1.1 skrll {
12798 1.1 skrll as_bad (_("multiple writes to the same register"));
12799 1.1 skrll return TRUE;
12800 1.1 skrll }
12801 1.1 skrll }
12802 1.1 skrll }
12803 1.1 skrll }
12804 1.1 skrll }
12805 1.1 skrll return FALSE;
12806 1.1 skrll }
12807 1.1 skrll
12808 1.1 skrll
12809 1.1 skrll /* Load an instruction from its encoded form. */
12810 1.1 skrll
12811 1.1 skrll static void
12812 1.1 skrll tinsn_from_chars (TInsn *tinsn, char *f, int slot)
12813 1.1 skrll {
12814 1.1 skrll vliw_insn vinsn;
12815 1.1 skrll
12816 1.1 skrll xg_init_vinsn (&vinsn);
12817 1.1 skrll vinsn_from_chars (&vinsn, f);
12818 1.1 skrll
12819 1.1 skrll *tinsn = vinsn.slots[slot];
12820 1.1 skrll xg_free_vinsn (&vinsn);
12821 1.1 skrll }
12822 1.1 skrll
12823 1.1 skrll
12824 1.1 skrll static void
12825 1.1 skrll tinsn_from_insnbuf (TInsn *tinsn,
12826 1.1 skrll xtensa_insnbuf slotbuf,
12827 1.1 skrll xtensa_format fmt,
12828 1.1 skrll int slot)
12829 1.1 skrll {
12830 1.1 skrll int i;
12831 1.1 skrll xtensa_isa isa = xtensa_default_isa;
12832 1.1 skrll
12833 1.1 skrll /* Find the immed. */
12834 1.1 skrll tinsn_init (tinsn);
12835 1.1 skrll tinsn->insn_type = ITYPE_INSN;
12836 1.1 skrll tinsn->is_specific_opcode = FALSE; /* must not be specific */
12837 1.1 skrll tinsn->opcode = xtensa_opcode_decode (isa, fmt, slot, slotbuf);
12838 1.1.1.2 christos tinsn->ntok = xtensa_opcode_num_operands (isa, tinsn->opcode);
12839 1.1 skrll for (i = 0; i < tinsn->ntok; i++)
12840 1.1 skrll {
12841 1.1 skrll set_expr_const (&tinsn->tok[i],
12842 1.1 skrll xtensa_insnbuf_get_operand (slotbuf, fmt, slot,
12843 1.1.1.2 christos tinsn->opcode, i));
12844 1.1 skrll }
12845 1.1 skrll }
12846 1.1 skrll
12847 1.1 skrll
12848 1.1 skrll /* Read the value of the relaxable immed from the fr_symbol and fr_offset. */
12849 1.1 skrll
12850 1.1 skrll static void
12851 1.1 skrll tinsn_immed_from_frag (TInsn *tinsn, fragS *fragP, int slot)
12852 1.1 skrll {
12853 1.1 skrll xtensa_opcode opcode = tinsn->opcode;
12854 1.1 skrll int opnum;
12855 1.1 skrll
12856 1.1 skrll if (fragP->tc_frag_data.slot_symbols[slot])
12857 1.1 skrll {
12858 1.1 skrll opnum = get_relaxable_immed (opcode);
12859 1.1 skrll gas_assert (opnum >= 0);
12860 1.1 skrll set_expr_symbol_offset (&tinsn->tok[opnum],
12861 1.1 skrll fragP->tc_frag_data.slot_symbols[slot],
12862 1.1 skrll fragP->tc_frag_data.slot_offsets[slot]);
12863 1.1 skrll }
12864 1.1 skrll tinsn->extra_arg = fragP->tc_frag_data.free_reg[slot];
12865 1.1 skrll }
12866 1.1 skrll
12867 1.1 skrll
12868 1.1 skrll static int
12869 1.1 skrll get_num_stack_text_bytes (IStack *istack)
12870 1.1 skrll {
12871 1.1 skrll int i;
12872 1.1 skrll int text_bytes = 0;
12873 1.1 skrll
12874 1.1 skrll for (i = 0; i < istack->ninsn; i++)
12875 1.1 skrll {
12876 1.1 skrll TInsn *tinsn = &istack->insn[i];
12877 1.1 skrll if (tinsn->insn_type == ITYPE_INSN)
12878 1.1 skrll text_bytes += xg_get_single_size (tinsn->opcode);
12879 1.1 skrll }
12880 1.1 skrll return text_bytes;
12881 1.1 skrll }
12882 1.1 skrll
12883 1.1 skrll
12884 1.1 skrll static int
12885 1.1 skrll get_num_stack_literal_bytes (IStack *istack)
12886 1.1 skrll {
12887 1.1 skrll int i;
12888 1.1 skrll int lit_bytes = 0;
12889 1.1 skrll
12890 1.1 skrll for (i = 0; i < istack->ninsn; i++)
12891 1.1 skrll {
12892 1.1 skrll TInsn *tinsn = &istack->insn[i];
12893 1.1.1.2 christos if (tinsn->insn_type == ITYPE_LITERAL && tinsn->ntok == 1)
12894 1.1 skrll lit_bytes += 4;
12895 1.1 skrll }
12896 1.1 skrll return lit_bytes;
12897 1.1 skrll }
12898 1.1 skrll
12899 1.1 skrll
12900 1.1 skrll /* vliw_insn functions. */
12902 1.1 skrll
12903 1.1 skrll static void
12904 1.1 skrll xg_init_vinsn (vliw_insn *v)
12905 1.1 skrll {
12906 1.1 skrll int i;
12907 1.1.1.4 christos xtensa_isa isa = xtensa_default_isa;
12908 1.1.1.2 christos
12909 1.1 skrll xg_clear_vinsn (v);
12910 1.1 skrll
12911 1.1 skrll v->insnbuf = xtensa_insnbuf_alloc (isa);
12912 1.1 skrll if (v->insnbuf == NULL)
12913 1.1 skrll as_fatal (_("out of memory"));
12914 1.1 skrll
12915 1.1 skrll for (i = 0; i < config_max_slots; i++)
12916 1.1 skrll {
12917 1.1.1.2 christos v->slotbuf[i] = xtensa_insnbuf_alloc (isa);
12918 1.1 skrll if (v->slotbuf[i] == NULL)
12919 1.1 skrll as_fatal (_("out of memory"));
12920 1.1 skrll }
12921 1.1 skrll }
12922 1.1.1.2 christos
12923 1.1.1.2 christos
12924 1.1.1.2 christos static void
12925 1.1.1.4 christos xg_clear_vinsn (vliw_insn *v)
12926 1.1.1.2 christos {
12927 1.1.1.2 christos int i;
12928 1.1.1.2 christos
12929 1.1.1.2 christos memset (v, 0, offsetof (vliw_insn, slots)
12930 1.1.1.2 christos + sizeof(TInsn) * config_max_slots);
12931 1.1.1.2 christos
12932 1.1 skrll v->format = XTENSA_UNDEFINED;
12933 1.1 skrll v->num_slots = 0;
12934 1.1 skrll v->inside_bundle = FALSE;
12935 1.1 skrll
12936 1.1 skrll if (xt_saved_debug_type != DEBUG_NONE)
12937 1.1 skrll debug_type = xt_saved_debug_type;
12938 1.1 skrll
12939 1.1 skrll for (i = 0; i < config_max_slots; i++)
12940 1.1 skrll v->slots[i].opcode = XTENSA_UNDEFINED;
12941 1.1 skrll }
12942 1.1 skrll
12943 1.1 skrll
12944 1.1 skrll static void
12945 1.1 skrll xg_copy_vinsn (vliw_insn *dst, vliw_insn *src)
12946 1.1 skrll {
12947 1.1 skrll memcpy (dst, src,
12948 1.1 skrll offsetof(vliw_insn, slots) + src->num_slots * sizeof(TInsn));
12949 1.1 skrll dst->insnbuf = src->insnbuf;
12950 1.1 skrll memcpy (dst->slotbuf, src->slotbuf, src->num_slots * sizeof(xtensa_insnbuf));
12951 1.1.1.2 christos }
12952 1.1 skrll
12953 1.1 skrll
12954 1.1 skrll static bfd_boolean
12955 1.1 skrll vinsn_has_specific_opcodes (vliw_insn *v)
12956 1.1 skrll {
12957 1.1 skrll int i;
12958 1.1 skrll
12959 1.1 skrll for (i = 0; i < v->num_slots; i++)
12960 1.1 skrll {
12961 1.1 skrll if (v->slots[i].is_specific_opcode)
12962 1.1 skrll return TRUE;
12963 1.1 skrll }
12964 1.1 skrll return FALSE;
12965 1.1 skrll }
12966 1.1 skrll
12967 1.1 skrll
12968 1.1 skrll static void
12969 1.1 skrll xg_free_vinsn (vliw_insn *v)
12970 1.1 skrll {
12971 1.1 skrll int i;
12972 1.1 skrll xtensa_insnbuf_free (xtensa_default_isa, v->insnbuf);
12973 1.1 skrll for (i = 0; i < config_max_slots; i++)
12974 1.1 skrll xtensa_insnbuf_free (xtensa_default_isa, v->slotbuf[i]);
12975 1.1 skrll }
12976 1.1.1.2 christos
12977 1.1 skrll
12978 1.1 skrll /* Encode a vliw_insn into an insnbuf. Return TRUE if there are any symbolic
12979 1.1 skrll operands. See also the assumptions listed for tinsn_to_slotbuf. */
12980 1.1 skrll
12981 1.1 skrll static bfd_boolean
12982 1.1 skrll vinsn_to_insnbuf (vliw_insn *vinsn,
12983 1.1.1.2 christos char *frag_offset,
12984 1.1 skrll fragS *fragP,
12985 1.1 skrll bfd_boolean record_fixup)
12986 1.1 skrll {
12987 1.1 skrll xtensa_isa isa = xtensa_default_isa;
12988 1.1 skrll xtensa_format fmt = vinsn->format;
12989 1.1 skrll xtensa_insnbuf insnbuf = vinsn->insnbuf;
12990 1.1 skrll int slot;
12991 1.1 skrll bfd_boolean has_fixup = FALSE;
12992 1.1 skrll
12993 1.1 skrll xtensa_format_encode (isa, fmt, insnbuf);
12994 1.1 skrll
12995 1.1 skrll for (slot = 0; slot < vinsn->num_slots; slot++)
12996 1.1.1.2 christos {
12997 1.1.1.2 christos TInsn *tinsn = &vinsn->slots[slot];
12998 1.1 skrll expressionS *extra_arg = &tinsn->extra_arg;
12999 1.1 skrll bfd_boolean tinsn_has_fixup =
13000 1.1 skrll tinsn_to_slotbuf (vinsn->format, slot, tinsn,
13001 1.1 skrll vinsn->slotbuf[slot]);
13002 1.1 skrll
13003 1.1 skrll xtensa_format_set_slot (isa, fmt, slot,
13004 1.1 skrll insnbuf, vinsn->slotbuf[slot]);
13005 1.1 skrll if (extra_arg->X_op != O_illegal && extra_arg->X_op != O_register)
13006 1.1 skrll {
13007 1.1 skrll if (vinsn->num_slots != 1)
13008 1.1.1.2 christos as_bad (_("TLS relocation not allowed in FLIX bundle"));
13009 1.1.1.2 christos else if (record_fixup)
13010 1.1 skrll /* Instructions that generate TLS relocations should always be
13011 1.1 skrll relaxed in the front-end. If "record_fixup" is set, then this
13012 1.1 skrll function is being called during back-end relaxation, so flag
13013 1.1 skrll the unexpected behavior as an error. */
13014 1.1 skrll as_bad (_("unexpected TLS relocation"));
13015 1.1 skrll else
13016 1.1 skrll fix_new (fragP, frag_offset - fragP->fr_literal,
13017 1.1 skrll xtensa_format_length (isa, fmt),
13018 1.1 skrll extra_arg->X_add_symbol, extra_arg->X_add_number,
13019 1.1 skrll FALSE, map_operator_to_reloc (extra_arg->X_op, FALSE));
13020 1.1 skrll }
13021 1.1 skrll if (tinsn_has_fixup)
13022 1.1 skrll {
13023 1.1 skrll int i;
13024 1.1.1.2 christos xtensa_opcode opcode = tinsn->opcode;
13025 1.1 skrll int noperands = xtensa_opcode_num_operands (isa, opcode);
13026 1.1 skrll has_fixup = TRUE;
13027 1.1 skrll
13028 1.1 skrll for (i = 0; i < noperands; i++)
13029 1.1.1.2 christos {
13030 1.1 skrll expressionS* exp = &tinsn->tok[i];
13031 1.1.1.2 christos switch (exp->X_op)
13032 1.1.1.2 christos {
13033 1.1 skrll case O_symbol:
13034 1.1 skrll case O_lo16:
13035 1.1 skrll case O_hi16:
13036 1.1 skrll if (get_relaxable_immed (opcode) == i)
13037 1.1 skrll {
13038 1.1 skrll /* Add a fix record for the instruction, except if this
13039 1.1 skrll function is being called prior to relaxation, i.e.,
13040 1.1 skrll if record_fixup is false, and the instruction might
13041 1.1 skrll be relaxed later. */
13042 1.1 skrll if (record_fixup
13043 1.1 skrll || tinsn->is_specific_opcode
13044 1.1 skrll || !xg_is_relaxable_insn (tinsn, 0))
13045 1.1 skrll {
13046 1.1 skrll xg_add_opcode_fix (tinsn, i, fmt, slot, exp, fragP,
13047 1.1 skrll frag_offset - fragP->fr_literal);
13048 1.1 skrll }
13049 1.1 skrll else
13050 1.1 skrll {
13051 1.1 skrll if (exp->X_op != O_symbol)
13052 1.1 skrll as_bad (_("invalid operand"));
13053 1.1 skrll tinsn->symbol = exp->X_add_symbol;
13054 1.1 skrll tinsn->offset = exp->X_add_number;
13055 1.1 skrll }
13056 1.1 skrll }
13057 1.1 skrll else
13058 1.1 skrll as_bad (_("symbolic operand not allowed"));
13059 1.1 skrll break;
13060 1.1 skrll
13061 1.1 skrll case O_constant:
13062 1.1 skrll case O_register:
13063 1.1 skrll break;
13064 1.1 skrll
13065 1.1 skrll default:
13066 1.1 skrll as_bad (_("expression too complex"));
13067 1.1 skrll break;
13068 1.1 skrll }
13069 1.1 skrll }
13070 1.1 skrll }
13071 1.1 skrll }
13072 1.1 skrll
13073 1.1 skrll return has_fixup;
13074 1.1 skrll }
13075 1.1 skrll
13076 1.1 skrll
13077 1.1 skrll static void
13078 1.1 skrll vinsn_from_chars (vliw_insn *vinsn, char *f)
13079 1.1 skrll {
13080 1.1 skrll static xtensa_insnbuf insnbuf = NULL;
13081 1.1 skrll static xtensa_insnbuf slotbuf = NULL;
13082 1.1 skrll int i;
13083 1.1 skrll xtensa_format fmt;
13084 1.1 skrll xtensa_isa isa = xtensa_default_isa;
13085 1.1 skrll
13086 1.1 skrll if (!insnbuf)
13087 1.1 skrll {
13088 1.1 skrll insnbuf = xtensa_insnbuf_alloc (isa);
13089 1.1 skrll slotbuf = xtensa_insnbuf_alloc (isa);
13090 1.1 skrll }
13091 1.1 skrll
13092 1.1 skrll xtensa_insnbuf_from_chars (isa, insnbuf, (unsigned char *) f, 0);
13093 1.1 skrll fmt = xtensa_format_decode (isa, insnbuf);
13094 1.1 skrll if (fmt == XTENSA_UNDEFINED)
13095 1.1 skrll as_fatal (_("cannot decode instruction format"));
13096 1.1 skrll vinsn->format = fmt;
13097 1.1 skrll vinsn->num_slots = xtensa_format_num_slots (isa, fmt);
13098 1.1 skrll
13099 1.1 skrll for (i = 0; i < vinsn->num_slots; i++)
13100 1.1 skrll {
13101 1.1 skrll TInsn *tinsn = &vinsn->slots[i];
13102 1.1 skrll xtensa_format_get_slot (isa, fmt, i, insnbuf, slotbuf);
13103 1.1.1.2 christos tinsn_from_insnbuf (tinsn, slotbuf, fmt, i);
13104 1.1 skrll }
13105 1.1 skrll }
13106 1.1 skrll
13107 1.1 skrll
13108 1.1 skrll /* Expression utilities. */
13110 1.1 skrll
13111 1.1 skrll /* Return TRUE if the expression is an integer constant. */
13112 1.1 skrll
13113 1.1 skrll bfd_boolean
13114 1.1 skrll expr_is_const (const expressionS *s)
13115 1.1 skrll {
13116 1.1 skrll return (s->X_op == O_constant);
13117 1.1 skrll }
13118 1.1 skrll
13119 1.1 skrll
13120 1.1 skrll /* Get the expression constant.
13121 1.1 skrll Calling this is illegal if expr_is_const () returns TRUE. */
13122 1.1 skrll
13123 1.1 skrll offsetT
13124 1.1 skrll get_expr_const (const expressionS *s)
13125 1.1 skrll {
13126 1.1 skrll gas_assert (expr_is_const (s));
13127 1.1 skrll return s->X_add_number;
13128 1.1 skrll }
13129 1.1 skrll
13130 1.1 skrll
13131 1.1 skrll /* Set the expression to a constant value. */
13132 1.1 skrll
13133 1.1.1.2 christos void
13134 1.1 skrll set_expr_const (expressionS *s, offsetT val)
13135 1.1 skrll {
13136 1.1 skrll s->X_op = O_constant;
13137 1.1 skrll s->X_add_number = val;
13138 1.1 skrll s->X_add_symbol = NULL;
13139 1.1 skrll s->X_op_symbol = NULL;
13140 1.1 skrll }
13141 1.1 skrll
13142 1.1 skrll
13143 1.1 skrll bfd_boolean
13144 1.1 skrll expr_is_register (const expressionS *s)
13145 1.1 skrll {
13146 1.1 skrll return (s->X_op == O_register);
13147 1.1 skrll }
13148 1.1 skrll
13149 1.1 skrll
13150 1.1 skrll /* Get the expression constant.
13151 1.1 skrll Calling this is illegal if expr_is_const () returns TRUE. */
13152 1.1 skrll
13153 1.1 skrll offsetT
13154 1.1 skrll get_expr_register (const expressionS *s)
13155 1.1 skrll {
13156 1.1 skrll gas_assert (expr_is_register (s));
13157 1.1 skrll return s->X_add_number;
13158 1.1 skrll }
13159 1.1 skrll
13160 1.1 skrll
13161 1.1 skrll /* Set the expression to a symbol + constant offset. */
13162 1.1 skrll
13163 1.1 skrll void
13164 1.1 skrll set_expr_symbol_offset (expressionS *s, symbolS *sym, offsetT offset)
13165 1.1 skrll {
13166 1.1 skrll s->X_op = O_symbol;
13167 1.1 skrll s->X_add_symbol = sym;
13168 1.1 skrll s->X_op_symbol = NULL; /* unused */
13169 1.1 skrll s->X_add_number = offset;
13170 1.1 skrll }
13171 1.1 skrll
13172 1.1 skrll
13173 1.1 skrll /* Return TRUE if the two expressions are equal. */
13174 1.1 skrll
13175 1.1 skrll bfd_boolean
13176 1.1 skrll expr_is_equal (expressionS *s1, expressionS *s2)
13177 1.1 skrll {
13178 1.1.1.5 christos if (s1->X_op != s2->X_op)
13179 1.1 skrll return FALSE;
13180 1.1 skrll if (s1->X_add_symbol != s2->X_add_symbol)
13181 1.1 skrll return FALSE;
13182 1.1 skrll if (s1->X_op_symbol != s2->X_op_symbol)
13183 1.1 skrll return FALSE;
13184 1.1 skrll if (s1->X_add_number != s2->X_add_number)
13185 1.1 skrll return FALSE;
13186 1.1 skrll return TRUE;
13187 1.1 skrll }
13188 1.1 skrll
13189 1.1 skrll
13190 1.1 skrll static void
13191 1.1 skrll copy_expr (expressionS *dst, const expressionS *src)
13192 1.1 skrll {
13193 1.1 skrll memcpy (dst, src, sizeof (expressionS));
13194 1.1 skrll }
13195 1.1 skrll
13196 1.1 skrll
13197 1.1 skrll /* Support for the "--rename-section" option. */
13199 1.1 skrll
13200 1.1 skrll struct rename_section_struct
13201 1.1 skrll {
13202 1.1 skrll const char *old_name;
13203 1.1 skrll char *new_name;
13204 1.1 skrll struct rename_section_struct *next;
13205 1.1 skrll };
13206 1.1 skrll
13207 1.1 skrll static struct rename_section_struct *section_rename;
13208 1.1 skrll
13209 1.1 skrll
13210 1.1 skrll /* Parse the string "oldname=new_name(:oldname2=new_name2)*" and add
13211 1.1 skrll entries to the section_rename list. Note: Specifying multiple
13212 1.1 skrll renamings separated by colons is not documented and is retained only
13213 1.1 skrll for backward compatibility. */
13214 1.1 skrll
13215 1.1 skrll static void
13216 1.1 skrll build_section_rename (const char *arg)
13217 1.1 skrll {
13218 1.1 skrll struct rename_section_struct *r;
13219 1.1 skrll char *this_arg = NULL;
13220 1.1 skrll char *next_arg = NULL;
13221 1.1 skrll
13222 1.1 skrll for (this_arg = xstrdup (arg); this_arg != NULL; this_arg = next_arg)
13223 1.1 skrll {
13224 1.1 skrll char *old_name, *new_name;
13225 1.1 skrll
13226 1.1 skrll if (this_arg)
13227 1.1 skrll {
13228 1.1 skrll next_arg = strchr (this_arg, ':');
13229 1.1 skrll if (next_arg)
13230 1.1 skrll {
13231 1.1 skrll *next_arg = '\0';
13232 1.1 skrll next_arg++;
13233 1.1 skrll }
13234 1.1 skrll }
13235 1.1 skrll
13236 1.1 skrll old_name = this_arg;
13237 1.1 skrll new_name = strchr (this_arg, '=');
13238 1.1 skrll
13239 1.1 skrll if (*old_name == '\0')
13240 1.1.1.5 christos {
13241 1.1 skrll as_warn (_("ignoring extra '-rename-section' delimiter ':'"));
13242 1.1 skrll continue;
13243 1.1 skrll }
13244 1.1 skrll if (!new_name || new_name[1] == '\0')
13245 1.1 skrll {
13246 1.1 skrll as_warn (_("ignoring invalid '-rename-section' specification: '%s'"),
13247 1.1 skrll old_name);
13248 1.1 skrll continue;
13249 1.1 skrll }
13250 1.1.1.5 christos *new_name = '\0';
13251 1.1 skrll new_name++;
13252 1.1 skrll
13253 1.1 skrll /* Check for invalid section renaming. */
13254 1.1 skrll for (r = section_rename; r != NULL; r = r->next)
13255 1.1 skrll {
13256 1.1 skrll if (strcmp (r->old_name, old_name) == 0)
13257 1.1 skrll as_bad (_("section %s renamed multiple times"), old_name);
13258 1.1 skrll if (strcmp (r->new_name, new_name) == 0)
13259 1.1 skrll as_bad (_("multiple sections remapped to output section %s"),
13260 1.1.1.5 christos new_name);
13261 1.1 skrll }
13262
13263 /* Now add it. */
13264 r = XNEW (struct rename_section_struct);
13265 r->old_name = xstrdup (old_name);
13266 r->new_name = xstrdup (new_name);
13267 r->next = section_rename;
13268 section_rename = r;
13269 }
13270 }
13271
13272
13273 char *
13274 xtensa_section_rename (const char *name)
13275 {
13276 struct rename_section_struct *r = section_rename;
13277
13278 for (r = section_rename; r != NULL; r = r->next)
13279 {
13280 if (strcmp (r->old_name, name) == 0)
13281 return r->new_name;
13282 }
13283
13284 return (char *) name;
13285 }
13286