Skip to content

Commit 2deea3c

Browse files
committed
[Request-evaluator] Add PrettyStackTrace support.
Print out the stack of requests being evaluated when we crash, so we can see the dependency chain the triggered the crash.
1 parent 27b4501 commit 2deea3c

File tree

1 file changed

+17
-0
lines changed

1 file changed

+17
-0
lines changed

include/swift/AST/Evaluator.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "llvm/ADT/DenseMap.h"
2525
#include "llvm/ADT/Optional.h"
2626
#include "llvm/ADT/SetVector.h"
27+
#include "llvm/Support/PrettyStackTrace.h"
2728
#include <string>
2829
#include <tuple>
2930
#include <type_traits>
@@ -40,6 +41,21 @@ using llvm::None;
4041

4142
class DiagnosticEngine;
4243

44+
/// Pretty stack trace handler for an arbitrary request.
45+
template<typename Request>
46+
class PrettyStackTraceRequest : public llvm::PrettyStackTraceEntry {
47+
const Request &request;
48+
49+
public:
50+
PrettyStackTraceRequest(const Request &request) : request(request) { }
51+
52+
void print(llvm::raw_ostream &out) const {
53+
out << "While evaluating request ";
54+
simple_display(out, request);
55+
out << "\n";
56+
}
57+
};
58+
4359
/// Evaluation engine that evaluates and caches "requests", checking for cyclic
4460
/// dependencies along the way.
4561
///
@@ -210,6 +226,7 @@ class Evaluator {
210226
// them now anyway.
211227
dependencies[request].clear();
212228

229+
PrettyStackTraceRequest<Request> prettyStackTrace(request);
213230
return request(*this);
214231
}
215232

0 commit comments

Comments
 (0)