1 /* tc-riscv.c -- RISC-V assembler
2 Copyright (C) 2011-2024 Free Software Foundation, Inc.
3
4 Contributed by Andrew Waterman (andrew@sifive.com).
5 Based on MIPS target.
6
7 This file is part of GAS.
8
9 GAS is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
12 any later version.
13
14 GAS is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; see the file COPYING3. If not,
21 see <http://www.gnu.org/licenses/>. */
22
23 #include "as.h"
24 #include "config.h"
25 #include "subsegs.h"
26 #include "safe-ctype.h"
27
28 #include "itbl-ops.h"
29 #include "dwarf2dbg.h"
30 #include "dw2gencfi.h"
31
32 #include "bfd/elfxx-riscv.h"
33 #include "elf/riscv.h"
34 #include "opcode/riscv.h"
35
36 #include <stdint.h>
37
38 /* Information about an instruction, including its format, operands
39 and fixups. */
40 struct riscv_cl_insn
41 {
42 /* The opcode's entry in riscv_opcodes. */
43 const struct riscv_opcode *insn_mo;
44
45 /* The encoded instruction bits
46 (first bits enough to extract instruction length on a long opcode). */
47 insn_t insn_opcode;
48
49 /* The long encoded instruction bits ([0] is non-zero on a long opcode). */
50 char insn_long_opcode[RISCV_MAX_INSN_LEN];
51
52 /* The frag that contains the instruction. */
53 struct frag *frag;
54
55 /* The offset into FRAG of the first instruction byte. */
56 long where;
57
58 /* The relocs associated with the instruction, if any. */
59 fixS *fixp;
60 };
61
62 /* The identifier of the assembler macro we are expanding, if any. */
63 static int source_macro = -1;
64
65 /* All RISC-V CSR belong to one of these classes. */
66 enum riscv_csr_class
67 {
68 CSR_CLASS_NONE,
69
70 CSR_CLASS_I,
71 CSR_CLASS_I_32, /* rv32 only */
72 CSR_CLASS_F, /* f-ext only */
73 CSR_CLASS_ZKR, /* zkr only */
74 CSR_CLASS_V, /* rvv only */
75 CSR_CLASS_DEBUG, /* debug CSR */
76 CSR_CLASS_H, /* hypervisor */
77 CSR_CLASS_H_32, /* hypervisor, rv32 only */
78 CSR_CLASS_SMAIA, /* Smaia */
79 CSR_CLASS_SMAIA_32, /* Smaia, rv32 only */
80 CSR_CLASS_SMCNTRPMF, /* Smcntrpmf */
81 CSR_CLASS_SMCNTRPMF_32, /* Smcntrpmf, rv32 only */
82 CSR_CLASS_SMSTATEEN, /* Smstateen only */
83 CSR_CLASS_SMSTATEEN_32, /* Smstateen RV32 only */
84 CSR_CLASS_SSAIA, /* Ssaia */
85 CSR_CLASS_SSAIA_AND_H, /* Ssaia with H */
86 CSR_CLASS_SSAIA_32, /* Ssaia, rv32 only */
87 CSR_CLASS_SSAIA_AND_H_32, /* Ssaia with H, rv32 only */
88 CSR_CLASS_SSSTATEEN, /* S[ms]stateen only */
89 CSR_CLASS_SSSTATEEN_AND_H, /* S[ms]stateen only (with H) */
90 CSR_CLASS_SSSTATEEN_AND_H_32, /* S[ms]stateen RV32 only (with H) */
91 CSR_CLASS_SSCOFPMF, /* Sscofpmf only */
92 CSR_CLASS_SSCOFPMF_32, /* Sscofpmf RV32 only */
93 CSR_CLASS_SSTC, /* Sstc only */
94 CSR_CLASS_SSTC_AND_H, /* Sstc only (with H) */
95 CSR_CLASS_SSTC_32, /* Sstc RV32 only */
96 CSR_CLASS_SSTC_AND_H_32, /* Sstc RV32 only (with H) */
97 CSR_CLASS_XTHEADVECTOR, /* xtheadvector only */
98 };
99
100 /* This structure holds all restricted conditions for a CSR. */
101 struct riscv_csr_extra
102 {
103 /* Class to which this CSR belongs. Used to decide whether or
104 not this CSR is legal in the current -march context. */
105 enum riscv_csr_class csr_class;
106
107 /* CSR may have differnet numbers in the previous priv spec. */
108 unsigned address;
109
110 /* Record the CSR is defined/valid in which versions. */
111 enum riscv_spec_class define_version;
112
113 /* Record the CSR is aborted/invalid from which versions. If it isn't
114 aborted in the current version, then it should be PRIV_SPEC_CLASS_DRAFT. */
115 enum riscv_spec_class abort_version;
116
117 /* The CSR may have more than one setting. */
118 struct riscv_csr_extra *next;
119 };
120
121 /* This structure contains information about errors that occur within the
122 riscv_ip function */
123 struct riscv_ip_error
124 {
125 /* General error message */
126 const char* msg;
127
128 /* Statement that caused the error */
129 char* statement;
130
131 /* Missing extension that needs to be enabled */
132 const char* missing_ext;
133 };
134
135 #ifndef DEFAULT_ARCH
136 #define DEFAULT_ARCH "riscv64"
137 #endif
138
139 #ifndef DEFAULT_RISCV_ATTR
140 #define DEFAULT_RISCV_ATTR 0
141 #endif
142
143 /* Let riscv_after_parse_args set the default value according to xlen. */
144 #ifndef DEFAULT_RISCV_ARCH_WITH_EXT
145 #define DEFAULT_RISCV_ARCH_WITH_EXT NULL
146 #endif
147
148 /* Need to sync the version with RISC-V compiler. */
149 #ifndef DEFAULT_RISCV_ISA_SPEC
150 #define DEFAULT_RISCV_ISA_SPEC "20191213"
151 #endif
152
153 #ifndef DEFAULT_RISCV_PRIV_SPEC
154 #define DEFAULT_RISCV_PRIV_SPEC "1.11"
155 #endif
156
157 static const char default_arch[] = DEFAULT_ARCH;
158 static const char *default_arch_with_ext = DEFAULT_RISCV_ARCH_WITH_EXT;
159 static enum riscv_spec_class default_isa_spec = ISA_SPEC_CLASS_NONE;
160 static enum riscv_spec_class default_priv_spec = PRIV_SPEC_CLASS_NONE;
161
162 static unsigned xlen = 0; /* The width of an x-register. */
163 static unsigned abi_xlen = 0; /* The width of a pointer in the ABI. */
164 static bool rve_abi = false;
165 enum float_abi
166 {
167 FLOAT_ABI_DEFAULT = -1,
168 FLOAT_ABI_SOFT,
169 FLOAT_ABI_SINGLE,
170 FLOAT_ABI_DOUBLE,
171 FLOAT_ABI_QUAD
172 };
173 static enum float_abi float_abi = FLOAT_ABI_DEFAULT;
174
175 #define LOAD_ADDRESS_INSN (abi_xlen == 64 ? "ld" : "lw")
176 #define ADD32_INSN (xlen == 64 ? "addiw" : "addi")
177
178 static unsigned elf_flags = 0;
179
180 static bool probing_insn_operands;
181
182 /* Set the default_isa_spec. Return 0 if the spec isn't supported.
183 Otherwise, return 1. */
184
185 static int
riscv_set_default_isa_spec(const char * s)186 riscv_set_default_isa_spec (const char *s)
187 {
188 enum riscv_spec_class class = ISA_SPEC_CLASS_NONE;
189 RISCV_GET_ISA_SPEC_CLASS (s, class);
190 if (class == ISA_SPEC_CLASS_NONE)
191 {
192 as_bad ("unknown default ISA spec `%s' set by "
193 "-misa-spec or --with-isa-spec", s);
194 return 0;
195 }
196 else
197 default_isa_spec = class;
198 return 1;
199 }
200
201 /* Set the default_priv_spec. Find the privileged elf attributes when
202 the input string is NULL. Return 0 if the spec isn't supported.
203 Otherwise, return 1. */
204
205 static int
riscv_set_default_priv_spec(const char * s)206 riscv_set_default_priv_spec (const char *s)
207 {
208 enum riscv_spec_class class = PRIV_SPEC_CLASS_NONE;
209 unsigned major, minor, revision;
210 obj_attribute *attr;
211
212 RISCV_GET_PRIV_SPEC_CLASS (s, class);
213 if (class != PRIV_SPEC_CLASS_NONE)
214 {
215 default_priv_spec = class;
216 return 1;
217 }
218
219 if (s != NULL)
220 {
221 as_bad (_("unknown default privileged spec `%s' set by "
222 "-mpriv-spec or --with-priv-spec"), s);
223 return 0;
224 }
225
226 /* Set the default_priv_spec by the privileged elf attributes. */
227 attr = elf_known_obj_attributes_proc (stdoutput);
228 major = (unsigned) attr[Tag_RISCV_priv_spec].i;
229 minor = (unsigned) attr[Tag_RISCV_priv_spec_minor].i;
230 revision = (unsigned) attr[Tag_RISCV_priv_spec_revision].i;
231 /* Version 0.0.0 is the default value and meningless. */
232 if (major == 0 && minor == 0 && revision == 0)
233 return 1;
234
235 riscv_get_priv_spec_class_from_numbers (major, minor, revision, &class);
236 if (class != PRIV_SPEC_CLASS_NONE)
237 {
238 default_priv_spec = class;
239 return 1;
240 }
241
242 /* Still can not find the privileged spec class. */
243 as_bad (_("unknown default privileged spec `%d.%d.%d' set by "
244 "privileged elf attributes"), major, minor, revision);
245 return 0;
246 }
247
248 /* This is the set of options which the .option pseudo-op may modify. */
249 struct riscv_set_options
250 {
251 int pic; /* Generate position-independent code. */
252 int rvc; /* Generate RVC code. */
253 int relax; /* Emit relocs the linker is allowed to relax. */
254 int arch_attr; /* Emit architecture and privileged elf attributes. */
255 int csr_check; /* Enable the CSR checking. */
256 };
257
258 static struct riscv_set_options riscv_opts =
259 {
260 0, /* pic */
261 0, /* rvc */
262 1, /* relax */
263 DEFAULT_RISCV_ATTR, /* arch_attr */
264 0, /* csr_check */
265 };
266
267 /* Enable or disable the rvc flags for riscv_opts. Turn on the rvc flag
268 for elf_flags once we have enabled c extension. */
269
270 static void
riscv_set_rvc(bool rvc_value)271 riscv_set_rvc (bool rvc_value)
272 {
273 if (rvc_value)
274 elf_flags |= EF_RISCV_RVC;
275
276 riscv_opts.rvc = rvc_value;
277 }
278
279 /* Turn on the tso flag for elf_flags once we have enabled ztso extension. */
280
281 static void
riscv_set_tso(void)282 riscv_set_tso (void)
283 {
284 elf_flags |= EF_RISCV_TSO;
285 }
286
287 /* The linked list hanging off of .subsets_list records all enabled extensions,
288 which are parsed from the architecture string. The architecture string can
289 be set by the -march option, the elf architecture attributes, and the
290 --with-arch configure option. */
291 static riscv_parse_subset_t riscv_rps_as =
292 {
293 NULL, /* subset_list, we will set it later once
294 riscv_opts_stack is created or updated. */
295 as_bad, /* error_handler. */
296 &xlen, /* xlen. */
297 &default_isa_spec, /* isa_spec. */
298 true, /* check_unknown_prefixed_ext. */
299 };
300
301 /* Update the architecture string in the subset_list. */
302
303 static void
riscv_reset_subsets_list_arch_str(void)304 riscv_reset_subsets_list_arch_str (void)
305 {
306 riscv_subset_list_t *subsets = riscv_rps_as.subset_list;
307 if (subsets->arch_str != NULL)
308 free ((void *) subsets->arch_str);
309 subsets->arch_str = riscv_arch_str (xlen, subsets);
310 }
311
312 /* This structure is used to hold a stack of .option values. */
313 struct riscv_option_stack
314 {
315 struct riscv_option_stack *next;
316 struct riscv_set_options options;
317 riscv_subset_list_t *subset_list;
318 };
319
320 static struct riscv_option_stack *riscv_opts_stack = NULL;
321
322 /* Set which ISA and extensions are available. */
323
324 static void
riscv_set_arch(const char * s)325 riscv_set_arch (const char *s)
326 {
327 if (s != NULL && strcmp (s, "") == 0)
328 {
329 as_bad (_("the architecture string of -march and elf architecture "
330 "attributes cannot be empty"));
331 return;
332 }
333
334 if (riscv_rps_as.subset_list == NULL)
335 {
336 riscv_rps_as.subset_list = XNEW (riscv_subset_list_t);
337 riscv_rps_as.subset_list->head = NULL;
338 riscv_rps_as.subset_list->tail = NULL;
339 riscv_rps_as.subset_list->arch_str = NULL;
340 }
341 riscv_release_subset_list (riscv_rps_as.subset_list);
342 riscv_parse_subset (&riscv_rps_as, s);
343 riscv_reset_subsets_list_arch_str ();
344
345 riscv_set_rvc (false);
346 if (riscv_subset_supports (&riscv_rps_as, "c")
347 || riscv_subset_supports (&riscv_rps_as, "zca"))
348 riscv_set_rvc (true);
349
350 if (riscv_subset_supports (&riscv_rps_as, "ztso"))
351 riscv_set_tso ();
352 }
353
354 /* Indicate -mabi option is explictly set. */
355 static bool explicit_mabi = false;
356
357 /* Set the abi information. */
358
359 static void
riscv_set_abi(unsigned new_xlen,enum float_abi new_float_abi,bool rve)360 riscv_set_abi (unsigned new_xlen, enum float_abi new_float_abi, bool rve)
361 {
362 abi_xlen = new_xlen;
363 float_abi = new_float_abi;
364 rve_abi = rve;
365 }
366
367 /* If the -mabi option isn't set, then set the abi according to the
368 ISA string. Otherwise, check if there is any conflict. */
369
370 static void
riscv_set_abi_by_arch(void)371 riscv_set_abi_by_arch (void)
372 {
373 if (!explicit_mabi)
374 {
375 if (riscv_subset_supports (&riscv_rps_as, "q"))
376 riscv_set_abi (xlen, FLOAT_ABI_QUAD, false);
377 else if (riscv_subset_supports (&riscv_rps_as, "d"))
378 riscv_set_abi (xlen, FLOAT_ABI_DOUBLE, false);
379 else if (riscv_subset_supports (&riscv_rps_as, "e"))
380 riscv_set_abi (xlen, FLOAT_ABI_SOFT, true);
381 else
382 riscv_set_abi (xlen, FLOAT_ABI_SOFT, false);
383 }
384 else
385 {
386 gas_assert (abi_xlen != 0 && xlen != 0 && float_abi != FLOAT_ABI_DEFAULT);
387 if (abi_xlen > xlen)
388 as_bad ("can't have %d-bit ABI on %d-bit ISA", abi_xlen, xlen);
389 else if (abi_xlen < xlen)
390 as_bad ("%d-bit ABI not yet supported on %d-bit ISA", abi_xlen, xlen);
391
392 if (riscv_subset_supports (&riscv_rps_as, "e") && !rve_abi)
393 as_bad ("only ilp32e/lp64e ABI are supported for e extension");
394
395 if (float_abi == FLOAT_ABI_SINGLE
396 && !riscv_subset_supports (&riscv_rps_as, "f"))
397 as_bad ("ilp32f/lp64f ABI can't be used when f extension "
398 "isn't supported");
399 else if (float_abi == FLOAT_ABI_DOUBLE
400 && !riscv_subset_supports (&riscv_rps_as, "d"))
401 as_bad ("ilp32d/lp64d ABI can't be used when d extension "
402 "isn't supported");
403 else if (float_abi == FLOAT_ABI_QUAD
404 && !riscv_subset_supports (&riscv_rps_as, "q"))
405 as_bad ("ilp32q/lp64q ABI can't be used when q extension "
406 "isn't supported");
407 }
408
409 /* Update the EF_RISCV_FLOAT_ABI field of elf_flags. */
410 elf_flags &= ~EF_RISCV_FLOAT_ABI;
411 elf_flags |= float_abi << 1;
412
413 if (rve_abi)
414 elf_flags |= EF_RISCV_RVE;
415 }
416
417 /* Handle of the OPCODE hash table. */
418 static htab_t op_hash = NULL;
419
420 /* Handle of the type of .insn hash table. */
421 static htab_t insn_type_hash = NULL;
422
423 /* This array holds the chars that always start a comment. If the
424 pre-processor is disabled, these aren't very useful. */
425 const char comment_chars[] = "#";
426
427 /* This array holds the chars that only start a comment at the beginning of
428 a line. If the line seems to have the form '# 123 filename'
429 .line and .file directives will appear in the pre-processed output
430
431 Note that input_file.c hand checks for '#' at the beginning of the
432 first line of the input file. This is because the compiler outputs
433 #NO_APP at the beginning of its output.
434
435 Also note that C style comments are always supported. */
436 const char line_comment_chars[] = "#";
437
438 /* This array holds machine specific line separator characters. */
439 const char line_separator_chars[] = ";";
440
441 /* Chars that can be used to separate mant from exp in floating point nums. */
442 const char EXP_CHARS[] = "eE";
443
444 /* Chars that mean this number is a floating point constant.
445 As in 0f12.456 or 0d1.2345e12. */
446 const char FLT_CHARS[] = "rRsSfFdDxXpPhH";
447
448 /* Indicate we are already assemble any instructions or not. */
449 static bool start_assemble = false;
450
451 /* Indicate ELF attributes are explicitly set. */
452 static bool explicit_attr = false;
453
454 /* Indicate CSR or priv instructions are explicitly used. */
455 static bool explicit_priv_attr = false;
456
457 static char *expr_parse_end;
458
459 /* Macros for encoding relaxation state for RVC branches and far jumps. */
460 #define RELAX_BRANCH_ENCODE(uncond, rvc, length) \
461 ((relax_substateT) \
462 (0xc0000000 \
463 | ((uncond) ? 1 : 0) \
464 | ((rvc) ? 2 : 0) \
465 | ((length) << 2)))
466 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
467 #define RELAX_BRANCH_LENGTH(i) (((i) >> 2) & 0xF)
468 #define RELAX_BRANCH_RVC(i) (((i) & 2) != 0)
469 #define RELAX_BRANCH_UNCOND(i) (((i) & 1) != 0)
470
471 /* Is the given value a sign-extended 32-bit value? */
472 #define IS_SEXT_32BIT_NUM(x) \
473 (((x) &~ (offsetT) 0x7fffffff) == 0 \
474 || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
475
476 /* Is the given value a zero-extended 32-bit value? Or a negated one? */
477 #define IS_ZEXT_32BIT_NUM(x) \
478 (((x) &~ (offsetT) 0xffffffff) == 0 \
479 || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
480
481 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
482 INSN is a riscv_cl_insn structure and VALUE is evaluated exactly once. */
483 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
484 INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
485
486 #define INSERT_IMM(n, s, INSN, VALUE) \
487 INSERT_BITS ((INSN).insn_opcode, VALUE, (1ULL<<n) - 1, s)
488
489 /* Determine if an instruction matches an opcode. */
490 #define OPCODE_MATCHES(OPCODE, OP) \
491 (((OPCODE) & MASK_##OP) == MATCH_##OP)
492
493 /* Create a new mapping symbol for the transition to STATE. */
494
495 static void
make_mapping_symbol(enum riscv_seg_mstate state,valueT value,fragS * frag,const char * arch_str,bool odd_data_padding)496 make_mapping_symbol (enum riscv_seg_mstate state,
497 valueT value,
498 fragS *frag,
499 const char *arch_str,
500 bool odd_data_padding)
501 {
502 const char *name;
503 char *buff = NULL;
504 switch (state)
505 {
506 case MAP_DATA:
507 name = "$d";
508 break;
509 case MAP_INSN:
510 if (arch_str != NULL)
511 {
512 size_t size = strlen (arch_str) + 3; /* "$x" + '\0' */
513 buff = xmalloc (size);
514 snprintf (buff, size, "$x%s", arch_str);
515 name = buff;
516 }
517 else
518 name = "$x";
519 break;
520 default:
521 abort ();
522 }
523
524 symbolS *symbol = symbol_new (name, now_seg, frag, value);
525 symbol_get_bfdsym (symbol)->flags |= (BSF_NO_FLAGS | BSF_LOCAL);
526 if (arch_str != NULL)
527 {
528 /* Store current $x+arch into tc_segment_info. */
529 seg_info (now_seg)->tc_segment_info_data.arch_map_symbol = symbol;
530 xfree ((void *) buff);
531 }
532
533 /* If .fill or other data filling directive generates zero sized data,
534 then mapping symbol for the following code will have the same value.
535
536 Please see gas/testsuite/gas/riscv/mapping.s: .text.zero.fill.first
537 and .text.zero.fill.last. */
538 symbolS *first = frag->tc_frag_data.first_map_symbol;
539 symbolS *last = frag->tc_frag_data.last_map_symbol;
540 symbolS *removed = NULL;
541 if (value == 0)
542 {
543 if (first != NULL)
544 {
545 know (S_GET_VALUE (first) == S_GET_VALUE (symbol)
546 && first == last);
547 /* Remove the old one. */
548 removed = first;
549 }
550 frag->tc_frag_data.first_map_symbol = symbol;
551 }
552 else if (last != NULL)
553 {
554 /* The mapping symbols should be added in offset order. */
555 know (S_GET_VALUE (last) <= S_GET_VALUE (symbol));
556 /* Remove the old one. */
557 if (S_GET_VALUE (last) == S_GET_VALUE (symbol))
558 removed = last;
559 }
560 frag->tc_frag_data.last_map_symbol = symbol;
561
562 if (removed == NULL)
563 return;
564
565 if (odd_data_padding)
566 {
567 /* If the removed mapping symbol is $x+arch, then add it back to
568 the next $x. */
569 const char *str = strncmp (S_GET_NAME (removed), "$xrv", 4) == 0
570 ? S_GET_NAME (removed) + 2 : NULL;
571 make_mapping_symbol (MAP_INSN, frag->fr_fix + 1, frag, str,
572 false/* odd_data_padding */);
573 }
574 symbol_remove (removed, &symbol_rootP, &symbol_lastP);
575 }
576
577 /* Set the mapping state for frag_now. */
578
579 void
riscv_mapping_state(enum riscv_seg_mstate to_state,int max_chars,bool fr_align_code)580 riscv_mapping_state (enum riscv_seg_mstate to_state,
581 int max_chars,
582 bool fr_align_code)
583 {
584 enum riscv_seg_mstate from_state =
585 seg_info (now_seg)->tc_segment_info_data.map_state;
586 bool reset_seg_arch_str = false;
587
588 if (!SEG_NORMAL (now_seg)
589 /* For now we only add the mapping symbols to text sections.
590 Therefore, the dis-assembler only show the actual contents
591 distribution for text. Other sections will be shown as
592 data without the details. */
593 || !subseg_text_p (now_seg))
594 return;
595
596 /* The mapping symbol should be emitted if not in the right
597 mapping state. */
598 symbolS *seg_arch_symbol =
599 seg_info (now_seg)->tc_segment_info_data.arch_map_symbol;
600 if (to_state == MAP_INSN && seg_arch_symbol == 0)
601 {
602 /* Always add $x+arch at the first instruction of section. */
603 reset_seg_arch_str = true;
604 }
605 else if (seg_arch_symbol != 0
606 && to_state == MAP_INSN
607 && !fr_align_code
608 && strcmp (riscv_rps_as.subset_list->arch_str,
609 S_GET_NAME (seg_arch_symbol) + 2) != 0)
610 {
611 reset_seg_arch_str = true;
612 }
613 else if (from_state == to_state)
614 return;
615
616 valueT value = (valueT) (frag_now_fix () - max_chars);
617 seg_info (now_seg)->tc_segment_info_data.map_state = to_state;
618 const char *arch_str = reset_seg_arch_str
619 ? riscv_rps_as.subset_list->arch_str : NULL;
620 make_mapping_symbol (to_state, value, frag_now, arch_str,
621 false/* odd_data_padding */);
622 }
623
624 /* Add the odd bytes of paddings for riscv_handle_align. */
625
626 static void
riscv_add_odd_padding_symbol(fragS * frag)627 riscv_add_odd_padding_symbol (fragS *frag)
628 {
629 /* If there was already a mapping symbol, it should be
630 removed in the make_mapping_symbol.
631
632 Please see gas/testsuite/gas/riscv/mapping.s: .text.odd.align.*. */
633 make_mapping_symbol (MAP_DATA, frag->fr_fix, frag,
634 NULL/* arch_str */, true/* odd_data_padding */);
635 }
636
637 /* Remove any excess mapping symbols generated for alignment frags in
638 SEC. We may have created a mapping symbol before a zero byte
639 alignment; remove it if there's a mapping symbol after the
640 alignment. */
641
642 static void
riscv_check_mapping_symbols(bfd * abfd ATTRIBUTE_UNUSED,asection * sec,void * dummy ATTRIBUTE_UNUSED)643 riscv_check_mapping_symbols (bfd *abfd ATTRIBUTE_UNUSED,
644 asection *sec,
645 void *dummy ATTRIBUTE_UNUSED)
646 {
647 segment_info_type *seginfo = seg_info (sec);
648 fragS *fragp;
649
650 if (seginfo == NULL || seginfo->frchainP == NULL)
651 return;
652
653 for (fragp = seginfo->frchainP->frch_root;
654 fragp != NULL;
655 fragp = fragp->fr_next)
656 {
657 symbolS *last = fragp->tc_frag_data.last_map_symbol;
658 fragS *next = fragp->fr_next;
659
660 if (last == NULL || next == NULL)
661 continue;
662
663 /* Check the last mapping symbol if it is at the boundary of
664 fragment. */
665 if (S_GET_VALUE (last) < next->fr_address)
666 continue;
667 know (S_GET_VALUE (last) == next->fr_address);
668
669 do
670 {
671 symbolS *next_first = next->tc_frag_data.first_map_symbol;
672 if (next_first != NULL)
673 {
674 /* The last mapping symbol overlaps with another one
675 which at the start of the next frag.
676
677 Please see the gas/testsuite/gas/riscv/mapping.s:
678 .text.zero.fill.align.A and .text.zero.fill.align.B. */
679 know (S_GET_VALUE (last) == S_GET_VALUE (next_first));
680 symbolS *removed = last;
681 if (strncmp (S_GET_NAME (last), "$xrv", 4) == 0
682 && strcmp (S_GET_NAME (next_first), "$x") == 0)
683 removed = next_first;
684 symbol_remove (removed, &symbol_rootP, &symbol_lastP);
685 break;
686 }
687
688 if (next->fr_next == NULL)
689 {
690 /* The last mapping symbol is at the end of the section.
691
692 Please see the gas/testsuite/gas/riscv/mapping.s:
693 .text.last.section. */
694 know (next->fr_fix == 0 && next->fr_var == 0);
695 symbol_remove (last, &symbol_rootP, &symbol_lastP);
696 break;
697 }
698
699 /* Since we may have empty frags without any mapping symbols,
700 keep looking until the non-empty frag. */
701 if (next->fr_address != next->fr_next->fr_address)
702 break;
703
704 next = next->fr_next;
705 }
706 while (next != NULL);
707 }
708 }
709
710 /* The default target format to use. */
711
712 const char *
riscv_target_format(void)713 riscv_target_format (void)
714 {
715 if (target_big_endian)
716 return xlen == 64 ? "elf64-bigriscv" : "elf32-bigriscv";
717 else
718 return xlen == 64 ? "elf64-littleriscv" : "elf32-littleriscv";
719 }
720
721 /* Return the length of instruction INSN. */
722
723 static inline unsigned int
insn_length(const struct riscv_cl_insn * insn)724 insn_length (const struct riscv_cl_insn *insn)
725 {
726 return riscv_insn_length (insn->insn_opcode);
727 }
728
729 /* Initialise INSN from opcode entry MO. Leave its position unspecified. */
730
731 static void
create_insn(struct riscv_cl_insn * insn,const struct riscv_opcode * mo)732 create_insn (struct riscv_cl_insn *insn, const struct riscv_opcode *mo)
733 {
734 insn->insn_mo = mo;
735 insn->insn_opcode = mo->match;
736 insn->insn_long_opcode[0] = 0;
737 insn->frag = NULL;
738 insn->where = 0;
739 insn->fixp = NULL;
740 }
741
742 /* Install INSN at the location specified by its "frag" and "where" fields. */
743
744 static void
install_insn(const struct riscv_cl_insn * insn)745 install_insn (const struct riscv_cl_insn *insn)
746 {
747 char *f = insn->frag->fr_literal + insn->where;
748 if (insn->insn_long_opcode[0] != 0)
749 memcpy (f, insn->insn_long_opcode, insn_length (insn));
750 else
751 number_to_chars_littleendian (f, insn->insn_opcode, insn_length (insn));
752 }
753
754 /* Move INSN to offset WHERE in FRAG. Adjust the fixups accordingly
755 and install the opcode in the new location. */
756
757 static void
move_insn(struct riscv_cl_insn * insn,fragS * frag,long where)758 move_insn (struct riscv_cl_insn *insn, fragS *frag, long where)
759 {
760 insn->frag = frag;
761 insn->where = where;
762 if (insn->fixp != NULL)
763 {
764 insn->fixp->fx_frag = frag;
765 insn->fixp->fx_where = where;
766 }
767 install_insn (insn);
768 }
769
770 /* Add INSN to the end of the output. */
771
772 static void
add_fixed_insn(struct riscv_cl_insn * insn)773 add_fixed_insn (struct riscv_cl_insn *insn)
774 {
775 char *f = frag_more (insn_length (insn));
776 move_insn (insn, frag_now, f - frag_now->fr_literal);
777 }
778
779 static void
add_relaxed_insn(struct riscv_cl_insn * insn,int max_chars,int var,relax_substateT subtype,symbolS * symbol,offsetT offset)780 add_relaxed_insn (struct riscv_cl_insn *insn, int max_chars, int var,
781 relax_substateT subtype, symbolS *symbol, offsetT offset)
782 {
783 frag_grow (max_chars);
784 move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
785 frag_var (rs_machine_dependent, max_chars, var,
786 subtype, symbol, offset, NULL);
787 }
788
789 /* Compute the length of a branch sequence, and adjust the stored length
790 accordingly. If FRAGP is NULL, the worst-case length is returned. */
791
792 static unsigned
relaxed_branch_length(fragS * fragp,asection * sec,int update)793 relaxed_branch_length (fragS *fragp, asection *sec, int update)
794 {
795 int jump, rvc, length = 8;
796
797 if (!fragp)
798 return length;
799
800 jump = RELAX_BRANCH_UNCOND (fragp->fr_subtype);
801 rvc = RELAX_BRANCH_RVC (fragp->fr_subtype);
802 length = RELAX_BRANCH_LENGTH (fragp->fr_subtype);
803
804 /* Assume jumps are in range; the linker will catch any that aren't. */
805 length = jump ? 4 : 8;
806
807 if (fragp->fr_symbol != NULL
808 && S_IS_DEFINED (fragp->fr_symbol)
809 && !S_IS_WEAK (fragp->fr_symbol)
810 && sec == S_GET_SEGMENT (fragp->fr_symbol))
811 {
812 offsetT val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
813 bfd_vma rvc_range = jump ? RVC_JUMP_REACH : RVC_BRANCH_REACH;
814 val -= fragp->fr_address + fragp->fr_fix;
815
816 if (rvc && (bfd_vma)(val + rvc_range/2) < rvc_range)
817 length = 2;
818 else if ((bfd_vma)(val + RISCV_BRANCH_REACH/2) < RISCV_BRANCH_REACH)
819 length = 4;
820 else if (!jump && rvc)
821 length = 6;
822 }
823
824 if (update)
825 fragp->fr_subtype = RELAX_BRANCH_ENCODE (jump, rvc, length);
826
827 return length;
828 }
829
830 /* Information about an opcode name, mnemonics and its value. */
831 struct opcode_name_t
832 {
833 const char *name;
834 unsigned int val;
835 };
836
837 /* List for all supported opcode name. */
838 static const struct opcode_name_t opcode_name_list[] =
839 {
840 {"C0", 0x0},
841 {"C1", 0x1},
842 {"C2", 0x2},
843
844 {"LOAD", 0x03},
845 {"LOAD_FP", 0x07},
846 {"CUSTOM_0", 0x0b},
847 {"MISC_MEM", 0x0f},
848 {"OP_IMM", 0x13},
849 {"AUIPC", 0x17},
850 {"OP_IMM_32", 0x1b},
851 /* 48b 0x1f. */
852
853 {"STORE", 0x23},
854 {"STORE_FP", 0x27},
855 {"CUSTOM_1", 0x2b},
856 {"AMO", 0x2f},
857 {"OP", 0x33},
858 {"LUI", 0x37},
859 {"OP_32", 0x3b},
860 /* 64b 0x3f. */
861
862 {"MADD", 0x43},
863 {"MSUB", 0x47},
864 {"NMADD", 0x4f},
865 {"NMSUB", 0x4b},
866 {"OP_FP", 0x53},
867 {"OP_V", 0x57},
868 {"CUSTOM_2", 0x5b},
869 /* 48b 0x5f. */
870
871 {"BRANCH", 0x63},
872 {"JALR", 0x67},
873 /*reserved 0x5b. */
874 {"JAL", 0x6f},
875 {"SYSTEM", 0x73},
876 /*reserved 0x77. */
877 {"CUSTOM_3", 0x7b},
878 /* >80b 0x7f. */
879
880 {NULL, 0}
881 };
882
883 /* Hash table for lookup opcode name. */
884 static htab_t opcode_names_hash = NULL;
885
886 /* Initialization for hash table of opcode name. */
887
888 static void
init_opcode_names_hash(void)889 init_opcode_names_hash (void)
890 {
891 const struct opcode_name_t *opcode;
892
893 for (opcode = &opcode_name_list[0]; opcode->name != NULL; ++opcode)
894 if (str_hash_insert (opcode_names_hash, opcode->name, opcode, 0) != NULL)
895 as_fatal (_("internal: duplicate %s"), opcode->name);
896 }
897
898 /* Find `s` is a valid opcode name or not, return the opcode name info
899 if found. */
900
901 static const struct opcode_name_t *
opcode_name_lookup(char ** s)902 opcode_name_lookup (char **s)
903 {
904 char *e;
905 char save_c;
906 struct opcode_name_t *o;
907
908 /* Find end of name. */
909 e = *s;
910 if (is_name_beginner (*e))
911 ++e;
912 while (is_part_of_name (*e))
913 ++e;
914
915 /* Terminate name. */
916 save_c = *e;
917 *e = '\0';
918
919 o = (struct opcode_name_t *) str_hash_find (opcode_names_hash, *s);
920
921 /* Advance to next token if one was recognized. */
922 if (o)
923 *s = e;
924
925 *e = save_c;
926 expr_parse_end = e;
927
928 return o;
929 }
930
931 /* All RISC-V registers belong to one of these classes. */
932 enum reg_class
933 {
934 RCLASS_GPR,
935 RCLASS_FPR,
936 RCLASS_VECR,
937 RCLASS_VECM,
938 RCLASS_MAX,
939
940 RCLASS_CSR
941 };
942
943 static htab_t reg_names_hash = NULL;
944 static htab_t csr_extra_hash = NULL;
945
946 #define ENCODE_REG_HASH(cls, n) \
947 ((void *)(uintptr_t)((n) * RCLASS_MAX + (cls) + 1))
948 #define DECODE_REG_CLASS(hash) (((uintptr_t)(hash) - 1) % RCLASS_MAX)
949 #define DECODE_REG_NUM(hash) (((uintptr_t)(hash) - 1) / RCLASS_MAX)
950
951 static void
hash_reg_name(enum reg_class class,const char * name,unsigned n)952 hash_reg_name (enum reg_class class, const char *name, unsigned n)
953 {
954 void *hash = ENCODE_REG_HASH (class, n);
955 if (str_hash_insert (reg_names_hash, name, hash, 0) != NULL)
956 as_fatal (_("internal: duplicate %s"), name);
957 }
958
959 static void
hash_reg_names(enum reg_class class,const char names[][NRC],unsigned n)960 hash_reg_names (enum reg_class class, const char names[][NRC], unsigned n)
961 {
962 unsigned i;
963
964 for (i = 0; i < n; i++)
965 hash_reg_name (class, names[i], i);
966 }
967
968 /* Init hash table csr_extra_hash to handle CSR. */
969
970 static void
riscv_init_csr_hash(const char * name,unsigned address,enum riscv_csr_class class,enum riscv_spec_class define_version,enum riscv_spec_class abort_version)971 riscv_init_csr_hash (const char *name,
972 unsigned address,
973 enum riscv_csr_class class,
974 enum riscv_spec_class define_version,
975 enum riscv_spec_class abort_version)
976 {
977 struct riscv_csr_extra *entry, *pre_entry;
978 bool need_enrty = true;
979
980 pre_entry = NULL;
981 entry = (struct riscv_csr_extra *) str_hash_find (csr_extra_hash, name);
982 while (need_enrty && entry != NULL)
983 {
984 if (entry->csr_class == class
985 && entry->address == address
986 && entry->define_version == define_version
987 && entry->abort_version == abort_version)
988 need_enrty = false;
989 pre_entry = entry;
990 entry = entry->next;
991 }
992
993 /* Duplicate CSR. */
994 if (!need_enrty)
995 return;
996
997 entry = notes_alloc (sizeof (*entry));
998 entry->csr_class = class;
999 entry->address = address;
1000 entry->define_version = define_version;
1001 entry->abort_version = abort_version;
1002 entry->next = NULL;
1003
1004 if (pre_entry == NULL)
1005 str_hash_insert (csr_extra_hash, name, entry, 0);
1006 else
1007 pre_entry->next = entry;
1008 }
1009
1010 /* Return the CSR address after checking the ISA dependency and
1011 the privileged spec version.
1012
1013 There are one warning and two errors for CSR,
1014
1015 Invalid CSR: the CSR was defined, but isn't allowed for the current ISA
1016 or the privileged spec, report warning only if -mcsr-check is set.
1017 Unknown CSR: the CSR has never been defined, report error.
1018 Improper CSR: the CSR number over the range (> 0xfff), report error. */
1019
1020 static unsigned int
riscv_csr_address(const char * csr_name,struct riscv_csr_extra * entry)1021 riscv_csr_address (const char *csr_name,
1022 struct riscv_csr_extra *entry)
1023 {
1024 struct riscv_csr_extra *saved_entry = entry;
1025 enum riscv_csr_class csr_class = entry->csr_class;
1026 bool need_check_version = false;
1027 bool is_rv32_only = false;
1028 bool is_h_required = false;
1029 const char* extension = NULL;
1030
1031 switch (csr_class)
1032 {
1033 case CSR_CLASS_I_32:
1034 is_rv32_only = true;
1035 /* Fall through. */
1036 case CSR_CLASS_I:
1037 need_check_version = true;
1038 extension = "i";
1039 break;
1040 case CSR_CLASS_H_32:
1041 is_rv32_only = true;
1042 /* Fall through. */
1043 case CSR_CLASS_H:
1044 extension = "h";
1045 break;
1046 case CSR_CLASS_F:
1047 extension = "f";
1048 break;
1049 case CSR_CLASS_ZKR:
1050 extension = "zkr";
1051 break;
1052 case CSR_CLASS_V:
1053 extension = "zve32x";
1054 break;
1055 case CSR_CLASS_SMAIA_32:
1056 is_rv32_only = true;
1057 /* Fall through. */
1058 case CSR_CLASS_SMAIA:
1059 extension = "smaia";
1060 break;
1061 case CSR_CLASS_SMCNTRPMF_32:
1062 is_rv32_only = true;
1063 /* Fall through. */
1064 case CSR_CLASS_SMCNTRPMF:
1065 need_check_version = true;
1066 extension = "smcntrpmf";
1067 break;
1068 case CSR_CLASS_SMSTATEEN_32:
1069 is_rv32_only = true;
1070 /* Fall through. */
1071 case CSR_CLASS_SMSTATEEN:
1072 extension = "smstateen";
1073 break;
1074 case CSR_CLASS_SSAIA:
1075 case CSR_CLASS_SSAIA_AND_H:
1076 case CSR_CLASS_SSAIA_32:
1077 case CSR_CLASS_SSAIA_AND_H_32:
1078 is_rv32_only = (csr_class == CSR_CLASS_SSAIA_32
1079 || csr_class == CSR_CLASS_SSAIA_AND_H_32);
1080 is_h_required = (csr_class == CSR_CLASS_SSAIA_AND_H
1081 || csr_class == CSR_CLASS_SSAIA_AND_H_32);
1082 extension = "ssaia";
1083 break;
1084 case CSR_CLASS_SSSTATEEN_AND_H_32:
1085 is_rv32_only = true;
1086 /* Fall through. */
1087 case CSR_CLASS_SSSTATEEN_AND_H:
1088 is_h_required = true;
1089 /* Fall through. */
1090 case CSR_CLASS_SSSTATEEN:
1091 extension = "ssstateen";
1092 break;
1093 case CSR_CLASS_SSCOFPMF_32:
1094 is_rv32_only = true;
1095 /* Fall through. */
1096 case CSR_CLASS_SSCOFPMF:
1097 extension = "sscofpmf";
1098 break;
1099 case CSR_CLASS_SSTC:
1100 case CSR_CLASS_SSTC_AND_H:
1101 case CSR_CLASS_SSTC_32:
1102 case CSR_CLASS_SSTC_AND_H_32:
1103 is_rv32_only = (csr_class == CSR_CLASS_SSTC_32
1104 || csr_class == CSR_CLASS_SSTC_AND_H_32);
1105 is_h_required = (csr_class == CSR_CLASS_SSTC_AND_H
1106 || csr_class == CSR_CLASS_SSTC_AND_H_32);
1107 extension = "sstc";
1108 break;
1109 case CSR_CLASS_DEBUG:
1110 break;
1111 case CSR_CLASS_XTHEADVECTOR:
1112 extension = "xtheadvector";
1113 break;
1114 default:
1115 as_bad (_("internal: bad RISC-V CSR class (0x%x)"), csr_class);
1116 }
1117
1118 if (riscv_opts.csr_check)
1119 {
1120 if (is_rv32_only && xlen != 32)
1121 as_warn (_("invalid CSR `%s', needs rv32i extension"), csr_name);
1122 if (is_h_required && !riscv_subset_supports (&riscv_rps_as, "h"))
1123 as_warn (_("invalid CSR `%s', needs `h' extension"), csr_name);
1124
1125 if (extension != NULL
1126 && !riscv_subset_supports (&riscv_rps_as, extension))
1127 as_warn (_("invalid CSR `%s', needs `%s' extension"),
1128 csr_name, extension);
1129 }
1130
1131 while (entry != NULL)
1132 {
1133 if (!need_check_version
1134 || (default_priv_spec >= entry->define_version
1135 && default_priv_spec < entry->abort_version))
1136 {
1137 /* Find the CSR according to the specific version. */
1138 return entry->address;
1139 }
1140 entry = entry->next;
1141 }
1142
1143 /* Can not find the CSR address from the chosen privileged version,
1144 so use the newly defined value. */
1145 if (riscv_opts.csr_check)
1146 {
1147 const char *priv_name = NULL;
1148 RISCV_GET_PRIV_SPEC_NAME (priv_name, default_priv_spec);
1149 if (priv_name != NULL)
1150 as_warn (_("invalid CSR `%s' for the privileged spec `%s'"),
1151 csr_name, priv_name);
1152 }
1153
1154 return saved_entry->address;
1155 }
1156
1157 /* Return -1 if the CSR has never been defined. Otherwise, return
1158 the address. */
1159
1160 static unsigned int
reg_csr_lookup_internal(const char * s)1161 reg_csr_lookup_internal (const char *s)
1162 {
1163 struct riscv_csr_extra *r =
1164 (struct riscv_csr_extra *) str_hash_find (csr_extra_hash, s);
1165
1166 if (r == NULL)
1167 return -1U;
1168
1169 return riscv_csr_address (s, r);
1170 }
1171
1172 static unsigned int
reg_lookup_internal(const char * s,enum reg_class class)1173 reg_lookup_internal (const char *s, enum reg_class class)
1174 {
1175 void *r;
1176
1177 if (class == RCLASS_CSR)
1178 return reg_csr_lookup_internal (s);
1179
1180 r = str_hash_find (reg_names_hash, s);
1181 if (r == NULL || DECODE_REG_CLASS (r) != class)
1182 return -1;
1183
1184 if (riscv_subset_supports (&riscv_rps_as, "e")
1185 && class == RCLASS_GPR
1186 && DECODE_REG_NUM (r) > 15)
1187 return -1;
1188
1189 return DECODE_REG_NUM (r);
1190 }
1191
1192 static bool
reg_lookup(char ** s,enum reg_class class,unsigned int * regnop)1193 reg_lookup (char **s, enum reg_class class, unsigned int *regnop)
1194 {
1195 char *e;
1196 char save_c;
1197 int reg = -1;
1198
1199 /* Find end of name. */
1200 e = *s;
1201 if (is_name_beginner (*e))
1202 ++e;
1203 while (is_part_of_name (*e))
1204 ++e;
1205
1206 /* Terminate name. */
1207 save_c = *e;
1208 *e = '\0';
1209
1210 /* Look for the register. Advance to next token if one was recognized. */
1211 if ((reg = reg_lookup_internal (*s, class)) >= 0)
1212 *s = e;
1213
1214 *e = save_c;
1215 if (regnop)
1216 *regnop = reg;
1217 return reg >= 0;
1218 }
1219
1220 static bool
arg_lookup(char ** s,const char * const * array,size_t size,unsigned * regnop)1221 arg_lookup (char **s, const char *const *array, size_t size, unsigned *regnop)
1222 {
1223 const char *p = strchr (*s, ',');
1224 size_t i, len = p ? (size_t)(p - *s) : strlen (*s);
1225
1226 if (len == 0)
1227 return false;
1228
1229 for (i = 0; i < size; i++)
1230 if (array[i] != NULL && strncmp (array[i], *s, len) == 0
1231 && array[i][len] == '\0')
1232 {
1233 *regnop = i;
1234 *s += len;
1235 return true;
1236 }
1237
1238 return false;
1239 }
1240
1241 static bool
flt_lookup(float f,const float * array,size_t size,unsigned * regnop)1242 flt_lookup (float f, const float *array, size_t size, unsigned *regnop)
1243 {
1244 size_t i;
1245
1246 for (i = 0; i < size; i++)
1247 if (array[i] == f)
1248 {
1249 *regnop = i;
1250 return true;
1251 }
1252
1253 return false;
1254 }
1255
1256 #define USE_BITS(mask,shift) (used_bits |= ((insn_t)(mask) << (shift)))
1257 #define USE_IMM(n, s) \
1258 (used_bits |= ((insn_t)((1ull<<n)-1) << (s)))
1259
1260 /* For consistency checking, verify that all bits are specified either
1261 by the match/mask part of the instruction definition, or by the
1262 operand list. The `length` could be the actual instruction length or
1263 0 for auto-detection. */
1264
1265 static bool
validate_riscv_insn(const struct riscv_opcode * opc,int length)1266 validate_riscv_insn (const struct riscv_opcode *opc, int length)
1267 {
1268 const char *oparg, *opargStart;
1269 insn_t used_bits = opc->mask;
1270 int insn_width;
1271 insn_t required_bits;
1272
1273 if (length == 0)
1274 length = riscv_insn_length (opc->match);
1275 /* We don't support instructions longer than 64-bits yet. */
1276 if (length > 8)
1277 length = 8;
1278 insn_width = 8 * length;
1279
1280 required_bits = ((insn_t)~0ULL) >> (64 - insn_width);
1281
1282 if ((used_bits & opc->match) != (opc->match & required_bits))
1283 {
1284 as_bad (_("internal: bad RISC-V opcode (mask error): %s %s"),
1285 opc->name, opc->args);
1286 return false;
1287 }
1288
1289 for (oparg = opc->args; *oparg; ++oparg)
1290 {
1291 opargStart = oparg;
1292 switch (*oparg)
1293 {
1294 case 'C': /* RVC */
1295 switch (*++oparg)
1296 {
1297 case 'U': break; /* CRS1, constrained to equal RD. */
1298 case 'c': break; /* CRS1, constrained to equal sp. */
1299 case 'T': /* CRS2, floating point. */
1300 case 'V': USE_BITS (OP_MASK_CRS2, OP_SH_CRS2); break;
1301 case 'S': /* CRS1S, floating point. */
1302 case 's': USE_BITS (OP_MASK_CRS1S, OP_SH_CRS1S); break;
1303 case 'w': break; /* CRS1S, constrained to equal RD. */
1304 case 'D': /* CRS2S, floating point. */
1305 case 't': USE_BITS (OP_MASK_CRS2S, OP_SH_CRS2S); break;
1306 case 'x': break; /* CRS2S, constrained to equal RD. */
1307 case 'z': break; /* CRS2S, constrained to be x0. */
1308 case '>': /* CITYPE immediate, compressed shift. */
1309 case 'u': /* CITYPE immediate, compressed lui. */
1310 case 'v': /* CITYPE immediate, li to compressed lui. */
1311 case 'o': /* CITYPE immediate, allow zero. */
1312 case 'j': used_bits |= ENCODE_CITYPE_IMM (-1U); break;
1313 case 'L': used_bits |= ENCODE_CITYPE_ADDI16SP_IMM (-1U); break;
1314 case 'm': used_bits |= ENCODE_CITYPE_LWSP_IMM (-1U); break;
1315 case 'n': used_bits |= ENCODE_CITYPE_LDSP_IMM (-1U); break;
1316 case '6': used_bits |= ENCODE_CSSTYPE_IMM (-1U); break;
1317 case 'M': used_bits |= ENCODE_CSSTYPE_SWSP_IMM (-1U); break;
1318 case 'N': used_bits |= ENCODE_CSSTYPE_SDSP_IMM (-1U); break;
1319 case '8': used_bits |= ENCODE_CIWTYPE_IMM (-1U); break;
1320 case 'K': used_bits |= ENCODE_CIWTYPE_ADDI4SPN_IMM (-1U); break;
1321 /* CLTYPE and CSTYPE have the same immediate encoding. */
1322 case '5': used_bits |= ENCODE_CLTYPE_IMM (-1U); break;
1323 case 'k': used_bits |= ENCODE_CLTYPE_LW_IMM (-1U); break;
1324 case 'l': used_bits |= ENCODE_CLTYPE_LD_IMM (-1U); break;
1325 case 'p': used_bits |= ENCODE_CBTYPE_IMM (-1U); break;
1326 case 'a': used_bits |= ENCODE_CJTYPE_IMM (-1U); break;
1327 case 'F': /* Compressed funct for .insn directive. */
1328 switch (*++oparg)
1329 {
1330 case '6': USE_BITS (OP_MASK_CFUNCT6, OP_SH_CFUNCT6); break;
1331 case '4': USE_BITS (OP_MASK_CFUNCT4, OP_SH_CFUNCT4); break;
1332 case '3': USE_BITS (OP_MASK_CFUNCT3, OP_SH_CFUNCT3); break;
1333 case '2': USE_BITS (OP_MASK_CFUNCT2, OP_SH_CFUNCT2); break;
1334 default:
1335 goto unknown_validate_operand;
1336 }
1337 break;
1338 default:
1339 goto unknown_validate_operand;
1340 }
1341 break; /* end RVC */
1342 case 'V': /* RVV */
1343 switch (*++oparg)
1344 {
1345 case 'd':
1346 case 'f': USE_BITS (OP_MASK_VD, OP_SH_VD); break;
1347 case 'e': USE_BITS (OP_MASK_VWD, OP_SH_VWD); break;
1348 case 's': USE_BITS (OP_MASK_VS1, OP_SH_VS1); break;
1349 case 't': USE_BITS (OP_MASK_VS2, OP_SH_VS2); break;
1350 case 'u': USE_BITS (OP_MASK_VS1, OP_SH_VS1);
1351 USE_BITS (OP_MASK_VS2, OP_SH_VS2); break;
1352 case 'v': USE_BITS (OP_MASK_VD, OP_SH_VD);
1353 USE_BITS (OP_MASK_VS1, OP_SH_VS1);
1354 USE_BITS (OP_MASK_VS2, OP_SH_VS2); break;
1355 case '0': break;
1356 case 'b': used_bits |= ENCODE_RVV_VB_IMM (-1U); break;
1357 case 'c': used_bits |= ENCODE_RVV_VC_IMM (-1U); break;
1358 case 'i':
1359 case 'j':
1360 case 'k': USE_BITS (OP_MASK_VIMM, OP_SH_VIMM); break;
1361 case 'l': used_bits |= ENCODE_RVV_VI_UIMM6 (-1U); break;
1362 case 'm': USE_BITS (OP_MASK_VMASK, OP_SH_VMASK); break;
1363 case 'M': break; /* Macro operand, must be a mask register. */
1364 case 'T': break; /* Macro operand, must be a vector register. */
1365 default:
1366 goto unknown_validate_operand;
1367 }
1368 break; /* end RVV */
1369 case ',': break;
1370 case '(': break;
1371 case ')': break;
1372 case '<': USE_BITS (OP_MASK_SHAMTW, OP_SH_SHAMTW); break;
1373 case '>': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
1374 case 'A': break; /* Macro operand, must be symbol. */
1375 case 'B': break; /* Macro operand, must be symbol or constant. */
1376 case 'c': break; /* Macro operand, must be symbol or constant. */
1377 case 'I': break; /* Macro operand, must be constant. */
1378 case 'D': /* RD, floating point. */
1379 case 'd': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
1380 case 'y': USE_BITS (OP_MASK_BS, OP_SH_BS); break;
1381 case 'Y': USE_BITS (OP_MASK_RNUM, OP_SH_RNUM); break;
1382 case 'Z': /* RS1, CSR number. */
1383 case 'S': /* RS1, floating point. */
1384 case 's': USE_BITS (OP_MASK_RS1, OP_SH_RS1); break;
1385 case 'U': /* RS1 and RS2 are the same, floating point. */
1386 USE_BITS (OP_MASK_RS1, OP_SH_RS1);
1387 /* Fall through. */
1388 case 'T': /* RS2, floating point. */
1389 case 't': USE_BITS (OP_MASK_RS2, OP_SH_RS2); break;
1390 case 'R': /* RS3, floating point. */
1391 case 'r': USE_BITS (OP_MASK_RS3, OP_SH_RS3); break;
1392 case 'm': USE_BITS (OP_MASK_RM, OP_SH_RM); break;
1393 case 'E': USE_BITS (OP_MASK_CSR, OP_SH_CSR); break;
1394 case 'P': USE_BITS (OP_MASK_PRED, OP_SH_PRED); break;
1395 case 'Q': USE_BITS (OP_MASK_SUCC, OP_SH_SUCC); break;
1396 case 'o': /* ITYPE immediate, load displacement. */
1397 case 'j': used_bits |= ENCODE_ITYPE_IMM (-1U); break;
1398 case 'a': used_bits |= ENCODE_JTYPE_IMM (-1U); break;
1399 case 'p': used_bits |= ENCODE_BTYPE_IMM (-1U); break;
1400 case 'q': used_bits |= ENCODE_STYPE_IMM (-1U); break;
1401 case 'u': used_bits |= ENCODE_UTYPE_IMM (-1U); break;
1402 case 'z': break; /* Zero immediate. */
1403 case '[': break; /* Unused operand. */
1404 case ']': break; /* Unused operand. */
1405 case '0': break; /* AMO displacement, must to zero. */
1406 case '1': break; /* Relaxation operand. */
1407 case 'F': /* Funct for .insn directive. */
1408 switch (*++oparg)
1409 {
1410 case '7': USE_BITS (OP_MASK_FUNCT7, OP_SH_FUNCT7); break;
1411 case '3': USE_BITS (OP_MASK_FUNCT3, OP_SH_FUNCT3); break;
1412 case '2': USE_BITS (OP_MASK_FUNCT2, OP_SH_FUNCT2); break;
1413 default:
1414 goto unknown_validate_operand;
1415 }
1416 break;
1417 case 'O': /* Opcode for .insn directive. */
1418 switch (*++oparg)
1419 {
1420 case '4': USE_BITS (OP_MASK_OP, OP_SH_OP); break;
1421 case '2': USE_BITS (OP_MASK_OP2, OP_SH_OP2); break;
1422 default:
1423 goto unknown_validate_operand;
1424 }
1425 break;
1426 case 'W': /* Various operands for standard z extensions. */
1427 switch (*++oparg)
1428 {
1429 case 'i':
1430 switch (*++oparg)
1431 {
1432 case 'f': used_bits |= ENCODE_STYPE_IMM (-1U); break;
1433 default:
1434 goto unknown_validate_operand;
1435 }
1436 break;
1437 case 'f':
1438 switch (*++oparg)
1439 {
1440 case 'v': USE_BITS (OP_MASK_RS1, OP_SH_RS1); break;
1441 default:
1442 goto unknown_validate_operand;
1443 }
1444 break;
1445 case 'c':
1446 switch (*++oparg)
1447 {
1448 /* byte immediate operators, load/store byte insns. */
1449 case 'h': used_bits |= ENCODE_ZCB_HALFWORD_UIMM (-1U); break;
1450 /* halfword immediate operators, load/store halfword insns. */
1451 case 'b': used_bits |= ENCODE_ZCB_BYTE_UIMM (-1U); break;
1452 case 'f': break;
1453 default:
1454 goto unknown_validate_operand;
1455 }
1456 break;
1457 default:
1458 goto unknown_validate_operand;
1459 }
1460 break;
1461 case 'X': /* Vendor-specific operands. */
1462 switch (*++oparg)
1463 {
1464 case 't': /* Vendor-specific (T-head) operands. */
1465 {
1466 size_t n;
1467 size_t s;
1468 switch (*++oparg)
1469 {
1470 case 'V':
1471 switch (*++oparg)
1472 {
1473 case 'c': /* Vtypei for th.vsetvli. */
1474 used_bits |= ENCODE_RVV_VC_IMM (-1U); break;
1475 default:
1476 goto unknown_validate_operand;
1477 }
1478 break;
1479 case 'l': /* Integer immediate, literal. */
1480 oparg += strcspn(oparg, ",") - 1;
1481 break;
1482 case 's': /* Integer immediate, 'XtsN@S' ... N-bit signed immediate at bit S. */
1483 goto use_imm;
1484 case 'u': /* Integer immediate, 'XtuN@S' ... N-bit unsigned immediate at bit S. */
1485 goto use_imm;
1486 use_imm:
1487 n = strtol (oparg + 1, (char **)&oparg, 10);
1488 if (*oparg != '@')
1489 goto unknown_validate_operand;
1490 s = strtol (oparg + 1, (char **)&oparg, 10);
1491 oparg--;
1492
1493 USE_IMM (n, s);
1494 break;
1495 default:
1496 goto unknown_validate_operand;
1497 }
1498 }
1499 break;
1500 case 'c': /* Vendor-specific (CORE-V) operands. */
1501 switch (*++oparg)
1502 {
1503 case '2':
1504 /* ls2[4:0] */
1505 used_bits |= ENCODE_CV_IS2_UIMM5 (-1U);
1506 break;
1507 case '3':
1508 used_bits |= ENCODE_CV_IS3_UIMM5 (-1U);
1509 break;
1510 default:
1511 goto unknown_validate_operand;
1512 }
1513 break;
1514 case 's': /* Vendor-specific (SiFive) operands. */
1515 switch (*++oparg)
1516 {
1517 case 'd': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
1518 case 't': USE_BITS (OP_MASK_RS2, OP_SH_RS2); break;
1519 case 'O':
1520 switch (*++oparg)
1521 {
1522 case '2': USE_BITS (OP_MASK_XSO2, OP_SH_XSO2); break;
1523 case '1': USE_BITS (OP_MASK_XSO1, OP_SH_XSO1); break;
1524 default:
1525 goto unknown_validate_operand;
1526 }
1527 break;
1528 default:
1529 goto unknown_validate_operand;
1530 }
1531 break;
1532 default:
1533 goto unknown_validate_operand;
1534 }
1535 break;
1536 default:
1537 unknown_validate_operand:
1538 as_bad (_("internal: bad RISC-V opcode "
1539 "(unknown operand type `%s'): %s %s"),
1540 opargStart, opc->name, opc->args);
1541 return false;
1542 }
1543 }
1544
1545 if (used_bits != required_bits)
1546 {
1547 as_bad (_("internal: bad RISC-V opcode "
1548 "(bits %#llx undefined or invalid): %s %s"),
1549 (unsigned long long)(used_bits ^ required_bits),
1550 opc->name, opc->args);
1551 return false;
1552 }
1553 return true;
1554 }
1555
1556 #undef USE_BITS
1557
1558 struct percent_op_match
1559 {
1560 const char *str;
1561 bfd_reloc_code_real_type reloc;
1562 };
1563
1564 /* Common hash table initialization function for instruction and .insn
1565 directive. */
1566
1567 static htab_t
init_opcode_hash(const struct riscv_opcode * opcodes,bool insn_directive_p)1568 init_opcode_hash (const struct riscv_opcode *opcodes,
1569 bool insn_directive_p)
1570 {
1571 int i = 0;
1572 int length;
1573 htab_t hash = str_htab_create ();
1574 while (opcodes[i].name)
1575 {
1576 const char *name = opcodes[i].name;
1577 if (str_hash_insert (hash, name, &opcodes[i], 0) != NULL)
1578 as_fatal (_("internal: duplicate %s"), name);
1579
1580 do
1581 {
1582 if (opcodes[i].pinfo != INSN_MACRO)
1583 {
1584 if (insn_directive_p)
1585 length = ((name[0] == 'c') ? 2 : 4);
1586 else
1587 length = 0; /* Let assembler determine the length. */
1588 if (!validate_riscv_insn (&opcodes[i], length))
1589 as_fatal (_("internal: broken assembler. "
1590 "No assembly attempted"));
1591 }
1592 else
1593 gas_assert (!insn_directive_p);
1594 ++i;
1595 }
1596 while (opcodes[i].name && !strcmp (opcodes[i].name, name));
1597 }
1598
1599 return hash;
1600 }
1601
1602 /* Record all PC-relative high-part relocation that we have encountered to
1603 help us resolve the corresponding low-part relocation later. */
1604 typedef struct
1605 {
1606 bfd_vma address;
1607 symbolS *symbol;
1608 bfd_vma target;
1609 } riscv_pcrel_hi_fixup;
1610
1611 /* Handle of the pcrel_hi hash table. */
1612 static htab_t riscv_pcrel_hi_fixup_hash;
1613
1614 /* Get the key of a entry from the pcrel_hi hash table. */
1615
1616 static hashval_t
riscv_pcrel_fixup_hash(const void * entry)1617 riscv_pcrel_fixup_hash (const void *entry)
1618 {
1619 const riscv_pcrel_hi_fixup *e = entry;
1620 return (hashval_t) (e->address);
1621 }
1622
1623 /* Compare the keys between two entries fo the pcrel_hi hash table. */
1624
1625 static int
riscv_pcrel_fixup_eq(const void * entry1,const void * entry2)1626 riscv_pcrel_fixup_eq (const void *entry1, const void *entry2)
1627 {
1628 const riscv_pcrel_hi_fixup *e1 = entry1, *e2 = entry2;
1629 return e1->address == e2->address;
1630 }
1631
1632 /* Record the pcrel_hi relocation. */
1633
1634 static bool
riscv_record_pcrel_fixup(htab_t p,bfd_vma address,symbolS * symbol,bfd_vma target)1635 riscv_record_pcrel_fixup (htab_t p, bfd_vma address, symbolS *symbol,
1636 bfd_vma target)
1637 {
1638 riscv_pcrel_hi_fixup entry = {address, symbol, target};
1639 riscv_pcrel_hi_fixup **slot =
1640 (riscv_pcrel_hi_fixup **) htab_find_slot (p, &entry, INSERT);
1641 if (slot == NULL)
1642 return false;
1643
1644 *slot = (riscv_pcrel_hi_fixup *) xmalloc (sizeof (riscv_pcrel_hi_fixup));
1645 if (*slot == NULL)
1646 return false;
1647 **slot = entry;
1648 return true;
1649 }
1650
1651 /* This function is called once, at assembler startup time. It should set up
1652 all the tables, etc. that the MD part of the assembler will need. */
1653
1654 void
md_begin(void)1655 md_begin (void)
1656 {
1657 unsigned long mach = xlen == 64 ? bfd_mach_riscv64 : bfd_mach_riscv32;
1658
1659 if (! bfd_set_arch_mach (stdoutput, bfd_arch_riscv, mach))
1660 as_warn (_("could not set architecture and machine"));
1661
1662 op_hash = init_opcode_hash (riscv_opcodes, false);
1663 insn_type_hash = init_opcode_hash (riscv_insn_types, true);
1664
1665 reg_names_hash = str_htab_create ();
1666 hash_reg_names (RCLASS_GPR, riscv_gpr_names_numeric, NGPR);
1667 hash_reg_names (RCLASS_GPR, riscv_gpr_names_abi, NGPR);
1668 hash_reg_names (RCLASS_FPR, riscv_fpr_names_numeric, NFPR);
1669 hash_reg_names (RCLASS_FPR, riscv_fpr_names_abi, NFPR);
1670 hash_reg_names (RCLASS_VECR, riscv_vecr_names_numeric, NVECR);
1671 hash_reg_names (RCLASS_VECM, riscv_vecm_names_numeric, NVECM);
1672 /* Add "fp" as an alias for "s0". */
1673 hash_reg_name (RCLASS_GPR, "fp", 8);
1674
1675 /* Create and insert CSR hash tables. */
1676 csr_extra_hash = str_htab_create ();
1677 #define DECLARE_CSR(name, num, class, define_version, abort_version) \
1678 riscv_init_csr_hash (#name, num, class, define_version, abort_version);
1679 #define DECLARE_CSR_ALIAS(name, num, class, define_version, abort_version) \
1680 DECLARE_CSR(name, num, class, define_version, abort_version);
1681 #include "opcode/riscv-opc.h"
1682 #undef DECLARE_CSR
1683
1684 opcode_names_hash = str_htab_create ();
1685 init_opcode_names_hash ();
1686
1687 /* Create pcrel_hi hash table to resolve the relocation while with
1688 -mno-relax. */
1689 riscv_pcrel_hi_fixup_hash = htab_create (1024, riscv_pcrel_fixup_hash,
1690 riscv_pcrel_fixup_eq, free);
1691
1692 /* Set the default alignment for the text section. */
1693 record_alignment (text_section, riscv_opts.rvc ? 1 : 2);
1694 }
1695
1696 static insn_t
riscv_apply_const_reloc(bfd_reloc_code_real_type reloc_type,bfd_vma value)1697 riscv_apply_const_reloc (bfd_reloc_code_real_type reloc_type, bfd_vma value)
1698 {
1699 switch (reloc_type)
1700 {
1701 case BFD_RELOC_32:
1702 return value;
1703
1704 case BFD_RELOC_RISCV_HI20:
1705 return ENCODE_UTYPE_IMM (RISCV_CONST_HIGH_PART (value));
1706
1707 case BFD_RELOC_RISCV_LO12_S:
1708 return ENCODE_STYPE_IMM (value);
1709
1710 case BFD_RELOC_RISCV_LO12_I:
1711 return ENCODE_ITYPE_IMM (value);
1712
1713 default:
1714 abort ();
1715 }
1716 }
1717
1718 /* Output an instruction. IP is the instruction information.
1719 ADDRESS_EXPR is an operand of the instruction to be used with
1720 RELOC_TYPE. */
1721
1722 static void
append_insn(struct riscv_cl_insn * ip,expressionS * address_expr,bfd_reloc_code_real_type reloc_type)1723 append_insn (struct riscv_cl_insn *ip, expressionS *address_expr,
1724 bfd_reloc_code_real_type reloc_type)
1725 {
1726 dwarf2_emit_insn (0);
1727
1728 if (reloc_type != BFD_RELOC_UNUSED)
1729 {
1730 reloc_howto_type *howto;
1731
1732 gas_assert (address_expr);
1733 if (reloc_type == BFD_RELOC_12_PCREL
1734 || reloc_type == BFD_RELOC_RISCV_JMP)
1735 {
1736 int j = reloc_type == BFD_RELOC_RISCV_JMP;
1737 int best_case = insn_length (ip);
1738 unsigned worst_case = relaxed_branch_length (NULL, NULL, 0);
1739
1740 if (now_seg == absolute_section)
1741 {
1742 as_bad (_("relaxable branches not supported in absolute section"));
1743 return;
1744 }
1745
1746 add_relaxed_insn (ip, worst_case, best_case,
1747 RELAX_BRANCH_ENCODE (j, best_case == 2, worst_case),
1748 address_expr->X_add_symbol,
1749 address_expr->X_add_number);
1750 return;
1751 }
1752 else
1753 {
1754 howto = bfd_reloc_type_lookup (stdoutput, reloc_type);
1755 if (howto == NULL)
1756 as_bad (_("internal: unsupported RISC-V relocation number %d"),
1757 reloc_type);
1758
1759 ip->fixp = fix_new_exp (ip->frag, ip->where,
1760 bfd_get_reloc_size (howto),
1761 address_expr, false, reloc_type);
1762
1763 ip->fixp->fx_tcbit = riscv_opts.relax;
1764 ip->fixp->tc_fix_data.source_macro = source_macro;
1765 }
1766 }
1767
1768 add_fixed_insn (ip);
1769
1770 /* We need to start a new frag after any instruction that can be
1771 optimized away or compressed by the linker during relaxation, to prevent
1772 the assembler from computing static offsets across such an instruction.
1773 This is necessary to get correct EH info. */
1774 if (reloc_type == BFD_RELOC_RISCV_HI20
1775 || reloc_type == BFD_RELOC_RISCV_PCREL_HI20
1776 || reloc_type == BFD_RELOC_RISCV_TPREL_HI20
1777 || reloc_type == BFD_RELOC_RISCV_TPREL_ADD)
1778 {
1779 frag_wane (frag_now);
1780 frag_new (0);
1781 }
1782 }
1783
1784 /* Build an instruction created by a macro expansion. This is passed
1785 a pointer to the count of instructions created so far, an expression,
1786 the name of the instruction to build, an operand format string, and
1787 corresponding arguments. */
1788
1789 static void
macro_build(expressionS * ep,const char * name,const char * fmt,...)1790 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
1791 {
1792 const struct riscv_opcode *mo;
1793 struct riscv_cl_insn insn;
1794 bfd_reloc_code_real_type r;
1795 va_list args;
1796 const char *fmtStart;
1797
1798 va_start (args, fmt);
1799
1800 r = BFD_RELOC_UNUSED;
1801 mo = (struct riscv_opcode *) str_hash_find (op_hash, name);
1802 gas_assert (mo);
1803
1804 /* Find a non-RVC variant of the instruction. append_insn will compress
1805 it if possible. */
1806 while (riscv_insn_length (mo->match) < 4)
1807 mo++;
1808 gas_assert (strcmp (name, mo->name) == 0);
1809
1810 create_insn (&insn, mo);
1811 for (;; ++fmt)
1812 {
1813 fmtStart = fmt;
1814 switch (*fmt)
1815 {
1816 case 'V': /* RVV */
1817 switch (*++fmt)
1818 {
1819 case 'd':
1820 INSERT_OPERAND (VD, insn, va_arg (args, int));
1821 continue;
1822 case 's':
1823 INSERT_OPERAND (VS1, insn, va_arg (args, int));
1824 continue;
1825 case 't':
1826 INSERT_OPERAND (VS2, insn, va_arg (args, int));
1827 continue;
1828 case 'm':
1829 {
1830 int reg = va_arg (args, int);
1831 if (reg == -1)
1832 {
1833 INSERT_OPERAND (VMASK, insn, 1);
1834 continue;
1835 }
1836 else if (reg == 0)
1837 {
1838 INSERT_OPERAND (VMASK, insn, 0);
1839 continue;
1840 }
1841 else
1842 goto unknown_macro_argument;
1843 }
1844 default:
1845 goto unknown_macro_argument;
1846 }
1847 break;
1848
1849 case 'd':
1850 INSERT_OPERAND (RD, insn, va_arg (args, int));
1851 continue;
1852 case 's':
1853 INSERT_OPERAND (RS1, insn, va_arg (args, int));
1854 continue;
1855 case 't':
1856 INSERT_OPERAND (RS2, insn, va_arg (args, int));
1857 continue;
1858
1859 case 'j':
1860 case 'u':
1861 case 'q':
1862 gas_assert (ep != NULL);
1863 r = va_arg (args, int);
1864 continue;
1865
1866 case '\0':
1867 break;
1868 case ',':
1869 continue;
1870 default:
1871 unknown_macro_argument:
1872 as_fatal (_("internal: invalid macro argument `%s'"), fmtStart);
1873 }
1874 break;
1875 }
1876 va_end (args);
1877 gas_assert (r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
1878
1879 append_insn (&insn, ep, r);
1880 }
1881
1882 /* Build an instruction created by a macro expansion. Like md_assemble but
1883 accept a printf-style format string and arguments. */
1884
1885 static void
md_assemblef(const char * format,...)1886 md_assemblef (const char *format, ...)
1887 {
1888 char *buf = NULL;
1889 va_list ap;
1890 int r;
1891
1892 va_start (ap, format);
1893
1894 r = vasprintf (&buf, format, ap);
1895
1896 if (r < 0)
1897 as_fatal (_("internal: vasprintf failed"));
1898
1899 md_assemble (buf);
1900 free(buf);
1901
1902 va_end (ap);
1903 }
1904
1905 /* Sign-extend 32-bit mode constants that have bit 31 set and all higher bits
1906 unset. */
1907
1908 static void
normalize_constant_expr(expressionS * ex)1909 normalize_constant_expr (expressionS *ex)
1910 {
1911 if (xlen > 32)
1912 return;
1913 if ((ex->X_op == O_constant || ex->X_op == O_symbol)
1914 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
1915 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
1916 - 0x80000000);
1917 }
1918
1919 /* Fail if an expression EX is not a constant. IP is the instruction using EX.
1920 MAYBE_CSR is true if the symbol may be an unrecognized CSR name. */
1921
1922 static void
check_absolute_expr(struct riscv_cl_insn * ip,expressionS * ex,bool maybe_csr)1923 check_absolute_expr (struct riscv_cl_insn *ip, expressionS *ex,
1924 bool maybe_csr)
1925 {
1926 if (ex->X_op == O_big)
1927 as_bad (_("unsupported large constant"));
1928 else if (maybe_csr && ex->X_op == O_symbol)
1929 as_bad (_("unknown CSR `%s'"),
1930 S_GET_NAME (ex->X_add_symbol));
1931 else if (ex->X_op != O_constant)
1932 as_bad (_("instruction %s requires absolute expression"),
1933 ip->insn_mo->name);
1934 normalize_constant_expr (ex);
1935 }
1936
1937 static symbolS *
make_internal_label(void)1938 make_internal_label (void)
1939 {
1940 return (symbolS *) local_symbol_make (FAKE_LABEL_NAME, now_seg, frag_now,
1941 frag_now_fix ());
1942 }
1943
1944 /* Load an entry from the GOT. */
1945
1946 static void
pcrel_access(int destreg,int tempreg,expressionS * ep,const char * lo_insn,const char * lo_pattern,bfd_reloc_code_real_type hi_reloc,bfd_reloc_code_real_type lo_reloc)1947 pcrel_access (int destreg, int tempreg, expressionS *ep,
1948 const char *lo_insn, const char *lo_pattern,
1949 bfd_reloc_code_real_type hi_reloc,
1950 bfd_reloc_code_real_type lo_reloc)
1951 {
1952 expressionS ep2;
1953 ep2.X_op = O_symbol;
1954 ep2.X_add_symbol = make_internal_label ();
1955 ep2.X_add_number = 0;
1956
1957 macro_build (ep, "auipc", "d,u", tempreg, hi_reloc);
1958 macro_build (&ep2, lo_insn, lo_pattern, destreg, tempreg, lo_reloc);
1959 }
1960
1961 static void
pcrel_load(int destreg,int tempreg,expressionS * ep,const char * lo_insn,bfd_reloc_code_real_type hi_reloc,bfd_reloc_code_real_type lo_reloc)1962 pcrel_load (int destreg, int tempreg, expressionS *ep, const char *lo_insn,
1963 bfd_reloc_code_real_type hi_reloc,
1964 bfd_reloc_code_real_type lo_reloc)
1965 {
1966 pcrel_access (destreg, tempreg, ep, lo_insn, "d,s,j", hi_reloc, lo_reloc);
1967 }
1968
1969 static void
pcrel_store(int srcreg,int tempreg,expressionS * ep,const char * lo_insn,bfd_reloc_code_real_type hi_reloc,bfd_reloc_code_real_type lo_reloc)1970 pcrel_store (int srcreg, int tempreg, expressionS *ep, const char *lo_insn,
1971 bfd_reloc_code_real_type hi_reloc,
1972 bfd_reloc_code_real_type lo_reloc)
1973 {
1974 pcrel_access (srcreg, tempreg, ep, lo_insn, "t,s,q", hi_reloc, lo_reloc);
1975 }
1976
1977 /* PC-relative function call using AUIPC/JALR, relaxed to JAL. */
1978
1979 static void
riscv_call(int destreg,int tempreg,expressionS * ep,bfd_reloc_code_real_type reloc)1980 riscv_call (int destreg, int tempreg, expressionS *ep,
1981 bfd_reloc_code_real_type reloc)
1982 {
1983 /* Ensure the jalr is emitted to the same frag as the auipc. */
1984 frag_grow (8);
1985 macro_build (ep, "auipc", "d,u", tempreg, reloc);
1986 macro_build (NULL, "jalr", "d,s", destreg, tempreg);
1987 /* See comment at end of append_insn. */
1988 frag_wane (frag_now);
1989 frag_new (0);
1990 }
1991
1992 /* Load an integer constant into a register. */
1993
1994 static void
load_const(int reg,expressionS * ep)1995 load_const (int reg, expressionS *ep)
1996 {
1997 int shift = RISCV_IMM_BITS;
1998 bfd_vma upper_imm, sign = (bfd_vma) 1 << (RISCV_IMM_BITS - 1);
1999 expressionS upper = *ep, lower = *ep;
2000 lower.X_add_number = ((ep->X_add_number & (sign + sign - 1)) ^ sign) - sign;
2001 upper.X_add_number -= lower.X_add_number;
2002
2003 if (ep->X_op != O_constant)
2004 {
2005 as_bad (_("unsupported large constant"));
2006 return;
2007 }
2008
2009 if (xlen > 32 && !IS_SEXT_32BIT_NUM (ep->X_add_number))
2010 {
2011 /* Reduce to a signed 32-bit constant using SLLI and ADDI. */
2012 while (((upper.X_add_number >> shift) & 1) == 0)
2013 shift++;
2014
2015 upper.X_add_number = (int64_t) upper.X_add_number >> shift;
2016 load_const (reg, &upper);
2017
2018 md_assemblef ("slli x%d, x%d, 0x%x", reg, reg, shift);
2019 if (lower.X_add_number != 0)
2020 md_assemblef ("addi x%d, x%d, %" PRId64, reg, reg,
2021 (int64_t) lower.X_add_number);
2022 }
2023 else
2024 {
2025 /* Simply emit LUI and/or ADDI to build a 32-bit signed constant. */
2026 int hi_reg = 0;
2027
2028 if (upper.X_add_number != 0)
2029 {
2030 /* Discard low part and zero-extend upper immediate. */
2031 upper_imm = ((uint32_t)upper.X_add_number >> shift);
2032
2033 md_assemblef ("lui x%d, 0x%" PRIx64, reg, (uint64_t) upper_imm);
2034 hi_reg = reg;
2035 }
2036
2037 if (lower.X_add_number != 0 || hi_reg == 0)
2038 md_assemblef ("%s x%d, x%d, %" PRId64, ADD32_INSN, reg, hi_reg,
2039 (int64_t) lower.X_add_number);
2040 }
2041 }
2042
2043 /* Zero extend and sign extend byte/half-word/word. */
2044
2045 static void
riscv_ext(int destreg,int srcreg,unsigned shift,bool sign)2046 riscv_ext (int destreg, int srcreg, unsigned shift, bool sign)
2047 {
2048 md_assemblef ("slli x%d, x%d, %#x", destreg, srcreg, shift);
2049 md_assemblef ("sr%ci x%d, x%d, %#x",
2050 sign ? 'a' : 'l', destreg, destreg, shift);
2051 }
2052
2053 /* Expand RISC-V Vector macros into one or more instructions. */
2054
2055 static void
vector_macro(struct riscv_cl_insn * ip)2056 vector_macro (struct riscv_cl_insn *ip)
2057 {
2058 int vd = (ip->insn_opcode >> OP_SH_VD) & OP_MASK_VD;
2059 int vs1 = (ip->insn_opcode >> OP_SH_VS1) & OP_MASK_VS1;
2060 int vs2 = (ip->insn_opcode >> OP_SH_VS2) & OP_MASK_VS2;
2061 int vm = (ip->insn_opcode >> OP_SH_VMASK) & OP_MASK_VMASK;
2062 int vtemp = (ip->insn_opcode >> OP_SH_VFUNCT6) & OP_MASK_VFUNCT6;
2063 const char *vmslt_vx = ip->insn_mo->match ? "vmsltu.vx" : "vmslt.vx";
2064 int mask = ip->insn_mo->mask;
2065
2066 switch (mask)
2067 {
2068 case M_VMSGE:
2069 if (vm)
2070 {
2071 /* Unmasked. */
2072 macro_build (NULL, vmslt_vx, "Vd,Vt,sVm", vd, vs2, vs1, -1);
2073 macro_build (NULL, "vmnand.mm", "Vd,Vt,Vs", vd, vd, vd);
2074 break;
2075 }
2076 if (vtemp != 0)
2077 {
2078 /* Masked. Have vtemp to avoid overlap constraints. */
2079 if (vd == vm)
2080 {
2081 macro_build (NULL, vmslt_vx, "Vd,Vt,sVm", vtemp, vs2, vs1, -1);
2082 macro_build (NULL, "vmandnot.mm", "Vd,Vt,Vs", vd, vm, vtemp);
2083 }
2084 else
2085 {
2086 /* Preserve the value of vd if not updating by vm. */
2087 macro_build (NULL, vmslt_vx, "Vd,Vt,sVm", vtemp, vs2, vs1, -1);
2088 macro_build (NULL, "vmandnot.mm", "Vd,Vt,Vs", vtemp, vm, vtemp);
2089 macro_build (NULL, "vmandnot.mm", "Vd,Vt,Vs", vd, vd, vm);
2090 macro_build (NULL, "vmor.mm", "Vd,Vt,Vs", vd, vtemp, vd);
2091 }
2092 }
2093 else if (vd != vm)
2094 {
2095 /* Masked. This may cause the vd overlaps vs2, when LMUL > 1. */
2096 macro_build (NULL, vmslt_vx, "Vd,Vt,sVm", vd, vs2, vs1, vm);
2097 macro_build (NULL, "vmxor.mm", "Vd,Vt,Vs", vd, vd, vm);
2098 }
2099 else
2100 as_bad (_("must provide temp if destination overlaps mask"));
2101 break;
2102
2103 default:
2104 break;
2105 }
2106 }
2107
2108 /* Expand RISC-V assembly macros into one or more instructions. */
2109
2110 static void
macro(struct riscv_cl_insn * ip,expressionS * imm_expr,bfd_reloc_code_real_type * imm_reloc)2111 macro (struct riscv_cl_insn *ip, expressionS *imm_expr,
2112 bfd_reloc_code_real_type *imm_reloc)
2113 {
2114 int rd = (ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD;
2115 int rs1 = (ip->insn_opcode >> OP_SH_RS1) & OP_MASK_RS1;
2116 int rs2 = (ip->insn_opcode >> OP_SH_RS2) & OP_MASK_RS2;
2117 int mask = ip->insn_mo->mask;
2118
2119 source_macro = mask;
2120
2121 switch (mask)
2122 {
2123 case M_LI:
2124 load_const (rd, imm_expr);
2125 break;
2126
2127 case M_LA:
2128 case M_LLA:
2129 case M_LGA:
2130 /* Load the address of a symbol into a register. */
2131 if (!IS_SEXT_32BIT_NUM (imm_expr->X_add_number))
2132 as_bad (_("offset too large"));
2133
2134 if (imm_expr->X_op == O_constant)
2135 load_const (rd, imm_expr);
2136 /* Global PIC symbol. */
2137 else if ((riscv_opts.pic && mask == M_LA)
2138 || mask == M_LGA)
2139 pcrel_load (rd, rd, imm_expr, LOAD_ADDRESS_INSN,
2140 BFD_RELOC_RISCV_GOT_HI20, BFD_RELOC_RISCV_PCREL_LO12_I);
2141 /* Local PIC symbol, or any non-PIC symbol. */
2142 else
2143 pcrel_load (rd, rd, imm_expr, "addi",
2144 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_I);
2145 break;
2146
2147 case M_LA_TLS_GD:
2148 pcrel_load (rd, rd, imm_expr, "addi",
2149 BFD_RELOC_RISCV_TLS_GD_HI20, BFD_RELOC_RISCV_PCREL_LO12_I);
2150 break;
2151
2152 case M_LA_TLS_IE:
2153 pcrel_load (rd, rd, imm_expr, LOAD_ADDRESS_INSN,
2154 BFD_RELOC_RISCV_TLS_GOT_HI20, BFD_RELOC_RISCV_PCREL_LO12_I);
2155 break;
2156
2157 case M_Lx:
2158 pcrel_load (rd, rd, imm_expr, ip->insn_mo->name,
2159 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_I);
2160 break;
2161
2162 case M_FLx:
2163 pcrel_load (rd, rs1, imm_expr, ip->insn_mo->name,
2164 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_I);
2165 break;
2166
2167 case M_Sx_FSx:
2168 pcrel_store (rs2, rs1, imm_expr, ip->insn_mo->name,
2169 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_S);
2170 break;
2171
2172 case M_CALL:
2173 riscv_call (rd, rs1, imm_expr, *imm_reloc);
2174 break;
2175
2176 case M_EXTH:
2177 riscv_ext (rd, rs1, xlen - 16, *ip->insn_mo->name == 's');
2178 break;
2179
2180 case M_ZEXTW:
2181 riscv_ext (rd, rs1, xlen - 32, false);
2182 break;
2183
2184 case M_SEXTB:
2185 riscv_ext (rd, rs1, xlen - 8, true);
2186 break;
2187
2188 case M_VMSGE:
2189 vector_macro (ip);
2190 break;
2191
2192 default:
2193 as_bad (_("internal: macro %s not implemented"), ip->insn_mo->name);
2194 break;
2195 }
2196
2197 source_macro = -1;
2198 }
2199
2200 static const struct percent_op_match percent_op_utype[] =
2201 {
2202 {"tprel_hi", BFD_RELOC_RISCV_TPREL_HI20},
2203 {"pcrel_hi", BFD_RELOC_RISCV_PCREL_HI20},
2204 {"got_pcrel_hi", BFD_RELOC_RISCV_GOT_HI20},
2205 {"tls_ie_pcrel_hi", BFD_RELOC_RISCV_TLS_GOT_HI20},
2206 {"tls_gd_pcrel_hi", BFD_RELOC_RISCV_TLS_GD_HI20},
2207 {"hi", BFD_RELOC_RISCV_HI20},
2208 {0, 0}
2209 };
2210
2211 static const struct percent_op_match percent_op_itype[] =
2212 {
2213 {"lo", BFD_RELOC_RISCV_LO12_I},
2214 {"tprel_lo", BFD_RELOC_RISCV_TPREL_LO12_I},
2215 {"pcrel_lo", BFD_RELOC_RISCV_PCREL_LO12_I},
2216 {0, 0}
2217 };
2218
2219 static const struct percent_op_match percent_op_stype[] =
2220 {
2221 {"lo", BFD_RELOC_RISCV_LO12_S},
2222 {"tprel_lo", BFD_RELOC_RISCV_TPREL_LO12_S},
2223 {"pcrel_lo", BFD_RELOC_RISCV_PCREL_LO12_S},
2224 {0, 0}
2225 };
2226
2227 static const struct percent_op_match percent_op_rtype[] =
2228 {
2229 {"tprel_add", BFD_RELOC_RISCV_TPREL_ADD},
2230 {0, 0}
2231 };
2232
2233 static const struct percent_op_match percent_op_null[] =
2234 {
2235 {0, 0}
2236 };
2237
2238 /* Return true if *STR points to a relocation operator. When returning true,
2239 move *STR over the operator and store its relocation code in *RELOC.
2240 Leave both *STR and *RELOC alone when returning false. */
2241
2242 static bool
parse_relocation(char ** str,bfd_reloc_code_real_type * reloc,const struct percent_op_match * percent_op)2243 parse_relocation (char **str, bfd_reloc_code_real_type *reloc,
2244 const struct percent_op_match *percent_op)
2245 {
2246 for ( ; percent_op->str; percent_op++)
2247 if (strncasecmp (*str + 1, percent_op->str, strlen (percent_op->str)) == 0)
2248 {
2249 size_t len = 1 + strlen (percent_op->str);
2250
2251 while (ISSPACE ((*str)[len]))
2252 ++len;
2253 if ((*str)[len] != '(')
2254 continue;
2255
2256 *str += len;
2257 *reloc = percent_op->reloc;
2258
2259 /* Check whether the output BFD supports this relocation.
2260 If not, issue an error and fall back on something safe. */
2261 if (*reloc != BFD_RELOC_UNUSED
2262 && !bfd_reloc_type_lookup (stdoutput, *reloc))
2263 {
2264 as_bad ("internal: relocation %s isn't supported by the "
2265 "current ABI", percent_op->str);
2266 *reloc = BFD_RELOC_UNUSED;
2267 }
2268 return true;
2269 }
2270 return false;
2271 }
2272
2273 static void
my_getExpression(expressionS * ep,char * str)2274 my_getExpression (expressionS *ep, char *str)
2275 {
2276 char *save_in;
2277
2278 save_in = input_line_pointer;
2279 input_line_pointer = str;
2280 expression (ep);
2281 expr_parse_end = input_line_pointer;
2282 input_line_pointer = save_in;
2283 }
2284
2285 /* Parse string STR as a 16-bit relocatable operand. Store the
2286 expression in *EP and the relocation, if any, in RELOC.
2287 Return the number of relocation operators used (0 or 1).
2288
2289 On exit, EXPR_PARSE_END points to the first character after the
2290 expression. */
2291
2292 static size_t
my_getSmallExpression(expressionS * ep,bfd_reloc_code_real_type * reloc,char * str,const struct percent_op_match * percent_op)2293 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
2294 char *str, const struct percent_op_match *percent_op)
2295 {
2296 size_t reloc_index;
2297 unsigned crux_depth, str_depth;
2298 bool orig_probing = probing_insn_operands;
2299 char *crux;
2300
2301 /* Search for the start of the main expression.
2302
2303 End the loop with CRUX pointing to the start of the main expression and
2304 with CRUX_DEPTH containing the number of open brackets at that point. */
2305 reloc_index = -1;
2306 str_depth = 0;
2307 do
2308 {
2309 reloc_index++;
2310 crux = str;
2311 crux_depth = str_depth;
2312
2313 /* Skip over whitespace and brackets, keeping count of the number
2314 of brackets. */
2315 while (*str == ' ' || *str == '\t' || *str == '(')
2316 if (*str++ == '(')
2317 str_depth++;
2318 }
2319 while (*str == '%'
2320 && reloc_index < 1
2321 && parse_relocation (&str, reloc, percent_op));
2322
2323 if (*str == '%')
2324 {
2325 /* expression() will choke on anything looking like an (unrecognized)
2326 relocation specifier. Don't even call it, avoiding multiple (and
2327 perhaps redundant) error messages; our caller will issue one. */
2328 ep->X_op = O_illegal;
2329 return 0;
2330 }
2331
2332 /* Anything inside parentheses or subject to a relocation operator cannot
2333 be a register and hence can be treated the same as operands to
2334 directives (other than .insn). */
2335 if (str_depth || reloc_index)
2336 probing_insn_operands = false;
2337
2338 my_getExpression (ep, crux);
2339 str = expr_parse_end;
2340
2341 probing_insn_operands = orig_probing;
2342
2343 /* Match every open bracket. */
2344 while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
2345 if (*str++ == ')')
2346 crux_depth--;
2347
2348 if (crux_depth > 0)
2349 as_bad ("unclosed '('");
2350
2351 expr_parse_end = str;
2352
2353 return reloc_index;
2354 }
2355
2356 /* Parse opcode name, could be an mnemonics or number. */
2357
2358 static size_t
my_getOpcodeExpression(expressionS * ep,bfd_reloc_code_real_type * reloc,char * str)2359 my_getOpcodeExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
2360 char *str)
2361 {
2362 const struct opcode_name_t *o = opcode_name_lookup (&str);
2363
2364 if (o != NULL)
2365 {
2366 ep->X_op = O_constant;
2367 ep->X_add_number = o->val;
2368 return 0;
2369 }
2370
2371 return my_getSmallExpression (ep, reloc, str, percent_op_null);
2372 }
2373
2374 /* Parse string STR as a vsetvli operand. Store the expression in *EP.
2375 On exit, EXPR_PARSE_END points to the first character after the
2376 expression. */
2377
2378 static void
my_getVsetvliExpression(expressionS * ep,char * str)2379 my_getVsetvliExpression (expressionS *ep, char *str)
2380 {
2381 unsigned int vsew_value = 0, vlmul_value = 0;
2382 unsigned int vta_value = 0, vma_value = 0;
2383 bfd_boolean vsew_found = FALSE, vlmul_found = FALSE;
2384 bfd_boolean vta_found = FALSE, vma_found = FALSE;
2385
2386 if (arg_lookup (&str, riscv_vsew, ARRAY_SIZE (riscv_vsew), &vsew_value))
2387 {
2388 if (*str == ',')
2389 ++str;
2390 if (vsew_found)
2391 as_bad (_("multiple vsew constants"));
2392 vsew_found = TRUE;
2393 }
2394 if (arg_lookup (&str, riscv_vlmul, ARRAY_SIZE (riscv_vlmul), &vlmul_value))
2395 {
2396 if (*str == ',')
2397 ++str;
2398 if (vlmul_found)
2399 as_bad (_("multiple vlmul constants"));
2400 vlmul_found = TRUE;
2401 }
2402 if (arg_lookup (&str, riscv_vta, ARRAY_SIZE (riscv_vta), &vta_value))
2403 {
2404 if (*str == ',')
2405 ++str;
2406 if (vta_found)
2407 as_bad (_("multiple vta constants"));
2408 vta_found = TRUE;
2409 }
2410 if (arg_lookup (&str, riscv_vma, ARRAY_SIZE (riscv_vma), &vma_value))
2411 {
2412 if (*str == ',')
2413 ++str;
2414 if (vma_found)
2415 as_bad (_("multiple vma constants"));
2416 vma_found = TRUE;
2417 }
2418
2419 if (vsew_found || vlmul_found || vta_found || vma_found)
2420 {
2421 ep->X_op = O_constant;
2422 ep->X_add_number = (vlmul_value << OP_SH_VLMUL)
2423 | (vsew_value << OP_SH_VSEW)
2424 | (vta_value << OP_SH_VTA)
2425 | (vma_value << OP_SH_VMA);
2426 expr_parse_end = str;
2427 }
2428 else
2429 {
2430 my_getExpression (ep, str);
2431 str = expr_parse_end;
2432 }
2433 }
2434
2435 /* Parse string STR as a th.vsetvli operand. Store the expression in *EP.
2436 On exit, EXPR_PARSE_END points to the first character after the
2437 expression. */
2438
2439 static void
my_getThVsetvliExpression(expressionS * ep,char * str)2440 my_getThVsetvliExpression (expressionS *ep, char *str)
2441 {
2442 unsigned int vsew_value = 0, vlen_value = 0, vediv_value = 0;
2443 bfd_boolean vsew_found = FALSE, vlen_found = FALSE, vediv_found = FALSE;
2444
2445 if (arg_lookup (&str, riscv_vsew, ARRAY_SIZE (riscv_vsew),
2446 &vsew_value))
2447 {
2448 if (*str == ',')
2449 ++str;
2450 if (vsew_found)
2451 as_bad (_("multiple vsew constants"));
2452 vsew_found = TRUE;
2453 }
2454
2455 if (arg_lookup (&str, riscv_th_vlen, ARRAY_SIZE (riscv_th_vlen),
2456 &vlen_value))
2457 {
2458 if (*str == ',')
2459 ++str;
2460 if (vlen_found)
2461 as_bad (_("multiple vlen constants"));
2462 vlen_found = TRUE;
2463 }
2464 if (arg_lookup (&str, riscv_th_vediv, ARRAY_SIZE (riscv_th_vediv),
2465 &vediv_value))
2466 {
2467 if (*str == ',')
2468 ++str;
2469 if (vediv_found)
2470 as_bad (_("multiple vediv constants"));
2471 vediv_found = TRUE;
2472 }
2473
2474 if (vlen_found || vediv_found || vsew_found)
2475 {
2476 ep->X_op = O_constant;
2477 ep->X_add_number
2478 = (vediv_value << 5) | (vsew_value << 2) | (vlen_value);
2479 expr_parse_end = str;
2480 }
2481 else
2482 {
2483 my_getExpression (ep, str);
2484 str = expr_parse_end;
2485 }
2486 }
2487
2488 /* Detect and handle implicitly zero load-store offsets. For example,
2489 "lw t0, (t1)" is shorthand for "lw t0, 0(t1)". Return true if such
2490 an implicit offset was detected. */
2491
2492 static bool
riscv_handle_implicit_zero_offset(expressionS * ep,const char * s)2493 riscv_handle_implicit_zero_offset (expressionS *ep, const char *s)
2494 {
2495 /* Check whether there is only a single bracketed expression left.
2496 If so, it must be the base register and the constant must be zero. */
2497 if (*s == '(' && strchr (s + 1, '(') == 0)
2498 {
2499 ep->X_op = O_constant;
2500 ep->X_add_number = 0;
2501 return true;
2502 }
2503
2504 return false;
2505 }
2506
2507 /* All RISC-V CSR instructions belong to one of these classes. */
2508 enum csr_insn_type
2509 {
2510 INSN_NOT_CSR,
2511 INSN_CSRRW,
2512 INSN_CSRRS,
2513 INSN_CSRRC
2514 };
2515
2516 /* Return which CSR instruction is checking. */
2517
2518 static enum csr_insn_type
riscv_csr_insn_type(insn_t insn)2519 riscv_csr_insn_type (insn_t insn)
2520 {
2521 if (((insn ^ MATCH_CSRRW) & MASK_CSRRW) == 0
2522 || ((insn ^ MATCH_CSRRWI) & MASK_CSRRWI) == 0)
2523 return INSN_CSRRW;
2524 else if (((insn ^ MATCH_CSRRS) & MASK_CSRRS) == 0
2525 || ((insn ^ MATCH_CSRRSI) & MASK_CSRRSI) == 0)
2526 return INSN_CSRRS;
2527 else if (((insn ^ MATCH_CSRRC) & MASK_CSRRC) == 0
2528 || ((insn ^ MATCH_CSRRCI) & MASK_CSRRCI) == 0)
2529 return INSN_CSRRC;
2530 else
2531 return INSN_NOT_CSR;
2532 }
2533
2534 /* CSRRW and CSRRWI always write CSR. CSRRS, CSRRC, CSRRSI and CSRRCI write
2535 CSR when RS1 isn't zero. The CSR is read only if the [11:10] bits of
2536 CSR address is 0x3. */
2537
2538 static bool
riscv_csr_read_only_check(insn_t insn)2539 riscv_csr_read_only_check (insn_t insn)
2540 {
2541 int csr = (insn & (OP_MASK_CSR << OP_SH_CSR)) >> OP_SH_CSR;
2542 int rs1 = (insn & (OP_MASK_RS1 << OP_SH_RS1)) >> OP_SH_RS1;
2543 int readonly = (((csr & (0x3 << 10)) >> 10) == 0x3);
2544 enum csr_insn_type csr_insn = riscv_csr_insn_type (insn);
2545
2546 if (readonly
2547 && (((csr_insn == INSN_CSRRS
2548 || csr_insn == INSN_CSRRC)
2549 && rs1 != 0)
2550 || csr_insn == INSN_CSRRW))
2551 return false;
2552
2553 return true;
2554 }
2555
2556 /* Return true if it is a privileged instruction. Otherwise, return false.
2557
2558 uret is actually a N-ext instruction. So it is better to regard it as
2559 an user instruction rather than the priv instruction.
2560
2561 hret is used to return from traps in H-mode. H-mode is removed since
2562 the v1.10 priv spec, but probably be added in the new hypervisor spec.
2563 Therefore, hret should be controlled by the hypervisor spec rather than
2564 priv spec in the future.
2565
2566 dret is defined in the debug spec, so it should be checked in the future,
2567 too. */
2568
2569 static bool
riscv_is_priv_insn(insn_t insn)2570 riscv_is_priv_insn (insn_t insn)
2571 {
2572 return (((insn ^ MATCH_SRET) & MASK_SRET) == 0
2573 || ((insn ^ MATCH_MRET) & MASK_MRET) == 0
2574 || ((insn ^ MATCH_SFENCE_VMA) & MASK_SFENCE_VMA) == 0
2575 || ((insn ^ MATCH_WFI) & MASK_WFI) == 0
2576 /* The sfence.vm is dropped in the v1.10 priv specs, but we still need to
2577 check it here to keep the compatible. */
2578 || ((insn ^ MATCH_SFENCE_VM) & MASK_SFENCE_VM) == 0);
2579 }
2580
2581 static symbolS *deferred_sym_rootP;
2582 static symbolS *deferred_sym_lastP;
2583 /* Since symbols can't easily be freed, try to recycle ones which weren't
2584 committed. */
2585 static symbolS *orphan_sym_rootP;
2586 static symbolS *orphan_sym_lastP;
2587
2588 /* This routine assembles an instruction into its binary format. As a
2589 side effect, it sets the global variable imm_reloc to the type of
2590 relocation to do if one of the operands is an address expression. */
2591
2592 static struct riscv_ip_error
riscv_ip(char * str,struct riscv_cl_insn * ip,expressionS * imm_expr,bfd_reloc_code_real_type * imm_reloc,htab_t hash)2593 riscv_ip (char *str, struct riscv_cl_insn *ip, expressionS *imm_expr,
2594 bfd_reloc_code_real_type *imm_reloc, htab_t hash)
2595 {
2596 /* The operand string defined in the riscv_opcodes. */
2597 const char *oparg, *opargStart;
2598 /* The parsed operands from assembly. */
2599 char *asarg, *asargStart;
2600 char save_c = 0;
2601 struct riscv_opcode *insn;
2602 unsigned int regno;
2603 const struct percent_op_match *p;
2604 struct riscv_ip_error error;
2605 error.msg = "unrecognized opcode";
2606 error.statement = str;
2607 error.missing_ext = NULL;
2608 /* Indicate we are assembling instruction with CSR. */
2609 bool insn_with_csr = false;
2610
2611 /* Parse the name of the instruction. Terminate the string if whitespace
2612 is found so that str_hash_find only sees the name part of the string. */
2613 for (asarg = str; *asarg!= '\0'; ++asarg)
2614 if (ISSPACE (*asarg))
2615 {
2616 save_c = *asarg;
2617 *asarg++ = '\0';
2618 break;
2619 }
2620
2621 insn = (struct riscv_opcode *) str_hash_find (hash, str);
2622
2623 probing_insn_operands = true;
2624
2625 asargStart = asarg;
2626 for ( ; insn && insn->name && strcmp (insn->name, str) == 0; insn++)
2627 {
2628 if ((insn->xlen_requirement != 0) && (xlen != insn->xlen_requirement))
2629 continue;
2630
2631 if (!riscv_multi_subset_supports (&riscv_rps_as, insn->insn_class))
2632 {
2633 error.missing_ext = riscv_multi_subset_supports_ext (&riscv_rps_as,
2634 insn->insn_class);
2635 continue;
2636 }
2637
2638 /* Reset error message of the previous round. */
2639 error.msg = _("illegal operands");
2640 error.missing_ext = NULL;
2641
2642 /* Purge deferred symbols from the previous round, if any. */
2643 while (deferred_sym_rootP)
2644 {
2645 symbolS *sym = deferred_sym_rootP;
2646
2647 symbol_remove (sym, &deferred_sym_rootP, &deferred_sym_lastP);
2648 symbol_append (sym, orphan_sym_lastP, &orphan_sym_rootP,
2649 &orphan_sym_lastP);
2650 }
2651
2652 create_insn (ip, insn);
2653
2654 imm_expr->X_op = O_absent;
2655 *imm_reloc = BFD_RELOC_UNUSED;
2656 p = percent_op_null;
2657
2658 for (oparg = insn->args;; ++oparg)
2659 {
2660 opargStart = oparg;
2661 asarg += strspn (asarg, " \t");
2662 switch (*oparg)
2663 {
2664 case '\0': /* End of args. */
2665 if (insn->match_func && !insn->match_func (insn, ip->insn_opcode))
2666 break;
2667
2668 if (insn->pinfo != INSN_MACRO)
2669 {
2670 /* For .insn, insn->match and insn->mask are 0. */
2671 if (riscv_insn_length ((insn->match == 0 && insn->mask == 0)
2672 ? ip->insn_opcode
2673 : insn->match) == 2
2674 && !riscv_opts.rvc)
2675 break;
2676
2677 if (riscv_is_priv_insn (ip->insn_opcode))
2678 explicit_priv_attr = true;
2679
2680 /* Check if we write a read-only CSR by the CSR
2681 instruction. */
2682 if (insn_with_csr
2683 && riscv_opts.csr_check
2684 && !riscv_csr_read_only_check (ip->insn_opcode))
2685 {
2686 /* Restore the character in advance, since we want to
2687 report the detailed warning message here. */
2688 if (save_c)
2689 *(asargStart - 1) = save_c;
2690 as_warn (_("read-only CSR is written `%s'"), str);
2691 insn_with_csr = false;
2692 }
2693
2694 /* The (segmant) load and store with EEW 64 cannot be used
2695 when zve32x is enabled. */
2696 if (ip->insn_mo->pinfo & INSN_V_EEW64
2697 && riscv_subset_supports (&riscv_rps_as, "zve32x")
2698 && !riscv_subset_supports (&riscv_rps_as, "zve64x"))
2699 {
2700 error.msg = _("illegal opcode for zve32x");
2701 break;
2702 }
2703 }
2704 if (*asarg != '\0')
2705 break;
2706
2707 /* Successful assembly. */
2708 error.msg = NULL;
2709 insn_with_csr = false;
2710
2711 /* Commit deferred symbols, if any. */
2712 while (deferred_sym_rootP)
2713 {
2714 symbolS *sym = deferred_sym_rootP;
2715
2716 symbol_remove (sym, &deferred_sym_rootP,
2717 &deferred_sym_lastP);
2718 symbol_append (sym, symbol_lastP, &symbol_rootP,
2719 &symbol_lastP);
2720 symbol_table_insert (sym);
2721 }
2722 goto out;
2723
2724 case 'C': /* RVC */
2725 switch (*++oparg)
2726 {
2727 case 's': /* RS1 x8-x15. */
2728 if (!reg_lookup (&asarg, RCLASS_GPR, ®no)
2729 || !(regno >= 8 && regno <= 15))
2730 break;
2731 INSERT_OPERAND (CRS1S, *ip, regno % 8);
2732 continue;
2733 case 'w': /* RS1 x8-x15, constrained to equal RD x8-x15. */
2734 if (!reg_lookup (&asarg, RCLASS_GPR, ®no)
2735 || EXTRACT_OPERAND (CRS1S, ip->insn_opcode) + 8 != regno)
2736 break;
2737 continue;
2738 case 't': /* RS2 x8-x15. */
2739 if (!reg_lookup (&asarg, RCLASS_GPR, ®no)
2740 || !(regno >= 8 && regno <= 15))
2741 break;
2742 INSERT_OPERAND (CRS2S, *ip, regno % 8);
2743 continue;
2744 case 'x': /* RS2 x8-x15, constrained to equal RD x8-x15. */
2745 if (!reg_lookup (&asarg, RCLASS_GPR, ®no)
2746 || EXTRACT_OPERAND (CRS2S, ip->insn_opcode) + 8 != regno)
2747 break;
2748 continue;
2749 case 'U': /* RS1, constrained to equal RD. */
2750 if (!reg_lookup (&asarg, RCLASS_GPR, ®no)
2751 || EXTRACT_OPERAND (RD, ip->insn_opcode) != regno)
2752 break;
2753 continue;
2754 case 'V': /* RS2 */
2755 if (!reg_lookup (&asarg, RCLASS_GPR, ®no))
2756 break;
2757 INSERT_OPERAND (CRS2, *ip, regno);
2758 continue;
2759 case 'c': /* RS1, constrained to equal sp. */
2760 if (!reg_lookup (&asarg, RCLASS_GPR, ®no)
2761 || regno != X_SP)
2762 break;
2763 continue;
2764 case 'z': /* RS2, constrained to equal x0. */
2765 if (!reg_lookup (&asarg, RCLASS_GPR, ®no)
2766 || regno != 0)
2767 break;
2768 continue;
2769 case '>': /* Shift amount, 0 - (XLEN-1). */
2770 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
2771 || imm_expr->X_op != O_constant
2772 || (unsigned long) imm_expr->X_add_number >= xlen)
2773 break;
2774 ip->insn_opcode |= ENCODE_CITYPE_IMM (imm_expr->X_add_number);
2775 rvc_imm_done:
2776 asarg = expr_parse_end;
2777 imm_expr->X_op = O_absent;
2778 continue;
2779 case '5':
2780 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
2781 || imm_expr->X_op != O_constant
2782 || imm_expr->X_add_number < 0
2783 || imm_expr->X_add_number >= 32
2784 || !VALID_CLTYPE_IMM ((valueT) imm_expr->X_add_number))
2785 break;
2786 ip->insn_opcode |= ENCODE_CLTYPE_IMM (imm_expr->X_add_number);
2787 goto rvc_imm_done;
2788 case '6':
2789 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
2790 || imm_expr->X_op != O_constant
2791 || imm_expr->X_add_number < 0
2792 || imm_expr->X_add_number >= 64
2793 || !VALID_CSSTYPE_IMM ((valueT) imm_expr->X_add_number))
2794 break;
2795 ip->insn_opcode |= ENCODE_CSSTYPE_IMM (imm_expr->X_add_number);
2796 goto rvc_imm_done;
2797 case '8':
2798 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
2799 || imm_expr->X_op != O_constant
2800 || imm_expr->X_add_number < 0
2801 || imm_expr->X_add_number >= 256
2802 || !VALID_CIWTYPE_IMM ((valueT) imm_expr->X_add_number))
2803 break;
2804 ip->insn_opcode |= ENCODE_CIWTYPE_IMM (imm_expr->X_add_number);
2805 goto rvc_imm_done;
2806 case 'j':
2807 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
2808 || imm_expr->X_op != O_constant
2809 || imm_expr->X_add_number == 0
2810 || !VALID_CITYPE_IMM ((valueT) imm_expr->X_add_number))
2811 break;
2812 ip->insn_opcode |= ENCODE_CITYPE_IMM (imm_expr->X_add_number);
2813 goto rvc_imm_done;
2814 case 'k':
2815 if (riscv_handle_implicit_zero_offset (imm_expr, asarg))
2816 continue;
2817 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
2818 || imm_expr->X_op != O_constant
2819 || !VALID_CLTYPE_LW_IMM ((valueT) imm_expr->X_add_number))
2820 break;
2821 ip->insn_opcode |= ENCODE_CLTYPE_LW_IMM (imm_expr->X_add_number);
2822 goto rvc_imm_done;
2823 case 'l':
2824 if (riscv_handle_implicit_zero_offset (imm_expr, asarg))
2825 continue;
2826 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
2827 || imm_expr->X_op != O_constant
2828 || !VALID_CLTYPE_LD_IMM ((valueT) imm_expr->X_add_number))
2829 break;
2830 ip->insn_opcode |= ENCODE_CLTYPE_LD_IMM (imm_expr->X_add_number);
2831 goto rvc_imm_done;
2832 case 'm':
2833 if (riscv_handle_implicit_zero_offset (imm_expr, asarg))
2834 continue;
2835 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
2836 || imm_expr->X_op != O_constant
2837 || !VALID_CITYPE_LWSP_IMM ((valueT) imm_expr->X_add_number))
2838 break;
2839 ip->insn_opcode |=
2840 ENCODE_CITYPE_LWSP_IMM (imm_expr->X_add_number);
2841 goto rvc_imm_done;
2842 case 'n':
2843 if (riscv_handle_implicit_zero_offset (imm_expr, asarg))
2844 continue;
2845 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
2846 || imm_expr->X_op != O_constant
2847 || !VALID_CITYPE_LDSP_IMM ((valueT) imm_expr->X_add_number))
2848 break;
2849 ip->insn_opcode |=
2850 ENCODE_CITYPE_LDSP_IMM (imm_expr->X_add_number);
2851 goto rvc_imm_done;
2852 case 'o':
2853 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
2854 || imm_expr->X_op != O_constant
2855 /* C.addiw, c.li, and c.andi allow zero immediate.
2856 C.addi allows zero immediate as hint. Otherwise this
2857 is same as 'j'. */
2858 || !VALID_CITYPE_IMM ((valueT) imm_expr->X_add_number))
2859 break;
2860 ip->insn_opcode |= ENCODE_CITYPE_IMM (imm_expr->X_add_number);
2861 goto rvc_imm_done;
2862 case 'K':
2863 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
2864 || imm_expr->X_op != O_constant
2865 || imm_expr->X_add_number == 0
2866 || !VALID_CIWTYPE_ADDI4SPN_IMM ((valueT) imm_expr->X_add_number))
2867 break;
2868 ip->insn_opcode |=
2869 ENCODE_CIWTYPE_ADDI4SPN_IMM (imm_expr->X_add_number);
2870 goto rvc_imm_done;
2871 case 'L':
2872 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
2873 || imm_expr->X_op != O_constant
2874 || !VALID_CITYPE_ADDI16SP_IMM ((valueT) imm_expr->X_add_number))
2875 break;
2876 ip->insn_opcode |=
2877 ENCODE_CITYPE_ADDI16SP_IMM (imm_expr->X_add_number);
2878 goto rvc_imm_done;
2879 case 'M':
2880 if (riscv_handle_implicit_zero_offset (imm_expr, asarg))
2881 continue;
2882 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
2883 || imm_expr->X_op != O_constant
2884 || !VALID_CSSTYPE_SWSP_IMM ((valueT) imm_expr->X_add_number))
2885 break;
2886 ip->insn_opcode |=
2887 ENCODE_CSSTYPE_SWSP_IMM (imm_expr->X_add_number);
2888 goto rvc_imm_done;
2889 case 'N':
2890 if (riscv_handle_implicit_zero_offset (imm_expr, asarg))
2891 continue;
2892 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
2893 || imm_expr->X_op != O_constant
2894 || !VALID_CSSTYPE_SDSP_IMM ((valueT) imm_expr->X_add_number))
2895 break;
2896 ip->insn_opcode |=
2897 ENCODE_CSSTYPE_SDSP_IMM (imm_expr->X_add_number);
2898 goto rvc_imm_done;
2899 case 'u':
2900 p = percent_op_utype;
2901 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p))
2902 break;
2903 rvc_lui:
2904 if (imm_expr->X_op != O_constant
2905 || imm_expr->X_add_number <= 0
2906 || imm_expr->X_add_number >= RISCV_BIGIMM_REACH
2907 || (imm_expr->X_add_number >= RISCV_RVC_IMM_REACH / 2
2908 && (imm_expr->X_add_number <
2909 RISCV_BIGIMM_REACH - RISCV_RVC_IMM_REACH / 2)))
2910 break;
2911 ip->insn_opcode |= ENCODE_CITYPE_IMM (imm_expr->X_add_number);
2912 goto rvc_imm_done;
2913 case 'v':
2914 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
2915 || (imm_expr->X_add_number & (RISCV_IMM_REACH - 1))
2916 || ((int32_t)imm_expr->X_add_number
2917 != imm_expr->X_add_number))
2918 break;
2919 imm_expr->X_add_number =
2920 ((uint32_t) imm_expr->X_add_number) >> RISCV_IMM_BITS;
2921 goto rvc_lui;
2922 case 'p':
2923 goto branch;
2924 case 'a':
2925 goto jump;
2926 case 'S': /* Floating-point RS1 x8-x15. */
2927 if (!reg_lookup (&asarg, RCLASS_FPR, ®no)
2928 || !(regno >= 8 && regno <= 15))
2929 break;
2930 INSERT_OPERAND (CRS1S, *ip, regno % 8);
2931 continue;
2932 case 'D': /* Floating-point RS2 x8-x15. */
2933 if (!reg_lookup (&asarg, RCLASS_FPR, ®no)
2934 || !(regno >= 8 && regno <= 15))
2935 break;
2936 INSERT_OPERAND (CRS2S, *ip, regno % 8);
2937 continue;
2938 case 'T': /* Floating-point RS2. */
2939 if (!reg_lookup (&asarg, RCLASS_FPR, ®no))
2940 break;
2941 INSERT_OPERAND (CRS2, *ip, regno);
2942 continue;
2943 case 'F':
2944 switch (*++oparg)
2945 {
2946 case '6':
2947 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
2948 || imm_expr->X_op != O_constant
2949 || imm_expr->X_add_number < 0
2950 || imm_expr->X_add_number >= 64)
2951 {
2952 as_bad (_("bad value for compressed funct6 "
2953 "field, value must be 0...63"));
2954 break;
2955 }
2956 INSERT_OPERAND (CFUNCT6, *ip, imm_expr->X_add_number);
2957 imm_expr->X_op = O_absent;
2958 asarg = expr_parse_end;
2959 continue;
2960
2961 case '4':
2962 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
2963 || imm_expr->X_op != O_constant
2964 || imm_expr->X_add_number < 0
2965 || imm_expr->X_add_number >= 16)
2966 {
2967 as_bad (_("bad value for compressed funct4 "
2968 "field, value must be 0...15"));
2969 break;
2970 }
2971 INSERT_OPERAND (CFUNCT4, *ip, imm_expr->X_add_number);
2972 imm_expr->X_op = O_absent;
2973 asarg = expr_parse_end;
2974 continue;
2975
2976 case '3':
2977 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
2978 || imm_expr->X_op != O_constant
2979 || imm_expr->X_add_number < 0
2980 || imm_expr->X_add_number >= 8)
2981 {
2982 as_bad (_("bad value for compressed funct3 "
2983 "field, value must be 0...7"));
2984 break;
2985 }
2986 INSERT_OPERAND (CFUNCT3, *ip, imm_expr->X_add_number);
2987 imm_expr->X_op = O_absent;
2988 asarg = expr_parse_end;
2989 continue;
2990
2991 case '2':
2992 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
2993 || imm_expr->X_op != O_constant
2994 || imm_expr->X_add_number < 0
2995 || imm_expr->X_add_number >= 4)
2996 {
2997 as_bad (_("bad value for compressed funct2 "
2998 "field, value must be 0...3"));
2999 break;
3000 }
3001 INSERT_OPERAND (CFUNCT2, *ip, imm_expr->X_add_number);
3002 imm_expr->X_op = O_absent;
3003 asarg = expr_parse_end;
3004 continue;
3005
3006 default:
3007 goto unknown_riscv_ip_operand;
3008 }
3009 break;
3010
3011 default:
3012 goto unknown_riscv_ip_operand;
3013 }
3014 break; /* end RVC */
3015
3016 case 'V': /* RVV */
3017 switch (*++oparg)
3018 {
3019 case 'd': /* VD */
3020 if (!reg_lookup (&asarg, RCLASS_VECR, ®no))
3021 break;
3022 INSERT_OPERAND (VD, *ip, regno);
3023 continue;
3024
3025 case 'e': /* AMO VD */
3026 if (reg_lookup (&asarg, RCLASS_GPR, ®no) && regno == 0)
3027 INSERT_OPERAND (VWD, *ip, 0);
3028 else if (reg_lookup (&asarg, RCLASS_VECR, ®no))
3029 {
3030 INSERT_OPERAND (VWD, *ip, 1);
3031 INSERT_OPERAND (VD, *ip, regno);
3032 }
3033 else
3034 break;
3035 continue;
3036
3037 case 'f': /* AMO VS3 */
3038 if (!reg_lookup (&asarg, RCLASS_VECR, ®no))
3039 break;
3040 if (!EXTRACT_OPERAND (VWD, ip->insn_opcode))
3041 INSERT_OPERAND (VD, *ip, regno);
3042 else
3043 {
3044 /* VS3 must match VD. */
3045 if (EXTRACT_OPERAND (VD, ip->insn_opcode) != regno)
3046 break;
3047 }
3048 continue;
3049
3050 case 's': /* VS1 */
3051 if (!reg_lookup (&asarg, RCLASS_VECR, ®no))
3052 break;
3053 INSERT_OPERAND (VS1, *ip, regno);
3054 continue;
3055
3056 case 't': /* VS2 */
3057 if (!reg_lookup (&asarg, RCLASS_VECR, ®no))
3058 break;
3059 INSERT_OPERAND (VS2, *ip, regno);
3060 continue;
3061
3062 case 'u': /* VS1 == VS2 */
3063 if (!reg_lookup (&asarg, RCLASS_VECR, ®no))
3064 break;
3065 INSERT_OPERAND (VS1, *ip, regno);
3066 INSERT_OPERAND (VS2, *ip, regno);
3067 continue;
3068
3069 case 'v': /* VD == VS1 == VS2 */
3070 if (!reg_lookup (&asarg, RCLASS_VECR, ®no))
3071 break;
3072 INSERT_OPERAND (VD, *ip, regno);
3073 INSERT_OPERAND (VS1, *ip, regno);
3074 INSERT_OPERAND (VS2, *ip, regno);
3075 continue;
3076
3077 /* The `V0` is carry-in register for v[m]adc and v[m]sbc,
3078 and is used to choose vs1/rs1/frs1/imm or vs2 for
3079 v[f]merge. It use the same encoding as the vector mask
3080 register. */
3081 case '0':
3082 if (reg_lookup (&asarg, RCLASS_VECR, ®no) && regno == 0)
3083 continue;
3084 break;
3085
3086 case 'b': /* vtypei for vsetivli */
3087 my_getVsetvliExpression (imm_expr, asarg);
3088 check_absolute_expr (ip, imm_expr, FALSE);
3089 if (!VALID_RVV_VB_IMM (imm_expr->X_add_number))
3090 as_bad (_("bad value for vsetivli immediate field, "
3091 "value must be 0..1023"));
3092 ip->insn_opcode
3093 |= ENCODE_RVV_VB_IMM (imm_expr->X_add_number);
3094 imm_expr->X_op = O_absent;
3095 asarg = expr_parse_end;
3096 continue;
3097
3098 case 'c': /* vtypei for vsetvli */
3099 my_getVsetvliExpression (imm_expr, asarg);
3100 check_absolute_expr (ip, imm_expr, FALSE);
3101 if (!VALID_RVV_VC_IMM (imm_expr->X_add_number))
3102 as_bad (_("bad value for vsetvli immediate field, "
3103 "value must be 0..2047"));
3104 ip->insn_opcode
3105 |= ENCODE_RVV_VC_IMM (imm_expr->X_add_number);
3106 imm_expr->X_op = O_absent;
3107 asarg = expr_parse_end;
3108 continue;
3109
3110 case 'i': /* vector arith signed immediate */
3111 my_getExpression (imm_expr, asarg);
3112 check_absolute_expr (ip, imm_expr, FALSE);
3113 if (imm_expr->X_add_number > 15
3114 || imm_expr->X_add_number < -16)
3115 as_bad (_("bad value for vector immediate field, "
3116 "value must be -16...15"));
3117 INSERT_OPERAND (VIMM, *ip, imm_expr->X_add_number);
3118 imm_expr->X_op = O_absent;
3119 asarg = expr_parse_end;
3120 continue;
3121
3122 case 'j': /* vector arith unsigned immediate */
3123 my_getExpression (imm_expr, asarg);
3124 check_absolute_expr (ip, imm_expr, FALSE);
3125 if (imm_expr->X_add_number < 0
3126 || imm_expr->X_add_number >= 32)
3127 as_bad (_("bad value for vector immediate field, "
3128 "value must be 0...31"));
3129 INSERT_OPERAND (VIMM, *ip, imm_expr->X_add_number);
3130 imm_expr->X_op = O_absent;
3131 asarg = expr_parse_end;
3132 continue;
3133
3134 case 'k': /* vector arith signed immediate, minus 1 */
3135 my_getExpression (imm_expr, asarg);
3136 check_absolute_expr (ip, imm_expr, FALSE);
3137 if (imm_expr->X_add_number > 16
3138 || imm_expr->X_add_number < -15)
3139 as_bad (_("bad value for vector immediate field, "
3140 "value must be -15...16"));
3141 INSERT_OPERAND (VIMM, *ip, imm_expr->X_add_number - 1);
3142 imm_expr->X_op = O_absent;
3143 asarg = expr_parse_end;
3144 continue;
3145
3146 case 'l': /* 6-bit vector arith unsigned immediate */
3147 my_getExpression (imm_expr, asarg);
3148 check_absolute_expr (ip, imm_expr, FALSE);
3149 if (imm_expr->X_add_number < 0
3150 || imm_expr->X_add_number >= 64)
3151 as_bad (_("bad value for vector immediate field, "
3152 "value must be 0...63"));
3153 ip->insn_opcode |= ENCODE_RVV_VI_UIMM6 (imm_expr->X_add_number);
3154 imm_expr->X_op = O_absent;
3155 asarg = expr_parse_end;
3156 continue;
3157
3158 case 'm': /* optional vector mask */
3159 if (*asarg == '\0')
3160 {
3161 INSERT_OPERAND (VMASK, *ip, 1);
3162 continue;
3163 }
3164 else if (*asarg == ',' && asarg++
3165 && reg_lookup (&asarg, RCLASS_VECM, ®no)
3166 && regno == 0)
3167 {
3168 INSERT_OPERAND (VMASK, *ip, 0);
3169 continue;
3170 }
3171 break;
3172
3173 case 'M': /* required vector mask */
3174 if (reg_lookup (&asarg, RCLASS_VECM, ®no) && regno == 0)
3175 {
3176 INSERT_OPERAND (VMASK, *ip, 0);
3177 continue;
3178 }
3179 break;
3180
3181 case 'T': /* vector macro temporary register */
3182 if (!reg_lookup (&asarg, RCLASS_VECR, ®no) || regno == 0)
3183 break;
3184 /* Store it in the FUNCT6 field as we don't have anyplace
3185 else to store it. */
3186 INSERT_OPERAND (VFUNCT6, *ip, regno);
3187 continue;
3188
3189 default:
3190 goto unknown_riscv_ip_operand;
3191 }
3192 break; /* end RVV */
3193
3194 case ',':
3195 if (*asarg++ == *oparg)
3196 continue;
3197 asarg--;
3198 break;
3199
3200 case '(':
3201 case ')':
3202 case '[':
3203 case ']':
3204 if (*asarg++ == *oparg)
3205 continue;
3206 break;
3207
3208 case '<': /* Shift amount, 0 - 31. */
3209 my_getExpression (imm_expr, asarg);
3210 check_absolute_expr (ip, imm_expr, false);
3211 if ((unsigned long) imm_expr->X_add_number > 31)
3212 as_bad (_("improper shift amount (%"PRIu64")"),
3213 imm_expr->X_add_number);
3214 INSERT_OPERAND (SHAMTW, *ip, imm_expr->X_add_number);
3215 imm_expr->X_op = O_absent;
3216 asarg = expr_parse_end;
3217 continue;
3218
3219 case '>': /* Shift amount, 0 - (XLEN-1). */
3220 my_getExpression (imm_expr, asarg);
3221 check_absolute_expr (ip, imm_expr, false);
3222 if ((unsigned long) imm_expr->X_add_number >= xlen)
3223 as_bad (_("improper shift amount (%"PRIu64")"),
3224 imm_expr->X_add_number);
3225 INSERT_OPERAND (SHAMT, *ip, imm_expr->X_add_number);
3226 imm_expr->X_op = O_absent;
3227 asarg = expr_parse_end;
3228 continue;
3229
3230 case 'Z': /* CSRRxI immediate. */
3231 my_getExpression (imm_expr, asarg);
3232 check_absolute_expr (ip, imm_expr, false);
3233 if ((unsigned long) imm_expr->X_add_number > 31)
3234 as_bad (_("improper CSRxI immediate (%"PRIu64")"),
3235 imm_expr->X_add_number);
3236 INSERT_OPERAND (RS1, *ip, imm_expr->X_add_number);
3237 imm_expr->X_op = O_absent;
3238 asarg = expr_parse_end;
3239 continue;
3240
3241 case 'E': /* Control register. */
3242 insn_with_csr = true;
3243 explicit_priv_attr = true;
3244 if (reg_lookup (&asarg, RCLASS_CSR, ®no))
3245 INSERT_OPERAND (CSR, *ip, regno);
3246 else
3247 {
3248 my_getExpression (imm_expr, asarg);
3249 check_absolute_expr (ip, imm_expr, true);
3250 if ((unsigned long) imm_expr->X_add_number > 0xfff)
3251 as_bad (_("improper CSR address (%"PRIu64")"),
3252 imm_expr->X_add_number);
3253 INSERT_OPERAND (CSR, *ip, imm_expr->X_add_number);
3254 imm_expr->X_op = O_absent;
3255 asarg = expr_parse_end;
3256 }
3257 continue;
3258
3259 case 'm': /* Rounding mode. */
3260 if (arg_lookup (&asarg, riscv_rm,
3261 ARRAY_SIZE (riscv_rm), ®no))
3262 {
3263 INSERT_OPERAND (RM, *ip, regno);
3264 continue;
3265 }
3266 break;
3267
3268 case 'P':
3269 case 'Q': /* Fence predecessor/successor. */
3270 if (arg_lookup (&asarg, riscv_pred_succ,
3271 ARRAY_SIZE (riscv_pred_succ), ®no))
3272 {
3273 if (*oparg == 'P')
3274 INSERT_OPERAND (PRED, *ip, regno);
3275 else
3276 INSERT_OPERAND (SUCC, *ip, regno);
3277 continue;
3278 }
3279 break;
3280
3281 case 'd': /* Destination register. */
3282 case 's': /* Source register. */
3283 case 't': /* Target register. */
3284 case 'r': /* RS3 */
3285 if (reg_lookup (&asarg, RCLASS_GPR, ®no))
3286 {
3287 char c = *oparg;
3288 if (*asarg == ' ')
3289 ++asarg;
3290
3291 /* Now that we have assembled one operand, we use the args
3292 string to figure out where it goes in the instruction. */
3293 switch (c)
3294 {
3295 case 's':
3296 INSERT_OPERAND (RS1, *ip, regno);
3297 break;
3298 case 'd':
3299 INSERT_OPERAND (RD, *ip, regno);
3300 break;
3301 case 't':
3302 INSERT_OPERAND (RS2, *ip, regno);
3303 break;
3304 case 'r':
3305 INSERT_OPERAND (RS3, *ip, regno);
3306 break;
3307 }
3308 continue;
3309 }
3310 break;
3311
3312 case 'D': /* Floating point RD. */
3313 case 'S': /* Floating point RS1. */
3314 case 'T': /* Floating point RS2. */
3315 case 'U': /* Floating point RS1 and RS2. */
3316 case 'R': /* Floating point RS3. */
3317 if (reg_lookup (&asarg,
3318 (riscv_subset_supports (&riscv_rps_as, "zfinx")
3319 ? RCLASS_GPR : RCLASS_FPR), ®no))
3320 {
3321 char c = *oparg;
3322 if (*asarg == ' ')
3323 ++asarg;
3324 switch (c)
3325 {
3326 case 'D':
3327 INSERT_OPERAND (RD, *ip, regno);
3328 break;
3329 case 'S':
3330 INSERT_OPERAND (RS1, *ip, regno);
3331 break;
3332 case 'U':
3333 INSERT_OPERAND (RS1, *ip, regno);
3334 /* Fall through. */
3335 case 'T':
3336 INSERT_OPERAND (RS2, *ip, regno);
3337 break;
3338 case 'R':
3339 INSERT_OPERAND (RS3, *ip, regno);
3340 break;
3341 }
3342 continue;
3343 }
3344 break;
3345
3346 case 'I':
3347 my_getExpression (imm_expr, asarg);
3348 if (imm_expr->X_op != O_big
3349 && imm_expr->X_op != O_constant)
3350 break;
3351 normalize_constant_expr (imm_expr);
3352 asarg = expr_parse_end;
3353 continue;
3354
3355 case 'A':
3356 my_getExpression (imm_expr, asarg);
3357 normalize_constant_expr (imm_expr);
3358 /* The 'A' format specifier must be a symbol. */
3359 if (imm_expr->X_op != O_symbol)
3360 break;
3361 *imm_reloc = BFD_RELOC_32;
3362 asarg = expr_parse_end;
3363 continue;
3364
3365 case 'B':
3366 my_getExpression (imm_expr, asarg);
3367 normalize_constant_expr (imm_expr);
3368 /* The 'B' format specifier must be a symbol or a constant. */
3369 if (imm_expr->X_op != O_symbol && imm_expr->X_op != O_constant)
3370 break;
3371 if (imm_expr->X_op == O_symbol)
3372 *imm_reloc = BFD_RELOC_32;
3373 asarg = expr_parse_end;
3374 continue;
3375
3376 case 'j': /* Sign-extended immediate. */
3377 p = percent_op_itype;
3378 *imm_reloc = BFD_RELOC_RISCV_LO12_I;
3379 goto alu_op;
3380 case 'q': /* Store displacement. */
3381 p = percent_op_stype;
3382 *imm_reloc = BFD_RELOC_RISCV_LO12_S;
3383 goto load_store;
3384 case 'o': /* Load displacement. */
3385 p = percent_op_itype;
3386 *imm_reloc = BFD_RELOC_RISCV_LO12_I;
3387 goto load_store;
3388 case '1':
3389 /* This is used for TLS, where the fourth operand is
3390 %tprel_add, to get a relocation applied to an add
3391 instruction, for relaxation to use. */
3392 p = percent_op_rtype;
3393 goto alu_op;
3394 case '0': /* AMO displacement, which must be zero. */
3395 load_store:
3396 if (riscv_handle_implicit_zero_offset (imm_expr, asarg))
3397 continue;
3398 alu_op:
3399 /* If this value won't fit into a 16 bit offset, then go
3400 find a macro that will generate the 32 bit offset
3401 code pattern. */
3402 if (!my_getSmallExpression (imm_expr, imm_reloc, asarg, p))
3403 {
3404 normalize_constant_expr (imm_expr);
3405 if (imm_expr->X_op != O_constant
3406 || (*oparg == '0' && imm_expr->X_add_number != 0)
3407 || (*oparg == '1')
3408 || imm_expr->X_add_number >= (signed)RISCV_IMM_REACH/2
3409 || imm_expr->X_add_number < -(signed)RISCV_IMM_REACH/2)
3410 break;
3411 }
3412 asarg = expr_parse_end;
3413 continue;
3414
3415 case 'p': /* PC-relative offset. */
3416 branch:
3417 *imm_reloc = BFD_RELOC_12_PCREL;
3418 my_getExpression (imm_expr, asarg);
3419 asarg = expr_parse_end;
3420 continue;
3421
3422 case 'u': /* Upper 20 bits. */
3423 p = percent_op_utype;
3424 if (!my_getSmallExpression (imm_expr, imm_reloc, asarg, p))
3425 {
3426 if (imm_expr->X_op != O_constant)
3427 break;
3428
3429 if (imm_expr->X_add_number < 0
3430 || imm_expr->X_add_number >= (signed)RISCV_BIGIMM_REACH)
3431 as_bad (_("lui expression not in range 0..1048575"));
3432
3433 *imm_reloc = BFD_RELOC_RISCV_HI20;
3434 imm_expr->X_add_number <<= RISCV_IMM_BITS;
3435 }
3436 asarg = expr_parse_end;
3437 continue;
3438
3439 case 'a': /* 20-bit PC-relative offset. */
3440 jump:
3441 my_getExpression (imm_expr, asarg);
3442 asarg = expr_parse_end;
3443 *imm_reloc = BFD_RELOC_RISCV_JMP;
3444 continue;
3445
3446 case 'c':
3447 my_getExpression (imm_expr, asarg);
3448 asarg = expr_parse_end;
3449 if (strcmp (asarg, "@plt") == 0)
3450 asarg += 4;
3451 *imm_reloc = BFD_RELOC_RISCV_CALL_PLT;
3452 continue;
3453
3454 case 'O':
3455 switch (*++oparg)
3456 {
3457 case '4':
3458 if (my_getOpcodeExpression (imm_expr, imm_reloc, asarg)
3459 || imm_expr->X_op != O_constant
3460 || imm_expr->X_add_number < 0
3461 || imm_expr->X_add_number >= 128
3462 || (imm_expr->X_add_number & 0x3) != 3)
3463 {
3464 as_bad (_("bad value for opcode field, "
3465 "value must be 0...127 and "
3466 "lower 2 bits must be 0x3"));
3467 break;
3468 }
3469 INSERT_OPERAND (OP, *ip, imm_expr->X_add_number);
3470 imm_expr->X_op = O_absent;
3471 asarg = expr_parse_end;
3472 continue;
3473
3474 case '2':
3475 if (my_getOpcodeExpression (imm_expr, imm_reloc, asarg)
3476 || imm_expr->X_op != O_constant
3477 || imm_expr->X_add_number < 0
3478 || imm_expr->X_add_number >= 3)
3479 {
3480 as_bad (_("bad value for opcode field, "
3481 "value must be 0...2"));
3482 break;
3483 }
3484 INSERT_OPERAND (OP2, *ip, imm_expr->X_add_number);
3485 imm_expr->X_op = O_absent;
3486 asarg = expr_parse_end;
3487 continue;
3488
3489 default:
3490 goto unknown_riscv_ip_operand;
3491 }
3492 break;
3493
3494 case 'F':
3495 switch (*++oparg)
3496 {
3497 case '7':
3498 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
3499 || imm_expr->X_op != O_constant
3500 || imm_expr->X_add_number < 0
3501 || imm_expr->X_add_number >= 128)
3502 {
3503 as_bad (_("bad value for funct7 field, "
3504 "value must be 0...127"));
3505 break;
3506 }
3507 INSERT_OPERAND (FUNCT7, *ip, imm_expr->X_add_number);
3508 imm_expr->X_op = O_absent;
3509 asarg = expr_parse_end;
3510 continue;
3511
3512 case '3':
3513 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
3514 || imm_expr->X_op != O_constant
3515 || imm_expr->X_add_number < 0
3516 || imm_expr->X_add_number >= 8)
3517 {
3518 as_bad (_("bad value for funct3 field, "
3519 "value must be 0...7"));
3520 break;
3521 }
3522 INSERT_OPERAND (FUNCT3, *ip, imm_expr->X_add_number);
3523 imm_expr->X_op = O_absent;
3524 asarg = expr_parse_end;
3525 continue;
3526
3527 case '2':
3528 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
3529 || imm_expr->X_op != O_constant
3530 || imm_expr->X_add_number < 0
3531 || imm_expr->X_add_number >= 4)
3532 {
3533 as_bad (_("bad value for funct2 field, "
3534 "value must be 0...3"));
3535 break;
3536 }
3537 INSERT_OPERAND (FUNCT2, *ip, imm_expr->X_add_number);
3538 imm_expr->X_op = O_absent;
3539 asarg = expr_parse_end;
3540 continue;
3541
3542 default:
3543 goto unknown_riscv_ip_operand;
3544 }
3545 break;
3546
3547 case 'y': /* bs immediate */
3548 my_getExpression (imm_expr, asarg);
3549 check_absolute_expr (ip, imm_expr, FALSE);
3550 if ((unsigned long)imm_expr->X_add_number > 3)
3551 as_bad(_("Improper bs immediate (%lu)"),
3552 (unsigned long)imm_expr->X_add_number);
3553 INSERT_OPERAND(BS, *ip, imm_expr->X_add_number);
3554 imm_expr->X_op = O_absent;
3555 asarg = expr_parse_end;
3556 continue;
3557
3558 case 'Y': /* rnum immediate */
3559 my_getExpression (imm_expr, asarg);
3560 check_absolute_expr (ip, imm_expr, FALSE);
3561 if ((unsigned long)imm_expr->X_add_number > 10)
3562 as_bad(_("Improper rnum immediate (%lu)"),
3563 (unsigned long)imm_expr->X_add_number);
3564 INSERT_OPERAND(RNUM, *ip, imm_expr->X_add_number);
3565 imm_expr->X_op = O_absent;
3566 asarg = expr_parse_end;
3567 continue;
3568
3569 case 'z':
3570 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
3571 || imm_expr->X_op != O_constant
3572 || imm_expr->X_add_number != 0)
3573 break;
3574 asarg = expr_parse_end;
3575 imm_expr->X_op = O_absent;
3576 continue;
3577
3578 case 'W': /* Various operands for standard z extensions. */
3579 switch (*++oparg)
3580 {
3581 case 'i':
3582 switch (*++oparg)
3583 {
3584 case 'f':
3585 /* Prefetch offset for 'Zicbop' extension.
3586 pseudo S-type but lower 5-bits zero. */
3587 if (riscv_handle_implicit_zero_offset (imm_expr, asarg))
3588 continue;
3589 my_getExpression (imm_expr, asarg);
3590 check_absolute_expr (ip, imm_expr, false);
3591 if (((unsigned) (imm_expr->X_add_number) & 0x1fU)
3592 || imm_expr->X_add_number >= RISCV_IMM_REACH / 2
3593 || imm_expr->X_add_number < -RISCV_IMM_REACH / 2)
3594 as_bad (_ ("improper prefetch offset (%ld)"),
3595 (long) imm_expr->X_add_number);
3596 ip->insn_opcode |= ENCODE_STYPE_IMM (
3597 (unsigned) (imm_expr->X_add_number) & ~0x1fU);
3598 imm_expr->X_op = O_absent;
3599 asarg = expr_parse_end;
3600 continue;
3601 default:
3602 goto unknown_riscv_ip_operand;
3603 }
3604 break;
3605
3606 case 'f':
3607 switch (*++oparg)
3608 {
3609 case 'v':
3610 /* FLI.[HSDQ] value field for 'Zfa' extension. */
3611 if (!arg_lookup (&asarg, riscv_fli_symval,
3612 ARRAY_SIZE (riscv_fli_symval), ®no))
3613 {
3614 /* 0.0 is not a valid entry in riscv_fli_numval. */
3615 errno = 0;
3616 float f = strtof (asarg, &asarg);
3617 if (errno != 0 || f == 0.0
3618 || !flt_lookup (f, riscv_fli_numval,
3619 ARRAY_SIZE(riscv_fli_numval),
3620 ®no))
3621 {
3622 as_bad (_("bad fli constant operand, "
3623 "supported constants must be in "
3624 "decimal or hexadecimal floating-point "
3625 "literal form"));
3626 break;
3627 }
3628 }
3629 INSERT_OPERAND (RS1, *ip, regno);
3630 continue;
3631 default:
3632 goto unknown_riscv_ip_operand;
3633 }
3634 break;
3635
3636 case 'c':
3637 switch (*++oparg)
3638 {
3639 case 'h': /* Immediate field for c.lh/c.lhu/c.sh. */
3640 /* Handle cases, such as c.sh rs2', (rs1'). */
3641 if (riscv_handle_implicit_zero_offset (imm_expr, asarg))
3642 continue;
3643 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
3644 || imm_expr->X_op != O_constant
3645 || !VALID_ZCB_HALFWORD_UIMM ((valueT) imm_expr->X_add_number))
3646 break;
3647 ip->insn_opcode |= ENCODE_ZCB_HALFWORD_UIMM (imm_expr->X_add_number);
3648 goto rvc_imm_done;
3649 case 'b': /* Immediate field for c.lbu/c.sb. */
3650 /* Handle cases, such as c.lbu rd', (rs1'). */
3651 if (riscv_handle_implicit_zero_offset (imm_expr, asarg))
3652 continue;
3653 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
3654 || imm_expr->X_op != O_constant
3655 || !VALID_ZCB_BYTE_UIMM ((valueT) imm_expr->X_add_number))
3656 break;
3657 ip->insn_opcode |= ENCODE_ZCB_BYTE_UIMM (imm_expr->X_add_number);
3658 goto rvc_imm_done;
3659 case 'f': /* Operand for matching immediate 255. */
3660 if (my_getSmallExpression (imm_expr, imm_reloc, asarg, p)
3661 || imm_expr->X_op != O_constant
3662 || imm_expr->X_add_number != 255)
3663 break;
3664 /* This operand is used for matching immediate 255, and
3665 we do not write anything to encoding by this operand. */
3666 asarg = expr_parse_end;
3667 imm_expr->X_op = O_absent;
3668 continue;
3669 default:
3670 goto unknown_riscv_ip_operand;
3671 }
3672 break;
3673
3674 default:
3675 goto unknown_riscv_ip_operand;
3676 }
3677 break;
3678
3679 case 'X': /* Vendor-specific operands. */
3680 switch (*++oparg)
3681 {
3682 case 't': /* Vendor-specific (T-head) operands. */
3683 {
3684 size_t n;
3685 size_t s;
3686 bool sign;
3687 switch (*++oparg)
3688 {
3689 case 'V':
3690 /* Vtypei for th.vsetvli. */
3691 ++oparg;
3692 if (*oparg != 'c')
3693 goto unknown_riscv_ip_operand;
3694
3695 my_getThVsetvliExpression (imm_expr, asarg);
3696 check_absolute_expr (ip, imm_expr, FALSE);
3697 if (!VALID_RVV_VC_IMM (imm_expr->X_add_number))
3698 as_bad (_("bad value for th.vsetvli immediate field, "
3699 "value must be 0..2047"));
3700 ip->insn_opcode
3701 |= ENCODE_RVV_VC_IMM (imm_expr->X_add_number);
3702 imm_expr->X_op = O_absent;
3703 asarg = expr_parse_end;
3704 continue;
3705
3706 case 'l': /* Integer immediate, literal. */
3707 n = strcspn (++oparg, ",");
3708 if (strncmp (oparg, asarg, n))
3709 as_bad (_("unexpected literal (%s)"), asarg);
3710 oparg += n - 1;
3711 asarg += n;
3712 continue;
3713 case 's': /* Integer immediate, 'XsN@S' ... N-bit signed immediate at bit S. */
3714 sign = true;
3715 goto parse_imm;
3716 case 'u': /* Integer immediate, 'XuN@S' ... N-bit unsigned immediate at bit S. */
3717 sign = false;
3718 goto parse_imm;
3719 parse_imm:
3720 n = strtol (oparg + 1, (char **)&oparg, 10);
3721 if (*oparg != '@')
3722 goto unknown_riscv_ip_operand;
3723 s = strtol (oparg + 1, (char **)&oparg, 10);
3724 oparg--;
3725
3726 my_getExpression (imm_expr, asarg);
3727 check_absolute_expr (ip, imm_expr, false);
3728 if (!sign)
3729 {
3730 if (!VALIDATE_U_IMM (imm_expr->X_add_number, n))
3731 as_bad (_("improper immediate value (%"PRIu64")"),
3732 imm_expr->X_add_number);
3733 }
3734 else
3735 {
3736 if (!VALIDATE_S_IMM (imm_expr->X_add_number, n))
3737 as_bad (_("improper immediate value (%"PRIi64")"),
3738 imm_expr->X_add_number);
3739 }
3740 INSERT_IMM (n, s, *ip, imm_expr->X_add_number);
3741 imm_expr->X_op = O_absent;
3742 asarg = expr_parse_end;
3743 continue;
3744 default:
3745 goto unknown_riscv_ip_operand;
3746 }
3747 }
3748 break;
3749
3750 case 'c': /* Vendor-specific (CORE-V) operands. */
3751 switch (*++oparg)
3752 {
3753 case '2':
3754 my_getExpression (imm_expr, asarg);
3755 check_absolute_expr (ip, imm_expr, FALSE);
3756 asarg = expr_parse_end;
3757 if (imm_expr->X_add_number<0
3758 || imm_expr->X_add_number>31)
3759 break;
3760 ip->insn_opcode
3761 |= ENCODE_CV_IS2_UIMM5 (imm_expr->X_add_number);
3762 continue;
3763 case '3':
3764 my_getExpression (imm_expr, asarg);
3765 check_absolute_expr (ip, imm_expr, FALSE);
3766 asarg = expr_parse_end;
3767 if (imm_expr->X_add_number < 0
3768 || imm_expr->X_add_number > 31)
3769 break;
3770 ip->insn_opcode
3771 |= ENCODE_CV_IS3_UIMM5 (imm_expr->X_add_number);
3772 continue;
3773 default:
3774 goto unknown_riscv_ip_operand;
3775 }
3776 break;
3777
3778 case 's': /* Vendor-specific (SiFive) operands. */
3779 #define UIMM_BITFIELD_VAL(S, E) (1 << ((E) - (S) + 1))
3780 #define ENCODE_UIMM_BIT_FIELD(NAME, IP, EXPR, RELOC, ASARG, \
3781 START, END) \
3782 do \
3783 { \
3784 if (my_getOpcodeExpression (EXPR, RELOC, ASARG) \
3785 || EXPR->X_op != O_constant \
3786 || EXPR->X_add_number < 0 \
3787 || EXPR->X_add_number >= UIMM_BITFIELD_VAL (START, END)) \
3788 { \
3789 as_bad (_("bad value for <bit-%s-%s> " \
3790 "field, value must be 0...%d"), \
3791 #START, #END, UIMM_BITFIELD_VAL (START, END)); \
3792 break; \
3793 } \
3794 INSERT_OPERAND (NAME, *IP, EXPR->X_add_number); \
3795 EXPR->X_op = O_absent; \
3796 ASARG = expr_parse_end; \
3797 } \
3798 while (0);
3799 switch (*++oparg)
3800 {
3801 case 'd': /* Xsd */
3802 ENCODE_UIMM_BIT_FIELD
3803 (RD, ip, imm_expr, imm_reloc, asarg, 7, 11);
3804 continue;
3805 case 't': /* Xst */
3806 ENCODE_UIMM_BIT_FIELD
3807 (RS2, ip, imm_expr, imm_reloc, asarg, 20, 24)
3808 continue;
3809 case 'O':
3810 switch (*++oparg)
3811 {
3812 case '2': /* XsO2 */
3813 ENCODE_UIMM_BIT_FIELD
3814 (XSO2, ip, imm_expr, imm_reloc, asarg, 26, 27);
3815 continue;
3816 case '1': /* XsO1 */
3817 ENCODE_UIMM_BIT_FIELD
3818 (XSO1, ip, imm_expr, imm_reloc, asarg, 26, 26);
3819 continue;
3820 }
3821 default:
3822 goto unknown_riscv_ip_operand;
3823 }
3824 #undef UIMM_BITFIELD_VAL
3825 #undef ENCODE_UIMM_BIT_FIELD
3826 break;
3827
3828 default:
3829 goto unknown_riscv_ip_operand;
3830 }
3831 break;
3832
3833 default:
3834 unknown_riscv_ip_operand:
3835 as_fatal (_("internal: unknown argument type `%s'"),
3836 opargStart);
3837 }
3838 break;
3839 }
3840 asarg = asargStart;
3841 insn_with_csr = false;
3842 }
3843
3844 out:
3845 /* Restore the character we might have clobbered above. */
3846 if (save_c)
3847 *(asargStart - 1) = save_c;
3848
3849 probing_insn_operands = false;
3850
3851 return error;
3852 }
3853
3854 /* Similar to riscv_ip, but assembles an instruction according to the
3855 hardcode values of .insn directive. */
3856
3857 static const char *
riscv_ip_hardcode(char * str,struct riscv_cl_insn * ip,expressionS * imm_expr,const char * error)3858 riscv_ip_hardcode (char *str,
3859 struct riscv_cl_insn *ip,
3860 expressionS *imm_expr,
3861 const char *error)
3862 {
3863 struct riscv_opcode *insn;
3864 insn_t values[2] = {0, 0};
3865 unsigned int num = 0;
3866
3867 input_line_pointer = str;
3868 do
3869 {
3870 expression (imm_expr);
3871 switch (imm_expr->X_op)
3872 {
3873 case O_constant:
3874 values[num++] = (insn_t) imm_expr->X_add_number;
3875 break;
3876 case O_big:
3877 /* Extract lower 32-bits of a big number.
3878 Assume that generic_bignum_to_int32 work on such number. */
3879 values[num++] = (insn_t) generic_bignum_to_int32 ();
3880 break;
3881 default:
3882 /* The first value isn't constant, so it should be
3883 .insn <type> <operands>. We have been parsed it
3884 in the riscv_ip. */
3885 if (num == 0)
3886 return error;
3887 return _("values must be constant");
3888 }
3889 }
3890 while (*input_line_pointer++ == ',' && num < 2 && imm_expr->X_op != O_big);
3891
3892 input_line_pointer--;
3893 if (*input_line_pointer != '\0')
3894 return _("unrecognized values");
3895
3896 insn = XCNEW (struct riscv_opcode);
3897 insn->match = values[num - 1];
3898 create_insn (ip, insn);
3899 unsigned int bytes = riscv_insn_length (insn->match);
3900
3901 if (num == 2 && values[0] != bytes)
3902 return _("value conflicts with instruction length");
3903
3904 if (imm_expr->X_op == O_big)
3905 {
3906 unsigned int llen = 0;
3907 for (LITTLENUM_TYPE lval = generic_bignum[imm_expr->X_add_number - 1];
3908 lval != 0; llen++)
3909 lval >>= BITS_PER_CHAR;
3910 unsigned int repr_bytes
3911 = (imm_expr->X_add_number - 1) * CHARS_PER_LITTLENUM + llen;
3912 if (bytes < repr_bytes)
3913 return _("value conflicts with instruction length");
3914 for (num = 0; num < imm_expr->X_add_number - 1; ++num)
3915 number_to_chars_littleendian (
3916 ip->insn_long_opcode + num * CHARS_PER_LITTLENUM,
3917 generic_bignum[num],
3918 CHARS_PER_LITTLENUM);
3919 if (llen != 0)
3920 number_to_chars_littleendian (
3921 ip->insn_long_opcode + num * CHARS_PER_LITTLENUM,
3922 generic_bignum[num],
3923 llen);
3924 memset(ip->insn_long_opcode + repr_bytes, 0, bytes - repr_bytes);
3925 return NULL;
3926 }
3927
3928 if (bytes < sizeof(values[0]) && values[num - 1] >> (8 * bytes) != 0)
3929 return _("value conflicts with instruction length");
3930
3931 return NULL;
3932 }
3933
3934 void
md_assemble(char * str)3935 md_assemble (char *str)
3936 {
3937 struct riscv_cl_insn insn;
3938 expressionS imm_expr;
3939 bfd_reloc_code_real_type imm_reloc = BFD_RELOC_UNUSED;
3940
3941 /* The architecture and privileged elf attributes should be set
3942 before assembling. */
3943 if (!start_assemble)
3944 {
3945 start_assemble = true;
3946
3947 riscv_set_abi_by_arch ();
3948 if (!riscv_set_default_priv_spec (NULL))
3949 return;
3950 }
3951
3952 riscv_mapping_state (MAP_INSN, 0, false/* fr_align_code */);
3953
3954 const struct riscv_ip_error error = riscv_ip (str, &insn, &imm_expr,
3955 &imm_reloc, op_hash);
3956
3957 if (error.msg)
3958 {
3959 if (error.missing_ext)
3960 as_bad ("%s `%s', extension `%s' required", error.msg,
3961 error.statement, error.missing_ext);
3962 else
3963 as_bad ("%s `%s'", error.msg, error.statement);
3964 return;
3965 }
3966
3967 if (insn.insn_mo->pinfo == INSN_MACRO)
3968 macro (&insn, &imm_expr, &imm_reloc);
3969 else
3970 append_insn (&insn, &imm_expr, imm_reloc);
3971 }
3972
3973 const char *
md_atof(int type,char * litP,int * sizeP)3974 md_atof (int type, char *litP, int *sizeP)
3975 {
3976 return ieee_md_atof (type, litP, sizeP, target_big_endian);
3977 }
3978
3979 void
md_number_to_chars(char * buf,valueT val,int n)3980 md_number_to_chars (char *buf, valueT val, int n)
3981 {
3982 if (target_big_endian)
3983 number_to_chars_bigendian (buf, val, n);
3984 else
3985 number_to_chars_littleendian (buf, val, n);
3986 }
3987
3988 const char *md_shortopts = "O::g::G:";
3989
3990 enum options
3991 {
3992 OPTION_MARCH = OPTION_MD_BASE,
3993 OPTION_PIC,
3994 OPTION_NO_PIC,
3995 OPTION_MABI,
3996 OPTION_RELAX,
3997 OPTION_NO_RELAX,
3998 OPTION_ARCH_ATTR,
3999 OPTION_NO_ARCH_ATTR,
4000 OPTION_CSR_CHECK,
4001 OPTION_NO_CSR_CHECK,
4002 OPTION_MISA_SPEC,
4003 OPTION_MPRIV_SPEC,
4004 OPTION_BIG_ENDIAN,
4005 OPTION_LITTLE_ENDIAN,
4006 OPTION_END_OF_ENUM
4007 };
4008
4009 struct option md_longopts[] =
4010 {
4011 {"march", required_argument, NULL, OPTION_MARCH},
4012 {"fPIC", no_argument, NULL, OPTION_PIC},
4013 {"fpic", no_argument, NULL, OPTION_PIC},
4014 {"fno-pic", no_argument, NULL, OPTION_NO_PIC},
4015 {"mabi", required_argument, NULL, OPTION_MABI},
4016 {"mrelax", no_argument, NULL, OPTION_RELAX},
4017 {"mno-relax", no_argument, NULL, OPTION_NO_RELAX},
4018 {"march-attr", no_argument, NULL, OPTION_ARCH_ATTR},
4019 {"mno-arch-attr", no_argument, NULL, OPTION_NO_ARCH_ATTR},
4020 {"mcsr-check", no_argument, NULL, OPTION_CSR_CHECK},
4021 {"mno-csr-check", no_argument, NULL, OPTION_NO_CSR_CHECK},
4022 {"misa-spec", required_argument, NULL, OPTION_MISA_SPEC},
4023 {"mpriv-spec", required_argument, NULL, OPTION_MPRIV_SPEC},
4024 {"mbig-endian", no_argument, NULL, OPTION_BIG_ENDIAN},
4025 {"mlittle-endian", no_argument, NULL, OPTION_LITTLE_ENDIAN},
4026
4027 {NULL, no_argument, NULL, 0}
4028 };
4029 size_t md_longopts_size = sizeof (md_longopts);
4030
4031 int
md_parse_option(int c,const char * arg)4032 md_parse_option (int c, const char *arg)
4033 {
4034 switch (c)
4035 {
4036 case OPTION_MARCH:
4037 default_arch_with_ext = arg;
4038 break;
4039
4040 case OPTION_NO_PIC:
4041 riscv_opts.pic = false;
4042 break;
4043
4044 case OPTION_PIC:
4045 riscv_opts.pic = true;
4046 break;
4047
4048 case OPTION_MABI:
4049 if (strcmp (arg, "ilp32") == 0)
4050 riscv_set_abi (32, FLOAT_ABI_SOFT, false);
4051 else if (strcmp (arg, "ilp32e") == 0)
4052 riscv_set_abi (32, FLOAT_ABI_SOFT, true);
4053 else if (strcmp (arg, "ilp32f") == 0)
4054 riscv_set_abi (32, FLOAT_ABI_SINGLE, false);
4055 else if (strcmp (arg, "ilp32d") == 0)
4056 riscv_set_abi (32, FLOAT_ABI_DOUBLE, false);
4057 else if (strcmp (arg, "ilp32q") == 0)
4058 riscv_set_abi (32, FLOAT_ABI_QUAD, false);
4059 else if (strcmp (arg, "lp64") == 0)
4060 riscv_set_abi (64, FLOAT_ABI_SOFT, false);
4061 else if (strcmp (arg, "lp64e") == 0)
4062 riscv_set_abi (64, FLOAT_ABI_SOFT, true);
4063 else if (strcmp (arg, "lp64f") == 0)
4064 riscv_set_abi (64, FLOAT_ABI_SINGLE, false);
4065 else if (strcmp (arg, "lp64d") == 0)
4066 riscv_set_abi (64, FLOAT_ABI_DOUBLE, false);
4067 else if (strcmp (arg, "lp64q") == 0)
4068 riscv_set_abi (64, FLOAT_ABI_QUAD, false);
4069 else
4070 return 0;
4071 explicit_mabi = true;
4072 break;
4073
4074 case OPTION_RELAX:
4075 riscv_opts.relax = true;
4076 break;
4077
4078 case OPTION_NO_RELAX:
4079 riscv_opts.relax = false;
4080 break;
4081
4082 case OPTION_ARCH_ATTR:
4083 riscv_opts.arch_attr = true;
4084 break;
4085
4086 case OPTION_NO_ARCH_ATTR:
4087 riscv_opts.arch_attr = false;
4088 break;
4089
4090 case OPTION_CSR_CHECK:
4091 riscv_opts.csr_check = true;
4092 break;
4093
4094 case OPTION_NO_CSR_CHECK:
4095 riscv_opts.csr_check = false;
4096 break;
4097
4098 case OPTION_MISA_SPEC:
4099 return riscv_set_default_isa_spec (arg);
4100
4101 case OPTION_MPRIV_SPEC:
4102 return riscv_set_default_priv_spec (arg);
4103
4104 case OPTION_BIG_ENDIAN:
4105 target_big_endian = 1;
4106 break;
4107
4108 case OPTION_LITTLE_ENDIAN:
4109 target_big_endian = 0;
4110 break;
4111
4112 default:
4113 return 0;
4114 }
4115
4116 return 1;
4117 }
4118
4119 void
riscv_after_parse_args(void)4120 riscv_after_parse_args (void)
4121 {
4122 /* The --with-arch is optional for now, so we still need to set the xlen
4123 according to the default_arch, which is set by the --target. */
4124 if (xlen == 0)
4125 {
4126 if (strcmp (default_arch, "riscv32") == 0)
4127 xlen = 32;
4128 else if (strcmp (default_arch, "riscv64") == 0)
4129 xlen = 64;
4130 else
4131 as_bad ("unknown default architecture `%s'", default_arch);
4132 }
4133
4134 /* Set default specs. */
4135 if (default_isa_spec == ISA_SPEC_CLASS_NONE)
4136 riscv_set_default_isa_spec (DEFAULT_RISCV_ISA_SPEC);
4137 if (default_priv_spec == PRIV_SPEC_CLASS_NONE)
4138 riscv_set_default_priv_spec (DEFAULT_RISCV_PRIV_SPEC);
4139
4140 riscv_set_arch (default_arch_with_ext);
4141
4142 /* If the CIE to be produced has not been overridden on the command line,
4143 then produce version 3 by default. This allows us to use the full
4144 range of registers in a .cfi_return_column directive. */
4145 if (flag_dwarf_cie_version == -1)
4146 flag_dwarf_cie_version = 3;
4147 }
4148
riscv_parse_name(const char * name,struct expressionS * ep,enum expr_mode mode)4149 bool riscv_parse_name (const char *name, struct expressionS *ep,
4150 enum expr_mode mode)
4151 {
4152 unsigned int regno;
4153 symbolS *sym;
4154
4155 if (!probing_insn_operands)
4156 return false;
4157
4158 gas_assert (mode == expr_normal);
4159
4160 regno = reg_lookup_internal (name, RCLASS_GPR);
4161 if (regno == (unsigned int)-1)
4162 return false;
4163
4164 if (symbol_find (name) != NULL)
4165 return false;
4166
4167 /* Create a symbol without adding it to the symbol table yet.
4168 Insertion will happen only once we commit to using the insn
4169 we're probing operands for. */
4170 for (sym = deferred_sym_rootP; sym; sym = symbol_next (sym))
4171 if (strcmp (name, S_GET_NAME (sym)) == 0)
4172 break;
4173 if (!sym)
4174 {
4175 for (sym = orphan_sym_rootP; sym; sym = symbol_next (sym))
4176 if (strcmp (name, S_GET_NAME (sym)) == 0)
4177 {
4178 symbol_remove (sym, &orphan_sym_rootP, &orphan_sym_lastP);
4179 break;
4180 }
4181 if (!sym)
4182 sym = symbol_create (name, undefined_section,
4183 &zero_address_frag, 0);
4184
4185 symbol_append (sym, deferred_sym_lastP, &deferred_sym_rootP,
4186 &deferred_sym_lastP);
4187 }
4188
4189 ep->X_op = O_symbol;
4190 ep->X_add_symbol = sym;
4191 ep->X_add_number = 0;
4192
4193 return true;
4194 }
4195
4196 long
md_pcrel_from(fixS * fixP)4197 md_pcrel_from (fixS *fixP)
4198 {
4199 return fixP->fx_where + fixP->fx_frag->fr_address;
4200 }
4201
4202 /* Apply a fixup to the object file. */
4203
4204 void
md_apply_fix(fixS * fixP,valueT * valP,segT seg ATTRIBUTE_UNUSED)4205 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
4206 {
4207 unsigned int subtype;
4208 bfd_byte *buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
4209 bool relaxable = false;
4210 offsetT loc;
4211 segT sub_segment;
4212
4213 /* Remember value for tc_gen_reloc. */
4214 fixP->fx_addnumber = *valP;
4215
4216 switch (fixP->fx_r_type)
4217 {
4218 case BFD_RELOC_RISCV_HI20:
4219 case BFD_RELOC_RISCV_LO12_I:
4220 case BFD_RELOC_RISCV_LO12_S:
4221 bfd_putl32 (riscv_apply_const_reloc (fixP->fx_r_type, *valP)
4222 | bfd_getl32 (buf), buf);
4223 if (fixP->fx_addsy == NULL)
4224 fixP->fx_done = true;
4225 relaxable = true;
4226 break;
4227
4228 case BFD_RELOC_RISCV_GOT_HI20:
4229 /* R_RISCV_GOT_HI20 and the following R_RISCV_LO12_I are relaxable
4230 only if it is created as a result of la or lga assembler macros. */
4231 if (fixP->tc_fix_data.source_macro == M_LA
4232 || fixP->tc_fix_data.source_macro == M_LGA)
4233 relaxable = true;
4234 break;
4235
4236 case BFD_RELOC_RISCV_ADD8:
4237 case BFD_RELOC_RISCV_ADD16:
4238 case BFD_RELOC_RISCV_ADD32:
4239 case BFD_RELOC_RISCV_ADD64:
4240 case BFD_RELOC_RISCV_SUB6:
4241 case BFD_RELOC_RISCV_SUB8:
4242 case BFD_RELOC_RISCV_SUB16:
4243 case BFD_RELOC_RISCV_SUB32:
4244 case BFD_RELOC_RISCV_SUB64:
4245 case BFD_RELOC_RISCV_RELAX:
4246 /* cvt_frag_to_fill () has called output_leb128 (). */
4247 case BFD_RELOC_RISCV_SET_ULEB128:
4248 case BFD_RELOC_RISCV_SUB_ULEB128:
4249 break;
4250
4251 case BFD_RELOC_RISCV_TPREL_HI20:
4252 case BFD_RELOC_RISCV_TPREL_LO12_I:
4253 case BFD_RELOC_RISCV_TPREL_LO12_S:
4254 case BFD_RELOC_RISCV_TPREL_ADD:
4255 relaxable = true;
4256 /* Fall through. */
4257
4258 case BFD_RELOC_RISCV_TLS_GOT_HI20:
4259 case BFD_RELOC_RISCV_TLS_GD_HI20:
4260 case BFD_RELOC_RISCV_TLS_DTPREL32:
4261 case BFD_RELOC_RISCV_TLS_DTPREL64:
4262 if (fixP->fx_addsy != NULL)
4263 S_SET_THREAD_LOCAL (fixP->fx_addsy);
4264 else
4265 as_bad_where (fixP->fx_file, fixP->fx_line,
4266 _("TLS relocation against a constant"));
4267 break;
4268
4269 case BFD_RELOC_32:
4270 /* Use pc-relative relocation for FDE initial location.
4271 The symbol address in .eh_frame may be adjusted in
4272 _bfd_elf_discard_section_eh_frame, and the content of
4273 .eh_frame will be adjusted in _bfd_elf_write_section_eh_frame.
4274 Therefore, we cannot insert a relocation whose addend symbol is
4275 in .eh_frame. Othrewise, the value may be adjusted twice. */
4276 if (fixP->fx_addsy && fixP->fx_subsy
4277 && (sub_segment = S_GET_SEGMENT (fixP->fx_subsy))
4278 && strcmp (sub_segment->name, ".eh_frame") == 0
4279 && S_GET_VALUE (fixP->fx_subsy)
4280 == fixP->fx_frag->fr_address + fixP->fx_where)
4281 {
4282 fixP->fx_r_type = BFD_RELOC_RISCV_32_PCREL;
4283 fixP->fx_subsy = NULL;
4284 break;
4285 }
4286 /* Fall through. */
4287 case BFD_RELOC_64:
4288 case BFD_RELOC_16:
4289 case BFD_RELOC_8:
4290 case BFD_RELOC_RISCV_CFA:
4291 if (fixP->fx_addsy && fixP->fx_subsy)
4292 {
4293 fixP->fx_next = xmemdup (fixP, sizeof (*fixP), sizeof (*fixP));
4294 fixP->fx_next->fx_addsy = fixP->fx_subsy;
4295 fixP->fx_next->fx_subsy = NULL;
4296 fixP->fx_next->fx_offset = 0;
4297 fixP->fx_subsy = NULL;
4298
4299 switch (fixP->fx_r_type)
4300 {
4301 case BFD_RELOC_64:
4302 fixP->fx_r_type = BFD_RELOC_RISCV_ADD64;
4303 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB64;
4304 break;
4305
4306 case BFD_RELOC_32:
4307 fixP->fx_r_type = BFD_RELOC_RISCV_ADD32;
4308 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB32;
4309 break;
4310
4311 case BFD_RELOC_16:
4312 fixP->fx_r_type = BFD_RELOC_RISCV_ADD16;
4313 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB16;
4314 break;
4315
4316 case BFD_RELOC_8:
4317 fixP->fx_r_type = BFD_RELOC_RISCV_ADD8;
4318 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB8;
4319 break;
4320
4321 case BFD_RELOC_RISCV_CFA:
4322 /* Load the byte to get the subtype. */
4323 subtype = bfd_get_8 (NULL, &((fragS *) (fixP->fx_frag->fr_opcode))->fr_literal[fixP->fx_where]);
4324 loc = fixP->fx_frag->fr_fix - (subtype & 7);
4325 switch (subtype)
4326 {
4327 case DW_CFA_advance_loc1:
4328 fixP->fx_where = loc + 1;
4329 fixP->fx_next->fx_where = loc + 1;
4330 fixP->fx_r_type = BFD_RELOC_RISCV_SET8;
4331 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB8;
4332 break;
4333
4334 case DW_CFA_advance_loc2:
4335 fixP->fx_size = 2;
4336 fixP->fx_next->fx_size = 2;
4337 fixP->fx_where = loc + 1;
4338 fixP->fx_next->fx_where = loc + 1;
4339 fixP->fx_r_type = BFD_RELOC_RISCV_SET16;
4340 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB16;
4341 break;
4342
4343 case DW_CFA_advance_loc4:
4344 fixP->fx_size = 4;
4345 fixP->fx_next->fx_size = 4;
4346 fixP->fx_where = loc;
4347 fixP->fx_next->fx_where = loc;
4348 fixP->fx_r_type = BFD_RELOC_RISCV_SET32;
4349 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB32;
4350 break;
4351
4352 default:
4353 if (subtype < 0x80 && (subtype & 0x40))
4354 {
4355 /* DW_CFA_advance_loc */
4356 fixP->fx_frag = (fragS *) fixP->fx_frag->fr_opcode;
4357 fixP->fx_next->fx_frag = fixP->fx_frag;
4358 fixP->fx_r_type = BFD_RELOC_RISCV_SET6;
4359 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB6;
4360 }
4361 else
4362 as_fatal (_("internal: bad CFA value #%d"), subtype);
4363 break;
4364 }
4365 break;
4366
4367 default:
4368 /* This case is unreachable. */
4369 abort ();
4370 }
4371 }
4372 /* Fall through. */
4373
4374 case BFD_RELOC_RVA:
4375 /* If we are deleting this reloc entry, we must fill in the
4376 value now. This can happen if we have a .word which is not
4377 resolved when it appears but is later defined. */
4378 if (fixP->fx_addsy == NULL)
4379 {
4380 gas_assert (fixP->fx_size <= sizeof (valueT));
4381 md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
4382 fixP->fx_done = 1;
4383 }
4384 break;
4385
4386 case BFD_RELOC_RISCV_JMP:
4387 if (fixP->fx_addsy)
4388 {
4389 /* Fill in a tentative value to improve objdump readability. */
4390 bfd_vma target = S_GET_VALUE (fixP->fx_addsy) + *valP;
4391 bfd_vma delta = target - md_pcrel_from (fixP);
4392 bfd_putl32 (bfd_getl32 (buf) | ENCODE_JTYPE_IMM (delta), buf);
4393 }
4394 break;
4395
4396 case BFD_RELOC_12_PCREL:
4397 if (fixP->fx_addsy)
4398 {
4399 /* Fill in a tentative value to improve objdump readability. */
4400 bfd_vma target = S_GET_VALUE (fixP->fx_addsy) + *valP;
4401 bfd_vma delta = target - md_pcrel_from (fixP);
4402 bfd_putl32 (bfd_getl32 (buf) | ENCODE_BTYPE_IMM (delta), buf);
4403 }
4404 break;
4405
4406 case BFD_RELOC_RISCV_RVC_BRANCH:
4407 if (fixP->fx_addsy)
4408 {
4409 /* Fill in a tentative value to improve objdump readability. */
4410 bfd_vma target = S_GET_VALUE (fixP->fx_addsy) + *valP;
4411 bfd_vma delta = target - md_pcrel_from (fixP);
4412 bfd_putl16 (bfd_getl16 (buf) | ENCODE_CBTYPE_IMM (delta), buf);
4413 }
4414 break;
4415
4416 case BFD_RELOC_RISCV_RVC_JUMP:
4417 if (fixP->fx_addsy)
4418 {
4419 /* Fill in a tentative value to improve objdump readability. */
4420 bfd_vma target = S_GET_VALUE (fixP->fx_addsy) + *valP;
4421 bfd_vma delta = target - md_pcrel_from (fixP);
4422 bfd_putl16 (bfd_getl16 (buf) | ENCODE_CJTYPE_IMM (delta), buf);
4423 }
4424 break;
4425
4426 case BFD_RELOC_RISCV_CALL:
4427 case BFD_RELOC_RISCV_CALL_PLT:
4428 relaxable = true;
4429 break;
4430
4431 case BFD_RELOC_RISCV_PCREL_HI20:
4432 /* Record and evaluate the pcrel_hi relocation with local symbol.
4433 Fill in a tentative value to improve objdump readability for -mrelax,
4434 and set fx_done for -mno-relax. */
4435 if (fixP->fx_addsy
4436 && S_IS_LOCAL (fixP->fx_addsy)
4437 && S_GET_SEGMENT (fixP->fx_addsy) == seg)
4438 {
4439 bfd_vma target = S_GET_VALUE (fixP->fx_addsy) + *valP;
4440 bfd_vma value = target - md_pcrel_from (fixP);
4441
4442 /* Record PCREL_HI20. */
4443 if (!riscv_record_pcrel_fixup (riscv_pcrel_hi_fixup_hash,
4444 md_pcrel_from (fixP),
4445 fixP->fx_addsy,
4446 target))
4447 as_warn (_("too many pcrel_hi"));
4448
4449 bfd_putl32 (bfd_getl32 (buf)
4450 | ENCODE_UTYPE_IMM (RISCV_CONST_HIGH_PART (value)),
4451 buf);
4452 if (!riscv_opts.relax)
4453 fixP->fx_done = 1;
4454 }
4455 relaxable = true;
4456 break;
4457
4458 case BFD_RELOC_RISCV_PCREL_LO12_S:
4459 case BFD_RELOC_RISCV_PCREL_LO12_I:
4460 /* Resolve the pcrel_lo relocation with local symbol.
4461 Fill in a tentative value to improve objdump readability for -mrelax,
4462 and set fx_done for -mno-relax. */
4463 {
4464 bfd_vma location_pcrel_hi = S_GET_VALUE (fixP->fx_addsy) + *valP;
4465 riscv_pcrel_hi_fixup search = {location_pcrel_hi, 0, 0};
4466 riscv_pcrel_hi_fixup *entry = htab_find (riscv_pcrel_hi_fixup_hash,
4467 &search);
4468 if (entry && entry->symbol
4469 && S_IS_LOCAL (entry->symbol)
4470 && S_GET_SEGMENT (entry->symbol) == seg)
4471 {
4472 bfd_vma target = entry->target;
4473 bfd_vma value = target - entry->address;
4474 bfd_putl32 (bfd_getl32 (buf) | ENCODE_ITYPE_IMM (value), buf);
4475 /* Relaxations should never be enabled by `.option relax'. */
4476 if (!riscv_opts.relax)
4477 fixP->fx_done = 1;
4478 }
4479 }
4480 relaxable = true;
4481 break;
4482
4483 case BFD_RELOC_RISCV_ALIGN:
4484 break;
4485
4486 default:
4487 /* We ignore generic BFD relocations we don't know about. */
4488 if (bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type) != NULL)
4489 as_fatal (_("internal: bad relocation #%d"), fixP->fx_r_type);
4490 }
4491
4492 if (fixP->fx_subsy != NULL)
4493 as_bad_subtract (fixP);
4494
4495 /* Add an R_RISCV_RELAX reloc if the reloc is relaxable. */
4496 if (relaxable && fixP->fx_tcbit && fixP->fx_addsy != NULL)
4497 {
4498 fixP->fx_next = xmemdup (fixP, sizeof (*fixP), sizeof (*fixP));
4499 fixP->fx_next->fx_addsy = fixP->fx_next->fx_subsy = NULL;
4500 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_RELAX;
4501 fixP->fx_next->fx_size = 0;
4502 }
4503 }
4504
4505 /* Because the value of .cfi_remember_state may changed after relaxation,
4506 we insert a fix to relocate it again in link-time. */
4507
4508 void
riscv_pre_output_hook(void)4509 riscv_pre_output_hook (void)
4510 {
4511 const frchainS *frch;
4512 segT s;
4513
4514 /* Save the current segment info. */
4515 segT seg = now_seg;
4516 subsegT subseg = now_subseg;
4517
4518 for (s = stdoutput->sections; s; s = s->next)
4519 for (frch = seg_info (s)->frchainP; frch; frch = frch->frch_next)
4520 {
4521 fragS *frag;
4522
4523 for (frag = frch->frch_root; frag; frag = frag->fr_next)
4524 {
4525 if (frag->fr_type == rs_cfa)
4526 {
4527 expressionS exp;
4528 expressionS *symval;
4529
4530 symval = symbol_get_value_expression (frag->fr_symbol);
4531 exp.X_op = O_subtract;
4532 exp.X_add_symbol = symval->X_add_symbol;
4533 exp.X_add_number = 0;
4534 exp.X_op_symbol = symval->X_op_symbol;
4535
4536 /* We must set the segment before creating a frag after all
4537 frag chains have been chained together. */
4538 subseg_set (s, frch->frch_subseg);
4539
4540 fix_new_exp (frag, (int) frag->fr_offset, 1, &exp, 0,
4541 BFD_RELOC_RISCV_CFA);
4542 }
4543 }
4544 }
4545
4546 /* Restore the original segment info. */
4547 subseg_set (seg, subseg);
4548 }
4549
4550 /* Handle the .option pseudo-op. */
4551
4552 static void
s_riscv_option(int x ATTRIBUTE_UNUSED)4553 s_riscv_option (int x ATTRIBUTE_UNUSED)
4554 {
4555 char *name = input_line_pointer, ch;
4556
4557 while (!is_end_of_line[(unsigned char) *input_line_pointer])
4558 ++input_line_pointer;
4559 ch = *input_line_pointer;
4560 *input_line_pointer = '\0';
4561
4562 if (strcmp (name, "rvc") == 0)
4563 {
4564 riscv_update_subset (&riscv_rps_as, "+c");
4565 riscv_reset_subsets_list_arch_str ();
4566 riscv_set_rvc (true);
4567 }
4568 else if (strcmp (name, "norvc") == 0)
4569 {
4570 riscv_update_subset (&riscv_rps_as, "-c");
4571 riscv_reset_subsets_list_arch_str ();
4572 riscv_set_rvc (false);
4573 }
4574 else if (strcmp (name, "pic") == 0)
4575 riscv_opts.pic = true;
4576 else if (strcmp (name, "nopic") == 0)
4577 riscv_opts.pic = false;
4578 else if (strcmp (name, "relax") == 0)
4579 riscv_opts.relax = true;
4580 else if (strcmp (name, "norelax") == 0)
4581 riscv_opts.relax = false;
4582 else if (strcmp (name, "csr-check") == 0)
4583 riscv_opts.csr_check = true;
4584 else if (strcmp (name, "no-csr-check") == 0)
4585 riscv_opts.csr_check = false;
4586 else if (strncmp (name, "arch,", 5) == 0)
4587 {
4588 name += 5;
4589 if (ISSPACE (*name) && *name != '\0')
4590 name++;
4591 riscv_update_subset (&riscv_rps_as, name);
4592 riscv_reset_subsets_list_arch_str ();
4593
4594 riscv_set_rvc (false);
4595 if (riscv_subset_supports (&riscv_rps_as, "c")
4596 || riscv_subset_supports (&riscv_rps_as, "zca"))
4597 riscv_set_rvc (true);
4598
4599 if (riscv_subset_supports (&riscv_rps_as, "ztso"))
4600 riscv_set_tso ();
4601 }
4602 else if (strcmp (name, "push") == 0)
4603 {
4604 struct riscv_option_stack *s;
4605
4606 s = XNEW (struct riscv_option_stack);
4607 s->next = riscv_opts_stack;
4608 s->options = riscv_opts;
4609 s->subset_list = riscv_rps_as.subset_list;
4610 riscv_opts_stack = s;
4611 riscv_rps_as.subset_list = riscv_copy_subset_list (s->subset_list);
4612 }
4613 else if (strcmp (name, "pop") == 0)
4614 {
4615 struct riscv_option_stack *s;
4616
4617 s = riscv_opts_stack;
4618 if (s == NULL)
4619 as_bad (_(".option pop with no .option push"));
4620 else
4621 {
4622 riscv_subset_list_t *release_subsets = riscv_rps_as.subset_list;
4623 riscv_opts_stack = s->next;
4624 riscv_opts = s->options;
4625 riscv_rps_as.subset_list = s->subset_list;
4626 riscv_release_subset_list (release_subsets);
4627 free (s);
4628 }
4629 }
4630 else
4631 {
4632 as_warn (_("unrecognized .option directive: %s"), name);
4633 }
4634 *input_line_pointer = ch;
4635 demand_empty_rest_of_line ();
4636 }
4637
4638 /* Handle the .dtprelword and .dtpreldword pseudo-ops. They generate
4639 a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
4640 use in DWARF debug information. */
4641
4642 static void
s_dtprel(int bytes)4643 s_dtprel (int bytes)
4644 {
4645 expressionS ex;
4646 char *p;
4647
4648 expression (&ex);
4649
4650 if (ex.X_op != O_symbol)
4651 {
4652 as_bad (_("unsupported use of %s"), (bytes == 8
4653 ? ".dtpreldword"
4654 : ".dtprelword"));
4655 ignore_rest_of_line ();
4656 }
4657
4658 p = frag_more (bytes);
4659 md_number_to_chars (p, 0, bytes);
4660 fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, false,
4661 (bytes == 8
4662 ? BFD_RELOC_RISCV_TLS_DTPREL64
4663 : BFD_RELOC_RISCV_TLS_DTPREL32));
4664
4665 demand_empty_rest_of_line ();
4666 }
4667
4668 static void
riscv_make_nops(char * buf,bfd_vma bytes)4669 riscv_make_nops (char *buf, bfd_vma bytes)
4670 {
4671 bfd_vma i = 0;
4672
4673 /* RISC-V instructions cannot begin or end on odd addresses, so this case
4674 means we are not within a valid instruction sequence. It is thus safe
4675 to use a zero byte, even though that is not a valid instruction. */
4676 if (bytes % 2 == 1)
4677 buf[i++] = 0;
4678
4679 /* Use at most one 2-byte NOP. */
4680 if ((bytes - i) % 4 == 2)
4681 {
4682 number_to_chars_littleendian (buf + i, RVC_NOP, 2);
4683 i += 2;
4684 }
4685
4686 /* Fill the remainder with 4-byte NOPs. */
4687 for ( ; i < bytes; i += 4)
4688 number_to_chars_littleendian (buf + i, RISCV_NOP, 4);
4689 }
4690
4691 /* Called from md_do_align. Used to create an alignment frag in a
4692 code section by emitting a worst-case NOP sequence that the linker
4693 will later relax to the correct number of NOPs. We can't compute
4694 the correct alignment now because of other linker relaxations. */
4695
4696 bool
riscv_frag_align_code(int n)4697 riscv_frag_align_code (int n)
4698 {
4699 bfd_vma bytes = (bfd_vma) 1 << n;
4700 bfd_vma insn_alignment = riscv_opts.rvc ? 2 : 4;
4701 bfd_vma worst_case_bytes = bytes - insn_alignment;
4702 char *nops;
4703 expressionS ex;
4704
4705 /* If we are moving to a smaller alignment than the instruction size, then no
4706 alignment is required. */
4707 if (bytes <= insn_alignment)
4708 return true;
4709
4710 /* When not relaxing, riscv_handle_align handles code alignment. */
4711 if (!riscv_opts.relax)
4712 return false;
4713
4714 /* Maybe we should use frag_var to create a new rs_align_code fragment,
4715 rather than just use frag_more to handle an alignment here? So that we
4716 don't need to call riscv_mapping_state again later, and then only need
4717 to check frag->fr_type to see if it is frag_align_code. */
4718 nops = frag_more (worst_case_bytes);
4719
4720 ex.X_op = O_constant;
4721 ex.X_add_number = worst_case_bytes;
4722
4723 riscv_make_nops (nops, worst_case_bytes);
4724
4725 fix_new_exp (frag_now, nops - frag_now->fr_literal, 0,
4726 &ex, false, BFD_RELOC_RISCV_ALIGN);
4727
4728 riscv_mapping_state (MAP_INSN, worst_case_bytes, true/* fr_align_code */);
4729
4730 /* We need to start a new frag after the alignment which may be removed by
4731 the linker, to prevent the assembler from computing static offsets.
4732 This is necessary to get correct EH info. */
4733 frag_wane (frag_now);
4734 frag_new (0);
4735
4736 return true;
4737 }
4738
4739 /* Implement HANDLE_ALIGN. */
4740
4741 void
riscv_handle_align(fragS * fragP)4742 riscv_handle_align (fragS *fragP)
4743 {
4744 switch (fragP->fr_type)
4745 {
4746 case rs_align_code:
4747 /* When relaxing, riscv_frag_align_code handles code alignment. */
4748 if (!riscv_opts.relax)
4749 {
4750 bfd_signed_vma bytes = (fragP->fr_next->fr_address
4751 - fragP->fr_address - fragP->fr_fix);
4752 /* We have 4 byte uncompressed nops. */
4753 bfd_signed_vma size = 4;
4754 bfd_signed_vma excess = bytes % size;
4755 bfd_boolean odd_padding = (excess % 2 == 1);
4756 char *p = fragP->fr_literal + fragP->fr_fix;
4757
4758 if (bytes <= 0)
4759 break;
4760
4761 /* Insert zeros or compressed nops to get 4 byte alignment. */
4762 if (excess)
4763 {
4764 if (odd_padding)
4765 riscv_add_odd_padding_symbol (fragP);
4766 riscv_make_nops (p, excess);
4767 fragP->fr_fix += excess;
4768 p += excess;
4769 }
4770
4771 /* The frag will be changed to `rs_fill` later. The function
4772 `write_contents` will try to fill the remaining spaces
4773 according to the patterns we give. In this case, we give
4774 a 4 byte uncompressed nop as the pattern, and set the size
4775 of the pattern into `fr_var`. The nop will be output to the
4776 file `fr_offset` times. However, `fr_offset` could be zero
4777 if we don't need to pad the boundary finally. */
4778 riscv_make_nops (p, size);
4779 fragP->fr_var = size;
4780 }
4781 break;
4782
4783 default:
4784 break;
4785 }
4786 }
4787
4788 /* This usually called from frag_var. */
4789
4790 void
riscv_init_frag(fragS * fragP,int max_chars)4791 riscv_init_frag (fragS * fragP, int max_chars)
4792 {
4793 /* Do not add mapping symbol to debug sections. */
4794 if (bfd_section_flags (now_seg) & SEC_DEBUGGING)
4795 return;
4796
4797 switch (fragP->fr_type)
4798 {
4799 case rs_fill:
4800 case rs_align:
4801 case rs_align_test:
4802 riscv_mapping_state (MAP_DATA, max_chars, false/* fr_align_code */);
4803 break;
4804 case rs_align_code:
4805 riscv_mapping_state (MAP_INSN, max_chars, true/* fr_align_code */);
4806 break;
4807 default:
4808 break;
4809 }
4810 }
4811
4812 int
md_estimate_size_before_relax(fragS * fragp,asection * segtype)4813 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
4814 {
4815 return (fragp->fr_var = relaxed_branch_length (fragp, segtype, false));
4816 }
4817
4818 /* Translate internal representation of relocation info to BFD target
4819 format. */
4820
4821 arelent *
tc_gen_reloc(asection * section ATTRIBUTE_UNUSED,fixS * fixp)4822 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
4823 {
4824 arelent *reloc = (arelent *) xmalloc (sizeof (arelent));
4825
4826 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
4827 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
4828 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
4829 reloc->addend = fixp->fx_addnumber;
4830
4831 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
4832 if (reloc->howto == NULL)
4833 {
4834 if ((fixp->fx_r_type == BFD_RELOC_16 || fixp->fx_r_type == BFD_RELOC_8)
4835 && fixp->fx_addsy != NULL && fixp->fx_subsy != NULL)
4836 {
4837 /* We don't have R_RISCV_8/16, but for this special case,
4838 we can use R_RISCV_ADD8/16 with R_RISCV_SUB8/16. */
4839 return reloc;
4840 }
4841
4842 as_bad_where (fixp->fx_file, fixp->fx_line,
4843 _("cannot represent %s relocation in object file"),
4844 bfd_get_reloc_code_name (fixp->fx_r_type));
4845 return NULL;
4846 }
4847
4848 return reloc;
4849 }
4850
4851 int
riscv_relax_frag(asection * sec,fragS * fragp,long stretch ATTRIBUTE_UNUSED)4852 riscv_relax_frag (asection *sec, fragS *fragp, long stretch ATTRIBUTE_UNUSED)
4853 {
4854 if (RELAX_BRANCH_P (fragp->fr_subtype))
4855 {
4856 offsetT old_var = fragp->fr_var;
4857 fragp->fr_var = relaxed_branch_length (fragp, sec, true);
4858 return fragp->fr_var - old_var;
4859 }
4860
4861 return 0;
4862 }
4863
4864 /* Expand far branches to multi-instruction sequences. */
4865
4866 static void
md_convert_frag_branch(fragS * fragp)4867 md_convert_frag_branch (fragS *fragp)
4868 {
4869 bfd_byte *buf;
4870 expressionS exp;
4871 fixS *fixp;
4872 insn_t insn;
4873 int rs1, reloc;
4874
4875 buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
4876
4877 exp.X_op = O_symbol;
4878 exp.X_add_symbol = fragp->fr_symbol;
4879 exp.X_add_number = fragp->fr_offset;
4880
4881 gas_assert (fragp->fr_var == RELAX_BRANCH_LENGTH (fragp->fr_subtype));
4882
4883 if (RELAX_BRANCH_RVC (fragp->fr_subtype))
4884 {
4885 switch (RELAX_BRANCH_LENGTH (fragp->fr_subtype))
4886 {
4887 case 8:
4888 case 4:
4889 /* Expand the RVC branch into a RISC-V one. */
4890 insn = bfd_getl16 (buf);
4891 rs1 = 8 + ((insn >> OP_SH_CRS1S) & OP_MASK_CRS1S);
4892 if ((insn & MASK_C_J) == MATCH_C_J)
4893 insn = MATCH_JAL;
4894 else if ((insn & MASK_C_JAL) == MATCH_C_JAL)
4895 insn = MATCH_JAL | (X_RA << OP_SH_RD);
4896 else if ((insn & MASK_C_BEQZ) == MATCH_C_BEQZ)
4897 insn = MATCH_BEQ | (rs1 << OP_SH_RS1);
4898 else if ((insn & MASK_C_BNEZ) == MATCH_C_BNEZ)
4899 insn = MATCH_BNE | (rs1 << OP_SH_RS1);
4900 else
4901 abort ();
4902 bfd_putl32 (insn, buf);
4903 break;
4904
4905 case 6:
4906 /* Invert the branch condition. Branch over the jump. */
4907 insn = bfd_getl16 (buf);
4908 insn ^= MATCH_C_BEQZ ^ MATCH_C_BNEZ;
4909 insn |= ENCODE_CBTYPE_IMM (6);
4910 bfd_putl16 (insn, buf);
4911 buf += 2;
4912 goto jump;
4913
4914 case 2:
4915 /* Just keep the RVC branch. */
4916 reloc = RELAX_BRANCH_UNCOND (fragp->fr_subtype)
4917 ? BFD_RELOC_RISCV_RVC_JUMP : BFD_RELOC_RISCV_RVC_BRANCH;
4918 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
4919 2, &exp, false, reloc);
4920 buf += 2;
4921 goto done;
4922
4923 default:
4924 abort ();
4925 }
4926 }
4927
4928 switch (RELAX_BRANCH_LENGTH (fragp->fr_subtype))
4929 {
4930 case 8:
4931 gas_assert (!RELAX_BRANCH_UNCOND (fragp->fr_subtype));
4932
4933 /* Invert the branch condition. Branch over the jump. */
4934 insn = bfd_getl32 (buf);
4935 insn ^= MATCH_BEQ ^ MATCH_BNE;
4936 insn |= ENCODE_BTYPE_IMM (8);
4937 bfd_putl32 (insn, buf);
4938 buf += 4;
4939
4940 jump:
4941 /* Jump to the target. */
4942 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
4943 4, &exp, false, BFD_RELOC_RISCV_JMP);
4944 bfd_putl32 (MATCH_JAL, buf);
4945 buf += 4;
4946 break;
4947
4948 case 4:
4949 reloc = RELAX_BRANCH_UNCOND (fragp->fr_subtype)
4950 ? BFD_RELOC_RISCV_JMP : BFD_RELOC_12_PCREL;
4951 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
4952 4, &exp, false, reloc);
4953 buf += 4;
4954 break;
4955
4956 default:
4957 abort ();
4958 }
4959
4960 done:
4961 fixp->fx_file = fragp->fr_file;
4962 fixp->fx_line = fragp->fr_line;
4963
4964 gas_assert (buf == (bfd_byte *)fragp->fr_literal
4965 + fragp->fr_fix + fragp->fr_var);
4966
4967 fragp->fr_fix += fragp->fr_var;
4968 }
4969
4970 /* Relax a machine dependent frag. This returns the amount by which
4971 the current size of the frag should change. */
4972
4973 void
md_convert_frag(bfd * abfd ATTRIBUTE_UNUSED,segT asec ATTRIBUTE_UNUSED,fragS * fragp)4974 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec ATTRIBUTE_UNUSED,
4975 fragS *fragp)
4976 {
4977 gas_assert (RELAX_BRANCH_P (fragp->fr_subtype));
4978 md_convert_frag_branch (fragp);
4979 }
4980
4981 void
md_show_usage(FILE * stream)4982 md_show_usage (FILE *stream)
4983 {
4984 fprintf (stream, _("\
4985 RISC-V options:\n\
4986 -fpic or -fPIC generate position-independent code\n\
4987 -fno-pic don't generate position-independent code (default)\n\
4988 -march=ISA set the RISC-V architecture\n\
4989 -misa-spec=ISAspec set the RISC-V ISA spec (2.2, 20190608, 20191213)\n\
4990 -mpriv-spec=PRIVspec set the RISC-V privilege spec (1.9.1, 1.10, 1.11, 1.12)\n\
4991 -mabi=ABI set the RISC-V ABI\n\
4992 -mrelax enable relax (default)\n\
4993 -mno-relax disable relax\n\
4994 -march-attr generate RISC-V arch attribute\n\
4995 -mno-arch-attr don't generate RISC-V arch attribute\n\
4996 -mcsr-check enable the csr ISA and privilege spec version checks\n\
4997 -mno-csr-check disable the csr ISA and privilege spec version checks (default)\n\
4998 -mbig-endian assemble for big-endian\n\
4999 -mlittle-endian assemble for little-endian\n\
5000 "));
5001 }
5002
5003 /* Standard calling conventions leave the CFA at SP on entry. */
5004
5005 void
riscv_cfi_frame_initial_instructions(void)5006 riscv_cfi_frame_initial_instructions (void)
5007 {
5008 cfi_add_CFA_def_cfa_register (X_SP);
5009 }
5010
5011 int
tc_riscv_regname_to_dw2regnum(char * regname)5012 tc_riscv_regname_to_dw2regnum (char *regname)
5013 {
5014 int reg;
5015
5016 if ((reg = reg_lookup_internal (regname, RCLASS_GPR)) >= 0)
5017 return reg;
5018
5019 if ((reg = reg_lookup_internal (regname, RCLASS_FPR)) >= 0)
5020 return reg + 32;
5021
5022 if ((reg = reg_lookup_internal (regname, RCLASS_VECR)) >= 0)
5023 return reg + 96;
5024
5025 /* CSRs are numbered 4096 -> 8191. */
5026 if ((reg = reg_lookup_internal (regname, RCLASS_CSR)) >= 0)
5027 return reg + 4096;
5028
5029 as_bad (_("unknown register `%s'"), regname);
5030 return -1;
5031 }
5032
5033 void
riscv_elf_final_processing(void)5034 riscv_elf_final_processing (void)
5035 {
5036 riscv_set_abi_by_arch ();
5037 riscv_release_subset_list (riscv_rps_as.subset_list);
5038 elf_elfheader (stdoutput)->e_flags |= elf_flags;
5039 }
5040
5041 /* Parse the .sleb128 and .uleb128 pseudos. Only allow constant expressions,
5042 since these directives break relaxation when used with symbol deltas. */
5043
5044 static void
s_riscv_leb128(int sign)5045 s_riscv_leb128 (int sign)
5046 {
5047 expressionS exp;
5048 char *save_in = input_line_pointer;
5049
5050 expression (&exp);
5051 if (sign && exp.X_op != O_constant)
5052 as_bad (_("non-constant .sleb128 is not supported"));
5053 else if (!sign && exp.X_op != O_constant && exp.X_op != O_subtract)
5054 as_bad (_(".uleb128 only supports constant or subtract expressions"));
5055
5056 demand_empty_rest_of_line ();
5057
5058 input_line_pointer = save_in;
5059 return s_leb128 (sign);
5060 }
5061
5062 /* Parse the .insn directive. There are three formats,
5063 Format 1: .insn <type> <operand1>, <operand2>, ...
5064 Format 2: .insn <length>, <value>
5065 Format 3: .insn <value>. */
5066
5067 static void
s_riscv_insn(int x ATTRIBUTE_UNUSED)5068 s_riscv_insn (int x ATTRIBUTE_UNUSED)
5069 {
5070 char *str = input_line_pointer;
5071 struct riscv_cl_insn insn;
5072 expressionS imm_expr;
5073 bfd_reloc_code_real_type imm_reloc = BFD_RELOC_UNUSED;
5074 char save_c;
5075
5076 while (!is_end_of_line[(unsigned char) *input_line_pointer])
5077 ++input_line_pointer;
5078
5079 save_c = *input_line_pointer;
5080 *input_line_pointer = '\0';
5081
5082 riscv_mapping_state (MAP_INSN, 0, false/* fr_align_code */);
5083
5084 struct riscv_ip_error error = riscv_ip (str, &insn, &imm_expr,
5085 &imm_reloc, insn_type_hash);
5086 if (error.msg)
5087 {
5088 char *save_in = input_line_pointer;
5089 error.msg = riscv_ip_hardcode (str, &insn, &imm_expr, error.msg);
5090 input_line_pointer = save_in;
5091 }
5092
5093 if (error.msg)
5094 {
5095 if (error.missing_ext)
5096 as_bad ("%s `%s', extension `%s' required", error.msg, error.statement,
5097 error.missing_ext);
5098 else
5099 as_bad ("%s `%s'", error.msg, error.statement);
5100 }
5101 else
5102 {
5103 gas_assert (insn.insn_mo->pinfo != INSN_MACRO);
5104 append_insn (&insn, &imm_expr, imm_reloc);
5105 }
5106
5107 *input_line_pointer = save_c;
5108 demand_empty_rest_of_line ();
5109 }
5110
5111 /* Update architecture and privileged elf attributes. If we don't set
5112 them, then try to output the default ones. */
5113
5114 static void
riscv_write_out_attrs(void)5115 riscv_write_out_attrs (void)
5116 {
5117 const char *arch_str, *priv_str, *p;
5118 /* versions[0]: major version.
5119 versions[1]: minor version.
5120 versions[2]: revision version. */
5121 unsigned versions[3] = {0}, number = 0;
5122 unsigned int i;
5123
5124 /* Re-write architecture elf attribute. */
5125 arch_str = riscv_rps_as.subset_list->arch_str;
5126 if (!bfd_elf_add_proc_attr_string (stdoutput, Tag_RISCV_arch, arch_str))
5127 as_fatal (_("error adding attribute: %s"),
5128 bfd_errmsg (bfd_get_error ()));
5129
5130 /* For the file without any instruction, we don't set the default_priv_spec
5131 according to the privileged elf attributes since the md_assemble isn't
5132 called. */
5133 if (!start_assemble
5134 && !riscv_set_default_priv_spec (NULL))
5135 return;
5136
5137 /* If we already have set privileged elf attributes, then no need to do
5138 anything. Otherwise, don't generate or update them when no CSR and
5139 privileged instructions are used. */
5140 if (!explicit_priv_attr)
5141 return;
5142
5143 RISCV_GET_PRIV_SPEC_NAME (priv_str, default_priv_spec);
5144 p = priv_str;
5145 for (i = 0; *p; ++p)
5146 {
5147 if (*p == '.' && i < 3)
5148 {
5149 versions[i++] = number;
5150 number = 0;
5151 }
5152 else if (ISDIGIT (*p))
5153 number = (number * 10) + (*p - '0');
5154 else
5155 {
5156 as_bad (_("internal: bad RISC-V privileged spec (%s)"), priv_str);
5157 return;
5158 }
5159 }
5160 versions[i] = number;
5161
5162 /* Re-write privileged elf attributes. */
5163 if (!bfd_elf_add_proc_attr_int (stdoutput, Tag_RISCV_priv_spec,
5164 versions[0])
5165 || !bfd_elf_add_proc_attr_int (stdoutput, Tag_RISCV_priv_spec_minor,
5166 versions[1])
5167 || !bfd_elf_add_proc_attr_int (stdoutput, Tag_RISCV_priv_spec_revision,
5168 versions[2]))
5169 as_fatal (_("error adding attribute: %s"),
5170 bfd_errmsg (bfd_get_error ()));
5171 }
5172
5173 /* Add the default contents for the .riscv.attributes section. */
5174
5175 static void
riscv_set_public_attributes(void)5176 riscv_set_public_attributes (void)
5177 {
5178 if (riscv_opts.arch_attr || explicit_attr)
5179 riscv_write_out_attrs ();
5180 }
5181
5182 /* Scan uleb128 subtraction expressions and insert fixups for them.
5183 e.g., .uleb128 .L1 - .L0
5184 Because relaxation may change the value of the subtraction, we
5185 must resolve them at link-time. */
5186
5187 static void
riscv_insert_uleb128_fixes(bfd * abfd ATTRIBUTE_UNUSED,asection * sec,void * xxx ATTRIBUTE_UNUSED)5188 riscv_insert_uleb128_fixes (bfd *abfd ATTRIBUTE_UNUSED,
5189 asection *sec, void *xxx ATTRIBUTE_UNUSED)
5190 {
5191 segment_info_type *seginfo = seg_info (sec);
5192 struct frag *fragP;
5193
5194 subseg_set (sec, 0);
5195
5196 for (fragP = seginfo->frchainP->frch_root;
5197 fragP; fragP = fragP->fr_next)
5198 {
5199 expressionS *exp, *exp_dup;
5200
5201 if (fragP->fr_type != rs_leb128 || fragP->fr_symbol == NULL)
5202 continue;
5203
5204 exp = symbol_get_value_expression (fragP->fr_symbol);
5205
5206 if (exp->X_op != O_subtract)
5207 continue;
5208
5209 /* Only unsigned leb128 can be handled. */
5210 gas_assert (fragP->fr_subtype == 0);
5211 exp_dup = xmemdup (exp, sizeof (*exp), sizeof (*exp));
5212 exp_dup->X_op = O_symbol;
5213 exp_dup->X_op_symbol = NULL;
5214
5215 /* Insert relocations to resolve the subtraction at link-time.
5216 Emit the SET relocation first in riscv. */
5217 exp_dup->X_add_symbol = exp->X_add_symbol;
5218 fix_new_exp (fragP, fragP->fr_fix, 0,
5219 exp_dup, 0, BFD_RELOC_RISCV_SET_ULEB128);
5220 exp_dup->X_add_symbol = exp->X_op_symbol;
5221 exp_dup->X_add_number = 0; /* Set addend of SUB_ULEB128 to zero. */
5222 fix_new_exp (fragP, fragP->fr_fix, 0,
5223 exp_dup, 0, BFD_RELOC_RISCV_SUB_ULEB128);
5224 free ((void *) exp_dup);
5225 }
5226 }
5227
5228 /* Called after all assembly has been done. */
5229
5230 void
riscv_md_finish(void)5231 riscv_md_finish (void)
5232 {
5233 riscv_set_public_attributes ();
5234 if (riscv_opts.relax)
5235 bfd_map_over_sections (stdoutput, riscv_insert_uleb128_fixes, NULL);
5236 }
5237
5238 /* Called just before the assembler exits. */
5239
5240 void
riscv_md_end(void)5241 riscv_md_end (void)
5242 {
5243 htab_delete (riscv_pcrel_hi_fixup_hash);
5244 }
5245
5246 /* Adjust the symbol table. */
5247
5248 void
riscv_adjust_symtab(void)5249 riscv_adjust_symtab (void)
5250 {
5251 bfd_map_over_sections (stdoutput, riscv_check_mapping_symbols, (char *) 0);
5252 elf_adjust_symtab ();
5253 }
5254
5255 /* Given a symbolic attribute NAME, return the proper integer value.
5256 Returns -1 if the attribute is not known. */
5257
5258 int
riscv_convert_symbolic_attribute(const char * name)5259 riscv_convert_symbolic_attribute (const char *name)
5260 {
5261 static const struct
5262 {
5263 const char *name;
5264 const int tag;
5265 }
5266 attribute_table[] =
5267 {
5268 /* When you modify this table you should
5269 also modify the list in doc/c-riscv.texi. */
5270 #define T(tag) {#tag, Tag_RISCV_##tag}, {"Tag_RISCV_" #tag, Tag_RISCV_##tag}
5271 T(arch),
5272 T(priv_spec),
5273 T(priv_spec_minor),
5274 T(priv_spec_revision),
5275 T(unaligned_access),
5276 T(stack_align),
5277 #undef T
5278 };
5279
5280 if (name == NULL)
5281 return -1;
5282
5283 unsigned int i;
5284 for (i = 0; i < ARRAY_SIZE (attribute_table); i++)
5285 if (strcmp (name, attribute_table[i].name) == 0)
5286 return attribute_table[i].tag;
5287
5288 return -1;
5289 }
5290
5291 /* Parse a .attribute directive. */
5292
5293 static void
s_riscv_attribute(int ignored ATTRIBUTE_UNUSED)5294 s_riscv_attribute (int ignored ATTRIBUTE_UNUSED)
5295 {
5296 int tag = obj_elf_vendor_attribute (OBJ_ATTR_PROC);
5297 unsigned old_xlen;
5298 obj_attribute *attr;
5299
5300 explicit_attr = true;
5301 switch (tag)
5302 {
5303 case Tag_RISCV_arch:
5304 old_xlen = xlen;
5305 attr = elf_known_obj_attributes_proc (stdoutput);
5306 if (!start_assemble)
5307 riscv_set_arch (attr[Tag_RISCV_arch].s);
5308 else
5309 as_fatal (_("architecture elf attributes must set before "
5310 "any instructions"));
5311
5312 if (old_xlen != xlen)
5313 {
5314 /* We must re-init bfd again if xlen is changed. */
5315 unsigned long mach = xlen == 64 ? bfd_mach_riscv64 : bfd_mach_riscv32;
5316 bfd_find_target (riscv_target_format (), stdoutput);
5317
5318 if (! bfd_set_arch_mach (stdoutput, bfd_arch_riscv, mach))
5319 as_warn (_("could not set architecture and machine"));
5320 }
5321 break;
5322
5323 case Tag_RISCV_priv_spec:
5324 case Tag_RISCV_priv_spec_minor:
5325 case Tag_RISCV_priv_spec_revision:
5326 if (start_assemble)
5327 as_fatal (_("privileged elf attributes must set before "
5328 "any instructions"));
5329 break;
5330
5331 default:
5332 break;
5333 }
5334 }
5335
5336 /* Mark symbol that it follows a variant CC convention. */
5337
5338 static void
s_variant_cc(int ignored ATTRIBUTE_UNUSED)5339 s_variant_cc (int ignored ATTRIBUTE_UNUSED)
5340 {
5341 char *name;
5342 char c;
5343 symbolS *sym;
5344 asymbol *bfdsym;
5345 elf_symbol_type *elfsym;
5346
5347 c = get_symbol_name (&name);
5348 if (!*name)
5349 as_bad (_("missing symbol name for .variant_cc directive"));
5350 sym = symbol_find_or_make (name);
5351 restore_line_pointer (c);
5352 demand_empty_rest_of_line ();
5353
5354 bfdsym = symbol_get_bfdsym (sym);
5355 elfsym = elf_symbol_from (bfdsym);
5356 gas_assert (elfsym);
5357 elfsym->internal_elf_sym.st_other |= STO_RISCV_VARIANT_CC;
5358 }
5359
5360 /* Same as elf_copy_symbol_attributes, but without copying st_other.
5361 This is needed so RISC-V specific st_other values can be independently
5362 specified for an IFUNC resolver (that is called by the dynamic linker)
5363 and the symbol it resolves (aliased to the resolver). In particular,
5364 if a function symbol has special st_other value set via directives,
5365 then attaching an IFUNC resolver to that symbol should not override
5366 the st_other setting. Requiring the directive on the IFUNC resolver
5367 symbol would be unexpected and problematic in C code, where the two
5368 symbols appear as two independent function declarations. */
5369
5370 void
riscv_elf_copy_symbol_attributes(symbolS * dest,symbolS * src)5371 riscv_elf_copy_symbol_attributes (symbolS *dest, symbolS *src)
5372 {
5373 struct elf_obj_sy *srcelf = symbol_get_obj (src);
5374 struct elf_obj_sy *destelf = symbol_get_obj (dest);
5375 /* If size is unset, copy size from src. Because we don't track whether
5376 .size has been used, we can't differentiate .size dest, 0 from the case
5377 where dest's size is unset. */
5378 if (!destelf->size && S_GET_SIZE (dest) == 0)
5379 {
5380 if (srcelf->size)
5381 {
5382 destelf->size = XNEW (expressionS);
5383 *destelf->size = *srcelf->size;
5384 }
5385 S_SET_SIZE (dest, S_GET_SIZE (src));
5386 }
5387 }
5388
5389 /* RISC-V pseudo-ops table. */
5390 static const pseudo_typeS riscv_pseudo_table[] =
5391 {
5392 {"option", s_riscv_option, 0},
5393 {"half", cons, 2},
5394 {"word", cons, 4},
5395 {"dword", cons, 8},
5396 {"dtprelword", s_dtprel, 4},
5397 {"dtpreldword", s_dtprel, 8},
5398 {"uleb128", s_riscv_leb128, 0},
5399 {"sleb128", s_riscv_leb128, 1},
5400 {"insn", s_riscv_insn, 0},
5401 {"attribute", s_riscv_attribute, 0},
5402 {"variant_cc", s_variant_cc, 0},
5403 {"float16", float_cons, 'h'},
5404
5405 { NULL, NULL, 0 },
5406 };
5407
5408 void
riscv_pop_insert(void)5409 riscv_pop_insert (void)
5410 {
5411 extern void pop_insert (const pseudo_typeS *);
5412
5413 pop_insert (riscv_pseudo_table);
5414 }
5415