aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2016-06-29 22:27:45 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2016-06-29 22:27:45 +0000
commit99e6679883180439d118958c40448b7bd3cef8c6 (patch)
treeeecbfcf1d547c5599128ec74e32bfc704511d899
parent9729e99db09aa9e38a8b91456350d9da8334be5e (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.cpp42
-rw-r--r--COFF/Error.cpp8
-rw-r--r--COFF/Error.h9
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