diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2016-06-29 22:27:45 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2016-06-29 22:27:45 +0000 |
commit | 99e6679883180439d118958c40448b7bd3cef8c6 (patch) | |
tree | eecbfcf1d547c5599128ec74e32bfc704511d899 | |
parent | 9729e99db09aa9e38a8b91456350d9da8334be5e (diff) |
COFF: Switch to new archive writer interface (D21721).
Differential Revision: http://reviews.llvm.org/D21722
git-svn-id: https://llvm.org/svn/llvm-project/lld/trunk@274184 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | COFF/DriverUtils.cpp | 42 | ||||
-rw-r--r-- | COFF/Error.cpp | 8 | ||||
-rw-r--r-- | COFF/Error.h | 9 |
3 files changed, 31 insertions, 28 deletions
diff --git a/COFF/DriverUtils.cpp b/COFF/DriverUtils.cpp index 13ec6a80f..e61bd62db 100644 --- a/COFF/DriverUtils.cpp +++ b/COFF/DriverUtils.cpp @@ -621,15 +621,16 @@ static std::unique_ptr<MemoryBuffer> createEmptyImportLibrary() { return MemoryBuffer::getMemBufferCopy((*BufOrErr)->getBuffer()); } -static std::vector<NewArchiveIterator> +static std::vector<NewArchiveMember> readMembers(const object::Archive &Archive) { - std::vector<NewArchiveIterator> V; + std::vector<NewArchiveMember> V; for (const auto &ChildOrErr : Archive.children()) { error(ChildOrErr, "Archive::Child::getName failed"); const object::Archive::Child C(*ChildOrErr); - ErrorOr<StringRef> NameOrErr = C.getName(); - error(NameOrErr, "Archive::Child::getName failed"); - V.emplace_back(C, *NameOrErr); + NewArchiveMember M = + check(NewArchiveMember::getOldMember(C, /*Deterministic=*/true), + "NewArchiveMember::getOldMember failed"); + V.emplace_back(std::move(M)); } return V; } @@ -638,27 +639,16 @@ readMembers(const object::Archive &Archive) { // PE/COFF spec 7. Import Library Format. class ShortImportCreator { public: - ShortImportCreator(object::Archive *A, StringRef S) : Parent(A), DLLName(S) {} + ShortImportCreator(StringRef S) : DLLName(S) {} - NewArchiveIterator create(StringRef Sym, uint16_t Ordinal, - ImportNameType NameType, bool isData) { + NewArchiveMember create(StringRef Sym, uint16_t Ordinal, + ImportNameType NameType, bool isData) { size_t ImpSize = DLLName.size() + Sym.size() + 2; // +2 for NULs - size_t Size = sizeof(object::ArchiveMemberHeader) + - sizeof(coff_import_header) + ImpSize; + size_t Size = sizeof(coff_import_header) + ImpSize; char *Buf = Alloc.Allocate<char>(Size); memset(Buf, 0, Size); char *P = Buf; - // Write archive member header - auto *Hdr = reinterpret_cast<object::ArchiveMemberHeader *>(P); - P += sizeof(*Hdr); - sprintf(Hdr->Name, "%-12s", "dummy"); - sprintf(Hdr->LastModified, "%-12d", 0); - sprintf(Hdr->UID, "%-6d", 0); - sprintf(Hdr->GID, "%-6d", 0); - sprintf(Hdr->AccessMode, "%-8d", 0644); - sprintf(Hdr->Size, "%-10d", int(sizeof(coff_import_header) + ImpSize)); - // Write short import library. auto *Imp = reinterpret_cast<coff_import_header *>(P); P += sizeof(*Imp); @@ -675,15 +665,11 @@ public: P += Sym.size() + 1; memcpy(P, DLLName.data(), DLLName.size()); - std::error_code EC; - object::Archive::Child C(Parent, Buf, &EC); - assert(!EC && "We created an invalid buffer"); - return NewArchiveIterator(C, DLLName); + return NewArchiveMember(MemoryBufferRef(StringRef(Buf, Size), DLLName)); } private: BumpPtrAllocator Alloc; - object::Archive *Parent; StringRef DLLName; }; @@ -708,11 +694,11 @@ void writeImportLibrary() { std::unique_ptr<MemoryBuffer> Buf = createEmptyImportLibrary(); llvm::Error Err; object::Archive Archive(Buf->getMemBufferRef(), Err); - error(errorToErrorCode(std::move(Err)), "Error reading an empty import file"); - std::vector<NewArchiveIterator> Members = readMembers(Archive); + error(std::move(Err), "Error reading an empty import file"); + std::vector<NewArchiveMember> Members = readMembers(Archive); std::string DLLName = llvm::sys::path::filename(Config->OutputFile); - ShortImportCreator ShortImport(&Archive, DLLName); + ShortImportCreator ShortImport(DLLName); for (Export &E : Config->Exports) { if (E.Private) continue; diff --git a/COFF/Error.cpp b/COFF/Error.cpp index 255d9bbad..b5ec9a76d 100644 --- a/COFF/Error.cpp +++ b/COFF/Error.cpp @@ -26,5 +26,13 @@ void error(std::error_code EC, const Twine &Prefix) { error(Prefix + ": " + EC.message()); } +void error(llvm::Error E, const Twine &Prefix) { + if (!E) + return; + handleAllErrors(std::move(E), [&](const llvm::ErrorInfoBase &EIB) { + error(Prefix + ": " + EIB.message()); + }); +} + } // namespace coff } // namespace lld diff --git a/COFF/Error.h b/COFF/Error.h index cb0a185f0..0b2d37527 100644 --- a/COFF/Error.h +++ b/COFF/Error.h @@ -11,17 +11,26 @@ #define LLD_COFF_ERROR_H #include "lld/Core/LLVM.h" +#include "llvm/Support/Error.h" namespace lld { namespace coff { LLVM_ATTRIBUTE_NORETURN void error(const Twine &Msg); void error(std::error_code EC, const Twine &Prefix); +void error(llvm::Error E, const Twine &Prefix); template <typename T> void error(const ErrorOr<T> &V, const Twine &Prefix) { error(V.getError(), Prefix); } +template <class T> T check(Expected<T> E, const Twine &Prefix) { + if (!E) + return std::move(*E); + error(E.takeError(), Prefix); + return T(); +} + } // namespace coff } // namespace lld |