================ @@ -937,27 +938,105 @@ bool CodeGenAction::loadLinkModules(CompilerInstance &CI) { for (const CodeGenOptions::BitcodeFileToLink &F : CI.getCodeGenOpts().LinkBitcodeFiles) { - auto BCBuf = CI.getFileManager().getBufferForFile(F.Filename); - if (!BCBuf) { + + auto BCBufOrErr = CI.getFileManager().getBufferForFile(F.Filename); + if (!BCBufOrErr) { CI.getDiagnostics().Report(diag::err_cannot_open_file) - << F.Filename << BCBuf.getError().message(); + << F.Filename << BCBufOrErr.getError().message(); LinkModules.clear(); return true; } + auto &BCBuf = *BCBufOrErr; + Expected<std::unique_ptr<llvm::Module>> ModuleOrErr = - getOwningLazyBitcodeModule(std::move(*BCBuf), *VMContext); - if (!ModuleOrErr) { - handleAllErrors(ModuleOrErr.takeError(), [&](ErrorInfoBase &EIB) { + getOwningLazyBitcodeModule(std::move(BCBuf), *VMContext); + + if (ModuleOrErr) { + LinkModules.push_back({std::move(ModuleOrErr.get()), F.PropagateAttrs, + F.Internalize, F.LinkFlags}); + continue; + } else { + // If parsing as bitcode failed, clear the error and try to parse as an + // archive. + handleAllErrors(ModuleOrErr.takeError(), + [&](const llvm::ErrorInfoBase &EIB) {}); + + Expected<std::unique_ptr<llvm::object::Binary>> BinOrErr = + llvm::object::createBinary(BCBuf->getMemBufferRef(), VMContext); + + if (!BinOrErr) { + handleAllErrors(BinOrErr.takeError(), + [&](const llvm::ErrorInfoBase &EIB) { + CI.getDiagnostics().Report(diag::err_cannot_open_file) + << F.Filename << EIB.message(); + }); + LinkModules.clear(); + return true; + } + + std::unique_ptr<llvm::object::Binary> &Bin = *BinOrErr; + + if (Bin->isArchive()) { + llvm::object::Archive *Archive = + llvm::cast<llvm::object::Archive>(Bin.get()); + Error Err = Error::success(); + + for (auto &Child : Archive->children(Err)) { + Expected<llvm::MemoryBufferRef> ChildBufOrErr = + Child.getMemoryBufferRef(); + if (!ChildBufOrErr) { + handleAllErrors( + ChildBufOrErr.takeError(), [&](const llvm::ErrorInfoBase &EIB) { + CI.getDiagnostics().Report(diag::err_cannot_open_file) + << F.Filename << EIB.message(); + }); + continue; + } + auto ChildBuffer = llvm::MemoryBuffer::getMemBufferCopy( + ChildBufOrErr->getBuffer(), ChildBufOrErr->getBufferIdentifier()); + + if (!ChildBuffer) { + handleAllErrors( + ChildBufOrErr.takeError(), [&](const llvm::ErrorInfoBase &EIB) { + CI.getDiagnostics().Report(diag::err_cannot_open_file) + << F.Filename << EIB.message(); + }); + continue; + } + + Expected<std::unique_ptr<llvm::Module>> ChildModuleOrErr = + getOwningLazyBitcodeModule(std::move(ChildBuffer), *VMContext); + if (!ChildModuleOrErr) { + handleAllErrors( + ChildModuleOrErr.takeError(), + [&](const llvm::ErrorInfoBase &EIB) { + CI.getDiagnostics().Report(diag::err_cannot_open_file) + << F.Filename << EIB.message(); + }); + continue; + } + + LinkModules.push_back({std::move(ChildModuleOrErr.get()), ---------------- arsenm wrote:
Not sure you need the .get() https://github.com/llvm/llvm-project/pull/71978 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits