#include <stdint.h>
+#include <llvm/Support/raw_ostream.h>
#include <llvm/PassManager.h>
#include <llvm/ExecutionEngine/ExecutionEngine.h>
#include <llvm/ExecutionEngine/JITMemoryManager.h>
#include <llvm/Transforms/Scalar.h>
#include <llvm/Support/CommandLine.h>
#include "llvm/Support/PassNameParser.h"
+#include "llvm/Support/PrettyStackTrace.h"
#include <llvm/CodeGen/Passes.h>
#include <llvm/CodeGen/MachineFunctionPass.h>
//#include <llvm/LinkAllPasses.h>
#include "mini-llvm-cpp.h"
+extern "C" void LLVMInitializeX86TargetInfo();
+
using namespace llvm;
class MonoJITMemoryManager : public JITMemoryManager
unsigned char *getGOTBase() const {
return mm->getGOTBase ();
}
-
+
+#if LLVM_MAJOR_VERSION == 2 && LLVM_MINOR_VERSION < 7
void *getDlsymTable() const {
return mm->getDlsymTable ();
}
-
+
void SetDlsymTable(void *ptr);
-
+#endif
+
+ void setPoisonMemory(bool) {
+ }
+
unsigned char *startFunctionBody(const Function *F,
uintptr_t &ActualSize);
unsigned char *FunctionEnd);
unsigned char *allocateSpace(intptr_t Size, unsigned Alignment);
+
+ uint8_t *allocateGlobal(uintptr_t Size, unsigned Alignment);
void deallocateMemForFunction(const Function *F);
void endExceptionTable(const Function *F, unsigned char *TableStart,
unsigned char *TableEnd,
unsigned char* FrameRegister);
+
+#if LLVM_MAJOR_VERSION == 2 && LLVM_MINOR_VERSION >= 7
+ virtual void deallocateFunctionBody(void*) {
+ }
+
+ virtual void deallocateExceptionTable(void*) {
+ }
+#endif
};
MonoJITMemoryManager::MonoJITMemoryManager ()
{
mm->AllocateGOT ();
}
-
+
+#if LLVM_MAJOR_VERSION == 2 && LLVM_MINOR_VERSION < 7
void
MonoJITMemoryManager::SetDlsymTable(void *ptr)
{
mm->SetDlsymTable (ptr);
}
-
+#endif
+
unsigned char *
MonoJITMemoryManager::startFunctionBody(const Function *F,
uintptr_t &ActualSize)
{
return new unsigned char [Size];
}
-
+
+uint8_t *
+MonoJITMemoryManager::allocateGlobal(uintptr_t Size, unsigned Alignment)
+{
+ return new unsigned char [Size];
+}
+
void
MonoJITMemoryManager::deallocateMemForFunction(const Function *F)
{
static FunctionPassManager *fpm;
+static LLVMContext ctx;
+
void
mono_llvm_optimize_method (LLVMValueRef method)
{
mono_llvm_dump_value (LLVMValueRef value)
{
/* Same as LLVMDumpValue (), but print to stdout */
- cout << (*unwrap<Value> (value));
+ outs () << (*unwrap<Value> (value));
}
/* Missing overload for building an alloca with an alignment */
LLVMValueRef ArraySize,
int alignment, const char *Name)
{
- return wrap (unwrap (builder)->Insert (new AllocaInst(unwrap (Ty), unwrap (ArraySize), alignment), Name));
+ return wrap (unwrap (builder)->Insert (new AllocaInst (unwrap (Ty), unwrap (ArraySize), alignment), Name));
}
LLVMValueRef
return wrap(unwrap(builder)->CreateLoad(unwrap(PointerVal), true, Name));
}
+void
+mono_llvm_replace_uses_of (LLVMValueRef var, LLVMValueRef v)
+{
+ Value *V = ConstantExpr::getTruncOrBitCast (unwrap<Constant> (v), unwrap (var)->getType ());
+ unwrap (var)->replaceAllUsesWith (V);
+}
+
static cl::list<const PassInfo*, bool, PassNameParser>
PassList(cl::desc("Optimizations available:"));
{
std::string Error;
+ LLVMInitializeX86Target ();
+ LLVMInitializeX86TargetInfo ();
+
llvm::cl::ParseEnvironmentOptions("mono", "MONO_LLVM", "", false);
mono_mm = new MonoJITMemoryManager ();
mono_mm->alloc_cb = alloc_cb;
mono_mm->emitted_cb = emitted_cb;
- ExceptionHandling = true;
+ DwarfExceptionHandling = true;
+ // PrettyStackTrace installs signal handlers which trip up libgc
+ DisablePrettyStackTrace = true;
ExecutionEngine *EE = ExecutionEngine::createJIT (unwrap (MP), &Error, mono_mm, CodeGenOpt::Default);
if (!EE) {
- cerr << "Unable to create LLVM ExecutionEngine: " << Error << "\n";
+ errs () << "Unable to create LLVM ExecutionEngine: " << Error << "\n";
g_assert_not_reached ();
}
EE->InstallExceptionTableRegister (exception_cb);
if (PassInf->getNormalCtor())
P = PassInf->getNormalCtor()();
if (dynamic_cast<MachineFunctionPass*>(P) != 0) {
- cerr << PassInf->getPassName () << " is a machine function pass.\n";
+ errs () << PassInf->getPassName () << " is a machine function pass.\n";
} else {
fpm->add (P);
}