[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