update clang tools to 13 rc1
This commit is contained in:
@@ -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");
|
||||
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;
|
||||
};
|
||||
|
||||
// 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");
|
||||
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()) {
|
||||
|
||||
Reference in New Issue
Block a user