Handle the error of trying to convert a regular archive to a thin one.
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 15 Jul 2015 20:45:56 +0000 (20:45 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 15 Jul 2015 20:45:56 +0000 (20:45 +0000)
While at it, test that we can add to a thin archive.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242330 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Object/Archive.h
lib/Object/ArchiveWriter.cpp
test/Object/archive-update.test
tools/llvm-ar/llvm-ar.cpp

index 597f0d48c118d6c218156909d9f4b45f966288ae..e5d59d832e31b13cac567a2f0bf611a2fb1c4915 100644 (file)
@@ -74,6 +74,7 @@ public:
       return Data.begin() < other.Data.begin();
     }
 
+    const Archive *getParent() const { return Parent; }
     Child getNext() const;
 
     ErrorOr<StringRef> getName() const;
index bcd5382d91e3307a33471202ef14f28c957896db..b555b8cfdcf78612f36f147e913c7e5fff6aee19 100644 (file)
@@ -318,6 +318,9 @@ llvm::writeArchive(StringRef ArcName,
       MemberRef = Buffers.back()->getMemBufferRef();
     } else {
       object::Archive::child_iterator OldMember = Member.getOld();
+      assert(!Thin ||
+             OldMember->getParent()->isThin() &&
+                 "Thin archives cannot refers to member of other archives");
       ErrorOr<MemoryBufferRef> MemberBufferOrErr =
           OldMember->getMemoryBufferRef();
       if (auto EC = MemberBufferOrErr.getError())
index 147db90ba951b4b91c92c3f16f0a7e1fe16bc863..ef1a71f60f435ff6062878477db69ed51152d53e 100644 (file)
@@ -34,3 +34,17 @@ RUN: llvm-ar p %t.a | FileCheck --check-prefix=NEWER %s
 
 NEWER: newer
 OLDER: older
+
+RUN: rm -f %t.a
+RUN: echo foo > foo
+RUN: echo bar > bar
+RUN: llvm-ar --format=gnu rcT %t.a foo
+RUN: llvm-ar --format=gnu rcT %t.a bar
+RUN: llvm-ar t %t.a | FileCheck --check-prefix=BOTH-FILES %s
+BOTH-FILES: foo
+BOTH-FILES: bar
+
+RUN: rm -f %t.a
+RUN: llvm-ar --format=gnu rc %t.a foo
+RUN: not llvm-ar --format=gnu rcT %t.a bar 2>&1 | FileCheck --check-prefix=ERROR %s
+ERROR: Cannot convert a regular archive to a thin one.
index 0e3c4fdc2ce90b59df3b6a35b7886d668938f697..92f272dfad14990af4a5e37b5e2b6d32352445ed 100644 (file)
@@ -436,9 +436,20 @@ static void performReadOperation(ArchiveOperation Operation,
   std::exit(1);
 }
 
-template <typename T>
-void addMember(std::vector<NewArchiveIterator> &Members, T I, StringRef Name,
+void addMember(std::vector<NewArchiveIterator> &Members, StringRef FileName,
+               StringRef Name, int Pos = -1) {
+  NewArchiveIterator NI(FileName, Name);
+  if (Pos == -1)
+    Members.push_back(NI);
+  else
+    Members[Pos] = NI;
+}
+
+void addMember(std::vector<NewArchiveIterator> &Members,
+               object::Archive::child_iterator I, StringRef Name,
                int Pos = -1) {
+  if (Thin && !I->getParent()->isThin())
+    fail("Cannot convert a regular archive to a thin one");
   NewArchiveIterator NI(I, Name);
   if (Pos == -1)
     Members.push_back(NI);