Commit 9f19c533 authored by Hans Wennborg's avatar Hans Wennborg
Browse files

Merging r243589 and r243609:

------------------------------------------------------------------------
r243589 | lhames | 2015-07-29 16:12:33 -0700 (Wed, 29 Jul 2015) | 6 lines

[MCJIT] Fix PR20656 by teaching MCJIT to honor ExecutionEngine's global mapping.

This is important for users of the C API who can't supply custom symbol
resolvers yet.
------------------------------------------------------------------------

------------------------------------------------------------------------
r243609 | lhames | 2015-07-29 19:05:37 -0700 (Wed, 29 Jul 2015) | 2 lines

[MCJIT] Fix a memory leak in a unit test that was introduced in r243589.
------------------------------------------------------------------------

llvm-svn: 243655
parent ca430b6e
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -180,10 +180,17 @@ uint64_t ExecutionEngineState::RemoveMapping(StringRef Name) {
}

std::string ExecutionEngine::getMangledName(const GlobalValue *GV) {
  assert(GV->hasName() && "Global must have name.");

  MutexGuard locked(lock);
  Mangler Mang;
  SmallString<128> FullName;
  Mang.getNameWithPrefix(FullName, GV, false);

  const DataLayout &DL =
    GV->getParent()->getDataLayout().isDefault()
      ? *getDataLayout()
      : GV->getParent()->getDataLayout();

  Mangler::getNameWithPrefix(FullName, GV->getName(), DL);
  return FullName.str();
}

+6 −0
Original line number Diff line number Diff line
@@ -266,6 +266,12 @@ void MCJIT::finalizeModule(Module *M) {
RuntimeDyld::SymbolInfo MCJIT::findExistingSymbol(const std::string &Name) {
  SmallString<128> FullName;
  Mangler::getNameWithPrefix(FullName, Name, *TM->getDataLayout());

  if (void *Addr = getPointerToGlobalIfAvailable(FullName))
    return RuntimeDyld::SymbolInfo(static_cast<uint64_t>(
                                     reinterpret_cast<uintptr_t>(Addr)),
                                   JITSymbolFlags::Exported);

  return Dyld.getSymbol(FullName);
}

+34 −0
Original line number Diff line number Diff line
@@ -488,3 +488,37 @@ TEST_F(MCJITCAPITest, yield) {
  EXPECT_TRUE(didCallYield);
}

static int localTestFunc() {
  return 42;
}

TEST_F(MCJITCAPITest, addGlobalMapping) {
  SKIP_UNSUPPORTED_PLATFORM;

  Module = LLVMModuleCreateWithName("testModule");
  LLVMTypeRef FunctionType = LLVMFunctionType(LLVMInt32Type(), NULL, 0, 0);
  LLVMValueRef MappedFn = LLVMAddFunction(Module, "mapped_fn", FunctionType);

  Function = LLVMAddFunction(Module, "test_fn", FunctionType);
  LLVMBasicBlockRef Entry = LLVMAppendBasicBlock(Function, "");
  LLVMBuilderRef Builder = LLVMCreateBuilder();
  LLVMPositionBuilderAtEnd(Builder, Entry);
  LLVMValueRef RetVal = LLVMBuildCall(Builder, MappedFn, NULL, 0, "");
  LLVMBuildRet(Builder, RetVal);
  LLVMDisposeBuilder(Builder);

  LLVMVerifyModule(Module, LLVMAbortProcessAction, &Error);
  LLVMDisposeMessage(Error);

  buildMCJITOptions();
  buildMCJITEngine();

  LLVMAddGlobalMapping(Engine, MappedFn, reinterpret_cast<void*>(&localTestFunc));

  buildAndRunPasses();

  uint64_t raw = LLVMGetFunctionAddress(Engine, "test_fn");
  int (*usable)() = (int (*)()) raw;

  EXPECT_EQ(42, usable());
}