llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-llvm-binary-utilities Author: None (pcc) <details> <summary>Changes</summary> --- Full diff: https://github.com/llvm/llvm-project/pull/98235.diff 3 Files Affected: - (modified) llvm/include/llvm/Object/ArchiveWriter.h (+6-2) - (modified) llvm/lib/Object/ArchiveWriter.cpp (+22-14) - (modified) llvm/test/Object/archive-malformed-object.test (+14-1) ``````````diff diff --git a/llvm/include/llvm/Object/ArchiveWriter.h b/llvm/include/llvm/Object/ArchiveWriter.h index a19f8fcc79d74..f965a12c45267 100644 --- a/llvm/include/llvm/Object/ArchiveWriter.h +++ b/llvm/include/llvm/Object/ArchiveWriter.h @@ -48,18 +48,22 @@ enum class SymtabWritingMode { BigArchive64 // Only write the 64-bit symbol table. }; +void warnToStderr(Error Err); + Error writeArchive(StringRef ArcName, ArrayRef<NewArchiveMember> NewMembers, SymtabWritingMode WriteSymtab, object::Archive::Kind Kind, bool Deterministic, bool Thin, std::unique_ptr<MemoryBuffer> OldArchiveBuf = nullptr, - std::optional<bool> IsEC = std::nullopt); + std::optional<bool> IsEC = std::nullopt, + function_ref<void(Error)> Warn = warnToStderr); // writeArchiveToBuffer is similar to writeArchive but returns the Archive in a // buffer instead of writing it out to a file. Expected<std::unique_ptr<MemoryBuffer>> writeArchiveToBuffer(ArrayRef<NewArchiveMember> NewMembers, SymtabWritingMode WriteSymtab, object::Archive::Kind Kind, - bool Deterministic, bool Thin); + bool Deterministic, bool Thin, + function_ref<void(Error)> Warn = warnToStderr); } #endif diff --git a/llvm/lib/Object/ArchiveWriter.cpp b/llvm/lib/Object/ArchiveWriter.cpp index c6d443ff9d15a..1c75268322257 100644 --- a/llvm/lib/Object/ArchiveWriter.cpp +++ b/llvm/lib/Object/ArchiveWriter.cpp @@ -483,7 +483,7 @@ static uint64_t computeHeadersSize(object::Archive::Kind Kind, static Expected<std::unique_ptr<SymbolicFile>> getSymbolicFile(MemoryBufferRef Buf, LLVMContext &Context, - object::Archive::Kind Kind) { + object::Archive::Kind Kind, function_ref<void(Error)> Warn) { const file_magic Type = identify_magic(Buf.getBuffer()); // Don't attempt to read non-symbolic file types. if (!object::SymbolicFile::isSymbolicFile(Type, &Context)) @@ -512,9 +512,7 @@ getSymbolicFile(MemoryBufferRef Buf, LLVMContext &Context, case object::Archive::K_BSD: case object::Archive::K_GNU: case object::Archive::K_GNU64: - llvm::logAllUnhandledErrors(ObjOrErr.takeError(), llvm::errs(), - "warning: " + Buf.getBufferIdentifier() + - ": "); + Warn(ObjOrErr.takeError()); return nullptr; case object::Archive::K_AIXBIG: case object::Archive::K_COFF: @@ -782,7 +780,7 @@ computeMemberData(raw_ostream &StringTable, raw_ostream &SymNames, object::Archive::Kind Kind, bool Thin, bool Deterministic, SymtabWritingMode NeedSymbols, SymMap *SymMap, LLVMContext &Context, ArrayRef<NewArchiveMember> NewMembers, - std::optional<bool> IsEC) { + std::optional<bool> IsEC, function_ref<void(Error)> Warn) { static char PaddingData[8] = {'\n', '\n', '\n', '\n', '\n', '\n', '\n', '\n'}; uint64_t MemHeadPadSize = 0; uint64_t Pos = @@ -850,8 +848,10 @@ computeMemberData(raw_ostream &StringTable, raw_ostream &SymNames, if (NeedSymbols != SymtabWritingMode::NoSymtab || isAIXBigArchive(Kind)) { for (const NewArchiveMember &M : NewMembers) { - Expected<std::unique_ptr<SymbolicFile>> SymFileOrErr = - getSymbolicFile(M.Buf->getMemBufferRef(), Context, Kind); + Expected<std::unique_ptr<SymbolicFile>> SymFileOrErr = getSymbolicFile( + M.Buf->getMemBufferRef(), Context, Kind, [&](Error Err) { + Warn(createFileError(M.MemberName, std::move(Err))); + }); if (!SymFileOrErr) return createFileError(M.MemberName, SymFileOrErr.takeError()); SymFiles.push_back(std::move(*SymFileOrErr)); @@ -1031,7 +1031,8 @@ Expected<std::string> computeArchiveRelativePath(StringRef From, StringRef To) { static Error writeArchiveToStream(raw_ostream &Out, ArrayRef<NewArchiveMember> NewMembers, SymtabWritingMode WriteSymtab, object::Archive::Kind Kind, - bool Deterministic, bool Thin, std::optional<bool> IsEC) { + bool Deterministic, bool Thin, std::optional<bool> IsEC, + function_ref<void(Error)> Warn) { assert((!Thin || !isBSDLike(Kind)) && "Only the gnu format has a thin mode"); SmallString<0> SymNamesBuf; @@ -1053,7 +1054,7 @@ writeArchiveToStream(raw_ostream &Out, ArrayRef<NewArchiveMember> NewMembers, Expected<std::vector<MemberData>> DataOrErr = computeMemberData( StringTable, SymNames, Kind, Thin, Deterministic, WriteSymtab, - isCOFFArchive(Kind) ? &SymMap : nullptr, Context, NewMembers, IsEC); + isCOFFArchive(Kind) ? &SymMap : nullptr, Context, NewMembers, IsEC, Warn); if (Error E = DataOrErr.takeError()) return E; std::vector<MemberData> &Data = *DataOrErr; @@ -1296,11 +1297,16 @@ writeArchiveToStream(raw_ostream &Out, ArrayRef<NewArchiveMember> NewMembers, return Error::success(); } +void warnToStderr(Error Err) { + llvm::logAllUnhandledErrors(std::move(Err), llvm::errs(), "warning: "); +} + Error writeArchive(StringRef ArcName, ArrayRef<NewArchiveMember> NewMembers, SymtabWritingMode WriteSymtab, object::Archive::Kind Kind, bool Deterministic, bool Thin, std::unique_ptr<MemoryBuffer> OldArchiveBuf, - std::optional<bool> IsEC) { + std::optional<bool> IsEC, + function_ref<void(Error)> Warn) { Expected<sys::fs::TempFile> Temp = sys::fs::TempFile::create(ArcName + ".temp-archive-%%%%%%%.a"); if (!Temp) @@ -1308,7 +1314,7 @@ Error writeArchive(StringRef ArcName, ArrayRef<NewArchiveMember> NewMembers, raw_fd_ostream Out(Temp->FD, false); if (Error E = writeArchiveToStream(Out, NewMembers, WriteSymtab, Kind, - Deterministic, Thin, IsEC)) { + Deterministic, Thin, IsEC, Warn)) { if (Error DiscardError = Temp->discard()) return joinErrors(std::move(E), std::move(DiscardError)); return E; @@ -1332,12 +1338,14 @@ Error writeArchive(StringRef ArcName, ArrayRef<NewArchiveMember> NewMembers, Expected<std::unique_ptr<MemoryBuffer>> writeArchiveToBuffer(ArrayRef<NewArchiveMember> NewMembers, SymtabWritingMode WriteSymtab, object::Archive::Kind Kind, - bool Deterministic, bool Thin) { + bool Deterministic, bool Thin, + function_ref<void(Error)> Warn) { SmallVector<char, 0> ArchiveBufferVector; raw_svector_ostream ArchiveStream(ArchiveBufferVector); - if (Error E = writeArchiveToStream(ArchiveStream, NewMembers, WriteSymtab, - Kind, Deterministic, Thin, std::nullopt)) + if (Error E = + writeArchiveToStream(ArchiveStream, NewMembers, WriteSymtab, Kind, + Deterministic, Thin, std::nullopt, Warn)) return std::move(E); return std::make_unique<SmallVectorMemoryBuffer>( diff --git a/llvm/test/Object/archive-malformed-object.test b/llvm/test/Object/archive-malformed-object.test index 7492dc513492e..147fcdf1e68c2 100644 --- a/llvm/test/Object/archive-malformed-object.test +++ b/llvm/test/Object/archive-malformed-object.test @@ -22,6 +22,19 @@ # RUN: llvm-ar rc bad.a good.bc input.bc 2>&1 | FileCheck %s --check-prefix=WARN1 # RUN: not llvm-nm --print-armap bad.a | FileCheck %s --check-prefix=ARMAP +## Malformed bitcode object either warn or error depending on the archive format +## (see switch in getSymbolicFile). +# RUN: rm -rf bad.a +# RUN: llvm-ar --format=bsd rc bad.a input.bc 2>&1 | FileCheck %s --check-prefix=WARN1 +# RUN: rm -rf bad.a +# RUN: llvm-ar --format=gnu rc bad.a input.bc 2>&1 | FileCheck %s --check-prefix=WARN1 +# RUN: rm -rf bad.a +# RUN: not llvm-ar --format=bigarchive rc bad.a input.bc 2>&1 | FileCheck %s --check-prefix=ERR1 +# RUN: rm -rf bad.a +# RUN: not llvm-ar --format=coff rc bad.a input.bc 2>&1 | FileCheck %s --check-prefix=ERR1 +# RUN: rm -rf bad.a +# RUN: not llvm-ar --format=darwin rc bad.a input.bc 2>&1 | FileCheck %s --check-prefix=ERR1 + ## Malformed bitcode object if the symbol table is not required for big archive. ## For big archives we print an error instead of a warning because the AIX linker ## presumably requires the index. @@ -31,7 +44,7 @@ # RUN: not llvm-ar --format=bigarchive rcS bad.a good.bc input.bc 2>&1 | FileCheck %s --check-prefix=ERR1 # ERR1: error: bad.a: 'input.bc': Invalid bitcode signature -# WARN1: warning: input.bc: Invalid bitcode signature +# WARN1: warning: 'input.bc': Invalid bitcode signature ## Non-bitcode malformed file. # RUN: yaml2obj input.yaml -o input.o `````````` </details> https://github.com/llvm/llvm-project/pull/98235 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits