diff options
author | Chris Lattner <sabre@nondot.org> | 2003-05-14 13:53:40 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-05-14 13:53:40 +0000 |
commit | 22080f9f168b0129d0ed3a2a29a145e17723c3ba (patch) | |
tree | 1ee2ae5caa38865739d1561bc07cf7758c9bf071 /lib/ExecutionEngine/JIT/Intercept.cpp | |
parent | 1b72216a711cddf5fc53cf0a4f5407b41b8303c9 (diff) |
Add support for atexit handlers to the JIT, fixing 2003-05-14-AtExit.c
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6193 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine/JIT/Intercept.cpp')
-rw-r--r-- | lib/ExecutionEngine/JIT/Intercept.cpp | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/lib/ExecutionEngine/JIT/Intercept.cpp b/lib/ExecutionEngine/JIT/Intercept.cpp index 448ff2d356..aa58186ad8 100644 --- a/lib/ExecutionEngine/JIT/Intercept.cpp +++ b/lib/ExecutionEngine/JIT/Intercept.cpp @@ -12,6 +12,17 @@ #include <dlfcn.h> // dlsym access #include <iostream> +// AtExitList - List of functions registered with the at_exit function +static std::vector<void (*)()> AtExitList; + +void VM::runAtExitHandlers() { + while (!AtExitList.empty()) { + void (*Fn)() = AtExitList.back(); + AtExitList.pop_back(); + Fn(); + } +} + //===----------------------------------------------------------------------===// // Function stubs that are invoked instead of raw system calls //===----------------------------------------------------------------------===// @@ -21,12 +32,14 @@ static void NoopFn() {} // jit_exit - Used to intercept the "exit" system call. static void jit_exit(int Status) { - exit(Status); // Do nothing for now. + VM::runAtExitHandlers(); // Run at_exit handlers... + exit(Status); } // jit_atexit - Used to intercept the "at_exit" system call. static int jit_atexit(void (*Fn)(void)) { - return atexit(Fn); // Do nothing for now. + AtExitList.push_back(Fn); // Take note of at_exit handler... + return 0; // Always successful } //===----------------------------------------------------------------------===// @@ -38,7 +51,7 @@ static int jit_atexit(void (*Fn)(void)) { void *VM::getPointerToNamedFunction(const std::string &Name) { // Check to see if this is one of the functions we want to intercept... if (Name == "exit") return (void*)&jit_exit; - if (Name == "at_exit") return (void*)&jit_atexit; + if (Name == "atexit") return (void*)&jit_atexit; // If it's an external function, look it up in the process image... void *Ptr = dlsym(0, Name.c_str()); |