From 0f5e9d23193c01698d8edb2293939dc23cb892e6 Mon Sep 17 00:00:00 2001 From: Yuanfang Chen Date: Mon, 15 Jul 2019 22:52:01 +0000 Subject: [PATCH] [llvm-readelf] Print "File: lib.a(file.o)" info when dumping archive files. Match GNU readelf. https://bugs.llvm.org/show_bug.cgi?id=35351 Reviewers: jhenderson, grimar, MaskRay, rupprecht Reviewed by: jhenderson, MaskRay, grimar Differential Revision: https://reviews.llvm.org/D64361 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@366147 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/tools/llvm-readobj/archive.test | 25 +++++++++++++++++----- test/tools/llvm-readobj/elf-dynamic-malformed.test | 1 + .../llvm-readobj/macho-universal-x86_64.i386.test | 18 ++++++++++------ test/tools/llvm-readobj/thin-archive-paths.test | 8 +++---- tools/llvm-readobj/llvm-readobj.cpp | 17 ++++++++++----- 5 files changed, 49 insertions(+), 20 deletions(-) diff --git a/test/tools/llvm-readobj/archive.test b/test/tools/llvm-readobj/archive.test index 08b04fa4f03..1bb70d36270 100644 --- a/test/tools/llvm-readobj/archive.test +++ b/test/tools/llvm-readobj/archive.test @@ -2,39 +2,54 @@ # RUN: rm -f %t.a # RUN: llvm-ar rc %t.a %p/Inputs/trivial.obj.elf-x86-64 %p/Inputs/trivial.obj.elf-i386 %p/Inputs/trivial.obj.coff-arm -# RUN: llvm-readobj --all %t.a | FileCheck %s --check-prefixes=LLVM,COFF -# RUN: llvm-readelf --all %t.a | FileCheck %s --check-prefixes=GNU,COFF +# RUN: llvm-readobj --all %t.a | FileCheck %s -DARFILE="%t.a" --check-prefixes=HEADER,LLVM,COFF +# RUN: llvm-readelf --all %t.a | FileCheck %s -DARFILE="%t.a" --check-prefixes=HEADER,GNU,COFF -# LLVM: File: trivial.obj.elf-x86-64 +# LLVM: {{^$}} +# LLVM-NEXT: File: [[ARFILE]](trivial.obj.elf-x86-64) # LLVM: Format: ELF64-x86-64 # LLVM: ElfHeader { # LLVM: Machine: EM_X86_64 # LLVM: Sections [ # LLVM: Relocations [ # LLVM: Symbols [ +# LLVM: Notes [ +# LLVM: ] +# GNU: {{^$}} +# GNU-NEXT: File: [[ARFILE]](trivial.obj.elf-x86-64) # GNU: ELF Header: # GNU: Machine: Advanced Micro Devices X86-64 # GNU: Section Headers: # GNU: Relocation section '.rela.text' # GNU: Symbol table '.symtab' +# GNU: There are no section groups in this file. -# LLVM: File: trivial.obj.elf-i386 +# LLVM-EMPTY: +# LLVM-NEXT: File: [[ARFILE]](trivial.obj.elf-i386) # LLVM: Format: ELF32-i386 # LLVM: ElfHeader { # LLVM: Machine: EM_386 # LLVM: Sections [ # LLVM: Relocations [ # LLVM: Symbols [ +# LLVM: Notes [ +# LLVM: ] +# GNU-EMPTY: +# GNU-NEXT: File: [[ARFILE]](trivial.obj.elf-i386) # GNU: ELF Header: # GNU: Machine: Intel 80386 # GNU: Section Headers: # GNU: Relocation section '.rel.text' # GNU: Symbol table '.symtab' +# GNU: There are no section groups in this file. -# LLVM: File: trivial.obj.coff-arm +# LLVM-EMPTY: +# LLVM-NEXT: File: [[ARFILE]](trivial.obj.coff-arm) # LLVM: Format: COFF-ARM +# GNU-EMPTY: +# GNU-NEXT: File: [[ARFILE]](trivial.obj.coff-arm) # COFF: ImageFileHeader { # COFF: Machine: IMAGE_FILE_MACHINE_ARMNT # COFF: Sections [ diff --git a/test/tools/llvm-readobj/elf-dynamic-malformed.test b/test/tools/llvm-readobj/elf-dynamic-malformed.test index c8aa8d58eec..e78e1affd55 100644 --- a/test/tools/llvm-readobj/elf-dynamic-malformed.test +++ b/test/tools/llvm-readobj/elf-dynamic-malformed.test @@ -20,6 +20,7 @@ # WARN-GNU-NOT: warning # WARN-GNU: warning: invalid section size (4) or entity size (16) +# WARN-GNU-EMPTY: # WARN-GNU-NEXT: ELF Header: # WARN-GNU: Symbol table '.symtab' contains 1 entries: # WARN-GNU: 0: diff --git a/test/tools/llvm-readobj/macho-universal-x86_64.i386.test b/test/tools/llvm-readobj/macho-universal-x86_64.i386.test index b13bd455b17..dc03ab367b1 100644 --- a/test/tools/llvm-readobj/macho-universal-x86_64.i386.test +++ b/test/tools/llvm-readobj/macho-universal-x86_64.i386.test @@ -5,10 +5,12 @@ RUN: llvm-readobj --sections %p/Inputs/macho-universal.x86_64.i386 \ RUN: | FileCheck %s -check-prefix MULTISECTIONS RUN: llvm-readobj -h %p/Inputs/macho-universal-archive.x86_64.i386 \ -RUN: | FileCheck %s -check-prefix MULTIHEADER-ARCHIVE +RUN: | FileCheck %s -check-prefix MULTIHEADER-ARCHIVE \ +RUN: -DARFILE="%p/Inputs/macho-universal-archive.x86_64.i386" RUN: llvm-readobj --sections %p/Inputs/macho-universal-archive.x86_64.i386 \ -RUN: | FileCheck %s -check-prefix MULTISECTIONS-ARCHIVE +RUN: | FileCheck %s -check-prefix MULTISECTIONS-ARCHIVE \ +RUN: -DARFILE="%p/Inputs/macho-universal-archive.x86_64.i386" MULTIHEADER: Format: Mach-O 64-bit x86-64 MULTIHEADER: Arch: x86_64 @@ -146,7 +148,8 @@ MULTISECTIONS: Reserved2: 0x0 MULTISECTIONS: } MULTISECTIONS: ] -MULTIHEADER-ARCHIVE: File: hello.o +MULTIHEADER-ARCHIVE: {{^$}} +MULTIHEADER-ARCHIVE-NEXT: File: [[ARFILE]](hello.o) MULTIHEADER-ARCHIVE: Format: Mach-O 64-bit x86-64 MULTIHEADER-ARCHIVE: Arch: x86_64 MULTIHEADER-ARCHIVE: AddressSize: 64bit @@ -162,7 +165,8 @@ MULTIHEADER-ARCHIVE: MH_SUBSECTIONS_VIA_SYMBOLS (0x2000) MULTIHEADER-ARCHIVE: ] MULTIHEADER-ARCHIVE: Reserved: 0x0 MULTIHEADER-ARCHIVE: } -MULTIHEADER-ARCHIVE: File: foo.o +MULTIHEADER-ARCHIVE-EMPTY: +MULTIHEADER-ARCHIVE-NEXT: File: [[ARFILE]](foo.o) MULTIHEADER-ARCHIVE: Format: Mach-O 32-bit i386 MULTIHEADER-ARCHIVE: Arch: i386 MULTIHEADER-ARCHIVE: AddressSize: 32bit @@ -178,7 +182,8 @@ MULTIHEADER-ARCHIVE: MH_SUBSECTIONS_VIA_SYMBOLS (0x2000) MULTIHEADER-ARCHIVE: ] MULTIHEADER-ARCHIVE: } -MULTISECTIONS-ARCHIVE: File: hello.o +MULTISECTIONS-ARCHIVE: {{^$}} +MULTISECTIONS-ARCHIVE-NEXT: File: [[ARFILE]](hello.o) MULTISECTIONS-ARCHIVE: Format: Mach-O 64-bit x86-64 MULTISECTIONS-ARCHIVE: Arch: x86_64 MULTISECTIONS-ARCHIVE: AddressSize: 64bit @@ -254,7 +259,8 @@ MULTISECTIONS-ARCHIVE: Reserved1: 0x0 MULTISECTIONS-ARCHIVE: Reserved2: 0x0 MULTISECTIONS-ARCHIVE: } MULTISECTIONS-ARCHIVE: ] -MULTISECTIONS-ARCHIVE: File: foo.o +MULTISECTIONS-ARCHIVE-EMPTY: +MULTISECTIONS-ARCHIVE-NEXT: File: [[ARFILE]](foo.o) MULTISECTIONS-ARCHIVE: Format: Mach-O 32-bit i386 MULTISECTIONS-ARCHIVE: Arch: i386 MULTISECTIONS-ARCHIVE: AddressSize: 32bit diff --git a/test/tools/llvm-readobj/thin-archive-paths.test b/test/tools/llvm-readobj/thin-archive-paths.test index d7a971eb303..2e2ec56b99d 100644 --- a/test/tools/llvm-readobj/thin-archive-paths.test +++ b/test/tools/llvm-readobj/thin-archive-paths.test @@ -8,8 +8,8 @@ # RUN: llvm-ar rcT a/relative.a a/b/1.o # Show that relative paths in the file header printing look sensible. -# RUN: llvm-readobj --file-headers a/relative.a | FileCheck %s --check-prefix=REL -# REL: File: b/1.o +# RUN: llvm-readobj --file-headers a/relative.a | FileCheck %s -DARFILE="a/relative.a" --check-prefix=REL +# REL: File: [[ARFILE]](b/1.o) # Show that relative paths in an error message for both archive and member look # sensible. @@ -23,8 +23,8 @@ # RUN: llvm-ar rcT c/absolute.a %t/a/b/1.o # Show that absolute paths in the file header printing are correct. -# RUN: llvm-readobj --file-headers c/absolute.a | FileCheck %s --check-prefix=ABS -DDIR=%/t -# ABS: File: [[DIR]]/a/b/1.o +# RUN: llvm-readobj --file-headers c/absolute.a | FileCheck %s --check-prefix=ABS -DARFILE="c/absolute.a" -DDIR=%/t +# ABS: File: [[ARFILE]]([[DIR]]/a/b/1.o) # Show that absolute paths in an error message for both archive and member are correct. # RUN: rm a/b/1.o diff --git a/tools/llvm-readobj/llvm-readobj.cpp b/tools/llvm-readobj/llvm-readobj.cpp index f00d94ee5c4..b6d0493af70 100644 --- a/tools/llvm-readobj/llvm-readobj.cpp +++ b/tools/llvm-readobj/llvm-readobj.cpp @@ -462,20 +462,27 @@ static std::error_code createDumper(const ObjectFile *Obj, } /// Dumps the specified object file. -static void dumpObject(const ObjectFile *Obj, ScopedPrinter &Writer) { +static void dumpObject(const ObjectFile *Obj, ScopedPrinter &Writer, + const Archive *A = nullptr) { + std::string FileStr = + A ? Twine(A->getFileName() + "(" + Obj->getFileName() + ")").str() + : Obj->getFileName().str(); + std::unique_ptr Dumper; if (std::error_code EC = createDumper(Obj, Writer, Dumper)) - reportError(Obj->getFileName(), EC); + reportError(FileStr, EC); + Writer.startLine() << "\n"; if (opts::Output == opts::LLVM) { - Writer.startLine() << "\n"; - Writer.printString("File", Obj->getFileName()); + Writer.printString("File", FileStr); Writer.printString("Format", Obj->getFileFormatName()); Writer.printString("Arch", Triple::getArchTypeName( (llvm::Triple::ArchType)Obj->getArch())); Writer.printString("AddressSize", formatv("{0}bit", 8 * Obj->getBytesInAddress())); Dumper->printLoadName(); + } else if (opts::Output == opts::GNU && A) { + Writer.printString("File", FileStr); } if (opts::FileHeaders) @@ -589,7 +596,7 @@ static void dumpArchive(const Archive *Arc, ScopedPrinter &Writer) { continue; } if (ObjectFile *Obj = dyn_cast(&*ChildOrErr.get())) - dumpObject(Obj, Writer); + dumpObject(Obj, Writer, Arc); else if (COFFImportFile *Imp = dyn_cast(&*ChildOrErr.get())) dumpCOFFImportFile(Imp, Writer); else -- 2.11.0