Skip to content

Commit

Permalink
Revert "[ExecutionEngine] Use std::function rather than a function po…
Browse files Browse the repository at this point in the history
…inter for the LazyFunctionCreator."

This reverts commit r241962, as it was breaking all ARM buildbots.

It also reverts the two subsequent related commits:

r241974: "[ExecutionEngine] Add a static cast to the unittest for r241962 to suppress a warning."

r241973: "[ExecutionEngine] Remove cruft and fix a couple of warnings in the test case for r241962."

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241983 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
rengolin committed Jul 11, 2015
1 parent 1e3fa76 commit 22af148
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 70 deletions.
9 changes: 3 additions & 6 deletions include/llvm/ExecutionEngine/ExecutionEngine.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
#include <map>
#include <string>
#include <vector>
#include <functional>

namespace llvm {

Expand Down Expand Up @@ -90,8 +89,6 @@ class ExecutionEngineState {
uint64_t RemoveMapping(StringRef Name);
};

using FunctionCreator = std::function<void *(const std::string &)>;

/// \brief Abstract interface for implementation execution of LLVM modules,
/// designed to support both interpreter and just-in-time (JIT) compiler
/// implementations.
Expand Down Expand Up @@ -150,7 +147,7 @@ class ExecutionEngine {
/// LazyFunctionCreator - If an unknown function is needed, this function
/// pointer is invoked to create it. If this returns null, the JIT will
/// abort.
FunctionCreator LazyFunctionCreator;
void *(*LazyFunctionCreator)(const std::string &);

/// getMangledName - Get mangled name.
std::string getMangledName(const GlobalValue *GV);
Expand Down Expand Up @@ -473,8 +470,8 @@ class ExecutionEngine {
/// InstallLazyFunctionCreator - If an unknown function is needed, the
/// specified function pointer is invoked to create it. If it returns null,
/// the JIT will abort.
void InstallLazyFunctionCreator(FunctionCreator C) {
LazyFunctionCreator = C;
void InstallLazyFunctionCreator(void* (*P)(const std::string &)) {
LazyFunctionCreator = P;
}

protected:
Expand Down
64 changes: 0 additions & 64 deletions unittests/ExecutionEngine/MCJIT/MCJITTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -199,68 +199,4 @@ TEST_F(MCJITTest, multiple_decl_lookups) {
EXPECT_EQ(A, B) << "Repeat calls to getPointerToFunction fail.";
}

typedef void * (*FunctionHandlerPtr)(const std::string &str);

TEST_F(MCJITTest, lazy_function_creator_pointer) {
SKIP_UNSUPPORTED_PLATFORM;

Function *Foo = insertExternalReferenceToFunction<int32_t(void)>(M.get(),
"\1Foo");
startFunction<int32_t(void)>(M.get(), "Parent");
CallInst *Call = Builder.CreateCall(Foo, {});
Builder.CreateRet(Call);

createJIT(std::move(M));

// Set up the lazy function creator that records the name of the last
// unresolved external function found in the module. Using a function pointer
// prevents us from capturing local variables, which is why this is static.
static std::string UnresolvedExternal;
FunctionHandlerPtr UnresolvedHandler = [] (const std::string &str) {
UnresolvedExternal = str;
return (void *)(uintptr_t)-1;
};
TheJIT->InstallLazyFunctionCreator(UnresolvedHandler);

// JIT the module.
TheJIT->finalizeObject();

// Verify that our handler was called.
EXPECT_EQ(UnresolvedExternal, "Foo");
}

TEST_F(MCJITTest, lazy_function_creator_lambda) {
SKIP_UNSUPPORTED_PLATFORM;

Function *Foo1 = insertExternalReferenceToFunction<int32_t(void)>(M.get(),
"\1Foo1");
Function *Foo2 = insertExternalReferenceToFunction<int32_t(void)>(M.get(),
"\1Foo2");
startFunction<int32_t(void)>(M.get(), "Parent");
CallInst *Call1 = Builder.CreateCall(Foo1, {});
CallInst *Call2 = Builder.CreateCall(Foo2, {});
Value *Result = Builder.CreateAdd(Call1, Call2);
Builder.CreateRet(Result);

createJIT(std::move(M));

// Set up the lazy function creator that records the name of unresolved
// external functions in the module.
std::vector<std::string> UnresolvedExternals;
auto UnresolvedHandler = [&UnresolvedExternals] (const std::string &str) {
UnresolvedExternals.push_back(str);
return (void *)(uintptr_t)-1;
};
TheJIT->InstallLazyFunctionCreator(UnresolvedHandler);

// JIT the module.
TheJIT->finalizeObject();

// Verify that our handler was called for each unresolved function.
auto I = UnresolvedExternals.begin(), E = UnresolvedExternals.end();
EXPECT_EQ(UnresolvedExternals.size(), static_cast<size_t>(2));
EXPECT_FALSE(std::find(I, E, "Foo1") == E);
EXPECT_FALSE(std::find(I, E, "Foo2") == E);
}

}

0 comments on commit 22af148

Please sign in to comment.