05ba8a3a07
git-svn-id: http://root.cern.ch/svn/root/trunk@45844 27541ba8-7e3a-0410-8455-c3a389f83636
84 lines
2.3 KiB
C++
84 lines
2.3 KiB
C++
//--------------------------------------------------------------------*- C++ -*-
|
|
// CLING - the C++ LLVM-based InterpreterG :)
|
|
// version: $Id$
|
|
// author: Axel Naumann <axel@cern.ch>
|
|
//------------------------------------------------------------------------------
|
|
|
|
#ifndef CLING_EXECUTIONCONTEXT_H
|
|
#define CLING_EXECUTIONCONTEXT_H
|
|
|
|
#include "llvm/ADT/StringRef.h"
|
|
|
|
#include <vector>
|
|
#include <set>
|
|
|
|
namespace llvm {
|
|
class Module;
|
|
class ExecutionEngine;
|
|
struct GenericValue;
|
|
}
|
|
|
|
namespace clang {
|
|
class CompilerInstance;
|
|
class CodeGenerator;
|
|
}
|
|
|
|
namespace cling {
|
|
class Interpreter;
|
|
class Value;
|
|
|
|
class ExecutionContext {
|
|
public:
|
|
typedef void* (*LazyFunctionCreatorFunc_t)(const std::string&);
|
|
|
|
public:
|
|
|
|
ExecutionContext();
|
|
~ExecutionContext();
|
|
|
|
void installLazyFunctionCreator(LazyFunctionCreatorFunc_t fp);
|
|
|
|
void runStaticInitializersOnce(llvm::Module* m);
|
|
void runStaticDestructorsOnce(llvm::Module* m);
|
|
|
|
void executeFunction(llvm::StringRef function,
|
|
llvm::GenericValue* returnValue = 0);
|
|
|
|
///\brief Adds a symbol (function) to the execution engine.
|
|
///
|
|
/// Allows runtime declaration of a function passing its pointer for being
|
|
/// used by JIT generated code.
|
|
///
|
|
/// @param[in] symbolName - The name of the symbol as required by the
|
|
/// linker (mangled if needed)
|
|
/// @param[in] symbolAddress - The function pointer to register
|
|
/// @returns true if the symbol is successfully registered, false otherwise.
|
|
///
|
|
bool addSymbol(const char* symbolName, void* symbolAddress);
|
|
|
|
llvm::ExecutionEngine* getExecutionEngine() const {
|
|
return m_engine;
|
|
}
|
|
|
|
private:
|
|
static void* HandleMissingFunction(const std::string&);
|
|
static void* NotifyLazyFunctionCreators(const std::string&);
|
|
|
|
int verifyModule(llvm::Module* m);
|
|
void printModule(llvm::Module* m);
|
|
void InitializeBuilder(llvm::Module* m);
|
|
|
|
static std::set<std::string> m_unresolvedSymbols;
|
|
static std::vector<LazyFunctionCreatorFunc_t> m_lazyFuncCreator;
|
|
|
|
llvm::ExecutionEngine* m_engine; // Owned by JIT
|
|
|
|
/// \brief prevent the recursive run of the static inits
|
|
bool m_RunningStaticInits;
|
|
|
|
/// \brief Whether cxa_at_exit has been rewired to the Interpreter's version
|
|
bool m_CxaAtExitRemapped;
|
|
};
|
|
} // end cling
|
|
#endif // CLING_EXECUTIONCONTEXT_H
|