"llvm/git@repo.hca.bsc.es:rferrer/llvm-epi-0.8.git" did not exist on "491557712ac32719b197d63e4dba72437df3b61c"
Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
//===--- CrashRecoveryContext.cpp - Crash Recovery ------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "llvm/Support/CrashRecoveryContext.h"
#include "llvm/ADT/SmallString.h"
#include <setjmp.h>
using namespace llvm;
namespace {
struct CrashRecoveryContextImpl;
struct CrashRecoveryContextImpl {
std::string Backtrace;
::jmp_buf JumpBuffer;
volatile unsigned Failed : 1;
public:
CrashRecoveryContextImpl() : Failed(false) {}
void HandleCrash() {
assert(!Failed && "Crash recovery context already failed!");
Failed = true;
// FIXME: Stash the backtrace.
// Jump back to the RunSafely we were called under.
longjmp(JumpBuffer, 1);
}
};
}
static bool gCrashRecoveryEnabled = false;
CrashRecoveryContext::~CrashRecoveryContext() {
CrashRecoveryContextImpl *CRCI = (CrashRecoveryContextImpl *) Impl;
delete CRCI;
}
void CrashRecoveryContext::Enable() {
if (gCrashRecoveryEnabled)
return;
gCrashRecoveryEnabled = true;
}
void CrashRecoveryContext::Disable() {
if (!gCrashRecoveryEnabled)
return;
gCrashRecoveryEnabled = false;
}
bool CrashRecoveryContext::RunSafely(void (*Fn)(void*), void *UserData) {
// If crash recovery is disabled, do nothing.
if (gCrashRecoveryEnabled) {
assert(!Impl && "Crash recovery context already initialized!");
CrashRecoveryContextImpl *CRCI = new CrashRecoveryContextImpl;
Impl = CRCI;
if (setjmp(CRCI->JumpBuffer) != 0) {
return false;
}
}
Fn(UserData);
return true;
}
void CrashRecoveryContext::HandleCrash() {
CrashRecoveryContextImpl *CRCI = (CrashRecoveryContextImpl *) Impl;
assert(CRCI && "Crash recovery context never initialized!");
CRCI->HandleCrash();
}
const std::string &CrashRecoveryContext::getBacktrace() const {
CrashRecoveryContextImpl *CRC = (CrashRecoveryContextImpl *) Impl;
assert(CRC && "Crash recovery context never initialized!");
assert(CRC->Failed && "No crash was detected!");
return CRC->Backtrace;
}