diff --git a/clang/include/clang/Driver/CC1Options.td b/clang/include/clang/Driver/CC1Options.td index 733a1080be52d..0d0b05f8961c2 100644 --- a/clang/include/clang/Driver/CC1Options.td +++ b/clang/include/clang/Driver/CC1Options.td @@ -866,8 +866,6 @@ def detailed_preprocessing_record : Flag<["-"], "detailed-preprocessing-record"> HelpText<"include a detailed record of preprocessing actions">; def setup_static_analyzer : Flag<["-"], "setup-static-analyzer">, HelpText<"Set up preprocessor for static analyzer (done automatically when static analyzer is run).">; -def disable_pragma_debug_crash : Flag<["-"], "disable-pragma-debug-crash">, - HelpText<"Disable any #pragma clang __debug that can lead to crashing behavior. This is meant for testing.">; //===----------------------------------------------------------------------===// // OpenCL Options diff --git a/clang/include/clang/Lex/PreprocessorOptions.h b/clang/include/clang/Lex/PreprocessorOptions.h index c551f87e0d7bf..c281cd51e2664 100644 --- a/clang/include/clang/Lex/PreprocessorOptions.h +++ b/clang/include/clang/Lex/PreprocessorOptions.h @@ -189,9 +189,6 @@ class PreprocessorOptions { /// Set up preprocessor for RunAnalysis action. bool SetUpStaticAnalyzer = false; - /// Prevents intended crashes when using #pragma clang __debug. For testing. - bool DisablePragmaDebugCrash = false; - public: PreprocessorOptions() : PrecompiledPreambleBytes(0, false) {} diff --git a/clang/lib/Driver/Compilation.cpp b/clang/lib/Driver/Compilation.cpp index 52477576b2eb1..25aec3690f210 100644 --- a/clang/lib/Driver/Compilation.cpp +++ b/clang/lib/Driver/Compilation.cpp @@ -258,23 +258,14 @@ void Compilation::initCompilationForDiagnostics() { // Remove any user specified output. Claim any unclaimed arguments, so as // to avoid emitting warnings about unused args. - OptSpecifier OutputOpts[] = { - options::OPT_o, options::OPT_MD, options::OPT_MMD, options::OPT_M, - options::OPT_MM, options::OPT_MF, options::OPT_MG, options::OPT_MJ, - options::OPT_MQ, options::OPT_MT, options::OPT_MV}; + OptSpecifier OutputOpts[] = { options::OPT_o, options::OPT_MD, + options::OPT_MMD }; for (unsigned i = 0, e = llvm::array_lengthof(OutputOpts); i != e; ++i) { if (TranslatedArgs->hasArg(OutputOpts[i])) TranslatedArgs->eraseArg(OutputOpts[i]); } TranslatedArgs->ClaimAllArgs(); - // Force re-creation of the toolchain Args, otherwise our modifications just - // above will have no effect. - for (auto Arg : TCArgs) - if (Arg.second != TranslatedArgs) - delete Arg.second; - TCArgs.clear(); - // Redirect stdout/stderr to /dev/null. Redirects = {None, {""}, {""}}; diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 9e2279e90b7e3..65039ac64b5a9 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -4750,11 +4750,6 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, : "-"); } - // Give the gen diagnostics more chances to succeed, by avoiding intentional - // crashes. - if (D.CCGenDiagnostics) - CmdArgs.push_back("-disable-pragma-debug-crash"); - bool UseSeparateSections = isUseSeparateSections(Triple); if (Args.hasFlag(options::OPT_ffunction_sections, diff --git a/clang/lib/Frontend/CompilerInvocation.cpp b/clang/lib/Frontend/CompilerInvocation.cpp index f95e8b4f0417e..2fd66b6f546b4 100644 --- a/clang/lib/Frontend/CompilerInvocation.cpp +++ b/clang/lib/Frontend/CompilerInvocation.cpp @@ -3470,7 +3470,6 @@ static void ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args, Opts.LexEditorPlaceholders = false; Opts.SetUpStaticAnalyzer = Args.hasArg(OPT_setup_static_analyzer); - Opts.DisablePragmaDebugCrash = Args.hasArg(OPT_disable_pragma_debug_crash); } static void ParsePreprocessorOutputArgs(PreprocessorOutputOptions &Opts, diff --git a/clang/lib/Lex/Pragma.cpp b/clang/lib/Lex/Pragma.cpp index a8cd18b123b09..c881bcac9f383 100644 --- a/clang/lib/Lex/Pragma.cpp +++ b/clang/lib/Lex/Pragma.cpp @@ -30,7 +30,6 @@ #include "clang/Lex/PPCallbacks.h" #include "clang/Lex/Preprocessor.h" #include "clang/Lex/PreprocessorLexer.h" -#include "clang/Lex/PreprocessorOptions.h" #include "clang/Lex/Token.h" #include "clang/Lex/TokenLexer.h" #include "llvm/ADT/ArrayRef.h" @@ -1035,19 +1034,15 @@ struct PragmaDebugHandler : public PragmaHandler { IdentifierInfo *II = Tok.getIdentifierInfo(); if (II->isStr("assert")) { - if (!PP.getPreprocessorOpts().DisablePragmaDebugCrash) - llvm_unreachable("This is an assertion!"); + llvm_unreachable("This is an assertion!"); } else if (II->isStr("crash")) { - if (!PP.getPreprocessorOpts().DisablePragmaDebugCrash) - LLVM_BUILTIN_TRAP; + LLVM_BUILTIN_TRAP; } else if (II->isStr("parser_crash")) { - if (!PP.getPreprocessorOpts().DisablePragmaDebugCrash) { - Token Crasher; - Crasher.startToken(); - Crasher.setKind(tok::annot_pragma_parser_crash); - Crasher.setAnnotationRange(SourceRange(Tok.getLocation())); - PP.EnterToken(Crasher, /*IsReinject*/ false); - } + Token Crasher; + Crasher.startToken(); + Crasher.setKind(tok::annot_pragma_parser_crash); + Crasher.setAnnotationRange(SourceRange(Tok.getLocation())); + PP.EnterToken(Crasher, /*IsReinject*/false); } else if (II->isStr("dump")) { Token Identifier; PP.LexUnexpandedToken(Identifier); @@ -1079,11 +1074,9 @@ struct PragmaDebugHandler : public PragmaHandler { << II->getName(); } } else if (II->isStr("llvm_fatal_error")) { - if (!PP.getPreprocessorOpts().DisablePragmaDebugCrash) - llvm::report_fatal_error("#pragma clang __debug llvm_fatal_error"); + llvm::report_fatal_error("#pragma clang __debug llvm_fatal_error"); } else if (II->isStr("llvm_unreachable")) { - if (!PP.getPreprocessorOpts().DisablePragmaDebugCrash) - llvm_unreachable("#pragma clang __debug llvm_unreachable"); + llvm_unreachable("#pragma clang __debug llvm_unreachable"); } else if (II->isStr("macro")) { Token MacroName; PP.LexUnexpandedToken(MacroName); @@ -1110,8 +1103,7 @@ struct PragmaDebugHandler : public PragmaHandler { } M->dump(); } else if (II->isStr("overflow_stack")) { - if (!PP.getPreprocessorOpts().DisablePragmaDebugCrash) - DebugOverflowStack(); + DebugOverflowStack(); } else if (II->isStr("captured")) { HandleCaptured(PP); } else { diff --git a/clang/test/Driver/crash-report.c b/clang/test/Driver/crash-report.c index 641850de806bd..711b04ea4da0c 100644 --- a/clang/test/Driver/crash-report.c +++ b/clang/test/Driver/crash-report.c @@ -1,56 +1,25 @@ // RUN: rm -rf %t // RUN: mkdir %t - -// RUN: echo '-fsyntax-only \ +// RUN: env TMPDIR=%t TEMP=%t TMP=%t RC_DEBUG_OPTIONS=1 \ +// RUN: CC_PRINT_HEADERS=1 CC_LOG_DIAGNOSTICS=1 \ +// RUN: not %clang -fsyntax-only %s \ // RUN: -F/tmp/ -I /tmp/ -idirafter /tmp/ -iquote /tmp/ -isystem /tmp/ \ // RUN: -iprefix /the/prefix -iwithprefix /tmp -iwithprefixbefore /tmp/ \ // RUN: -Xclang -internal-isystem -Xclang /tmp/ \ // RUN: -Xclang -internal-externc-isystem -Xclang /tmp/ \ // RUN: -Xclang -main-file-name -Xclang foo.c \ -// RUN: -DFOO=BAR -DBAR="BAZ QUX"' > %t.rsp - -// RUN: env TMPDIR=%t TEMP=%t TMP=%t RC_DEBUG_OPTIONS=1 \ -// RUN: CC_PRINT_HEADERS=1 CC_LOG_DIAGNOSTICS=1 \ -// RUN: not %clang %s @%t.rsp -DPARSER 2>&1 | FileCheck %s +// RUN: -DFOO=BAR -DBAR="BAZ QUX" 2>&1 | FileCheck %s // RUN: cat %t/crash-report-*.c | FileCheck --check-prefix=CHECKSRC %s // RUN: cat %t/crash-report-*.sh | FileCheck --check-prefix=CHECKSH %s - -// RUN: env TMPDIR=%t TEMP=%t TMP=%t RC_DEBUG_OPTIONS=1 \ -// RUN: CC_PRINT_HEADERS=1 CC_LOG_DIAGNOSTICS=1 \ -// RUN: not %clang %s @%t.rsp -DCRASH 2>&1 | FileCheck %s -// RUN: cat %t/crash-report-*.c | FileCheck --check-prefix=CHECKSRC %s -// RUN: cat %t/crash-report-*.sh | FileCheck --check-prefix=CHECKSH %s - -// RUN: env TMPDIR=%t TEMP=%t TMP=%t RC_DEBUG_OPTIONS=1 \ -// RUN: CC_PRINT_HEADERS=1 CC_LOG_DIAGNOSTICS=1 \ -// RUN: not %clang %s @%t.rsp -DASSERT 2>&1 | FileCheck %s -// RUN: cat %t/crash-report-*.c | FileCheck --check-prefix=CHECKSRC %s -// RUN: cat %t/crash-report-*.sh | FileCheck --check-prefix=CHECKSH %s - -// RUN: env TMPDIR=%t TEMP=%t TMP=%t RC_DEBUG_OPTIONS=1 \ -// RUN: CC_PRINT_HEADERS=1 CC_LOG_DIAGNOSTICS=1 \ -// RUN: not %clang %s @%t.rsp -DUNREACHABLE 2>&1 | FileCheck %s -// RUN: cat %t/crash-report-*.c | FileCheck --check-prefix=CHECKSRC %s -// RUN: cat %t/crash-report-*.sh | FileCheck --check-prefix=CHECKSH %s - // REQUIRES: crash-recovery -#ifdef PARSER #pragma clang __debug parser_crash -#elif CRASH -#pragma clang __debug crash -#elif ASSERT -#pragma clang __debug assert -#elif UNREACHABLE -#pragma clang __debug llvm_unreachable -#endif - // CHECK: Preprocessed source(s) and associated run script(s) are located at: // CHECK-NEXT: note: diagnostic msg: {{.*}}crash-report-{{.*}}.c FOO // CHECKSRC: FOO // CHECKSH: # Crash reproducer -// CHECKSH-NEXT: # Driver args: {{.*}}"-fsyntax-only" +// CHECKSH-NEXT: # Driver args: "-fsyntax-only" // CHECKSH-SAME: "-D" "FOO=BAR" // CHECKSH-SAME: "-D" "BAR=BAZ QUX" // CHECKSH-NEXT: # Original command: {{.*$}} diff --git a/clang/test/Driver/output-file-cleanup.c b/clang/test/Driver/output-file-cleanup.c index c572b25cecef0..a5ca3e546f532 100644 --- a/clang/test/Driver/output-file-cleanup.c +++ b/clang/test/Driver/output-file-cleanup.c @@ -1,4 +1,3 @@ - // RUN: rm -f "%t.d" "%t1.s" "%t2.s" "%t3.s" "%t4.s" "%t5.s" // // RUN: touch %t.s