From c884b7187cd84bc0940487ebe320bc76a9902f4e Mon Sep 17 00:00:00 2001 From: Alex Lorenz Date: Fri, 6 Apr 2018 19:45:29 +0000 Subject: [PATCH] Revert r329442 "Generate Libclang invocation reproducers using a new -cc1gen-reproducer driver option" The tests are failing on some bots llvm-svn: 329447 --- clang/include/clang/Driver/Driver.h | 16 +- clang/lib/Driver/Driver.cpp | 12 +- .../Index/create-libclang-completion-reproducer.c | 14 -- .../Index/create-libclang-parsing-reproducer.c | 21 --- clang/tools/driver/CMakeLists.txt | 1 - clang/tools/driver/cc1gen_reproducer_main.cpp | 196 --------------------- clang/tools/driver/driver.cpp | 4 - 7 files changed, 6 insertions(+), 258 deletions(-) delete mode 100644 clang/test/Index/create-libclang-completion-reproducer.c delete mode 100644 clang/test/Index/create-libclang-parsing-reproducer.c delete mode 100644 clang/tools/driver/cc1gen_reproducer_main.cpp diff --git a/clang/include/clang/Driver/Driver.h b/clang/include/clang/Driver/Driver.h index 39fce9c..ca2ca30 100644 --- a/clang/include/clang/Driver/Driver.h +++ b/clang/include/clang/Driver/Driver.h @@ -405,19 +405,11 @@ public: int ExecuteCompilation(Compilation &C, SmallVectorImpl< std::pair > &FailingCommands); - /// Contains the files in the compilation diagnostic report generated by - /// generateCompilationDiagnostics. - struct CompilationDiagnosticReport { - llvm::SmallVector TemporaryFiles; - }; - - /// generateCompilationDiagnostics - Generate diagnostics information + /// generateCompilationDiagnostics - Generate diagnostics information /// including preprocessed source file(s). - /// - void generateCompilationDiagnostics( - Compilation &C, const Command &FailingCommand, - StringRef AdditionalInformation = "", - CompilationDiagnosticReport *GeneratedReport = nullptr); + /// + void generateCompilationDiagnostics(Compilation &C, + const Command &FailingCommand); /// @} /// @name Helper Methods diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index f02230d..1a62192 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -1111,9 +1111,8 @@ bool Driver::getCrashDiagnosticFile(StringRef ReproCrashFilename, // When clang crashes, produce diagnostic information including the fully // preprocessed source file(s). Request that the developer attach the // diagnostic information to a bug report. -void Driver::generateCompilationDiagnostics( - Compilation &C, const Command &FailingCommand, - StringRef AdditionalInformation, CompilationDiagnosticReport *Report) { +void Driver::generateCompilationDiagnostics(Compilation &C, + const Command &FailingCommand) { if (C.getArgs().hasArg(options::OPT_fno_crash_diagnostics)) return; @@ -1239,8 +1238,6 @@ void Driver::generateCompilationDiagnostics( SmallString<128> ReproCrashFilename; for (const char *TempFile : TempFiles) { Diag(clang::diag::note_drv_command_failed_diag_msg) << TempFile; - if (Report) - Report->TemporaryFiles.push_back(TempFile); if (ReproCrashFilename.empty()) { ReproCrashFilename = TempFile; llvm::sys::path::replace_extension(ReproCrashFilename, ".crash"); @@ -1269,11 +1266,6 @@ void Driver::generateCompilationDiagnostics( ScriptOS << "# Original command: "; Cmd.Print(ScriptOS, "\n", /*Quote=*/true); Cmd.Print(ScriptOS, "\n", /*Quote=*/true, &CrashInfo); - if (!AdditionalInformation.empty()) - ScriptOS << "\n# Additional information: " << AdditionalInformation - << "\n"; - if (Report) - Report->TemporaryFiles.push_back(Script); Diag(clang::diag::note_drv_command_failed_diag_msg) << Script; } diff --git a/clang/test/Index/create-libclang-completion-reproducer.c b/clang/test/Index/create-libclang-completion-reproducer.c deleted file mode 100644 index 5683e10..0000000 --- a/clang/test/Index/create-libclang-completion-reproducer.c +++ /dev/null @@ -1,14 +0,0 @@ -// RUN: rm -rf %t -// RUN: mkdir %t -// RUN: env CINDEXTEST_INVOCATION_EMISSION_PATH=%t not c-index-test -code-completion-at=%s:10:1 "-remap-file=%s,%S/Inputs/record-parsing-invocation-remap.c" %s -// RUN: %clang -cc1gen-reproducer %t/libclang-* -v | FileCheck %s - -// Invocation file must be removed by clang: -// RUN: ls %t | count 0 - -// CHECK: REPRODUCER METAINFO: {"libclang.operation": "complete", "libclang.opts": "1", "invocation-args": ["-code-completion-at={{.*}}create-libclang-completion-reproducer.c:10:1"]} - -// CHECK: REPRODUCER: -// CHECK-NEXT: { -// CHECK-NEXT: "files":["{{.*}}.c","{{.*}}.sh"] -// CHECK-NEXT: } diff --git a/clang/test/Index/create-libclang-parsing-reproducer.c b/clang/test/Index/create-libclang-parsing-reproducer.c deleted file mode 100644 index 0cfbfb1..0000000 --- a/clang/test/Index/create-libclang-parsing-reproducer.c +++ /dev/null @@ -1,21 +0,0 @@ -// RUN: rm -rf %t -// RUN: mkdir %t -// RUN: env CINDEXTEST_INVOCATION_EMISSION_PATH=%t not c-index-test -test-load-source all %s -// RUN: %clang -cc1gen-reproducer %t/libclang-* -v | FileCheck %s - -// Invocation file must be removed by clang: -// RUN: ls %t | count 0 - -// RUN: rm -rf %t -// RUN: mkdir %t -// RUN: env CINDEXTEST_INVOCATION_EMISSION_PATH=%t not c-index-test -test-load-source all "-remap-file=%s,%S/Inputs/record-parsing-invocation-remap.c" %s -// RUN: %clang -cc1gen-reproducer %t/libclang-* -v | FileCheck %s - -#pragma clang __debug parser_crash - -// CHECK: REPRODUCER METAINFO: {"libclang.operation": "parse", "libclang.opts": "1"} - -// CHECK: REPRODUCER: -// CHECK-NEXT: { -// CHECK-NEXT: "files":["{{.*}}.c","{{.*}}.sh"] -// CHECK-NEXT: } diff --git a/clang/tools/driver/CMakeLists.txt b/clang/tools/driver/CMakeLists.txt index 27566f7..22a4984 100644 --- a/clang/tools/driver/CMakeLists.txt +++ b/clang/tools/driver/CMakeLists.txt @@ -32,7 +32,6 @@ add_clang_tool(clang driver.cpp cc1_main.cpp cc1as_main.cpp - cc1gen_reproducer_main.cpp DEPENDS ${tablegen_deps} diff --git a/clang/tools/driver/cc1gen_reproducer_main.cpp b/clang/tools/driver/cc1gen_reproducer_main.cpp deleted file mode 100644 index a4c034d..0000000 --- a/clang/tools/driver/cc1gen_reproducer_main.cpp +++ /dev/null @@ -1,196 +0,0 @@ -//===-- cc1gen_reproducer_main.cpp - Clang reproducer generator ----------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This is the entry point to the clang -cc1gen-reproducer functionality, which -// generates reproducers for invocations for clang-based tools. -// -//===----------------------------------------------------------------------===// - -#include "clang/Basic/Diagnostic.h" -#include "clang/Basic/LLVM.h" -#include "clang/Basic/VirtualFileSystem.h" -#include "clang/Driver/Compilation.h" -#include "clang/Driver/Driver.h" -#include "llvm/ADT/ArrayRef.h" -#include "llvm/ADT/STLExtras.h" -#include "llvm/Support/FileSystem.h" -#include "llvm/Support/TargetSelect.h" -#include "llvm/Support/YAMLTraits.h" -#include "llvm/Support/raw_ostream.h" - -using namespace clang; - -namespace { - -struct UnsavedFileHash { - std::string Name; - std::string MD5; -}; - -struct ClangInvocationInfo { - std::string Toolchain; - std::string LibclangOperation; - std::string LibclangOptions; - std::vector Arguments; - std::vector InvocationArguments; - std::vector UnsavedFileHashes; - bool Dump = false; -}; - -} // end anonymous namespace - -LLVM_YAML_IS_SEQUENCE_VECTOR(UnsavedFileHash) - -namespace llvm { -namespace yaml { - -template <> struct MappingTraits { - static void mapping(IO &IO, UnsavedFileHash &Info) { - IO.mapRequired("name", Info.Name); - IO.mapRequired("md5", Info.MD5); - } -}; - -template <> struct MappingTraits { - static void mapping(IO &IO, ClangInvocationInfo &Info) { - IO.mapRequired("toolchain", Info.Toolchain); - IO.mapOptional("libclang.operation", Info.LibclangOperation); - IO.mapOptional("libclang.opts", Info.LibclangOptions); - IO.mapRequired("args", Info.Arguments); - IO.mapOptional("invocation-args", Info.InvocationArguments); - IO.mapOptional("unsaved_file_hashes", Info.UnsavedFileHashes); - } -}; - -} // end namespace yaml -} // end namespace llvm - -static std::string generateReproducerMetaInfo(const ClangInvocationInfo &Info) { - std::string Result; - llvm::raw_string_ostream OS(Result); - OS << '{'; - bool NeedComma = false; - auto EmitKey = [&](StringRef Key) { - if (NeedComma) - OS << ", "; - NeedComma = true; - OS << '"' << Key << "\": "; - }; - auto EmitStringKey = [&](StringRef Key, StringRef Value) { - if (Value.empty()) - return; - EmitKey(Key); - OS << '"' << Value << '"'; - }; - EmitStringKey("libclang.operation", Info.LibclangOperation); - EmitStringKey("libclang.opts", Info.LibclangOptions); - if (!Info.InvocationArguments.empty()) { - EmitKey("invocation-args"); - OS << '['; - for (const auto &Arg : llvm::enumerate(Info.InvocationArguments)) { - if (Arg.index()) - OS << ','; - OS << '"' << Arg.value() << '"'; - } - OS << ']'; - } - OS << '}'; - // FIXME: Compare unsaved file hashes and report mismatch in the reproducer. - if (Info.Dump) - llvm::outs() << "REPRODUCER METAINFO: " << OS.str() << "\n"; - return std::move(OS.str()); -} - -/// Generates a reproducer for a set of arguments from a specific invocation. -static llvm::Optional -generateReproducerForInvocationArguments(ArrayRef Argv, - const ClangInvocationInfo &Info) { - using namespace driver; - auto TargetAndMode = ToolChain::getTargetAndModeFromProgramName(Argv[0]); - - IntrusiveRefCntPtr DiagOpts = new DiagnosticOptions; - - IntrusiveRefCntPtr DiagID(new DiagnosticIDs()); - DiagnosticsEngine Diags(DiagID, &*DiagOpts, new IgnoringDiagConsumer()); - ProcessWarningOptions(Diags, *DiagOpts, /*ReportDiags=*/false); - Driver TheDriver(Argv[0], llvm::sys::getDefaultTargetTriple(), Diags); - TheDriver.setTargetAndMode(TargetAndMode); - - std::unique_ptr C(TheDriver.BuildCompilation(Argv)); - if (C && !C->containsError()) { - for (const auto &J : C->getJobs()) { - if (const Command *Cmd = dyn_cast(&J)) { - Driver::CompilationDiagnosticReport Report; - TheDriver.generateCompilationDiagnostics( - *C, *Cmd, generateReproducerMetaInfo(Info), &Report); - return Report; - } - } - } - - return None; -} - -std::string GetExecutablePath(const char *Argv0, bool CanonicalPrefixes); - -static void printReproducerInformation( - llvm::raw_ostream &OS, const ClangInvocationInfo &Info, - const driver::Driver::CompilationDiagnosticReport &Report) { - OS << "REPRODUCER:\n"; - OS << "{\n"; - OS << R"("files":[)"; - for (const auto &File : llvm::enumerate(Report.TemporaryFiles)) { - if (File.index()) - OS << ','; - OS << '"' << File.value() << '"'; - } - OS << "]\n}\n"; -} - -int cc1gen_reproducer_main(ArrayRef Argv, const char *Argv0, - void *MainAddr) { - if (Argv.size() < 1) { - llvm::errs() << "error: missing invocation file\n"; - return 1; - } - // Parse the invocation descriptor. - StringRef Input = Argv[0]; - llvm::ErrorOr> Buffer = - llvm::MemoryBuffer::getFile(Input); - if (!Buffer) { - llvm::errs() << "error: failed to read " << Input << ": " - << Buffer.getError().message() << "\n"; - return 1; - } - llvm::yaml::Input YAML(Buffer.get()->getBuffer()); - ClangInvocationInfo InvocationInfo; - YAML >> InvocationInfo; - if (Argv.size() > 1 && Argv[1] == StringRef("-v")) - InvocationInfo.Dump = true; - - // Create an invocation that will produce the reproducer. - std::vector DriverArgs; - for (const auto &Arg : InvocationInfo.Arguments) - DriverArgs.push_back(Arg.c_str()); - std::string Path = GetExecutablePath(Argv0, /*CanonicalPrefixes=*/true); - DriverArgs[0] = Path.c_str(); - llvm::Optional Report = - generateReproducerForInvocationArguments(DriverArgs, InvocationInfo); - - // Emit the information about the reproduce files to stdout. - int Result = 1; - if (Report) { - printReproducerInformation(llvm::outs(), InvocationInfo, *Report); - Result = 0; - } - - // Remove the input file. - llvm::sys::fs::remove(Input); - return Result; -} diff --git a/clang/tools/driver/driver.cpp b/clang/tools/driver/driver.cpp index 32cb1b4..72d56a7 100644 --- a/clang/tools/driver/driver.cpp +++ b/clang/tools/driver/driver.cpp @@ -205,8 +205,6 @@ extern int cc1_main(ArrayRef Argv, const char *Argv0, void *MainAddr); extern int cc1as_main(ArrayRef Argv, const char *Argv0, void *MainAddr); -extern int cc1gen_reproducer_main(ArrayRef Argv, - const char *Argv0, void *MainAddr); static void insertTargetAndModeArgs(const ParsedClangName &NameParts, SmallVectorImpl &ArgVector, @@ -312,8 +310,6 @@ static int ExecuteCC1Tool(ArrayRef argv, StringRef Tool) { return cc1_main(argv.slice(2), argv[0], GetExecutablePathVP); if (Tool == "as") return cc1as_main(argv.slice(2), argv[0], GetExecutablePathVP); - if (Tool == "gen-reproducer") - return cc1gen_reproducer_main(argv.slice(2), argv[0], GetExecutablePathVP); // Reject unknown tools. llvm::errs() << "error: unknown integrated tool '" << Tool << "'. " -- 2.7.4