From 122c57c0b82d125f33d2f036a67e96339e95c402 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 20 Jun 2013 13:41:51 +0000 Subject: [PATCH] Add r184420 back, but also handle long file names. Original message: Don't include directory names in archives. This matches the behavior of both gnu and os x versions of ar. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184423 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/Archive/directory.ll | 8 ++++++++ tools/llvm-ar/Archive.cpp | 9 +-------- tools/llvm-ar/Archive.h | 9 ++------- tools/llvm-ar/ArchiveWriter.cpp | 21 ++++++--------------- tools/llvm-ar/llvm-ar.cpp | 8 -------- 5 files changed, 17 insertions(+), 38 deletions(-) diff --git a/test/Archive/directory.ll b/test/Archive/directory.ll index f17ac5d36bd..f88d604a23b 100644 --- a/test/Archive/directory.ll +++ b/test/Archive/directory.ll @@ -1,2 +1,10 @@ ;RUN: not llvm-ar r %T/test.a . 2>&1 | FileCheck %s ;CHECK: . Is a directory + +;RUN: rm -f %T/test.a +;RUN: touch %T/a-very-long-file-name +;RUN: llvm-ar r %T/test.a %s %T/a-very-long-file-name +;RUN: llvm-ar t %T/test.a | FileCheck -check-prefix=MEMBERS %s +;MEMBERS-NOT: / +;MEMBERS: a-very-long-file-name +;MEMBERS: directory.ll diff --git a/tools/llvm-ar/Archive.cpp b/tools/llvm-ar/Archive.cpp index cac65cf7706..520e410e1ac 100644 --- a/tools/llvm-ar/Archive.cpp +++ b/tools/llvm-ar/Archive.cpp @@ -97,15 +97,8 @@ bool ArchiveMember::replaceWith(StringRef newFile, std::string* ErrMsg) { else flags &= ~StringTableFlag; - // If it has a slash then it has a path - bool hasSlash = path.find('/') != std::string::npos; - if (hasSlash) - flags |= HasPathFlag; - else - flags &= ~HasPathFlag; - // If it has a slash or its over 15 chars then its a long filename format - if (hasSlash || path.length() > 15) + if (path.length() > 15) flags |= HasLongFilenameFlag; else flags &= ~HasLongFilenameFlag; diff --git a/tools/llvm-ar/Archive.h b/tools/llvm-ar/Archive.h index 79d95873fde..37489992cfa 100644 --- a/tools/llvm-ar/Archive.h +++ b/tools/llvm-ar/Archive.h @@ -52,9 +52,8 @@ class ArchiveMember : public ilist_node { SVR4SymbolTableFlag = 1, ///< Member is a SVR4 symbol table BSD4SymbolTableFlag = 2, ///< Member is a BSD4 symbol table BitcodeFlag = 4, ///< Member is bitcode - HasPathFlag = 8, ///< Member has a full or partial path - HasLongFilenameFlag = 16, ///< Member uses the long filename syntax - StringTableFlag = 32 ///< Member is an ar(1) format string table + HasLongFilenameFlag = 8, ///< Member uses the long filename syntax + StringTableFlag = 16 ///< Member is an ar(1) format string table }; /// @} @@ -125,10 +124,6 @@ class ArchiveMember : public ilist_node { /// @brief Determine if this member is a bitcode file. bool isBitcode() const { return flags&BitcodeFlag; } - /// @returns true iff the file name contains a path (directory) component. - /// @brief Determine if the member has a path - bool hasPath() const { return flags&HasPathFlag; } - /// Long filenames are an artifact of the ar(1) file format which allows /// up to sixteen characters in its header and doesn't allow a path /// separator character (/). To avoid this, a "long format" member name is diff --git a/tools/llvm-ar/ArchiveWriter.cpp b/tools/llvm-ar/ArchiveWriter.cpp index 5563b564b39..135ed5665f5 100644 --- a/tools/llvm-ar/ArchiveWriter.cpp +++ b/tools/llvm-ar/ArchiveWriter.cpp @@ -98,13 +98,7 @@ Archive::fillHeader(const ArchiveMember &mbr, ArchiveMemberHeader& hdr, sprintf(buffer,"%-12u", unsigned(secondsSinceEpoch)); memcpy(hdr.date,buffer,12); - // Get rid of trailing blanks in the name - std::string mbrPath = mbr.getPath().str(); - size_t mbrLen = mbrPath.length(); - while (mbrLen > 0 && mbrPath[mbrLen-1] == ' ') { - mbrPath.erase(mbrLen-1,1); - mbrLen--; - } + std::string mbrPath = sys::path::filename(mbr.getPath()); // Set the name field in one of its various flavors. bool writeLongName = false; @@ -165,8 +159,8 @@ bool Archive::addFileBefore(StringRef filePath, iterator where, ArchiveMember* mbr = new ArchiveMember(this); mbr->data = 0; - mbr->path = filePath.str(); - sys::PathWithStatus PWS(mbr->path); + mbr->path = filePath; + sys::PathWithStatus PWS(filePath); const sys::FileStatus *FSInfo = PWS.getFileStatus(false, ErrMsg); if (!FSInfo) { delete mbr; @@ -179,10 +173,7 @@ bool Archive::addFileBefore(StringRef filePath, iterator where, mbr->Size = FSInfo->getSize(); unsigned flags = 0; - bool hasSlash = filePath.str().find('/') != std::string::npos; - if (hasSlash) - flags |= ArchiveMember::HasPathFlag; - if (hasSlash || filePath.str().length() > 15) + if (sys::path::filename(filePath).size() > 15) flags |= ArchiveMember::HasLongFilenameFlag; sys::fs::file_magic type; @@ -240,8 +231,8 @@ Archive::writeMember( // Write the long filename if its long if (writeLongName) { - ARFile.write(member.getPath().str().data(), - member.getPath().str().length()); + StringRef Name = sys::path::filename(member.getPath()); + ARFile.write(Name.data(), Name.size()); } // Write the (possibly compressed) member's content to the file. diff --git a/tools/llvm-ar/llvm-ar.cpp b/tools/llvm-ar/llvm-ar.cpp index 36bec4206d3..941b6310804 100644 --- a/tools/llvm-ar/llvm-ar.cpp +++ b/tools/llvm-ar/llvm-ar.cpp @@ -399,14 +399,6 @@ doExtract(std::string* ErrMsg) { if (Paths.empty() || (std::find(Paths.begin(), Paths.end(), I->getPath()) != Paths.end())) { - // Make sure the intervening directories are created - if (I->hasPath()) { - sys::Path dirs(I->getPath()); - dirs.eraseComponent(); - if (dirs.createDirectoryOnDisk(/*create_parents=*/true, ErrMsg)) - return true; - } - // Open up a file stream for writing std::ios::openmode io_mode = std::ios::out | std::ios::trunc | std::ios::binary; -- 2.34.1