cling/lib/Interpreter/ExecutionContext.h
2012-09-05 09:37:39 +00:00

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