diff --git a/lib/DriverTool/sil_llvm_gen_main.cpp b/lib/DriverTool/sil_llvm_gen_main.cpp index 07ef938778931..6fcc5da6af4d8 100644 --- a/lib/DriverTool/sil_llvm_gen_main.cpp +++ b/lib/DriverTool/sil_llvm_gen_main.cpp @@ -219,6 +219,37 @@ static std::optional toOptionalBool(llvm::cl::boolOrDefault defaultable) { llvm_unreachable("Bad case for llvm::cl::boolOrDefault!"); } +namespace { +class LLVMOptionFilter { + /// Options with -Xllvm removed. We let through -Xllvm options so that LLVM's + /// processing can find it. + SmallVector filteredOptions; + + /// Options with the -Xllvm prefix. We have that here so we can process them + /// separately. + SmallVector llvmOptions; + +public: + LLVMOptionFilter(ArrayRef argv) { + for (unsigned i = 0; i < argv.size(); ++i) { + // Not a -Xllvm option... just let it through. + if (StringRef(argv[i]) != "-Xllvm") { + filteredOptions.push_back(argv[i]); + continue; + } + + assert(i + 1 < argv.size() && "-Xllvm without a corresponding option"); + ++i; + filteredOptions.push_back(argv[i]); + llvmOptions.push_back(argv[i]); + } + } + + ArrayRef getFilteredOptions() const { return filteredOptions; } + ArrayRef getLLVMOptions() const { return llvmOptions; } +}; +} // namespace + int sil_llvm_gen_main(ArrayRef argv, void *MainAddr) { INITIALIZE_LLVM(); @@ -226,15 +257,20 @@ int sil_llvm_gen_main(ArrayRef argv, void *MainAddr) { llvm::EnablePrettyStackTraceOnSigInfoForThisThread(); SILLLVMGenOptions options; - - llvm::cl::ParseCommandLineOptions(argv.size(), argv.data(), "Swift LLVM IR Generator\n"); - - if (options.PrintStats) - llvm::EnableStatistics(); + LLVMOptionFilter filteredOptions(argv); CompilerInvocation Invocation; Invocation.setMainExecutablePath(llvm::sys::fs::getMainExecutable(argv[0], MainAddr)); + copy(filteredOptions.getLLVMOptions(), + std::back_inserter(Invocation.getFrontendOptions().LLVMArgs)); + + llvm::cl::ParseCommandLineOptions(filteredOptions.getFilteredOptions().size(), + filteredOptions.getFilteredOptions().data(), + "Swift LLVM IR Generator\n"); + + if (options.PrintStats) + llvm::EnableStatistics(); // Give the context the list of search paths to use for modules. std::vector ImportPaths;