X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Fllvm-ar%2Fllvm-ar.cpp;h=42c95814ae67698fe827a2e9d69aac97ca02b72c;hb=c48e5eaaf5df82a0f8c2f93056ba73e12ffeeebe;hp=c87606d7826891162ccdfdec3637338b4aac0402;hpb=6e9f427cb2916cebfac98fc8e0da1dab7f095556;p=oota-llvm.git diff --git a/tools/llvm-ar/llvm-ar.cpp b/tools/llvm-ar/llvm-ar.cpp index c87606d7826..42c95814ae6 100644 --- a/tools/llvm-ar/llvm-ar.cpp +++ b/tools/llvm-ar/llvm-ar.cpp @@ -81,7 +81,7 @@ static cl::opt clEnumValN(GNU, "gnu", "gnu"), clEnumValN(BSD, "bsd", "bsd"), clEnumValEnd)); -std::string Options; +static std::string Options; // Provide additional help output explaining the operations and modifiers of // llvm-ar. This object instructs the CommandLine library to print the text of @@ -130,6 +130,7 @@ static bool OnlyUpdate = false; ///< 'u' modifier static bool Verbose = false; ///< 'v' modifier static bool Symtab = true; ///< 's' modifier static bool Deterministic = true; ///< 'D' and 'U' modifiers +static bool Thin = false; ///< 'T' modifier // Relative Positional Argument (for insert/move). This variable holds // the name of the archive member to which the 'a', 'b' or 'i' modifier @@ -252,6 +253,9 @@ static ArchiveOperation parseCommandLine() { case 'U': Deterministic = false; break; + case 'T': + Thin = true; + break; default: cl::PrintHelpMessage(); } @@ -299,7 +303,9 @@ static void doPrint(StringRef Name, const object::Archive::Child &C) { if (Verbose) outs() << "Printing " << Name << "\n"; - StringRef Data = C.getBuffer(); + ErrorOr DataOrErr = C.getBuffer(); + failIfError(DataOrErr.getError()); + StringRef Data = *DataOrErr; outs().write(Data.data(), Data.size()); } @@ -355,7 +361,7 @@ static void doExtract(StringRef Name, const object::Archive::Child &C) { raw_fd_ostream file(FD, false); // Get the data and its length - StringRef Data = C.getBuffer(); + StringRef Data = *C.getBuffer(); // Write the data. file.write(Data.data(), Data.size()); @@ -430,10 +436,21 @@ static void performReadOperation(ArchiveOperation Operation, std::exit(1); } -template -void addMember(std::vector &Members, T I, StringRef Name, - int Pos = -1) { - NewArchiveIterator NI(I, Name); +static void addMember(std::vector &Members, + StringRef FileName, int Pos = -1) { + NewArchiveIterator NI(FileName); + if (Pos == -1) + Members.push_back(NI); + else + Members[Pos] = NI; +} + +static void addMember(std::vector &Members, + const object::Archive::Child &M, StringRef Name, + int Pos = -1) { + if (Thin && !M.getParent()->isThin()) + fail("Cannot convert a regular archive to a thin one"); + NewArchiveIterator NI(M, Name); if (Pos == -1) Members.push_back(NI); else @@ -527,7 +544,7 @@ computeNewArchiveMembers(ArchiveOperation Operation, addMember(Ret, Child, Name); break; case IA_AddNewMeber: - addMember(Ret, *MemberI, Name); + addMember(Ret, *MemberI); break; case IA_Delete: break; @@ -535,7 +552,7 @@ computeNewArchiveMembers(ArchiveOperation Operation, addMember(Moved, Child, Name); break; case IA_MoveNewMember: - addMember(Moved, *MemberI, Name); + addMember(Moved, *MemberI); break; } if (MemberI != Members.end()) @@ -555,12 +572,10 @@ computeNewArchiveMembers(ArchiveOperation Operation, assert(unsigned(InsertPos) <= Ret.size()); Ret.insert(Ret.begin() + InsertPos, Moved.begin(), Moved.end()); - Ret.insert(Ret.begin() + InsertPos, Members.size(), - NewArchiveIterator("", "")); + Ret.insert(Ret.begin() + InsertPos, Members.size(), NewArchiveIterator("")); int Pos = InsertPos; for (auto &Member : Members) { - StringRef Name = sys::path::filename(Member); - addMember(Ret, Member, Name, Pos); + addMember(Ret, Member, Pos); ++Pos; } @@ -588,15 +603,15 @@ performWriteOperation(ArchiveOperation Operation, object::Archive *OldArchive, break; } if (NewMembersP) { - std::pair Result = - writeArchive(ArchiveName, *NewMembersP, Symtab, Kind, Deterministic); + std::pair Result = writeArchive( + ArchiveName, *NewMembersP, Symtab, Kind, Deterministic, Thin); failIfError(Result.second, Result.first); return; } std::vector NewMembers = computeNewArchiveMembers(Operation, OldArchive); auto Result = - writeArchive(ArchiveName, NewMembers, Symtab, Kind, Deterministic); + writeArchive(ArchiveName, NewMembers, Symtab, Kind, Deterministic, Thin); failIfError(Result.second, Result.first); } @@ -719,7 +734,7 @@ static void runMRIScript() { break; } case MRICommand::AddMod: - addMember(NewMembers, Rest, sys::path::filename(Rest)); + addMember(NewMembers, Rest); break; case MRICommand::Create: Create = true; @@ -782,9 +797,9 @@ int main(int argc, char **argv) { " This program archives bitcode files into single libraries\n" ); - if (Stem.find("ar") != StringRef::npos) - return ar_main(); if (Stem.find("ranlib") != StringRef::npos) return ranlib_main(); + if (Stem.find("ar") != StringRef::npos) + return ar_main(); fail("Not ranlib, ar or lib!"); }