]> granicus.if.org Git - clang/commitdiff
Use -frewrite-includes for crash reports.
authorDavid Blaikie <dblaikie@gmail.com>
Fri, 29 Jun 2012 22:03:56 +0000 (22:03 +0000)
committerDavid Blaikie <dblaikie@gmail.com>
Fri, 29 Jun 2012 22:03:56 +0000 (22:03 +0000)
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

include/clang/Basic/TokenKinds.def
include/clang/Driver/Compilation.h
include/clang/Driver/Types.def
lib/Driver/Driver.cpp
lib/Lex/Pragma.cpp
lib/Parse/ParseDecl.cpp
test/Driver/crash-report.c [new file with mode: 0644]

index bbab3c7f3649ed730f62b780530de89bea3e0786..c380f8c907d85e558649b1de5a377285a6a456c6 100644 (file)
@@ -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
index 6f1a2217cd1ca563773d30e4a6aeb6327a8cf4dd..7a10d567354b1d3fefa11ebfae25a3af2c02d5d3 100644 (file)
@@ -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; }
 
index b107dfb247b1ca0f1528bd6e236e50f03bd2cd74..318c55ad6366afccbc97289687d23cce43c260b2 100644 (file)
 
 // 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")
index a6af7af7718af6b1104d8734b3b668ddd297d25a..2f2d07c8b974c54771f8c5ec0a899eb917bb317f 100644 (file)
@@ -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!");
     }
index 7b94d268b5b7ad04ace22997cc2e9eefb3804fe4..c9cc4adf40190058963ea56f5ba0081e8cabd851 100644 (file)
@@ -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")) {
index 489a46ca39d10062f1014cec7dce839b63d0c551..409f8e002abc34ef45e18bcbcf935b45e9e3cbf1 100644 (file)
@@ -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 (file)
index 0000000..944581a
--- /dev/null
@@ -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