| author | |
| committer | |
| log | 5994a5d18d341f826b12a99c9d800601c69fc186 |
| tree | 99a61edb9c27111b11158902280c92350a5b80ca |
| parent | 9c3bd437e66b4b4e0d1b093e988229e9a6135d36 |
5 files changed, 150 insertions(+), 67 deletions(-)
CMakeLists.txt+2-2| ... | ... | @@ -656,9 +656,9 @@ include_directories( |
| 656 | 656 | |
| 657 | 657 | # These have to go before the -Wno- flags |
| 658 | 658 | if(MSVC) |
| 659 | set(EXE_CXX_FLAGS "/std:c++14") | |
| 659 | set(EXE_CXX_FLAGS "/std:c++17") | |
| 660 | 660 | else(MSVC) |
| 661 | set(EXE_CXX_FLAGS "-std=c++14") | |
| 661 | set(EXE_CXX_FLAGS "-std=c++17") | |
| 662 | 662 | endif(MSVC) |
| 663 | 663 | |
| 664 | 664 | if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") |
src/zig_clang_cc1_main.cpp+2-1| ... | ... | @@ -177,7 +177,8 @@ static int PrintSupportedCPUs(std::string TargetStr) { |
| 177 | 177 | // the target machine will handle the mcpu printing |
| 178 | 178 | llvm::TargetOptions Options; |
| 179 | 179 | std::unique_ptr<llvm::TargetMachine> TheTargetMachine( |
| 180 | TheTarget->createTargetMachine(TargetStr, "", "+cpuhelp", Options, None)); | |
| 180 | TheTarget->createTargetMachine(TargetStr, "", "+cpuhelp", Options, | |
| 181 | std::nullopt)); | |
| 181 | 182 | return 0; |
| 182 | 183 | } |
| 183 | 184 |
src/zig_clang_cc1as_main.cpp+29-3| ... | ... | @@ -54,6 +54,7 @@ |
| 54 | 54 | #include "llvm/Support/Timer.h" |
| 55 | 55 | #include "llvm/Support/raw_ostream.h" |
| 56 | 56 | #include <memory> |
| 57 | #include <optional> | |
| 57 | 58 | #include <system_error> |
| 58 | 59 | using namespace clang; |
| 59 | 60 | using namespace clang::driver; |
| ... | ... | @@ -134,6 +135,7 @@ struct AssemblerInvocation { |
| 134 | 135 | unsigned NoExecStack : 1; |
| 135 | 136 | unsigned FatalWarnings : 1; |
| 136 | 137 | unsigned NoWarn : 1; |
| 138 | unsigned NoTypeCheck : 1; | |
| 137 | 139 | unsigned IncrementalLinkerCompatible : 1; |
| 138 | 140 | unsigned EmbedBitcode : 1; |
| 139 | 141 | |
| ... | ... | @@ -149,7 +151,14 @@ struct AssemblerInvocation { |
| 149 | 151 | |
| 150 | 152 | /// Darwin target variant triple, the variant of the deployment target |
| 151 | 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 | /// @} |
| 154 | 163 | |
| 155 | 164 | public: |
| ... | ... | @@ -166,6 +175,7 @@ public: |
| 166 | 175 | NoExecStack = 0; |
| 167 | 176 | FatalWarnings = 0; |
| 168 | 177 | NoWarn = 0; |
| 178 | NoTypeCheck = 0; | |
| 169 | 179 | IncrementalLinkerCompatible = 0; |
| 170 | 180 | Dwarf64 = 0; |
| 171 | 181 | DwarfVersion = 0; |
| ... | ... | @@ -218,6 +228,14 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, |
| 218 | 228 | Opts.Triple = llvm::Triple::normalize(Args.getLastArgValue(OPT_triple)); |
| 219 | 229 | if (Arg *A = Args.getLastArg(options::OPT_darwin_target_variant_triple)) |
| 220 | 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 | } | |
| 221 | 239 | |
| 222 | 240 | Opts.CPU = std::string(Args.getLastArgValue(OPT_target_cpu)); |
| 223 | 241 | Opts.Features = Args.getAllArgValues(OPT_target_feature); |
| ... | ... | @@ -237,11 +255,12 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, |
| 237 | 255 | Opts.CompressDebugSections = |
| 238 | 256 | llvm::StringSwitch<llvm::DebugCompressionType>(A->getValue()) |
| 239 | 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 | 260 | .Default(llvm::DebugCompressionType::None); |
| 242 | 261 | } |
| 243 | 262 | |
| 244 | Opts.RelaxELFRelocations = Args.hasArg(OPT_mrelax_relocations); | |
| 263 | Opts.RelaxELFRelocations = !Args.hasArg(OPT_mrelax_relocations_no); | |
| 245 | 264 | if (auto *DwarfFormatArg = Args.getLastArg(OPT_gdwarf64, OPT_gdwarf32)) |
| 246 | 265 | Opts.Dwarf64 = DwarfFormatArg->getOption().matches(OPT_gdwarf64); |
| 247 | 266 | Opts.DwarfVersion = getLastArgIntValue(Args, OPT_dwarf_version_EQ, 2, Diags); |
| ... | ... | @@ -304,6 +323,7 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, |
| 304 | 323 | Opts.NoExecStack = Args.hasArg(OPT_mno_exec_stack); |
| 305 | 324 | Opts.FatalWarnings = Args.hasArg(OPT_massembler_fatal_warnings); |
| 306 | 325 | Opts.NoWarn = Args.hasArg(OPT_massembler_no_warn); |
| 326 | Opts.NoTypeCheck = Args.hasArg(OPT_mno_type_check); | |
| 307 | 327 | Opts.RelocationModel = |
| 308 | 328 | std::string(Args.getLastArgValue(OPT_mrelocation_model, "pic")); |
| 309 | 329 | Opts.TargetABI = std::string(Args.getLastArgValue(OPT_target_abi)); |
| ... | ... | @@ -329,6 +349,8 @@ bool AssemblerInvocation::CreateFromArgs(AssemblerInvocation &Opts, |
| 329 | 349 | .Case("default", EmitDwarfUnwindType::Default); |
| 330 | 350 | } |
| 331 | 351 | |
| 352 | Opts.AsSecureLogFile = Args.getLastArgValue(OPT_as_secure_log_file); | |
| 353 | ||
| 332 | 354 | return Success; |
| 333 | 355 | } |
| 334 | 356 | |
| ... | ... | @@ -380,6 +402,7 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts, |
| 380 | 402 | |
| 381 | 403 | MCTargetOptions MCOptions; |
| 382 | 404 | MCOptions.EmitDwarfUnwind = Opts.EmitDwarfUnwind; |
| 405 | MCOptions.AsSecureLogFile = Opts.AsSecureLogFile; | |
| 383 | 406 | |
| 384 | 407 | std::unique_ptr<MCAsmInfo> MAI( |
| 385 | 408 | TheTarget->createMCAsmInfo(*MRI, Opts.Triple, MCOptions)); |
| ... | ... | @@ -429,6 +452,8 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts, |
| 429 | 452 | TheTarget->createMCObjectFileInfo(Ctx, PIC)); |
| 430 | 453 | if (Opts.DarwinTargetVariantTriple) |
| 431 | 454 | MOFI->setDarwinTargetVariantTriple(*Opts.DarwinTargetVariantTriple); |
| 455 | if (!Opts.DarwinTargetVariantSDKVersion.empty()) | |
| 456 | MOFI->setDarwinTargetVariantSDKVersion(Opts.DarwinTargetVariantSDKVersion); | |
| 432 | 457 | Ctx.setObjectFileInfo(MOFI.get()); |
| 433 | 458 | |
| 434 | 459 | if (Opts.SaveTemporaryLabels) |
| ... | ... | @@ -468,6 +493,7 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts, |
| 468 | 493 | |
| 469 | 494 | MCOptions.MCNoWarn = Opts.NoWarn; |
| 470 | 495 | MCOptions.MCFatalWarnings = Opts.FatalWarnings; |
| 496 | MCOptions.MCNoTypeCheck = Opts.NoTypeCheck; | |
| 471 | 497 | MCOptions.ABIName = Opts.TargetABI; |
| 472 | 498 | |
| 473 | 499 | // FIXME: There is a bit of code duplication with addPassesToEmitFile. |
src/zig_clang_driver.cpp+87-38| ... | ... | @@ -13,6 +13,7 @@ |
| 13 | 13 | |
| 14 | 14 | #include "clang/Driver/Driver.h" |
| 15 | 15 | #include "clang/Basic/DiagnosticOptions.h" |
| 16 | #include "clang/Basic/HeaderInclude.h" | |
| 16 | 17 | #include "clang/Basic/Stack.h" |
| 17 | 18 | #include "clang/Config/config.h" |
| 18 | 19 | #include "clang/Driver/Compilation.h" |
| ... | ... | @@ -48,6 +49,7 @@ |
| 48 | 49 | #include "llvm/Support/Timer.h" |
| 49 | 50 | #include "llvm/Support/raw_ostream.h" |
| 50 | 51 | #include <memory> |
| 52 | #include <optional> | |
| 51 | 53 | #include <set> |
| 52 | 54 | #include <system_error> |
| 53 | 55 | using namespace clang; |
| ... | ... | @@ -241,29 +243,68 @@ static void getCLEnvVarOptions(std::string &EnvValue, llvm::StringSaver &Saver, |
| 241 | 243 | *NumberSignPtr = '='; |
| 242 | 244 | } |
| 243 | 245 | |
| 244 | static 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 | }; | |
| 246 | template <class T> | |
| 247 | static 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 | } | |
| 254 | 258 | |
| 259 | static bool SetBackdoorDriverOutputsFromEnvVars(Driver &TheDriver) { | |
| 255 | 260 | 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 | ||
| 261 | 300 | 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); | |
| 264 | 303 | 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; | |
| 267 | 308 | } |
| 268 | 309 | |
| 269 | 310 | static void FixupDiagPrefixExeName(TextDiagnosticPrinter *DiagClient, |
| ... | ... | @@ -306,16 +347,17 @@ static int ExecuteCC1Tool(SmallVectorImpl<const char *> &ArgV) { |
| 306 | 347 | llvm::cl::ResetAllOptionOccurrences(); |
| 307 | 348 | |
| 308 | 349 | 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 | } | |
| 312 | 355 | StringRef Tool = ArgV[1]; |
| 313 | 356 | void *GetExecutablePathVP = (void *)(intptr_t)GetExecutablePath; |
| 314 | 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 | 359 | 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); | |
| 319 | 361 | // Reject unknown tools. |
| 320 | 362 | llvm::errs() << "error: unknown integrated tool '" << Tool << "'. " |
| 321 | 363 | << "Valid tools include '-cc1' and '-cc1as'.\n"; |
| ... | ... | @@ -355,7 +397,7 @@ int ZigClang_main(int Argc, const char **Argv) { |
| 355 | 397 | // Finally, our -cc1 tools don't care which tokenization mode we use because |
| 356 | 398 | // response files written by clang will tokenize the same way in either mode. |
| 357 | 399 | bool ClangCLMode = |
| 358 | IsClangCL(getDriverMode(Args[0], llvm::makeArrayRef(Args).slice(1))); | |
| 400 | IsClangCL(getDriverMode(Args[0], llvm::ArrayRef(Args).slice(1))); | |
| 359 | 401 | enum { Default, POSIX, Windows } RSPQuoting = Default; |
| 360 | 402 | for (const char *F : Args) { |
| 361 | 403 | if (strcmp(F, "--rsp-quoting=posix") == 0) |
| ... | ... | @@ -377,7 +419,12 @@ int ZigClang_main(int Argc, const char **Argv) { |
| 377 | 419 | |
| 378 | 420 | if (MarkEOLs && Args.size() > 1 && StringRef(Args[1]).startswith("-cc1")) |
| 379 | 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 | } | |
| 381 | 428 | |
| 382 | 429 | // Handle -cc1 integrated tools, even if -cc1 was expanded from a response |
| 383 | 430 | // file. |
| ... | ... | @@ -409,19 +456,19 @@ int ZigClang_main(int Argc, const char **Argv) { |
| 409 | 456 | // prepended or appended. |
| 410 | 457 | if (ClangCLMode) { |
| 411 | 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 | 460 | if (OptCL) { |
| 414 | 461 | SmallVector<const char *, 8> PrependedOpts; |
| 415 | getCLEnvVarOptions(OptCL.value(), Saver, PrependedOpts); | |
| 462 | getCLEnvVarOptions(*OptCL, Saver, PrependedOpts); | |
| 416 | 463 | |
| 417 | 464 | // Insert right after the program name to prepend to the argument list. |
| 418 | 465 | Args.insert(Args.begin() + 1, PrependedOpts.begin(), PrependedOpts.end()); |
| 419 | 466 | } |
| 420 | 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 | 469 | if (Opt_CL_) { |
| 423 | 470 | SmallVector<const char *, 8> AppendedOpts; |
| 424 | getCLEnvVarOptions(Opt_CL_.value(), Saver, AppendedOpts); | |
| 471 | getCLEnvVarOptions(*Opt_CL_, Saver, AppendedOpts); | |
| 425 | 472 | |
| 426 | 473 | // Insert at the end of the argument list to append. |
| 427 | 474 | Args.append(AppendedOpts.begin(), AppendedOpts.end()); |
| ... | ... | @@ -479,7 +526,8 @@ int ZigClang_main(int Argc, const char **Argv) { |
| 479 | 526 | |
| 480 | 527 | insertTargetAndModeArgs(TargetAndMode, Args, SavedStrings); |
| 481 | 528 | |
| 482 | SetBackdoorDriverOutputsFromEnvVars(TheDriver); | |
| 529 | if (!SetBackdoorDriverOutputsFromEnvVars(TheDriver)) | |
| 530 | return 1; | |
| 483 | 531 | |
| 484 | 532 | if (!UseNewCC1Process) { |
| 485 | 533 | TheDriver.CC1Main = &ExecuteCC1Tool; |
| ... | ... | @@ -491,12 +539,13 @@ int ZigClang_main(int Argc, const char **Argv) { |
| 491 | 539 | |
| 492 | 540 | Driver::ReproLevel ReproLevel = Driver::ReproLevel::OnCrash; |
| 493 | 541 | 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); | |
| 500 | 549 | if (!Level) { |
| 501 | 550 | llvm::errs() << "Unknown value for " << A->getSpelling() << ": '" |
| 502 | 551 | << A->getValue() << "'\n"; |
src/zig_llvm-ar.cpp+30-23| ... | ... | @@ -68,9 +68,9 @@ static StringRef ToolName; |
| 68 | 68 | static StringRef Stem; |
| 69 | 69 | |
| 70 | 70 | static 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" | |
| 74 | 74 | << "OPTIONS:\n" |
| 75 | 75 | << " -h --help - Display available options\n" |
| 76 | 76 | << " -v --version - Display the version of this program\n" |
| ... | ... | @@ -875,8 +875,16 @@ static InsertAction computeInsertAction(ArchiveOperation Operation, |
| 875 | 875 | |
| 876 | 876 | if (Operation == QuickAppend || Members.empty()) |
| 877 | 877 | 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 | }); | |
| 880 | 888 | |
| 881 | 889 | if (MI == Members.end()) |
| 882 | 890 | return IA_AddOldMember; |
| ... | ... | @@ -1125,8 +1133,7 @@ static void performOperation(ArchiveOperation Operation, |
| 1125 | 1133 | llvm_unreachable("Unknown operation."); |
| 1126 | 1134 | } |
| 1127 | 1135 | |
| 1128 | static int performOperation(ArchiveOperation Operation, | |
| 1129 | std::vector<NewArchiveMember> *NewMembers) { | |
| 1136 | static int performOperation(ArchiveOperation Operation) { | |
| 1130 | 1137 | // Create or open the archive object. |
| 1131 | 1138 | ErrorOr<std::unique_ptr<MemoryBuffer>> Buf = MemoryBuffer::getFile( |
| 1132 | 1139 | ArchiveName, /*IsText=*/false, /*RequiresNullTerminator=*/false); |
| ... | ... | @@ -1145,7 +1152,7 @@ static int performOperation(ArchiveOperation Operation, |
| 1145 | 1152 | if (Archive->isThin()) |
| 1146 | 1153 | CompareFullPath = true; |
| 1147 | 1154 | performOperation(Operation, Archive.get(), std::move(Buf.get()), |
| 1148 | NewMembers); | |
| 1155 | /*NewMembers=*/nullptr); | |
| 1149 | 1156 | return 0; |
| 1150 | 1157 | } |
| 1151 | 1158 | |
| ... | ... | @@ -1160,7 +1167,7 @@ static int performOperation(ArchiveOperation Operation, |
| 1160 | 1167 | } |
| 1161 | 1168 | } |
| 1162 | 1169 | |
| 1163 | performOperation(Operation, nullptr, nullptr, NewMembers); | |
| 1170 | performOperation(Operation, nullptr, nullptr, /*NewMembers=*/nullptr); | |
| 1164 | 1171 | return 0; |
| 1165 | 1172 | } |
| 1166 | 1173 | |
| ... | ... | @@ -1219,7 +1226,7 @@ static void runMRIScript() { |
| 1219 | 1226 | break; |
| 1220 | 1227 | case MRICommand::CreateThin: |
| 1221 | 1228 | Thin = true; |
| 1222 | LLVM_FALLTHROUGH; | |
| 1229 | [[fallthrough]]; | |
| 1223 | 1230 | case MRICommand::Create: |
| 1224 | 1231 | Create = true; |
| 1225 | 1232 | if (!ArchiveName.empty()) |
| ... | ... | @@ -1323,7 +1330,7 @@ static int ar_main(int argc, char **argv) { |
| 1323 | 1330 | SmallVector<const char *, 0> Argv(argv + 1, argv + argc); |
| 1324 | 1331 | StringSaver Saver(Alloc); |
| 1325 | 1332 | |
| 1326 | cl::ExpandResponseFiles(Saver, getRspQuoting(makeArrayRef(argv, argc)), Argv); | |
| 1333 | cl::ExpandResponseFiles(Saver, getRspQuoting(ArrayRef(argv, argc)), Argv); | |
| 1327 | 1334 | |
| 1328 | 1335 | // Get BitMode from enviorment variable "OBJECT_MODE" for AIX OS, if |
| 1329 | 1336 | // specified. |
| ... | ... | @@ -1403,12 +1410,11 @@ static int ar_main(int argc, char **argv) { |
| 1403 | 1410 | Options += *ArgIt + 1; |
| 1404 | 1411 | } |
| 1405 | 1412 | |
| 1406 | ArchiveOperation Operation = parseCommandLine(); | |
| 1407 | return performOperation(Operation, nullptr); | |
| 1413 | return performOperation(parseCommandLine()); | |
| 1408 | 1414 | } |
| 1409 | 1415 | |
| 1410 | 1416 | static int ranlib_main(int argc, char **argv) { |
| 1411 | bool ArchiveSpecified = false; | |
| 1417 | std::vector<StringRef> Archives; | |
| 1412 | 1418 | for (int i = 1; i < argc; ++i) { |
| 1413 | 1419 | StringRef arg(argv[i]); |
| 1414 | 1420 | if (handleGenericOption(arg)) { |
| ... | ... | @@ -1433,16 +1439,17 @@ static int ranlib_main(int argc, char **argv) { |
| 1433 | 1439 | arg = arg.drop_front(1); |
| 1434 | 1440 | } |
| 1435 | 1441 | } else { |
| 1436 | if (ArchiveSpecified) | |
| 1437 | fail("exactly one archive should be specified"); | |
| 1438 | ArchiveSpecified = true; | |
| 1439 | ArchiveName = arg.str(); | |
| 1442 | Archives.push_back(arg); | |
| 1440 | 1443 | } |
| 1441 | 1444 | } |
| 1442 | if (!ArchiveSpecified) { | |
| 1443 | badUsage("an archive name must be specified"); | |
| 1445 | ||
| 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 | } |
| 1447 | 1454 | |
| 1448 | 1455 | extern "C" int ZigLlvmAr_main(int argc, char **argv); |
| ... | ... | @@ -1474,11 +1481,11 @@ int ZigLlvmAr_main(int argc, char **argv) { |
| 1474 | 1481 | }; |
| 1475 | 1482 | |
| 1476 | 1483 | if (Is("dlltool")) |
| 1477 | return dlltoolDriverMain(makeArrayRef(argv, argc)); | |
| 1484 | return dlltoolDriverMain(ArrayRef(argv, argc)); | |
| 1478 | 1485 | if (Is("ranlib")) |
| 1479 | 1486 | return ranlib_main(argc, argv); |
| 1480 | 1487 | if (Is("lib")) |
| 1481 | return libDriverMain(makeArrayRef(argv, argc)); | |
| 1488 | return libDriverMain(ArrayRef(argv, argc)); | |
| 1482 | 1489 | if (Is("ar")) |
| 1483 | 1490 | return ar_main(argc, argv); |
| 1484 | 1491 |