Add new abort-on-exceptions flag
authorChris Lattner <sabre@nondot.org>
Tue, 12 Feb 2002 15:47:23 +0000 (15:47 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 12 Feb 2002 15:47:23 +0000 (15:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1737 91177308-0d34-0410-b5e6-96231b3b80d8

lib/ExecutionEngine/Interpreter/Execution.cpp

index d3aa4ccbf62585ef0cf9b69690a924e03eff25f9..0fad82964d2fce3faad3a8a67f448d995b46d53d 100644 (file)
@@ -27,6 +27,7 @@ using std::cerr;
 cl::Flag   QuietMode ("quiet"  , "Do not emit any non-program output");
 cl::Alias  QuietModeA("q"      , "Alias for -quiet", cl::NoFlags, QuietMode);
 cl::Flag   ArrayChecksEnabled("array-checks", "Enable array bound checks");
+cl::Flag   AbortOnExceptions("abort-on-exception", "Halt execution on a machine exception");
 
 // Create a TargetData structure to handle memory addressing and size/alignment
 // computations
@@ -803,7 +804,7 @@ static PointerTy getElementOffset(MemAccessInst *I, ExecutionContext &SF) {
                << " Subscript #" << (ArgOff-I->getFirstIndexOperandNumber())
                << "\n";
           // Get outta here!!!
-          siglongjmp(SignalRecoverBuffer, -1);
+          siglongjmp(SignalRecoverBuffer, SIGTRAP);
         }
 
       Ty = ST->getElementType();
@@ -1134,9 +1135,13 @@ bool Interpreter::executeInstruction() {
   //
   if (int SigNo = sigsetjmp(SignalRecoverBuffer, 1)) {
     --SF.CurInst;   // Back up to erroring instruction
-    if (SigNo != SIGINT && SigNo != -1) {
+    if (SigNo != SIGINT) {
       cout << "EXCEPTION OCCURRED [" << _sys_siglistp[SigNo] << "]:\n";
       printStackTrace();
+      // If -abort-on-exception was specified, terminate LLI instead of trying
+      // to debug it.
+      //
+      if (AbortOnExceptions) exit(1);
     } else if (SigNo == SIGINT) {
       cout << "CTRL-C Detected, execution halted.\n";
     }