diff options
author | Alexei Starovoitov <alexei.starovoitov@gmail.com> | 2016-11-20 02:25:00 +0000 |
---|---|---|
committer | Alexei Starovoitov <alexei.starovoitov@gmail.com> | 2016-11-20 02:25:00 +0000 |
commit | e58b8cc11762c734fc29d3c12437d2c320fd108d (patch) | |
tree | 516cf2082b68c0921d2169526b573f47539f5275 /test/CodeGen/BPF | |
parent | b665150021b7c1e22253d51922b80f65d14e8007 (diff) |
[bpf] add BPF disassembler
add BPF disassembler, so tools like llvm-objdump can be used:
$ llvm-objdump -d -no-show-raw-insn ./sockex1_kern.o
./sockex1_kern.o: file format ELF64-BPF
Disassembly of section socket1:
bpf_prog1:
0: r6 = r1
8: r0 = *(u8 *)skb[23]
10: *(u32 *)(r10 - 4) = r0
18: r1 = *(u32 *)(r6 + 4)
20: if r1 != 4 goto 8
28: r2 = r10
30: r2 += -4
ld_imm64 (the only 16-byte insn) and special ld_abs/ld_ind instructions
had to be treated in a special way. The decoders for the rest of the insns
are automatically generated.
Add tests to cover new functionality.
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@287477 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/BPF')
-rw-r--r-- | test/CodeGen/BPF/atomics.ll | 8 | ||||
-rw-r--r-- | test/CodeGen/BPF/objdump_atomics.ll | 19 | ||||
-rw-r--r-- | test/CodeGen/BPF/objdump_intrinsics.ll | 88 | ||||
-rw-r--r-- | test/CodeGen/BPF/objdump_trivial.ll | 19 |
4 files changed, 130 insertions, 4 deletions
diff --git a/test/CodeGen/BPF/atomics.ll b/test/CodeGen/BPF/atomics.ll index c24dd65d6eb..64c45aa4949 100644 --- a/test/CodeGen/BPF/atomics.ll +++ b/test/CodeGen/BPF/atomics.ll @@ -1,8 +1,8 @@ ; RUN: llc < %s -march=bpfel -verify-machineinstrs -show-mc-encoding | FileCheck %s ; CHECK-LABEL: test_load_add_32 -; CHECK: lock *(u32 *) -; CHECK: encoding: [0xc3 +; CHECK: lock *(u32 *)(r1 + 0) += r2 +; CHECK: encoding: [0xc3,0x21 define void @test_load_add_32(i32* %p, i32 zeroext %v) { entry: atomicrmw add i32* %p, i32 %v seq_cst @@ -10,8 +10,8 @@ entry: } ; CHECK-LABEL: test_load_add_64 -; CHECK: lock *(u64 *) -; CHECK: encoding: [0xdb +; CHECK: lock *(u64 *)(r1 + 0) += r2 +; CHECK: encoding: [0xdb,0x21 define void @test_load_add_64(i64* %p, i64 zeroext %v) { entry: atomicrmw add i64* %p, i64 %v seq_cst diff --git a/test/CodeGen/BPF/objdump_atomics.ll b/test/CodeGen/BPF/objdump_atomics.ll new file mode 100644 index 00000000000..fb59449a147 --- /dev/null +++ b/test/CodeGen/BPF/objdump_atomics.ll @@ -0,0 +1,19 @@ +; RUN: llc -march=bpfel -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s + +; CHECK-LABEL: test_load_add_32 +; CHECK: c3 21 +; CHECK: lock *(u32 *)(r1 + 0) += r2 +define void @test_load_add_32(i32* %p, i32 zeroext %v) { +entry: + atomicrmw add i32* %p, i32 %v seq_cst + ret void +} + +; CHECK-LABEL: test_load_add_64 +; CHECK: db 21 +; CHECK: lock *(u64 *)(r1 + 0) += r2 +define void @test_load_add_64(i64* %p, i64 zeroext %v) { +entry: + atomicrmw add i64* %p, i64 %v seq_cst + ret void +} diff --git a/test/CodeGen/BPF/objdump_intrinsics.ll b/test/CodeGen/BPF/objdump_intrinsics.ll new file mode 100644 index 00000000000..ddb92b9d8fb --- /dev/null +++ b/test/CodeGen/BPF/objdump_intrinsics.ll @@ -0,0 +1,88 @@ +; RUN: llc -march=bpfel -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s + +; Function Attrs: nounwind uwtable +define i32 @ld_b(i64 %foo, i64* nocapture %bar, i8* %ctx, i8* %ctx2) #0 { + %1 = tail call i64 @llvm.bpf.load.byte(i8* %ctx, i64 123) #2 + %2 = add i64 %1, %foo + %3 = load volatile i64, i64* %bar, align 8 + %4 = add i64 %2, %3 + %5 = tail call i64 @llvm.bpf.load.byte(i8* %ctx2, i64 %foo) #2 + %6 = add i64 %4, %5 + %7 = load volatile i64, i64* %bar, align 8 + %8 = add i64 %6, %7 + %9 = trunc i64 %8 to i32 + ret i32 %9 +; CHECK-LABEL: ld_b: +; CHECK: r0 = *(u8 *)skb[123] +; CHECK: r0 = *(u8 *)skb[r +} + +declare i64 @llvm.bpf.load.byte(i8*, i64) #1 + +; Function Attrs: nounwind uwtable +define i32 @ld_h(i8* %ctx, i8* %ctx2, i32 %foo) #0 { + %1 = tail call i64 @llvm.bpf.load.half(i8* %ctx, i64 123) #2 + %2 = sext i32 %foo to i64 + %3 = tail call i64 @llvm.bpf.load.half(i8* %ctx2, i64 %2) #2 + %4 = add i64 %3, %1 + %5 = trunc i64 %4 to i32 + ret i32 %5 +; CHECK-LABEL: ld_h: +; CHECK: r0 = *(u16 *)skb[r +; CHECK: r0 = *(u16 *)skb[123] +} + +declare i64 @llvm.bpf.load.half(i8*, i64) #1 + +; Function Attrs: nounwind uwtable +define i32 @ld_w(i8* %ctx, i8* %ctx2, i32 %foo) #0 { + %1 = tail call i64 @llvm.bpf.load.word(i8* %ctx, i64 123) #2 + %2 = sext i32 %foo to i64 + %3 = tail call i64 @llvm.bpf.load.word(i8* %ctx2, i64 %2) #2 + %4 = add i64 %3, %1 + %5 = trunc i64 %4 to i32 + ret i32 %5 +; CHECK-LABEL: ld_w: +; CHECK: r0 = *(u32 *)skb[r +; CHECK: r0 = *(u32 *)skb[123] +} + +declare i64 @llvm.bpf.load.word(i8*, i64) #1 + +define i32 @ld_pseudo() #0 { +entry: + %call = tail call i64 @llvm.bpf.pseudo(i64 2, i64 3) + tail call void @bar(i64 %call, i32 4) #2 + ret i32 0 +; CHECK-LABEL: ld_pseudo: +; CHECK: ld_pseudo r1, 2, 3 +} + +declare void @bar(i64, i32) #1 + +declare i64 @llvm.bpf.pseudo(i64, i64) #2 + +define i32 @bswap(i64 %a, i64 %b, i64 %c) #0 { +entry: + %0 = tail call i64 @llvm.bswap.i64(i64 %a) + %conv = trunc i64 %b to i32 + %1 = tail call i32 @llvm.bswap.i32(i32 %conv) + %conv1 = zext i32 %1 to i64 + %add = add i64 %conv1, %0 + %conv2 = trunc i64 %c to i16 + %2 = tail call i16 @llvm.bswap.i16(i16 %conv2) + %conv3 = zext i16 %2 to i64 + %add4 = add i64 %add, %conv3 + %conv5 = trunc i64 %add4 to i32 + ret i32 %conv5 +; CHECK-LABEL: bswap: +; CHECK: bswap64 r1 +; CHECK: bswap32 r2 +; CHECK: r2 += r1 +; CHECK: bswap16 r3 +; CHECK: r2 += r3 +} + +declare i64 @llvm.bswap.i64(i64) #1 +declare i32 @llvm.bswap.i32(i32) #1 +declare i16 @llvm.bswap.i16(i16) #1 diff --git a/test/CodeGen/BPF/objdump_trivial.ll b/test/CodeGen/BPF/objdump_trivial.ll new file mode 100644 index 00000000000..48fee21a2e4 --- /dev/null +++ b/test/CodeGen/BPF/objdump_trivial.ll @@ -0,0 +1,19 @@ +; RUN: llc -march=bpfel -filetype=obj -o - %s | llvm-objdump -d - | FileCheck %s + +; CHECK: if r2 s> r1 goto +; CHECK: call +; CHECK: exit + +declare void @a() +declare void @b() + +define void @foo(i32 %a) { +%b = icmp sgt i32 %a, -1 +br i1 %b, label %x, label %y +x: +call void @a() +ret void +y: +call void @b() +ret void +} |