diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index 0991582005b85d..918411b818be70 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -1625,7 +1625,7 @@ static void runThinLTOBackend( if (Error E = thinBackend(Conf, -1, AddStream, *M, *CombinedIndex, ImportList, ModuleToDefinedGVSummaries[M->getModuleIdentifier()], - ModuleMap, &CGOpts.CmdArgs)) { + ModuleMap, CGOpts.CmdArgs)) { handleAllErrors(std::move(E), [&](ErrorInfoBase &EIB) { errs() << "Error running ThinLTO backend: " << EIB.message() << '\n'; }); @@ -1709,5 +1709,5 @@ void clang::EmbedBitcode(llvm::Module *M, const CodeGenOptions &CGOpts, llvm::EmbedBitcodeInModule( *M, Buf, CGOpts.getEmbedBitcode() != CodeGenOptions::Embed_Marker, CGOpts.getEmbedBitcode() != CodeGenOptions::Embed_Bitcode, - &CGOpts.CmdArgs); + CGOpts.CmdArgs); } diff --git a/llvm/include/llvm/Bitcode/BitcodeWriter.h b/llvm/include/llvm/Bitcode/BitcodeWriter.h index 74e9d103b7f3b2..36c3cb5eb24930 100644 --- a/llvm/include/llvm/Bitcode/BitcodeWriter.h +++ b/llvm/include/llvm/Bitcode/BitcodeWriter.h @@ -152,14 +152,18 @@ class raw_ostream; const std::map *ModuleToSummariesForIndex = nullptr); - /// Save a copy of the llvm IR as data in the __LLVM,__bitcode section. + /// If EmbedBitcode is set, save a copy of the llvm IR as data in the + /// __LLVM,__bitcode section (.llvmbc on non-MacOS). /// If available, pass the serialized module via the Buf parameter. If not, /// pass an empty (default-initialized) MemoryBufferRef, and the serialization /// will be handled by this API. The same behavior happens if the provided Buf /// is not bitcode (i.e. if it's invalid data or even textual LLVM assembly). + /// If EmbedMarker is set, the command line is also exported in + /// the corresponding section (__LLVM,_cmdline / .llvmcmd) - even if CmdArgs + /// were empty. void EmbedBitcodeInModule(Module &M, MemoryBufferRef Buf, bool EmbedBitcode, bool EmbedMarker, - const std::vector *CmdArgs); + const std::vector &CmdArgs); } // end namespace llvm diff --git a/llvm/include/llvm/LTO/LTOBackend.h b/llvm/include/llvm/LTO/LTOBackend.h index 63414b5c80dcea..db3c8c092ef902 100644 --- a/llvm/include/llvm/LTO/LTOBackend.h +++ b/llvm/include/llvm/LTO/LTOBackend.h @@ -45,7 +45,7 @@ Error thinBackend(const Config &C, unsigned Task, AddStreamFn AddStream, const FunctionImporter::ImportMapTy &ImportList, const GVSummaryMapTy &DefinedGlobals, MapVector &ModuleMap, - const std::vector *CmdArgs = nullptr); + const std::vector &CmdArgs = std::vector()); Error finalizeOptimizationRemarks( std::unique_ptr DiagOutputFile); diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index d64dcd33d1bfc9..7cfa458128552f 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -4819,7 +4819,7 @@ static const char *getSectionNameForCommandline(const Triple &T) { void llvm::EmbedBitcodeInModule(llvm::Module &M, llvm::MemoryBufferRef Buf, bool EmbedBitcode, bool EmbedMarker, - const std::vector *CmdArgs) { + const std::vector &CmdArgs) { // Save llvm.compiler.used and remove it. SmallVector UsedArray; SmallPtrSet UsedGlobals; @@ -4878,8 +4878,8 @@ void llvm::EmbedBitcodeInModule(llvm::Module &M, llvm::MemoryBufferRef Buf, // Skip if only bitcode needs to be embedded. if (EmbedMarker) { // Embed command-line options. - ArrayRef CmdData(const_cast(CmdArgs->data()), - CmdArgs->size()); + ArrayRef CmdData(const_cast(CmdArgs.data()), + CmdArgs.size()); llvm::Constant *CmdConstant = llvm::ConstantDataArray::get(M.getContext(), CmdData); GV = new llvm::GlobalVariable(M, CmdConstant->getType(), true, diff --git a/llvm/lib/LTO/LTOBackend.cpp b/llvm/lib/LTO/LTOBackend.cpp index fc39c1a57c8ede..f4da6d87f71944 100644 --- a/llvm/lib/LTO/LTOBackend.cpp +++ b/llvm/lib/LTO/LTOBackend.cpp @@ -358,7 +358,7 @@ static void runOldPMPasses(const Config &Conf, Module &Mod, TargetMachine *TM, bool opt(const Config &Conf, TargetMachine *TM, unsigned Task, Module &Mod, bool IsThinLTO, ModuleSummaryIndex *ExportSummary, const ModuleSummaryIndex *ImportSummary, - const std::vector *CmdArgs = nullptr) { + const std::vector &CmdArgs) { if (EmbedBitcode == LTOBitcodeEmbedding::EmbedPostMergePreOptimized) { // FIXME: the motivation for capturing post-merge bitcode and command line // is replicating the compilation environment from bitcode, without needing @@ -368,13 +368,14 @@ bool opt(const Config &Conf, TargetMachine *TM, unsigned Task, Module &Mod, // It's not very clear how the above motivation would map in the // linker-based case, so we currently don't plumb the command line args in // that case. - if (CmdArgs == nullptr) + if (CmdArgs.empty()) LLVM_DEBUG( dbgs() << "Post-(Thin)LTO merge bitcode embedding was requested, but " "command line arguments are not available"); llvm::EmbedBitcodeInModule(Mod, llvm::MemoryBufferRef(), /*EmbedBitcode*/ true, - /*EmbedMarker*/ false, CmdArgs); + /*EmbedMarker*/ false, + /*Cmdline*/ CmdArgs); } // FIXME: Plumb the combined index into the new pass manager. if (!Conf.OptPipeline.empty()) @@ -397,7 +398,8 @@ void codegen(const Config &Conf, TargetMachine *TM, AddStreamFn AddStream, if (EmbedBitcode == LTOBitcodeEmbedding::EmbedOptimized) llvm::EmbedBitcodeInModule(Mod, llvm::MemoryBufferRef(), /*EmbedBitcode*/ true, - /*EmbedMarker*/ false, /*CmdArgs*/ nullptr); + /*EmbedMarker*/ false, + /*CmdArgs*/ std::vector()); std::unique_ptr DwoOut; SmallString<1024> DwoFile(Conf.SplitDwarfOutput); @@ -522,7 +524,8 @@ Error lto::backend(const Config &C, AddStreamFn AddStream, if (!C.CodeGenOnly) { if (!opt(C, TM.get(), 0, *Mod, /*IsThinLTO=*/false, - /*ExportSummary=*/&CombinedIndex, /*ImportSummary=*/nullptr)) + /*ExportSummary=*/&CombinedIndex, /*ImportSummary=*/nullptr, + /*CmdArgs*/ std::vector())) return Error::success(); } @@ -561,7 +564,7 @@ Error lto::thinBackend(const Config &Conf, unsigned Task, AddStreamFn AddStream, const FunctionImporter::ImportMapTy &ImportList, const GVSummaryMapTy &DefinedGlobals, MapVector &ModuleMap, - const std::vector *CmdArgs) { + const std::vector &CmdArgs) { Expected TOrErr = initAndLookupTarget(Conf, Mod); if (!TOrErr) return TOrErr.takeError();