From b55dcfe47fbbcfc1dccd07cb27c02b9a86533d05 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 19 Jul 2013 21:23:28 +0000 Subject: Fix inserting new elements in a specified location. We were only handling the 'a' and 'b' options during moves before. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186721 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/llvm-ar/llvm-ar.cpp | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) (limited to 'tools/llvm-ar') diff --git a/tools/llvm-ar/llvm-ar.cpp b/tools/llvm-ar/llvm-ar.cpp index bd10f6ffb1..4ade562ad8 100644 --- a/tools/llvm-ar/llvm-ar.cpp +++ b/tools/llvm-ar/llvm-ar.cpp @@ -382,6 +382,7 @@ class NewArchiveIterator { public: NewArchiveIterator(object::Archive::child_iterator I, Twine Name); NewArchiveIterator(std::vector::const_iterator I, Twine Name); + NewArchiveIterator(); bool isNewMember() const; object::Archive::child_iterator getOld() const; const char *getNew() const; @@ -389,6 +390,8 @@ public: }; } +NewArchiveIterator::NewArchiveIterator() {} + NewArchiveIterator::NewArchiveIterator(object::Archive::child_iterator I, Twine Name) : IsNewMember(false), OldI(I) { @@ -415,14 +418,20 @@ const char *NewArchiveIterator::getNew() const { template void addMember(std::vector &Members, - std::string &StringTable, T I, StringRef Name) { + std::string &StringTable, T I, StringRef Name, int Pos = -1) { if (Name.size() < 16) { NewArchiveIterator NI(I, Twine(Name) + "/"); - Members.push_back(NI); + if (Pos == -1) + Members.push_back(NI); + else + Members[Pos] = NI; } else { int MapIndex = StringTable.size(); NewArchiveIterator NI(I, Twine("/") + Twine(MapIndex)); - Members.push_back(NI); + if (Pos == -1) + Members.push_back(NI); + else + Members[Pos] = NI; StringTable += Name; StringTable += "/\n"; } @@ -462,6 +471,8 @@ computeNewArchiveMembers(ArchiveOperation Operation, else InsertPos = Pos + 1; } + if (InsertPos == Pos) + Ret.resize(Ret.size() + Members.size()); if (Operation != QuickAppend && !Members.empty()) { std::vector::iterator MI = std::find_if(Members.begin(), Members.end(), HasName(Name)); @@ -488,23 +499,30 @@ computeNewArchiveMembers(ArchiveOperation Operation, if (Operation == Delete) return Ret; + if (!RelPos.empty() && InsertPos == -1) + fail("Insertion point not found"); + if (Operation == Move) { + if (Members.size() != Moved.size()) + fail("A member to be moved is not present in the archive"); + if (RelPos.empty()) { Ret.insert(Ret.end(), Moved.begin(), Moved.end()); return Ret; } - if (InsertPos == -1) - fail("Insertion point not found"); assert(unsigned(InsertPos) <= Ret.size()); - Ret.insert(Ret.begin() + InsertPos, Moved.begin(), Moved.end()); + std::copy(Moved.begin(), Moved.end(), Ret.begin() + InsertPos); return Ret; } + int Pos = InsertPos; for (std::vector::iterator I = Members.begin(), E = Members.end(); I != E; ++I) { StringRef Name = sys::path::filename(*I); - addMember(Ret, StringTable, I, Name); + addMember(Ret, StringTable, I, Name, Pos); + if (Pos != -1) + ++Pos; } return Ret; -- cgit v1.2.3