mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-18 22:38:56 +00:00
Never set any signal handlers.
Never call setjmp(), longjmp() or strsignal(). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9014 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
58a6faac65
commit
235b200e6b
@ -13,9 +13,7 @@
|
|||||||
#include "llvm/Assembly/Writer.h"
|
#include "llvm/Assembly/Writer.h"
|
||||||
#include "Support/CommandLine.h"
|
#include "Support/CommandLine.h"
|
||||||
#include "Support/Statistic.h"
|
#include "Support/Statistic.h"
|
||||||
#include <math.h> // For fmod
|
#include <cmath> // For fmod
|
||||||
#include <signal.h>
|
|
||||||
#include <setjmp.h>
|
|
||||||
|
|
||||||
Interpreter *TheEE = 0;
|
Interpreter *TheEE = 0;
|
||||||
|
|
||||||
@ -38,27 +36,6 @@ namespace {
|
|||||||
//
|
//
|
||||||
CachedWriter CW; // Object to accelerate printing of LLVM
|
CachedWriter CW; // Object to accelerate printing of LLVM
|
||||||
|
|
||||||
sigjmp_buf SignalRecoverBuffer;
|
|
||||||
static bool InInstruction = false;
|
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
static void SigHandler(int Signal) {
|
|
||||||
if (InInstruction)
|
|
||||||
siglongjmp(SignalRecoverBuffer, Signal);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void initializeSignalHandlers() {
|
|
||||||
struct sigaction Action;
|
|
||||||
Action.sa_handler = SigHandler;
|
|
||||||
Action.sa_flags = SA_SIGINFO;
|
|
||||||
sigemptyset(&Action.sa_mask);
|
|
||||||
sigaction(SIGSEGV, &Action, 0);
|
|
||||||
sigaction(SIGBUS, &Action, 0);
|
|
||||||
sigaction(SIGINT, &Action, 0);
|
|
||||||
sigaction(SIGFPE, &Action, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Value Manipulation code
|
// Value Manipulation code
|
||||||
@ -120,7 +97,6 @@ static void SetValue(Value *V, GenericValue Val, ExecutionContext &SF) {
|
|||||||
|
|
||||||
void Interpreter::initializeExecutionEngine() {
|
void Interpreter::initializeExecutionEngine() {
|
||||||
TheEE = this;
|
TheEE = this;
|
||||||
initializeSignalHandlers();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
@ -681,8 +657,7 @@ GenericValue Interpreter::executeGEPOperation(Value *Ptr, User::op_iterator I,
|
|||||||
std::cerr << "Out of range memory access to element #" << Idx
|
std::cerr << "Out of range memory access to element #" << Idx
|
||||||
<< " of a " << AT->getNumElements() << " element array."
|
<< " of a " << AT->getNumElements() << " element array."
|
||||||
<< " Subscript #" << *I << "\n";
|
<< " Subscript #" << *I << "\n";
|
||||||
// Get outta here!!!
|
abort();
|
||||||
siglongjmp(SignalRecoverBuffer, SIGTRAP);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Ty = ST->getElementType();
|
Ty = ST->getElementType();
|
||||||
@ -1006,17 +981,7 @@ void Interpreter::executeInstruction() {
|
|||||||
// Track the number of dynamic instructions executed.
|
// Track the number of dynamic instructions executed.
|
||||||
++NumDynamicInsts;
|
++NumDynamicInsts;
|
||||||
|
|
||||||
// Set a sigsetjmp buffer so that we can recover if an error happens during
|
|
||||||
// instruction execution...
|
|
||||||
//
|
|
||||||
if (int SigNo = sigsetjmp(SignalRecoverBuffer, 1)) {
|
|
||||||
std::cout << "EXCEPTION OCCURRED [" << strsignal(SigNo) << "]\n";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
InInstruction = true;
|
|
||||||
visit(I); // Dispatch to one of the visit* methods...
|
visit(I); // Dispatch to one of the visit* methods...
|
||||||
InInstruction = false;
|
|
||||||
|
|
||||||
// Reset the current frame location to the top of stack
|
// Reset the current frame location to the top of stack
|
||||||
CurFrame = ECStack.size()-1;
|
CurFrame = ECStack.size()-1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user