| 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,9 +656,9 @@ include_directories( |
| 656 | 656 | ||
| 657 | # These have to go before the -Wno- flags | 657 | # These have to go before the -Wno- flags |
| 658 | if(MSVC) | 658 | if(MSVC) |
| 659 | set(EXE_CXX_FLAGS "/std:c++14") | 659 | set(EXE_CXX_FLAGS "/std:c++17") |
| 660 | else(MSVC) | 660 | else(MSVC) |
| 661 | set(EXE_CXX_FLAGS "-std=c++14") | 661 | set(EXE_CXX_FLAGS "-std=c++17") |
| 662 | endif(MSVC) | 662 | endif(MSVC) |
| 663 | 663 | ||
| 664 | if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug") | 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,7 +177,8 @@ static int PrintSupportedCPUs(std::string TargetStr) { |
| 177 | // the target machine will handle the mcpu printing | 177 | // 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 | } |
| 183 | 184 |
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> |
| 58 | using namespace clang; | 59 | using namespace clang; |
| 59 | using namespace clang::driver; | 60 | using 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; |
| 139 | 141 | ||
| ... | @@ -149,7 +151,14 @@ struct AssemblerInvocation { | ... | @@ -149,7 +151,14 @@ struct AssemblerInvocation { |
| 149 | 151 | ||
| 150 | /// Darwin target variant triple, the variant of the deployment target | 152 | /// 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 | /// @} |
| 154 | 163 | ||
| 155 | public: | 164 | public: |
| ... | @@ -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 | } | ||
| 221 | 239 | ||
| 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 | } |
| 243 | 262 | ||
| 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 | } |
| 331 | 351 | ||
| 352 | Opts.AsSecureLogFile = Args.getLastArgValue(OPT_as_secure_log_file); | ||
| 353 | |||
| 332 | return Success; | 354 | return Success; |
| 333 | } | 355 | } |
| 334 | 356 | ||
| ... | @@ -380,6 +402,7 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts, | ... | @@ -380,6 +402,7 @@ static bool ExecuteAssemblerImpl(AssemblerInvocation &Opts, |
| 380 | 402 | ||
| 381 | MCTargetOptions MCOptions; | 403 | MCTargetOptions MCOptions; |
| 382 | MCOptions.EmitDwarfUnwind = Opts.EmitDwarfUnwind; | 404 | MCOptions.EmitDwarfUnwind = Opts.EmitDwarfUnwind; |
| 405 | MCOptions.AsSecureLogFile = Opts.AsSecureLogFile; | ||
| 383 | 406 | ||
| 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()); |
| 433 | 458 | ||
| 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, |
| 468 | 493 | ||
| 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; |
| 472 | 498 | ||
| 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 @@ |
| 13 | 13 | ||
| 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> |
| 53 | using namespace clang; | 55 | using 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 | } |
| 243 | 245 | ||
| 244 | static void SetBackdoorDriverOutputsFromEnvVars(Driver &TheDriver) { | 246 | template <class T> |
| 245 | auto CheckEnvVar = [](const char *EnvOptSet, const char *EnvOptFile, | 247 | static 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 | } | ||
| 254 | 258 | ||
| 259 | static 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 | } |
| 268 | 309 | ||
| 269 | static void FixupDiagPrefixExeName(TextDiagnosticPrinter *DiagClient, | 310 | static 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(); |
| 307 | 348 | ||
| 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 because | 397 | // 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) { |
| 377 | 419 | ||
| 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 | } | ||
| 381 | 428 | ||
| 382 | // Handle -cc1 integrated tools, even if -cc1 was expanded from a response | 429 | // 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); |
| 416 | 463 | ||
| 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); |
| 425 | 472 | ||
| 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) { |
| 479 | 526 | ||
| 480 | insertTargetAndModeArgs(TargetAndMode, Args, SavedStrings); | 527 | insertTargetAndModeArgs(TargetAndMode, Args, SavedStrings); |
| 481 | 528 | ||
| 482 | SetBackdoorDriverOutputsFromEnvVars(TheDriver); | 529 | if (!SetBackdoorDriverOutputsFromEnvVars(TheDriver)) |
| 530 | return 1; | ||
| 483 | 531 | ||
| 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) { |
| 491 | 539 | ||
| 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; |
| 68 | static StringRef Stem; | 68 | static StringRef Stem; |
| 69 | 69 | ||
| 70 | static void printRanLibHelp(StringRef ToolName) { | 70 | static 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, |
| 875 | 875 | ||
| 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 | }); | ||
| 880 | 888 | ||
| 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 | } |
| 1127 | 1135 | ||
| 1128 | static int performOperation(ArchiveOperation Operation, | 1136 | static 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 | } |
| 1151 | 1158 | ||
| ... | @@ -1160,7 +1167,7 @@ static int performOperation(ArchiveOperation Operation, | ... | @@ -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 | return 0; | 1171 | return 0; |
| 1165 | } | 1172 | } |
| 1166 | 1173 | ||
| ... | @@ -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); |
| 1325 | 1332 | ||
| 1326 | cl::ExpandResponseFiles(Saver, getRspQuoting(makeArrayRef(argv, argc)), Argv); | 1333 | cl::ExpandResponseFiles(Saver, getRspQuoting(ArrayRef(argv, argc)), Argv); |
| 1327 | 1334 | ||
| 1328 | // Get BitMode from enviorment variable "OBJECT_MODE" for AIX OS, if | 1335 | // 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 | } |
| 1405 | 1412 | ||
| 1406 | ArchiveOperation Operation = parseCommandLine(); | 1413 | return performOperation(parseCommandLine()); |
| 1407 | return performOperation(Operation, nullptr); | ||
| 1408 | } | 1414 | } |
| 1409 | 1415 | ||
| 1410 | static int ranlib_main(int argc, char **argv) { | 1416 | static 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 | } |
| 1447 | 1454 | ||
| 1448 | extern "C" int ZigLlvmAr_main(int argc, char **argv); | 1455 | extern "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 | }; |
| 1475 | 1482 | ||
| 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); |
| 1484 | 1491 |