[llvm] r360251 - [llvm-objcopy] Improve error message for unrecognised archive member

James Henderson via llvm-commits llvm-commits at lists.llvm.org
Wed May 8 06:28:58 PDT 2019


Author: jhenderson
Date: Wed May  8 06:28:58 2019
New Revision: 360251

URL: http://llvm.org/viewvc/llvm-project?rev=360251&view=rev
Log:
[llvm-objcopy] Improve error message for unrecognised archive member

Prior to this patch, llvm-objcopy's error messages for archives with
unsupported members only mentioned the archive name, not the member
name, making them unhelpful. This change improves it by approximately
following GNU objcopy's error message syntax of
"<archive name>(<member name>): <problem>".

Reviewed by: grimar

Differential Revision: https://reviews.llvm.org/D61674

Added:
    llvm/trunk/test/tools/llvm-objcopy/ELF/archive-unknown-members.test
Modified:
    llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp

Added: llvm/trunk/test/tools/llvm-objcopy/ELF/archive-unknown-members.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/ELF/archive-unknown-members.test?rev=360251&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/ELF/archive-unknown-members.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/ELF/archive-unknown-members.test Wed May  8 06:28:58 2019
@@ -0,0 +1,45 @@
+## Show that llvm-objcopy and llvm-strip emit errors when attempting to modify
+## archives containing unrecognized files, and do not modify anything. We use
+## --strip-debug so that the section should be removed, and a difference
+## detectable, if the file were modified.
+
+# RUN: yaml2obj %s -o %t.o
+# RUN: rm -f %t.a
+# RUN: llvm-ar rc %t.a %t.o %s
+# RUN: cp %t.a %t1.a
+# RUN: cp %t.a %t2.a
+
+# RUN: not llvm-objcopy --strip-debug %t1.a 2>&1 | FileCheck %s -DARCHIVE=%t1.a
+# RUN: not llvm-strip --strip-debug %t2.a 2>&1 | FileCheck %s -DARCHIVE=%t2.a
+## Verify that the archive was not modified, if any member couldn't be recognised.
+# RUN: cmp %t.a %t1.a
+# RUN: cmp %t.a %t2.a
+
+# CHECK: error: '[[ARCHIVE]](archive-unknown-members.test)': The file was not recognized as a valid object file
+
+# RUN: rm -f %t.thin1.a %t.thin2.a
+# RUN: cp %t.o %t1.o
+# RUN: cp %t.o %t2.o
+# RUN: llvm-ar rcT %t.thin1.a %t1.o %s
+# RUN: llvm-ar rcT %t.thin2.a %t2.o %s
+
+# RUN: not llvm-objcopy --strip-debug %t.thin1.a 2>&1 \
+# RUN:   | FileCheck %s --check-prefix=THIN -DARCHIVE=%t.thin1.a -DMEMBER=%s
+# RUN: not llvm-strip --strip-debug %t.thin2.a 2>&1 \
+# RUN:   | FileCheck %s --check-prefix=THIN -DARCHIVE=%t.thin2.a -DMEMBER=%s
+## Verify that the first member was not modified, if a later member could not
+## be recognised.
+# RUN: cmp %t.o %t1.o
+# RUN: cmp %t.o %t2.o
+
+# THIN: error: '[[ARCHIVE]]([[MEMBER]])': The file was not recognized as a valid object file
+
+--- !ELF
+FileHeader:
+  Class:   ELFCLASS64
+  Data:    ELFDATA2LSB
+  Type:    ET_EXEC
+  Machine: EM_X86_64
+Sections:
+  - Name: .debug_foo
+    Type: SHT_PROGBITS

Modified: llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp?rev=360251&r1=360250&r2=360251&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp Wed May  8 06:28:58 2019
@@ -154,17 +154,17 @@ static Error executeObjcopyOnArchive(con
   std::vector<NewArchiveMember> NewArchiveMembers;
   Error Err = Error::success();
   for (const Archive::Child &Child : Ar.children(Err)) {
-    Expected<std::unique_ptr<Binary>> ChildOrErr = Child.getAsBinary();
-    if (!ChildOrErr)
-      return createFileError(Ar.getFileName(), ChildOrErr.takeError());
-    Binary *Bin = ChildOrErr->get();
-
     Expected<StringRef> ChildNameOrErr = Child.getName();
     if (!ChildNameOrErr)
       return createFileError(Ar.getFileName(), ChildNameOrErr.takeError());
 
+    Expected<std::unique_ptr<Binary>> ChildOrErr = Child.getAsBinary();
+    if (!ChildOrErr)
+      return createFileError(Ar.getFileName() + "(" + *ChildNameOrErr + ")",
+                             ChildOrErr.takeError());
+
     MemBuffer MB(ChildNameOrErr.get());
-    if (Error E = executeObjcopyOnBinary(Config, *Bin, MB))
+    if (Error E = executeObjcopyOnBinary(Config, *ChildOrErr->get(), MB))
       return E;
 
     Expected<NewArchiveMember> Member =




More information about the llvm-commits mailing list