diff --git a/llvm/tools/llvm-ar/Archive.cpp b/llvm/tools/llvm-ar/Archive.cpp index 70fddcfe4d24..c733652e58ab 100644 --- a/llvm/tools/llvm-ar/Archive.cpp +++ b/llvm/tools/llvm-ar/Archive.cpp @@ -29,7 +29,7 @@ using namespace llvm; unsigned ArchiveMember::getMemberSize() const { // Basically its the file size plus the header size - unsigned result = info.fileSize + sizeof(ArchiveMemberHeader); + unsigned result = Size + sizeof(ArchiveMemberHeader); // If it has a long filename, include the name length if (hasLongFilename()) @@ -47,11 +47,11 @@ ArchiveMember::getMemberSize() const { ArchiveMember::ArchiveMember() : parent(0), path("--invalid--"), flags(0), data(0) { - info.user = sys::Process::GetCurrentUserId(); - info.group = sys::Process::GetCurrentGroupId(); - info.mode = 0777; - info.fileSize = 0; - info.modTime = sys::TimeValue::now(); + User = sys::Process::GetCurrentUserId(); + Group = sys::Process::GetCurrentGroupId(); + Mode = 0777; + Size = 0; + ModTime = sys::TimeValue::now(); } // This is the constructor that the Archive class uses when it is building or @@ -117,10 +117,13 @@ bool ArchiveMember::replaceWith(StringRef newFile, std::string* ErrMsg) { signature = magic.c_str(); sys::PathWithStatus PWS(path); const sys::FileStatus *FSinfo = PWS.getFileStatus(false, ErrMsg); - if (FSinfo) - info = *FSinfo; - else + if (!FSinfo) return true; + User = FSinfo->getUser(); + Group = FSinfo->getGroup(); + Mode = FSinfo->getMode(); + ModTime = FSinfo->getTimestamp(); + Size = FSinfo->getSize(); } // Determine what kind of file it is. diff --git a/llvm/tools/llvm-ar/Archive.h b/llvm/tools/llvm-ar/Archive.h index 2357b13d6300..232a5c23d2a4 100644 --- a/llvm/tools/llvm-ar/Archive.h +++ b/llvm/tools/llvm-ar/Archive.h @@ -20,7 +20,7 @@ #include "llvm/ADT/ilist.h" #include "llvm/ADT/ilist_node.h" #include "llvm/Support/Path.h" -#include "llvm/Support/PathV1.h" +#include "llvm/Support/TimeValue.h" #include #include @@ -72,28 +72,28 @@ class ArchiveMember : public ilist_node { /// have any applicability on non-Unix systems but is a required component /// of the "ar" file format. /// @brief Get the user associated with this archive member. - unsigned getUser() const { return info.getUser(); } + unsigned getUser() const { return User; } /// The "group" is the owning group of the file per Unix security. This /// may not have any applicability on non-Unix systems but is a required /// component of the "ar" file format. /// @brief Get the group associated with this archive member. - unsigned getGroup() const { return info.getGroup(); } + unsigned getGroup() const { return Group; } /// The "mode" specifies the access permissions for the file per Unix /// security. This may not have any applicability on non-Unix systems but is /// a required component of the "ar" file format. /// @brief Get the permission mode associated with this archive member. - unsigned getMode() const { return info.getMode(); } + unsigned getMode() const { return Mode; } /// This method returns the time at which the archive member was last /// modified when it was not in the archive. /// @brief Get the time of last modification of the archive member. - sys::TimeValue getModTime() const { return info.getTimestamp(); } + sys::TimeValue getModTime() const { return ModTime; } /// @returns the size of the archive member in bytes. /// @brief Get the size of the archive member. - uint64_t getSize() const { return info.getSize(); } + uint64_t getSize() const { return Size; } /// This method returns the total size of the archive member as it /// appears on disk. This includes the file content, the header, the @@ -149,11 +149,15 @@ class ArchiveMember : public ilist_node { /// @name Data /// @{ private: - Archive* parent; ///< Pointer to parent archive - std::string path; ///< Path of file containing the member - sys::FileStatus info; ///< Status info (size,mode,date) - unsigned flags; ///< Flags about the archive member - const char* data; ///< Data for the member + Archive *parent; ///< Pointer to parent archive + std::string path; ///< Path of file containing the member + uint32_t User; + uint32_t Group; + uint32_t Mode; + sys::TimeValue ModTime; + uint64_t Size; + unsigned flags; ///< Flags about the archive member + const char *data; ///< Data for the member /// @} /// @name Constructors diff --git a/llvm/tools/llvm-ar/ArchiveInternals.h b/llvm/tools/llvm-ar/ArchiveInternals.h index e906d7a05999..7b73312a8faf 100644 --- a/llvm/tools/llvm-ar/ArchiveInternals.h +++ b/llvm/tools/llvm-ar/ArchiveInternals.h @@ -16,6 +16,7 @@ #include "Archive.h" #include "llvm/ADT/StringExtras.h" +#include "llvm/Support/PathV1.h" #include "llvm/Support/TimeValue.h" #include diff --git a/llvm/tools/llvm-ar/ArchiveReader.cpp b/llvm/tools/llvm-ar/ArchiveReader.cpp index 25f3c2fe7fff..7b363a11dc12 100644 --- a/llvm/tools/llvm-ar/ArchiveReader.cpp +++ b/llvm/tools/llvm-ar/ArchiveReader.cpp @@ -175,13 +175,13 @@ Archive::parseMemberHeader(const char*& At, const char* End, std::string* error) // Fill in fields of the ArchiveMember member->parent = this; member->path = pathname; - member->info.fileSize = MemberSize; - member->info.modTime.fromEpochTime(atoi(Hdr->date)); + member->Size = MemberSize; + member->ModTime.fromEpochTime(atoi(Hdr->date)); unsigned int mode; sscanf(Hdr->mode, "%o", &mode); - member->info.mode = mode; - member->info.user = atoi(Hdr->uid); - member->info.group = atoi(Hdr->gid); + member->Mode = mode; + member->User = atoi(Hdr->uid); + member->Group = atoi(Hdr->gid); member->flags = flags; member->data = At; diff --git a/llvm/tools/llvm-ar/ArchiveWriter.cpp b/llvm/tools/llvm-ar/ArchiveWriter.cpp index 7b5574e0a255..5b74b2611026 100644 --- a/llvm/tools/llvm-ar/ArchiveWriter.cpp +++ b/llvm/tools/llvm-ar/ArchiveWriter.cpp @@ -172,7 +172,11 @@ bool Archive::addFileBefore(StringRef filePath, iterator where, delete mbr; return true; } - mbr->info = *FSInfo; + mbr->User = FSInfo->getUser(); + mbr->Group = FSInfo->getGroup(); + mbr->Mode = FSInfo->getMode(); + mbr->ModTime = FSInfo->getTimestamp(); + mbr->Size = FSInfo->getSize(); unsigned flags = 0; bool hasSlash = filePath.str().find('/') != std::string::npos; diff --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp index 03bb36b116ef..85f3517b58ad 100644 --- a/llvm/tools/llvm-ar/llvm-ar.cpp +++ b/llvm/tools/llvm-ar/llvm-ar.cpp @@ -19,6 +19,7 @@ #include "llvm/Support/FileSystem.h" #include "llvm/Support/Format.h" #include "llvm/Support/ManagedStatic.h" +#include "llvm/Support/PathV1.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/Signals.h" #include "llvm/Support/raw_ostream.h"