diff options
author | David Blaikie <dblaikie@gmail.com> | 2012-06-29 22:03:56 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2012-06-29 22:03:56 +0000 |
commit | e75d9cfbf41a0ee9e456a665776f91fdd9773b36 (patch) | |
tree | 13125e0fea4a9ade1f56af7507b1dd2cd550a79c | |
parent | 4ac5751efb9de1065c71b0db587185d552803e2f (diff) |
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
-rw-r--r-- | include/clang/Basic/TokenKinds.def | 5 | ||||
-rw-r--r-- | include/clang/Driver/Compilation.h | 2 | ||||
-rw-r--r-- | include/clang/Driver/Types.def | 12 | ||||
-rw-r--r-- | lib/Driver/Driver.cpp | 6 | ||||
-rw-r--r-- | lib/Lex/Pragma.cpp | 4 | ||||
-rw-r--r-- | lib/Parse/ParseDecl.cpp | 2 | ||||
-rw-r--r-- | test/Driver/crash-report.c | 6 |
7 files changed, 30 insertions, 7 deletions
diff --git a/include/clang/Basic/TokenKinds.def b/include/clang/Basic/TokenKinds.def index bbab3c7f36..c380f8c907 100644 --- a/include/clang/Basic/TokenKinds.def +++ b/include/clang/Basic/TokenKinds.def @@ -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 diff --git a/include/clang/Driver/Compilation.h b/include/clang/Driver/Compilation.h index 6f1a2217cd..7a10d56735 100644 --- a/include/clang/Driver/Compilation.h +++ b/include/clang/Driver/Compilation.h @@ -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; } diff --git a/include/clang/Driver/Types.def b/include/clang/Driver/Types.def index b107dfb247..318c55ad63 100644 --- a/include/clang/Driver/Types.def +++ b/include/clang/Driver/Types.def @@ -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") diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index a6af7af771..2f2d07c8b9 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -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!"); } diff --git a/lib/Lex/Pragma.cpp b/lib/Lex/Pragma.cpp index 7b94d268b5..c9cc4adf40 100644 --- a/lib/Lex/Pragma.cpp +++ b/lib/Lex/Pragma.cpp @@ -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")) { diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index 489a46ca39..409f8e002a 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -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(); diff --git a/test/Driver/crash-report.c b/test/Driver/crash-report.c new file mode 100644 index 0000000000..944581a103 --- /dev/null +++ b/test/Driver/crash-report.c @@ -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 |