authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-01-25 20:56:23-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-01-25 20:56:23-07:00
log5994a5d18d341f826b12a99c9d800601c69fc186
tree99a61edb9c27111b11158902280c92350a5b80ca
parent9c3bd437e66b4b4e0d1b093e988229e9a6135d36

update clang and ar to llvm 16


5 files changed, 150 insertions(+), 67 deletions(-)

CMakeLists.txt+2-2
...@@ -656,9 +656,9 @@ include_directories(...@@ -656,9 +656,9 @@ include_directories(
656656
657# These have to go before the -Wno- flags657# These have to go before the -Wno- flags
658if(MSVC)658if(MSVC)
659 set(EXE_CXX_FLAGS "/std:c++14")659 set(EXE_CXX_FLAGS "/std:c++17")
660else(MSVC)660else(MSVC)
661 set(EXE_CXX_FLAGS "-std=c++14")661 set(EXE_CXX_FLAGS "-std=c++17")
662endif(MSVC)662endif(MSVC)
663663
664if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")664if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
src/zig_clang_cc1_main.cpp+2-1
...@@ -177,7 +177,8 @@ static int PrintSupportedCPUs(std::string TargetStr) {...@@ -177,7 +177,8 @@ static int PrintSupportedCPUs(std::string TargetStr) {
177 // the target machine will handle the mcpu printing177 // the target machine will handle the mcpu printing
178 llvm::TargetOptions Options;178 llvm::TargetOptions Options;
179 std::unique_ptr<llvm::TargetMachine> TheTargetMachine(179 std::unique_ptr<llvm::TargetMachine> TheTargetMachine(
180 TheTarget->createTargetMachine(TargetStr, "", "+cpuhelp", Options, None));180 TheTarget->createTargetMachine(TargetStr, "", "+cpuhelp", Options,
181 std::nullopt));
181 return 0;182 return 0;
182}183}
183184
src/zig_clang_cc1as_main.cpp+29-3
...@@ -54,6 +54,7 @@...@@ -54,6 +54,7 @@
54#include "llvm/Support/Timer.h"54#include "llvm/Support/Timer.h"
55#include "llvm/Support/raw_ostream.h"55#include "llvm/Support/raw_ostream.h"
56#include <memory>56#include <memory>
57#include <optional>
57#include <system_error>58#include <system_error>
58using namespace clang;59using namespace clang;
59using namespace clang::driver;60using namespace clang::driver;
...@@ -134,6 +135,7 @@ struct AssemblerInvocation {...@@ -134,6 +135,7 @@ struct AssemblerInvocation {
134 unsigned NoExecStack : 1;135 unsigned NoExecStack : 1;
135 unsigned FatalWarnings : 1;136 unsigned FatalWarnings : 1;
136 unsigned NoWarn : 1;137 unsigned NoWarn : 1;
138 unsigned NoTypeCheck : 1;
137 unsigned IncrementalLinkerCompatible : 1;139 unsigned IncrementalLinkerCompatible : 1;
138 unsigned EmbedBitcode : 1;140 unsigned EmbedBitcode : 1;
139141
...@@ -149,7 +151,14 @@ struct AssemblerInvocation {...@@ -149,7 +151,14 @@ struct AssemblerInvocation {
149151
150 /// Darwin target variant triple, the variant of the deployment target152 /// Darwin target variant triple, the variant of the deployment target
151 /// for which the code is being compiled.153 /// for which the code is being compiled.
152 llvm::Optional<llvm::Triple> DarwinTargetVariantTriple;154 std::optional<llvm::Triple> DarwinTargetVariantTriple;
155
156 /// The version of the darwin target variant SDK which was used during the
157 /// compilation
158 llvm::VersionTuple DarwinTargetVariantSDKVersion;
159
160 /// The name of a file to use with \c .secure_log_unique directives.
161 std::string AsSecureLogFile;
153 /// @}162 /// @}
154163
155public:164public:
...@@ -166,6 +175,7 @@ public:...@@ -166,6 +175,7 @@ public:
166 NoExecStack = 0;175 NoExecStack = 0;
167 FatalWarnings = 0;176 FatalWarnings = 0;
168 NoWarn = 0;177 NoWarn = 0;
178 NoTypeCheck = 0;
169 IncrementalLinkerCompatible = 0;179 IncrementalLinkerCompatible = 0;
170 Dwarf64 = 0;180 Dwarf64 = 0;
171 DwarfVersion = 0;181 DwarfVersion = 0;
...@@ -218,6 +228,14 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,...@@ -218,6 +228,14 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
218 Opts.Triple = llvm::Triple::normalize(Args.getLastArgValue(OPT_triple));228 Opts.Triple = llvm::Triple::normalize(Args.getLastArgValue(OPT_triple));
219 if (Arg *A = Args.getLastArg(options::OPT_darwin_target_variant_triple))229 if (Arg *A = Args.getLastArg(options::OPT_darwin_target_variant_triple))
220 Opts.DarwinTargetVariantTriple = llvm::Triple(A->getValue());230 Opts.DarwinTargetVariantTriple = llvm::Triple(A->getValue());
231 if (Arg *A = Args.getLastArg(OPT_darwin_target_variant_sdk_version_EQ)) {
232 VersionTuple Version;
233 if (Version.tryParse(A->getValue()))
234 Diags.Report(diag::err_drv_invalid_value)
235 << A->getAsString(Args) << A->getValue();
236 else
237 Opts.DarwinTargetVariantSDKVersion = Version;
238 }
221239
222 Opts.CPU = std::string(Args.getLastArgValue(OPT_target_cpu));240 Opts.CPU = std::string(Args.getLastArgValue(OPT_target_cpu));
223 Opts.Features = Args.getAllArgValues(OPT_target_feature);241 Opts.Features = Args.getAllArgValues(OPT_target_feature);
...@@ -237,11 +255,12 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,...@@ -237,11 +255,12 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
237 Opts.CompressDebugSections =255 Opts.CompressDebugSections =
238 llvm::StringSwitch<llvm::DebugCompressionType>(A->getValue())256 llvm::StringSwitch<llvm::DebugCompressionType>(A->getValue())
239 .Case("none", llvm::DebugCompressionType::None)257 .Case("none", llvm::DebugCompressionType::None)
240 .Case("zlib", llvm::DebugCompressionType::Z)258 .Case("zlib", llvm::DebugCompressionType::Zlib)
259 .Case("zstd", llvm::DebugCompressionType::Zstd)
241 .Default(llvm::DebugCompressionType::None);260 .Default(llvm::DebugCompressionType::None);
242 }261 }
243262
244 Opts.RelaxELFRelocations = Args.hasArg(OPT_mrelax_relocations);263 Opts.RelaxELFRelocations = !Args.hasArg(OPT_mrelax_relocations_no);
245 if (auto *DwarfFormatArg = Args.getLastArg(OPT_gdwarf64, OPT_gdwarf32))264 if (auto *DwarfFormatArg = Args.getLastArg(OPT_gdwarf64, OPT_gdwarf32))
246 Opts.Dwarf64 = DwarfFormatArg->getOption().matches(OPT_gdwarf64);265 Opts.Dwarf64 = DwarfFormatArg->getOption().matches(OPT_gdwarf64);
247 Opts.DwarfVersion = getLastArgIntValue(Args, OPT_dwarf_version_EQ, 2, Diags);266 Opts.DwarfVersion = getLastArgIntValue(Args, OPT_dwarf_version_EQ, 2, Diags);
...@@ -304,6 +323,7 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,...@@ -304,6 +323,7 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
304 Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack);323 Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack);
305 Opts.FatalWarnings = Args.hasArg(OPT_massembler_fatal_warnings);324 Opts.FatalWarnings = Args.hasArg(OPT_massembler_fatal_warnings);
306 Opts.NoWarn = Args.hasArg(OPT_massembler_no_warn);325 Opts.NoWarn = Args.hasArg(OPT_massembler_no_warn);
326 Opts.NoTypeCheck = Args.hasArg(OPT_mno_type_check);
307 Opts.RelocationModel =327 Opts.RelocationModel =
308 std::string(Args.getLastArgValue(OPT_mrelocation_model, "pic"));328 std::string(Args.getLastArgValue(OPT_mrelocation_model, "pic"));
309 Opts.TargetABI = std::string(Args.getLastArgValue(OPT_target_abi));329 Opts.TargetABI = std::string(Args.getLastArgValue(OPT_target_abi));
...@@ -329,6 +349,8 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,...@@ -329,6 +349,8 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
329 .Case("default", EmitDwarfUnwindType::Default);349 .Case("default", EmitDwarfUnwindType::Default);
330 }350 }
331351
352 Opts.AsSecureLogFile = Args.getLastArgValue(OPT_as_secure_log_file);
353
332 return Success;354 return Success;
333}355}
334356
...@@ -380,6 +402,7 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,...@@ -380,6 +402,7 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,
380402
381 MCTargetOptions MCOptions;403 MCTargetOptions MCOptions;
382 MCOptions.EmitDwarfUnwind = Opts.EmitDwarfUnwind;404 MCOptions.EmitDwarfUnwind = Opts.EmitDwarfUnwind;
405 MCOptions.AsSecureLogFile = Opts.AsSecureLogFile;
383406
384 std::unique_ptr<MCAsmInfo> MAI(407 std::unique_ptr<MCAsmInfo> MAI(
385 TheTarget->createMCAsmInfo(*MRI, Opts.Triple, MCOptions));408 TheTarget->createMCAsmInfo(*MRI, Opts.Triple, MCOptions));
...@@ -429,6 +452,8 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,...@@ -429,6 +452,8 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,
429 TheTarget->createMCObjectFileInfo(Ctx, PIC));452 TheTarget->createMCObjectFileInfo(Ctx, PIC));
430 if (Opts.DarwinTargetVariantTriple)453 if (Opts.DarwinTargetVariantTriple)
431 MOFI->setDarwinTargetVariantTriple(*Opts.DarwinTargetVariantTriple);454 MOFI->setDarwinTargetVariantTriple(*Opts.DarwinTargetVariantTriple);
455 if (!Opts.DarwinTargetVariantSDKVersion.empty())
456 MOFI->setDarwinTargetVariantSDKVersion(Opts.DarwinTargetVariantSDKVersion);
432 Ctx.setObjectFileInfo(MOFI.get());457 Ctx.setObjectFileInfo(MOFI.get());
433458
434 if (Opts.SaveTemporaryLabels)459 if (Opts.SaveTemporaryLabels)
...@@ -468,6 +493,7 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,...@@ -468,6 +493,7 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,
468493
469 MCOptions.MCNoWarn = Opts.NoWarn;494 MCOptions.MCNoWarn = Opts.NoWarn;
470 MCOptions.MCFatalWarnings = Opts.FatalWarnings;495 MCOptions.MCFatalWarnings = Opts.FatalWarnings;
496 MCOptions.MCNoTypeCheck = Opts.NoTypeCheck;
471 MCOptions.ABIName = Opts.TargetABI;497 MCOptions.ABIName = Opts.TargetABI;
472498
473 // FIXME: There is a bit of code duplication with addPassesToEmitFile.499 // FIXME: There is a bit of code duplication with addPassesToEmitFile.
src/zig_clang_driver.cpp+87-38
...@@ -13,6 +13,7 @@...@@ -13,6 +13,7 @@
1313
14#include "clang/Driver/Driver.h"14#include "clang/Driver/Driver.h"
15#include "clang/Basic/DiagnosticOptions.h"15#include "clang/Basic/DiagnosticOptions.h"
16#include "clang/Basic/HeaderInclude.h"
16#include "clang/Basic/Stack.h"17#include "clang/Basic/Stack.h"
17#include "clang/Config/config.h"18#include "clang/Config/config.h"
18#include "clang/Driver/Compilation.h"19#include "clang/Driver/Compilation.h"
...@@ -48,6 +49,7 @@...@@ -48,6 +49,7 @@
48#include "llvm/Support/Timer.h"49#include "llvm/Support/Timer.h"
49#include "llvm/Support/raw_ostream.h"50#include "llvm/Support/raw_ostream.h"
50#include <memory>51#include <memory>
52#include <optional>
51#include <set>53#include <set>
52#include <system_error>54#include <system_error>
53using namespace clang;55using namespace clang;
...@@ -241,29 +243,68 @@ static void getCLEnvVarOptions(std::string &EnvValue, llvm::StringSaver &Saver,...@@ -241,29 +243,68 @@ static void getCLEnvVarOptions(std::string &EnvValue, llvm::StringSaver &Saver,
241 *NumberSignPtr = '=';243 *NumberSignPtr = '=';
242}244}
243245
244static void SetBackdoorDriverOutputsFromEnvVars(Driver &TheDriver) {246template <class T>
245 auto CheckEnvVar = [](const char *EnvOptSet, const char *EnvOptFile,247static T checkEnvVar(const char *EnvOptSet, const char *EnvOptFile,
246 std::string &OptFile) {248 std::string &OptFile) {
247 bool OptSet = !!::getenv(EnvOptSet);249 const char *Str = ::getenv(EnvOptSet);
248 if (OptSet) {250 if (!Str)
249 if (const char *Var = ::getenv(EnvOptFile))251 return T{};
250 OptFile = Var;252
251 }253 T OptVal = Str;
252 return OptSet;254 if (const char *Var = ::getenv(EnvOptFile))
253 };255 OptFile = Var;
256 return OptVal;
257}
254258
259static bool SetBackdoorDriverOutputsFromEnvVars(Driver &TheDriver) {
255 TheDriver.CCPrintOptions =260 TheDriver.CCPrintOptions =
256 CheckEnvVar("CC_PRINT_OPTIONS", "CC_PRINT_OPTIONS_FILE",261 checkEnvVar<bool>("CC_PRINT_OPTIONS", "CC_PRINT_OPTIONS_FILE",
257 TheDriver.CCPrintOptionsFilename);262 TheDriver.CCPrintOptionsFilename);
258 TheDriver.CCPrintHeaders =263 if (checkEnvVar<bool>("CC_PRINT_HEADERS", "CC_PRINT_HEADERS_FILE",
259 CheckEnvVar("CC_PRINT_HEADERS", "CC_PRINT_HEADERS_FILE",264 TheDriver.CCPrintHeadersFilename)) {
260 TheDriver.CCPrintHeadersFilename);265 TheDriver.CCPrintHeadersFormat = HIFMT_Textual;
266 TheDriver.CCPrintHeadersFiltering = HIFIL_None;
267 } else {
268 std::string EnvVar = checkEnvVar<std::string>(
269 "CC_PRINT_HEADERS_FORMAT", "CC_PRINT_HEADERS_FILE",
270 TheDriver.CCPrintHeadersFilename);
271 if (!EnvVar.empty()) {
272 TheDriver.CCPrintHeadersFormat =
273 stringToHeaderIncludeFormatKind(EnvVar.c_str());
274 if (!TheDriver.CCPrintHeadersFormat) {
275 TheDriver.Diag(clang::diag::err_drv_print_header_env_var)
276 << 0 << EnvVar;
277 return false;
278 }
279
280 const char *FilteringStr = ::getenv("CC_PRINT_HEADERS_FILTERING");
281 HeaderIncludeFilteringKind Filtering;
282 if (!stringToHeaderIncludeFiltering(FilteringStr, Filtering)) {
283 TheDriver.Diag(clang::diag::err_drv_print_header_env_var)
284 << 1 << FilteringStr;
285 return false;
286 }
287
288 if ((TheDriver.CCPrintHeadersFormat == HIFMT_Textual &&
289 Filtering != HIFIL_None) ||
290 (TheDriver.CCPrintHeadersFormat == HIFMT_JSON &&
291 Filtering != HIFIL_Only_Direct_System)) {
292 TheDriver.Diag(clang::diag::err_drv_print_header_env_var_combination)
293 << EnvVar << FilteringStr;
294 return false;
295 }
296 TheDriver.CCPrintHeadersFiltering = Filtering;
297 }
298 }
299
261 TheDriver.CCLogDiagnostics =300 TheDriver.CCLogDiagnostics =
262 CheckEnvVar("CC_LOG_DIAGNOSTICS", "CC_LOG_DIAGNOSTICS_FILE",301 checkEnvVar<bool>("CC_LOG_DIAGNOSTICS", "CC_LOG_DIAGNOSTICS_FILE",
263 TheDriver.CCLogDiagnosticsFilename);302 TheDriver.CCLogDiagnosticsFilename);
264 TheDriver.CCPrintProcessStats =303 TheDriver.CCPrintProcessStats =
265 CheckEnvVar("CC_PRINT_PROC_STAT", "CC_PRINT_PROC_STAT_FILE",304 checkEnvVar<bool>("CC_PRINT_PROC_STAT", "CC_PRINT_PROC_STAT_FILE",
266 TheDriver.CCPrintStatReportFilename);305 TheDriver.CCPrintStatReportFilename);
306
307 return true;
267}308}
268309
269static void FixupDiagPrefixExeName(TextDiagnosticPrinter *DiagClient,310static void FixupDiagPrefixExeName(TextDiagnosticPrinter *DiagClient,
...@@ -306,16 +347,17 @@ static int ExecuteCC1Tool(SmallVectorImpl<const char *> &ArgV) {...@@ -306,16 +347,17 @@ static int ExecuteCC1Tool(SmallVectorImpl<const char *> &ArgV) {
306 llvm::cl::ResetAllOptionOccurrences();347 llvm::cl::ResetAllOptionOccurrences();
307348
308 llvm::BumpPtrAllocator A;349 llvm::BumpPtrAllocator A;
309 llvm::StringSaver Saver(A);350 llvm::cl::ExpansionContext ECtx(A, llvm::cl::TokenizeGNUCommandLine);
310 llvm::cl::ExpandResponseFiles(Saver, &llvm::cl::TokenizeGNUCommandLine, ArgV,351 if (llvm::Error Err = ECtx.expandResponseFiles(ArgV)) {
311 /*MarkEOLs=*/false);352 llvm::errs() << toString(std::move(Err)) << '\n';
353 return 1;
354 }
312 StringRef Tool = ArgV[1];355 StringRef Tool = ArgV[1];
313 void *GetExecutablePathVP = (void *)(intptr_t)GetExecutablePath;356 void *GetExecutablePathVP = (void *)(intptr_t)GetExecutablePath;
314 if (Tool == "-cc1")357 if (Tool == "-cc1")
315 return cc1_main(makeArrayRef(ArgV).slice(1), ArgV[0], GetExecutablePathVP);358 return cc1_main(ArrayRef(ArgV).slice(1), ArgV[0], GetExecutablePathVP);
316 if (Tool == "-cc1as")359 if (Tool == "-cc1as")
317 return cc1as_main(makeArrayRef(ArgV).slice(2), ArgV[0],360 return cc1as_main(ArrayRef(ArgV).slice(2), ArgV[0], GetExecutablePathVP);
318 GetExecutablePathVP);
319 // Reject unknown tools.361 // Reject unknown tools.
320 llvm::errs() << "error: unknown integrated tool '" << Tool << "'. "362 llvm::errs() << "error: unknown integrated tool '" << Tool << "'. "
321 << "Valid tools include '-cc1' and '-cc1as'.\n";363 << "Valid tools include '-cc1' and '-cc1as'.\n";
...@@ -355,7 +397,7 @@ int ZigClang_main(int Argc, const char **Argv) {...@@ -355,7 +397,7 @@ int ZigClang_main(int Argc, const char **Argv) {
355 // Finally, our -cc1 tools don't care which tokenization mode we use because397 // Finally, our -cc1 tools don't care which tokenization mode we use because
356 // response files written by clang will tokenize the same way in either mode.398 // response files written by clang will tokenize the same way in either mode.
357 bool ClangCLMode =399 bool ClangCLMode =
358 IsClangCL(getDriverMode(Args[0], llvm::makeArrayRef(Args).slice(1)));400 IsClangCL(getDriverMode(Args[0], llvm::ArrayRef(Args).slice(1)));
359 enum { Default, POSIX, Windows } RSPQuoting = Default;401 enum { Default, POSIX, Windows } RSPQuoting = Default;
360 for (const char *F : Args) {402 for (const char *F : Args) {
361 if (strcmp(F, "--rsp-quoting=posix") == 0)403 if (strcmp(F, "--rsp-quoting=posix") == 0)
...@@ -377,7 +419,12 @@ int ZigClang_main(int Argc, const char **Argv) {...@@ -377,7 +419,12 @@ int ZigClang_main(int Argc, const char **Argv) {
377419
378 if (MarkEOLs && Args.size() > 1 && StringRef(Args[1]).startswith("-cc1"))420 if (MarkEOLs && Args.size() > 1 && StringRef(Args[1]).startswith("-cc1"))
379 MarkEOLs = false;421 MarkEOLs = false;
380 llvm::cl::ExpandResponseFiles(Saver, Tokenizer, Args, MarkEOLs);422 llvm::cl::ExpansionContext ECtx(A, Tokenizer);
423 ECtx.setMarkEOLs(MarkEOLs);
424 if (llvm::Error Err = ECtx.expandResponseFiles(Args)) {
425 llvm::errs() << toString(std::move(Err)) << '\n';
426 return 1;
427 }
381428
382 // Handle -cc1 integrated tools, even if -cc1 was expanded from a response429 // Handle -cc1 integrated tools, even if -cc1 was expanded from a response
383 // file.430 // file.
...@@ -409,19 +456,19 @@ int ZigClang_main(int Argc, const char **Argv) {...@@ -409,19 +456,19 @@ int ZigClang_main(int Argc, const char **Argv) {
409 // prepended or appended.456 // prepended or appended.
410 if (ClangCLMode) {457 if (ClangCLMode) {
411 // Arguments in "CL" are prepended.458 // Arguments in "CL" are prepended.
412 llvm::Optional<std::string> OptCL = llvm::sys::Process::GetEnv("CL");459 std::optional<std::string> OptCL = llvm::sys::Process::GetEnv("CL");
413 if (OptCL) {460 if (OptCL) {
414 SmallVector<const char *, 8> PrependedOpts;461 SmallVector<const char *, 8> PrependedOpts;
415 getCLEnvVarOptions(OptCL.value(), Saver, PrependedOpts);462 getCLEnvVarOptions(*OptCL, Saver, PrependedOpts);
416463
417 // Insert right after the program name to prepend to the argument list.464 // Insert right after the program name to prepend to the argument list.
418 Args.insert(Args.begin() + 1, PrependedOpts.begin(), PrependedOpts.end());465 Args.insert(Args.begin() + 1, PrependedOpts.begin(), PrependedOpts.end());
419 }466 }
420 // Arguments in "_CL_" are appended.467 // Arguments in "_CL_" are appended.
421 llvm::Optional<std::string> Opt_CL_ = llvm::sys::Process::GetEnv("_CL_");468 std::optional<std::string> Opt_CL_ = llvm::sys::Process::GetEnv("_CL_");
422 if (Opt_CL_) {469 if (Opt_CL_) {
423 SmallVector<const char *, 8> AppendedOpts;470 SmallVector<const char *, 8> AppendedOpts;
424 getCLEnvVarOptions(Opt_CL_.value(), Saver, AppendedOpts);471 getCLEnvVarOptions(*Opt_CL_, Saver, AppendedOpts);
425472
426 // Insert at the end of the argument list to append.473 // Insert at the end of the argument list to append.
427 Args.append(AppendedOpts.begin(), AppendedOpts.end());474 Args.append(AppendedOpts.begin(), AppendedOpts.end());
...@@ -479,7 +526,8 @@ int ZigClang_main(int Argc, const char **Argv) {...@@ -479,7 +526,8 @@ int ZigClang_main(int Argc, const char **Argv) {
479526
480 insertTargetAndModeArgs(TargetAndMode, Args, SavedStrings);527 insertTargetAndModeArgs(TargetAndMode, Args, SavedStrings);
481528
482 SetBackdoorDriverOutputsFromEnvVars(TheDriver);529 if (!SetBackdoorDriverOutputsFromEnvVars(TheDriver))
530 return 1;
483531
484 if (!UseNewCC1Process) {532 if (!UseNewCC1Process) {
485 TheDriver.CC1Main = &ExecuteCC1Tool;533 TheDriver.CC1Main = &ExecuteCC1Tool;
...@@ -491,12 +539,13 @@ int ZigClang_main(int Argc, const char **Argv) {...@@ -491,12 +539,13 @@ int ZigClang_main(int Argc, const char **Argv) {
491539
492 Driver::ReproLevel ReproLevel = Driver::ReproLevel::OnCrash;540 Driver::ReproLevel ReproLevel = Driver::ReproLevel::OnCrash;
493 if (Arg *A = C->getArgs().getLastArg(options::OPT_gen_reproducer_eq)) {541 if (Arg *A = C->getArgs().getLastArg(options::OPT_gen_reproducer_eq)) {
494 auto Level = llvm::StringSwitch<Optional<Driver::ReproLevel>>(A->getValue())542 auto Level =
495 .Case("off", Driver::ReproLevel::Off)543 llvm::StringSwitch<std::optional<Driver::ReproLevel>>(A->getValue())
496 .Case("crash", Driver::ReproLevel::OnCrash)544 .Case("off", Driver::ReproLevel::Off)
497 .Case("error", Driver::ReproLevel::OnError)545 .Case("crash", Driver::ReproLevel::OnCrash)
498 .Case("always", Driver::ReproLevel::Always)546 .Case("error", Driver::ReproLevel::OnError)
499 .Default(None);547 .Case("always", Driver::ReproLevel::Always)
548 .Default(std::nullopt);
500 if (!Level) {549 if (!Level) {
501 llvm::errs() << "Unknown value for " << A->getSpelling() << ": '"550 llvm::errs() << "Unknown value for " << A->getSpelling() << ": '"
502 << A->getValue() << "'\n";551 << A->getValue() << "'\n";
src/zig_llvm-ar.cpp+30-23
...@@ -68,9 +68,9 @@ static StringRef ToolName;...@@ -68,9 +68,9 @@ static StringRef ToolName;
68static StringRef Stem;68static StringRef Stem;
6969
70static void printRanLibHelp(StringRef ToolName) {70static void printRanLibHelp(StringRef ToolName) {
71 outs() << "OVERVIEW: LLVM Ranlib\n\n"71 outs() << "OVERVIEW: LLVM ranlib\n\n"
72 << "This program generates an index to speed access to archives\n\n"72 << "Generate an index for archives\n\n"
73 << "USAGE: " + ToolName + " <archive-file>\n\n"73 << "USAGE: " + ToolName + " archive...\n\n"
74 << "OPTIONS:\n"74 << "OPTIONS:\n"
75 << " -h --help - Display available options\n"75 << " -h --help - Display available options\n"
76 << " -v --version - Display the version of this program\n"76 << " -v --version - Display the version of this program\n"
...@@ -875,8 +875,16 @@ static InsertAction computeInsertAction(ArchiveOperation Operation,...@@ -875,8 +875,16 @@ static InsertAction computeInsertAction(ArchiveOperation Operation,
875875
876 if (Operation == QuickAppend || Members.empty())876 if (Operation == QuickAppend || Members.empty())
877 return IA_AddOldMember;877 return IA_AddOldMember;
878 auto MI = find_if(878
879 Members, [Name](StringRef Path) { return comparePaths(Name, Path); });879 auto MI = find_if(Members, [Name](StringRef Path) {
880 if (Thin && !sys::path::is_absolute(Path)) {
881 Expected<std::string> PathOrErr =
882 computeArchiveRelativePath(ArchiveName, Path);
883 return comparePaths(Name, PathOrErr ? *PathOrErr : Path);
884 } else {
885 return comparePaths(Name, Path);
886 }
887 });
880888
881 if (MI == Members.end())889 if (MI == Members.end())
882 return IA_AddOldMember;890 return IA_AddOldMember;
...@@ -1125,8 +1133,7 @@ static void performOperation(ArchiveOperation Operation,...@@ -1125,8 +1133,7 @@ static void performOperation(ArchiveOperation Operation,
1125 llvm_unreachable("Unknown operation.");1133 llvm_unreachable("Unknown operation.");
1126}1134}
11271135
1128static int performOperation(ArchiveOperation Operation,1136static int performOperation(ArchiveOperation Operation) {
1129 std::vector<NewArchiveMember> *NewMembers) {
1130 // Create or open the archive object.1137 // Create or open the archive object.
1131 ErrorOr<std::unique_ptr<MemoryBuffer>> Buf = MemoryBuffer::getFile(1138 ErrorOr<std::unique_ptr<MemoryBuffer>> Buf = MemoryBuffer::getFile(
1132 ArchiveName, /*IsText=*/false, /*RequiresNullTerminator=*/false);1139 ArchiveName, /*IsText=*/false, /*RequiresNullTerminator=*/false);
...@@ -1145,7 +1152,7 @@ static int performOperation(ArchiveOperation Operation,...@@ -1145,7 +1152,7 @@ static int performOperation(ArchiveOperation Operation,
1145 if (Archive->isThin())1152 if (Archive->isThin())
1146 CompareFullPath = true;1153 CompareFullPath = true;
1147 performOperation(Operation, Archive.get(), std::move(Buf.get()),1154 performOperation(Operation, Archive.get(), std::move(Buf.get()),
1148 NewMembers);1155 /*NewMembers=*/nullptr);
1149 return 0;1156 return 0;
1150 }1157 }
11511158
...@@ -1160,7 +1167,7 @@ static int performOperation(ArchiveOperation Operation,...@@ -1160,7 +1167,7 @@ static int performOperation(ArchiveOperation Operation,
1160 }1167 }
1161 }1168 }
11621169
1163 performOperation(Operation, nullptr, nullptr, NewMembers);1170 performOperation(Operation, nullptr, nullptr, /*NewMembers=*/nullptr);
1164 return 0;1171 return 0;
1165}1172}
11661173
...@@ -1219,7 +1226,7 @@ static void runMRIScript() {...@@ -1219,7 +1226,7 @@ static void runMRIScript() {
1219 break;1226 break;
1220 case MRICommand::CreateThin:1227 case MRICommand::CreateThin:
1221 Thin = true;1228 Thin = true;
1222 LLVM_FALLTHROUGH;1229 [[fallthrough]];
1223 case MRICommand::Create:1230 case MRICommand::Create:
1224 Create = true;1231 Create = true;
1225 if (!ArchiveName.empty())1232 if (!ArchiveName.empty())
...@@ -1323,7 +1330,7 @@ static int ar_main(int argc, char **argv) {...@@ -1323,7 +1330,7 @@ static int ar_main(int argc, char **argv) {
1323 SmallVector<const char *, 0> Argv(argv + 1, argv + argc);1330 SmallVector<const char *, 0> Argv(argv + 1, argv + argc);
1324 StringSaver Saver(Alloc);1331 StringSaver Saver(Alloc);
13251332
1326 cl::ExpandResponseFiles(Saver, getRspQuoting(makeArrayRef(argv, argc)), Argv);1333 cl::ExpandResponseFiles(Saver, getRspQuoting(ArrayRef(argv, argc)), Argv);
13271334
1328 // Get BitMode from enviorment variable "OBJECT_MODE" for AIX OS, if1335 // Get BitMode from enviorment variable "OBJECT_MODE" for AIX OS, if
1329 // specified.1336 // specified.
...@@ -1403,12 +1410,11 @@ static int ar_main(int argc, char **argv) {...@@ -1403,12 +1410,11 @@ static int ar_main(int argc, char **argv) {
1403 Options += *ArgIt + 1;1410 Options += *ArgIt + 1;
1404 }1411 }
14051412
1406 ArchiveOperation Operation = parseCommandLine();1413 return performOperation(parseCommandLine());
1407 return performOperation(Operation, nullptr);
1408}1414}
14091415
1410static int ranlib_main(int argc, char **argv) {1416static int ranlib_main(int argc, char **argv) {
1411 bool ArchiveSpecified = false;1417 std::vector<StringRef> Archives;
1412 for (int i = 1; i < argc; ++i) {1418 for (int i = 1; i < argc; ++i) {
1413 StringRef arg(argv[i]);1419 StringRef arg(argv[i]);
1414 if (handleGenericOption(arg)) {1420 if (handleGenericOption(arg)) {
...@@ -1433,16 +1439,17 @@ static int ranlib_main(int argc, char **argv) {...@@ -1433,16 +1439,17 @@ static int ranlib_main(int argc, char **argv) {
1433 arg = arg.drop_front(1);1439 arg = arg.drop_front(1);
1434 }1440 }
1435 } else {1441 } else {
1436 if (ArchiveSpecified)1442 Archives.push_back(arg);
1437 fail("exactly one archive should be specified");
1438 ArchiveSpecified = true;
1439 ArchiveName = arg.str();
1440 }1443 }
1441 }1444 }
1442 if (!ArchiveSpecified) {1445
1443 badUsage("an archive name must be specified");1446 for (StringRef Archive : Archives) {
1447 ArchiveName = Archive.str();
1448 performOperation(CreateSymTab);
1444 }1449 }
1445 return performOperation(CreateSymTab, nullptr);1450 if (Archives.empty())
1451 badUsage("an archive name must be specified");
1452 return 0;
1446}1453}
14471454
1448extern "C" int ZigLlvmAr_main(int argc, char **argv);1455extern "C" int ZigLlvmAr_main(int argc, char **argv);
...@@ -1474,11 +1481,11 @@ int ZigLlvmAr_main(int argc, char **argv) {...@@ -1474,11 +1481,11 @@ int ZigLlvmAr_main(int argc, char **argv) {
1474 };1481 };
14751482
1476 if (Is("dlltool"))1483 if (Is("dlltool"))
1477 return dlltoolDriverMain(makeArrayRef(argv, argc));1484 return dlltoolDriverMain(ArrayRef(argv, argc));
1478 if (Is("ranlib"))1485 if (Is("ranlib"))
1479 return ranlib_main(argc, argv);1486 return ranlib_main(argc, argv);
1480 if (Is("lib"))1487 if (Is("lib"))
1481 return libDriverMain(makeArrayRef(argv, argc));1488 return libDriverMain(ArrayRef(argv, argc));
1482 if (Is("ar"))1489 if (Is("ar"))
1483 return ar_main(argc, argv);1490 return ar_main(argc, argv);
14841491