#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include int main(int argc, char **argv) { printf("LLVM Test\n"); llvm::InitializeNativeTarget(); llvm::InitializeNativeTargetAsmPrinter(); auto ContextRef = LLVMContextCreate(); auto Con = *llvm::unwrap(&ContextRef); auto MainModule = new llvm::Module("Main Module", *Con); auto IRBuilder = new llvm::IRBuilder<>(*Con); using namespace llvm; Type *i64 = Type::getInt64Ty(*Con); auto FunctionType = FunctionType::get(Type::getVoidTy(*Con), { i64, }, false); legacy::PassManager PM; PassManagerBuilder PMBuilder; PMBuilder.OptLevel = 3; PMBuilder.populateModulePassManager(PM); std::string Empty; auto start = std::chrono::high_resolution_clock::now(); for (int i = 0; i < 10000; ++i) { auto Func = Function::Create(FunctionType, Function::ExternalLinkage, Empty, MainModule); Func->setCallingConv(CallingConv::C); { auto Entry = BasicBlock::Create(*Con, Empty, Func); IRBuilder->SetInsertPoint(Entry); auto ExitBlock = BasicBlock::Create(*Con, Empty, Func); IRBuilder->SetInsertPoint(ExitBlock); IRBuilder->CreateRetVoid(); IRBuilder->SetInsertPoint(Entry); IRBuilder->CreateBr(ExitBlock); } //printf("i: %d\n", i); PM.run(*MainModule); auto FunctionList = &MainModule->getFunctionList(); FunctionList->clear(); } auto end = std::chrono::high_resolution_clock::now(); auto diff = end - start; printf("Took %ld(%ldms) nanoseconds\n", diff.count(), std::chrono::duration_cast(diff).count()); return 0; }