зеркало из https://github.com/microsoft/clang-1.git
Use -frewrite-includes for crash reports.
In future changes we should: * use __builtin_trap rather than derefing 'random' volatile pointers. * avoid dumping temporary files into /tmp when running tests, instead preferring a location that is properly cleaned up by lit. Review by Chandler Carruth. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159469 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
4ac5751efb
Коммит
e75d9cfbf4
|
@ -592,6 +592,11 @@ ANNOTATION(pragma_vis)
|
|||
// handles them.
|
||||
ANNOTATION(pragma_pack)
|
||||
|
||||
// Annotation for #pragma clang __debug parser_crash...
|
||||
// The lexer produces these so that they only take effect when the parser
|
||||
// handles them.
|
||||
ANNOTATION(pragma_parser_crash)
|
||||
|
||||
#undef ANNOTATION
|
||||
#undef TESTING_KEYWORD
|
||||
#undef OBJC2_AT_KEYWORD
|
||||
|
|
|
@ -76,6 +76,8 @@ public:
|
|||
|
||||
const DerivedArgList &getArgs() const { return *TranslatedArgs; }
|
||||
|
||||
DerivedArgList &getArgs() { return *TranslatedArgs; }
|
||||
|
||||
ActionList &getActions() { return Actions; }
|
||||
const ActionList &getActions() const { return Actions; }
|
||||
|
||||
|
|
|
@ -40,17 +40,17 @@
|
|||
|
||||
// C family source language (with and without preprocessing).
|
||||
TYPE("cpp-output", PP_C, INVALID, "i", "u")
|
||||
TYPE("c", C, PP_C, 0, "u")
|
||||
TYPE("cl", CL, PP_C, 0, "u")
|
||||
TYPE("cuda", CUDA, PP_CXX, 0, "u")
|
||||
TYPE("c", C, PP_C, "c", "u")
|
||||
TYPE("cl", CL, PP_C, "cl", "u")
|
||||
TYPE("cuda", CUDA, PP_CXX, "cpp", "u")
|
||||
TYPE("objective-c-cpp-output", PP_ObjC, INVALID, "mi", "u")
|
||||
TYPE("objc-cpp-output", PP_ObjC_Alias, INVALID, "mi", "u")
|
||||
TYPE("objective-c", ObjC, PP_ObjC, 0, "u")
|
||||
TYPE("objective-c", ObjC, PP_ObjC, "m", "u")
|
||||
TYPE("c++-cpp-output", PP_CXX, INVALID, "ii", "u")
|
||||
TYPE("c++", CXX, PP_CXX, 0, "u")
|
||||
TYPE("c++", CXX, PP_CXX, "cpp", "u")
|
||||
TYPE("objective-c++-cpp-output", PP_ObjCXX, INVALID, "mii", "u")
|
||||
TYPE("objc++-cpp-output", PP_ObjCXX_Alias, INVALID, "mii", "u")
|
||||
TYPE("objective-c++", ObjCXX, PP_ObjCXX, 0, "u")
|
||||
TYPE("objective-c++", ObjCXX, PP_ObjCXX, "mm", "u")
|
||||
|
||||
// C family input files to precompile.
|
||||
TYPE("c-header-cpp-output", PP_CHeader, INVALID, "i", "p")
|
||||
|
|
|
@ -392,6 +392,7 @@ void Driver::generateCompilationDiagnostics(Compilation &C,
|
|||
// Suppress driver output and emit preprocessor output to temp file.
|
||||
CCCIsCPP = true;
|
||||
CCGenDiagnostics = true;
|
||||
C.getArgs().AddFlagArg(0, Opts->getOption(options::OPT_frewrite_includes));
|
||||
|
||||
// Save the original job command(s).
|
||||
std::string Cmd;
|
||||
|
@ -1181,7 +1182,10 @@ Action *Driver::ConstructPhaseAction(const ArgList &Args, phases::ID Phase,
|
|||
if (Args.hasArg(options::OPT_M, options::OPT_MM)) {
|
||||
OutputTy = types::TY_Dependencies;
|
||||
} else {
|
||||
OutputTy = types::getPreprocessedType(Input->getType());
|
||||
OutputTy = Input->getType();
|
||||
if (!Args.hasFlag(options::OPT_frewrite_includes,
|
||||
options::OPT_fno_rewrite_includes, false))
|
||||
OutputTy = types::getPreprocessedType(OutputTy);
|
||||
assert(OutputTy != types::TY_INVALID &&
|
||||
"Cannot preprocess this input type!");
|
||||
}
|
||||
|
|
|
@ -1010,6 +1010,10 @@ struct PragmaDebugHandler : public PragmaHandler {
|
|||
llvm_unreachable("This is an assertion!");
|
||||
} else if (II->isStr("crash")) {
|
||||
*(volatile int*) 0x11 = 0;
|
||||
} else if (II->isStr("parser_crash")) {
|
||||
Token Crasher;
|
||||
Crasher.setKind(tok::annot_pragma_parser_crash);
|
||||
PP.EnterToken(Crasher);
|
||||
} else if (II->isStr("llvm_fatal_error")) {
|
||||
llvm::report_fatal_error("#pragma clang __debug llvm_fatal_error");
|
||||
} else if (II->isStr("llvm_unreachable")) {
|
||||
|
|
|
@ -4252,6 +4252,8 @@ void Parser::ParseDirectDeclarator(Declarator &D) {
|
|||
// portion is empty), if an abstract-declarator is allowed.
|
||||
D.SetIdentifier(0, Tok.getLocation());
|
||||
} else {
|
||||
if (Tok.getKind() == tok::annot_pragma_parser_crash)
|
||||
*(volatile int*) 0x11 = 0;
|
||||
if (D.getContext() == Declarator::MemberContext)
|
||||
Diag(Tok, diag::err_expected_member_name_or_semi)
|
||||
<< D.getDeclSpec().getSourceRange();
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
// RUN: %clang -fsyntax-only %s 2>&1 | FileCheck %s
|
||||
// REQUIRES: crash-recovery
|
||||
|
||||
#pragma clang __debug parser_crash
|
||||
// CHECK: Preprocessed source(s) and associated run script(s) are located at:
|
||||
// CHECK-NEXT: clang-3: note: diagnostic msg: {{.*}}.c
|
Загрузка…
Ссылка в новой задаче