mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Deal with error handling better.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34887 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c923435a59
commit
d4c0e62413
@ -45,6 +45,7 @@ ExecutionEngine::ExecutionEngine(Module *M) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ExecutionEngine::~ExecutionEngine() {
|
ExecutionEngine::~ExecutionEngine() {
|
||||||
|
clearAllGlobalMappings();
|
||||||
for (unsigned i = 0, e = Modules.size(); i != e; ++i)
|
for (unsigned i = 0, e = Modules.size(); i != e; ++i)
|
||||||
delete Modules[i];
|
delete Modules[i];
|
||||||
}
|
}
|
||||||
@ -252,16 +253,17 @@ int ExecutionEngine::runFunctionAsMain(Function *Fn,
|
|||||||
/// NULL is returned.
|
/// NULL is returned.
|
||||||
///
|
///
|
||||||
ExecutionEngine *ExecutionEngine::create(ModuleProvider *MP,
|
ExecutionEngine *ExecutionEngine::create(ModuleProvider *MP,
|
||||||
bool ForceInterpreter) {
|
bool ForceInterpreter,
|
||||||
|
std::string *ErrorStr) {
|
||||||
ExecutionEngine *EE = 0;
|
ExecutionEngine *EE = 0;
|
||||||
|
|
||||||
// Unless the interpreter was explicitly selected, try making a JIT.
|
// Unless the interpreter was explicitly selected, try making a JIT.
|
||||||
if (!ForceInterpreter && JITCtor)
|
if (!ForceInterpreter && JITCtor)
|
||||||
EE = JITCtor(MP);
|
EE = JITCtor(MP, ErrorStr);
|
||||||
|
|
||||||
// If we can't make a JIT, make an interpreter instead.
|
// If we can't make a JIT, make an interpreter instead.
|
||||||
if (EE == 0 && InterpCtor)
|
if (EE == 0 && InterpCtor)
|
||||||
EE = InterpCtor(MP);
|
EE = InterpCtor(MP, ErrorStr);
|
||||||
|
|
||||||
if (EE) {
|
if (EE) {
|
||||||
// Make sure we can resolve symbols in the program as well. The zero arg
|
// Make sure we can resolve symbols in the program as well. The zero arg
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include "llvm/DerivedTypes.h"
|
#include "llvm/DerivedTypes.h"
|
||||||
#include "llvm/Module.h"
|
#include "llvm/Module.h"
|
||||||
#include "llvm/ModuleProvider.h"
|
#include "llvm/ModuleProvider.h"
|
||||||
|
#include <iostream>
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
static struct RegisterInterp {
|
static struct RegisterInterp {
|
||||||
@ -31,13 +32,20 @@ namespace llvm {
|
|||||||
|
|
||||||
/// create - Create a new interpreter object. This can never fail.
|
/// create - Create a new interpreter object. This can never fail.
|
||||||
///
|
///
|
||||||
ExecutionEngine *Interpreter::create(ModuleProvider *MP) {
|
ExecutionEngine *Interpreter::create(ModuleProvider *MP, std::string* ErrStr) {
|
||||||
Module *M;
|
// Tell this ModuleProvide to materialize and release the module
|
||||||
try {
|
Module *M = MP->releaseModule(ErrStr);
|
||||||
M = MP->materializeModule();
|
if (!M)
|
||||||
} catch (...) {
|
// We got an error, just return 0
|
||||||
return 0; // error materializing the module.
|
return 0;
|
||||||
}
|
|
||||||
|
// This is a bit nasty, but the ExecutionEngine won't be able to delete the
|
||||||
|
// module due to use/def issues if we don't delete this MP here. Below we
|
||||||
|
// construct a new Interpreter with the Module we just got. This creates a
|
||||||
|
// new ExistingModuleProvider in the EE instance. Consequently, MP is left
|
||||||
|
// dangling and it contains references into the module which cause problems
|
||||||
|
// when the module is deleted via the ExistingModuleProvide via EE.
|
||||||
|
delete MP;
|
||||||
|
|
||||||
// FIXME: This should probably compute the entire data layout
|
// FIXME: This should probably compute the entire data layout
|
||||||
std::string DataLayout;
|
std::string DataLayout;
|
||||||
|
@ -120,7 +120,7 @@ public:
|
|||||||
|
|
||||||
/// create - Create an interpreter ExecutionEngine. This can never fail.
|
/// create - Create an interpreter ExecutionEngine. This can never fail.
|
||||||
///
|
///
|
||||||
static ExecutionEngine *create(ModuleProvider *M);
|
static ExecutionEngine *create(ModuleProvider *M, std::string *ErrorStr = 0);
|
||||||
|
|
||||||
/// run - Start execution with the specified function and arguments.
|
/// run - Start execution with the specified function and arguments.
|
||||||
///
|
///
|
||||||
|
@ -71,7 +71,7 @@ public:
|
|||||||
/// create - Create an return a new JIT compiler if there is one available
|
/// create - Create an return a new JIT compiler if there is one available
|
||||||
/// for the current target. Otherwise, return null.
|
/// for the current target. Otherwise, return null.
|
||||||
///
|
///
|
||||||
static ExecutionEngine *create(ModuleProvider *MP);
|
static ExecutionEngine *create(ModuleProvider *MP, std::string* = 0);
|
||||||
|
|
||||||
/// run - Start execution with the specified function and arguments.
|
/// run - Start execution with the specified function and arguments.
|
||||||
///
|
///
|
||||||
|
@ -38,11 +38,15 @@ MAttrs("mattr",
|
|||||||
/// create - Create an return a new JIT compiler if there is one available
|
/// create - Create an return a new JIT compiler if there is one available
|
||||||
/// for the current target. Otherwise, return null.
|
/// for the current target. Otherwise, return null.
|
||||||
///
|
///
|
||||||
ExecutionEngine *JIT::create(ModuleProvider *MP) {
|
ExecutionEngine *JIT::create(ModuleProvider *MP, std::string *ErrorStr) {
|
||||||
if (MArch == 0) {
|
if (MArch == 0) {
|
||||||
std::string Error;
|
std::string Error;
|
||||||
MArch = TargetMachineRegistry::getClosestTargetForJIT(Error);
|
MArch = TargetMachineRegistry::getClosestTargetForJIT(Error);
|
||||||
if (MArch == 0) return 0;
|
if (MArch == 0) {
|
||||||
|
if (ErrorStr)
|
||||||
|
*ErrorStr = Error;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
} else if (MArch->JITMatchQualityFn() == 0) {
|
} else if (MArch->JITMatchQualityFn() == 0) {
|
||||||
cerr << "WARNING: This target JIT is not designed for the host you are"
|
cerr << "WARNING: This target JIT is not designed for the host you are"
|
||||||
<< " running. If bad things happen, please choose a different "
|
<< " running. If bad things happen, please choose a different "
|
||||||
@ -66,5 +70,8 @@ ExecutionEngine *JIT::create(ModuleProvider *MP) {
|
|||||||
// If the target supports JIT code generation, return a new JIT now.
|
// If the target supports JIT code generation, return a new JIT now.
|
||||||
if (TargetJITInfo *TJ = Target->getJITInfo())
|
if (TargetJITInfo *TJ = Target->getJITInfo())
|
||||||
return new JIT(MP, *Target, *TJ);
|
return new JIT(MP, *Target, *TJ);
|
||||||
|
|
||||||
|
if (ErrorStr)
|
||||||
|
*ErrorStr = "target does not support JIT code generation";
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user