blob: e1d0c95121e7797cfd651c70f1658e802bd1fc55 [file] [log] [blame]
#ifndef _COMPILER_H_
#define _COMPILER_H_
#include "llvm/ExecutionEngine/SectionMemoryManager.h"
#include "allocator.h"
#include "util.h"
namespace llvm {
class Module;
class ExecutionEngine;
class GlobalValue;
class Function;
namespace legacy {
class PassManager;
}
using legacy::PassManager;
};
namespace vmkit {
class VMKit;
class CompilationUnit;
class Symbol : public PermanentObject {
uint64_t cachedWeight;
public:
virtual void* getSymbolAddress();
virtual llvm::Function* llvmFunction() { return 0; }
virtual uint64_t inlineWeight();
virtual CompilationUnit* unit() { return 0; }
virtual void markAsNeverInline();
};
class NativeSymbol : public Symbol {
llvm::Function* original;
void* addr;
public:
NativeSymbol(llvm::Function* _original, void* _addr) {
original = _original;
addr = _addr;
}
llvm::Function* llvmFunction() { return original; }
void* getSymbolAddress() { return addr; }
};
class CompilationUnit : public llvm::SectionMemoryManager {
typedef std::map<const char*, Symbol*, Util::char_less_t, StdAllocator<std::pair<const char*, Symbol*> > > SymbolMap;
BumpAllocator* _allocator;
SymbolMap _symbolTable;
pthread_mutex_t _mutexSymbolTable;
llvm::ExecutionEngine* _ee;
llvm::PassManager* pm;
protected:
void operator delete(void* self);
public:
void* operator new(size_t n, BumpAllocator* allocator);
CompilationUnit(BumpAllocator* allocator, const char* id, bool runInlinePass, bool onlyAlwaysInline);
~CompilationUnit();
static void destroy(CompilationUnit* unit);
void addSymbol(const char* id, vmkit::Symbol* symbol);
Symbol* getSymbol(const char* id, bool error=1);
uint64_t getSymbolAddress(const std::string &Name);
BumpAllocator* allocator() { return _allocator; }
llvm::ExecutionEngine* ee() { return _ee; }
void prepareModule(llvm::Module* module);
void compileModule(llvm::Module* module);
};
}
#endif