[PATCH] D21722: COFF: Switch to new archive writer interface (D21721).
Peter Collingbourne via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 24 20:15:06 PDT 2016
pcc created this revision.
pcc added reviewers: ruiu, rafael.
pcc added a subscriber: llvm-commits.
http://reviews.llvm.org/D21722
Files:
COFF/DriverUtils.cpp
Index: COFF/DriverUtils.cpp
===================================================================
--- COFF/DriverUtils.cpp
+++ COFF/DriverUtils.cpp
@@ -621,44 +621,33 @@
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);
+ std::error_code EC;
+ V.emplace_back(C, /*Deterministic=*/true, EC);
+ error(EC, "NewArchiveMember::NewArchiveMember failed");
}
return V;
}
// This class creates short import files which is described in
// 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 +664,11 @@
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;
};
@@ -709,10 +694,10 @@
std::error_code EC;
object::Archive Archive(Buf->getMemBufferRef(), EC);
error(EC, "Error reading an empty import file");
- std::vector<NewArchiveIterator> Members = readMembers(Archive);
+ 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;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D21722.61882.patch
Type: text/x-patch
Size: 3288 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160625/986f31f7/attachment.bin>
More information about the llvm-commits
mailing list