Index: unittests/ExecutionEngine/MCJIT/MCJITTest.cpp =================================================================== --- unittests/ExecutionEngine/MCJIT/MCJITTest.cpp +++ unittests/ExecutionEngine/MCJIT/MCJITTest.cpp @@ -12,9 +12,10 @@ // //===----------------------------------------------------------------------===// +#include "MCJITTestBase.h" #include "llvm/ExecutionEngine/MCJIT.h" +#include "llvm/IR/DIBuilder.h" #include "llvm/Support/DynamicLibrary.h" -#include "MCJITTestBase.h" #include "gtest/gtest.h" using namespace llvm; @@ -281,4 +282,39 @@ EXPECT_FALSE(std::find(I, E, "Foo2") == E); } +static Function *insertMainWithDI(LLVMContext &Context, Module &M) { + DIBuilder DIB(M); + DIFile *File = DIB.createFile("-", "."); + DIB.createCompileUnit(dwarf::DW_LANG_C99, File, "producer", false, "", 0); + DISubroutineType *MainType = DIB.createSubroutineType({}); + DISubprogram *DIMain = DIB.createFunction(File, "main", "main", File, 1, + MainType, false, true, 1); + DILocation *Loc = DILocation::get(Context, 1, 1, DIMain, nullptr); + Function *Main = Function::Create(TypeBuilder::get(Context), + GlobalValue::ExternalLinkage, "main", &M); + Main->setSubprogram(DIMain); + BasicBlock *Entry = BasicBlock::Create(Context, "entry", Main); + ReturnInst *Ret = + IRBuilder<>(Entry).CreateRet(ConstantInt::get(Context, APInt(32, 47))); + Ret->setDebugLoc(Loc); + DIB.finalize(); + + return Main; +} + +TEST_F(MCJITTest, ProcessAllSections) { + Function *Main = insertMainWithDI(Context, *M); + + createJIT(std::move(M)); + TheJIT->setProcessAllSections(true); + TheJIT->finalizeObject(); + + uint64_t ptr = TheJIT->getFunctionAddress(Main->getName().str()); + ASSERT_NE(0u, ptr) << "Unable to get pointer to main() from JIT"; + + int (*FuncPtr)() = (int (*)())ptr; + int returnCode = FuncPtr(); + EXPECT_EQ(returnCode, 47); +} + } // end anonymous namespace