#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace llvm; Module *makeLLVMModule(); int main(int argc, char **argv) { Module *Mod = makeLLVMModule(); PassManager PM; PM.add(createVerifierPass()); PM.add(createPrintModulePass(outs())); PM.run(*Mod); return 0; } Module *makeLLVMModule() { // Module Construction Module *mod = new Module("test.ll", getGlobalContext()); mod->setDataLayout("e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"); mod->setTargetTriple("i386-pc-linux-gnu"); // Type Definitions std::vector FuncTy_0_args; FuncTy_0_args.push_back(IntegerType::get(mod->getContext(), 32)); FuncTy_0_args.push_back(IntegerType::get(mod->getContext(), 32)); FunctionType *FuncTy_0 = FunctionType::get( /*Result=*/IntegerType::get(mod->getContext(), 32), /*Params=*/FuncTy_0_args, /*isVarArg=*/false); // Function Declaration Function *func_sum = mod->getFunction("sum"); if (!func_sum) { func_sum = Function::Create( /*Type=*/FuncTy_0, /*Linkage=*/GlobalValue::ExternalLinkage, /*Name=*/"sum", mod); func_sum->setCallingConv(CallingConv::C); } // Function Definition { Function::arg_iterator args = func_sum->arg_begin(); Value *int32_x = args++; int32_x->setName("x"); Value *int32_y = args++; int32_y->setName("y"); BasicBlock *label_entry = BasicBlock::Create(mod->getContext(), "entry", func_sum, 0); // Block entry (label_entry) BinaryOperator *int32_add = BinaryOperator::Create( Instruction::Add, int32_x, int32_y, "add", label_entry); ReturnInst::Create(mod->getContext(), int32_add, label_entry); } return mod; }