]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/config/tc-bpf.c
gas: tc-bpf.c: fix formatting of comment
[thirdparty/binutils-gdb.git] / gas / config / tc-bpf.c
CommitLineData
f8861f5d 1/* tc-bpf.c -- Assembler for the Linux eBPF.
d87bef3a 2 Copyright (C) 2019-2023 Free Software Foundation, Inc.
f8861f5d
JM
3 Contributed by Oracle, Inc.
4
5 This file is part of GAS, the GNU Assembler.
6
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
11
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to
19 the Free Software Foundation, 51 Franklin Street - Fifth Floor,
20 Boston, MA 02110-1301, USA. */
21
22#include "as.h"
23#include "subsegs.h"
24#include "symcat.h"
b5c37946 25#include "opcode/bpf.h"
f8861f5d
JM
26#include "elf/common.h"
27#include "elf/bpf.h"
28#include "dwarf2dbg.h"
b5c37946 29#include "libiberty.h"
ff5a51b3 30#include <ctype.h>
f8861f5d 31
b5c37946
SJ
32/* Data structure representing a parsed BPF instruction. */
33
34struct bpf_insn
35{
36 enum bpf_insn_id id;
37 int size; /* Instruction size in bytes. */
38 bpf_insn_word opcode;
39 uint8_t dst;
40 uint8_t src;
41 expressionS offset16;
42 expressionS imm32;
43 expressionS imm64;
44 expressionS disp16;
45 expressionS disp32;
46
47 unsigned int has_dst : 1;
48 unsigned int has_src : 1;
49 unsigned int has_offset16 : 1;
50 unsigned int has_disp16 : 1;
51 unsigned int has_disp32 : 1;
52 unsigned int has_imm32 : 1;
53 unsigned int has_imm64 : 1;
54
55 unsigned int is_relaxable : 1;
56 expressionS *relaxed_exp;
57};
58
59const char comment_chars[] = ";#";
ff5a51b3 60const char line_comment_chars[] = "#";
f8861f5d
JM
61const char line_separator_chars[] = "`";
62const char EXP_CHARS[] = "eE";
63const char FLT_CHARS[] = "fFdD";
64
1802aae8
JM
65/* Like s_lcomm_internal in gas/read.c but the alignment string
66 is allowed to be optional. */
67
68static symbolS *
69pe_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
70{
71 addressT align = 0;
72
73 SKIP_WHITESPACE ();
74
75 if (needs_align
76 && *input_line_pointer == ',')
77 {
78 align = parse_align (needs_align - 1);
79
80 if (align == (addressT) -1)
81 return NULL;
82 }
83 else
84 {
85 if (size >= 8)
86 align = 3;
87 else if (size >= 4)
88 align = 2;
89 else if (size >= 2)
90 align = 1;
91 else
92 align = 0;
93 }
94
95 bss_alloc (symbolP, size, align);
96 return symbolP;
97}
98
99static void
100pe_lcomm (int needs_align)
101{
102 s_comm_internal (needs_align * 2, pe_lcomm_internal);
103}
104
f8861f5d
JM
105/* The target specific pseudo-ops which we support. */
106const pseudo_typeS md_pseudo_table[] =
107{
e0b989a6
JM
108 { "half", cons, 2 },
109 { "word", cons, 4 },
110 { "dword", cons, 8 },
1802aae8 111 { "lcomm", pe_lcomm, 1 },
d0044bac 112 { NULL, NULL, 0 }
f8861f5d
JM
113};
114
1802aae8
JM
115\f
116
f8861f5d
JM
117/* Command-line options processing. */
118
119enum options
120{
121 OPTION_LITTLE_ENDIAN = OPTION_MD_BASE,
4449c81a 122 OPTION_BIG_ENDIAN,
b5c37946
SJ
123 OPTION_XBPF,
124 OPTION_DIALECT,
125 OPTION_ISA_SPEC,
126 OPTION_NO_RELAX,
f8861f5d
JM
127};
128
129struct option md_longopts[] =
130{
131 { "EL", no_argument, NULL, OPTION_LITTLE_ENDIAN },
132 { "EB", no_argument, NULL, OPTION_BIG_ENDIAN },
4449c81a 133 { "mxbpf", no_argument, NULL, OPTION_XBPF },
b5c37946
SJ
134 { "mdialect", required_argument, NULL, OPTION_DIALECT},
135 { "misa-spec", required_argument, NULL, OPTION_ISA_SPEC},
136 { "mno-relax", no_argument, NULL, OPTION_NO_RELAX},
f8861f5d
JM
137 { NULL, no_argument, NULL, 0 },
138};
139
140size_t md_longopts_size = sizeof (md_longopts);
141
142const char * md_shortopts = "";
143
b5c37946
SJ
144/* BPF supports little-endian and big-endian variants. The following
145 global records what endianness to use. It can be configured using
146 command-line options. It defaults to the host endianness
147 initialized in md_begin. */
d218e7fe 148
675b9d61 149static int set_target_endian = 0;
b5c37946
SJ
150extern int target_big_endian;
151
152/* Whether to relax branch instructions. Default is yes. Can be
153 changed using the -mno-relax command line option. */
154
155static int do_relax = 1;
156
157/* The ISA specification can be one of BPF_V1, BPF_V2, BPF_V3, BPF_V4
158 or BPF_XPBF. The ISA spec to use can be configured using
159 command-line options. It defaults to the latest BPF spec. */
160
161static int isa_spec = BPF_V4;
162
163/* The assembler supports two different dialects: "normal" syntax and
164 "pseudoc" syntax. The dialect to use can be configured using
165 command-line options. */
4449c81a 166
b5c37946
SJ
167enum target_asm_dialect
168{
169 DIALECT_NORMAL,
170 DIALECT_PSEUDOC
171};
d218e7fe 172
b5c37946 173static int asm_dialect = DIALECT_NORMAL;
4449c81a 174
f8861f5d 175int
b5c37946 176md_parse_option (int c, const char * arg)
f8861f5d
JM
177{
178 switch (c)
179 {
180 case OPTION_BIG_ENDIAN:
181 set_target_endian = 1;
182 target_big_endian = 1;
183 break;
184 case OPTION_LITTLE_ENDIAN:
b5c37946 185 set_target_endian = 0;
f8861f5d
JM
186 target_big_endian = 0;
187 break;
b5c37946
SJ
188 case OPTION_DIALECT:
189 if (strcmp (arg, "normal") == 0)
190 asm_dialect = DIALECT_NORMAL;
191 else if (strcmp (arg, "pseudoc") == 0)
192 asm_dialect = DIALECT_PSEUDOC;
193 else
194 as_fatal (_("-mdialect=%s is not valid. Expected normal or pseudoc"),
195 arg);
196 break;
197 case OPTION_ISA_SPEC:
198 if (strcmp (arg, "v1") == 0)
199 isa_spec = BPF_V1;
200 else if (strcmp (arg, "v2") == 0)
201 isa_spec = BPF_V2;
202 else if (strcmp (arg, "v3") == 0)
203 isa_spec = BPF_V3;
204 else if (strcmp (arg, "v4") == 0)
205 isa_spec = BPF_V4;
206 else if (strcmp (arg, "xbpf") == 0)
207 isa_spec = BPF_XBPF;
208 else
209 as_fatal (_("-misa-spec=%s is not valid. Expected v1, v2, v3, v4 o xbpf"),
210 arg);
211 break;
4449c81a 212 case OPTION_XBPF:
b5c37946
SJ
213 /* This is an alias for -misa-spec=xbpf. */
214 isa_spec = BPF_XBPF;
215 break;
216 case OPTION_NO_RELAX:
217 do_relax = 0;
249d4715 218 break;
f8861f5d
JM
219 default:
220 return 0;
221 }
222
223 return 1;
224}
225
226void
227md_show_usage (FILE * stream)
228{
229 fprintf (stream, _("\nBPF options:\n"));
230 fprintf (stream, _("\
b5c37946
SJ
231BPF options:\n\
232 -EL generate code for a little endian machine\n\
233 -EB generate code for a big endian machine\n\
234 -mdialect=DIALECT set the assembly dialect (normal, pseudoc)\n\
235 -misa-spec set the BPF ISA spec (v1, v2, v3, v4, xbpf)\n\
236 -mxbpf alias for -misa-spec=xbpf\n"));
f8861f5d
JM
237}
238
239\f
b5c37946
SJ
240/* This function is called once, at assembler startup time. This
241 should set up all the tables, etc that the MD part of the assembler
242 needs. */
ff5a51b3 243
f8861f5d
JM
244void
245md_begin (void)
246{
f8861f5d
JM
247 /* If not specified in the command line, use the host
248 endianness. */
249 if (!set_target_endian)
250 {
251#ifdef WORDS_BIGENDIAN
252 target_big_endian = 1;
253#else
254 target_big_endian = 0;
255#endif
256 }
257
ff5a51b3
GM
258 /* Ensure that lines can begin with '*' in BPF store pseudoc instruction. */
259 lex_type['*'] |= LEX_BEGIN_NAME;
260
f8861f5d
JM
261 /* Set the machine type. */
262 bfd_default_set_arch_mach (stdoutput, bfd_arch_bpf, bfd_mach_bpf);
263}
264
b5c37946
SJ
265/* Round up a section size to the appropriate boundary. */
266
f8861f5d
JM
267valueT
268md_section_align (segT segment, valueT size)
269{
fd361982 270 int align = bfd_section_alignment (segment);
f8861f5d
JM
271
272 return ((size + (1 << align) - 1) & -(1 << align));
273}
274
b5c37946
SJ
275/* Return non-zero if the indicated VALUE has overflowed the maximum
276 range expressible by an signed number with the indicated number of
277 BITS. */
278
279static bool
280signed_overflow (offsetT value, unsigned bits)
281{
282 offsetT lim;
283 if (bits >= sizeof (offsetT) * 8)
284 return false;
285 lim = (offsetT) 1 << (bits - 1);
286 return (value < -lim || value >= lim);
287}
288
5be1b787
JM
289/* Return non-zero if the two's complement encoding of VALUE would
290 overflow an immediate field of width BITS bits. */
291
292static bool
293immediate_overflow (int64_t value, unsigned bits)
294{
295 if (value < 0)
296 return signed_overflow (value, bits);
297 else
298 {
299 valueT lim;
300
301 if (bits >= sizeof (valueT) * 8)
302 return false;
303
304 lim = (valueT) 1 << bits;
305 return ((valueT) value >= lim);
306 }
307}
308
f8861f5d
JM
309\f
310/* Functions concerning relocs. */
311
312/* The location from which a PC relative jump should be calculated,
313 given a PC relative reloc. */
314
315long
316md_pcrel_from_section (fixS *fixP, segT sec)
317{
318 if (fixP->fx_addsy != (symbolS *) NULL
319 && (! S_IS_DEFINED (fixP->fx_addsy)
320 || (S_GET_SEGMENT (fixP->fx_addsy) != sec)
321 || S_IS_EXTERNAL (fixP->fx_addsy)
322 || S_IS_WEAK (fixP->fx_addsy)))
323 {
324 /* The symbol is undefined (or is defined but not in this section).
325 Let the linker figure it out. */
326 return 0;
327 }
328
329 return fixP->fx_where + fixP->fx_frag->fr_address;
330}
331
332/* Write a value out to the object file, using the appropriate endianness. */
333
334void
335md_number_to_chars (char * buf, valueT val, int n)
336{
337 if (target_big_endian)
338 number_to_chars_bigendian (buf, val, n);
339 else
340 number_to_chars_littleendian (buf, val, n);
341}
342
343arelent *
b5c37946 344tc_gen_reloc (asection *sec ATTRIBUTE_UNUSED, fixS *fixP)
f8861f5d 345{
b5c37946
SJ
346 bfd_reloc_code_real_type r_type = fixP->fx_r_type;
347 arelent *reloc;
348
349 reloc = XNEW (arelent);
350
351 if (fixP->fx_pcrel)
352 {
353 r_type = (r_type == BFD_RELOC_8 ? BFD_RELOC_8_PCREL
354 : r_type == BFD_RELOC_16 ? BFD_RELOC_16_PCREL
355 : r_type == BFD_RELOC_24 ? BFD_RELOC_24_PCREL
356 : r_type == BFD_RELOC_32 ? BFD_RELOC_32_PCREL
357 : r_type == BFD_RELOC_64 ? BFD_RELOC_64_PCREL
358 : r_type);
359 }
360
361 reloc->howto = bfd_reloc_type_lookup (stdoutput, r_type);
362
363 if (reloc->howto == (reloc_howto_type *) NULL)
364 {
365 as_bad_where (fixP->fx_file, fixP->fx_line,
366 _("relocation is not supported"));
367 return NULL;
368 }
369
370 //XXX gas_assert (!fixP->fx_pcrel == !reloc->howto->pc_relative);
371
372 reloc->sym_ptr_ptr = XNEW (asymbol *);
373 *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
374
375 /* Use fx_offset for these cases. */
376 if (fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY
377 || fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT)
378 reloc->addend = fixP->fx_offset;
379 else
380 reloc->addend = fixP->fx_addnumber;
381
382 reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
383 return reloc;
f8861f5d 384}
d218e7fe 385
b5c37946
SJ
386\f
387/* Relaxations supported by this assembler. */
388
389#define RELAX_BRANCH_ENCODE(uncond, constant, length) \
390 ((relax_substateT) \
391 (0xc0000000 \
392 | ((uncond) ? 1 : 0) \
393 | ((constant) ? 2 : 0) \
394 | ((length) << 2)))
395
396#define RELAX_BRANCH_P(i) (((i) & 0xf0000000) == 0xc0000000)
397#define RELAX_BRANCH_LENGTH(i) (((i) >> 2) & 0xff)
398#define RELAX_BRANCH_CONST(i) (((i) & 2) != 0)
399#define RELAX_BRANCH_UNCOND(i) (((i) & 1) != 0)
249d4715 400
b5c37946 401
5be1b787 402/* Compute the length of a branch sequence, and adjust the stored
b5c37946
SJ
403 length accordingly. If FRAG is NULL, the worst-case length is
404 returned. */
405
406static unsigned
407relaxed_branch_length (fragS *fragp, asection *sec, int update)
249d4715 408{
b5c37946
SJ
409 int length, uncond;
410
411 if (!fragp)
412 return 8 * 3;
413
414 uncond = RELAX_BRANCH_UNCOND (fragp->fr_subtype);
415 length = RELAX_BRANCH_LENGTH (fragp->fr_subtype);
416
417 if (uncond)
418 /* Length is the same for both JA and JAL. */
419 length = 8;
420 else
249d4715 421 {
b5c37946
SJ
422 if (RELAX_BRANCH_CONST (fragp->fr_subtype))
423 {
424 int64_t val = fragp->fr_offset;
425
426 if (val < -32768 || val > 32767)
427 length = 8 * 3;
428 else
429 length = 8;
430 }
431 else if (fragp->fr_symbol != NULL
432 && S_IS_DEFINED (fragp->fr_symbol)
433 && !S_IS_WEAK (fragp->fr_symbol)
434 && sec == S_GET_SEGMENT (fragp->fr_symbol))
435 {
436 offsetT val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
437
438 /* Convert to 64-bit words, minus one. */
439 val = (val - 8) / 8;
440
441 /* See if it fits in the signed 16-bits field. */
442 if (val < -32768 || val > 32767)
443 length = 8 * 3;
444 else
445 length = 8;
446 }
447 else
448 /* Use short version, and let the linker relax instead, if
449 appropriate and if supported. */
450 length = 8;
249d4715 451 }
b5c37946
SJ
452
453 if (update)
454 fragp->fr_subtype = RELAX_BRANCH_ENCODE (uncond,
455 RELAX_BRANCH_CONST (fragp->fr_subtype),
456 length);
457
458 return length;
249d4715 459}
b5c37946
SJ
460
461/* Estimate the size of a variant frag before relaxing. */
462
463int
464md_estimate_size_before_relax (fragS *fragp, asection *sec)
465{
466 return (fragp->fr_var = relaxed_branch_length (fragp, sec, true));
467}
468
469/* Read a BPF instruction word from BUF. */
470
471static uint64_t
472read_insn_word (bfd_byte *buf)
473{
474 return bfd_getb64 (buf);
475}
476
477/* Write the given signed 16-bit value in the given BUFFER using the
478 target endianness. */
479
480static void
481encode_int16 (int16_t value, char *buffer)
482{
483 uint16_t val = value;
484
485 if (target_big_endian)
486 {
487 buffer[0] = (val >> 8) & 0xff;
488 buffer[1] = val & 0xff;
489 }
490 else
491 {
492 buffer[1] = (val >> 8) & 0xff;
493 buffer[0] = val & 0xff;
494 }
495}
496
497/* Write the given signed 32-bit value in the given BUFFER using the
498 target endianness. */
499
500static void
501encode_int32 (int32_t value, char *buffer)
502{
503 uint32_t val = value;
504
505 if (target_big_endian)
506 {
507 buffer[0] = (val >> 24) & 0xff;
508 buffer[1] = (val >> 16) & 0xff;
509 buffer[2] = (val >> 8) & 0xff;
510 buffer[3] = val & 0xff;
511 }
512 else
513 {
514 buffer[3] = (val >> 24) & 0xff;
515 buffer[2] = (val >> 16) & 0xff;
516 buffer[1] = (val >> 8) & 0xff;
517 buffer[0] = value & 0xff;
518 }
519}
520
521/* Write a BPF instruction to BUF. */
522
523static void
524write_insn_bytes (bfd_byte *buf, char *bytes)
525{
526 int i;
527
528 for (i = 0; i < 8; ++i)
529 md_number_to_chars ((char *) buf + i, (valueT) bytes[i], 1);
530}
531
f8861f5d
JM
532/* *FRAGP has been relaxed to its final size, and now needs to have
533 the bytes inside it modified to conform to the new size.
534
535 Called after relaxation is finished.
536 fragP->fr_type == rs_machine_dependent.
537 fragP->fr_subtype is the subtype of what the address relaxed to. */
538
539void
540md_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
541 segT sec ATTRIBUTE_UNUSED,
b5c37946 542 fragS *fragp ATTRIBUTE_UNUSED)
f8861f5d 543{
b5c37946
SJ
544 bfd_byte *buf = (bfd_byte *) fragp->fr_literal + fragp->fr_fix;
545 expressionS exp;
546 fixS *fixp;
547 bpf_insn_word word;
548 int disp_is_known = 0;
549 int64_t disp_to_target = 0;
249d4715 550
b5c37946
SJ
551 uint64_t code;
552
553 gas_assert (RELAX_BRANCH_P (fragp->fr_subtype));
554
555 /* Expression to be used in any resulting relocation in the relaxed
556 instructions. */
557 exp.X_op = O_symbol;
558 exp.X_add_symbol = fragp->fr_symbol;
559 exp.X_add_number = fragp->fr_offset;
560
561 gas_assert (fragp->fr_var == RELAX_BRANCH_LENGTH (fragp->fr_subtype));
562
563 /* Read an instruction word from the instruction to be relaxed, and
564 get the code. */
565 word = read_insn_word (buf);
566 code = (word >> 60) & 0xf;
567
568 /* Determine whether the 16-bit displacement to the target is known
569 at this point. */
570 if (RELAX_BRANCH_CONST (fragp->fr_subtype))
571 {
572 disp_to_target = fragp->fr_offset;
573 disp_is_known = 1;
574 }
575 else if (fragp->fr_symbol != NULL
576 && S_IS_DEFINED (fragp->fr_symbol)
577 && !S_IS_WEAK (fragp->fr_symbol)
578 && sec == S_GET_SEGMENT (fragp->fr_symbol))
579 {
580 offsetT val = S_GET_VALUE (fragp->fr_symbol) + fragp->fr_offset;
581 /* Convert to 64-bit blocks minus one. */
582 disp_to_target = (val - 8) / 8;
583 disp_is_known = 1;
584 }
585
586 /* The displacement should fit in a signed 32-bit number. */
587 if (disp_is_known && signed_overflow (disp_to_target, 32))
588 as_bad_where (fragp->fr_file, fragp->fr_line,
589 _("signed instruction operand out of range, shall fit in 32 bits"));
590
591 /* Now relax particular jump instructions. */
592 if (code == BPF_CODE_JA)
593 {
594 /* Unconditional jump.
595 JA d16 -> JAL d32 */
596
597 gas_assert (RELAX_BRANCH_UNCOND (fragp->fr_subtype));
598
599 if (disp_is_known)
600 {
601 if (disp_to_target >= -32768 && disp_to_target <= 32767)
602 {
603 /* 16-bit disp is known and in range. Install a fixup
604 for the disp16 if the branch value is not constant.
605 This will be resolved by the assembler and units
606 converted. */
607
608 if (!RELAX_BRANCH_CONST (fragp->fr_subtype))
609 {
610 /* Install fixup for the JA. */
611 reloc_howto_type *reloc_howto
612 = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_BPF_DISP16);
613 if (!reloc_howto)
614 abort();
615
616 fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
617 bfd_get_reloc_size (reloc_howto),
618 &exp,
619 reloc_howto->pc_relative,
620 BFD_RELOC_BPF_DISP16);
621 fixp->fx_file = fragp->fr_file;
622 fixp->fx_line = fragp->fr_line;
623 }
624 }
625 else
626 {
627 /* 16-bit disp is known and not in range. Turn the JA
628 into a JAL with a 32-bit displacement. */
629 char bytes[8];
630
631 bytes[0] = ((BPF_CLASS_JMP32|BPF_CODE_JA|BPF_SRC_K) >> 56) & 0xff;
632 bytes[1] = (word >> 48) & 0xff;
633 bytes[2] = 0; /* disp16 high */
634 bytes[3] = 0; /* disp16 lo */
635 encode_int32 ((int32_t) disp_to_target, bytes + 4);
636
637 write_insn_bytes (buf, bytes);
638 }
639 }
640 else
641 {
642 /* The displacement to the target is not known. Do not
643 relax. The linker will maybe do it if it chooses to. */
644
645 reloc_howto_type *reloc_howto = NULL;
646
647 gas_assert (!RELAX_BRANCH_CONST (fragp->fr_subtype));
648
649 /* Install fixup for the JA. */
650 reloc_howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_BPF_DISP16);
651 if (!reloc_howto)
652 abort ();
653
654 fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
655 bfd_get_reloc_size (reloc_howto),
656 &exp,
657 reloc_howto->pc_relative,
658 BFD_RELOC_BPF_DISP16);
659 fixp->fx_file = fragp->fr_file;
660 fixp->fx_line = fragp->fr_line;
661 }
662
663 buf += 8;
664 }
665 else
666 {
667 /* Conditional jump.
668 JXX d16 -> JXX +1; JA +1; JAL d32 */
669
670 gas_assert (!RELAX_BRANCH_UNCOND (fragp->fr_subtype));
671
672 if (disp_is_known)
673 {
674 if (disp_to_target >= -32768 && disp_to_target <= 32767)
675 {
676 /* 16-bit disp is known and in range. Install a fixup
677 for the disp16 if the branch value is not constant.
678 This will be resolved by the assembler and units
679 converted. */
680
681 if (!RELAX_BRANCH_CONST (fragp->fr_subtype))
682 {
683 /* Install fixup for the branch. */
684 reloc_howto_type *reloc_howto
685 = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_BPF_DISP16);
686 if (!reloc_howto)
687 abort();
688
689 fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
690 bfd_get_reloc_size (reloc_howto),
691 &exp,
692 reloc_howto->pc_relative,
693 BFD_RELOC_BPF_DISP16);
694 fixp->fx_file = fragp->fr_file;
695 fixp->fx_line = fragp->fr_line;
696 }
697
698 buf += 8;
699 }
700 else
701 {
702 /* 16-bit disp is known and not in range. Turn the JXX
703 into a sequence JXX +1; JA +1; JAL d32. */
704
705 char bytes[8];
706
707 /* First, set the 16-bit offset in the current
708 instruction to 1. */
709
710 if (target_big_endian)
711 bfd_putb16 (1, buf + 2);
712 else
713 bfd_putl16 (1, buf + 2);
714 buf += 8;
715
716 /* Then, write the JA + 1 */
717
718 bytes[0] = 0x05; /* JA */
719 bytes[1] = 0x0;
720 encode_int16 (1, bytes + 2);
721 bytes[4] = 0x0;
722 bytes[5] = 0x0;
723 bytes[6] = 0x0;
724 bytes[7] = 0x0;
725 write_insn_bytes (buf, bytes);
726 buf += 8;
727
728 /* Finally, write the JAL to the target. */
729
730 bytes[0] = ((BPF_CLASS_JMP32|BPF_CODE_JA|BPF_SRC_K) >> 56) & 0xff;
731 bytes[1] = 0;
732 bytes[2] = 0;
733 bytes[3] = 0;
734 encode_int32 ((int32_t) disp_to_target, bytes + 4);
735 write_insn_bytes (buf, bytes);
736 buf += 8;
737 }
738 }
739 else
740 {
741 /* The displacement to the target is not known. Do not
742 relax. The linker will maybe do it if it chooses to. */
743
744 reloc_howto_type *reloc_howto = NULL;
745
746 gas_assert (!RELAX_BRANCH_CONST (fragp->fr_subtype));
747
748 /* Install fixup for the conditional jump. */
749 reloc_howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_BPF_DISP16);
750 if (!reloc_howto)
751 abort ();
752
753 fixp = fix_new_exp (fragp, buf - (bfd_byte *) fragp->fr_literal,
754 bfd_get_reloc_size (reloc_howto),
755 &exp,
756 reloc_howto->pc_relative,
757 BFD_RELOC_BPF_DISP16);
758 fixp->fx_file = fragp->fr_file;
759 fixp->fx_line = fragp->fr_line;
760 buf += 8;
761 }
762 }
763
764 gas_assert (buf == (bfd_byte *)fragp->fr_literal
765 + fragp->fr_fix + fragp->fr_var);
766
767 fragp->fr_fix += fragp->fr_var;
f8861f5d
JM
768}
769
770\f
b5c37946
SJ
771/* Apply a fixS (fixup of an instruction or data that we didn't have
772 enough info to complete immediately) to the data in a frag. */
773
f8861f5d 774void
b5c37946 775md_apply_fix (fixS *fixP, valueT *valP, segT seg ATTRIBUTE_UNUSED)
f8861f5d 776{
b5c37946
SJ
777 char *where = fixP->fx_frag->fr_literal + fixP->fx_where;
778
779 switch (fixP->fx_r_type)
f8861f5d 780 {
b5c37946
SJ
781 case BFD_RELOC_BPF_DISP16:
782 /* Convert from bytes to number of 64-bit words to the target,
783 minus one. */
784 *valP = (((long) (*valP)) - 8) / 8;
785 break;
786 case BFD_RELOC_BPF_DISPCALL32:
787 case BFD_RELOC_BPF_DISP32:
788 /* Convert from bytes to number of 64-bit words to the target,
789 minus one. */
790 *valP = (((long) (*valP)) - 8) / 8;
c2ca88d7 791
b5c37946 792 if (fixP->fx_r_type == BFD_RELOC_BPF_DISPCALL32)
c2ca88d7
JM
793 {
794 /* eBPF supports two kind of CALL instructions: the so
795 called pseudo calls ("bpf to bpf") and external calls
796 ("bpf to kernel").
797
798 Both kind of calls use the same instruction (CALL).
799 However, external calls are constructed by passing a
800 constant argument to the instruction, whereas pseudo
801 calls result from expressions involving symbols. In
802 practice, instructions requiring a fixup are interpreted
803 as pseudo-calls. If we are executing this code, this is
804 a pseudo call.
805
806 The kernel expects for pseudo-calls to be annotated by
807 having BPF_PSEUDO_CALL in the SRC field of the
808 instruction. But beware the infamous nibble-swapping of
809 eBPF and take endianness into account here.
810
811 Note that the CALL instruction has only one operand, so
812 this code is executed only once per instruction. */
b5c37946 813 md_number_to_chars (where + 1, target_big_endian ? 0x01 : 0x10, 1);
675b9d61 814 }
b5c37946
SJ
815 break;
816 case BFD_RELOC_16_PCREL:
817 /* Convert from bytes to number of 64-bit words to the target,
818 minus one. */
819 *valP = (((long) (*valP)) - 8) / 8;
820 break;
821 default:
822 break;
f8861f5d
JM
823 }
824
b5c37946
SJ
825 if (fixP->fx_addsy == (symbolS *) NULL)
826 fixP->fx_done = 1;
249d4715 827
b5c37946
SJ
828 if (fixP->fx_done)
829 {
830 /* We're finished with this fixup. Install it because
831 bfd_install_relocation won't be called to do it. */
832 switch (fixP->fx_r_type)
833 {
834 case BFD_RELOC_8:
835 md_number_to_chars (where, *valP, 1);
836 break;
837 case BFD_RELOC_16:
838 md_number_to_chars (where, *valP, 2);
839 break;
840 case BFD_RELOC_32:
841 md_number_to_chars (where, *valP, 4);
842 break;
843 case BFD_RELOC_64:
844 md_number_to_chars (where, *valP, 8);
845 break;
846 case BFD_RELOC_BPF_DISP16:
847 md_number_to_chars (where + 2, (uint16_t) *valP, 2);
848 break;
849 case BFD_RELOC_BPF_DISP32:
850 case BFD_RELOC_BPF_DISPCALL32:
851 md_number_to_chars (where + 4, (uint32_t) *valP, 4);
852 break;
853 case BFD_RELOC_16_PCREL:
854 md_number_to_chars (where + 2, (uint32_t) *valP, 2);
855 break;
856 default:
857 as_bad_where (fixP->fx_file, fixP->fx_line,
858 _("internal error: can't install fix for reloc type %d (`%s')"),
859 fixP->fx_r_type, bfd_get_reloc_code_name (fixP->fx_r_type));
860 break;
861 }
862 }
249d4715 863
b5c37946
SJ
864 /* Tuck `value' away for use by tc_gen_reloc.
865 See the comment describing fx_addnumber in write.h.
866 This field is misnamed (or misused :-). */
867 fixP->fx_addnumber = *valP;
675b9d61
NC
868}
869
b5c37946
SJ
870\f
871/* Instruction writing routines. */
249d4715 872
b5c37946
SJ
873/* Encode a BPF instruction in the given buffer BYTES. Non-constant
874 immediates are encoded as zeroes. */
249d4715 875
b5c37946 876static void
5be1b787
JM
877encode_insn (struct bpf_insn *insn, char *bytes,
878 int relaxed ATTRIBUTE_UNUSED)
675b9d61 879{
b5c37946 880 uint8_t src, dst;
249d4715 881
b5c37946
SJ
882 /* Zero all the bytes. */
883 memset (bytes, 0, 16);
884
885 /* First encode the opcodes. Note that we have to handle the
886 endianness groups of the BPF instructions: 8 | 4 | 4 | 16 |
887 32. */
888 if (target_big_endian)
675b9d61 889 {
b5c37946
SJ
890 /* code */
891 bytes[0] = (insn->opcode >> 56) & 0xff;
892 /* regs */
893 bytes[1] = (insn->opcode >> 48) & 0xff;
894 /* offset16 */
895 bytes[2] = (insn->opcode >> 40) & 0xff;
896 bytes[3] = (insn->opcode >> 32) & 0xff;
897 /* imm32 */
898 bytes[4] = (insn->opcode >> 24) & 0xff;
899 bytes[5] = (insn->opcode >> 16) & 0xff;
900 bytes[6] = (insn->opcode >> 8) & 0xff;
901 bytes[7] = insn->opcode & 0xff;
902 }
249d4715 903 else
b5c37946
SJ
904 {
905 /* code */
906 bytes[0] = (insn->opcode >> 56) & 0xff;
907 /* regs */
908 bytes[1] = (((((insn->opcode >> 48) & 0xff) & 0xf) << 4)
909 | (((insn->opcode >> 48) & 0xff) & 0xf));
910 /* offset16 */
911 bytes[3] = (insn->opcode >> 40) & 0xff;
912 bytes[2] = (insn->opcode >> 32) & 0xff;
913 /* imm32 */
914 bytes[7] = (insn->opcode >> 24) & 0xff;
915 bytes[6] = (insn->opcode >> 16) & 0xff;
916 bytes[5] = (insn->opcode >> 8) & 0xff;
917 bytes[4] = insn->opcode & 0xff;
918 }
249d4715 919
b5c37946
SJ
920 /* Now the registers. */
921 src = insn->has_src ? insn->src : 0;
922 dst = insn->has_dst ? insn->dst : 0;
923
924 if (target_big_endian)
925 bytes[1] = ((dst & 0xf) << 4) | (src & 0xf);
675b9d61 926 else
b5c37946 927 bytes[1] = ((src & 0xf) << 4) | (dst & 0xf);
249d4715 928
b5c37946 929 /* Now the immediates that are known to be constant. */
03460429 930
b5c37946
SJ
931 if (insn->has_imm32 && insn->imm32.X_op == O_constant)
932 {
933 int64_t imm = insn->imm32.X_add_number;
249d4715 934
5be1b787
JM
935 if (immediate_overflow (imm, 32))
936 as_bad (_("immediate out of range, shall fit in 32 bits"));
b5c37946
SJ
937 else
938 encode_int32 (insn->imm32.X_add_number, bytes + 4);
939 }
940
941 if (insn->has_disp32 && insn->disp32.X_op == O_constant)
03460429 942 {
b5c37946 943 int64_t disp = insn->disp32.X_add_number;
249d4715 944
5be1b787
JM
945 if (immediate_overflow (disp, 32))
946 as_bad (_("pc-relative offset out of range, shall fit in 32 bits"));
b5c37946
SJ
947 else
948 encode_int32 (insn->disp32.X_add_number, bytes + 4);
949 }
03460429 950
b5c37946
SJ
951 if (insn->has_offset16 && insn->offset16.X_op == O_constant)
952 {
953 int64_t offset = insn->offset16.X_add_number;
249d4715 954
5be1b787
JM
955 if (immediate_overflow (offset, 16))
956 as_bad (_("pc-relative offset out of range, shall fit in 16 bits"));
b5c37946
SJ
957 else
958 encode_int16 (insn->offset16.X_add_number, bytes + 2);
959 }
03460429 960
b5c37946
SJ
961 if (insn->has_disp16 && insn->disp16.X_op == O_constant)
962 {
963 int64_t disp = insn->disp16.X_add_number;
964
5be1b787
JM
965 if (immediate_overflow (disp, 16))
966 as_bad (_("pc-relative offset out of range, shall fit in 16 bits"));
b5c37946
SJ
967 else
968 encode_int16 (insn->disp16.X_add_number, bytes + 2);
969 }
249d4715 970
b5c37946
SJ
971 if (insn->has_imm64 && insn->imm64.X_op == O_constant)
972 {
973 uint64_t imm64 = insn->imm64.X_add_number;
249d4715 974
b5c37946
SJ
975 if (target_big_endian)
976 {
977 bytes[12] = (imm64 >> 56) & 0xff;
978 bytes[13] = (imm64 >> 48) & 0xff;
979 bytes[14] = (imm64 >> 40) & 0xff;
980 bytes[15] = (imm64 >> 32) & 0xff;
981 bytes[4] = (imm64 >> 24) & 0xff;
982 bytes[5] = (imm64 >> 16) & 0xff;
983 bytes[6] = (imm64 >> 8) & 0xff;
984 bytes[7] = imm64 & 0xff;
985 }
986 else
987 {
988 bytes[15] = (imm64 >> 56) & 0xff;
989 bytes[14] = (imm64 >> 48) & 0xff;
990 bytes[13] = (imm64 >> 40) & 0xff;
991 bytes[12] = (imm64 >> 32) & 0xff;
992 bytes[7] = (imm64 >> 24) & 0xff;
993 bytes[6] = (imm64 >> 16) & 0xff;
994 bytes[5] = (imm64 >> 8) & 0xff;
995 bytes[4] = imm64 & 0xff;
996 }
997 }
249d4715
JM
998}
999
b5c37946
SJ
1000/* Install the fixups in INSN in their proper location in the
1001 specified FRAG at the location pointed by WHERE. */
1002
1003static void
1004install_insn_fixups (struct bpf_insn *insn, fragS *frag, long where)
249d4715 1005{
b5c37946 1006 if (insn->has_imm64)
249d4715 1007 {
b5c37946
SJ
1008 switch (insn->imm64.X_op)
1009 {
1010 case O_symbol:
1011 case O_subtract:
1012 case O_add:
1013 {
1014 reloc_howto_type *reloc_howto;
1015 int size;
1016
1017 reloc_howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_BPF_64);
1018 if (!reloc_howto)
1019 abort ();
1020
1021 size = bfd_get_reloc_size (reloc_howto);
1022
1023 fix_new_exp (frag, where,
1024 size, &insn->imm64, reloc_howto->pc_relative,
1025 BFD_RELOC_BPF_64);
1026 break;
1027 }
1028 case O_constant:
1029 /* Already handled in encode_insn. */
1030 break;
1031 default:
1032 abort ();
1033 }
1034 }
249d4715 1035
b5c37946
SJ
1036 if (insn->has_imm32)
1037 {
1038 switch (insn->imm32.X_op)
1039 {
1040 case O_symbol:
1041 case O_subtract:
1042 case O_add:
1043 case O_uminus:
1044 {
1045 reloc_howto_type *reloc_howto;
1046 int size;
1047
1048 reloc_howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
1049 if (!reloc_howto)
1050 abort ();
1051
1052 size = bfd_get_reloc_size (reloc_howto);
1053
1054 fix_new_exp (frag, where + 4,
1055 size, &insn->imm32, reloc_howto->pc_relative,
1056 BFD_RELOC_32);
1057 break;
1058 }
1059 case O_constant:
1060 /* Already handled in encode_insn. */
1061 break;
1062 default:
1063 abort ();
1064 }
1065 }
249d4715 1066
b5c37946
SJ
1067 if (insn->has_disp32)
1068 {
1069 switch (insn->disp32.X_op)
1070 {
1071 case O_symbol:
1072 case O_subtract:
1073 case O_add:
1074 {
1075 reloc_howto_type *reloc_howto;
1076 int size;
1077 unsigned int bfd_reloc
1078 = (insn->id == BPF_INSN_CALL
1079 ? BFD_RELOC_BPF_DISPCALL32
1080 : BFD_RELOC_BPF_DISP32);
1081
1082 reloc_howto = bfd_reloc_type_lookup (stdoutput, bfd_reloc);
1083 if (!reloc_howto)
1084 abort ();
1085
1086 size = bfd_get_reloc_size (reloc_howto);
1087
1088 fix_new_exp (frag, where,
1089 size, &insn->disp32, reloc_howto->pc_relative,
1090 bfd_reloc);
1091 break;
1092 }
1093 case O_constant:
1094 /* Already handled in encode_insn. */
1095 break;
1096 default:
1097 abort ();
1098 }
1099 }
249d4715 1100
b5c37946
SJ
1101 if (insn->has_offset16)
1102 {
1103 switch (insn->offset16.X_op)
1104 {
1105 case O_symbol:
1106 case O_subtract:
1107 case O_add:
1108 {
1109 reloc_howto_type *reloc_howto;
1110 int size;
1111
1112 /* XXX we really need a new pc-rel offset in bytes
1113 relocation for this. */
1114 reloc_howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_BPF_DISP16);
1115 if (!reloc_howto)
1116 abort ();
1117
1118 size = bfd_get_reloc_size (reloc_howto);
1119
1120 fix_new_exp (frag, where,
1121 size, &insn->offset16, reloc_howto->pc_relative,
1122 BFD_RELOC_BPF_DISP16);
1123 break;
1124 }
1125 case O_constant:
1126 /* Already handled in encode_insn. */
1127 break;
1128 default:
1129 abort ();
1130 }
1131 }
249d4715 1132
b5c37946
SJ
1133 if (insn->has_disp16)
1134 {
1135 switch (insn->disp16.X_op)
1136 {
1137 case O_symbol:
1138 case O_subtract:
1139 case O_add:
1140 {
1141 reloc_howto_type *reloc_howto;
1142 int size;
1143
1144 reloc_howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_BPF_DISP16);
1145 if (!reloc_howto)
1146 abort ();
1147
1148 size = bfd_get_reloc_size (reloc_howto);
1149
1150 fix_new_exp (frag, where,
1151 size, &insn->disp16, reloc_howto->pc_relative,
1152 BFD_RELOC_BPF_DISP16);
1153 break;
1154 }
1155 case O_constant:
1156 /* Already handled in encode_insn. */
1157 break;
1158 default:
1159 abort ();
1160 }
1161 }
249d4715 1162
b5c37946 1163}
249d4715 1164
b5c37946 1165/* Add a new insn to the list of instructions. */
249d4715 1166
b5c37946
SJ
1167static void
1168add_fixed_insn (struct bpf_insn *insn)
1169{
1170 char *this_frag = frag_more (insn->size);
1171 char bytes[16];
1172 int i;
675b9d61 1173
b5c37946
SJ
1174 /* First encode the known parts of the instruction, including
1175 opcodes and constant immediates, and write them to the frag. */
1176 encode_insn (insn, bytes, 0 /* relax */);
1177 for (i = 0; i < insn->size; ++i)
1178 md_number_to_chars (this_frag + i, (valueT) bytes[i], 1);
249d4715 1179
b5c37946
SJ
1180 /* Now install the instruction fixups. */
1181 install_insn_fixups (insn, frag_now,
1182 this_frag - frag_now->fr_literal);
1183}
249d4715 1184
b5c37946 1185/* Add a new relaxable to the list of instructions. */
675b9d61 1186
b5c37946
SJ
1187static void
1188add_relaxed_insn (struct bpf_insn *insn, expressionS *exp)
1189{
1190 char bytes[16];
1191 int i;
1192 char *this_frag;
1193 unsigned worst_case = relaxed_branch_length (NULL, NULL, 0);
1194 unsigned best_case = insn->size;
1195
1196 /* We only support relaxing branches, for the moment. */
1197 relax_substateT subtype
1198 = RELAX_BRANCH_ENCODE (insn->id == BPF_INSN_JAR,
1199 exp->X_op == O_constant,
1200 worst_case);
1201
1202 frag_grow (worst_case);
1203 this_frag = frag_more (0);
1204
1205 /* First encode the known parts of the instruction, including
1206 opcodes and constant immediates, and write them to the frag. */
1207 encode_insn (insn, bytes, 1 /* relax */);
1208 for (i = 0; i < insn->size; ++i)
1209 md_number_to_chars (this_frag + i, (valueT) bytes[i], 1);
1210
1211 /* Note that instruction fixups will be applied once the frag is
1212 relaxed, in md_convert_frag. */
1213 frag_var (rs_machine_dependent,
1214 worst_case, best_case,
1215 subtype, exp->X_add_symbol, exp->X_add_number /* offset */,
1216 NULL);
249d4715
JM
1217}
1218
b5c37946
SJ
1219\f
1220/* Parse an operand expression. Returns the first character that is
1221 not part of the expression, or NULL in case of parse error.
ff5a51b3 1222
b5c37946 1223 See md_operand below to see how exp_parse_failed is used. */
ff5a51b3 1224
b5c37946 1225static int exp_parse_failed = 0;
ff5a51b3 1226
b5c37946
SJ
1227static char *
1228parse_expression (char *s, expressionS *exp)
1229{
1230 char *saved_input_line_pointer = input_line_pointer;
1231 char *saved_s = s;
ff5a51b3 1232
b5c37946
SJ
1233 exp_parse_failed = 0;
1234 input_line_pointer = s;
1235 expression (exp);
1236 s = input_line_pointer;
1237 input_line_pointer = saved_input_line_pointer;
ff5a51b3 1238
b5c37946
SJ
1239 switch (exp->X_op == O_absent || exp_parse_failed)
1240 return NULL;
ff5a51b3 1241
b5c37946
SJ
1242 /* The expression parser may consume trailing whitespaces. We have
1243 to undo that since the instruction templates may be expecting
1244 these whitespaces. */
1245 {
1246 char *p;
1247 for (p = s - 1; p >= saved_s && *p == ' '; --p)
1248 --s;
1249 }
ff5a51b3 1250
b5c37946
SJ
1251 return s;
1252}
ff5a51b3 1253
b5c37946
SJ
1254/* Parse a BPF register name and return the corresponding register
1255 number. Return NULL in case of parse error, or a pointer to the
1256 first character in S that is not part of the register name. */
ff5a51b3 1257
d218e7fe 1258static char *
b5c37946 1259parse_bpf_register (char *s, char rw, uint8_t *regno)
ff5a51b3 1260{
b5c37946 1261 if (asm_dialect == DIALECT_NORMAL)
ff5a51b3 1262 {
b5c37946
SJ
1263 rw = 'r';
1264 if (*s != '%')
1265 return NULL;
1266 s += 1;
ff5a51b3 1267
b5c37946 1268 if (*s == 'f' && *(s + 1) == 'p')
675b9d61 1269 {
b5c37946
SJ
1270 *regno = 10;
1271 s += 2;
1272 return s;
1273 }
1274 }
ff5a51b3 1275
b5c37946
SJ
1276 if (*s != rw)
1277 return NULL;
1278 s += 1;
ff5a51b3 1279
b5c37946
SJ
1280 if (*s == '1')
1281 {
1282 if (*(s + 1) == '0')
1283 {
1284 *regno = 10;
1285 s += 2;
1286 }
1287 else
1288 {
1289 *regno = 1;
1290 s += 1;
1291 }
1292 }
1293 else if (*s >= '0' && *s <= '9')
1294 {
1295 *regno = *s - '0';
1296 s += 1;
1297 }
ff5a51b3 1298
b5c37946
SJ
1299 return s;
1300}
ff5a51b3 1301
b5c37946 1302/* Collect a parse error message. */
ff5a51b3 1303
b5c37946
SJ
1304static int partial_match_length = 0;
1305static char *errmsg = NULL;
ff5a51b3 1306
b5c37946
SJ
1307static void
1308parse_error (int length, const char *fmt, ...)
1309{
1310 if (length > partial_match_length)
1311 {
1312 va_list args;
ff5a51b3 1313
b5c37946
SJ
1314 free (errmsg);
1315 va_start (args, fmt);
1316 errmsg = xvasprintf (fmt, args);
1317 va_end (args);
1318 partial_match_length = length;
1319 }
1320}
ff5a51b3 1321
b5c37946
SJ
1322/* Assemble a machine instruction in STR and emit the frags/bytes it
1323 assembles to. */
d218e7fe 1324
b5c37946
SJ
1325void
1326md_assemble (char *str ATTRIBUTE_UNUSED)
1327{
1328 /* There are two different syntaxes that can be used to write BPF
1329 instructions. One is very conventional and like any other
1330 assembly language where each instruction is conformed by an
1331 instruction mnemonic followed by its operands. This is what we
1332 call the "normal" syntax. The other syntax tries to look like C
1333 statements. We have to support both syntaxes in this assembler.
1334
1335 One of the many nuisances introduced by this eccentricity is that
1336 in the pseudo-c syntax it is not possible to hash the opcodes
1337 table by instruction mnemonic, because there is none. So we have
1338 no other choice than to try to parse all instruction opcodes
1339 until one matches. This is slow.
1340
1341 Another problem is that emitting detailed diagnostics becomes
1342 tricky, since the lack of mnemonic means it is not clear what
1343 instruction was intended by the user, and we cannot emit
1344 diagnostics for every attempted template. So if an instruction
1345 is not parsed, we report the diagnostic corresponding to the
1346 partially parsed instruction that was matched further. */
1347
1348 unsigned int idx = 0;
1349 struct bpf_insn insn;
1350 const struct bpf_opcode *opcode;
1351
1352 /* Initialize the global diagnostic variables. See the parse_error
1353 function above. */
1354 partial_match_length = 0;
1355 errmsg = NULL;
1356
1357#define PARSE_ERROR(...) parse_error (s - str, __VA_ARGS__)
1358
1359 while ((opcode = bpf_get_opcode (idx++)) != NULL)
1360 {
1361 const char *p;
1362 char *s;
1363 const char *template
1364 = (asm_dialect == DIALECT_PSEUDOC ? opcode->pseudoc : opcode->normal);
1365
1366 /* Do not try to match opcodes with a higher version than the
1367 selected ISA spec. */
1368 if (opcode->version > isa_spec)
1369 continue;
1370
1371 memset (&insn, 0, sizeof (struct bpf_insn));
1372 insn.size = 8;
1373 for (s = str, p = template; *p != '\0';)
1374 {
1375 if (*p == ' ')
1376 {
1377 /* Expect zero or more spaces. */
1378 while (*s != '\0' && (*s == ' ' || *s == '\t'))
1379 s += 1;
1380 p += 1;
1381 }
1382 else if (*p == '%')
1383 {
1384 if (*(p + 1) == '%')
1385 {
1386 if (*s != '%')
1387 {
1388 PARSE_ERROR ("expected '%%'");
1389 break;
1390 }
1391 p += 2;
1392 s += 1;
1393 }
1394 else if (*(p + 1) == 'w')
1395 {
1396 /* Expect zero or more spaces. */
1397 while (*s != '\0' && (*s == ' ' || *s == '\t'))
1398 s += 1;
1399 p += 2;
1400 }
1401 else if (*(p + 1) == 'W')
1402 {
1403 /* Expect one or more spaces. */
1404 if (*s != ' ' && *s != '\t')
1405 {
1406 PARSE_ERROR ("expected white space, got '%s'",
1407 s);
1408 break;
1409 }
1410 while (*s != '\0' && (*s == ' ' || *s == '\t'))
1411 s += 1;
1412 p += 2;
1413 }
1414 else if (strncmp (p, "%dr", 3) == 0)
1415 {
1416 uint8_t regno;
1417 char *news = parse_bpf_register (s, 'r', &regno);
1418
1419 if (news == NULL || (insn.has_dst && regno != insn.dst))
1420 {
1421 if (news != NULL)
1422 PARSE_ERROR ("expected register r%d, got r%d",
1423 insn.dst, regno);
1424 else
1425 PARSE_ERROR ("expected register name, got '%s'", s);
1426 break;
1427 }
1428 s = news;
1429 insn.dst = regno;
1430 insn.has_dst = 1;
1431 p += 3;
1432 }
1433 else if (strncmp (p, "%sr", 3) == 0)
1434 {
1435 uint8_t regno;
1436 char *news = parse_bpf_register (s, 'r', &regno);
1437
1438 if (news == NULL || (insn.has_src && regno != insn.src))
1439 {
1440 if (news != NULL)
1441 PARSE_ERROR ("expected register r%d, got r%d",
1442 insn.dst, regno);
1443 else
1444 PARSE_ERROR ("expected register name, got '%s'", s);
1445 break;
1446 }
1447 s = news;
1448 insn.src = regno;
1449 insn.has_src = 1;
1450 p += 3;
1451 }
1452 else if (strncmp (p, "%dw", 3) == 0)
1453 {
1454 uint8_t regno;
1455 char *news = parse_bpf_register (s, 'w', &regno);
1456
1457 if (news == NULL || (insn.has_dst && regno != insn.dst))
1458 {
1459 if (news != NULL)
1460 PARSE_ERROR ("expected register r%d, got r%d",
1461 insn.dst, regno);
1462 else
1463 PARSE_ERROR ("expected register name, got '%s'", s);
1464 break;
1465 }
1466 s = news;
1467 insn.dst = regno;
1468 insn.has_dst = 1;
1469 p += 3;
1470 }
1471 else if (strncmp (p, "%sw", 3) == 0)
1472 {
1473 uint8_t regno;
1474 char *news = parse_bpf_register (s, 'w', &regno);
1475
1476 if (news == NULL || (insn.has_src && regno != insn.src))
1477 {
1478 if (news != NULL)
1479 PARSE_ERROR ("expected register r%d, got r%d",
1480 insn.dst, regno);
1481 else
1482 PARSE_ERROR ("expected register name, got '%s'", s);
1483 break;
1484 }
1485 s = news;
1486 insn.src = regno;
1487 insn.has_src = 1;
1488 p += 3;
1489 }
1490 else if (strncmp (p, "%i32", 4) == 0
1491 || strncmp (p, "%I32", 4) == 0)
1492 {
1493 if (p[1] == 'I')
1494 {
1495 while (*s == ' ' || *s == '\t')
1496 s += 1;
1497 if (*s != '+' && *s != '-')
1498 {
1499 PARSE_ERROR ("expected `+' or `-', got `%c'", *s);
1500 break;
1501 }
1502 }
1503
1504 s = parse_expression (s, &insn.imm32);
1505 if (s == NULL)
1506 {
1507 PARSE_ERROR ("expected signed 32-bit immediate");
1508 break;
1509 }
1510 insn.has_imm32 = 1;
1511 p += 4;
1512 }
1513 else if (strncmp (p, "%o16", 4) == 0)
1514 {
1515 while (*s == ' ' || *s == '\t')
1516 s += 1;
1517 if (*s != '+' && *s != '-')
1518 {
1519 PARSE_ERROR ("expected `+' or `-', got `%c'", *s);
1520 break;
1521 }
1522
1523 s = parse_expression (s, &insn.offset16);
1524 if (s == NULL)
1525 {
1526 PARSE_ERROR ("expected signed 16-bit offset");
1527 break;
1528 }
1529 insn.has_offset16 = 1;
1530 p += 4;
1531 }
1532 else if (strncmp (p, "%d16", 4) == 0)
1533 {
1534 s = parse_expression (s, &insn.disp16);
1535 if (s == NULL)
1536 {
1537 PARSE_ERROR ("expected signed 16-bit displacement");
1538 break;
1539 }
1540 insn.has_disp16 = 1;
5be1b787 1541 insn.is_relaxable = (insn.disp16.X_op != O_constant);
b5c37946
SJ
1542 p += 4;
1543 }
1544 else if (strncmp (p, "%d32", 4) == 0)
1545 {
1546 s = parse_expression (s, &insn.disp32);
1547 if (s == NULL)
1548 {
1549 PARSE_ERROR ("expected signed 32-bit displacement");
1550 break;
1551 }
1552 insn.has_disp32 = 1;
1553 p += 4;
1554 }
1555 else if (strncmp (p, "%i64", 4) == 0)
1556 {
1557 s = parse_expression (s, &insn.imm64);
1558 if (s == NULL)
1559 {
1560 PARSE_ERROR ("expected signed 64-bit immediate");
1561 break;
1562 }
1563 insn.has_imm64 = 1;
1564 insn.size = 16;
1565 p += 4;
1566 }
1567 else
1568 as_fatal (_("invalid %%-tag in BPF opcode '%s'\n"), template);
1569 }
1570 else
1571 {
1572 /* Match a literal character. */
1573 if (*s != *p)
1574 {
1575 if (*s == '\0')
1576 PARSE_ERROR ("expected '%c'", *p);
1577 else if (*s == '%')
1578 {
1579 /* This is to workaround a bug in as_bad. */
1580 char tmp[3];
1581
1582 tmp[0] = '%';
1583 tmp[1] = '%';
1584 tmp[2] = '\0';
1585
1586 PARSE_ERROR ("expected '%c', got '%s'", *p, tmp);
1587 }
1588 else
1589 PARSE_ERROR ("expected '%c', got '%c'", *p, *s);
1590 break;
1591 }
1592 p += 1;
1593 s += 1;
1594 }
1595 }
d218e7fe 1596
b5c37946
SJ
1597 if (*p == '\0')
1598 {
1599 /* Allow white spaces at the end of the line. */
1600 while (*s != '\0' && (*s == ' ' || *s == '\t'))
1601 s += 1;
1602 if (*s == '\0')
1603 /* We parsed an instruction successfully. */
1604 break;
1605 PARSE_ERROR ("extra junk at end of line");
1606 }
249d4715 1607 }
ff5a51b3 1608
b5c37946
SJ
1609 if (opcode == NULL)
1610 {
1611 as_bad (_("unrecognized instruction `%s'"), str);
1612 if (errmsg != NULL)
1613 {
1614 as_bad ("%s", errmsg);
1615 free (errmsg);
1616 }
675b9d61 1617
b5c37946
SJ
1618 return;
1619 }
1620 insn.id = opcode->id;
1621 insn.opcode = opcode->opcode;
ff5a51b3 1622
b5c37946 1623#undef PARSE_ERROR
675b9d61 1624
b5c37946
SJ
1625 /* Generate the frags and fixups for the parsed instruction. */
1626 if (do_relax && isa_spec >= BPF_V4 && insn.is_relaxable)
675b9d61 1627 {
b5c37946 1628 expressionS *relaxable_exp = NULL;
675b9d61 1629
b5c37946
SJ
1630 if (insn.has_disp16)
1631 relaxable_exp = &insn.disp16;
1632 else
1633 abort ();
1634
1635 add_relaxed_insn (&insn, relaxable_exp);
675b9d61 1636 }
b5c37946
SJ
1637 else
1638 add_fixed_insn (&insn);
675b9d61 1639
b5c37946
SJ
1640 /* Emit DWARF2 debugging information. */
1641 dwarf2_emit_insn (insn.size);
675b9d61 1642}
f8861f5d 1643
b5c37946
SJ
1644/* Parse an operand that is machine-specific. */
1645
f8861f5d
JM
1646void
1647md_operand (expressionS *expressionP)
1648{
b5c37946 1649 /* If this hook is invoked it means GAS failed to parse a generic
e3e1e123
JM
1650 expression. We should inhibit the as_bad in expr.c, so we can
1651 fail while parsing instruction alternatives. To do that, we
1652 change the expression to not have an O_absent. But then we also
1653 need to set exp_parse_failed to parse_expression above does the
1654 right thing. */
b5c37946
SJ
1655 ++input_line_pointer;
1656 expressionP->X_op = O_constant;
1657 expressionP->X_add_number = 0;
1658 exp_parse_failed = 1;
f8861f5d
JM
1659}
1660
f8861f5d
JM
1661symbolS *
1662md_undefined_symbol (char *name ATTRIBUTE_UNUSED)
1663{
1664 return NULL;
1665}
1666
1667\f
1668/* Turn a string in input_line_pointer into a floating point constant
1669 of type TYPE, and store the appropriate bytes in *LITP. The number
1670 of LITTLENUMS emitted is stored in *SIZEP. An error message is
1671 returned, or NULL on OK. */
1672
1673const char *
1674md_atof (int type, char *litP, int *sizeP)
1675{
5b7c81bd 1676 return ieee_md_atof (type, litP, sizeP, false);
f8861f5d 1677}
b5c37946
SJ
1678
1679\f
1680/* Determine whether the equal sign in the given string corresponds to
1681 a BPF instruction, i.e. when it is not to be considered a symbol
1682 assignment. */
1683
1684bool
1685bpf_tc_equal_in_insn (int c ATTRIBUTE_UNUSED, char *str ATTRIBUTE_UNUSED)
1686{
1687 uint8_t regno;
1688
1689 /* Only pseudo-c instructions can have equal signs, and of these,
1690 all that could be confused with a symbol assignment all start
1691 with a register name. */
1692 if (asm_dialect == DIALECT_PSEUDOC)
1693 {
1694 char *w = parse_bpf_register (str, 'w', &regno);
1695 char *r = parse_bpf_register (str, 'r', &regno);
1696
1697 if ((w != NULL && *w == '\0')
1698 || (r != NULL && *r == '\0'))
1699 return 1;
1700 }
1701
1702 return 0;
1703}
1704
1705/* Some special processing for a BPF ELF file. */
1706
1707void
1708bpf_elf_final_processing (void)
1709{
1710 /* Annotate the BPF ISA version in the ELF flag bits. */
1711 elf_elfheader (stdoutput)->e_flags |= (isa_spec & EF_BPF_CPUVER);
1712}