diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-08-15 18:06:29 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-08-15 18:06:29 -0700 |
| commit | d6467dcf71c40d4f09993f8c449b33adeca55ce5 (patch) | |
| tree | cba752c3cba158e29f40e813693ebcbe8e4a8259 /src/zig_clang_driver.cpp | |
| parent | 21606339af2712d94bb3cfdcc9050287c5a2134c (diff) | |
| download | zig-d6467dcf71c40d4f09993f8c449b33adeca55ce5.tar.gz zig-d6467dcf71c40d4f09993f8c449b33adeca55ce5.zip | |
update clang tools to 13 rc1
Diffstat (limited to 'src/zig_clang_driver.cpp')
| -rw-r--r-- | src/zig_clang_driver.cpp | 106 |
1 files changed, 54 insertions, 52 deletions
diff --git a/src/zig_clang_driver.cpp b/src/zig_clang_driver.cpp index e358fea83a..3c38250df3 100644 --- a/src/zig_clang_driver.cpp +++ b/src/zig_clang_driver.cpp @@ -242,20 +242,28 @@ static void getCLEnvVarOptions(std::string &EnvValue, llvm::StringSaver &Saver, } static void SetBackdoorDriverOutputsFromEnvVars(Driver &TheDriver) { - // Handle CC_PRINT_OPTIONS and CC_PRINT_OPTIONS_FILE. - TheDriver.CCPrintOptions = !!::getenv("CC_PRINT_OPTIONS"); - if (TheDriver.CCPrintOptions) - TheDriver.CCPrintOptionsFilename = ::getenv("CC_PRINT_OPTIONS_FILE"); - - // Handle CC_PRINT_HEADERS and CC_PRINT_HEADERS_FILE. - TheDriver.CCPrintHeaders = !!::getenv("CC_PRINT_HEADERS"); - if (TheDriver.CCPrintHeaders) - TheDriver.CCPrintHeadersFilename = ::getenv("CC_PRINT_HEADERS_FILE"); - - // Handle CC_LOG_DIAGNOSTICS and CC_LOG_DIAGNOSTICS_FILE. - TheDriver.CCLogDiagnostics = !!::getenv("CC_LOG_DIAGNOSTICS"); - if (TheDriver.CCLogDiagnostics) - TheDriver.CCLogDiagnosticsFilename = ::getenv("CC_LOG_DIAGNOSTICS_FILE"); + auto CheckEnvVar = [](const char *EnvOptSet, const char *EnvOptFile, + std::string &OptFile) { + bool OptSet = !!::getenv(EnvOptSet); + if (OptSet) { + if (const char *Var = ::getenv(EnvOptFile)) + OptFile = Var; + } + return OptSet; + }; + + TheDriver.CCPrintOptions = + CheckEnvVar("CC_PRINT_OPTIONS", "CC_PRINT_OPTIONS_FILE", + TheDriver.CCPrintOptionsFilename); + TheDriver.CCPrintHeaders = + CheckEnvVar("CC_PRINT_HEADERS", "CC_PRINT_HEADERS_FILE", + TheDriver.CCPrintHeadersFilename); + TheDriver.CCLogDiagnostics = + CheckEnvVar("CC_LOG_DIAGNOSTICS", "CC_LOG_DIAGNOSTICS_FILE", + TheDriver.CCLogDiagnosticsFilename); + TheDriver.CCPrintProcessStats = + CheckEnvVar("CC_PRINT_PROC_STAT", "CC_PRINT_PROC_STAT_FILE", + TheDriver.CCPrintStatReportFilename); } static void FixupDiagPrefixExeName(TextDiagnosticPrinter *DiagClient, @@ -263,7 +271,7 @@ static void FixupDiagPrefixExeName(TextDiagnosticPrinter *DiagClient, // If the clang binary happens to be named cl.exe for compatibility reasons, // use clang-cl.exe as the prefix to avoid confusion between clang and MSVC. StringRef ExeBasename(llvm::sys::path::stem(Path)); - if (ExeBasename.equals_lower("cl")) + if (ExeBasename.equals_insensitive("cl")) ExeBasename = "clang-cl"; DiagClient->setPrefix(std::string(ExeBasename)); } @@ -335,56 +343,49 @@ static int ExecuteCC1Tool(SmallVectorImpl<const char *> &ArgV) { return 1; } -extern "C" int ZigClang_main(int argc_, const char **argv_); -int ZigClang_main(int argc_, const char **argv_) { +extern "C" int ZigClang_main(int Argc, const char **Argv); +int ZigClang_main(int Argc, const char **Argv) { noteBottomOfStack(); - - // ZIG MOD: On windows, InitLLVM calls GetCommandLineW(), + // ZIG PATCH: On Windows, InitLLVM calls GetCommandLineW(), // and overwrites the args. We don't want it to do that, // and we also don't need the signal handlers it installs // (we have our own already), so we just use llvm_shutdown_obj // instead. - // llvm::InitLLVM X(argc_, argv_); + // llvm::InitLLVM X(Argc, Argv); llvm::llvm_shutdown_obj X; llvm::setBugReportMsg("PLEASE submit a bug report to " BUG_REPORT_URL " and include the crash backtrace, preprocessed " "source, and associated run script.\n"); - size_t argv_offset = (strcmp(argv_[1], "-cc1") == 0 || strcmp(argv_[1], "-cc1as") == 0) ? 0 : 1; - SmallVector<const char *, 256> argv(argv_ + argv_offset, argv_ + argc_); + size_t argv_offset = (strcmp(Argv[1], "-cc1") == 0 || strcmp(Argv[1], "-cc1as") == 0) ? 0 : 1; + SmallVector<const char *, 256> Args(Argv + argv_offset, Argv + Argc); if (llvm::sys::Process::FixupStandardFileDescriptors()) return 1; llvm::InitializeAllTargets(); - auto TargetAndMode = ToolChain::getTargetAndModeFromProgramName(argv[0]); llvm::BumpPtrAllocator A; llvm::StringSaver Saver(A); // Parse response files using the GNU syntax, unless we're in CL mode. There - // are two ways to put clang in CL compatibility mode: argv[0] is either + // are two ways to put clang in CL compatibility mode: Args[0] is either // clang-cl or cl, or --driver-mode=cl is on the command line. The normal // command line parsing can't happen until after response file parsing, so we // have to manually search for a --driver-mode=cl argument the hard way. // Finally, our -cc1 tools don't care which tokenization mode we use because // response files written by clang will tokenize the same way in either mode. - bool ClangCLMode = false; - if (StringRef(TargetAndMode.DriverMode).equals("--driver-mode=cl") || - llvm::find_if(argv, [](const char *F) { - return F && strcmp(F, "--driver-mode=cl") == 0; - }) != argv.end()) { - ClangCLMode = true; - } + bool ClangCLMode = + IsClangCL(getDriverMode(Args[0], llvm::makeArrayRef(Args).slice(1))); enum { Default, POSIX, Windows } RSPQuoting = Default; - for (const char *F : argv) { + for (const char *F : Args) { if (strcmp(F, "--rsp-quoting=posix") == 0) RSPQuoting = POSIX; else if (strcmp(F, "--rsp-quoting=windows") == 0) RSPQuoting = Windows; } - // Determines whether we want nullptr markers in argv to indicate response + // Determines whether we want nullptr markers in Args to indicate response // files end-of-lines. We only use this for the /LINK driver argument with // clang-cl.exe on Windows. bool MarkEOLs = ClangCLMode; @@ -395,31 +396,31 @@ int ZigClang_main(int argc_, const char **argv_) { else Tokenizer = &llvm::cl::TokenizeGNUCommandLine; - if (MarkEOLs && argv.size() > 1 && StringRef(argv[1]).startswith("-cc1")) + if (MarkEOLs && Args.size() > 1 && StringRef(Args[1]).startswith("-cc1")) MarkEOLs = false; - llvm::cl::ExpandResponseFiles(Saver, Tokenizer, argv, MarkEOLs); + llvm::cl::ExpandResponseFiles(Saver, Tokenizer, Args, MarkEOLs); // Handle -cc1 integrated tools, even if -cc1 was expanded from a response // file. - auto FirstArg = std::find_if(argv.begin() + 1, argv.end(), + auto FirstArg = std::find_if(Args.begin() + 1, Args.end(), [](const char *A) { return A != nullptr; }); - if (FirstArg != argv.end() && StringRef(*FirstArg).startswith("-cc1")) { + if (FirstArg != Args.end() && StringRef(*FirstArg).startswith("-cc1")) { // If -cc1 came from a response file, remove the EOL sentinels. if (MarkEOLs) { - auto newEnd = std::remove(argv.begin(), argv.end(), nullptr); - argv.resize(newEnd - argv.begin()); + auto newEnd = std::remove(Args.begin(), Args.end(), nullptr); + Args.resize(newEnd - Args.begin()); } - return ExecuteCC1Tool(argv); + return ExecuteCC1Tool(Args); } // Handle options that need handling before the real command line parsing in // Driver::BuildCompilation() bool CanonicalPrefixes = true; - for (int i = 1, size = argv.size(); i < size; ++i) { + for (int i = 1, size = Args.size(); i < size; ++i) { // Skip end-of-line response file markers - if (argv[i] == nullptr) + if (Args[i] == nullptr) continue; - if (StringRef(argv[i]) == "-no-canonical-prefixes") { + if (StringRef(Args[i]) == "-no-canonical-prefixes") { CanonicalPrefixes = false; break; } @@ -435,7 +436,7 @@ int ZigClang_main(int argc_, const char **argv_) { getCLEnvVarOptions(OptCL.getValue(), Saver, PrependedOpts); // Insert right after the program name to prepend to the argument list. - argv.insert(argv.begin() + 1, PrependedOpts.begin(), PrependedOpts.end()); + Args.insert(Args.begin() + 1, PrependedOpts.begin(), PrependedOpts.end()); } // Arguments in "_CL_" are appended. llvm::Optional<std::string> Opt_CL_ = llvm::sys::Process::GetEnv("_CL_"); @@ -444,7 +445,7 @@ int ZigClang_main(int argc_, const char **argv_) { getCLEnvVarOptions(Opt_CL_.getValue(), Saver, AppendedOpts); // Insert at the end of the argument list to append. - argv.append(AppendedOpts.begin(), AppendedOpts.end()); + Args.append(AppendedOpts.begin(), AppendedOpts.end()); } } @@ -453,12 +454,12 @@ int ZigClang_main(int argc_, const char **argv_) { // scenes. if (const char *OverrideStr = ::getenv("CCC_OVERRIDE_OPTIONS")) { // FIXME: Driver shouldn't take extra initial argument. - ApplyQAOverride(argv, OverrideStr, SavedStrings); + ApplyQAOverride(Args, OverrideStr, SavedStrings); } - // Pass local param `argv_[0]` as fallback. + // Pass local param `Argv[0]` as fallback. // See https://github.com/ziglang/zig/pull/3292 . - std::string Path = GetExecutablePath(argv_[0], CanonicalPrefixes); + std::string Path = GetExecutablePath(Argv[0], CanonicalPrefixes); // Whether the cc1 tool should be called inside the current process, or if we // should spawn a new clang subprocess (old behavior). @@ -467,7 +468,7 @@ int ZigClang_main(int argc_, const char **argv_) { bool UseNewCC1Process; IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = - CreateAndPopulateDiagOpts(argv, UseNewCC1Process); + CreateAndPopulateDiagOpts(Args, UseNewCC1Process); TextDiagnosticPrinter *DiagClient = new TextDiagnosticPrinter(llvm::errs(), &*DiagOpts); @@ -488,10 +489,11 @@ int ZigClang_main(int argc_, const char **argv_) { ProcessWarningOptions(Diags, *DiagOpts, /*ReportDiags=*/false); Driver TheDriver(Path, llvm::sys::getDefaultTargetTriple(), Diags); - SetInstallDir(argv, TheDriver, CanonicalPrefixes); + SetInstallDir(Args, TheDriver, CanonicalPrefixes); + auto TargetAndMode = ToolChain::getTargetAndModeFromProgramName(Args[0]); TheDriver.setTargetAndMode(TargetAndMode); - insertTargetAndModeArgs(TargetAndMode, argv, SavedStrings); + insertTargetAndModeArgs(TargetAndMode, Args, SavedStrings); SetBackdoorDriverOutputsFromEnvVars(TheDriver); @@ -501,7 +503,7 @@ int ZigClang_main(int argc_, const char **argv_) { llvm::CrashRecoveryContext::Enable(); } - std::unique_ptr<Compilation> C(TheDriver.BuildCompilation(argv)); + std::unique_ptr<Compilation> C(TheDriver.BuildCompilation(Args)); int Res = 1; bool IsCrash = false; if (C && !C->containsError()) { |
