]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gas/config/tc-riscv.c
RISC-V: Add RV32E support.
[thirdparty/binutils-gdb.git] / gas / config / tc-riscv.c
1 /* tc-riscv.c -- RISC-V assembler
2 Copyright (C) 2011-2018 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 #include "struc-symbol.h"
32
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 insn_t insn_opcode;
47
48 /* The frag that contains the instruction. */
49 struct frag *frag;
50
51 /* The offset into FRAG of the first instruction byte. */
52 long where;
53
54 /* The relocs associated with the instruction, if any. */
55 fixS *fixp;
56 };
57
58 #ifndef DEFAULT_ARCH
59 #define DEFAULT_ARCH "riscv64"
60 #endif
61
62 static const char default_arch[] = DEFAULT_ARCH;
63
64 static unsigned xlen = 0; /* width of an x-register */
65 static unsigned abi_xlen = 0; /* width of a pointer in the ABI */
66 static bfd_boolean rve_abi = FALSE;
67
68 #define LOAD_ADDRESS_INSN (abi_xlen == 64 ? "ld" : "lw")
69 #define ADD32_INSN (xlen == 64 ? "addiw" : "addi")
70
71 static unsigned elf_flags = 0;
72
73 /* This is the set of options which the .option pseudo-op may modify. */
74
75 struct riscv_set_options
76 {
77 int pic; /* Generate position-independent code. */
78 int rvc; /* Generate RVC code. */
79 int rve; /* Generate RVE code. */
80 int relax; /* Emit relocs the linker is allowed to relax. */
81 };
82
83 static struct riscv_set_options riscv_opts =
84 {
85 0, /* pic */
86 0, /* rvc */
87 0, /* rve */
88 1, /* relax */
89 };
90
91 static void
92 riscv_set_rvc (bfd_boolean rvc_value)
93 {
94 if (rvc_value)
95 elf_flags |= EF_RISCV_RVC;
96
97 riscv_opts.rvc = rvc_value;
98 }
99
100 static void
101 riscv_set_rve (bfd_boolean rve_value)
102 {
103 riscv_opts.rve = rve_value;
104 }
105
106 struct riscv_subset
107 {
108 const char *name;
109
110 struct riscv_subset *next;
111 };
112
113 static struct riscv_subset *riscv_subsets;
114
115 static bfd_boolean
116 riscv_subset_supports (const char *feature)
117 {
118 struct riscv_subset *s;
119 char *p;
120 unsigned xlen_required = strtoul (feature, &p, 10);
121
122 if (xlen_required && xlen != xlen_required)
123 return FALSE;
124
125 for (s = riscv_subsets; s != NULL; s = s->next)
126 if (strcasecmp (s->name, p) == 0)
127 return TRUE;
128
129 return FALSE;
130 }
131
132 static void
133 riscv_clear_subsets (void)
134 {
135 while (riscv_subsets != NULL)
136 {
137 struct riscv_subset *next = riscv_subsets->next;
138 free ((void *) riscv_subsets->name);
139 free (riscv_subsets);
140 riscv_subsets = next;
141 }
142 }
143
144 static void
145 riscv_add_subset (const char *subset)
146 {
147 struct riscv_subset *s = xmalloc (sizeof *s);
148
149 s->name = xstrdup (subset);
150 s->next = riscv_subsets;
151 riscv_subsets = s;
152 }
153
154 /* Set which ISA and extensions are available. */
155
156 static void
157 riscv_set_arch (const char *s)
158 {
159 const char *all_subsets = "imafdqc";
160 char *extension = NULL;
161 const char *p = s;
162
163 riscv_clear_subsets();
164
165 if (strncmp (p, "rv32", 4) == 0)
166 {
167 xlen = 32;
168 p += 4;
169 }
170 else if (strncmp (p, "rv64", 4) == 0)
171 {
172 xlen = 64;
173 p += 4;
174 }
175 else
176 as_fatal ("-march=%s: ISA string must begin with rv32 or rv64", s);
177
178 switch (*p)
179 {
180 case 'i':
181 break;
182
183 case 'e':
184 p++;
185 riscv_add_subset ("e");
186 riscv_add_subset ("i");
187
188 if (xlen > 32)
189 as_fatal ("-march=%s: rv%de is not a valid base ISA", s, xlen);
190
191 break;
192
193 case 'g':
194 p++;
195 for ( ; *all_subsets != 'q'; all_subsets++)
196 {
197 const char subset[] = {*all_subsets, '\0'};
198 riscv_add_subset (subset);
199 }
200 break;
201
202 default:
203 as_fatal ("-march=%s: first ISA subset must be `e', `i' or `g'", s);
204 }
205
206 while (*p)
207 {
208 if (*p == 'x')
209 {
210 char *subset = xstrdup (p);
211 char *q = subset;
212
213 while (*++q != '\0' && *q != '_')
214 ;
215 *q = '\0';
216
217 if (extension)
218 as_fatal ("-march=%s: only one non-standard extension is supported"
219 " (found `%s' and `%s')", s, extension, subset);
220 extension = subset;
221 riscv_add_subset (subset);
222 p += strlen (subset);
223 }
224 else if (*p == '_')
225 p++;
226 else if ((all_subsets = strchr (all_subsets, *p)) != NULL)
227 {
228 const char subset[] = {*p, 0};
229 riscv_add_subset (subset);
230 all_subsets++;
231 p++;
232 }
233 else
234 as_fatal ("-march=%s: unsupported ISA subset `%c'", s, *p);
235 }
236
237 if (riscv_subset_supports ("e") && riscv_subset_supports ("f"))
238 as_fatal ("-march=%s: rv32e does not support the `f' extension", s);
239
240 if (riscv_subset_supports ("d") && !riscv_subset_supports ("f"))
241 as_fatal ("-march=%s: `d' extension requires `f' extension", s);
242
243 if (riscv_subset_supports ("q") && !riscv_subset_supports ("d"))
244 as_fatal ("-march=%s: `q' extension requires `d' extension", s);
245
246 if (riscv_subset_supports ("q") && xlen < 64)
247 as_fatal ("-march=%s: rv32 does not support the `q' extension", s);
248
249 free (extension);
250 }
251
252 /* Handle of the OPCODE hash table. */
253 static struct hash_control *op_hash = NULL;
254
255 /* Handle of the type of .insn hash table. */
256 static struct hash_control *insn_type_hash = NULL;
257
258 /* This array holds the chars that always start a comment. If the
259 pre-processor is disabled, these aren't very useful */
260 const char comment_chars[] = "#";
261
262 /* This array holds the chars that only start a comment at the beginning of
263 a line. If the line seems to have the form '# 123 filename'
264 .line and .file directives will appear in the pre-processed output */
265 /* Note that input_file.c hand checks for '#' at the beginning of the
266 first line of the input file. This is because the compiler outputs
267 #NO_APP at the beginning of its output. */
268 /* Also note that C style comments are always supported. */
269 const char line_comment_chars[] = "#";
270
271 /* This array holds machine specific line separator characters. */
272 const char line_separator_chars[] = ";";
273
274 /* Chars that can be used to separate mant from exp in floating point nums */
275 const char EXP_CHARS[] = "eE";
276
277 /* Chars that mean this number is a floating point constant */
278 /* As in 0f12.456 */
279 /* or 0d1.2345e12 */
280 const char FLT_CHARS[] = "rRsSfFdDxXpP";
281
282 /* Macros for encoding relaxation state for RVC branches and far jumps. */
283 #define RELAX_BRANCH_ENCODE(uncond, rvc, length) \
284 ((relax_substateT) \
285 (0xc0000000 \
286 | ((uncond) ? 1 : 0) \
287 | ((rvc) ? 2 : 0) \
288 | ((length) << 2)))
289 #define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
290 #define RELAX_BRANCH_LENGTH(i) (((i) >> 2) & 0xF)
291 #define RELAX_BRANCH_RVC(i) (((i) & 2) != 0)
292 #define RELAX_BRANCH_UNCOND(i) (((i) & 1) != 0)
293
294 /* Is the given value a sign-extended 32-bit value? */
295 #define IS_SEXT_32BIT_NUM(x) \
296 (((x) &~ (offsetT) 0x7fffffff) == 0 \
297 || (((x) &~ (offsetT) 0x7fffffff) == ~ (offsetT) 0x7fffffff))
298
299 /* Is the given value a zero-extended 32-bit value? Or a negated one? */
300 #define IS_ZEXT_32BIT_NUM(x) \
301 (((x) &~ (offsetT) 0xffffffff) == 0 \
302 || (((x) &~ (offsetT) 0xffffffff) == ~ (offsetT) 0xffffffff))
303
304 /* Change INSN's opcode so that the operand given by FIELD has value VALUE.
305 INSN is a riscv_cl_insn structure and VALUE is evaluated exactly once. */
306 #define INSERT_OPERAND(FIELD, INSN, VALUE) \
307 INSERT_BITS ((INSN).insn_opcode, VALUE, OP_MASK_##FIELD, OP_SH_##FIELD)
308
309 /* Determine if an instruction matches an opcode. */
310 #define OPCODE_MATCHES(OPCODE, OP) \
311 (((OPCODE) & MASK_##OP) == MATCH_##OP)
312
313 static char *expr_end;
314
315 /* The default target format to use. */
316
317 const char *
318 riscv_target_format (void)
319 {
320 return xlen == 64 ? "elf64-littleriscv" : "elf32-littleriscv";
321 }
322
323 /* Return the length of instruction INSN. */
324
325 static inline unsigned int
326 insn_length (const struct riscv_cl_insn *insn)
327 {
328 return riscv_insn_length (insn->insn_opcode);
329 }
330
331 /* Initialise INSN from opcode entry MO. Leave its position unspecified. */
332
333 static void
334 create_insn (struct riscv_cl_insn *insn, const struct riscv_opcode *mo)
335 {
336 insn->insn_mo = mo;
337 insn->insn_opcode = mo->match;
338 insn->frag = NULL;
339 insn->where = 0;
340 insn->fixp = NULL;
341 }
342
343 /* Install INSN at the location specified by its "frag" and "where" fields. */
344
345 static void
346 install_insn (const struct riscv_cl_insn *insn)
347 {
348 char *f = insn->frag->fr_literal + insn->where;
349 md_number_to_chars (f, insn->insn_opcode, insn_length (insn));
350 }
351
352 /* Move INSN to offset WHERE in FRAG. Adjust the fixups accordingly
353 and install the opcode in the new location. */
354
355 static void
356 move_insn (struct riscv_cl_insn *insn, fragS *frag, long where)
357 {
358 insn->frag = frag;
359 insn->where = where;
360 if (insn->fixp != NULL)
361 {
362 insn->fixp->fx_frag = frag;
363 insn->fixp->fx_where = where;
364 }
365 install_insn (insn);
366 }
367
368 /* Add INSN to the end of the output. */
369
370 static void
371 add_fixed_insn (struct riscv_cl_insn *insn)
372 {
373 char *f = frag_more (insn_length (insn));
374 move_insn (insn, frag_now, f - frag_now->fr_literal);
375 }
376
377 static void
378 add_relaxed_insn (struct riscv_cl_insn *insn, int max_chars, int var,
379 relax_substateT subtype, symbolS *symbol, offsetT offset)
380 {
381 frag_grow (max_chars);
382 move_insn (insn, frag_now, frag_more (0) - frag_now->fr_literal);
383 frag_var (rs_machine_dependent, max_chars, var,
384 subtype, symbol, offset, NULL);
385 }
386
387 /* Compute the length of a branch sequence, and adjust the stored length
388 accordingly. If FRAGP is NULL, the worst-case length is returned. */
389
390 static unsigned
391 relaxed_branch_length (fragS *fragp, asection *sec, int update)
392 {
393 int jump, rvc, length = 8;
394
395 if (!fragp)
396 return length;
397
398 jump = RELAX_BRANCH_UNCOND (fragp->fr_subtype);
399 rvc = RELAX_BRANCH_RVC (fragp->fr_subtype);
400 length = RELAX_BRANCH_LENGTH (fragp->fr_subtype);
401
402 /* Assume jumps are in range; the linker will catch any that aren't. */
403 length = jump ? 4 : 8;
404
405 if (fragp->fr_symbol != NULL
406 && S_IS_DEFINED (fragp->fr_symbol)
407 && !S_IS_WEAK (fragp->fr_symbol)
408 && sec == S_GET_SEGMENT (fragp->fr_symbol))
409 {
410 offsetT val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
411 bfd_vma rvc_range = jump ? RVC_JUMP_REACH : RVC_BRANCH_REACH;
412 val -= fragp->fr_address + fragp->fr_fix;
413
414 if (rvc && (bfd_vma)(val + rvc_range/2) < rvc_range)
415 length = 2;
416 else if ((bfd_vma)(val + RISCV_BRANCH_REACH/2) < RISCV_BRANCH_REACH)
417 length = 4;
418 else if (!jump && rvc)
419 length = 6;
420 }
421
422 if (update)
423 fragp->fr_subtype = RELAX_BRANCH_ENCODE (jump, rvc, length);
424
425 return length;
426 }
427
428 /* Information about an opcode name, mnemonics and its value. */
429 struct opcode_name_t
430 {
431 const char *name;
432 unsigned int val;
433 };
434
435 /* List for all supported opcode name. */
436 static const struct opcode_name_t opcode_name_list[] =
437 {
438 {"C0", 0x0},
439 {"C1", 0x1},
440 {"C2", 0x2},
441
442 {"LOAD", 0x03},
443 {"LOAD_FP", 0x07},
444 {"CUSTOM_0", 0x0b},
445 {"MISC_MEM", 0x0f},
446 {"OP_IMM", 0x13},
447 {"AUIPC", 0x17},
448 {"OP_IMM_32", 0x1b},
449 /* 48b 0x1f. */
450
451 {"STORE", 0x23},
452 {"STORE_FP", 0x27},
453 {"CUSTOM_1", 0x2b},
454 {"AMO", 0x2f},
455 {"OP", 0x33},
456 {"LUI", 0x37},
457 {"OP_32", 0x3b},
458 /* 64b 0x3f. */
459
460 {"MADD", 0x43},
461 {"MSUB", 0x47},
462 {"NMADD", 0x4f},
463 {"NMSUB", 0x4b},
464 {"OP_FP", 0x53},
465 /*reserved 0x57. */
466 {"CUSTOM_2", 0x5b},
467 /* 48b 0x5f. */
468
469 {"BRANCH", 0x63},
470 {"JALR", 0x67},
471 /*reserved 0x5b. */
472 {"JAL", 0x6f},
473 {"SYSTEM", 0x73},
474 /*reserved 0x77. */
475 {"CUSTOM_3", 0x7b},
476 /* >80b 0x7f. */
477
478 {NULL, 0}
479 };
480
481 /* Hash table for lookup opcode name. */
482 static struct hash_control *opcode_names_hash = NULL;
483
484 /* Initialization for hash table of opcode name. */
485 static void
486 init_opcode_names_hash (void)
487 {
488 const char *retval;
489 const struct opcode_name_t *opcode;
490
491 for (opcode = &opcode_name_list[0]; opcode->name != NULL; ++opcode)
492 {
493 retval = hash_insert (opcode_names_hash, opcode->name, (void *)opcode);
494
495 if (retval != NULL)
496 as_fatal (_("internal error: can't hash `%s': %s"),
497 opcode->name, retval);
498 }
499 }
500
501 /* Find `s` is a valid opcode name or not,
502 return the opcode name info if found. */
503 static const struct opcode_name_t *
504 opcode_name_lookup (char **s)
505 {
506 char *e;
507 char save_c;
508 struct opcode_name_t *o;
509
510 /* Find end of name. */
511 e = *s;
512 if (is_name_beginner (*e))
513 ++e;
514 while (is_part_of_name (*e))
515 ++e;
516
517 /* Terminate name. */
518 save_c = *e;
519 *e = '\0';
520
521 o = (struct opcode_name_t *) hash_find (opcode_names_hash, *s);
522
523 /* Advance to next token if one was recognized. */
524 if (o)
525 *s = e;
526
527 *e = save_c;
528 expr_end = e;
529
530 return o;
531 }
532
533 struct regname
534 {
535 const char *name;
536 unsigned int num;
537 };
538
539 enum reg_class
540 {
541 RCLASS_GPR,
542 RCLASS_FPR,
543 RCLASS_CSR,
544 RCLASS_MAX
545 };
546
547 static struct hash_control *reg_names_hash = NULL;
548
549 #define ENCODE_REG_HASH(cls, n) \
550 ((void *)(uintptr_t)((n) * RCLASS_MAX + (cls) + 1))
551 #define DECODE_REG_CLASS(hash) (((uintptr_t)(hash) - 1) % RCLASS_MAX)
552 #define DECODE_REG_NUM(hash) (((uintptr_t)(hash) - 1) / RCLASS_MAX)
553
554 static void
555 hash_reg_name (enum reg_class class, const char *name, unsigned n)
556 {
557 void *hash = ENCODE_REG_HASH (class, n);
558 const char *retval = hash_insert (reg_names_hash, name, hash);
559
560 if (retval != NULL)
561 as_fatal (_("internal error: can't hash `%s': %s"), name, retval);
562 }
563
564 static void
565 hash_reg_names (enum reg_class class, const char * const names[], unsigned n)
566 {
567 unsigned i;
568
569 for (i = 0; i < n; i++)
570 hash_reg_name (class, names[i], i);
571 }
572
573 static unsigned int
574 reg_lookup_internal (const char *s, enum reg_class class)
575 {
576 struct regname *r = (struct regname *) hash_find (reg_names_hash, s);
577
578 if (r == NULL || DECODE_REG_CLASS (r) != class)
579 return -1;
580
581 if (riscv_opts.rve && class == RCLASS_GPR && DECODE_REG_NUM (r) > 15)
582 return -1;
583
584 return DECODE_REG_NUM (r);
585 }
586
587 static bfd_boolean
588 reg_lookup (char **s, enum reg_class class, unsigned int *regnop)
589 {
590 char *e;
591 char save_c;
592 int reg = -1;
593
594 /* Find end of name. */
595 e = *s;
596 if (is_name_beginner (*e))
597 ++e;
598 while (is_part_of_name (*e))
599 ++e;
600
601 /* Terminate name. */
602 save_c = *e;
603 *e = '\0';
604
605 /* Look for the register. Advance to next token if one was recognized. */
606 if ((reg = reg_lookup_internal (*s, class)) >= 0)
607 *s = e;
608
609 *e = save_c;
610 if (regnop)
611 *regnop = reg;
612 return reg >= 0;
613 }
614
615 static bfd_boolean
616 arg_lookup (char **s, const char *const *array, size_t size, unsigned *regnop)
617 {
618 const char *p = strchr (*s, ',');
619 size_t i, len = p ? (size_t)(p - *s) : strlen (*s);
620
621 for (i = 0; i < size; i++)
622 if (array[i] != NULL && strncmp (array[i], *s, len) == 0)
623 {
624 *regnop = i;
625 *s += len;
626 return TRUE;
627 }
628
629 return FALSE;
630 }
631
632 /* For consistency checking, verify that all bits are specified either
633 by the match/mask part of the instruction definition, or by the
634 operand list.
635
636 `length` could be 0, 4 or 8, 0 for auto detection. */
637 static bfd_boolean
638 validate_riscv_insn (const struct riscv_opcode *opc, int length)
639 {
640 const char *p = opc->args;
641 char c;
642 insn_t used_bits = opc->mask;
643 int insn_width;
644 insn_t required_bits;
645
646 if (length == 0)
647 insn_width = 8 * riscv_insn_length (opc->match);
648 else
649 insn_width = 8 * length;
650
651 required_bits = ~0ULL >> (64 - insn_width);
652
653 if ((used_bits & opc->match) != (opc->match & required_bits))
654 {
655 as_bad (_("internal: bad RISC-V opcode (mask error): %s %s"),
656 opc->name, opc->args);
657 return FALSE;
658 }
659
660 #define USE_BITS(mask,shift) (used_bits |= ((insn_t)(mask) << (shift)))
661 while (*p)
662 switch (c = *p++)
663 {
664 case 'C': /* RVC */
665 switch (c = *p++)
666 {
667 case 'a': used_bits |= ENCODE_RVC_J_IMM (-1U); break;
668 case 'c': break; /* RS1, constrained to equal sp */
669 case 'i': used_bits |= ENCODE_RVC_SIMM3(-1U); break;
670 case 'j': used_bits |= ENCODE_RVC_IMM (-1U); break;
671 case 'o': used_bits |= ENCODE_RVC_IMM (-1U); break;
672 case 'k': used_bits |= ENCODE_RVC_LW_IMM (-1U); break;
673 case 'l': used_bits |= ENCODE_RVC_LD_IMM (-1U); break;
674 case 'm': used_bits |= ENCODE_RVC_LWSP_IMM (-1U); break;
675 case 'n': used_bits |= ENCODE_RVC_LDSP_IMM (-1U); break;
676 case 'p': used_bits |= ENCODE_RVC_B_IMM (-1U); break;
677 case 's': USE_BITS (OP_MASK_CRS1S, OP_SH_CRS1S); break;
678 case 't': USE_BITS (OP_MASK_CRS2S, OP_SH_CRS2S); break;
679 case 'u': used_bits |= ENCODE_RVC_IMM (-1U); break;
680 case 'v': used_bits |= ENCODE_RVC_IMM (-1U); break;
681 case 'w': break; /* RS1S, constrained to equal RD */
682 case 'x': break; /* RS2S, constrained to equal RD */
683 case 'K': used_bits |= ENCODE_RVC_ADDI4SPN_IMM (-1U); break;
684 case 'L': used_bits |= ENCODE_RVC_ADDI16SP_IMM (-1U); break;
685 case 'M': used_bits |= ENCODE_RVC_SWSP_IMM (-1U); break;
686 case 'N': used_bits |= ENCODE_RVC_SDSP_IMM (-1U); break;
687 case 'U': break; /* RS1, constrained to equal RD */
688 case 'V': USE_BITS (OP_MASK_CRS2, OP_SH_CRS2); break;
689 case '<': used_bits |= ENCODE_RVC_IMM (-1U); break;
690 case '>': used_bits |= ENCODE_RVC_IMM (-1U); break;
691 case '8': used_bits |= ENCODE_RVC_UIMM8 (-1U); break;
692 case 'S': USE_BITS (OP_MASK_CRS1S, OP_SH_CRS1S); break;
693 case 'T': USE_BITS (OP_MASK_CRS2, OP_SH_CRS2); break;
694 case 'D': USE_BITS (OP_MASK_CRS2S, OP_SH_CRS2S); break;
695 case 'F': /* funct */
696 switch (c = *p++)
697 {
698 case '4': USE_BITS (OP_MASK_CFUNCT4, OP_SH_CFUNCT4); break;
699 case '3': USE_BITS (OP_MASK_CFUNCT3, OP_SH_CFUNCT3); break;
700 default:
701 as_bad (_("internal: bad RISC-V opcode"
702 " (unknown operand type `CF%c'): %s %s"),
703 c, opc->name, opc->args);
704 return FALSE;
705 }
706 break;
707 default:
708 as_bad (_("internal: bad RISC-V opcode (unknown operand type `C%c'): %s %s"),
709 c, opc->name, opc->args);
710 return FALSE;
711 }
712 break;
713 case ',': break;
714 case '(': break;
715 case ')': break;
716 case '<': USE_BITS (OP_MASK_SHAMTW, OP_SH_SHAMTW); break;
717 case '>': USE_BITS (OP_MASK_SHAMT, OP_SH_SHAMT); break;
718 case 'A': break;
719 case 'D': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
720 case 'Z': USE_BITS (OP_MASK_RS1, OP_SH_RS1); break;
721 case 'E': USE_BITS (OP_MASK_CSR, OP_SH_CSR); break;
722 case 'I': break;
723 case 'R': USE_BITS (OP_MASK_RS3, OP_SH_RS3); break;
724 case 'S': USE_BITS (OP_MASK_RS1, OP_SH_RS1); break;
725 case 'U': USE_BITS (OP_MASK_RS1, OP_SH_RS1); /* fallthru */
726 case 'T': USE_BITS (OP_MASK_RS2, OP_SH_RS2); break;
727 case 'd': USE_BITS (OP_MASK_RD, OP_SH_RD); break;
728 case 'm': USE_BITS (OP_MASK_RM, OP_SH_RM); break;
729 case 's': USE_BITS (OP_MASK_RS1, OP_SH_RS1); break;
730 case 't': USE_BITS (OP_MASK_RS2, OP_SH_RS2); break;
731 case 'r': USE_BITS (OP_MASK_RS3, OP_SH_RS3); break;
732 case 'P': USE_BITS (OP_MASK_PRED, OP_SH_PRED); break;
733 case 'Q': USE_BITS (OP_MASK_SUCC, OP_SH_SUCC); break;
734 case 'o':
735 case 'j': used_bits |= ENCODE_ITYPE_IMM (-1U); break;
736 case 'a': used_bits |= ENCODE_UJTYPE_IMM (-1U); break;
737 case 'p': used_bits |= ENCODE_SBTYPE_IMM (-1U); break;
738 case 'q': used_bits |= ENCODE_STYPE_IMM (-1U); break;
739 case 'u': used_bits |= ENCODE_UTYPE_IMM (-1U); break;
740 case 'z': break;
741 case '[': break;
742 case ']': break;
743 case '0': break;
744 case 'F': /* funct */
745 switch (c = *p++)
746 {
747 case '7': USE_BITS (OP_MASK_FUNCT7, OP_SH_FUNCT7); break;
748 case '3': USE_BITS (OP_MASK_FUNCT3, OP_SH_FUNCT3); break;
749 case '2': USE_BITS (OP_MASK_FUNCT2, OP_SH_FUNCT2); break;
750 default:
751 as_bad (_("internal: bad RISC-V opcode"
752 " (unknown operand type `F%c'): %s %s"),
753 c, opc->name, opc->args);
754 return FALSE;
755 }
756 break;
757 case 'O': /* opcode */
758 switch (c = *p++)
759 {
760 case '4': USE_BITS (OP_MASK_OP, OP_SH_OP); break;
761 case '2': USE_BITS (OP_MASK_OP2, OP_SH_OP2); break;
762 default:
763 as_bad (_("internal: bad RISC-V opcode"
764 " (unknown operand type `F%c'): %s %s"),
765 c, opc->name, opc->args);
766 return FALSE;
767 }
768 break;
769 default:
770 as_bad (_("internal: bad RISC-V opcode "
771 "(unknown operand type `%c'): %s %s"),
772 c, opc->name, opc->args);
773 return FALSE;
774 }
775 #undef USE_BITS
776 if (used_bits != required_bits)
777 {
778 as_bad (_("internal: bad RISC-V opcode (bits 0x%lx undefined): %s %s"),
779 ~(unsigned long)(used_bits & required_bits),
780 opc->name, opc->args);
781 return FALSE;
782 }
783 return TRUE;
784 }
785
786 struct percent_op_match
787 {
788 const char *str;
789 bfd_reloc_code_real_type reloc;
790 };
791
792 /* Common hash table initialization function for
793 instruction and .insn directive. */
794 static struct hash_control *
795 init_opcode_hash (const struct riscv_opcode *opcodes,
796 bfd_boolean insn_directive_p)
797 {
798 int i = 0;
799 int length;
800 struct hash_control *hash = hash_new ();
801 while (opcodes[i].name)
802 {
803 const char *name = opcodes[i].name;
804 const char *hash_error =
805 hash_insert (hash, name, (void *) &opcodes[i]);
806
807 if (hash_error)
808 {
809 fprintf (stderr, _("internal error: can't hash `%s': %s\n"),
810 opcodes[i].name, hash_error);
811 /* Probably a memory allocation problem? Give up now. */
812 as_fatal (_("Broken assembler. No assembly attempted."));
813 }
814
815 do
816 {
817 if (opcodes[i].pinfo != INSN_MACRO)
818 {
819 if (insn_directive_p)
820 length = ((name[0] == 'c') ? 2 : 4);
821 else
822 length = 0; /* Let assembler determine the length. */
823 if (!validate_riscv_insn (&opcodes[i], length))
824 as_fatal (_("Broken assembler. No assembly attempted."));
825 }
826 else
827 gas_assert (!insn_directive_p);
828 ++i;
829 }
830 while (opcodes[i].name && !strcmp (opcodes[i].name, name));
831 }
832
833 return hash;
834 }
835
836 /* This function is called once, at assembler startup time. It should set up
837 all the tables, etc. that the MD part of the assembler will need. */
838
839 void
840 md_begin (void)
841 {
842 unsigned long mach = xlen == 64 ? bfd_mach_riscv64 : bfd_mach_riscv32;
843
844 if (! bfd_set_arch_mach (stdoutput, bfd_arch_riscv, mach))
845 as_warn (_("Could not set architecture and machine"));
846
847 op_hash = init_opcode_hash (riscv_opcodes, FALSE);
848 insn_type_hash = init_opcode_hash (riscv_insn_types, TRUE);
849
850 reg_names_hash = hash_new ();
851 hash_reg_names (RCLASS_GPR, riscv_gpr_names_numeric, NGPR);
852 hash_reg_names (RCLASS_GPR, riscv_gpr_names_abi, NGPR);
853 hash_reg_names (RCLASS_FPR, riscv_fpr_names_numeric, NFPR);
854 hash_reg_names (RCLASS_FPR, riscv_fpr_names_abi, NFPR);
855
856 opcode_names_hash = hash_new ();
857 init_opcode_names_hash ();
858
859 #define DECLARE_CSR(name, num) hash_reg_name (RCLASS_CSR, #name, num);
860 #define DECLARE_CSR_ALIAS(name, num) DECLARE_CSR(name, num);
861 #include "opcode/riscv-opc.h"
862 #undef DECLARE_CSR
863
864 /* Set the default alignment for the text section. */
865 record_alignment (text_section, riscv_opts.rvc ? 1 : 2);
866 }
867
868 static insn_t
869 riscv_apply_const_reloc (bfd_reloc_code_real_type reloc_type, bfd_vma value)
870 {
871 switch (reloc_type)
872 {
873 case BFD_RELOC_32:
874 return value;
875
876 case BFD_RELOC_RISCV_HI20:
877 return ENCODE_UTYPE_IMM (RISCV_CONST_HIGH_PART (value));
878
879 case BFD_RELOC_RISCV_LO12_S:
880 return ENCODE_STYPE_IMM (value);
881
882 case BFD_RELOC_RISCV_LO12_I:
883 return ENCODE_ITYPE_IMM (value);
884
885 default:
886 abort ();
887 }
888 }
889
890 /* Output an instruction. IP is the instruction information.
891 ADDRESS_EXPR is an operand of the instruction to be used with
892 RELOC_TYPE. */
893
894 static void
895 append_insn (struct riscv_cl_insn *ip, expressionS *address_expr,
896 bfd_reloc_code_real_type reloc_type)
897 {
898 dwarf2_emit_insn (0);
899
900 if (reloc_type != BFD_RELOC_UNUSED)
901 {
902 reloc_howto_type *howto;
903
904 gas_assert (address_expr);
905 if (reloc_type == BFD_RELOC_12_PCREL
906 || reloc_type == BFD_RELOC_RISCV_JMP)
907 {
908 int j = reloc_type == BFD_RELOC_RISCV_JMP;
909 int best_case = riscv_insn_length (ip->insn_opcode);
910 unsigned worst_case = relaxed_branch_length (NULL, NULL, 0);
911 add_relaxed_insn (ip, worst_case, best_case,
912 RELAX_BRANCH_ENCODE (j, best_case == 2, worst_case),
913 address_expr->X_add_symbol,
914 address_expr->X_add_number);
915 return;
916 }
917 else
918 {
919 howto = bfd_reloc_type_lookup (stdoutput, reloc_type);
920 if (howto == NULL)
921 as_bad (_("Unsupported RISC-V relocation number %d"), reloc_type);
922
923 ip->fixp = fix_new_exp (ip->frag, ip->where,
924 bfd_get_reloc_size (howto),
925 address_expr, FALSE, reloc_type);
926
927 ip->fixp->fx_tcbit = riscv_opts.relax;
928 }
929 }
930
931 add_fixed_insn (ip);
932 install_insn (ip);
933
934 /* We need to start a new frag after any instruction that can be
935 optimized away or compressed by the linker during relaxation, to prevent
936 the assembler from computing static offsets across such an instruction.
937 This is necessary to get correct EH info. */
938 if (reloc_type == BFD_RELOC_RISCV_CALL
939 || reloc_type == BFD_RELOC_RISCV_CALL_PLT
940 || reloc_type == BFD_RELOC_RISCV_HI20
941 || reloc_type == BFD_RELOC_RISCV_PCREL_HI20
942 || reloc_type == BFD_RELOC_RISCV_TPREL_HI20
943 || reloc_type == BFD_RELOC_RISCV_TPREL_ADD)
944 {
945 frag_wane (frag_now);
946 frag_new (0);
947 }
948 }
949
950 /* Build an instruction created by a macro expansion. This is passed
951 a pointer to the count of instructions created so far, an
952 expression, the name of the instruction to build, an operand format
953 string, and corresponding arguments. */
954
955 static void
956 macro_build (expressionS *ep, const char *name, const char *fmt, ...)
957 {
958 const struct riscv_opcode *mo;
959 struct riscv_cl_insn insn;
960 bfd_reloc_code_real_type r;
961 va_list args;
962
963 va_start (args, fmt);
964
965 r = BFD_RELOC_UNUSED;
966 mo = (struct riscv_opcode *) hash_find (op_hash, name);
967 gas_assert (mo);
968
969 /* Find a non-RVC variant of the instruction. append_insn will compress
970 it if possible. */
971 while (riscv_insn_length (mo->match) < 4)
972 mo++;
973 gas_assert (strcmp (name, mo->name) == 0);
974
975 create_insn (&insn, mo);
976 for (;;)
977 {
978 switch (*fmt++)
979 {
980 case 'd':
981 INSERT_OPERAND (RD, insn, va_arg (args, int));
982 continue;
983
984 case 's':
985 INSERT_OPERAND (RS1, insn, va_arg (args, int));
986 continue;
987
988 case 't':
989 INSERT_OPERAND (RS2, insn, va_arg (args, int));
990 continue;
991
992 case '>':
993 INSERT_OPERAND (SHAMT, insn, va_arg (args, int));
994 continue;
995
996 case 'j':
997 case 'u':
998 case 'q':
999 gas_assert (ep != NULL);
1000 r = va_arg (args, int);
1001 continue;
1002
1003 case '\0':
1004 break;
1005 case ',':
1006 continue;
1007 default:
1008 as_fatal (_("internal error: invalid macro"));
1009 }
1010 break;
1011 }
1012 va_end (args);
1013 gas_assert (r == BFD_RELOC_UNUSED ? ep == NULL : ep != NULL);
1014
1015 append_insn (&insn, ep, r);
1016 }
1017
1018 /* Sign-extend 32-bit mode constants that have bit 31 set and all higher bits
1019 unset. */
1020 static void
1021 normalize_constant_expr (expressionS *ex)
1022 {
1023 if (xlen > 32)
1024 return;
1025 if ((ex->X_op == O_constant || ex->X_op == O_symbol)
1026 && IS_ZEXT_32BIT_NUM (ex->X_add_number))
1027 ex->X_add_number = (((ex->X_add_number & 0xffffffff) ^ 0x80000000)
1028 - 0x80000000);
1029 }
1030
1031 /* Fail if an expression EX is not a constant. IP is the instruction using EX.
1032 MAYBE_CSR is true if the symbol may be an unrecognized CSR name. */
1033
1034 static void
1035 check_absolute_expr (struct riscv_cl_insn *ip, expressionS *ex,
1036 bfd_boolean maybe_csr)
1037 {
1038 if (ex->X_op == O_big)
1039 as_bad (_("unsupported large constant"));
1040 else if (maybe_csr && ex->X_op == O_symbol)
1041 as_bad (_("unknown CSR `%s'"),
1042 S_GET_NAME (ex->X_add_symbol));
1043 else if (ex->X_op != O_constant)
1044 as_bad (_("Instruction %s requires absolute expression"),
1045 ip->insn_mo->name);
1046 normalize_constant_expr (ex);
1047 }
1048
1049 static symbolS *
1050 make_internal_label (void)
1051 {
1052 return (symbolS *) local_symbol_make (FAKE_LABEL_NAME, now_seg,
1053 (valueT) frag_now_fix (), frag_now);
1054 }
1055
1056 /* Load an entry from the GOT. */
1057 static void
1058 pcrel_access (int destreg, int tempreg, expressionS *ep,
1059 const char *lo_insn, const char *lo_pattern,
1060 bfd_reloc_code_real_type hi_reloc,
1061 bfd_reloc_code_real_type lo_reloc)
1062 {
1063 expressionS ep2;
1064 ep2.X_op = O_symbol;
1065 ep2.X_add_symbol = make_internal_label ();
1066 ep2.X_add_number = 0;
1067
1068 macro_build (ep, "auipc", "d,u", tempreg, hi_reloc);
1069 macro_build (&ep2, lo_insn, lo_pattern, destreg, tempreg, lo_reloc);
1070 }
1071
1072 static void
1073 pcrel_load (int destreg, int tempreg, expressionS *ep, const char *lo_insn,
1074 bfd_reloc_code_real_type hi_reloc,
1075 bfd_reloc_code_real_type lo_reloc)
1076 {
1077 pcrel_access (destreg, tempreg, ep, lo_insn, "d,s,j", hi_reloc, lo_reloc);
1078 }
1079
1080 static void
1081 pcrel_store (int srcreg, int tempreg, expressionS *ep, const char *lo_insn,
1082 bfd_reloc_code_real_type hi_reloc,
1083 bfd_reloc_code_real_type lo_reloc)
1084 {
1085 pcrel_access (srcreg, tempreg, ep, lo_insn, "t,s,q", hi_reloc, lo_reloc);
1086 }
1087
1088 /* PC-relative function call using AUIPC/JALR, relaxed to JAL. */
1089 static void
1090 riscv_call (int destreg, int tempreg, expressionS *ep,
1091 bfd_reloc_code_real_type reloc)
1092 {
1093 macro_build (ep, "auipc", "d,u", tempreg, reloc);
1094 macro_build (NULL, "jalr", "d,s", destreg, tempreg);
1095 }
1096
1097 /* Load an integer constant into a register. */
1098
1099 static void
1100 load_const (int reg, expressionS *ep)
1101 {
1102 int shift = RISCV_IMM_BITS;
1103 expressionS upper = *ep, lower = *ep;
1104 lower.X_add_number = (int32_t) ep->X_add_number << (32-shift) >> (32-shift);
1105 upper.X_add_number -= lower.X_add_number;
1106
1107 if (ep->X_op != O_constant)
1108 {
1109 as_bad (_("unsupported large constant"));
1110 return;
1111 }
1112
1113 if (xlen > 32 && !IS_SEXT_32BIT_NUM (ep->X_add_number))
1114 {
1115 /* Reduce to a signed 32-bit constant using SLLI and ADDI. */
1116 while (((upper.X_add_number >> shift) & 1) == 0)
1117 shift++;
1118
1119 upper.X_add_number = (int64_t) upper.X_add_number >> shift;
1120 load_const (reg, &upper);
1121
1122 macro_build (NULL, "slli", "d,s,>", reg, reg, shift);
1123 if (lower.X_add_number != 0)
1124 macro_build (&lower, "addi", "d,s,j", reg, reg, BFD_RELOC_RISCV_LO12_I);
1125 }
1126 else
1127 {
1128 /* Simply emit LUI and/or ADDI to build a 32-bit signed constant. */
1129 int hi_reg = 0;
1130
1131 if (upper.X_add_number != 0)
1132 {
1133 macro_build (ep, "lui", "d,u", reg, BFD_RELOC_RISCV_HI20);
1134 hi_reg = reg;
1135 }
1136
1137 if (lower.X_add_number != 0 || hi_reg == 0)
1138 macro_build (ep, ADD32_INSN, "d,s,j", reg, hi_reg,
1139 BFD_RELOC_RISCV_LO12_I);
1140 }
1141 }
1142
1143 /* Expand RISC-V assembly macros into one or more instructions. */
1144 static void
1145 macro (struct riscv_cl_insn *ip, expressionS *imm_expr,
1146 bfd_reloc_code_real_type *imm_reloc)
1147 {
1148 int rd = (ip->insn_opcode >> OP_SH_RD) & OP_MASK_RD;
1149 int rs1 = (ip->insn_opcode >> OP_SH_RS1) & OP_MASK_RS1;
1150 int rs2 = (ip->insn_opcode >> OP_SH_RS2) & OP_MASK_RS2;
1151 int mask = ip->insn_mo->mask;
1152
1153 switch (mask)
1154 {
1155 case M_LI:
1156 load_const (rd, imm_expr);
1157 break;
1158
1159 case M_LA:
1160 case M_LLA:
1161 /* Load the address of a symbol into a register. */
1162 if (!IS_SEXT_32BIT_NUM (imm_expr->X_add_number))
1163 as_bad (_("offset too large"));
1164
1165 if (imm_expr->X_op == O_constant)
1166 load_const (rd, imm_expr);
1167 else if (riscv_opts.pic && mask == M_LA) /* Global PIC symbol */
1168 pcrel_load (rd, rd, imm_expr, LOAD_ADDRESS_INSN,
1169 BFD_RELOC_RISCV_GOT_HI20, BFD_RELOC_RISCV_PCREL_LO12_I);
1170 else /* Local PIC symbol, or any non-PIC symbol */
1171 pcrel_load (rd, rd, imm_expr, "addi",
1172 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_I);
1173 break;
1174
1175 case M_LA_TLS_GD:
1176 pcrel_load (rd, rd, imm_expr, "addi",
1177 BFD_RELOC_RISCV_TLS_GD_HI20, BFD_RELOC_RISCV_PCREL_LO12_I);
1178 break;
1179
1180 case M_LA_TLS_IE:
1181 pcrel_load (rd, rd, imm_expr, LOAD_ADDRESS_INSN,
1182 BFD_RELOC_RISCV_TLS_GOT_HI20, BFD_RELOC_RISCV_PCREL_LO12_I);
1183 break;
1184
1185 case M_LB:
1186 pcrel_load (rd, rd, imm_expr, "lb",
1187 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_I);
1188 break;
1189
1190 case M_LBU:
1191 pcrel_load (rd, rd, imm_expr, "lbu",
1192 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_I);
1193 break;
1194
1195 case M_LH:
1196 pcrel_load (rd, rd, imm_expr, "lh",
1197 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_I);
1198 break;
1199
1200 case M_LHU:
1201 pcrel_load (rd, rd, imm_expr, "lhu",
1202 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_I);
1203 break;
1204
1205 case M_LW:
1206 pcrel_load (rd, rd, imm_expr, "lw",
1207 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_I);
1208 break;
1209
1210 case M_LWU:
1211 pcrel_load (rd, rd, imm_expr, "lwu",
1212 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_I);
1213 break;
1214
1215 case M_LD:
1216 pcrel_load (rd, rd, imm_expr, "ld",
1217 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_I);
1218 break;
1219
1220 case M_FLW:
1221 pcrel_load (rd, rs1, imm_expr, "flw",
1222 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_I);
1223 break;
1224
1225 case M_FLD:
1226 pcrel_load (rd, rs1, imm_expr, "fld",
1227 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_I);
1228 break;
1229
1230 case M_SB:
1231 pcrel_store (rs2, rs1, imm_expr, "sb",
1232 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_S);
1233 break;
1234
1235 case M_SH:
1236 pcrel_store (rs2, rs1, imm_expr, "sh",
1237 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_S);
1238 break;
1239
1240 case M_SW:
1241 pcrel_store (rs2, rs1, imm_expr, "sw",
1242 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_S);
1243 break;
1244
1245 case M_SD:
1246 pcrel_store (rs2, rs1, imm_expr, "sd",
1247 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_S);
1248 break;
1249
1250 case M_FSW:
1251 pcrel_store (rs2, rs1, imm_expr, "fsw",
1252 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_S);
1253 break;
1254
1255 case M_FSD:
1256 pcrel_store (rs2, rs1, imm_expr, "fsd",
1257 BFD_RELOC_RISCV_PCREL_HI20, BFD_RELOC_RISCV_PCREL_LO12_S);
1258 break;
1259
1260 case M_CALL:
1261 riscv_call (rd, rs1, imm_expr, *imm_reloc);
1262 break;
1263
1264 default:
1265 as_bad (_("Macro %s not implemented"), ip->insn_mo->name);
1266 break;
1267 }
1268 }
1269
1270 static const struct percent_op_match percent_op_utype[] =
1271 {
1272 {"%tprel_hi", BFD_RELOC_RISCV_TPREL_HI20},
1273 {"%pcrel_hi", BFD_RELOC_RISCV_PCREL_HI20},
1274 {"%tls_ie_pcrel_hi", BFD_RELOC_RISCV_TLS_GOT_HI20},
1275 {"%tls_gd_pcrel_hi", BFD_RELOC_RISCV_TLS_GD_HI20},
1276 {"%hi", BFD_RELOC_RISCV_HI20},
1277 {0, 0}
1278 };
1279
1280 static const struct percent_op_match percent_op_itype[] =
1281 {
1282 {"%lo", BFD_RELOC_RISCV_LO12_I},
1283 {"%tprel_lo", BFD_RELOC_RISCV_TPREL_LO12_I},
1284 {"%pcrel_lo", BFD_RELOC_RISCV_PCREL_LO12_I},
1285 {0, 0}
1286 };
1287
1288 static const struct percent_op_match percent_op_stype[] =
1289 {
1290 {"%lo", BFD_RELOC_RISCV_LO12_S},
1291 {"%tprel_lo", BFD_RELOC_RISCV_TPREL_LO12_S},
1292 {"%pcrel_lo", BFD_RELOC_RISCV_PCREL_LO12_S},
1293 {0, 0}
1294 };
1295
1296 static const struct percent_op_match percent_op_rtype[] =
1297 {
1298 {"%tprel_add", BFD_RELOC_RISCV_TPREL_ADD},
1299 {0, 0}
1300 };
1301
1302 /* Return true if *STR points to a relocation operator. When returning true,
1303 move *STR over the operator and store its relocation code in *RELOC.
1304 Leave both *STR and *RELOC alone when returning false. */
1305
1306 static bfd_boolean
1307 parse_relocation (char **str, bfd_reloc_code_real_type *reloc,
1308 const struct percent_op_match *percent_op)
1309 {
1310 for ( ; percent_op->str; percent_op++)
1311 if (strncasecmp (*str, percent_op->str, strlen (percent_op->str)) == 0)
1312 {
1313 int len = strlen (percent_op->str);
1314
1315 if (!ISSPACE ((*str)[len]) && (*str)[len] != '(')
1316 continue;
1317
1318 *str += strlen (percent_op->str);
1319 *reloc = percent_op->reloc;
1320
1321 /* Check whether the output BFD supports this relocation.
1322 If not, issue an error and fall back on something safe. */
1323 if (*reloc != BFD_RELOC_UNUSED
1324 && !bfd_reloc_type_lookup (stdoutput, *reloc))
1325 {
1326 as_bad ("relocation %s isn't supported by the current ABI",
1327 percent_op->str);
1328 *reloc = BFD_RELOC_UNUSED;
1329 }
1330 return TRUE;
1331 }
1332 return FALSE;
1333 }
1334
1335 static void
1336 my_getExpression (expressionS *ep, char *str)
1337 {
1338 char *save_in;
1339
1340 save_in = input_line_pointer;
1341 input_line_pointer = str;
1342 expression (ep);
1343 expr_end = input_line_pointer;
1344 input_line_pointer = save_in;
1345 }
1346
1347 /* Parse string STR as a 16-bit relocatable operand. Store the
1348 expression in *EP and the relocation, if any, in RELOC.
1349 Return the number of relocation operators used (0 or 1).
1350
1351 On exit, EXPR_END points to the first character after the expression. */
1352
1353 static size_t
1354 my_getSmallExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
1355 char *str, const struct percent_op_match *percent_op)
1356 {
1357 size_t reloc_index;
1358 unsigned crux_depth, str_depth, regno;
1359 char *crux;
1360
1361 /* First, check for integer registers. */
1362 if (reg_lookup (&str, RCLASS_GPR, &regno))
1363 {
1364 ep->X_op = O_register;
1365 ep->X_add_number = regno;
1366 return 0;
1367 }
1368
1369 /* Search for the start of the main expression.
1370 End the loop with CRUX pointing to the start
1371 of the main expression and with CRUX_DEPTH containing the number
1372 of open brackets at that point. */
1373 reloc_index = -1;
1374 str_depth = 0;
1375 do
1376 {
1377 reloc_index++;
1378 crux = str;
1379 crux_depth = str_depth;
1380
1381 /* Skip over whitespace and brackets, keeping count of the number
1382 of brackets. */
1383 while (*str == ' ' || *str == '\t' || *str == '(')
1384 if (*str++ == '(')
1385 str_depth++;
1386 }
1387 while (*str == '%'
1388 && reloc_index < 1
1389 && parse_relocation (&str, reloc, percent_op));
1390
1391 my_getExpression (ep, crux);
1392 str = expr_end;
1393
1394 /* Match every open bracket. */
1395 while (crux_depth > 0 && (*str == ')' || *str == ' ' || *str == '\t'))
1396 if (*str++ == ')')
1397 crux_depth--;
1398
1399 if (crux_depth > 0)
1400 as_bad ("unclosed '('");
1401
1402 expr_end = str;
1403
1404 return reloc_index;
1405 }
1406
1407 /* Parse opcode name, could be an mnemonics or number. */
1408 static size_t
1409 my_getOpcodeExpression (expressionS *ep, bfd_reloc_code_real_type *reloc,
1410 char *str, const struct percent_op_match *percent_op)
1411 {
1412 const struct opcode_name_t *o = opcode_name_lookup (&str);
1413
1414 if (o != NULL)
1415 {
1416 ep->X_op = O_constant;
1417 ep->X_add_number = o->val;
1418 return 0;
1419 }
1420
1421 return my_getSmallExpression (ep, reloc, str, percent_op);
1422 }
1423
1424 /* Detect and handle implicitly zero load-store offsets. For example,
1425 "lw t0, (t1)" is shorthand for "lw t0, 0(t1)". Return TRUE iff such
1426 an implicit offset was detected. */
1427
1428 static bfd_boolean
1429 riscv_handle_implicit_zero_offset (expressionS *ep, const char *s)
1430 {
1431 /* Check whether there is only a single bracketed expression left.
1432 If so, it must be the base register and the constant must be zero. */
1433 if (*s == '(' && strchr (s + 1, '(') == 0)
1434 {
1435 ep->X_op = O_constant;
1436 ep->X_add_number = 0;
1437 return TRUE;
1438 }
1439
1440 return FALSE;
1441 }
1442
1443 /* This routine assembles an instruction into its binary format. As a
1444 side effect, it sets the global variable imm_reloc to the type of
1445 relocation to do if one of the operands is an address expression. */
1446
1447 static const char *
1448 riscv_ip (char *str, struct riscv_cl_insn *ip, expressionS *imm_expr,
1449 bfd_reloc_code_real_type *imm_reloc, struct hash_control *hash)
1450 {
1451 char *s;
1452 const char *args;
1453 char c = 0;
1454 struct riscv_opcode *insn;
1455 char *argsStart;
1456 unsigned int regno;
1457 char save_c = 0;
1458 int argnum;
1459 const struct percent_op_match *p;
1460 const char *error = "unrecognized opcode";
1461
1462 /* Parse the name of the instruction. Terminate the string if whitespace
1463 is found so that hash_find only sees the name part of the string. */
1464 for (s = str; *s != '\0'; ++s)
1465 if (ISSPACE (*s))
1466 {
1467 save_c = *s;
1468 *s++ = '\0';
1469 break;
1470 }
1471
1472 insn = (struct riscv_opcode *) hash_find (hash, str);
1473
1474 argsStart = s;
1475 for ( ; insn && insn->name && strcmp (insn->name, str) == 0; insn++)
1476 {
1477 if (!riscv_subset_supports (insn->subset))
1478 continue;
1479
1480 create_insn (ip, insn);
1481 argnum = 1;
1482
1483 imm_expr->X_op = O_absent;
1484 *imm_reloc = BFD_RELOC_UNUSED;
1485 p = percent_op_itype;
1486
1487 for (args = insn->args;; ++args)
1488 {
1489 s += strspn (s, " \t");
1490 switch (*args)
1491 {
1492 case '\0': /* End of args. */
1493 if (insn->pinfo != INSN_MACRO)
1494 {
1495 if (!insn->match_func (insn, ip->insn_opcode))
1496 break;
1497
1498 /* For .insn, insn->match and insn->mask are 0. */
1499 if (riscv_insn_length ((insn->match == 0 && insn->mask == 0)
1500 ? ip->insn_opcode
1501 : insn->match) == 2
1502 && !riscv_opts.rvc)
1503 break;
1504 }
1505 if (*s != '\0')
1506 break;
1507 /* Successful assembly. */
1508 error = NULL;
1509 goto out;
1510
1511 case 'C': /* RVC */
1512 switch (*++args)
1513 {
1514 case 's': /* RS1 x8-x15 */
1515 if (!reg_lookup (&s, RCLASS_GPR, &regno)
1516 || !(regno >= 8 && regno <= 15))
1517 break;
1518 INSERT_OPERAND (CRS1S, *ip, regno % 8);
1519 continue;
1520 case 'w': /* RS1 x8-x15, constrained to equal RD x8-x15. */
1521 if (!reg_lookup (&s, RCLASS_GPR, &regno)
1522 || EXTRACT_OPERAND (CRS1S, ip->insn_opcode) + 8 != regno)
1523 break;
1524 continue;
1525 case 't': /* RS2 x8-x15 */
1526 if (!reg_lookup (&s, RCLASS_GPR, &regno)
1527 || !(regno >= 8 && regno <= 15))
1528 break;
1529 INSERT_OPERAND (CRS2S, *ip, regno % 8);
1530 continue;
1531 case 'x': /* RS2 x8-x15, constrained to equal RD x8-x15. */
1532 if (!reg_lookup (&s, RCLASS_GPR, &regno)
1533 || EXTRACT_OPERAND (CRS2S, ip->insn_opcode) + 8 != regno)
1534 break;
1535 continue;
1536 case 'U': /* RS1, constrained to equal RD. */
1537 if (!reg_lookup (&s, RCLASS_GPR, &regno)
1538 || EXTRACT_OPERAND (RD, ip->insn_opcode) != regno)
1539 break;
1540 continue;
1541 case 'V': /* RS2 */
1542 if (!reg_lookup (&s, RCLASS_GPR, &regno))
1543 break;
1544 INSERT_OPERAND (CRS2, *ip, regno);
1545 continue;
1546 case 'c': /* RS1, constrained to equal sp. */
1547 if (!reg_lookup (&s, RCLASS_GPR, &regno)
1548 || regno != X_SP)
1549 break;
1550 continue;
1551 case '>':
1552 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
1553 || imm_expr->X_op != O_constant
1554 || imm_expr->X_add_number <= 0
1555 || imm_expr->X_add_number >= 64)
1556 break;
1557 ip->insn_opcode |= ENCODE_RVC_IMM (imm_expr->X_add_number);
1558 rvc_imm_done:
1559 s = expr_end;
1560 imm_expr->X_op = O_absent;
1561 continue;
1562 case '<':
1563 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
1564 || imm_expr->X_op != O_constant
1565 || !VALID_RVC_IMM (imm_expr->X_add_number)
1566 || imm_expr->X_add_number <= 0
1567 || imm_expr->X_add_number >= 32)
1568 break;
1569 ip->insn_opcode |= ENCODE_RVC_IMM (imm_expr->X_add_number);
1570 goto rvc_imm_done;
1571 case '8':
1572 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
1573 || imm_expr->X_op != O_constant
1574 || !VALID_RVC_UIMM8 (imm_expr->X_add_number)
1575 || imm_expr->X_add_number < 0
1576 || imm_expr->X_add_number >= 256)
1577 break;
1578 ip->insn_opcode |= ENCODE_RVC_UIMM8 (imm_expr->X_add_number);
1579 goto rvc_imm_done;
1580 case 'i':
1581 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
1582 || imm_expr->X_op != O_constant
1583 || imm_expr->X_add_number == 0
1584 || !VALID_RVC_SIMM3 (imm_expr->X_add_number))
1585 break;
1586 ip->insn_opcode |= ENCODE_RVC_SIMM3 (imm_expr->X_add_number);
1587 goto rvc_imm_done;
1588 case 'j':
1589 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
1590 || imm_expr->X_op != O_constant
1591 || imm_expr->X_add_number == 0
1592 || !VALID_RVC_IMM (imm_expr->X_add_number))
1593 break;
1594 ip->insn_opcode |= ENCODE_RVC_IMM (imm_expr->X_add_number);
1595 goto rvc_imm_done;
1596 case 'k':
1597 if (riscv_handle_implicit_zero_offset (imm_expr, s))
1598 continue;
1599 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
1600 || imm_expr->X_op != O_constant
1601 || !VALID_RVC_LW_IMM (imm_expr->X_add_number))
1602 break;
1603 ip->insn_opcode |= ENCODE_RVC_LW_IMM (imm_expr->X_add_number);
1604 goto rvc_imm_done;
1605 case 'l':
1606 if (riscv_handle_implicit_zero_offset (imm_expr, s))
1607 continue;
1608 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
1609 || imm_expr->X_op != O_constant
1610 || !VALID_RVC_LD_IMM (imm_expr->X_add_number))
1611 break;
1612 ip->insn_opcode |= ENCODE_RVC_LD_IMM (imm_expr->X_add_number);
1613 goto rvc_imm_done;
1614 case 'm':
1615 if (riscv_handle_implicit_zero_offset (imm_expr, s))
1616 continue;
1617 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
1618 || imm_expr->X_op != O_constant
1619 || !VALID_RVC_LWSP_IMM (imm_expr->X_add_number))
1620 break;
1621 ip->insn_opcode |=
1622 ENCODE_RVC_LWSP_IMM (imm_expr->X_add_number);
1623 goto rvc_imm_done;
1624 case 'n':
1625 if (riscv_handle_implicit_zero_offset (imm_expr, s))
1626 continue;
1627 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
1628 || imm_expr->X_op != O_constant
1629 || !VALID_RVC_LDSP_IMM (imm_expr->X_add_number))
1630 break;
1631 ip->insn_opcode |=
1632 ENCODE_RVC_LDSP_IMM (imm_expr->X_add_number);
1633 goto rvc_imm_done;
1634 case 'o':
1635 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
1636 || imm_expr->X_op != O_constant
1637 /* C.addiw, c.li, and c.andi allow zero immediate.
1638 C.addi allows zero immediate as hint. Otherwise this
1639 is same as 'j'. */
1640 || !VALID_RVC_IMM (imm_expr->X_add_number))
1641 break;
1642 ip->insn_opcode |= ENCODE_RVC_IMM (imm_expr->X_add_number);
1643 goto rvc_imm_done;
1644 case 'K':
1645 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
1646 || imm_expr->X_op != O_constant
1647 || !VALID_RVC_ADDI4SPN_IMM (imm_expr->X_add_number)
1648 || imm_expr->X_add_number == 0)
1649 break;
1650 ip->insn_opcode |=
1651 ENCODE_RVC_ADDI4SPN_IMM (imm_expr->X_add_number);
1652 goto rvc_imm_done;
1653 case 'L':
1654 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
1655 || imm_expr->X_op != O_constant
1656 || !VALID_RVC_ADDI16SP_IMM (imm_expr->X_add_number)
1657 || imm_expr->X_add_number == 0)
1658 break;
1659 ip->insn_opcode |=
1660 ENCODE_RVC_ADDI16SP_IMM (imm_expr->X_add_number);
1661 goto rvc_imm_done;
1662 case 'M':
1663 if (riscv_handle_implicit_zero_offset (imm_expr, s))
1664 continue;
1665 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
1666 || imm_expr->X_op != O_constant
1667 || !VALID_RVC_SWSP_IMM (imm_expr->X_add_number))
1668 break;
1669 ip->insn_opcode |=
1670 ENCODE_RVC_SWSP_IMM (imm_expr->X_add_number);
1671 goto rvc_imm_done;
1672 case 'N':
1673 if (riscv_handle_implicit_zero_offset (imm_expr, s))
1674 continue;
1675 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
1676 || imm_expr->X_op != O_constant
1677 || !VALID_RVC_SDSP_IMM (imm_expr->X_add_number))
1678 break;
1679 ip->insn_opcode |=
1680 ENCODE_RVC_SDSP_IMM (imm_expr->X_add_number);
1681 goto rvc_imm_done;
1682 case 'u':
1683 p = percent_op_utype;
1684 if (my_getSmallExpression (imm_expr, imm_reloc, s, p))
1685 break;
1686 rvc_lui:
1687 if (imm_expr->X_op != O_constant
1688 || imm_expr->X_add_number <= 0
1689 || imm_expr->X_add_number >= RISCV_BIGIMM_REACH
1690 || (imm_expr->X_add_number >= RISCV_RVC_IMM_REACH / 2
1691 && (imm_expr->X_add_number <
1692 RISCV_BIGIMM_REACH - RISCV_RVC_IMM_REACH / 2)))
1693 break;
1694 ip->insn_opcode |= ENCODE_RVC_IMM (imm_expr->X_add_number);
1695 goto rvc_imm_done;
1696 case 'v':
1697 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
1698 || (imm_expr->X_add_number & (RISCV_IMM_REACH - 1))
1699 || ((int32_t)imm_expr->X_add_number
1700 != imm_expr->X_add_number))
1701 break;
1702 imm_expr->X_add_number =
1703 ((uint32_t) imm_expr->X_add_number) >> RISCV_IMM_BITS;
1704 goto rvc_lui;
1705 case 'p':
1706 goto branch;
1707 case 'a':
1708 goto jump;
1709 case 'S': /* Floating-point RS1 x8-x15. */
1710 if (!reg_lookup (&s, RCLASS_FPR, &regno)
1711 || !(regno >= 8 && regno <= 15))
1712 break;
1713 INSERT_OPERAND (CRS1S, *ip, regno % 8);
1714 continue;
1715 case 'D': /* Floating-point RS2 x8-x15. */
1716 if (!reg_lookup (&s, RCLASS_FPR, &regno)
1717 || !(regno >= 8 && regno <= 15))
1718 break;
1719 INSERT_OPERAND (CRS2S, *ip, regno % 8);
1720 continue;
1721 case 'T': /* Floating-point RS2. */
1722 if (!reg_lookup (&s, RCLASS_FPR, &regno))
1723 break;
1724 INSERT_OPERAND (CRS2, *ip, regno);
1725 continue;
1726 case 'F':
1727 switch (*++args)
1728 {
1729 case '4':
1730 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
1731 || imm_expr->X_op != O_constant
1732 || imm_expr->X_add_number < 0
1733 || imm_expr->X_add_number >= 16)
1734 {
1735 as_bad (_("bad value for funct4 field, "
1736 "value must be 0...15"));
1737 break;
1738 }
1739
1740 INSERT_OPERAND (CFUNCT4, *ip, imm_expr->X_add_number);
1741 imm_expr->X_op = O_absent;
1742 s = expr_end;
1743 continue;
1744 case '3':
1745 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
1746 || imm_expr->X_op != O_constant
1747 || imm_expr->X_add_number < 0
1748 || imm_expr->X_add_number >= 8)
1749 {
1750 as_bad (_("bad value for funct3 field, "
1751 "value must be 0...7"));
1752 break;
1753 }
1754 INSERT_OPERAND (CFUNCT3, *ip, imm_expr->X_add_number);
1755 imm_expr->X_op = O_absent;
1756 s = expr_end;
1757 continue;
1758 default:
1759 as_bad (_("bad compressed FUNCT field"
1760 " specifier 'CF%c'\n"),
1761 *args);
1762 }
1763 break;
1764
1765 default:
1766 as_bad (_("bad RVC field specifier 'C%c'\n"), *args);
1767 }
1768 break;
1769
1770 case ',':
1771 ++argnum;
1772 if (*s++ == *args)
1773 continue;
1774 s--;
1775 break;
1776
1777 case '(':
1778 case ')':
1779 case '[':
1780 case ']':
1781 if (*s++ == *args)
1782 continue;
1783 break;
1784
1785 case '<': /* Shift amount, 0 - 31. */
1786 my_getExpression (imm_expr, s);
1787 check_absolute_expr (ip, imm_expr, FALSE);
1788 if ((unsigned long) imm_expr->X_add_number > 31)
1789 as_bad (_("Improper shift amount (%lu)"),
1790 (unsigned long) imm_expr->X_add_number);
1791 INSERT_OPERAND (SHAMTW, *ip, imm_expr->X_add_number);
1792 imm_expr->X_op = O_absent;
1793 s = expr_end;
1794 continue;
1795
1796 case '>': /* Shift amount, 0 - (XLEN-1). */
1797 my_getExpression (imm_expr, s);
1798 check_absolute_expr (ip, imm_expr, FALSE);
1799 if ((unsigned long) imm_expr->X_add_number >= xlen)
1800 as_bad (_("Improper shift amount (%lu)"),
1801 (unsigned long) imm_expr->X_add_number);
1802 INSERT_OPERAND (SHAMT, *ip, imm_expr->X_add_number);
1803 imm_expr->X_op = O_absent;
1804 s = expr_end;
1805 continue;
1806
1807 case 'Z': /* CSRRxI immediate. */
1808 my_getExpression (imm_expr, s);
1809 check_absolute_expr (ip, imm_expr, FALSE);
1810 if ((unsigned long) imm_expr->X_add_number > 31)
1811 as_bad (_("Improper CSRxI immediate (%lu)"),
1812 (unsigned long) imm_expr->X_add_number);
1813 INSERT_OPERAND (RS1, *ip, imm_expr->X_add_number);
1814 imm_expr->X_op = O_absent;
1815 s = expr_end;
1816 continue;
1817
1818 case 'E': /* Control register. */
1819 if (reg_lookup (&s, RCLASS_CSR, &regno))
1820 INSERT_OPERAND (CSR, *ip, regno);
1821 else
1822 {
1823 my_getExpression (imm_expr, s);
1824 check_absolute_expr (ip, imm_expr, TRUE);
1825 if ((unsigned long) imm_expr->X_add_number > 0xfff)
1826 as_bad (_("Improper CSR address (%lu)"),
1827 (unsigned long) imm_expr->X_add_number);
1828 INSERT_OPERAND (CSR, *ip, imm_expr->X_add_number);
1829 imm_expr->X_op = O_absent;
1830 s = expr_end;
1831 }
1832 continue;
1833
1834 case 'm': /* Rounding mode. */
1835 if (arg_lookup (&s, riscv_rm, ARRAY_SIZE (riscv_rm), &regno))
1836 {
1837 INSERT_OPERAND (RM, *ip, regno);
1838 continue;
1839 }
1840 break;
1841
1842 case 'P':
1843 case 'Q': /* Fence predecessor/successor. */
1844 if (arg_lookup (&s, riscv_pred_succ, ARRAY_SIZE (riscv_pred_succ),
1845 &regno))
1846 {
1847 if (*args == 'P')
1848 INSERT_OPERAND (PRED, *ip, regno);
1849 else
1850 INSERT_OPERAND (SUCC, *ip, regno);
1851 continue;
1852 }
1853 break;
1854
1855 case 'd': /* Destination register. */
1856 case 's': /* Source register. */
1857 case 't': /* Target register. */
1858 case 'r': /* rs3. */
1859 if (reg_lookup (&s, RCLASS_GPR, &regno))
1860 {
1861 c = *args;
1862 if (*s == ' ')
1863 ++s;
1864
1865 /* Now that we have assembled one operand, we use the args
1866 string to figure out where it goes in the instruction. */
1867 switch (c)
1868 {
1869 case 's':
1870 INSERT_OPERAND (RS1, *ip, regno);
1871 break;
1872 case 'd':
1873 INSERT_OPERAND (RD, *ip, regno);
1874 break;
1875 case 't':
1876 INSERT_OPERAND (RS2, *ip, regno);
1877 break;
1878 case 'r':
1879 INSERT_OPERAND (RS3, *ip, regno);
1880 break;
1881 }
1882 continue;
1883 }
1884 break;
1885
1886 case 'D': /* Floating point rd. */
1887 case 'S': /* Floating point rs1. */
1888 case 'T': /* Floating point rs2. */
1889 case 'U': /* Floating point rs1 and rs2. */
1890 case 'R': /* Floating point rs3. */
1891 if (reg_lookup (&s, RCLASS_FPR, &regno))
1892 {
1893 c = *args;
1894 if (*s == ' ')
1895 ++s;
1896 switch (c)
1897 {
1898 case 'D':
1899 INSERT_OPERAND (RD, *ip, regno);
1900 break;
1901 case 'S':
1902 INSERT_OPERAND (RS1, *ip, regno);
1903 break;
1904 case 'U':
1905 INSERT_OPERAND (RS1, *ip, regno);
1906 /* fallthru */
1907 case 'T':
1908 INSERT_OPERAND (RS2, *ip, regno);
1909 break;
1910 case 'R':
1911 INSERT_OPERAND (RS3, *ip, regno);
1912 break;
1913 }
1914 continue;
1915 }
1916
1917 break;
1918
1919 case 'I':
1920 my_getExpression (imm_expr, s);
1921 if (imm_expr->X_op != O_big
1922 && imm_expr->X_op != O_constant)
1923 break;
1924 normalize_constant_expr (imm_expr);
1925 s = expr_end;
1926 continue;
1927
1928 case 'A':
1929 my_getExpression (imm_expr, s);
1930 normalize_constant_expr (imm_expr);
1931 /* The 'A' format specifier must be a symbol. */
1932 if (imm_expr->X_op != O_symbol)
1933 break;
1934 *imm_reloc = BFD_RELOC_32;
1935 s = expr_end;
1936 continue;
1937
1938 case 'j': /* Sign-extended immediate. */
1939 *imm_reloc = BFD_RELOC_RISCV_LO12_I;
1940 p = percent_op_itype;
1941 goto alu_op;
1942 case 'q': /* Store displacement. */
1943 p = percent_op_stype;
1944 *imm_reloc = BFD_RELOC_RISCV_LO12_S;
1945 goto load_store;
1946 case 'o': /* Load displacement. */
1947 p = percent_op_itype;
1948 *imm_reloc = BFD_RELOC_RISCV_LO12_I;
1949 goto load_store;
1950 case '0': /* AMO "displacement," which must be zero. */
1951 p = percent_op_rtype;
1952 *imm_reloc = BFD_RELOC_UNUSED;
1953 load_store:
1954 if (riscv_handle_implicit_zero_offset (imm_expr, s))
1955 continue;
1956 alu_op:
1957 /* If this value won't fit into a 16 bit offset, then go
1958 find a macro that will generate the 32 bit offset
1959 code pattern. */
1960 if (!my_getSmallExpression (imm_expr, imm_reloc, s, p))
1961 {
1962 normalize_constant_expr (imm_expr);
1963 if (imm_expr->X_op != O_constant
1964 || (*args == '0' && imm_expr->X_add_number != 0)
1965 || imm_expr->X_add_number >= (signed)RISCV_IMM_REACH/2
1966 || imm_expr->X_add_number < -(signed)RISCV_IMM_REACH/2)
1967 break;
1968 }
1969
1970 s = expr_end;
1971 continue;
1972
1973 case 'p': /* PC-relative offset. */
1974 branch:
1975 *imm_reloc = BFD_RELOC_12_PCREL;
1976 my_getExpression (imm_expr, s);
1977 s = expr_end;
1978 continue;
1979
1980 case 'u': /* Upper 20 bits. */
1981 p = percent_op_utype;
1982 if (!my_getSmallExpression (imm_expr, imm_reloc, s, p)
1983 && imm_expr->X_op == O_constant)
1984 {
1985 if (imm_expr->X_add_number < 0
1986 || imm_expr->X_add_number >= (signed)RISCV_BIGIMM_REACH)
1987 as_bad (_("lui expression not in range 0..1048575"));
1988
1989 *imm_reloc = BFD_RELOC_RISCV_HI20;
1990 imm_expr->X_add_number <<= RISCV_IMM_BITS;
1991 }
1992 s = expr_end;
1993 continue;
1994
1995 case 'a': /* 20-bit PC-relative offset. */
1996 jump:
1997 my_getExpression (imm_expr, s);
1998 s = expr_end;
1999 *imm_reloc = BFD_RELOC_RISCV_JMP;
2000 continue;
2001
2002 case 'c':
2003 my_getExpression (imm_expr, s);
2004 s = expr_end;
2005 if (strcmp (s, "@plt") == 0)
2006 {
2007 *imm_reloc = BFD_RELOC_RISCV_CALL_PLT;
2008 s += 4;
2009 }
2010 else
2011 *imm_reloc = BFD_RELOC_RISCV_CALL;
2012 continue;
2013 case 'O':
2014 switch (*++args)
2015 {
2016 case '4':
2017 if (my_getOpcodeExpression (imm_expr, imm_reloc, s, p)
2018 || imm_expr->X_op != O_constant
2019 || imm_expr->X_add_number < 0
2020 || imm_expr->X_add_number >= 128
2021 || (imm_expr->X_add_number & 0x3) != 3)
2022 {
2023 as_bad (_("bad value for opcode field, "
2024 "value must be 0...127 and "
2025 "lower 2 bits must be 0x3"));
2026 break;
2027 }
2028
2029 INSERT_OPERAND (OP, *ip, imm_expr->X_add_number);
2030 imm_expr->X_op = O_absent;
2031 s = expr_end;
2032 continue;
2033 case '2':
2034 if (my_getOpcodeExpression (imm_expr, imm_reloc, s, p)
2035 || imm_expr->X_op != O_constant
2036 || imm_expr->X_add_number < 0
2037 || imm_expr->X_add_number >= 3)
2038 {
2039 as_bad (_("bad value for opcode field, "
2040 "value must be 0...2"));
2041 break;
2042 }
2043
2044 INSERT_OPERAND (OP2, *ip, imm_expr->X_add_number);
2045 imm_expr->X_op = O_absent;
2046 s = expr_end;
2047 continue;
2048 default:
2049 as_bad (_("bad Opcode field specifier 'O%c'\n"), *args);
2050 }
2051 break;
2052
2053 case 'F':
2054 switch (*++args)
2055 {
2056 case '7':
2057 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
2058 || imm_expr->X_op != O_constant
2059 || imm_expr->X_add_number < 0
2060 || imm_expr->X_add_number >= 128)
2061 {
2062 as_bad (_("bad value for funct7 field, "
2063 "value must be 0...127"));
2064 break;
2065 }
2066
2067 INSERT_OPERAND (FUNCT7, *ip, imm_expr->X_add_number);
2068 imm_expr->X_op = O_absent;
2069 s = expr_end;
2070 continue;
2071 case '3':
2072 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
2073 || imm_expr->X_op != O_constant
2074 || imm_expr->X_add_number < 0
2075 || imm_expr->X_add_number >= 8)
2076 {
2077 as_bad (_("bad value for funct3 field, "
2078 "value must be 0...7"));
2079 break;
2080 }
2081
2082 INSERT_OPERAND (FUNCT3, *ip, imm_expr->X_add_number);
2083 imm_expr->X_op = O_absent;
2084 s = expr_end;
2085 continue;
2086 case '2':
2087 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
2088 || imm_expr->X_op != O_constant
2089 || imm_expr->X_add_number < 0
2090 || imm_expr->X_add_number >= 4)
2091 {
2092 as_bad (_("bad value for funct2 field, "
2093 "value must be 0...3"));
2094 break;
2095 }
2096
2097 INSERT_OPERAND (FUNCT2, *ip, imm_expr->X_add_number);
2098 imm_expr->X_op = O_absent;
2099 s = expr_end;
2100 continue;
2101
2102 default:
2103 as_bad (_("bad FUNCT field specifier 'F%c'\n"), *args);
2104 }
2105 break;
2106
2107 case 'z':
2108 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
2109 || imm_expr->X_op != O_constant
2110 || imm_expr->X_add_number != 0)
2111 break;
2112 s = expr_end;
2113 imm_expr->X_op = O_absent;
2114 continue;
2115
2116 default:
2117 as_fatal (_("internal error: bad argument type %c"), *args);
2118 }
2119 break;
2120 }
2121 s = argsStart;
2122 error = _("illegal operands");
2123 }
2124
2125 out:
2126 /* Restore the character we might have clobbered above. */
2127 if (save_c)
2128 *(argsStart - 1) = save_c;
2129
2130 return error;
2131 }
2132
2133 void
2134 md_assemble (char *str)
2135 {
2136 struct riscv_cl_insn insn;
2137 expressionS imm_expr;
2138 bfd_reloc_code_real_type imm_reloc = BFD_RELOC_UNUSED;
2139
2140 const char *error = riscv_ip (str, &insn, &imm_expr, &imm_reloc, op_hash);
2141
2142 if (error)
2143 {
2144 as_bad ("%s `%s'", error, str);
2145 return;
2146 }
2147
2148 if (insn.insn_mo->pinfo == INSN_MACRO)
2149 macro (&insn, &imm_expr, &imm_reloc);
2150 else
2151 append_insn (&insn, &imm_expr, imm_reloc);
2152 }
2153
2154 const char *
2155 md_atof (int type, char *litP, int *sizeP)
2156 {
2157 return ieee_md_atof (type, litP, sizeP, TARGET_BYTES_BIG_ENDIAN);
2158 }
2159
2160 void
2161 md_number_to_chars (char *buf, valueT val, int n)
2162 {
2163 number_to_chars_littleendian (buf, val, n);
2164 }
2165
2166 const char *md_shortopts = "O::g::G:";
2167
2168 enum options
2169 {
2170 OPTION_MARCH = OPTION_MD_BASE,
2171 OPTION_PIC,
2172 OPTION_NO_PIC,
2173 OPTION_MABI,
2174 OPTION_RELAX,
2175 OPTION_NO_RELAX,
2176 OPTION_END_OF_ENUM
2177 };
2178
2179 struct option md_longopts[] =
2180 {
2181 {"march", required_argument, NULL, OPTION_MARCH},
2182 {"fPIC", no_argument, NULL, OPTION_PIC},
2183 {"fpic", no_argument, NULL, OPTION_PIC},
2184 {"fno-pic", no_argument, NULL, OPTION_NO_PIC},
2185 {"mabi", required_argument, NULL, OPTION_MABI},
2186 {"mrelax", no_argument, NULL, OPTION_RELAX},
2187 {"mno-relax", no_argument, NULL, OPTION_NO_RELAX},
2188
2189 {NULL, no_argument, NULL, 0}
2190 };
2191 size_t md_longopts_size = sizeof (md_longopts);
2192
2193 enum float_abi {
2194 FLOAT_ABI_DEFAULT = -1,
2195 FLOAT_ABI_SOFT,
2196 FLOAT_ABI_SINGLE,
2197 FLOAT_ABI_DOUBLE,
2198 FLOAT_ABI_QUAD
2199 };
2200 static enum float_abi float_abi = FLOAT_ABI_DEFAULT;
2201
2202 static void
2203 riscv_set_abi (unsigned new_xlen, enum float_abi new_float_abi, bfd_boolean rve)
2204 {
2205 abi_xlen = new_xlen;
2206 float_abi = new_float_abi;
2207 rve_abi = rve;
2208 }
2209
2210 int
2211 md_parse_option (int c, const char *arg)
2212 {
2213 switch (c)
2214 {
2215 case OPTION_MARCH:
2216 riscv_set_arch (arg);
2217 break;
2218
2219 case OPTION_NO_PIC:
2220 riscv_opts.pic = FALSE;
2221 break;
2222
2223 case OPTION_PIC:
2224 riscv_opts.pic = TRUE;
2225 break;
2226
2227 case OPTION_MABI:
2228 if (strcmp (arg, "ilp32") == 0)
2229 riscv_set_abi (32, FLOAT_ABI_SOFT, FALSE);
2230 else if (strcmp (arg, "ilp32e") == 0)
2231 riscv_set_abi (32, FLOAT_ABI_SOFT, TRUE);
2232 else if (strcmp (arg, "ilp32f") == 0)
2233 riscv_set_abi (32, FLOAT_ABI_SINGLE, FALSE);
2234 else if (strcmp (arg, "ilp32d") == 0)
2235 riscv_set_abi (32, FLOAT_ABI_DOUBLE, FALSE);
2236 else if (strcmp (arg, "ilp32q") == 0)
2237 riscv_set_abi (32, FLOAT_ABI_QUAD, FALSE);
2238 else if (strcmp (arg, "lp64") == 0)
2239 riscv_set_abi (64, FLOAT_ABI_SOFT, FALSE);
2240 else if (strcmp (arg, "lp64f") == 0)
2241 riscv_set_abi (64, FLOAT_ABI_SINGLE, FALSE);
2242 else if (strcmp (arg, "lp64d") == 0)
2243 riscv_set_abi (64, FLOAT_ABI_DOUBLE, FALSE);
2244 else if (strcmp (arg, "lp64q") == 0)
2245 riscv_set_abi (64, FLOAT_ABI_QUAD, FALSE);
2246 else
2247 return 0;
2248 break;
2249
2250 case OPTION_RELAX:
2251 riscv_opts.relax = TRUE;
2252 break;
2253
2254 case OPTION_NO_RELAX:
2255 riscv_opts.relax = FALSE;
2256 break;
2257
2258 default:
2259 return 0;
2260 }
2261
2262 return 1;
2263 }
2264
2265 void
2266 riscv_after_parse_args (void)
2267 {
2268 if (xlen == 0)
2269 {
2270 if (strcmp (default_arch, "riscv32") == 0)
2271 xlen = 32;
2272 else if (strcmp (default_arch, "riscv64") == 0)
2273 xlen = 64;
2274 else
2275 as_bad ("unknown default architecture `%s'", default_arch);
2276 }
2277
2278 if (riscv_subsets == NULL)
2279 riscv_set_arch (xlen == 64 ? "rv64g" : "rv32g");
2280
2281 /* Add the RVC extension, regardless of -march, to support .option rvc. */
2282 riscv_set_rvc (FALSE);
2283 if (riscv_subset_supports ("c"))
2284 riscv_set_rvc (TRUE);
2285 else
2286 riscv_add_subset ("c");
2287
2288 /* Enable RVE if specified by the -march option. */
2289 riscv_set_rve (FALSE);
2290 if (riscv_subset_supports ("e"))
2291 riscv_set_rve (TRUE);
2292
2293 /* Infer ABI from ISA if not specified on command line. */
2294 if (abi_xlen == 0)
2295 abi_xlen = xlen;
2296 else if (abi_xlen > xlen)
2297 as_bad ("can't have %d-bit ABI on %d-bit ISA", abi_xlen, xlen);
2298 else if (abi_xlen < xlen)
2299 as_bad ("%d-bit ABI not yet supported on %d-bit ISA", abi_xlen, xlen);
2300
2301 if (float_abi == FLOAT_ABI_DEFAULT)
2302 {
2303 struct riscv_subset *subset;
2304
2305 /* Assume soft-float unless D extension is present. */
2306 float_abi = FLOAT_ABI_SOFT;
2307
2308 for (subset = riscv_subsets; subset != NULL; subset = subset->next)
2309 {
2310 if (strcasecmp (subset->name, "D") == 0)
2311 float_abi = FLOAT_ABI_DOUBLE;
2312 if (strcasecmp (subset->name, "Q") == 0)
2313 float_abi = FLOAT_ABI_QUAD;
2314 }
2315 }
2316
2317 if (rve_abi)
2318 elf_flags |= EF_RISCV_RVE;
2319
2320 /* Insert float_abi into the EF_RISCV_FLOAT_ABI field of elf_flags. */
2321 elf_flags |= float_abi * (EF_RISCV_FLOAT_ABI & ~(EF_RISCV_FLOAT_ABI << 1));
2322 }
2323
2324 long
2325 md_pcrel_from (fixS *fixP)
2326 {
2327 return fixP->fx_where + fixP->fx_frag->fr_address;
2328 }
2329
2330 /* Apply a fixup to the object file. */
2331
2332 void
2333 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
2334 {
2335 unsigned int subtype;
2336 bfd_byte *buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
2337 bfd_boolean relaxable = FALSE;
2338 offsetT loc;
2339 segT sub_segment;
2340
2341 /* Remember value for tc_gen_reloc. */
2342 fixP->fx_addnumber = *valP;
2343
2344 switch (fixP->fx_r_type)
2345 {
2346 case BFD_RELOC_RISCV_HI20:
2347 case BFD_RELOC_RISCV_LO12_I:
2348 case BFD_RELOC_RISCV_LO12_S:
2349 bfd_putl32 (riscv_apply_const_reloc (fixP->fx_r_type, *valP)
2350 | bfd_getl32 (buf), buf);
2351 if (fixP->fx_addsy == NULL)
2352 fixP->fx_done = TRUE;
2353 relaxable = TRUE;
2354 break;
2355
2356 case BFD_RELOC_RISCV_GOT_HI20:
2357 case BFD_RELOC_RISCV_ADD8:
2358 case BFD_RELOC_RISCV_ADD16:
2359 case BFD_RELOC_RISCV_ADD32:
2360 case BFD_RELOC_RISCV_ADD64:
2361 case BFD_RELOC_RISCV_SUB6:
2362 case BFD_RELOC_RISCV_SUB8:
2363 case BFD_RELOC_RISCV_SUB16:
2364 case BFD_RELOC_RISCV_SUB32:
2365 case BFD_RELOC_RISCV_SUB64:
2366 case BFD_RELOC_RISCV_RELAX:
2367 break;
2368
2369 case BFD_RELOC_RISCV_TPREL_HI20:
2370 case BFD_RELOC_RISCV_TPREL_LO12_I:
2371 case BFD_RELOC_RISCV_TPREL_LO12_S:
2372 case BFD_RELOC_RISCV_TPREL_ADD:
2373 relaxable = TRUE;
2374 /* Fall through. */
2375
2376 case BFD_RELOC_RISCV_TLS_GOT_HI20:
2377 case BFD_RELOC_RISCV_TLS_GD_HI20:
2378 case BFD_RELOC_RISCV_TLS_DTPREL32:
2379 case BFD_RELOC_RISCV_TLS_DTPREL64:
2380 if (fixP->fx_addsy != NULL)
2381 S_SET_THREAD_LOCAL (fixP->fx_addsy);
2382 else
2383 as_bad_where (fixP->fx_file, fixP->fx_line,
2384 _("TLS relocation against a constant"));
2385 break;
2386
2387 case BFD_RELOC_32:
2388 /* Use pc-relative relocation for FDE initial location.
2389 The symbol address in .eh_frame may be adjusted in
2390 _bfd_elf_discard_section_eh_frame, and the content of
2391 .eh_frame will be adjusted in _bfd_elf_write_section_eh_frame.
2392 Therefore, we cannot insert a relocation whose addend symbol is
2393 in .eh_frame. Othrewise, the value may be adjusted twice.*/
2394 if (fixP->fx_addsy && fixP->fx_subsy
2395 && (sub_segment = S_GET_SEGMENT (fixP->fx_subsy))
2396 && strcmp (sub_segment->name, ".eh_frame") == 0
2397 && S_GET_VALUE (fixP->fx_subsy)
2398 == fixP->fx_frag->fr_address + fixP->fx_where)
2399 {
2400 fixP->fx_r_type = BFD_RELOC_RISCV_32_PCREL;
2401 fixP->fx_subsy = NULL;
2402 break;
2403 }
2404 /* Fall through. */
2405 case BFD_RELOC_64:
2406 case BFD_RELOC_16:
2407 case BFD_RELOC_8:
2408 case BFD_RELOC_RISCV_CFA:
2409 if (fixP->fx_addsy && fixP->fx_subsy)
2410 {
2411 fixP->fx_next = xmemdup (fixP, sizeof (*fixP), sizeof (*fixP));
2412 fixP->fx_next->fx_addsy = fixP->fx_subsy;
2413 fixP->fx_next->fx_subsy = NULL;
2414 fixP->fx_next->fx_offset = 0;
2415 fixP->fx_subsy = NULL;
2416
2417 switch (fixP->fx_r_type)
2418 {
2419 case BFD_RELOC_64:
2420 fixP->fx_r_type = BFD_RELOC_RISCV_ADD64;
2421 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB64;
2422 break;
2423
2424 case BFD_RELOC_32:
2425 fixP->fx_r_type = BFD_RELOC_RISCV_ADD32;
2426 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB32;
2427 break;
2428
2429 case BFD_RELOC_16:
2430 fixP->fx_r_type = BFD_RELOC_RISCV_ADD16;
2431 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB16;
2432 break;
2433
2434 case BFD_RELOC_8:
2435 fixP->fx_r_type = BFD_RELOC_RISCV_ADD8;
2436 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB8;
2437 break;
2438
2439 case BFD_RELOC_RISCV_CFA:
2440 /* Load the byte to get the subtype. */
2441 subtype = bfd_get_8 (NULL, &((fragS *) (fixP->fx_frag->fr_opcode))->fr_literal[fixP->fx_where]);
2442 loc = fixP->fx_frag->fr_fix - (subtype & 7);
2443 switch (subtype)
2444 {
2445 case DW_CFA_advance_loc1:
2446 fixP->fx_where = loc + 1;
2447 fixP->fx_next->fx_where = loc + 1;
2448 fixP->fx_r_type = BFD_RELOC_RISCV_SET8;
2449 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB8;
2450 break;
2451
2452 case DW_CFA_advance_loc2:
2453 fixP->fx_size = 2;
2454 fixP->fx_next->fx_size = 2;
2455 fixP->fx_where = loc + 1;
2456 fixP->fx_next->fx_where = loc + 1;
2457 fixP->fx_r_type = BFD_RELOC_RISCV_SET16;
2458 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB16;
2459 break;
2460
2461 case DW_CFA_advance_loc4:
2462 fixP->fx_size = 4;
2463 fixP->fx_next->fx_size = 4;
2464 fixP->fx_where = loc;
2465 fixP->fx_next->fx_where = loc;
2466 fixP->fx_r_type = BFD_RELOC_RISCV_SET32;
2467 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB32;
2468 break;
2469
2470 default:
2471 if (subtype < 0x80 && (subtype & 0x40))
2472 {
2473 /* DW_CFA_advance_loc */
2474 fixP->fx_frag = (fragS *) fixP->fx_frag->fr_opcode;
2475 fixP->fx_next->fx_frag = fixP->fx_frag;
2476 fixP->fx_r_type = BFD_RELOC_RISCV_SET6;
2477 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB6;
2478 }
2479 else
2480 as_fatal (_("internal error: bad CFA value #%d"), subtype);
2481 break;
2482 }
2483 break;
2484
2485 default:
2486 /* This case is unreachable. */
2487 abort ();
2488 }
2489 }
2490 /* Fall through. */
2491
2492 case BFD_RELOC_RVA:
2493 /* If we are deleting this reloc entry, we must fill in the
2494 value now. This can happen if we have a .word which is not
2495 resolved when it appears but is later defined. */
2496 if (fixP->fx_addsy == NULL)
2497 {
2498 gas_assert (fixP->fx_size <= sizeof (valueT));
2499 md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
2500 fixP->fx_done = 1;
2501 }
2502 break;
2503
2504 case BFD_RELOC_RISCV_JMP:
2505 if (fixP->fx_addsy)
2506 {
2507 /* Fill in a tentative value to improve objdump readability. */
2508 bfd_vma target = S_GET_VALUE (fixP->fx_addsy) + *valP;
2509 bfd_vma delta = target - md_pcrel_from (fixP);
2510 bfd_putl32 (bfd_getl32 (buf) | ENCODE_UJTYPE_IMM (delta), buf);
2511 }
2512 break;
2513
2514 case BFD_RELOC_12_PCREL:
2515 if (fixP->fx_addsy)
2516 {
2517 /* Fill in a tentative value to improve objdump readability. */
2518 bfd_vma target = S_GET_VALUE (fixP->fx_addsy) + *valP;
2519 bfd_vma delta = target - md_pcrel_from (fixP);
2520 bfd_putl32 (bfd_getl32 (buf) | ENCODE_SBTYPE_IMM (delta), buf);
2521 }
2522 break;
2523
2524 case BFD_RELOC_RISCV_RVC_BRANCH:
2525 if (fixP->fx_addsy)
2526 {
2527 /* Fill in a tentative value to improve objdump readability. */
2528 bfd_vma target = S_GET_VALUE (fixP->fx_addsy) + *valP;
2529 bfd_vma delta = target - md_pcrel_from (fixP);
2530 bfd_putl16 (bfd_getl16 (buf) | ENCODE_RVC_B_IMM (delta), buf);
2531 }
2532 break;
2533
2534 case BFD_RELOC_RISCV_RVC_JUMP:
2535 if (fixP->fx_addsy)
2536 {
2537 /* Fill in a tentative value to improve objdump readability. */
2538 bfd_vma target = S_GET_VALUE (fixP->fx_addsy) + *valP;
2539 bfd_vma delta = target - md_pcrel_from (fixP);
2540 bfd_putl16 (bfd_getl16 (buf) | ENCODE_RVC_J_IMM (delta), buf);
2541 }
2542 break;
2543
2544 case BFD_RELOC_RISCV_CALL:
2545 case BFD_RELOC_RISCV_CALL_PLT:
2546 relaxable = TRUE;
2547 break;
2548
2549 case BFD_RELOC_RISCV_PCREL_HI20:
2550 case BFD_RELOC_RISCV_PCREL_LO12_S:
2551 case BFD_RELOC_RISCV_PCREL_LO12_I:
2552 relaxable = riscv_opts.relax;
2553 break;
2554
2555 case BFD_RELOC_RISCV_ALIGN:
2556 break;
2557
2558 default:
2559 /* We ignore generic BFD relocations we don't know about. */
2560 if (bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type) != NULL)
2561 as_fatal (_("internal error: bad relocation #%d"), fixP->fx_r_type);
2562 }
2563
2564 if (fixP->fx_subsy != NULL)
2565 as_bad_where (fixP->fx_file, fixP->fx_line,
2566 _("unsupported symbol subtraction"));
2567
2568 /* Add an R_RISCV_RELAX reloc if the reloc is relaxable. */
2569 if (relaxable && fixP->fx_tcbit && fixP->fx_addsy != NULL)
2570 {
2571 fixP->fx_next = xmemdup (fixP, sizeof (*fixP), sizeof (*fixP));
2572 fixP->fx_next->fx_addsy = fixP->fx_next->fx_subsy = NULL;
2573 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_RELAX;
2574 }
2575 }
2576
2577 /* Because the value of .cfi_remember_state may changed after relaxation,
2578 we insert a fix to relocate it again in link-time. */
2579
2580 void
2581 riscv_pre_output_hook (void)
2582 {
2583 const frchainS *frch;
2584 const asection *s;
2585
2586 for (s = stdoutput->sections; s; s = s->next)
2587 for (frch = seg_info (s)->frchainP; frch; frch = frch->frch_next)
2588 {
2589 fragS *frag;
2590
2591 for (frag = frch->frch_root; frag; frag = frag->fr_next)
2592 {
2593 if (frag->fr_type == rs_cfa)
2594 {
2595 expressionS exp;
2596
2597 symbolS *add_symbol = frag->fr_symbol->sy_value.X_add_symbol;
2598 symbolS *op_symbol = frag->fr_symbol->sy_value.X_op_symbol;
2599
2600 exp.X_op = O_subtract;
2601 exp.X_add_symbol = add_symbol;
2602 exp.X_add_number = 0;
2603 exp.X_op_symbol = op_symbol;
2604
2605 fix_new_exp (frag, (int) frag->fr_offset, 1, &exp, 0,
2606 BFD_RELOC_RISCV_CFA);
2607 }
2608 }
2609 }
2610 }
2611
2612
2613 /* This structure is used to hold a stack of .option values. */
2614
2615 struct riscv_option_stack
2616 {
2617 struct riscv_option_stack *next;
2618 struct riscv_set_options options;
2619 };
2620
2621 static struct riscv_option_stack *riscv_opts_stack;
2622
2623 /* Handle the .option pseudo-op. */
2624
2625 static void
2626 s_riscv_option (int x ATTRIBUTE_UNUSED)
2627 {
2628 char *name = input_line_pointer, ch;
2629
2630 while (!is_end_of_line[(unsigned char) *input_line_pointer])
2631 ++input_line_pointer;
2632 ch = *input_line_pointer;
2633 *input_line_pointer = '\0';
2634
2635 if (strcmp (name, "rvc") == 0)
2636 riscv_set_rvc (TRUE);
2637 else if (strcmp (name, "norvc") == 0)
2638 riscv_set_rvc (FALSE);
2639 else if (strcmp (name, "pic") == 0)
2640 riscv_opts.pic = TRUE;
2641 else if (strcmp (name, "nopic") == 0)
2642 riscv_opts.pic = FALSE;
2643 else if (strcmp (name, "relax") == 0)
2644 riscv_opts.relax = TRUE;
2645 else if (strcmp (name, "norelax") == 0)
2646 riscv_opts.relax = FALSE;
2647 else if (strcmp (name, "push") == 0)
2648 {
2649 struct riscv_option_stack *s;
2650
2651 s = (struct riscv_option_stack *) xmalloc (sizeof *s);
2652 s->next = riscv_opts_stack;
2653 s->options = riscv_opts;
2654 riscv_opts_stack = s;
2655 }
2656 else if (strcmp (name, "pop") == 0)
2657 {
2658 struct riscv_option_stack *s;
2659
2660 s = riscv_opts_stack;
2661 if (s == NULL)
2662 as_bad (_(".option pop with no .option push"));
2663 else
2664 {
2665 riscv_opts = s->options;
2666 riscv_opts_stack = s->next;
2667 free (s);
2668 }
2669 }
2670 else
2671 {
2672 as_warn (_("Unrecognized .option directive: %s\n"), name);
2673 }
2674 *input_line_pointer = ch;
2675 demand_empty_rest_of_line ();
2676 }
2677
2678 /* Handle the .dtprelword and .dtpreldword pseudo-ops. They generate
2679 a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
2680 use in DWARF debug information. */
2681
2682 static void
2683 s_dtprel (int bytes)
2684 {
2685 expressionS ex;
2686 char *p;
2687
2688 expression (&ex);
2689
2690 if (ex.X_op != O_symbol)
2691 {
2692 as_bad (_("Unsupported use of %s"), (bytes == 8
2693 ? ".dtpreldword"
2694 : ".dtprelword"));
2695 ignore_rest_of_line ();
2696 }
2697
2698 p = frag_more (bytes);
2699 md_number_to_chars (p, 0, bytes);
2700 fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
2701 (bytes == 8
2702 ? BFD_RELOC_RISCV_TLS_DTPREL64
2703 : BFD_RELOC_RISCV_TLS_DTPREL32));
2704
2705 demand_empty_rest_of_line ();
2706 }
2707
2708 /* Handle the .bss pseudo-op. */
2709
2710 static void
2711 s_bss (int ignore ATTRIBUTE_UNUSED)
2712 {
2713 subseg_set (bss_section, 0);
2714 demand_empty_rest_of_line ();
2715 }
2716
2717 static void
2718 riscv_make_nops (char *buf, bfd_vma bytes)
2719 {
2720 bfd_vma i = 0;
2721
2722 /* RISC-V instructions cannot begin or end on odd addresses, so this case
2723 means we are not within a valid instruction sequence. It is thus safe
2724 to use a zero byte, even though that is not a valid instruction. */
2725 if (bytes % 2 == 1)
2726 buf[i++] = 0;
2727
2728 /* Use at most one 2-byte NOP. */
2729 if ((bytes - i) % 4 == 2)
2730 {
2731 md_number_to_chars (buf + i, RVC_NOP, 2);
2732 i += 2;
2733 }
2734
2735 /* Fill the remainder with 4-byte NOPs. */
2736 for ( ; i < bytes; i += 4)
2737 md_number_to_chars (buf + i, RISCV_NOP, 4);
2738 }
2739
2740 /* Called from md_do_align. Used to create an alignment frag in a
2741 code section by emitting a worst-case NOP sequence that the linker
2742 will later relax to the correct number of NOPs. We can't compute
2743 the correct alignment now because of other linker relaxations. */
2744
2745 bfd_boolean
2746 riscv_frag_align_code (int n)
2747 {
2748 bfd_vma bytes = (bfd_vma) 1 << n;
2749 bfd_vma insn_alignment = riscv_opts.rvc ? 2 : 4;
2750 bfd_vma worst_case_bytes = bytes - insn_alignment;
2751 char *nops;
2752 expressionS ex;
2753
2754 /* If we are moving to a smaller alignment than the instruction size, then no
2755 alignment is required. */
2756 if (bytes <= insn_alignment)
2757 return TRUE;
2758
2759 nops = frag_more (worst_case_bytes);
2760
2761 /* When not relaxing, riscv_handle_align handles code alignment. */
2762 if (!riscv_opts.relax)
2763 return FALSE;
2764
2765 ex.X_op = O_constant;
2766 ex.X_add_number = worst_case_bytes;
2767
2768 riscv_make_nops (nops, worst_case_bytes);
2769
2770 fix_new_exp (frag_now, nops - frag_now->fr_literal, 0,
2771 &ex, FALSE, BFD_RELOC_RISCV_ALIGN);
2772
2773 return TRUE;
2774 }
2775
2776 /* Implement HANDLE_ALIGN. */
2777
2778 void
2779 riscv_handle_align (fragS *fragP)
2780 {
2781 switch (fragP->fr_type)
2782 {
2783 case rs_align_code:
2784 /* When relaxing, riscv_frag_align_code handles code alignment. */
2785 if (!riscv_opts.relax)
2786 {
2787 bfd_signed_vma count = fragP->fr_next->fr_address
2788 - fragP->fr_address - fragP->fr_fix;
2789
2790 if (count <= 0)
2791 break;
2792
2793 count &= MAX_MEM_FOR_RS_ALIGN_CODE;
2794 riscv_make_nops (fragP->fr_literal + fragP->fr_fix, count);
2795 fragP->fr_var = count;
2796 }
2797 break;
2798
2799 default:
2800 break;
2801 }
2802 }
2803
2804 int
2805 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
2806 {
2807 return (fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE));
2808 }
2809
2810 /* Translate internal representation of relocation info to BFD target
2811 format. */
2812
2813 arelent *
2814 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
2815 {
2816 arelent *reloc = (arelent *) xmalloc (sizeof (arelent));
2817
2818 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2819 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2820 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2821 reloc->addend = fixp->fx_addnumber;
2822
2823 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
2824 if (reloc->howto == NULL)
2825 {
2826 if ((fixp->fx_r_type == BFD_RELOC_16 || fixp->fx_r_type == BFD_RELOC_8)
2827 && fixp->fx_addsy != NULL && fixp->fx_subsy != NULL)
2828 {
2829 /* We don't have R_RISCV_8/16, but for this special case,
2830 we can use R_RISCV_ADD8/16 with R_RISCV_SUB8/16. */
2831 return reloc;
2832 }
2833
2834 as_bad_where (fixp->fx_file, fixp->fx_line,
2835 _("cannot represent %s relocation in object file"),
2836 bfd_get_reloc_code_name (fixp->fx_r_type));
2837 return NULL;
2838 }
2839
2840 return reloc;
2841 }
2842
2843 int
2844 riscv_relax_frag (asection *sec, fragS *fragp, long stretch ATTRIBUTE_UNUSED)
2845 {
2846 if (RELAX_BRANCH_P (fragp->fr_subtype))
2847 {
2848 offsetT old_var = fragp->fr_var;
2849 fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
2850 return fragp->fr_var - old_var;
2851 }
2852
2853 return 0;
2854 }
2855
2856 /* Expand far branches to multi-instruction sequences. */
2857
2858 static void
2859 md_convert_frag_branch (fragS *fragp)
2860 {
2861 bfd_byte *buf;
2862 expressionS exp;
2863 fixS *fixp;
2864 insn_t insn;
2865 int rs1, reloc;
2866
2867 buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
2868
2869 exp.X_op = O_symbol;
2870 exp.X_add_symbol = fragp->fr_symbol;
2871 exp.X_add_number = fragp->fr_offset;
2872
2873 gas_assert (fragp->fr_var == RELAX_BRANCH_LENGTH (fragp->fr_subtype));
2874
2875 if (RELAX_BRANCH_RVC (fragp->fr_subtype))
2876 {
2877 switch (RELAX_BRANCH_LENGTH (fragp->fr_subtype))
2878 {
2879 case 8:
2880 case 4:
2881 /* Expand the RVC branch into a RISC-V one. */
2882 insn = bfd_getl16 (buf);
2883 rs1 = 8 + ((insn >> OP_SH_CRS1S) & OP_MASK_CRS1S);
2884 if ((insn & MASK_C_J) == MATCH_C_J)
2885 insn = MATCH_JAL;
2886 else if ((insn & MASK_C_JAL) == MATCH_C_JAL)
2887 insn = MATCH_JAL | (X_RA << OP_SH_RD);
2888 else if ((insn & MASK_C_BEQZ) == MATCH_C_BEQZ)
2889 insn = MATCH_BEQ | (rs1 << OP_SH_RS1);
2890 else if ((insn & MASK_C_BNEZ) == MATCH_C_BNEZ)
2891 insn = MATCH_BNE | (rs1 << OP_SH_RS1);
2892 else
2893 abort ();
2894 bfd_putl32 (insn, buf);
2895 break;
2896
2897 case 6:
2898 /* Invert the branch condition. Branch over the jump. */
2899 insn = bfd_getl16 (buf);
2900 insn ^= MATCH_C_BEQZ ^ MATCH_C_BNEZ;
2901 insn |= ENCODE_RVC_B_IMM (6);
2902 bfd_putl16 (insn, buf);
2903 buf += 2;
2904 goto jump;
2905
2906 case 2:
2907 /* Just keep the RVC branch. */
2908 reloc = RELAX_BRANCH_UNCOND (fragp->fr_subtype)
2909 ? BFD_RELOC_RISCV_RVC_JUMP : BFD_RELOC_RISCV_RVC_BRANCH;
2910 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
2911 2, &exp, FALSE, reloc);
2912 buf += 2;
2913 goto done;
2914
2915 default:
2916 abort ();
2917 }
2918 }
2919
2920 switch (RELAX_BRANCH_LENGTH (fragp->fr_subtype))
2921 {
2922 case 8:
2923 gas_assert (!RELAX_BRANCH_UNCOND (fragp->fr_subtype));
2924
2925 /* Invert the branch condition. Branch over the jump. */
2926 insn = bfd_getl32 (buf);
2927 insn ^= MATCH_BEQ ^ MATCH_BNE;
2928 insn |= ENCODE_SBTYPE_IMM (8);
2929 md_number_to_chars ((char *) buf, insn, 4);
2930 buf += 4;
2931
2932 jump:
2933 /* Jump to the target. */
2934 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
2935 4, &exp, FALSE, BFD_RELOC_RISCV_JMP);
2936 md_number_to_chars ((char *) buf, MATCH_JAL, 4);
2937 buf += 4;
2938 break;
2939
2940 case 4:
2941 reloc = RELAX_BRANCH_UNCOND (fragp->fr_subtype)
2942 ? BFD_RELOC_RISCV_JMP : BFD_RELOC_12_PCREL;
2943 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
2944 4, &exp, FALSE, reloc);
2945 buf += 4;
2946 break;
2947
2948 default:
2949 abort ();
2950 }
2951
2952 done:
2953 fixp->fx_file = fragp->fr_file;
2954 fixp->fx_line = fragp->fr_line;
2955
2956 gas_assert (buf == (bfd_byte *)fragp->fr_literal
2957 + fragp->fr_fix + fragp->fr_var);
2958
2959 fragp->fr_fix += fragp->fr_var;
2960 }
2961
2962 /* Relax a machine dependent frag. This returns the amount by which
2963 the current size of the frag should change. */
2964
2965 void
2966 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec ATTRIBUTE_UNUSED,
2967 fragS *fragp)
2968 {
2969 gas_assert (RELAX_BRANCH_P (fragp->fr_subtype));
2970 md_convert_frag_branch (fragp);
2971 }
2972
2973 void
2974 md_show_usage (FILE *stream)
2975 {
2976 fprintf (stream, _("\
2977 RISC-V options:\n\
2978 -fpic generate position-independent code\n\
2979 -fno-pic don't generate position-independent code (default)\n\
2980 -march=ISA set the RISC-V architecture\n\
2981 -mabi=ABI set the RISC-V ABI\n\
2982 -mrelax enable relax (default)\n\
2983 -mno-relax disable relax\n\
2984 "));
2985 }
2986
2987 /* Standard calling conventions leave the CFA at SP on entry. */
2988 void
2989 riscv_cfi_frame_initial_instructions (void)
2990 {
2991 cfi_add_CFA_def_cfa_register (X_SP);
2992 }
2993
2994 int
2995 tc_riscv_regname_to_dw2regnum (char *regname)
2996 {
2997 int reg;
2998
2999 if ((reg = reg_lookup_internal (regname, RCLASS_GPR)) >= 0)
3000 return reg;
3001
3002 if ((reg = reg_lookup_internal (regname, RCLASS_FPR)) >= 0)
3003 return reg + 32;
3004
3005 as_bad (_("unknown register `%s'"), regname);
3006 return -1;
3007 }
3008
3009 void
3010 riscv_elf_final_processing (void)
3011 {
3012 elf_elfheader (stdoutput)->e_flags |= elf_flags;
3013 }
3014
3015 /* Parse the .sleb128 and .uleb128 pseudos. Only allow constant expressions,
3016 since these directives break relaxation when used with symbol deltas. */
3017
3018 static void
3019 s_riscv_leb128 (int sign)
3020 {
3021 expressionS exp;
3022 char *save_in = input_line_pointer;
3023
3024 expression (&exp);
3025 if (exp.X_op != O_constant)
3026 as_bad (_("non-constant .%cleb128 is not supported"), sign ? 's' : 'u');
3027 demand_empty_rest_of_line ();
3028
3029 input_line_pointer = save_in;
3030 return s_leb128 (sign);
3031 }
3032
3033 /* Parse the .insn directive. */
3034
3035 static void
3036 s_riscv_insn (int x ATTRIBUTE_UNUSED)
3037 {
3038 char *str = input_line_pointer;
3039 struct riscv_cl_insn insn;
3040 expressionS imm_expr;
3041 bfd_reloc_code_real_type imm_reloc = BFD_RELOC_UNUSED;
3042 char save_c;
3043
3044 while (!is_end_of_line[(unsigned char) *input_line_pointer])
3045 ++input_line_pointer;
3046
3047 save_c = *input_line_pointer;
3048 *input_line_pointer = '\0';
3049
3050 const char *error = riscv_ip (str, &insn, &imm_expr,
3051 &imm_reloc, insn_type_hash);
3052
3053 if (error)
3054 {
3055 as_bad ("%s `%s'", error, str);
3056 }
3057 else
3058 {
3059 gas_assert (insn.insn_mo->pinfo != INSN_MACRO);
3060 append_insn (&insn, &imm_expr, imm_reloc);
3061 }
3062
3063 *input_line_pointer = save_c;
3064 demand_empty_rest_of_line ();
3065 }
3066
3067 /* Pseudo-op table. */
3068
3069 static const pseudo_typeS riscv_pseudo_table[] =
3070 {
3071 /* RISC-V-specific pseudo-ops. */
3072 {"option", s_riscv_option, 0},
3073 {"half", cons, 2},
3074 {"word", cons, 4},
3075 {"dword", cons, 8},
3076 {"dtprelword", s_dtprel, 4},
3077 {"dtpreldword", s_dtprel, 8},
3078 {"bss", s_bss, 0},
3079 {"uleb128", s_riscv_leb128, 0},
3080 {"sleb128", s_riscv_leb128, 1},
3081 {"insn", s_riscv_insn, 0},
3082
3083 { NULL, NULL, 0 },
3084 };
3085
3086 void
3087 riscv_pop_insert (void)
3088 {
3089 extern void pop_insert (const pseudo_typeS *);
3090
3091 pop_insert (riscv_pseudo_table);
3092 }