2019-05-24 01:05:12 +08:00
|
|
|
/* tc-bpf.h -- Header file for tc-ebpf.c.
|
2024-01-04 19:52:08 +08:00
|
|
|
Copyright (C) 2019-2024 Free Software Foundation, Inc.
|
2019-05-24 01:05:12 +08:00
|
|
|
Contributed by Oracle, Inc.
|
|
|
|
|
|
|
|
This file is part of GAS, the GNU Assembler.
|
|
|
|
|
|
|
|
GAS is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 3, or (at your option)
|
|
|
|
any later version.
|
|
|
|
|
|
|
|
GAS is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with GAS; see the file COPYING. If not, write to the Free
|
|
|
|
Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
|
|
|
|
02110-1301, USA. */
|
|
|
|
|
|
|
|
#define TC_BPF
|
|
|
|
|
|
|
|
#define LISTING_HEADER "BPF GAS "
|
|
|
|
|
|
|
|
/* The target BFD architecture. */
|
|
|
|
#define TARGET_ARCH bfd_arch_bpf
|
|
|
|
#define TARGET_MACH 0 /* The default. */
|
|
|
|
|
|
|
|
#define TARGET_FORMAT \
|
|
|
|
(target_big_endian ? "elf64-bpfbe" : "elf64-bpfle")
|
|
|
|
|
|
|
|
/* This is used to set the default value for `target_big_endian'. */
|
|
|
|
#ifndef TARGET_BYTES_BIG_ENDIAN
|
|
|
|
#define TARGET_BYTES_BIG_ENDIAN 0
|
|
|
|
#endif
|
|
|
|
|
2023-11-30 15:34:09 +08:00
|
|
|
/* Permit // comments. */
|
|
|
|
#define DOUBLESLASH_LINE_COMMENTS 1
|
|
|
|
|
2019-05-24 01:05:12 +08:00
|
|
|
/* .-foo gets turned into PC relative relocs. */
|
|
|
|
#define DIFF_EXPR_OK 1
|
|
|
|
|
|
|
|
/* Call md_pcrel_from_section(), not md_pcrel_from(). */
|
|
|
|
#define MD_PCREL_FROM_SECTION(FIXP, SEC) md_pcrel_from_section (FIXP, SEC)
|
|
|
|
|
|
|
|
/* We don't need to handle .word strangely. */
|
|
|
|
#define WORKING_DOT_WORD
|
|
|
|
|
|
|
|
/* Values passed to md_apply_fix don't include the symbol value. */
|
|
|
|
#define MD_APPLY_SYM_VALUE(FIX) 0
|
|
|
|
|
2020-09-15 17:33:49 +08:00
|
|
|
/* The Linux kernel verifier expects NOPs to be encoded in this way;
|
|
|
|
a jump to offset 0 means jump to the next instruction. */
|
|
|
|
#define md_single_noop_insn "ja 0"
|
2023-04-20 22:37:01 +08:00
|
|
|
|
bpf: avoid creating wrong symbols while parsing
To support the "pseudo-C" asm dialect in BPF, the BPF parser must often
attempt multiple different templates for a single instruction. In some
cases this can cause the parser to incorrectly parse part of the
instruction opcode as an expression, which leads to the creation of a
new undefined symbol.
Once the parser recognizes the error, the expression is discarded and it
tries again with a new instruction template. However, symbols created
during the process are added to the symbol table and are not removed
even if the expression is discarded.
This is a problem for BPF: generally the assembled object will be loaded
directly to the Linux kernel, without being linked. These erroneous
parser-created symbols are rejected by the kernel BPF loader, and the
entire object is refused.
This patch remedies the issue by tentatively creating symbols while
parsing instruction operands, and storing them in a temporary list
rather than immediately inserting them into the symbol table. Later,
after the parser is sure that it has correctly parsed the instruction,
those symbols are committed to the real symbol table.
This approach is modeled directly after Jan Beulich's patch for RISC-V:
commit 7a29ee290307087e1749ce610207e93a15d0b78d
RISC-V: adjust logic to avoid register name symbols
Many thanks to Jan for recognizing the problem as similar, and pointing
me to that patch.
gas/
* config/tc-bpf.c (parsing_insn_operands): New.
(parse_expression): Set it here.
(deferred_sym_rootP, deferred_sym_lastP): New.
(orphan_sym_rootP, orphan_sym_lastP): New.
(bpf_parse_name): New.
(parse_error): Clear deferred symbol list on error.
(md_assemble): Clear parsing_insn_operands. Commit deferred
symbols to symbol table on successful parse.
* config/tc-bpf.h (md_parse_name): Define to...
(bpf_parse_name): ...this. New prototype.
* testsuite/gas/bpf/asm-extra-sym-1.s: New test source.
* testsuite/gas/bpf/asm-extra-sym-1.d: New test.
* testsuite/gas/bpf/bpf.exp: Run new test.
2023-11-17 01:35:03 +08:00
|
|
|
#define md_parse_name(name, exp, mode, c) \
|
|
|
|
bpf_parse_name (name, exp, mode)
|
|
|
|
bool bpf_parse_name (const char *, struct expressionS *, enum expr_mode);
|
|
|
|
|
2023-08-02 19:06:23 +08:00
|
|
|
#define TC_EQUAL_IN_INSN(c, s) bpf_tc_equal_in_insn ((c), (s))
|
|
|
|
extern bool bpf_tc_equal_in_insn (int, char *);
|
|
|
|
|
|
|
|
#define elf_tc_final_processing bpf_elf_final_processing
|
|
|
|
extern void bpf_elf_final_processing (void);
|