From: Chris Lattner Date: Fri, 26 Dec 2003 06:13:47 +0000 (+0000) Subject: No longer run atExit functions from run() X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=ff0f1bb32a439cf82cb09ee29544c894a2bfe877;p=oota-llvm.git No longer run atExit functions from run() rename run to runFunction Genericize the runFunction code a little bit, though it still stinks git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10610 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/ExecutionEngine/JIT/Intercept.cpp b/lib/ExecutionEngine/JIT/Intercept.cpp index 5d256f90078..0b1b976836b 100644 --- a/lib/ExecutionEngine/JIT/Intercept.cpp +++ b/lib/ExecutionEngine/JIT/Intercept.cpp @@ -28,7 +28,7 @@ static std::vector 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 d39741438aa..6a067fd0542 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 &ArgValues) { +GenericValue JIT::runFunction(Function *F, + const std::vector &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 76d2b7a9170..53e8738bb84 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 &ArgValues); + virtual GenericValue runFunction(Function *F, + const std::vector &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. ///