Use the true, decoded name of the archive member in getObjectType.
authorBrian Gaeke <gaeke@uiuc.edu>
Wed, 31 Mar 2004 19:51:00 +0000 (19:51 +0000)
committerBrian Gaeke <gaeke@uiuc.edu>
Wed, 31 Mar 2004 19:51:00 +0000 (19:51 +0000)
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

lib/Archive/ArchiveReader.cpp
lib/Bytecode/Archive/ArchiveReader.cpp
lib/Bytecode/Reader/ArchiveReader.cpp

index b8bb914eba764ac560591255067f8abb7a93858e..8671c422a1ecb615b05316dea5149d39fc594e7f 100644 (file)
@@ -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.
index b8bb914eba764ac560591255067f8abb7a93858e..8671c422a1ecb615b05316dea5149d39fc594e7f 100644 (file)
@@ -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.
index b8bb914eba764ac560591255067f8abb7a93858e..8671c422a1ecb615b05316dea5149d39fc594e7f 100644 (file)
@@ -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.