summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-06-20 13:23:48 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-06-20 13:23:48 +0000
commit9d39cb1d6418c5a25fa74f09e593794a4c8fd4b6 (patch)
treecb9c4a3c46ec16fda8286aee56c13443f08efcad /tools
parentbe984d6376bf42f9e05fb660b44808cffe9711a8 (diff)
downloadllvm-9d39cb1d6418c5a25fa74f09e593794a4c8fd4b6.tar.gz
llvm-9d39cb1d6418c5a25fa74f09e593794a4c8fd4b6.tar.bz2
llvm-9d39cb1d6418c5a25fa74f09e593794a4c8fd4b6.tar.xz
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')
-rw-r--r--tools/llvm-ar/Archive.cpp9
-rw-r--r--tools/llvm-ar/Archive.h9
-rw-r--r--tools/llvm-ar/ArchiveWriter.cpp17
-rw-r--r--tools/llvm-ar/llvm-ar.cpp8
4 files changed, 36 insertions, 7 deletions
diff --git a/tools/llvm-ar/Archive.cpp b/tools/llvm-ar/Archive.cpp
index 520e410e1a..cac65cf770 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 37489992cf..79d95873fd 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 332d55f0a4..5563b564b3 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 941b631080..36bec4206d 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;