bdec30741b298826944c6b908ff5b8b2c8ed0a1a
[deliverable/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 'B':
1939 my_getExpression (imm_expr, s);
1940 normalize_constant_expr (imm_expr);
1941 /* The 'B' format specifier must be a symbol or a constant. */
1942 if (imm_expr->X_op != O_symbol && imm_expr->X_op != O_constant)
1943 break;
1944 if (imm_expr->X_op == O_symbol)
1945 *imm_reloc = BFD_RELOC_32;
1946 s = expr_end;
1947 continue;
1948
1949 case 'j': /* Sign-extended immediate. */
1950 *imm_reloc = BFD_RELOC_RISCV_LO12_I;
1951 p = percent_op_itype;
1952 goto alu_op;
1953 case 'q': /* Store displacement. */
1954 p = percent_op_stype;
1955 *imm_reloc = BFD_RELOC_RISCV_LO12_S;
1956 goto load_store;
1957 case 'o': /* Load displacement. */
1958 p = percent_op_itype;
1959 *imm_reloc = BFD_RELOC_RISCV_LO12_I;
1960 goto load_store;
1961 case '0': /* AMO "displacement," which must be zero. */
1962 p = percent_op_rtype;
1963 *imm_reloc = BFD_RELOC_UNUSED;
1964 load_store:
1965 if (riscv_handle_implicit_zero_offset (imm_expr, s))
1966 continue;
1967 alu_op:
1968 /* If this value won't fit into a 16 bit offset, then go
1969 find a macro that will generate the 32 bit offset
1970 code pattern. */
1971 if (!my_getSmallExpression (imm_expr, imm_reloc, s, p))
1972 {
1973 normalize_constant_expr (imm_expr);
1974 if (imm_expr->X_op != O_constant
1975 || (*args == '0' && imm_expr->X_add_number != 0)
1976 || imm_expr->X_add_number >= (signed)RISCV_IMM_REACH/2
1977 || imm_expr->X_add_number < -(signed)RISCV_IMM_REACH/2)
1978 break;
1979 }
1980
1981 s = expr_end;
1982 continue;
1983
1984 case 'p': /* PC-relative offset. */
1985 branch:
1986 *imm_reloc = BFD_RELOC_12_PCREL;
1987 my_getExpression (imm_expr, s);
1988 s = expr_end;
1989 continue;
1990
1991 case 'u': /* Upper 20 bits. */
1992 p = percent_op_utype;
1993 if (!my_getSmallExpression (imm_expr, imm_reloc, s, p)
1994 && imm_expr->X_op == O_constant)
1995 {
1996 if (imm_expr->X_add_number < 0
1997 || imm_expr->X_add_number >= (signed)RISCV_BIGIMM_REACH)
1998 as_bad (_("lui expression not in range 0..1048575"));
1999
2000 *imm_reloc = BFD_RELOC_RISCV_HI20;
2001 imm_expr->X_add_number <<= RISCV_IMM_BITS;
2002 }
2003 s = expr_end;
2004 continue;
2005
2006 case 'a': /* 20-bit PC-relative offset. */
2007 jump:
2008 my_getExpression (imm_expr, s);
2009 s = expr_end;
2010 *imm_reloc = BFD_RELOC_RISCV_JMP;
2011 continue;
2012
2013 case 'c':
2014 my_getExpression (imm_expr, s);
2015 s = expr_end;
2016 if (strcmp (s, "@plt") == 0)
2017 {
2018 *imm_reloc = BFD_RELOC_RISCV_CALL_PLT;
2019 s += 4;
2020 }
2021 else
2022 *imm_reloc = BFD_RELOC_RISCV_CALL;
2023 continue;
2024 case 'O':
2025 switch (*++args)
2026 {
2027 case '4':
2028 if (my_getOpcodeExpression (imm_expr, imm_reloc, s, p)
2029 || imm_expr->X_op != O_constant
2030 || imm_expr->X_add_number < 0
2031 || imm_expr->X_add_number >= 128
2032 || (imm_expr->X_add_number & 0x3) != 3)
2033 {
2034 as_bad (_("bad value for opcode field, "
2035 "value must be 0...127 and "
2036 "lower 2 bits must be 0x3"));
2037 break;
2038 }
2039
2040 INSERT_OPERAND (OP, *ip, imm_expr->X_add_number);
2041 imm_expr->X_op = O_absent;
2042 s = expr_end;
2043 continue;
2044 case '2':
2045 if (my_getOpcodeExpression (imm_expr, imm_reloc, s, p)
2046 || imm_expr->X_op != O_constant
2047 || imm_expr->X_add_number < 0
2048 || imm_expr->X_add_number >= 3)
2049 {
2050 as_bad (_("bad value for opcode field, "
2051 "value must be 0...2"));
2052 break;
2053 }
2054
2055 INSERT_OPERAND (OP2, *ip, imm_expr->X_add_number);
2056 imm_expr->X_op = O_absent;
2057 s = expr_end;
2058 continue;
2059 default:
2060 as_bad (_("bad Opcode field specifier 'O%c'\n"), *args);
2061 }
2062 break;
2063
2064 case 'F':
2065 switch (*++args)
2066 {
2067 case '7':
2068 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
2069 || imm_expr->X_op != O_constant
2070 || imm_expr->X_add_number < 0
2071 || imm_expr->X_add_number >= 128)
2072 {
2073 as_bad (_("bad value for funct7 field, "
2074 "value must be 0...127"));
2075 break;
2076 }
2077
2078 INSERT_OPERAND (FUNCT7, *ip, imm_expr->X_add_number);
2079 imm_expr->X_op = O_absent;
2080 s = expr_end;
2081 continue;
2082 case '3':
2083 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
2084 || imm_expr->X_op != O_constant
2085 || imm_expr->X_add_number < 0
2086 || imm_expr->X_add_number >= 8)
2087 {
2088 as_bad (_("bad value for funct3 field, "
2089 "value must be 0...7"));
2090 break;
2091 }
2092
2093 INSERT_OPERAND (FUNCT3, *ip, imm_expr->X_add_number);
2094 imm_expr->X_op = O_absent;
2095 s = expr_end;
2096 continue;
2097 case '2':
2098 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
2099 || imm_expr->X_op != O_constant
2100 || imm_expr->X_add_number < 0
2101 || imm_expr->X_add_number >= 4)
2102 {
2103 as_bad (_("bad value for funct2 field, "
2104 "value must be 0...3"));
2105 break;
2106 }
2107
2108 INSERT_OPERAND (FUNCT2, *ip, imm_expr->X_add_number);
2109 imm_expr->X_op = O_absent;
2110 s = expr_end;
2111 continue;
2112
2113 default:
2114 as_bad (_("bad FUNCT field specifier 'F%c'\n"), *args);
2115 }
2116 break;
2117
2118 case 'z':
2119 if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
2120 || imm_expr->X_op != O_constant
2121 || imm_expr->X_add_number != 0)
2122 break;
2123 s = expr_end;
2124 imm_expr->X_op = O_absent;
2125 continue;
2126
2127 default:
2128 as_fatal (_("internal error: bad argument type %c"), *args);
2129 }
2130 break;
2131 }
2132 s = argsStart;
2133 error = _("illegal operands");
2134 }
2135
2136 out:
2137 /* Restore the character we might have clobbered above. */
2138 if (save_c)
2139 *(argsStart - 1) = save_c;
2140
2141 return error;
2142 }
2143
2144 void
2145 md_assemble (char *str)
2146 {
2147 struct riscv_cl_insn insn;
2148 expressionS imm_expr;
2149 bfd_reloc_code_real_type imm_reloc = BFD_RELOC_UNUSED;
2150
2151 const char *error = riscv_ip (str, &insn, &imm_expr, &imm_reloc, op_hash);
2152
2153 if (error)
2154 {
2155 as_bad ("%s `%s'", error, str);
2156 return;
2157 }
2158
2159 if (insn.insn_mo->pinfo == INSN_MACRO)
2160 macro (&insn, &imm_expr, &imm_reloc);
2161 else
2162 append_insn (&insn, &imm_expr, imm_reloc);
2163 }
2164
2165 const char *
2166 md_atof (int type, char *litP, int *sizeP)
2167 {
2168 return ieee_md_atof (type, litP, sizeP, TARGET_BYTES_BIG_ENDIAN);
2169 }
2170
2171 void
2172 md_number_to_chars (char *buf, valueT val, int n)
2173 {
2174 number_to_chars_littleendian (buf, val, n);
2175 }
2176
2177 const char *md_shortopts = "O::g::G:";
2178
2179 enum options
2180 {
2181 OPTION_MARCH = OPTION_MD_BASE,
2182 OPTION_PIC,
2183 OPTION_NO_PIC,
2184 OPTION_MABI,
2185 OPTION_RELAX,
2186 OPTION_NO_RELAX,
2187 OPTION_END_OF_ENUM
2188 };
2189
2190 struct option md_longopts[] =
2191 {
2192 {"march", required_argument, NULL, OPTION_MARCH},
2193 {"fPIC", no_argument, NULL, OPTION_PIC},
2194 {"fpic", no_argument, NULL, OPTION_PIC},
2195 {"fno-pic", no_argument, NULL, OPTION_NO_PIC},
2196 {"mabi", required_argument, NULL, OPTION_MABI},
2197 {"mrelax", no_argument, NULL, OPTION_RELAX},
2198 {"mno-relax", no_argument, NULL, OPTION_NO_RELAX},
2199
2200 {NULL, no_argument, NULL, 0}
2201 };
2202 size_t md_longopts_size = sizeof (md_longopts);
2203
2204 enum float_abi {
2205 FLOAT_ABI_DEFAULT = -1,
2206 FLOAT_ABI_SOFT,
2207 FLOAT_ABI_SINGLE,
2208 FLOAT_ABI_DOUBLE,
2209 FLOAT_ABI_QUAD
2210 };
2211 static enum float_abi float_abi = FLOAT_ABI_DEFAULT;
2212
2213 static void
2214 riscv_set_abi (unsigned new_xlen, enum float_abi new_float_abi, bfd_boolean rve)
2215 {
2216 abi_xlen = new_xlen;
2217 float_abi = new_float_abi;
2218 rve_abi = rve;
2219 }
2220
2221 int
2222 md_parse_option (int c, const char *arg)
2223 {
2224 switch (c)
2225 {
2226 case OPTION_MARCH:
2227 riscv_set_arch (arg);
2228 break;
2229
2230 case OPTION_NO_PIC:
2231 riscv_opts.pic = FALSE;
2232 break;
2233
2234 case OPTION_PIC:
2235 riscv_opts.pic = TRUE;
2236 break;
2237
2238 case OPTION_MABI:
2239 if (strcmp (arg, "ilp32") == 0)
2240 riscv_set_abi (32, FLOAT_ABI_SOFT, FALSE);
2241 else if (strcmp (arg, "ilp32e") == 0)
2242 riscv_set_abi (32, FLOAT_ABI_SOFT, TRUE);
2243 else if (strcmp (arg, "ilp32f") == 0)
2244 riscv_set_abi (32, FLOAT_ABI_SINGLE, FALSE);
2245 else if (strcmp (arg, "ilp32d") == 0)
2246 riscv_set_abi (32, FLOAT_ABI_DOUBLE, FALSE);
2247 else if (strcmp (arg, "ilp32q") == 0)
2248 riscv_set_abi (32, FLOAT_ABI_QUAD, FALSE);
2249 else if (strcmp (arg, "lp64") == 0)
2250 riscv_set_abi (64, FLOAT_ABI_SOFT, FALSE);
2251 else if (strcmp (arg, "lp64f") == 0)
2252 riscv_set_abi (64, FLOAT_ABI_SINGLE, FALSE);
2253 else if (strcmp (arg, "lp64d") == 0)
2254 riscv_set_abi (64, FLOAT_ABI_DOUBLE, FALSE);
2255 else if (strcmp (arg, "lp64q") == 0)
2256 riscv_set_abi (64, FLOAT_ABI_QUAD, FALSE);
2257 else
2258 return 0;
2259 break;
2260
2261 case OPTION_RELAX:
2262 riscv_opts.relax = TRUE;
2263 break;
2264
2265 case OPTION_NO_RELAX:
2266 riscv_opts.relax = FALSE;
2267 break;
2268
2269 default:
2270 return 0;
2271 }
2272
2273 return 1;
2274 }
2275
2276 void
2277 riscv_after_parse_args (void)
2278 {
2279 if (xlen == 0)
2280 {
2281 if (strcmp (default_arch, "riscv32") == 0)
2282 xlen = 32;
2283 else if (strcmp (default_arch, "riscv64") == 0)
2284 xlen = 64;
2285 else
2286 as_bad ("unknown default architecture `%s'", default_arch);
2287 }
2288
2289 if (riscv_subsets == NULL)
2290 riscv_set_arch (xlen == 64 ? "rv64g" : "rv32g");
2291
2292 /* Add the RVC extension, regardless of -march, to support .option rvc. */
2293 riscv_set_rvc (FALSE);
2294 if (riscv_subset_supports ("c"))
2295 riscv_set_rvc (TRUE);
2296 else
2297 riscv_add_subset ("c");
2298
2299 /* Enable RVE if specified by the -march option. */
2300 riscv_set_rve (FALSE);
2301 if (riscv_subset_supports ("e"))
2302 riscv_set_rve (TRUE);
2303
2304 /* Infer ABI from ISA if not specified on command line. */
2305 if (abi_xlen == 0)
2306 abi_xlen = xlen;
2307 else if (abi_xlen > xlen)
2308 as_bad ("can't have %d-bit ABI on %d-bit ISA", abi_xlen, xlen);
2309 else if (abi_xlen < xlen)
2310 as_bad ("%d-bit ABI not yet supported on %d-bit ISA", abi_xlen, xlen);
2311
2312 if (float_abi == FLOAT_ABI_DEFAULT)
2313 {
2314 struct riscv_subset *subset;
2315
2316 /* Assume soft-float unless D extension is present. */
2317 float_abi = FLOAT_ABI_SOFT;
2318
2319 for (subset = riscv_subsets; subset != NULL; subset = subset->next)
2320 {
2321 if (strcasecmp (subset->name, "D") == 0)
2322 float_abi = FLOAT_ABI_DOUBLE;
2323 if (strcasecmp (subset->name, "Q") == 0)
2324 float_abi = FLOAT_ABI_QUAD;
2325 }
2326 }
2327
2328 if (rve_abi)
2329 elf_flags |= EF_RISCV_RVE;
2330
2331 /* Insert float_abi into the EF_RISCV_FLOAT_ABI field of elf_flags. */
2332 elf_flags |= float_abi * (EF_RISCV_FLOAT_ABI & ~(EF_RISCV_FLOAT_ABI << 1));
2333 }
2334
2335 long
2336 md_pcrel_from (fixS *fixP)
2337 {
2338 return fixP->fx_where + fixP->fx_frag->fr_address;
2339 }
2340
2341 /* Apply a fixup to the object file. */
2342
2343 void
2344 md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
2345 {
2346 unsigned int subtype;
2347 bfd_byte *buf = (bfd_byte *) (fixP->fx_frag->fr_literal + fixP->fx_where);
2348 bfd_boolean relaxable = FALSE;
2349 offsetT loc;
2350 segT sub_segment;
2351
2352 /* Remember value for tc_gen_reloc. */
2353 fixP->fx_addnumber = *valP;
2354
2355 switch (fixP->fx_r_type)
2356 {
2357 case BFD_RELOC_RISCV_HI20:
2358 case BFD_RELOC_RISCV_LO12_I:
2359 case BFD_RELOC_RISCV_LO12_S:
2360 bfd_putl32 (riscv_apply_const_reloc (fixP->fx_r_type, *valP)
2361 | bfd_getl32 (buf), buf);
2362 if (fixP->fx_addsy == NULL)
2363 fixP->fx_done = TRUE;
2364 relaxable = TRUE;
2365 break;
2366
2367 case BFD_RELOC_RISCV_GOT_HI20:
2368 case BFD_RELOC_RISCV_ADD8:
2369 case BFD_RELOC_RISCV_ADD16:
2370 case BFD_RELOC_RISCV_ADD32:
2371 case BFD_RELOC_RISCV_ADD64:
2372 case BFD_RELOC_RISCV_SUB6:
2373 case BFD_RELOC_RISCV_SUB8:
2374 case BFD_RELOC_RISCV_SUB16:
2375 case BFD_RELOC_RISCV_SUB32:
2376 case BFD_RELOC_RISCV_SUB64:
2377 case BFD_RELOC_RISCV_RELAX:
2378 break;
2379
2380 case BFD_RELOC_RISCV_TPREL_HI20:
2381 case BFD_RELOC_RISCV_TPREL_LO12_I:
2382 case BFD_RELOC_RISCV_TPREL_LO12_S:
2383 case BFD_RELOC_RISCV_TPREL_ADD:
2384 relaxable = TRUE;
2385 /* Fall through. */
2386
2387 case BFD_RELOC_RISCV_TLS_GOT_HI20:
2388 case BFD_RELOC_RISCV_TLS_GD_HI20:
2389 case BFD_RELOC_RISCV_TLS_DTPREL32:
2390 case BFD_RELOC_RISCV_TLS_DTPREL64:
2391 if (fixP->fx_addsy != NULL)
2392 S_SET_THREAD_LOCAL (fixP->fx_addsy);
2393 else
2394 as_bad_where (fixP->fx_file, fixP->fx_line,
2395 _("TLS relocation against a constant"));
2396 break;
2397
2398 case BFD_RELOC_32:
2399 /* Use pc-relative relocation for FDE initial location.
2400 The symbol address in .eh_frame may be adjusted in
2401 _bfd_elf_discard_section_eh_frame, and the content of
2402 .eh_frame will be adjusted in _bfd_elf_write_section_eh_frame.
2403 Therefore, we cannot insert a relocation whose addend symbol is
2404 in .eh_frame. Othrewise, the value may be adjusted twice.*/
2405 if (fixP->fx_addsy && fixP->fx_subsy
2406 && (sub_segment = S_GET_SEGMENT (fixP->fx_subsy))
2407 && strcmp (sub_segment->name, ".eh_frame") == 0
2408 && S_GET_VALUE (fixP->fx_subsy)
2409 == fixP->fx_frag->fr_address + fixP->fx_where)
2410 {
2411 fixP->fx_r_type = BFD_RELOC_RISCV_32_PCREL;
2412 fixP->fx_subsy = NULL;
2413 break;
2414 }
2415 /* Fall through. */
2416 case BFD_RELOC_64:
2417 case BFD_RELOC_16:
2418 case BFD_RELOC_8:
2419 case BFD_RELOC_RISCV_CFA:
2420 if (fixP->fx_addsy && fixP->fx_subsy)
2421 {
2422 fixP->fx_next = xmemdup (fixP, sizeof (*fixP), sizeof (*fixP));
2423 fixP->fx_next->fx_addsy = fixP->fx_subsy;
2424 fixP->fx_next->fx_subsy = NULL;
2425 fixP->fx_next->fx_offset = 0;
2426 fixP->fx_subsy = NULL;
2427
2428 switch (fixP->fx_r_type)
2429 {
2430 case BFD_RELOC_64:
2431 fixP->fx_r_type = BFD_RELOC_RISCV_ADD64;
2432 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB64;
2433 break;
2434
2435 case BFD_RELOC_32:
2436 fixP->fx_r_type = BFD_RELOC_RISCV_ADD32;
2437 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB32;
2438 break;
2439
2440 case BFD_RELOC_16:
2441 fixP->fx_r_type = BFD_RELOC_RISCV_ADD16;
2442 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB16;
2443 break;
2444
2445 case BFD_RELOC_8:
2446 fixP->fx_r_type = BFD_RELOC_RISCV_ADD8;
2447 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB8;
2448 break;
2449
2450 case BFD_RELOC_RISCV_CFA:
2451 /* Load the byte to get the subtype. */
2452 subtype = bfd_get_8 (NULL, &((fragS *) (fixP->fx_frag->fr_opcode))->fr_literal[fixP->fx_where]);
2453 loc = fixP->fx_frag->fr_fix - (subtype & 7);
2454 switch (subtype)
2455 {
2456 case DW_CFA_advance_loc1:
2457 fixP->fx_where = loc + 1;
2458 fixP->fx_next->fx_where = loc + 1;
2459 fixP->fx_r_type = BFD_RELOC_RISCV_SET8;
2460 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB8;
2461 break;
2462
2463 case DW_CFA_advance_loc2:
2464 fixP->fx_size = 2;
2465 fixP->fx_next->fx_size = 2;
2466 fixP->fx_where = loc + 1;
2467 fixP->fx_next->fx_where = loc + 1;
2468 fixP->fx_r_type = BFD_RELOC_RISCV_SET16;
2469 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB16;
2470 break;
2471
2472 case DW_CFA_advance_loc4:
2473 fixP->fx_size = 4;
2474 fixP->fx_next->fx_size = 4;
2475 fixP->fx_where = loc;
2476 fixP->fx_next->fx_where = loc;
2477 fixP->fx_r_type = BFD_RELOC_RISCV_SET32;
2478 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB32;
2479 break;
2480
2481 default:
2482 if (subtype < 0x80 && (subtype & 0x40))
2483 {
2484 /* DW_CFA_advance_loc */
2485 fixP->fx_frag = (fragS *) fixP->fx_frag->fr_opcode;
2486 fixP->fx_next->fx_frag = fixP->fx_frag;
2487 fixP->fx_r_type = BFD_RELOC_RISCV_SET6;
2488 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_SUB6;
2489 }
2490 else
2491 as_fatal (_("internal error: bad CFA value #%d"), subtype);
2492 break;
2493 }
2494 break;
2495
2496 default:
2497 /* This case is unreachable. */
2498 abort ();
2499 }
2500 }
2501 /* Fall through. */
2502
2503 case BFD_RELOC_RVA:
2504 /* If we are deleting this reloc entry, we must fill in the
2505 value now. This can happen if we have a .word which is not
2506 resolved when it appears but is later defined. */
2507 if (fixP->fx_addsy == NULL)
2508 {
2509 gas_assert (fixP->fx_size <= sizeof (valueT));
2510 md_number_to_chars ((char *) buf, *valP, fixP->fx_size);
2511 fixP->fx_done = 1;
2512 }
2513 break;
2514
2515 case BFD_RELOC_RISCV_JMP:
2516 if (fixP->fx_addsy)
2517 {
2518 /* Fill in a tentative value to improve objdump readability. */
2519 bfd_vma target = S_GET_VALUE (fixP->fx_addsy) + *valP;
2520 bfd_vma delta = target - md_pcrel_from (fixP);
2521 bfd_putl32 (bfd_getl32 (buf) | ENCODE_UJTYPE_IMM (delta), buf);
2522 }
2523 break;
2524
2525 case BFD_RELOC_12_PCREL:
2526 if (fixP->fx_addsy)
2527 {
2528 /* Fill in a tentative value to improve objdump readability. */
2529 bfd_vma target = S_GET_VALUE (fixP->fx_addsy) + *valP;
2530 bfd_vma delta = target - md_pcrel_from (fixP);
2531 bfd_putl32 (bfd_getl32 (buf) | ENCODE_SBTYPE_IMM (delta), buf);
2532 }
2533 break;
2534
2535 case BFD_RELOC_RISCV_RVC_BRANCH:
2536 if (fixP->fx_addsy)
2537 {
2538 /* Fill in a tentative value to improve objdump readability. */
2539 bfd_vma target = S_GET_VALUE (fixP->fx_addsy) + *valP;
2540 bfd_vma delta = target - md_pcrel_from (fixP);
2541 bfd_putl16 (bfd_getl16 (buf) | ENCODE_RVC_B_IMM (delta), buf);
2542 }
2543 break;
2544
2545 case BFD_RELOC_RISCV_RVC_JUMP:
2546 if (fixP->fx_addsy)
2547 {
2548 /* Fill in a tentative value to improve objdump readability. */
2549 bfd_vma target = S_GET_VALUE (fixP->fx_addsy) + *valP;
2550 bfd_vma delta = target - md_pcrel_from (fixP);
2551 bfd_putl16 (bfd_getl16 (buf) | ENCODE_RVC_J_IMM (delta), buf);
2552 }
2553 break;
2554
2555 case BFD_RELOC_RISCV_CALL:
2556 case BFD_RELOC_RISCV_CALL_PLT:
2557 relaxable = TRUE;
2558 break;
2559
2560 case BFD_RELOC_RISCV_PCREL_HI20:
2561 case BFD_RELOC_RISCV_PCREL_LO12_S:
2562 case BFD_RELOC_RISCV_PCREL_LO12_I:
2563 relaxable = riscv_opts.relax;
2564 break;
2565
2566 case BFD_RELOC_RISCV_ALIGN:
2567 break;
2568
2569 default:
2570 /* We ignore generic BFD relocations we don't know about. */
2571 if (bfd_reloc_type_lookup (stdoutput, fixP->fx_r_type) != NULL)
2572 as_fatal (_("internal error: bad relocation #%d"), fixP->fx_r_type);
2573 }
2574
2575 if (fixP->fx_subsy != NULL)
2576 as_bad_where (fixP->fx_file, fixP->fx_line,
2577 _("unsupported symbol subtraction"));
2578
2579 /* Add an R_RISCV_RELAX reloc if the reloc is relaxable. */
2580 if (relaxable && fixP->fx_tcbit && fixP->fx_addsy != NULL)
2581 {
2582 fixP->fx_next = xmemdup (fixP, sizeof (*fixP), sizeof (*fixP));
2583 fixP->fx_next->fx_addsy = fixP->fx_next->fx_subsy = NULL;
2584 fixP->fx_next->fx_r_type = BFD_RELOC_RISCV_RELAX;
2585 }
2586 }
2587
2588 /* Because the value of .cfi_remember_state may changed after relaxation,
2589 we insert a fix to relocate it again in link-time. */
2590
2591 void
2592 riscv_pre_output_hook (void)
2593 {
2594 const frchainS *frch;
2595 const asection *s;
2596
2597 for (s = stdoutput->sections; s; s = s->next)
2598 for (frch = seg_info (s)->frchainP; frch; frch = frch->frch_next)
2599 {
2600 fragS *frag;
2601
2602 for (frag = frch->frch_root; frag; frag = frag->fr_next)
2603 {
2604 if (frag->fr_type == rs_cfa)
2605 {
2606 expressionS exp;
2607
2608 symbolS *add_symbol = frag->fr_symbol->sy_value.X_add_symbol;
2609 symbolS *op_symbol = frag->fr_symbol->sy_value.X_op_symbol;
2610
2611 exp.X_op = O_subtract;
2612 exp.X_add_symbol = add_symbol;
2613 exp.X_add_number = 0;
2614 exp.X_op_symbol = op_symbol;
2615
2616 fix_new_exp (frag, (int) frag->fr_offset, 1, &exp, 0,
2617 BFD_RELOC_RISCV_CFA);
2618 }
2619 }
2620 }
2621 }
2622
2623
2624 /* This structure is used to hold a stack of .option values. */
2625
2626 struct riscv_option_stack
2627 {
2628 struct riscv_option_stack *next;
2629 struct riscv_set_options options;
2630 };
2631
2632 static struct riscv_option_stack *riscv_opts_stack;
2633
2634 /* Handle the .option pseudo-op. */
2635
2636 static void
2637 s_riscv_option (int x ATTRIBUTE_UNUSED)
2638 {
2639 char *name = input_line_pointer, ch;
2640
2641 while (!is_end_of_line[(unsigned char) *input_line_pointer])
2642 ++input_line_pointer;
2643 ch = *input_line_pointer;
2644 *input_line_pointer = '\0';
2645
2646 if (strcmp (name, "rvc") == 0)
2647 riscv_set_rvc (TRUE);
2648 else if (strcmp (name, "norvc") == 0)
2649 riscv_set_rvc (FALSE);
2650 else if (strcmp (name, "pic") == 0)
2651 riscv_opts.pic = TRUE;
2652 else if (strcmp (name, "nopic") == 0)
2653 riscv_opts.pic = FALSE;
2654 else if (strcmp (name, "relax") == 0)
2655 riscv_opts.relax = TRUE;
2656 else if (strcmp (name, "norelax") == 0)
2657 riscv_opts.relax = FALSE;
2658 else if (strcmp (name, "push") == 0)
2659 {
2660 struct riscv_option_stack *s;
2661
2662 s = (struct riscv_option_stack *) xmalloc (sizeof *s);
2663 s->next = riscv_opts_stack;
2664 s->options = riscv_opts;
2665 riscv_opts_stack = s;
2666 }
2667 else if (strcmp (name, "pop") == 0)
2668 {
2669 struct riscv_option_stack *s;
2670
2671 s = riscv_opts_stack;
2672 if (s == NULL)
2673 as_bad (_(".option pop with no .option push"));
2674 else
2675 {
2676 riscv_opts = s->options;
2677 riscv_opts_stack = s->next;
2678 free (s);
2679 }
2680 }
2681 else
2682 {
2683 as_warn (_("Unrecognized .option directive: %s\n"), name);
2684 }
2685 *input_line_pointer = ch;
2686 demand_empty_rest_of_line ();
2687 }
2688
2689 /* Handle the .dtprelword and .dtpreldword pseudo-ops. They generate
2690 a 32-bit or 64-bit DTP-relative relocation (BYTES says which) for
2691 use in DWARF debug information. */
2692
2693 static void
2694 s_dtprel (int bytes)
2695 {
2696 expressionS ex;
2697 char *p;
2698
2699 expression (&ex);
2700
2701 if (ex.X_op != O_symbol)
2702 {
2703 as_bad (_("Unsupported use of %s"), (bytes == 8
2704 ? ".dtpreldword"
2705 : ".dtprelword"));
2706 ignore_rest_of_line ();
2707 }
2708
2709 p = frag_more (bytes);
2710 md_number_to_chars (p, 0, bytes);
2711 fix_new_exp (frag_now, p - frag_now->fr_literal, bytes, &ex, FALSE,
2712 (bytes == 8
2713 ? BFD_RELOC_RISCV_TLS_DTPREL64
2714 : BFD_RELOC_RISCV_TLS_DTPREL32));
2715
2716 demand_empty_rest_of_line ();
2717 }
2718
2719 /* Handle the .bss pseudo-op. */
2720
2721 static void
2722 s_bss (int ignore ATTRIBUTE_UNUSED)
2723 {
2724 subseg_set (bss_section, 0);
2725 demand_empty_rest_of_line ();
2726 }
2727
2728 static void
2729 riscv_make_nops (char *buf, bfd_vma bytes)
2730 {
2731 bfd_vma i = 0;
2732
2733 /* RISC-V instructions cannot begin or end on odd addresses, so this case
2734 means we are not within a valid instruction sequence. It is thus safe
2735 to use a zero byte, even though that is not a valid instruction. */
2736 if (bytes % 2 == 1)
2737 buf[i++] = 0;
2738
2739 /* Use at most one 2-byte NOP. */
2740 if ((bytes - i) % 4 == 2)
2741 {
2742 md_number_to_chars (buf + i, RVC_NOP, 2);
2743 i += 2;
2744 }
2745
2746 /* Fill the remainder with 4-byte NOPs. */
2747 for ( ; i < bytes; i += 4)
2748 md_number_to_chars (buf + i, RISCV_NOP, 4);
2749 }
2750
2751 /* Called from md_do_align. Used to create an alignment frag in a
2752 code section by emitting a worst-case NOP sequence that the linker
2753 will later relax to the correct number of NOPs. We can't compute
2754 the correct alignment now because of other linker relaxations. */
2755
2756 bfd_boolean
2757 riscv_frag_align_code (int n)
2758 {
2759 bfd_vma bytes = (bfd_vma) 1 << n;
2760 bfd_vma insn_alignment = riscv_opts.rvc ? 2 : 4;
2761 bfd_vma worst_case_bytes = bytes - insn_alignment;
2762 char *nops;
2763 expressionS ex;
2764
2765 /* If we are moving to a smaller alignment than the instruction size, then no
2766 alignment is required. */
2767 if (bytes <= insn_alignment)
2768 return TRUE;
2769
2770 /* When not relaxing, riscv_handle_align handles code alignment. */
2771 if (!riscv_opts.relax)
2772 return FALSE;
2773
2774 nops = frag_more (worst_case_bytes);
2775
2776 ex.X_op = O_constant;
2777 ex.X_add_number = worst_case_bytes;
2778
2779 riscv_make_nops (nops, worst_case_bytes);
2780
2781 fix_new_exp (frag_now, nops - frag_now->fr_literal, 0,
2782 &ex, FALSE, BFD_RELOC_RISCV_ALIGN);
2783
2784 return TRUE;
2785 }
2786
2787 /* Implement HANDLE_ALIGN. */
2788
2789 void
2790 riscv_handle_align (fragS *fragP)
2791 {
2792 switch (fragP->fr_type)
2793 {
2794 case rs_align_code:
2795 /* When relaxing, riscv_frag_align_code handles code alignment. */
2796 if (!riscv_opts.relax)
2797 {
2798 bfd_signed_vma bytes = (fragP->fr_next->fr_address
2799 - fragP->fr_address - fragP->fr_fix);
2800 /* We have 4 byte uncompressed nops. */
2801 bfd_signed_vma size = 4;
2802 bfd_signed_vma excess = bytes % size;
2803 char *p = fragP->fr_literal + fragP->fr_fix;
2804
2805 if (bytes <= 0)
2806 break;
2807
2808 /* Insert zeros or compressed nops to get 4 byte alignment. */
2809 if (excess)
2810 {
2811 riscv_make_nops (p, excess);
2812 fragP->fr_fix += excess;
2813 p += excess;
2814 }
2815
2816 /* Insert variable number of 4 byte uncompressed nops. */
2817 riscv_make_nops (p, size);
2818 fragP->fr_var = size;
2819 }
2820 break;
2821
2822 default:
2823 break;
2824 }
2825 }
2826
2827 int
2828 md_estimate_size_before_relax (fragS *fragp, asection *segtype)
2829 {
2830 return (fragp->fr_var = relaxed_branch_length (fragp, segtype, FALSE));
2831 }
2832
2833 /* Translate internal representation of relocation info to BFD target
2834 format. */
2835
2836 arelent *
2837 tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
2838 {
2839 arelent *reloc = (arelent *) xmalloc (sizeof (arelent));
2840
2841 reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
2842 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
2843 reloc->address = fixp->fx_frag->fr_address + fixp->fx_where;
2844 reloc->addend = fixp->fx_addnumber;
2845
2846 reloc->howto = bfd_reloc_type_lookup (stdoutput, fixp->fx_r_type);
2847 if (reloc->howto == NULL)
2848 {
2849 if ((fixp->fx_r_type == BFD_RELOC_16 || fixp->fx_r_type == BFD_RELOC_8)
2850 && fixp->fx_addsy != NULL && fixp->fx_subsy != NULL)
2851 {
2852 /* We don't have R_RISCV_8/16, but for this special case,
2853 we can use R_RISCV_ADD8/16 with R_RISCV_SUB8/16. */
2854 return reloc;
2855 }
2856
2857 as_bad_where (fixp->fx_file, fixp->fx_line,
2858 _("cannot represent %s relocation in object file"),
2859 bfd_get_reloc_code_name (fixp->fx_r_type));
2860 return NULL;
2861 }
2862
2863 return reloc;
2864 }
2865
2866 int
2867 riscv_relax_frag (asection *sec, fragS *fragp, long stretch ATTRIBUTE_UNUSED)
2868 {
2869 if (RELAX_BRANCH_P (fragp->fr_subtype))
2870 {
2871 offsetT old_var = fragp->fr_var;
2872 fragp->fr_var = relaxed_branch_length (fragp, sec, TRUE);
2873 return fragp->fr_var - old_var;
2874 }
2875
2876 return 0;
2877 }
2878
2879 /* Expand far branches to multi-instruction sequences. */
2880
2881 static void
2882 md_convert_frag_branch (fragS *fragp)
2883 {
2884 bfd_byte *buf;
2885 expressionS exp;
2886 fixS *fixp;
2887 insn_t insn;
2888 int rs1, reloc;
2889
2890 buf = (bfd_byte *)fragp->fr_literal + fragp->fr_fix;
2891
2892 exp.X_op = O_symbol;
2893 exp.X_add_symbol = fragp->fr_symbol;
2894 exp.X_add_number = fragp->fr_offset;
2895
2896 gas_assert (fragp->fr_var == RELAX_BRANCH_LENGTH (fragp->fr_subtype));
2897
2898 if (RELAX_BRANCH_RVC (fragp->fr_subtype))
2899 {
2900 switch (RELAX_BRANCH_LENGTH (fragp->fr_subtype))
2901 {
2902 case 8:
2903 case 4:
2904 /* Expand the RVC branch into a RISC-V one. */
2905 insn = bfd_getl16 (buf);
2906 rs1 = 8 + ((insn >> OP_SH_CRS1S) & OP_MASK_CRS1S);
2907 if ((insn & MASK_C_J) == MATCH_C_J)
2908 insn = MATCH_JAL;
2909 else if ((insn & MASK_C_JAL) == MATCH_C_JAL)
2910 insn = MATCH_JAL | (X_RA << OP_SH_RD);
2911 else if ((insn & MASK_C_BEQZ) == MATCH_C_BEQZ)
2912 insn = MATCH_BEQ | (rs1 << OP_SH_RS1);
2913 else if ((insn & MASK_C_BNEZ) == MATCH_C_BNEZ)
2914 insn = MATCH_BNE | (rs1 << OP_SH_RS1);
2915 else
2916 abort ();
2917 bfd_putl32 (insn, buf);
2918 break;
2919
2920 case 6:
2921 /* Invert the branch condition. Branch over the jump. */
2922 insn = bfd_getl16 (buf);
2923 insn ^= MATCH_C_BEQZ ^ MATCH_C_BNEZ;
2924 insn |= ENCODE_RVC_B_IMM (6);
2925 bfd_putl16 (insn, buf);
2926 buf += 2;
2927 goto jump;
2928
2929 case 2:
2930 /* Just keep the RVC branch. */
2931 reloc = RELAX_BRANCH_UNCOND (fragp->fr_subtype)
2932 ? BFD_RELOC_RISCV_RVC_JUMP : BFD_RELOC_RISCV_RVC_BRANCH;
2933 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
2934 2, &exp, FALSE, reloc);
2935 buf += 2;
2936 goto done;
2937
2938 default:
2939 abort ();
2940 }
2941 }
2942
2943 switch (RELAX_BRANCH_LENGTH (fragp->fr_subtype))
2944 {
2945 case 8:
2946 gas_assert (!RELAX_BRANCH_UNCOND (fragp->fr_subtype));
2947
2948 /* Invert the branch condition. Branch over the jump. */
2949 insn = bfd_getl32 (buf);
2950 insn ^= MATCH_BEQ ^ MATCH_BNE;
2951 insn |= ENCODE_SBTYPE_IMM (8);
2952 md_number_to_chars ((char *) buf, insn, 4);
2953 buf += 4;
2954
2955 jump:
2956 /* Jump to the target. */
2957 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
2958 4, &exp, FALSE, BFD_RELOC_RISCV_JMP);
2959 md_number_to_chars ((char *) buf, MATCH_JAL, 4);
2960 buf += 4;
2961 break;
2962
2963 case 4:
2964 reloc = RELAX_BRANCH_UNCOND (fragp->fr_subtype)
2965 ? BFD_RELOC_RISCV_JMP : BFD_RELOC_12_PCREL;
2966 fixp = fix_new_exp (fragp, buf - (bfd_byte *)fragp->fr_literal,
2967 4, &exp, FALSE, reloc);
2968 buf += 4;
2969 break;
2970
2971 default:
2972 abort ();
2973 }
2974
2975 done:
2976 fixp->fx_file = fragp->fr_file;
2977 fixp->fx_line = fragp->fr_line;
2978
2979 gas_assert (buf == (bfd_byte *)fragp->fr_literal
2980 + fragp->fr_fix + fragp->fr_var);
2981
2982 fragp->fr_fix += fragp->fr_var;
2983 }
2984
2985 /* Relax a machine dependent frag. This returns the amount by which
2986 the current size of the frag should change. */
2987
2988 void
2989 md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED, segT asec ATTRIBUTE_UNUSED,
2990 fragS *fragp)
2991 {
2992 gas_assert (RELAX_BRANCH_P (fragp->fr_subtype));
2993 md_convert_frag_branch (fragp);
2994 }
2995
2996 void
2997 md_show_usage (FILE *stream)
2998 {
2999 fprintf (stream, _("\
3000 RISC-V options:\n\
3001 -fpic generate position-independent code\n\
3002 -fno-pic don't generate position-independent code (default)\n\
3003 -march=ISA set the RISC-V architecture\n\
3004 -mabi=ABI set the RISC-V ABI\n\
3005 -mrelax enable relax (default)\n\
3006 -mno-relax disable relax\n\
3007 "));
3008 }
3009
3010 /* Standard calling conventions leave the CFA at SP on entry. */
3011 void
3012 riscv_cfi_frame_initial_instructions (void)
3013 {
3014 cfi_add_CFA_def_cfa_register (X_SP);
3015 }
3016
3017 int
3018 tc_riscv_regname_to_dw2regnum (char *regname)
3019 {
3020 int reg;
3021
3022 if ((reg = reg_lookup_internal (regname, RCLASS_GPR)) >= 0)
3023 return reg;
3024
3025 if ((reg = reg_lookup_internal (regname, RCLASS_FPR)) >= 0)
3026 return reg + 32;
3027
3028 as_bad (_("unknown register `%s'"), regname);
3029 return -1;
3030 }
3031
3032 void
3033 riscv_elf_final_processing (void)
3034 {
3035 elf_elfheader (stdoutput)->e_flags |= elf_flags;
3036 }
3037
3038 /* Parse the .sleb128 and .uleb128 pseudos. Only allow constant expressions,
3039 since these directives break relaxation when used with symbol deltas. */
3040
3041 static void
3042 s_riscv_leb128 (int sign)
3043 {
3044 expressionS exp;
3045 char *save_in = input_line_pointer;
3046
3047 expression (&exp);
3048 if (exp.X_op != O_constant)
3049 as_bad (_("non-constant .%cleb128 is not supported"), sign ? 's' : 'u');
3050 demand_empty_rest_of_line ();
3051
3052 input_line_pointer = save_in;
3053 return s_leb128 (sign);
3054 }
3055
3056 /* Parse the .insn directive. */
3057
3058 static void
3059 s_riscv_insn (int x ATTRIBUTE_UNUSED)
3060 {
3061 char *str = input_line_pointer;
3062 struct riscv_cl_insn insn;
3063 expressionS imm_expr;
3064 bfd_reloc_code_real_type imm_reloc = BFD_RELOC_UNUSED;
3065 char save_c;
3066
3067 while (!is_end_of_line[(unsigned char) *input_line_pointer])
3068 ++input_line_pointer;
3069
3070 save_c = *input_line_pointer;
3071 *input_line_pointer = '\0';
3072
3073 const char *error = riscv_ip (str, &insn, &imm_expr,
3074 &imm_reloc, insn_type_hash);
3075
3076 if (error)
3077 {
3078 as_bad ("%s `%s'", error, str);
3079 }
3080 else
3081 {
3082 gas_assert (insn.insn_mo->pinfo != INSN_MACRO);
3083 append_insn (&insn, &imm_expr, imm_reloc);
3084 }
3085
3086 *input_line_pointer = save_c;
3087 demand_empty_rest_of_line ();
3088 }
3089
3090 /* Pseudo-op table. */
3091
3092 static const pseudo_typeS riscv_pseudo_table[] =
3093 {
3094 /* RISC-V-specific pseudo-ops. */
3095 {"option", s_riscv_option, 0},
3096 {"half", cons, 2},
3097 {"word", cons, 4},
3098 {"dword", cons, 8},
3099 {"dtprelword", s_dtprel, 4},
3100 {"dtpreldword", s_dtprel, 8},
3101 {"bss", s_bss, 0},
3102 {"uleb128", s_riscv_leb128, 0},
3103 {"sleb128", s_riscv_leb128, 1},
3104 {"insn", s_riscv_insn, 0},
3105
3106 { NULL, NULL, 0 },
3107 };
3108
3109 void
3110 riscv_pop_insert (void)
3111 {
3112 extern void pop_insert (const pseudo_typeS *);
3113
3114 pop_insert (riscv_pseudo_table);
3115 }
This page took 0.126355 seconds and 4 git commands to generate.