diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2013-06-20 13:23:48 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2013-06-20 13:23:48 +0000 |
commit | 9d39cb1d6418c5a25fa74f09e593794a4c8fd4b6 (patch) | |
tree | cb9c4a3c46ec16fda8286aee56c13443f08efcad /tools/llvm-ar | |
parent | be984d6376bf42f9e05fb660b44808cffe9711a8 (diff) | |
download | external_llvm-9d39cb1d6418c5a25fa74f09e593794a4c8fd4b6.zip external_llvm-9d39cb1d6418c5a25fa74f09e593794a4c8fd4b6.tar.gz external_llvm-9d39cb1d6418c5a25fa74f09e593794a4c8fd4b6.tar.bz2 |
Revert "Don't include directory names in archives."
This reverts commit 184420.
Investigating the bot failures.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184421 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-ar')
-rw-r--r-- | tools/llvm-ar/Archive.cpp | 9 | ||||
-rw-r--r-- | tools/llvm-ar/Archive.h | 9 | ||||
-rw-r--r-- | tools/llvm-ar/ArchiveWriter.cpp | 17 | ||||
-rw-r--r-- | tools/llvm-ar/llvm-ar.cpp | 8 |
4 files changed, 36 insertions, 7 deletions
diff --git a/tools/llvm-ar/Archive.cpp b/tools/llvm-ar/Archive.cpp index 520e410..cac65cf 100644 --- a/tools/llvm-ar/Archive.cpp +++ b/tools/llvm-ar/Archive.cpp @@ -97,8 +97,15 @@ 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 (path.length() > 15) + if (hasSlash || path.length() > 15) flags |= HasLongFilenameFlag; else flags &= ~HasLongFilenameFlag; diff --git a/tools/llvm-ar/Archive.h b/tools/llvm-ar/Archive.h index 3748999..79d9587 100644 --- a/tools/llvm-ar/Archive.h +++ b/tools/llvm-ar/Archive.h @@ -52,8 +52,9 @@ class ArchiveMember : public ilist_node<ArchiveMember> { SVR4SymbolTableFlag = 1, ///< Member is a SVR4 symbol table BSD4SymbolTableFlag = 2, ///< Member is a BSD4 symbol table BitcodeFlag = 4, ///< Member is bitcode - HasLongFilenameFlag = 8, ///< Member uses the long filename syntax - StringTableFlag = 16 ///< Member is an ar(1) format string table + 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 }; /// @} @@ -124,6 +125,10 @@ class ArchiveMember : public ilist_node<ArchiveMember> { /// @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 332d55f..5563b56 100644 --- a/tools/llvm-ar/ArchiveWriter.cpp +++ b/tools/llvm-ar/ArchiveWriter.cpp @@ -98,7 +98,13 @@ Archive::fillHeader(const ArchiveMember &mbr, ArchiveMemberHeader& hdr, sprintf(buffer,"%-12u", unsigned(secondsSinceEpoch)); memcpy(hdr.date,buffer,12); - std::string mbrPath = sys::path::filename(mbr.getPath()); + // 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--; + } // Set the name field in one of its various flavors. bool writeLongName = false; @@ -159,8 +165,8 @@ bool Archive::addFileBefore(StringRef filePath, iterator where, ArchiveMember* mbr = new ArchiveMember(this); mbr->data = 0; - mbr->path = filePath; - sys::PathWithStatus PWS(filePath); + mbr->path = filePath.str(); + sys::PathWithStatus PWS(mbr->path); const sys::FileStatus *FSInfo = PWS.getFileStatus(false, ErrMsg); if (!FSInfo) { delete mbr; @@ -173,7 +179,10 @@ bool Archive::addFileBefore(StringRef filePath, iterator where, mbr->Size = FSInfo->getSize(); unsigned flags = 0; - if (sys::path::filename(filePath).size() > 15) + bool hasSlash = filePath.str().find('/') != std::string::npos; + if (hasSlash) + flags |= ArchiveMember::HasPathFlag; + if (hasSlash || filePath.str().length() > 15) flags |= ArchiveMember::HasLongFilenameFlag; sys::fs::file_magic type; diff --git a/tools/llvm-ar/llvm-ar.cpp b/tools/llvm-ar/llvm-ar.cpp index 941b631..36bec42 100644 --- a/tools/llvm-ar/llvm-ar.cpp +++ b/tools/llvm-ar/llvm-ar.cpp @@ -399,6 +399,14 @@ 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; |