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(
656656
657657# These have to go before the -Wno- flags
658658if(MSVC)
659 set(EXE_CXX_FLAGS "/std:c++14")
659 set(EXE_CXX_FLAGS "/std:c++17")
660660else(MSVC)
661 set(EXE_CXX_FLAGS "-std=c++14")
661 set(EXE_CXX_FLAGS "-std=c++17")
662662endif(MSVC)
663663
664664if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
src/zig_clang_cc1_main.cpp+2-1
......@@ -177,7 +177,8 @@ static int PrintSupportedCPUs(std::string TargetStr) {
177177 // the target machine will handle the mcpu printing
178178 llvm::TargetOptions Options;
179179 std::unique_ptr<llvm::TargetMachine> TheTargetMachine(
180 TheTarget->createTargetMachine(TargetStr, "", "+cpuhelp", Options, None));
180 TheTarget->createTargetMachine(TargetStr, "", "+cpuhelp", Options,
181 std::nullopt));
181182 return 0;
182183}
183184
src/zig_clang_cc1as_main.cpp+29-3
......@@ -54,6 +54,7 @@
5454#include "llvm/Support/Timer.h"
5555#include "llvm/Support/raw_ostream.h"
5656#include <memory>
57#include <optional>
5758#include <system_error>
5859using namespace clang;
5960using namespace clang::driver;
......@@ -134,6 +135,7 @@ struct AssemblerInvocation {
134135 unsigned NoExecStack : 1;
135136 unsigned FatalWarnings : 1;
136137 unsigned NoWarn : 1;
138 unsigned NoTypeCheck : 1;
137139 unsigned IncrementalLinkerCompatible : 1;
138140 unsigned EmbedBitcode : 1;
139141
......@@ -149,7 +151,14 @@ struct AssemblerInvocation {
149151
150152 /// Darwin target variant triple, the variant of the deployment target
151153 /// 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;
153162 /// @}
154163
155164public:
......@@ -166,6 +175,7 @@ public:
166175 NoExecStack = 0;
167176 FatalWarnings = 0;
168177 NoWarn = 0;
178 NoTypeCheck = 0;
169179 IncrementalLinkerCompatible = 0;
170180 Dwarf64 = 0;
171181 DwarfVersion = 0;
......@@ -218,6 +228,14 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
218228 Opts.Triple = llvm::Triple::normalize(Args.getLastArgValue(OPT_triple));
219229 if (Arg *A = Args.getLastArg(options::OPT_darwin_target_variant_triple))
220230 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
222240 Opts.CPU = std::string(Args.getLastArgValue(OPT_target_cpu));
223241 Opts.Features = Args.getAllArgValues(OPT_target_feature);
......@@ -237,11 +255,12 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
237255 Opts.CompressDebugSections =
238256 llvm::StringSwitch<llvm::DebugCompressionType>(A->getValue())
239257 .Case("none", llvm::DebugCompressionType::None)
240 .Case("zlib", llvm::DebugCompressionType::Z)
258 .Case("zlib", llvm::DebugCompressionType::Zlib)
259 .Case("zstd", llvm::DebugCompressionType::Zstd)
241260 .Default(llvm::DebugCompressionType::None);
242261 }
243262
244 Opts.RelaxELFRelocations = Args.hasArg(OPT_mrelax_relocations);
263 Opts.RelaxELFRelocations = !Args.hasArg(OPT_mrelax_relocations_no);
245264 if (auto *DwarfFormatArg = Args.getLastArg(OPT_gdwarf64, OPT_gdwarf32))
246265 Opts.Dwarf64 = DwarfFormatArg->getOption().matches(OPT_gdwarf64);
247266 Opts.DwarfVersion = getLastArgIntValue(Args, OPT_dwarf_version_EQ, 2, Diags);
......@@ -304,6 +323,7 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
304323 Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack);
305324 Opts.FatalWarnings = Args.hasArg(OPT_massembler_fatal_warnings);
306325 Opts.NoWarn = Args.hasArg(OPT_massembler_no_warn);
326 Opts.NoTypeCheck = Args.hasArg(OPT_mno_type_check);
307327 Opts.RelocationModel =
308328 std::string(Args.getLastArgValue(OPT_mrelocation_model, "pic"));
309329 Opts.TargetABI = std::string(Args.getLastArgValue(OPT_target_abi));
......@@ -329,6 +349,8 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts,
329349 .Case("default", EmitDwarfUnwindType::Default);
330350 }
331351
352 Opts.AsSecureLogFile = Args.getLastArgValue(OPT_as_secure_log_file);
353
332354 return Success;
333355}
334356
......@@ -380,6 +402,7 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,
380402
381403 MCTargetOptions MCOptions;
382404 MCOptions.EmitDwarfUnwind = Opts.EmitDwarfUnwind;
405 MCOptions.AsSecureLogFile = Opts.AsSecureLogFile;
383406
384407 std::unique_ptr<MCAsmInfo> MAI(
385408 TheTarget->createMCAsmInfo(*MRI, Opts.Triple, MCOptions));
......@@ -429,6 +452,8 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,
429452 TheTarget->createMCObjectFileInfo(Ctx, PIC));
430453 if (Opts.DarwinTargetVariantTriple)
431454 MOFI->setDarwinTargetVariantTriple(*Opts.DarwinTargetVariantTriple);
455 if (!Opts.DarwinTargetVariantSDKVersion.empty())
456 MOFI->setDarwinTargetVariantSDKVersion(Opts.DarwinTargetVariantSDKVersion);
432457 Ctx.setObjectFileInfo(MOFI.get());
433458
434459 if (Opts.SaveTemporaryLabels)
......@@ -468,6 +493,7 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts,
468493
469494 MCOptions.MCNoWarn = Opts.NoWarn;
470495 MCOptions.MCFatalWarnings = Opts.FatalWarnings;
496 MCOptions.MCNoTypeCheck = Opts.NoTypeCheck;
471497 MCOptions.ABIName = Opts.TargetABI;
472498
473499 // FIXME: There is a bit of code duplication with addPassesToEmitFile.
src/zig_clang_driver.cpp+87-38
......@@ -13,6 +13,7 @@
1313
1414#include "clang/Driver/Driver.h"
1515#include "clang/Basic/DiagnosticOptions.h"
16#include "clang/Basic/HeaderInclude.h"
1617#include "clang/Basic/Stack.h"
1718#include "clang/Config/config.h"
1819#include "clang/Driver/Compilation.h"
......@@ -48,6 +49,7 @@
4849#include "llvm/Support/Timer.h"
4950#include "llvm/Support/raw_ostream.h"
5051#include <memory>
52#include <optional>
5153#include <set>
5254#include <system_error>
5355using namespace clang;
......@@ -241,29 +243,68 @@ static void getCLEnvVarOptions(std::string &EnvValue, llvm::StringSaver &Saver,
241243 *NumberSignPtr = '=';
242244}
243245
244static void SetBackdoorDriverOutputsFromEnvVars(Driver &TheDriver) {
245 auto CheckEnvVar = [](const char *EnvOptSet, const char *EnvOptFile,
246 std::string &OptFile) {
247 bool OptSet = !!::getenv(EnvOptSet);
248 if (OptSet) {
249 if (const char *Var = ::getenv(EnvOptFile))
250 OptFile = Var;
251 }
252 return OptSet;
253 };
246template <class T>
247static T checkEnvVar(const char *EnvOptSet, const char *EnvOptFile,
248 std::string &OptFile) {
249 const char *Str = ::getenv(EnvOptSet);
250 if (!Str)
251 return T{};
252
253 T OptVal = Str;
254 if (const char *Var = ::getenv(EnvOptFile))
255 OptFile = Var;
256 return OptVal;
257}
254258
259static bool SetBackdoorDriverOutputsFromEnvVars(Driver &TheDriver) {
255260 TheDriver.CCPrintOptions =
256 CheckEnvVar("CC_PRINT_OPTIONS", "CC_PRINT_OPTIONS_FILE",
257 TheDriver.CCPrintOptionsFilename);
258 TheDriver.CCPrintHeaders =
259 CheckEnvVar("CC_PRINT_HEADERS", "CC_PRINT_HEADERS_FILE",
260 TheDriver.CCPrintHeadersFilename);
261 checkEnvVar<bool>("CC_PRINT_OPTIONS", "CC_PRINT_OPTIONS_FILE",
262 TheDriver.CCPrintOptionsFilename);
263 if (checkEnvVar<bool>("CC_PRINT_HEADERS", "CC_PRINT_HEADERS_FILE",
264 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
261300 TheDriver.CCLogDiagnostics =
262 CheckEnvVar("CC_LOG_DIAGNOSTICS", "CC_LOG_DIAGNOSTICS_FILE",
263 TheDriver.CCLogDiagnosticsFilename);
301 checkEnvVar<bool>("CC_LOG_DIAGNOSTICS", "CC_LOG_DIAGNOSTICS_FILE",
302 TheDriver.CCLogDiagnosticsFilename);
264303 TheDriver.CCPrintProcessStats =
265 CheckEnvVar("CC_PRINT_PROC_STAT", "CC_PRINT_PROC_STAT_FILE",
266 TheDriver.CCPrintStatReportFilename);
304 checkEnvVar<bool>("CC_PRINT_PROC_STAT", "CC_PRINT_PROC_STAT_FILE",
305 TheDriver.CCPrintStatReportFilename);
306
307 return true;
267308}
268309
269310static void FixupDiagPrefixExeName(TextDiagnosticPrinter *DiagClient,
......@@ -306,16 +347,17 @@ static int ExecuteCC1Tool(SmallVectorImpl<const char *> &ArgV) {
306347 llvm::cl::ResetAllOptionOccurrences();
307348
308349 llvm::BumpPtrAllocator A;
309 llvm::StringSaver Saver(A);
310 llvm::cl::ExpandResponseFiles(Saver, &llvm::cl::TokenizeGNUCommandLine, ArgV,
311 /*MarkEOLs=*/false);
350 llvm::cl::ExpansionContext ECtx(A, llvm::cl::TokenizeGNUCommandLine);
351 if (llvm::Error Err = ECtx.expandResponseFiles(ArgV)) {
352 llvm::errs() << toString(std::move(Err)) << '\n';
353 return 1;
354 }
312355 StringRef Tool = ArgV[1];
313356 void *GetExecutablePathVP = (void *)(intptr_t)GetExecutablePath;
314357 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);
316359 if (Tool == "-cc1as")
317 return cc1as_main(makeArrayRef(ArgV).slice(2), ArgV[0],
318 GetExecutablePathVP);
360 return cc1as_main(ArrayRef(ArgV).slice(2), ArgV[0], GetExecutablePathVP);
319361 // Reject unknown tools.
320362 llvm::errs() << "error: unknown integrated tool '" << Tool << "'. "
321363 << "Valid tools include '-cc1' and '-cc1as'.\n";
......@@ -355,7 +397,7 @@ int ZigClang_main(int Argc, const char **Argv) {
355397 // Finally, our -cc1 tools don't care which tokenization mode we use because
356398 // response files written by clang will tokenize the same way in either mode.
357399 bool ClangCLMode =
358 IsClangCL(getDriverMode(Args[0], llvm::makeArrayRef(Args).slice(1)));
400 IsClangCL(getDriverMode(Args[0], llvm::ArrayRef(Args).slice(1)));
359401 enum { Default, POSIX, Windows } RSPQuoting = Default;
360402 for (const char *F : Args) {
361403 if (strcmp(F, "--rsp-quoting=posix") == 0)
......@@ -377,7 +419,12 @@ int ZigClang_main(int Argc, const char **Argv) {
377419
378420 if (MarkEOLs && Args.size() > 1 && StringRef(Args[1]).startswith("-cc1"))
379421 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
382429 // Handle -cc1 integrated tools, even if -cc1 was expanded from a response
383430 // file.
......@@ -409,19 +456,19 @@ int ZigClang_main(int Argc, const char **Argv) {
409456 // prepended or appended.
410457 if (ClangCLMode) {
411458 // 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");
413460 if (OptCL) {
414461 SmallVector<const char *, 8> PrependedOpts;
415 getCLEnvVarOptions(OptCL.value(), Saver, PrependedOpts);
462 getCLEnvVarOptions(*OptCL, Saver, PrependedOpts);
416463
417464 // Insert right after the program name to prepend to the argument list.
418465 Args.insert(Args.begin() + 1, PrependedOpts.begin(), PrependedOpts.end());
419466 }
420467 // 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_");
422469 if (Opt_CL_) {
423470 SmallVector<const char *, 8> AppendedOpts;
424 getCLEnvVarOptions(Opt_CL_.value(), Saver, AppendedOpts);
471 getCLEnvVarOptions(*Opt_CL_, Saver, AppendedOpts);
425472
426473 // Insert at the end of the argument list to append.
427474 Args.append(AppendedOpts.begin(), AppendedOpts.end());
......@@ -479,7 +526,8 @@ int ZigClang_main(int Argc, const char **Argv) {
479526
480527 insertTargetAndModeArgs(TargetAndMode, Args, SavedStrings);
481528
482 SetBackdoorDriverOutputsFromEnvVars(TheDriver);
529 if (!SetBackdoorDriverOutputsFromEnvVars(TheDriver))
530 return 1;
483531
484532 if (!UseNewCC1Process) {
485533 TheDriver.CC1Main = &ExecuteCC1Tool;
......@@ -491,12 +539,13 @@ int ZigClang_main(int Argc, const char **Argv) {
491539
492540 Driver::ReproLevel ReproLevel = Driver::ReproLevel::OnCrash;
493541 if (Arg *A = C->getArgs().getLastArg(options::OPT_gen_reproducer_eq)) {
494 auto Level = llvm::StringSwitch<Optional<Driver::ReproLevel>>(A->getValue())
495 .Case("off", Driver::ReproLevel::Off)
496 .Case("crash", Driver::ReproLevel::OnCrash)
497 .Case("error", Driver::ReproLevel::OnError)
498 .Case("always", Driver::ReproLevel::Always)
499 .Default(None);
542 auto Level =
543 llvm::StringSwitch<std::optional<Driver::ReproLevel>>(A->getValue())
544 .Case("off", Driver::ReproLevel::Off)
545 .Case("crash", Driver::ReproLevel::OnCrash)
546 .Case("error", Driver::ReproLevel::OnError)
547 .Case("always", Driver::ReproLevel::Always)
548 .Default(std::nullopt);
500549 if (!Level) {
501550 llvm::errs() << "Unknown value for " << A->getSpelling() << ": '"
502551 << A->getValue() << "'\n";
src/zig_llvm-ar.cpp+30-23
......@@ -68,9 +68,9 @@ static StringRef ToolName;
6868static StringRef Stem;
6969
7070static void printRanLibHelp(StringRef ToolName) {
71 outs() << "OVERVIEW: LLVM Ranlib\n\n"
72 << "This program generates an index to speed access to archives\n\n"
73 << "USAGE: " + ToolName + " <archive-file>\n\n"
71 outs() << "OVERVIEW: LLVM ranlib\n\n"
72 << "Generate an index for archives\n\n"
73 << "USAGE: " + ToolName + " archive...\n\n"
7474 << "OPTIONS:\n"
7575 << " -h --help - Display available options\n"
7676 << " -v --version - Display the version of this program\n"
......@@ -875,8 +875,16 @@ static InsertAction computeInsertAction(ArchiveOperation Operation,
875875
876876 if (Operation == QuickAppend || Members.empty())
877877 return IA_AddOldMember;
878 auto MI = find_if(
879 Members, [Name](StringRef Path) { return comparePaths(Name, Path); });
878
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
881889 if (MI == Members.end())
882890 return IA_AddOldMember;
......@@ -1125,8 +1133,7 @@ static void performOperation(ArchiveOperation Operation,
11251133 llvm_unreachable("Unknown operation.");
11261134}
11271135
1128static int performOperation(ArchiveOperation Operation,
1129 std::vector<NewArchiveMember> *NewMembers) {
1136static int performOperation(ArchiveOperation Operation) {
11301137 // Create or open the archive object.
11311138 ErrorOr<std::unique_ptr<MemoryBuffer>> Buf = MemoryBuffer::getFile(
11321139 ArchiveName, /*IsText=*/false, /*RequiresNullTerminator=*/false);
......@@ -1145,7 +1152,7 @@ static int performOperation(ArchiveOperation Operation,
11451152 if (Archive->isThin())
11461153 CompareFullPath = true;
11471154 performOperation(Operation, Archive.get(), std::move(Buf.get()),
1148 NewMembers);
1155 /*NewMembers=*/nullptr);
11491156 return 0;
11501157 }
11511158
......@@ -1160,7 +1167,7 @@ static int performOperation(ArchiveOperation Operation,
11601167 }
11611168 }
11621169
1163 performOperation(Operation, nullptr, nullptr, NewMembers);
1170 performOperation(Operation, nullptr, nullptr, /*NewMembers=*/nullptr);
11641171 return 0;
11651172}
11661173
......@@ -1219,7 +1226,7 @@ static void runMRIScript() {
12191226 break;
12201227 case MRICommand::CreateThin:
12211228 Thin = true;
1222 LLVM_FALLTHROUGH;
1229 [[fallthrough]];
12231230 case MRICommand::Create:
12241231 Create = true;
12251232 if (!ArchiveName.empty())
......@@ -1323,7 +1330,7 @@ static int ar_main(int argc, char **argv) {
13231330 SmallVector<const char *, 0> Argv(argv + 1, argv + argc);
13241331 StringSaver Saver(Alloc);
13251332
1326 cl::ExpandResponseFiles(Saver, getRspQuoting(makeArrayRef(argv, argc)), Argv);
1333 cl::ExpandResponseFiles(Saver, getRspQuoting(ArrayRef(argv, argc)), Argv);
13271334
13281335 // Get BitMode from enviorment variable "OBJECT_MODE" for AIX OS, if
13291336 // specified.
......@@ -1403,12 +1410,11 @@ static int ar_main(int argc, char **argv) {
14031410 Options += *ArgIt + 1;
14041411 }
14051412
1406 ArchiveOperation Operation = parseCommandLine();
1407 return performOperation(Operation, nullptr);
1413 return performOperation(parseCommandLine());
14081414}
14091415
14101416static int ranlib_main(int argc, char **argv) {
1411 bool ArchiveSpecified = false;
1417 std::vector<StringRef> Archives;
14121418 for (int i = 1; i < argc; ++i) {
14131419 StringRef arg(argv[i]);
14141420 if (handleGenericOption(arg)) {
......@@ -1433,16 +1439,17 @@ static int ranlib_main(int argc, char **argv) {
14331439 arg = arg.drop_front(1);
14341440 }
14351441 } else {
1436 if (ArchiveSpecified)
1437 fail("exactly one archive should be specified");
1438 ArchiveSpecified = true;
1439 ArchiveName = arg.str();
1442 Archives.push_back(arg);
14401443 }
14411444 }
1442 if (!ArchiveSpecified) {
1443 badUsage("an archive name must be specified");
1445
1446 for (StringRef Archive : Archives) {
1447 ArchiveName = Archive.str();
1448 performOperation(CreateSymTab);
14441449 }
1445 return performOperation(CreateSymTab, nullptr);
1450 if (Archives.empty())
1451 badUsage("an archive name must be specified");
1452 return 0;
14461453}
14471454
14481455extern "C" int ZigLlvmAr_main(int argc, char **argv);
......@@ -1474,11 +1481,11 @@ int ZigLlvmAr_main(int argc, char **argv) {
14741481 };
14751482
14761483 if (Is("dlltool"))
1477 return dlltoolDriverMain(makeArrayRef(argv, argc));
1484 return dlltoolDriverMain(ArrayRef(argv, argc));
14781485 if (Is("ranlib"))
14791486 return ranlib_main(argc, argv);
14801487 if (Is("lib"))
1481 return libDriverMain(makeArrayRef(argv, argc));
1488 return libDriverMain(ArrayRef(argv, argc));
14821489 if (Is("ar"))
14831490 return ar_main(argc, argv);
14841491