| //===--- PrettyStackTrace.h - Crash trace information -----------*- C++ -*-===// |
| // |
| // This source file is part of the Swift.org open source project |
| // |
| // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors |
| // Licensed under Apache License v2.0 with Runtime Library Exception |
| // |
| // See https://swift.org/LICENSE.txt for license information |
| // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines RAII classes that give better diagnostic output |
| // about when, exactly, a crash is occurring. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef SWIFT_PRETTYSTACKTRACE_H |
| #define SWIFT_PRETTYSTACKTRACE_H |
| |
| #include "llvm/Support/PrettyStackTrace.h" |
| #include "swift/Basic/SourceLoc.h" |
| #include "swift/AST/Type.h" |
| |
| namespace swift { |
| class ASTContext; |
| class Decl; |
| class Expr; |
| class Pattern; |
| class Stmt; |
| class TypeRepr; |
| |
| void printSourceLocDescription(llvm::raw_ostream &out, SourceLoc loc, |
| ASTContext &Context); |
| |
| /// PrettyStackTraceLocation - Observe that we are doing some |
| /// processing starting at a fixed location. |
| class PrettyStackTraceLocation : public llvm::PrettyStackTraceEntry { |
| ASTContext &Context; |
| SourceLoc Loc; |
| const char *Action; |
| public: |
| PrettyStackTraceLocation(ASTContext &C, const char *action, SourceLoc loc) |
| : Context(C), Loc(loc), Action(action) {} |
| virtual void print(llvm::raw_ostream &OS) const; |
| }; |
| |
| void printDeclDescription(llvm::raw_ostream &out, const Decl *D, |
| ASTContext &Context); |
| |
| /// PrettyStackTraceDecl - Observe that we are processing a specific |
| /// declaration. |
| class PrettyStackTraceDecl : public llvm::PrettyStackTraceEntry { |
| const Decl *TheDecl; |
| const char *Action; |
| public: |
| PrettyStackTraceDecl(const char *action, const Decl *D) |
| : TheDecl(D), Action(action) {} |
| virtual void print(llvm::raw_ostream &OS) const; |
| }; |
| |
| void printExprDescription(llvm::raw_ostream &out, Expr *E, |
| ASTContext &Context); |
| |
| /// PrettyStackTraceExpr - Observe that we are processing a specific |
| /// expression. |
| class PrettyStackTraceExpr : public llvm::PrettyStackTraceEntry { |
| ASTContext &Context; |
| Expr *TheExpr; |
| const char *Action; |
| public: |
| PrettyStackTraceExpr(ASTContext &C, const char *action, Expr *E) |
| : Context(C), TheExpr(E), Action(action) {} |
| virtual void print(llvm::raw_ostream &OS) const; |
| }; |
| |
| void printStmtDescription(llvm::raw_ostream &out, Stmt *S, |
| ASTContext &Context); |
| |
| /// PrettyStackTraceStmt - Observe that we are processing a specific |
| /// statement. |
| class PrettyStackTraceStmt : public llvm::PrettyStackTraceEntry { |
| ASTContext &Context; |
| Stmt *TheStmt; |
| const char *Action; |
| public: |
| PrettyStackTraceStmt(ASTContext &C, const char *action, Stmt *S) |
| : Context(C), TheStmt(S), Action(action) {} |
| virtual void print(llvm::raw_ostream &OS) const; |
| }; |
| |
| void printPatternDescription(llvm::raw_ostream &out, Pattern *P, |
| ASTContext &Context); |
| |
| /// PrettyStackTracePattern - Observe that we are processing a |
| /// specific pattern. |
| class PrettyStackTracePattern : public llvm::PrettyStackTraceEntry { |
| ASTContext &Context; |
| Pattern *ThePattern; |
| const char *Action; |
| public: |
| PrettyStackTracePattern(ASTContext &C, const char *action, Pattern *P) |
| : Context(C), ThePattern(P), Action(action) {} |
| virtual void print(llvm::raw_ostream &OS) const; |
| }; |
| |
| void printTypeDescription(llvm::raw_ostream &out, Type T, |
| ASTContext &Context); |
| |
| /// PrettyStackTraceType - Observe that we are processing a specific type. |
| class PrettyStackTraceType : public llvm::PrettyStackTraceEntry { |
| ASTContext &Context; |
| Type TheType; |
| const char *Action; |
| public: |
| PrettyStackTraceType(ASTContext &C, const char *action, Type type) |
| : Context(C), TheType(type), Action(action) {} |
| virtual void print(llvm::raw_ostream &OS) const; |
| }; |
| |
| /// Observe that we are processing a specific type representation. |
| class PrettyStackTraceTypeRepr : public llvm::PrettyStackTraceEntry { |
| ASTContext &Context; |
| TypeRepr *TheType; |
| const char *Action; |
| public: |
| PrettyStackTraceTypeRepr(ASTContext &C, const char *action, TypeRepr *type) |
| : Context(C), TheType(type), Action(action) {} |
| virtual void print(llvm::raw_ostream &OS) const; |
| }; |
| |
| } // end namespace swift |
| |
| #endif |