[llvm] r243589 - [MCJIT] Fix PR20656 by teaching MCJIT to honor ExecutionEngine's global mapping.
Hans Wennborg
hans at chromium.org
Thu Jul 30 09:32:28 PDT 2015
Merged (together with r243609) in r243655.
There was a conflict due to r242414 not being in the branch, so I
changed lib/ExecutionEngine/ExecutionEngine.cpp:190 from '?
getDataLayout()' to '? *getDataLayout()'.
Cheers,
Hans
On Wed, Jul 29, 2015 at 4:12 PM, Lang Hames <lhames at gmail.com> wrote:
> Author: lhames
> Date: Wed Jul 29 18:12:33 2015
> New Revision: 243589
>
> URL: http://llvm.org/viewvc/llvm-project?rev=243589&view=rev
> Log:
> [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.
>
>
> Modified:
> llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp
> llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp
> llvm/trunk/unittests/ExecutionEngine/MCJIT/MCJITCAPITest.cpp
>
> Modified: llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp?rev=243589&r1=243588&r2=243589&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp Wed Jul 29 18:12:33 2015
> @@ -189,10 +189,17 @@ uint64_t ExecutionEngineState::RemoveMap
> }
>
> 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();
> }
>
>
> Modified: llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp?rev=243589&r1=243588&r2=243589&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp Wed Jul 29 18:12:33 2015
> @@ -270,6 +270,12 @@ void MCJIT::finalizeModule(Module *M) {
> RuntimeDyld::SymbolInfo MCJIT::findExistingSymbol(const std::string &Name) {
> SmallString<128> FullName;
> Mangler::getNameWithPrefix(FullName, Name, getDataLayout());
> +
> + if (void *Addr = getPointerToGlobalIfAvailable(FullName))
> + return RuntimeDyld::SymbolInfo(static_cast<uint64_t>(
> + reinterpret_cast<uintptr_t>(Addr)),
> + JITSymbolFlags::Exported);
> +
> return Dyld.getSymbol(FullName);
> }
>
>
> Modified: llvm/trunk/unittests/ExecutionEngine/MCJIT/MCJITCAPITest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ExecutionEngine/MCJIT/MCJITCAPITest.cpp?rev=243589&r1=243588&r2=243589&view=diff
> ==============================================================================
> --- llvm/trunk/unittests/ExecutionEngine/MCJIT/MCJITCAPITest.cpp (original)
> +++ llvm/trunk/unittests/ExecutionEngine/MCJIT/MCJITCAPITest.cpp Wed Jul 29 18:12:33 2015
> @@ -488,3 +488,36 @@ 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);
> +
> + 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());
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list