diff options
Diffstat (limited to 'lib/ExecutionEngine')
-rw-r--r-- | lib/ExecutionEngine/JIT/Intercept.cpp | 4 | ||||
-rw-r--r-- | lib/ExecutionEngine/JIT/JIT.cpp | 37 | ||||
-rw-r--r-- | lib/ExecutionEngine/JIT/JIT.h | 9 |
3 files changed, 27 insertions, 23 deletions
diff --git a/lib/ExecutionEngine/JIT/Intercept.cpp b/lib/ExecutionEngine/JIT/Intercept.cpp index 5d256f9007..0b1b976836 100644 --- a/lib/ExecutionEngine/JIT/Intercept.cpp +++ b/lib/ExecutionEngine/JIT/Intercept.cpp @@ -28,7 +28,7 @@ static std::vector<void (*)()> AtExitHandlers; /// calls to atexit(3), which we intercept and store in /// AtExitHandlers. /// -void JIT::runAtExitHandlers() { +static void runAtExitHandlers() { while (!AtExitHandlers.empty()) { void (*Fn)() = AtExitHandlers.back(); AtExitHandlers.pop_back(); @@ -45,7 +45,7 @@ static void NoopFn() {} // jit_exit - Used to intercept the "exit" library call. static void jit_exit(int Status) { - JIT::runAtExitHandlers(); // Run atexit handlers... + runAtExitHandlers(); // Run atexit handlers... exit(Status); } diff --git a/lib/ExecutionEngine/JIT/JIT.cpp b/lib/ExecutionEngine/JIT/JIT.cpp index d39741438a..6a067fd054 100644 --- a/lib/ExecutionEngine/JIT/JIT.cpp +++ b/lib/ExecutionEngine/JIT/JIT.cpp @@ -51,22 +51,31 @@ JIT::~JIT() { /// run - Start execution with the specified function and arguments. /// -GenericValue JIT::run(Function *F, const std::vector<GenericValue> &ArgValues) { +GenericValue JIT::runFunction(Function *F, + const std::vector<GenericValue> &ArgValues) { assert (F && "Function *F was null at entry to run()"); + GenericValue rv; + + if (ArgValues.size() == 3) { + int (*PF)(int, char **, const char **) = + (int(*)(int, char **, const char **))getPointerToFunction(F); + assert(PF && "Pointer to fn's code was null after getPointerToFunction"); + + // Call the function. + int ExitCode = PF(ArgValues[0].IntVal, (char **) GVTOP (ArgValues[1]), + (const char **) GVTOP (ArgValues[2])); + + rv.IntVal = ExitCode; + } else { + // FIXME: This code should handle a couple of common cases efficiently, but + // it should also implement the general case by code-gening a new anonymous + // nullary function to call. + assert(ArgValues.size() == 1); + void (*PF)(int) = (void(*)(int))getPointerToFunction(F); + assert(PF && "Pointer to fn's code was null after getPointerToFunction"); + PF(ArgValues[0].IntVal); + } - int (*PF)(int, char **, const char **) = - (int(*)(int, char **, const char **))getPointerToFunction(F); - assert(PF != 0 && "Pointer to fn's code was null after getPointerToFunction"); - - // Call the function. - int ExitCode = PF(ArgValues[0].IntVal, (char **) GVTOP (ArgValues[1]), - (const char **) GVTOP (ArgValues[2])); - - // Run any atexit handlers now! - runAtExitHandlers(); - - GenericValue rv; - rv.IntVal = ExitCode; return rv; } diff --git a/lib/ExecutionEngine/JIT/JIT.h b/lib/ExecutionEngine/JIT/JIT.h index 76d2b7a917..53e8738bb8 100644 --- a/lib/ExecutionEngine/JIT/JIT.h +++ b/lib/ExecutionEngine/JIT/JIT.h @@ -50,8 +50,8 @@ public: /// run - Start execution with the specified function and arguments. /// - virtual GenericValue run(Function *F, - const std::vector<GenericValue> &ArgValues); + virtual GenericValue runFunction(Function *F, + const std::vector<GenericValue> &ArgValues); /// getPointerToNamedFunction - This method returns the address of the /// specified function by using the dlsym function call. As such it is only @@ -64,11 +64,6 @@ public: // static void CompilationCallback(); - /// runAtExitHandlers - Before exiting the program, at_exit functions must be - /// called. This method calls them. - /// - static void runAtExitHandlers(); - /// getPointerToFunction - This returns the address of the specified function, /// compiling it if necessary. /// |