The Design of LLVM