Fix pr17056.
authorRafael Espindola <rafael.espindola@gmail.com>
Mon, 16 Jun 2014 16:41:00 +0000 (16:41 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Mon, 16 Jun 2014 16:41:00 +0000 (16:41 +0000)
This makes llvm-nm ignore members that are not sufficiently aligned for
lib/Object to handle.

These archives are invalid. GNU AR is able to handle this, but in general
just warns about broken archive members.

We should probably start warning too, but for now just make sure llvm-nm
exits with an 0.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211036 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Object/ELFObjectFile.cpp
test/Object/Inputs/corrupt-archive.a [new file with mode: 0644]
test/Object/nm-archive.test

index a11a9e016dfaa2f259907e746936786508d15413..356288ffc51ba461639fc50bf593be9693acdf83 100644 (file)
@@ -36,7 +36,7 @@ ErrorOr<ObjectFile *> ObjectFile::createELFObjectFile(MemoryBuffer *Obj,
       R.reset(new ELFObjectFile<ELFType<support::little, 2, false> >(
           Obj, EC, BufferOwned));
     else
-      llvm_unreachable("Invalid alignment for ELF file!");
+      return object_error::parse_failed;
   else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB)
 #if !LLVM_IS_UNALIGNED_ACCESS_FAST
     if (MaxAlignment >= 4)
@@ -48,7 +48,7 @@ ErrorOr<ObjectFile *> ObjectFile::createELFObjectFile(MemoryBuffer *Obj,
       R.reset(new ELFObjectFile<ELFType<support::big, 2, false> >(Obj, EC,
                                                                   BufferOwned));
     else
-      llvm_unreachable("Invalid alignment for ELF file!");
+      return object_error::parse_failed;
   else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB)
 #if !LLVM_IS_UNALIGNED_ACCESS_FAST
     if (MaxAlignment >= 8)
@@ -60,7 +60,7 @@ ErrorOr<ObjectFile *> ObjectFile::createELFObjectFile(MemoryBuffer *Obj,
       R.reset(new ELFObjectFile<ELFType<support::big, 2, true> >(Obj, EC,
                                                                  BufferOwned));
     else
-      llvm_unreachable("Invalid alignment for ELF file!");
+      return object_error::parse_failed;
   else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) {
 #if !LLVM_IS_UNALIGNED_ACCESS_FAST
     if (MaxAlignment >= 8)
@@ -72,10 +72,10 @@ ErrorOr<ObjectFile *> ObjectFile::createELFObjectFile(MemoryBuffer *Obj,
       R.reset(new ELFObjectFile<ELFType<support::little, 2, true> >(
           Obj, EC, BufferOwned));
     else
-      llvm_unreachable("Invalid alignment for ELF file!");
+      return object_error::parse_failed;
   }
   else
-    report_fatal_error("Buffer is not an ELF object file!");
+    llvm_unreachable("Buffer is not an ELF object file!");
 
   if (EC)
     return EC;
diff --git a/test/Object/Inputs/corrupt-archive.a b/test/Object/Inputs/corrupt-archive.a
new file mode 100644 (file)
index 0000000..f8940ff
Binary files /dev/null and b/test/Object/Inputs/corrupt-archive.a differ
index fbbf051b478ab16f8efea48a478226d7912195fd..d875d6c991c1efa5a63d21d29660c1b34cdac60f 100644 (file)
@@ -33,3 +33,9 @@ RUN: llvm-nm -s %p/Inputs/archive-test.a-gnu-minimal
 
 Don't reject an empty archive.
 RUN: llvm-nm %p/Inputs/archive-test.a-empty
+
+This archive has an unaligned member and a unknown format member.
+GNU AR is able to parse the unaligned member and warns about the member with
+the unknown format. We should probably simply warn on both. For now just check
+that we don't produce an error.
+RUN: llvm-nm %p/Inputs/corrupt-archive.a