[llvm] r211036 - Fix pr17056.

Rafael Espindola rafael.espindola at gmail.com
Mon Jun 16 09:41:00 PDT 2014


Author: rafael
Date: Mon Jun 16 11:41:00 2014
New Revision: 211036

URL: http://llvm.org/viewvc/llvm-project?rev=211036&view=rev
Log:
Fix pr17056.

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.

Added:
    llvm/trunk/test/Object/Inputs/corrupt-archive.a
Modified:
    llvm/trunk/lib/Object/ELFObjectFile.cpp
    llvm/trunk/test/Object/nm-archive.test

Modified: llvm/trunk/lib/Object/ELFObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/ELFObjectFile.cpp?rev=211036&r1=211035&r2=211036&view=diff
==============================================================================
--- llvm/trunk/lib/Object/ELFObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/ELFObjectFile.cpp Mon Jun 16 11:41:00 2014
@@ -36,7 +36,7 @@ ErrorOr<ObjectFile *> ObjectFile::create
       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::create
       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::create
       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::create
       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;

Added: llvm/trunk/test/Object/Inputs/corrupt-archive.a
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/corrupt-archive.a?rev=211036&view=auto
==============================================================================
Binary files llvm/trunk/test/Object/Inputs/corrupt-archive.a (added) and llvm/trunk/test/Object/Inputs/corrupt-archive.a Mon Jun 16 11:41:00 2014 differ

Modified: llvm/trunk/test/Object/nm-archive.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/nm-archive.test?rev=211036&r1=211035&r2=211036&view=diff
==============================================================================
--- llvm/trunk/test/Object/nm-archive.test (original)
+++ llvm/trunk/test/Object/nm-archive.test Mon Jun 16 11:41:00 2014
@@ -33,3 +33,9 @@ RUN: llvm-nm -s %p/Inputs/archive-test.a
 
 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





More information about the llvm-commits mailing list