[BPF] support for BPF_ST instruction in codegen
Generate store immediate instruction when CPUv4 is enabled. For example: $ cat test.c struct foo { unsigned char b; unsigned short h; unsigned int w; unsigned long d; }; void bar(volatile struct foo *p) { p->b = 1; p->h = 2; p->w = 3; p->d = 4; } $ clang -O2 --target=bpf -mcpu=v4 test.c -c -o - | llvm-objdump -d - ... 0000000000000000 <bar>: 0: 72 01 00 00 01 00 00 00 *(u8 *)(r1 + 0x0) = 0x1 1: 6a 01 02 00 02 00 00 00 *(u16 *)(r1 + 0x2) = 0x2 2: 62 01 04 00 03 00 00 00 *(u32 *)(r1 + 0x4) = 0x3 3: 7a 01 08 00 04 00 00 00 *(u64 *)(r1 + 0x8) = 0x4 4: 95 00 00 00 00 00 00 00 exit Take special care to: - apply `BPFMISimplifyPatchable::checkADDrr` rewrite for BPF_ST - validate immediate value when BPF_ST write is 64-bit: BPF interprets `(BPF_ST | BPF_MEM | BPF_DW)` writes as writes with sign extension. Thus it is fine to generate such write when immediate is -1, but it is incorrect to generate such write when immediate is +0xffff_ffff. Differential Revision: https://reviews.llvm.org/D140804
Loading
Please sign in to comment