aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Archive
diff options
context:
space:
mode:
authorBrian Gaeke <gaeke@uiuc.edu>2004-03-31 19:51:00 +0000
committerBrian Gaeke <gaeke@uiuc.edu>2004-03-31 19:51:00 +0000
commit60d6e54c72ceb173a6de119ee44d1b9694380e78 (patch)
tree3408dfa66de0746f0c1630b0aab35aebeadaac40 /lib/Archive
parent91ef460285021b5bf43b3850f0f8958a09b8939c (diff)
downloadexternal_llvm-60d6e54c72ceb173a6de119ee44d1b9694380e78.zip
external_llvm-60d6e54c72ceb173a6de119ee44d1b9694380e78.tar.gz
external_llvm-60d6e54c72ceb173a6de119ee44d1b9694380e78.tar.bz2
Use the true, decoded name of the archive member in getObjectType.
In ReadArchiveBuffer, make sure that MemberName is set in the case where getObjectType would want to return SVR4LongFilename. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12567 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Archive')
-rw-r--r--lib/Archive/ArchiveReader.cpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/lib/Archive/ArchiveReader.cpp b/lib/Archive/ArchiveReader.cpp
index b8bb914..8671c42 100644
--- a/lib/Archive/ArchiveReader.cpp
+++ b/lib/Archive/ArchiveReader.cpp
@@ -47,14 +47,12 @@ namespace {
/// This is capable of parsing the variety of special sections used for various
/// purposes.
///
-static enum ObjectType getObjectType(ar_hdr *H, unsigned char *MemberData,
- unsigned Size) {
+static enum ObjectType getObjectType(ar_hdr *H, std::string MemberName,
+ unsigned char *MemberData, unsigned Size) {
// Check for sections with special names...
- if (!memcmp(H->name, "__.SYMDEF ", 16))
+ if (MemberName == "__.SYMDEF " || MemberName == "__.SYMDEF SORTED")
return ArchiveSymbolTable;
- if (!memcmp(H->name, "__.SYMDEF SORTED", 16))
- return ArchiveSymbolTable;
- if (!memcmp(H->name, "// ", 16))
+ else if (MemberName == "// ")
return SVR4LongFilename;
// Check to see if it looks like an llvm object file...
@@ -113,6 +111,11 @@ static bool ReadArchiveBuffer(const std::string &ArchiveName,
&& "SVR4-style long filename for archive member not found");
startp = &LongFilenames[NameIndex];
endp = strchr (startp, '/');
+ } else if (startp == endp && Hdr->name[1] == '/') {
+ // This is for the SVR4 long filename table (there might be other
+ // names starting with // but I don't know about them). Make sure that
+ // getObjectType sees it.
+ endp = &Hdr->name[sizeof (Hdr->name)];
}
if (!endp) {
// 4.4BSD/MacOSX *short* filenames are not guaranteed to have a
@@ -124,7 +127,7 @@ static bool ReadArchiveBuffer(const std::string &ArchiveName,
std::string MemberName (startp, endp);
std::string FullMemberName = ArchiveName + "(" + MemberName + ")";
- switch (getObjectType(Hdr, MemberData, MemberSize)) {
+ switch (getObjectType(Hdr, MemberName, MemberData, MemberSize)) {
case SVR4LongFilename:
// If this is a long filename section, read all of the file names into the
// LongFilenames vector.