cc-ing llvmdev... Renato, that's the stuff we briefly discussed at LPC. (not sure whom should I ping to get discussion going) (sorry if you receive this msg multiple times) ---------- Forwarded message ---------- From: Alexei Starovoitov <alexei.starovoitov at gmail.com> Date: Tue, Dec 2, 2014 at 7:08 PM Subject: [PATCH] [RFC PATCH] BPF backend To: alexei.starovoitov at gmail.com Cc: amara.emerson at arm.com, llvm-commits at cs.uiuc.edu Hi All, recently linux gained "universal in-kernel virtual machine" which is called eBPF or extended BPF. The name comes from "Berkeley Packet Filter", since new instruction set is based on it. This patch adds a new backend that emits eBPF instruction set. The concept and development are covered by the following articles: http://lwn.net/Articles/599755/ http://lwn.net/Articles/575531/ http://lwn.net/Articles/603983/ http://lwn.net/Articles/606089/ http://lwn.net/Articles/612878/ One of use cases: dtrace/systemtap alternative. bpf syscall manpage: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=b4fc1a460f3017e958e6a8ea560ea0afd91bf6fe instruction set description and differences vs classic BPF: http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/Documentation/networking/filter.txt Short summary of instruction set: . 64-bit registers R0 - return value from in-kernel function, and exit value for eBPF program R1 - R5 - arguments from eBPF program to in-kernel function R6 - R9 - callee saved registers that in-kernel function will preserve R10 - read-only frame pointer to access stack . two-operand instructions like +, -, *, mov, load/store . implicit prologue/epilogue (invisible stack pointer) . no floating point, no simd Short history of eBPF in kernel: interpreter in 3.15, x64 JIT in 3.16, arm64 JIT, verifier, bpf syscall in 3.18, more to come in the future. Short history of compiler side: gcc backend was done 2 years ago (never upstreamed and now out of date) then llvm standalone backend (compileable without llvm src tree) was done for llvm 3.2, 3.3 and 3.4 now it's been cleaned up and rebased to the latest llvm trunk which is this patch or can be seen at: https://github.com/iovisor/llvm It's a very small and simple backend. There is no support for global variables, arbitrary function calls, floating point, varargs, exceptions, indirect jumps, arbitrary pointer arithmetic, alloca, etc.>From C front-end point of view it's very restricted. It's done onpurpose, since kernel rejects all programs that it cannot prove safe. It rejects programs with loops and with memory accesses via arbitrary pointers. When kernel accepts the program it is guaranteed that program will terminate and will not crash the kernel. This patch implements all 'must have' bits. There are several things on TODO list, so this is not the end of development. Most of the code is a boiler plate code, copy-pasted from other backends. Only odd things are lack or < and <= instructions, specialized load_byte intrinsics and 'compare and goto' as single instruction. Current instruction set is fixed, but more instructions can be added in the future. Please let me know your feedback and steps to get it merged. Signed-off-by: Alexei Starovoitov <ast at plumgrid.com> http://reviews.llvm.org/D6494 Files: configure include/llvm/IR/Intrinsics.td include/llvm/IR/IntrinsicsBPF.td lib/Target/BPF/BPF.h lib/Target/BPF/BPF.td lib/Target/BPF/BPFAsmPrinter.cpp lib/Target/BPF/BPFCallingConv.td lib/Target/BPF/BPFFrameLowering.cpp lib/Target/BPF/BPFFrameLowering.h lib/Target/BPF/BPFISelDAGToDAG.cpp lib/Target/BPF/BPFISelLowering.cpp lib/Target/BPF/BPFISelLowering.h lib/Target/BPF/BPFInstrFormats.td lib/Target/BPF/BPFInstrInfo.cpp lib/Target/BPF/BPFInstrInfo.h lib/Target/BPF/BPFInstrInfo.td lib/Target/BPF/BPFMCInstLower.cpp lib/Target/BPF/BPFMCInstLower.h lib/Target/BPF/BPFRegisterInfo.cpp lib/Target/BPF/BPFRegisterInfo.h lib/Target/BPF/BPFRegisterInfo.td lib/Target/BPF/BPFSubtarget.cpp lib/Target/BPF/BPFSubtarget.h lib/Target/BPF/BPFTargetMachine.cpp lib/Target/BPF/BPFTargetMachine.h lib/Target/BPF/InstPrinter/BPFInstPrinter.cpp lib/Target/BPF/InstPrinter/BPFInstPrinter.h lib/Target/BPF/InstPrinter/LLVMBuild.txt lib/Target/BPF/InstPrinter/Makefile lib/Target/BPF/LLVMBuild.txt lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp lib/Target/BPF/MCTargetDesc/BPFBaseInfo.h lib/Target/BPF/MCTargetDesc/BPFELFObjectWriter.cpp lib/Target/BPF/MCTargetDesc/BPFMCAsmInfo.h lib/Target/BPF/MCTargetDesc/BPFMCCodeEmitter.cpp lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.cpp lib/Target/BPF/MCTargetDesc/BPFMCTargetDesc.h lib/Target/BPF/MCTargetDesc/LLVMBuild.txt lib/Target/BPF/MCTargetDesc/Makefile lib/Target/BPF/Makefile lib/Target/BPF/TargetInfo/BPFTargetInfo.cpp lib/Target/BPF/TargetInfo/LLVMBuild.txt lib/Target/BPF/TargetInfo/Makefile lib/Target/LLVMBuild.txt test/CodeGen/BPF/alu8.ll test/CodeGen/BPF/atomics.ll test/CodeGen/BPF/basictest.ll test/CodeGen/BPF/cc_args.ll test/CodeGen/BPF/cc_ret.ll test/CodeGen/BPF/cmp.ll test/CodeGen/BPF/ex1.ll test/CodeGen/BPF/intrinsics.ll test/CodeGen/BPF/load.ll test/CodeGen/BPF/loops.ll test/CodeGen/BPF/sanity.ll test/CodeGen/BPF/setcc.ll test/CodeGen/BPF/shifts.ll test/CodeGen/BPF/sockex2.ll