diff options
author | Yonghong Song <yhs@fb.com> | 2022-04-15 14:57:48 -0700 |
---|---|---|
committer | Yonghong Song <yhs@fb.com> | 2022-04-19 14:41:08 -0700 |
commit | 954ba6045dd5af1d56f0698dc598528eefe41270 (patch) | |
tree | 1113baa47fd2021bf31f5fefcde45d736bd5709e /llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | |
parent | 858e40d8f3ddb3a0fef145ea7ce93777e7ecaeea (diff) | |
download | llvm-954ba6045dd5af1d56f0698dc598528eefe41270.zip llvm-954ba6045dd5af1d56f0698dc598528eefe41270.tar.gz llvm-954ba6045dd5af1d56f0698dc598528eefe41270.tar.bz2 |
[BPF] Emit fatal error if out of range for FK_PCRel_2 branch target
Currently for the branch insn like
"if $dst "#OpcodeStr#" $imm goto $BrDst"
The $BrDst range needs to be in the range of [INT16_MIN, INT16_MAX].
When running bpf selftest with latest llvm, I found
pyperf600.o generated insn with range outside
of [INT16_MIN, INT16_MAX], which caused verifier failure.
See below insn #12.
0000000000000000 <on_event>:
; {
0: 7b 1a 00 ff 00 00 00 00 *(u64 *)(r10 - 256) = r1
; uint64_t pid_tgid = bpf_get_current_pid_tgid();
1: 85 00 00 00 0e 00 00 00 call 14
2: bf 06 00 00 00 00 00 00 r6 = r0
; pid_t pid = (pid_t)(pid_tgid >> 32);
3: bf 61 00 00 00 00 00 00 r1 = r6
4: 77 01 00 00 20 00 00 00 r1 >>= 32
5: 63 1a fc ff 00 00 00 00 *(u32 *)(r10 - 4) = r1
6: bf a2 00 00 00 00 00 00 r2 = r10
7: 07 02 00 00 fc ff ff ff r2 += -4
; PidData* pidData = bpf_map_lookup_elem(&pidmap, &pid);
8: 18 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 r1 = 0 ll
10: 85 00 00 00 01 00 00 00 call 1
11: bf 08 00 00 00 00 00 00 r8 = r0
; if (!pidData)
12: 15 08 15 e8 00 00 00 00 if r8 == 0 goto -6123 <LBB0_27588+0xffffffffffdae100>
13: b4 01 00 00 00 00 00 00 w1 = 0
We may need to add new insn to extend the range of $BrDst.
This patch added a fatal error if out of range so compiler can warn
the otherwise incorrect code generation.
Differential Revision: https://reviews.llvm.org/D123877
Diffstat (limited to 'llvm/lib/Bitcode/Writer/BitcodeWriter.cpp')
0 files changed, 0 insertions, 0 deletions