From c35d4c900d209b57f8cf8fe9030ecda054488b71 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Sat, 17 Aug 2019 15:36:06 +0000 Subject: [PATCH] Revert r369190, r369192 ([llvm-readobj/llvm-readelf] - Improve/cleanup the error reporting API.) It caused multiple BB failtures: http://lab.llvm.org:8011/builders/clang-x64-windows-msvc/builds/9743/steps/stage%201%20check/logs/stdio http://lab.llvm.org:8011/builders/clang-cmake-x86_64-sde-avx512-linux/builds/26042/steps/ninja%20check%201/logs/FAIL%3A%20LLVM%3A%3Astack-sizes.test llvm-svn: 369193 --- llvm/test/Object/invalid.test | 26 ++-- .../tools/llvm-readobj/elf-broken-dynsym-link.test | 12 +- .../tools/llvm-readobj/elf-dynamic-malformed.test | 24 ++-- .../elf-dynamic-not-in-pt-dynamic.test | 6 +- .../llvm-readobj/elf-malformed-pt-dynamic.test | 6 +- .../elf-non-dynamic-in-pt-dynamic.test | 6 +- llvm/test/tools/llvm-readobj/hex-dump.test | 6 +- llvm/test/tools/llvm-readobj/mips-got.test | 8 +- .../tools/llvm-readobj/note-core-ntfile-bad.test | 16 +-- llvm/test/tools/llvm-readobj/string-dump.test | 12 +- llvm/tools/llvm-readobj/COFFDumper.cpp | 140 ++++++++------------ llvm/tools/llvm-readobj/DwarfCFIEHPrinter.h | 42 +++--- llvm/tools/llvm-readobj/ELFDumper.cpp | 145 +++++++++------------ llvm/tools/llvm-readobj/MachODumper.cpp | 6 +- llvm/tools/llvm-readobj/ObjDumper.cpp | 13 +- llvm/tools/llvm-readobj/llvm-readobj.cpp | 42 +++--- llvm/tools/llvm-readobj/llvm-readobj.h | 9 +- 17 files changed, 225 insertions(+), 294 deletions(-) diff --git a/llvm/test/Object/invalid.test b/llvm/test/Object/invalid.test index c5cb271..16fae95 100644 --- a/llvm/test/Object/invalid.test +++ b/llvm/test/Object/invalid.test @@ -135,9 +135,9 @@ Symbols: ## Check that llvm-readobj reports a warning if .dynsym has an invalid sh_entsize. # RUN: yaml2obj %s --docnum=7 -o %t7 -# RUN: llvm-readobj --dyn-symbols %t7 2>&1 | FileCheck -DFILE=%t7 --check-prefix=INVALID-DYNSYM-SIZE %s +# RUN: llvm-readobj --dyn-symbols %t7 2>&1 | FileCheck --check-prefix=INVALID-DYNSYM-SIZE %s -# INVALID-DYNSYM-SIZE: warning: '[[FILE]]': invalid section size (48) or entity size (32) +# INVALID-DYNSYM-SIZE: warning: invalid section size (48) or entity size (32) --- !ELF FileHeader: @@ -409,9 +409,9 @@ Symbols: ## Check llvm-readobj reports it. # RUN: yaml2obj %s --docnum=20 -o %t20 -# RUN: not llvm-readobj -dt %t20 2>&1 | FileCheck -DFILE=%t20 --check-prefix=INVALID-VERSION %s +# RUN: not llvm-readobj -dt %t20 2>&1 | FileCheck --check-prefix=INVALID-VERSION %s -# INVALID-VERSION: error: '[[FILE]]': Invalid version entry +# INVALID-VERSION: error: Invalid version entry --- !ELF FileHeader: @@ -438,9 +438,9 @@ DynamicSymbols: ## Check llvm-readobj reports it. # RUN: yaml2obj %s --docnum=21 -o %t21 -# RUN: llvm-readobj --dynamic-table %t21 2>&1 | FileCheck -DFILE=%t21 --check-prefix=INVALID-DTSTRTAB %s +# RUN: llvm-readobj --dynamic-table %t21 2>&1 | FileCheck --check-prefix=INVALID-DTSTRTAB %s -# INVALID-DTSTRTAB: warning: '[[FILE]]': Unable to parse DT_STRTAB: virtual address is not in any segment: 0xffff0000 +# INVALID-DTSTRTAB: warning: Unable to parse DT_STRTAB: virtual address is not in any segment: 0xffff0000 --- !ELF FileHeader: @@ -468,17 +468,17 @@ ProgramHeaders: # RUN: llvm-readobj --dyn-relocations \ # RUN: %p/Inputs/corrupt-invalid-relocation-size.elf.x86-64 2>&1 \ -# RUN: | FileCheck -DFILE=%p/Inputs/corrupt-invalid-relocation-size.elf.x86-64 --check-prefix=RELOC-BROKEN-ENTSIZE %s +# RUN: | FileCheck --check-prefix=RELOC-BROKEN-ENTSIZE %s -# RELOC-BROKEN-ENTSIZE: warning: '[[FILE]]': invalid section size (24) or entity size (25) +# RELOC-BROKEN-ENTSIZE: warning: invalid section size (24) or entity size (25) ## Check that llvm-readobj reports a warning when .dynamic section has an invalid ## size, which isn't a multiple of the dynamic entry size. # RUN: yaml2obj %s --docnum=22 -o %t22 -# RUN: llvm-readobj --dyn-relocations %t22 2>&1 | FileCheck -DFILE=%t22 --check-prefix=DYN-TABLE-SIZE %s +# RUN: llvm-readobj --dyn-relocations %t22 2>&1 | FileCheck --check-prefix=DYN-TABLE-SIZE %s -# DYN-TABLE-SIZE: warning: '[[FILE]]': invalid section size (1) or entity size (16) +# DYN-TABLE-SIZE: warning: invalid section size (1) or entity size (16) --- !ELF FileHeader: @@ -495,9 +495,9 @@ Sections: ## than the object size. Check llvm-readobj reports it. # RUN: yaml2obj %s --docnum=23 -o %t23 -# RUN: llvm-readobj --dyn-relocations %t23 2>&1 | FileCheck -DFILE=%t23 --check-prefix=DYN-TABLE-PHDR %s +# RUN: llvm-readobj --dyn-relocations %t23 2>&1 | FileCheck --check-prefix=DYN-TABLE-PHDR %s -# DYN-TABLE-PHDR: warning: '[[FILE]]': PT_DYNAMIC segment offset + size exceeds the size of the file +# DYN-TABLE-PHDR: warning: PT_DYNAMIC segment offset + size exceeds the size of the file --- !ELF FileHeader: @@ -522,7 +522,7 @@ ProgramHeaders: # RUN: yaml2obj %s --docnum=24 -o %t24 # RUN: llvm-readobj --dyn-relocations %t24 2>&1 \ -# RUN: | FileCheck -DFILE=%t24 --check-prefix=DYN-TABLE-PHDR %s +# RUN: | FileCheck --check-prefix=DYN-TABLE-PHDR %s --- !ELF FileHeader: diff --git a/llvm/test/tools/llvm-readobj/elf-broken-dynsym-link.test b/llvm/test/tools/llvm-readobj/elf-broken-dynsym-link.test index bbd13b8..3c86128 100644 --- a/llvm/test/tools/llvm-readobj/elf-broken-dynsym-link.test +++ b/llvm/test/tools/llvm-readobj/elf-broken-dynsym-link.test @@ -3,10 +3,10 @@ ## Case 1: sh_link is set to 0. # RUN: yaml2obj --docnum=1 %s -o %t1 -# RUN: llvm-readobj -S %t1 2>&1 | FileCheck %s -DFILE=%t1 --check-prefixes=LLVM,ERR -# RUN: llvm-readelf -S %t1 2>&1 | FileCheck %s -DFILE=%t1 --check-prefixes=GNU,ERR +# RUN: llvm-readobj -S %t1 2>&1 | FileCheck %s --check-prefixes=LLVM,ERR +# RUN: llvm-readelf -S %t1 2>&1 | FileCheck %s --check-prefixes=GNU,ERR -# ERR: warning: '[[FILE]]': invalid sh_type for string table section [index 0]: expected SHT_STRTAB, but got SHT_NULL +# ERR: warning: invalid sh_type for string table section [index 0]: expected SHT_STRTAB, but got SHT_NULL # LLVM: Name: .dynsym # LLVM-NEXT: Type: SHT_DYNSYM @@ -36,10 +36,10 @@ Sections: ## Case 2: sh_link is set to 255, which is larger than the number of the sections. # RUN: yaml2obj --docnum=2 %s -o %t2 -# RUN: llvm-readobj -S %t2 2>&1 | FileCheck -DFILE=%t2 %s --check-prefixes=LLVM2,ERR2 -# RUN: llvm-readelf -S %t2 2>&1 | FileCheck -DFILE=%t2 %s --check-prefixes=GNU2,ERR2 +# RUN: llvm-readobj -S %t2 2>&1 | FileCheck %s --check-prefixes=LLVM2,ERR2 +# RUN: llvm-readelf -S %t2 2>&1 | FileCheck %s --check-prefixes=GNU2,ERR2 -# ERR2: warning: '[[FILE]]': invalid section index +# ERR2: warning: invalid section index --- !ELF FileHeader: diff --git a/llvm/test/tools/llvm-readobj/elf-dynamic-malformed.test b/llvm/test/tools/llvm-readobj/elf-dynamic-malformed.test index 9a11728..22315db 100644 --- a/llvm/test/tools/llvm-readobj/elf-dynamic-malformed.test +++ b/llvm/test/tools/llvm-readobj/elf-dynamic-malformed.test @@ -3,29 +3,29 @@ # RUN: yaml2obj %s --docnum=1 -o %t.bad-size # RUN: llvm-readobj --all %t.bad-size 2>&1 \ -# RUN: | FileCheck %s -DFILE=%t.bad-size --implicit-check-not=warning --check-prefix WARN +# RUN: | FileCheck %s --implicit-check-not=warning --check-prefix WARN # RUN: llvm-readelf --all %t.bad-size 2>&1 \ -# RUN: | FileCheck %s -DFILE=%t.bad-size --implicit-check-not=warning --check-prefix WARN-GNU +# RUN: | FileCheck %s --implicit-check-not=warning --check-prefix WARN-GNU # WARN-NOT: warning -# WARN: warning: '[[FILE]]': invalid section size (4) or entity size (16) +# WARN: warning: invalid section size (4) or entity size (16) # WARN-EMPTY: # WARN-NEXT: File: # WARN: Symbols [ # WARN: ] # WARN-EMPTY: ## A warning is printed at the place where a normal dynamic table should be. -# WARN-NEXT: warning: '[[FILE]]': invalid section size (4) or entity size (16) +# WARN-NEXT: warning: invalid section size (4) or entity size (16) # WARN-NEXT: ProgramHeaders [ # WARN-GNU-NOT: warning -# WARN-GNU: warning: '[[FILE]]': invalid section size (4) or entity size (16) +# WARN-GNU: warning: invalid section size (4) or entity size (16) # WARN-GNU-NEXT: ELF Header: # WARN-GNU: Symbol table '.symtab' contains 1 entries: # WARN-GNU: 0: # WARN-GNU-EMPTY: ## A warning is printed at the place where a normal dynamic table should be. -# WARN-GNU: warning: '[[FILE]]': invalid section size (4) or entity size (16) +# WARN-GNU: warning: invalid section size (4) or entity size (16) # WARN-GNU-EMPTY: --- !ELF @@ -162,9 +162,9 @@ ProgramHeaders: ## Test handling of DT_STRTAB pointing outside the file's address space. # RUN: yaml2obj %s --docnum=4 -o %t.bad-strtab -# RUN: llvm-readobj --dynamic-table %t.bad-strtab 2>&1 >/dev/null | FileCheck -DFILE=%t.bad-strtab %s --check-prefix BAD-STRTAB-ERR -# RUN: llvm-readelf --dynamic-table %t.bad-strtab 2>&1 >/dev/null | FileCheck -DFILE=%t.bad-strtab %s --check-prefix BAD-STRTAB-ERR -# BAD-STRTAB-ERR: warning: '[[FILE]]': Unable to parse DT_STRTAB: virtual address is not in any segment: 0x2000000 +# RUN: llvm-readobj --dynamic-table %t.bad-strtab 2>&1 >/dev/null | FileCheck %s --check-prefix BAD-STRTAB-ERR +# RUN: llvm-readelf --dynamic-table %t.bad-strtab 2>&1 >/dev/null | FileCheck %s --check-prefix BAD-STRTAB-ERR +# BAD-STRTAB-ERR: warning: Unable to parse DT_STRTAB: virtual address is not in any segment: 0x2000000 # RUN: llvm-readobj --dynamic-table --needed-libs %t.bad-strtab | FileCheck %s --check-prefixes=BAD-STRTAB,BAD-STRTAB-LLVM # RUN: llvm-readelf --dynamic-table --needed-libs %t.bad-strtab | FileCheck %s --check-prefixes=BAD-STRTAB,BAD-STRTAB-GNU @@ -206,10 +206,10 @@ ProgramHeaders: ## Test handling of other d_ptr tags pointing outside the file's address space. # RUN: yaml2obj %s --docnum=5 -o %t.bad-rela -# RUN: llvm-readobj --dynamic-table %t.bad-rela 2>&1 | FileCheck -DFILE=%t.bad-rela %s --check-prefixes=CHECK,BAD-RELA -# RUN: llvm-readelf --dynamic-table %t.bad-rela 2>&1 | FileCheck -DFILE=%t.bad-rela %s --check-prefixes=CHECK,BAD-RELA-GNU +# RUN: llvm-readobj --dynamic-table %t.bad-rela 2>&1 | FileCheck %s --check-prefixes=CHECK,BAD-RELA +# RUN: llvm-readelf --dynamic-table %t.bad-rela 2>&1 | FileCheck %s --check-prefixes=CHECK,BAD-RELA-GNU -# CHECK: warning: '[[FILE]]': Unable to parse DT_RELA: virtual address is not in any segment: 0x1000000 +# CHECK: warning: Unable to parse DT_RELA: virtual address is not in any segment: 0x1000000 # BAD-RELA: DynamicSection [ (2 entries) # BAD-RELA-NEXT: Tag Type Name/Value diff --git a/llvm/test/tools/llvm-readobj/elf-dynamic-not-in-pt-dynamic.test b/llvm/test/tools/llvm-readobj/elf-dynamic-not-in-pt-dynamic.test index 163e610..482d683 100644 --- a/llvm/test/tools/llvm-readobj/elf-dynamic-not-in-pt-dynamic.test +++ b/llvm/test/tools/llvm-readobj/elf-dynamic-not-in-pt-dynamic.test @@ -3,11 +3,11 @@ # RUN: yaml2obj %s -o %t.o # RUN: llvm-readobj --dynamic-table %t.o 2>&1 \ -# RUN: | FileCheck -DFILE=%t.o --check-prefixes=WARNING,LLVM %s +# RUN: | FileCheck --check-prefixes=WARNING,LLVM %s # RUN: llvm-readelf --dynamic-table %t.o 2>&1 \ -# RUN: | FileCheck -DFILE=%t.o --check-prefixes=WARNING,GNU %s +# RUN: | FileCheck --check-prefixes=WARNING,GNU %s -# WARNING: warning: '[[FILE]]': The SHT_DYNAMIC section '.dynamic' is not contained within the PT_DYNAMIC segment +# WARNING: warning: The SHT_DYNAMIC section '.dynamic' is not contained within the PT_DYNAMIC segment # LLVM: DynamicSection [ (2 entries) # LLVM-NEXT: Tag Type Name/Value diff --git a/llvm/test/tools/llvm-readobj/elf-malformed-pt-dynamic.test b/llvm/test/tools/llvm-readobj/elf-malformed-pt-dynamic.test index a6aa291..c234d48 100644 --- a/llvm/test/tools/llvm-readobj/elf-malformed-pt-dynamic.test +++ b/llvm/test/tools/llvm-readobj/elf-malformed-pt-dynamic.test @@ -13,14 +13,14 @@ # within the file. # RUN: cp %t.stripped %t.truncated1 # RUN: %python -c "with open(r'%t.truncated1', 'r+') as f: f.truncate(0x1001)" -# RUN: llvm-readobj %t.truncated1 --dynamic-table 2>&1 | FileCheck -DFILE=%t.truncated1 %s +# RUN: llvm-readobj %t.truncated1 --dynamic-table 2>&1 | FileCheck %s # Test case where the offset is too large to be in the file. # RUN: cp %t.stripped %t.truncated2 # RUN: %python -c "with open(r'%t.truncated2', 'r+') as f: f.truncate(0xFFF)" -# RUN: llvm-readobj %t.truncated2 --dynamic-table 2>&1 | FileCheck -DFILE=%t.truncated2 %s +# RUN: llvm-readobj %t.truncated2 --dynamic-table 2>&1 | FileCheck %s -# CHECK: warning: '[[FILE]]': PT_DYNAMIC segment offset + size exceeds the size of the file +# CHECK: warning: PT_DYNAMIC segment offset + size exceeds the size of the file --- !ELF FileHeader: diff --git a/llvm/test/tools/llvm-readobj/elf-non-dynamic-in-pt-dynamic.test b/llvm/test/tools/llvm-readobj/elf-non-dynamic-in-pt-dynamic.test index 08bae94..37c4ad5 100644 --- a/llvm/test/tools/llvm-readobj/elf-non-dynamic-in-pt-dynamic.test +++ b/llvm/test/tools/llvm-readobj/elf-non-dynamic-in-pt-dynamic.test @@ -6,11 +6,11 @@ # RUN: yaml2obj --docnum=1 %s -o %t.o # RUN: llvm-readobj --dynamic-table %t.o 2>&1 \ -# RUN: | FileCheck %s --DFILE=%t.o --check-prefixes=WARNING,LLVM +# RUN: | FileCheck %s --check-prefixes=WARNING,LLVM # RUN: llvm-readelf --dynamic-table %t.o 2>&1 \ -# RUN: | FileCheck %s --DFILE=%t.o --check-prefixes=WARNING,GNU +# RUN: | FileCheck %s --check-prefixes=WARNING,GNU -# WARNING: warning: '[[FILE]]': The SHT_DYNAMIC section '.dynamic' is not at the start of PT_DYNAMIC segment +# WARNING: warning: The SHT_DYNAMIC section '.dynamic' is not at the start of PT_DYNAMIC segment # LLVM: DynamicSection [ (2 entries) # LLVM-NEXT: Tag Type Name/Value diff --git a/llvm/test/tools/llvm-readobj/hex-dump.test b/llvm/test/tools/llvm-readobj/hex-dump.test index 4088fa5..e98aefd 100644 --- a/llvm/test/tools/llvm-readobj/hex-dump.test +++ b/llvm/test/tools/llvm-readobj/hex-dump.test @@ -24,12 +24,12 @@ # RUN: llvm-readobj -x 9 -x 9 -x .strtab -x .strtab %p/Inputs/trivial.obj.elf-x86-64 2>&1 | \ # RUN: FileCheck %s --check-prefix=ELF # RUN: llvm-readobj -x 9 -x .strtab -x 10 -x not_exist \ -# RUN: %p/Inputs/trivial.obj.elf-x86-64 2>&1 | FileCheck %s -DFILE=%p/Inputs/trivial.obj.elf-x86-64 --check-prefixes=ELF-WARN,ELF +# RUN: %p/Inputs/trivial.obj.elf-x86-64 2>&1 | FileCheck %s --check-prefixes=ELF-WARN,ELF # ELF-SEC: [ 9] .strtab -# ELF-WARN: warning: '[[FILE]]': could not find section 'not_exist' -# ELF-WARN: warning: '[[FILE]]': could not find section 10 +# ELF-WARN: warning: could not find section 'not_exist' +# ELF-WARN: warning: could not find section 10 # ELF: Hex dump of section '.strtab': # ELF-NEXT: 0x00000000 00747269 7669616c 2e6c6c00 6d61696e .trivial.ll.main # ELF-NEXT: 0x00000010 002e4c2e 73747200 70757473 00536f6d ..L.str.puts.Som diff --git a/llvm/test/tools/llvm-readobj/mips-got.test b/llvm/test/tools/llvm-readobj/mips-got.test index e6e21ad..ee5ba2b 100644 --- a/llvm/test/tools/llvm-readobj/mips-got.test +++ b/llvm/test/tools/llvm-readobj/mips-got.test @@ -1,5 +1,5 @@ RUN: not llvm-readobj --mips-plt-got %p/Inputs/relocs.obj.elf-mips 2>&1 | \ -RUN: FileCheck %s -DFILE=%p/Inputs/relocs.obj.elf-mips -check-prefix GOT-OBJ +RUN: FileCheck %s -check-prefix GOT-OBJ RUN: llvm-readobj --mips-plt-got %p/Inputs/dynamic-table-exe.mips | \ RUN: FileCheck %s -check-prefix GOT-EXE RUN: llvm-readobj --mips-plt-got %p/Inputs/dynamic-table-so.mips | \ @@ -12,7 +12,7 @@ RUN: llvm-readobj --mips-plt-got %p/Inputs/got-static.exe.mips | \ RUN: FileCheck %s -check-prefix GOT-STATIC RUN: not llvm-readelf --mips-plt-got %p/Inputs/relocs.obj.elf-mips 2>&1 | \ -RUN: FileCheck %s -DFILE=%p/Inputs/relocs.obj.elf-mips -check-prefix GNU-GOT-OBJ +RUN: FileCheck %s -check-prefix GNU-GOT-OBJ RUN: llvm-readelf --mips-plt-got %p/Inputs/dynamic-table-exe.mips | \ RUN: FileCheck %s --strict-whitespace -check-prefix GNU-GOT-EXE RUN: llvm-readelf --mips-plt-got %p/Inputs/dynamic-table-so.mips | \ @@ -24,7 +24,7 @@ RUN: FileCheck %s --strict-whitespace -check-prefix GNU-GOT-EMPTY RUN: llvm-readelf --mips-plt-got %p/Inputs/got-static.exe.mips | \ RUN: FileCheck %s --strict-whitespace -check-prefix GNU-GOT-STATIC -GOT-OBJ: error: '[[FILE]]': Cannot find .got section +GOT-OBJ: error: Cannot find .got section GOT-EXE: Primary GOT { GOT-EXE-NEXT: Canonical gp value: 0x418880 @@ -380,7 +380,7 @@ GOT-STATIC-NEXT: } GOT-STATIC-NEXT: ] GOT-STATIC-NEXT: } -GNU-GOT-OBJ: error: '[[FILE]]': Cannot find .got section +GNU-GOT-OBJ: error: Cannot find .got section GNU-GOT-EXE: Primary GOT: GNU-GOT-EXE-NEXT: Canonical gp value: 00418880 diff --git a/llvm/test/tools/llvm-readobj/note-core-ntfile-bad.test b/llvm/test/tools/llvm-readobj/note-core-ntfile-bad.test index 24ee345..7759c55 100644 --- a/llvm/test/tools/llvm-readobj/note-core-ntfile-bad.test +++ b/llvm/test/tools/llvm-readobj/note-core-ntfile-bad.test @@ -8,8 +8,8 @@ # using the assembly shown with each test case. # RUN: yaml2obj --docnum=1 %s -o %t1.o -# RUN: llvm-readelf -n %t1.o 2>&1 | FileCheck -DFILE=%t1.o %s --check-prefix=ERR-HEADER-SHORT -# ERR-HEADER-SHORT: warning: '[[FILE]]': malformed note: header too short +# RUN: llvm-readelf -n %t1.o 2>&1 | FileCheck %s --check-prefix=ERR-HEADER-SHORT +# ERR-HEADER-SHORT: warning: malformed note: header too short # .section ".note.foo", "a" # .align 4 @@ -38,8 +38,8 @@ ProgramHeaders: - Section: .note.foo # RUN: yaml2obj --docnum=2 %s -o %t2.o -# RUN: llvm-readelf -n %t2.o 2>&1 | FileCheck -DFILE=%t2.o %s --check-prefix=ERR-NULL-TERM -# ERR-NULL-TERM: warning: '[[FILE]]': malformed note: not NUL terminated +# RUN: llvm-readelf -n %t2.o 2>&1 | FileCheck %s --check-prefix=ERR-NULL-TERM +# ERR-NULL-TERM: warning: malformed note: not NUL terminated # .section ".note.foo", "a" # .align 4 @@ -73,8 +73,8 @@ ProgramHeaders: - Section: .note.foo # RUN: yaml2obj --docnum=3 %s -o %t3.o -# RUN: llvm-readelf -n %t3.o 2>&1 | FileCheck -DFILE=%t3.o %s --check-prefix=ERR-FILE-COUNT -# ERR-FILE-COUNT: warning: '[[FILE]]': malformed note: too short for number of files +# RUN: llvm-readelf -n %t3.o 2>&1 | FileCheck %s --check-prefix=ERR-FILE-COUNT +# ERR-FILE-COUNT: warning: malformed note: too short for number of files # .section ".note.foo", "a" # .align 4 @@ -108,8 +108,8 @@ ProgramHeaders: - Section: .note.foo # RUN: yaml2obj --docnum=4 %s -o %t4.o -# RUN: llvm-readelf -n %t4.o 2>&1 | FileCheck -DFILE=%t4.o %s --check-prefix=ERR-FILE-END-EARLY -# ERR-FILE-END-EARLY: warning: '[[FILE]]': malformed note: too few filenames +# RUN: llvm-readelf -n %t4.o 2>&1 | FileCheck %s --check-prefix=ERR-FILE-END-EARLY +# ERR-FILE-END-EARLY: warning: malformed note: too few filenames # .section ".note.foo", "a" # .align 4 diff --git a/llvm/test/tools/llvm-readobj/string-dump.test b/llvm/test/tools/llvm-readobj/string-dump.test index cfd9a03..db1aec0 100644 --- a/llvm/test/tools/llvm-readobj/string-dump.test +++ b/llvm/test/tools/llvm-readobj/string-dump.test @@ -51,14 +51,14 @@ # CHECK-NEXT: [ 3] null{{$}} # CHECK-NOT: {{.}} -# RUN: llvm-readobj --string-dump=does_not_exist %t 2>&1 | FileCheck -DFILE=%t %s --check-prefix=WARN1 -# RUN: llvm-readobj --string-dump=42 %t 2>&1 | FileCheck %s -DFILE=%t --check-prefix=WARN2 +# RUN: llvm-readobj --string-dump=does_not_exist %t 2>&1 | FileCheck %s --check-prefix=WARN1 +# RUN: llvm-readobj --string-dump=42 %t 2>&1 | FileCheck %s --check-prefix=WARN2 -# RUN: llvm-readelf --string-dump=does_not_exist %t 2>&1 | FileCheck -DFILE=%t %s --check-prefix=WARN1 -# RUN: llvm-readelf --string-dump=42 %t 2>&1 | FileCheck %s -DFILE=%t --check-prefix=WARN2 +# RUN: llvm-readelf --string-dump=does_not_exist %t 2>&1 | FileCheck %s --check-prefix=WARN1 +# RUN: llvm-readelf --string-dump=42 %t 2>&1 | FileCheck %s --check-prefix=WARN2 -# WARN1: warning: '[[FILE]]': could not find section 'does_not_exist' -# WARN2: warning: '[[FILE]]': could not find section 42 +# WARN1: warning: could not find section 'does_not_exist' +# WARN2: warning: could not find section 42 --- !ELF FileHeader: diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp index 65f2c37..4c37d26 100644 --- a/llvm/tools/llvm-readobj/COFFDumper.cpp +++ b/llvm/tools/llvm-readobj/COFFDumper.cpp @@ -632,14 +632,12 @@ void COFFDumper::printFileHeaders() { // Print PE header. This header does not exist if this is an object file and // not an executable. const pe32_header *PEHeader = nullptr; - if (std::error_code EC = Obj->getPE32Header(PEHeader)) - reportError(EC, Obj->getFileName()); + error(Obj->getPE32Header(PEHeader)); if (PEHeader) printPEHeader(PEHeader); const pe32plus_header *PEPlusHeader = nullptr; - if (std::error_code EC = Obj->getPE32PlusHeader(PEPlusHeader)) - reportError(EC, Obj->getFileName()); + error(Obj->getPE32PlusHeader(PEPlusHeader)); if (PEPlusHeader) printPEHeader(PEPlusHeader); @@ -734,9 +732,7 @@ void COFFDumper::printCOFFDebugDirectory() { if (D.Type == COFF::IMAGE_DEBUG_TYPE_CODEVIEW) { const codeview::DebugInfo *DebugInfo; StringRef PDBFileName; - if (std::error_code EC = Obj->getDebugPDBInfo(&D, DebugInfo, PDBFileName)) - reportError(EC, Obj->getFileName()); - + error(Obj->getDebugPDBInfo(&D, DebugInfo, PDBFileName)); DictScope PDBScope(W, "PDBInfo"); W.printHex("PDBSignature", DebugInfo->Signature.CVSignature); if (DebugInfo->Signature.CVSignature == OMF::Signature::PDB70) { @@ -748,9 +744,8 @@ void COFFDumper::printCOFFDebugDirectory() { // FIXME: Type values of 12 and 13 are commonly observed but are not in // the documented type enum. Figure out what they mean. ArrayRef RawData; - if (std::error_code EC = Obj->getRvaAndSizeAsBytes(D.AddressOfRawData, - D.SizeOfData, RawData)) - reportError(EC, Obj->getFileName()); + error( + Obj->getRvaAndSizeAsBytes(D.AddressOfRawData, D.SizeOfData, RawData)); W.printBinaryBlock("RawData", RawData); } } @@ -759,11 +754,8 @@ void COFFDumper::printCOFFDebugDirectory() { void COFFDumper::printRVATable(uint64_t TableVA, uint64_t Count, uint64_t EntrySize, PrintExtraCB PrintExtra) { uintptr_t TableStart, TableEnd; - if (std::error_code EC = Obj->getVaPtr(TableVA, TableStart)) - reportError(EC, Obj->getFileName()); - if (std::error_code EC = - Obj->getVaPtr(TableVA + Count * EntrySize - 1, TableEnd)) - reportError(EC, Obj->getFileName()); + error(Obj->getVaPtr(TableVA, TableStart)); + error(Obj->getVaPtr(TableVA + Count * EntrySize - 1, TableEnd)); TableEnd++; for (uintptr_t I = TableStart; I < TableEnd; I += EntrySize) { uint32_t RVA = *reinterpret_cast(I); @@ -967,7 +959,7 @@ void COFFDumper::printCodeViewSymbolSection(StringRef SectionName, W.printHex("Magic", Magic); if (Magic != COFF::DEBUG_SECTION_MAGIC) - reportError(object_error::parse_failed, Obj->getFileName()); + return error(object_error::parse_failed); BinaryStreamReader FSReader(Data, support::little); initializeFileAndStringTables(FSReader); @@ -993,7 +985,7 @@ void COFFDumper::printCodeViewSymbolSection(StringRef SectionName, // Get the contents of the subsection. if (SubSectionSize > Data.size()) - return reportError(object_error::parse_failed, Obj->getFileName()); + return error(object_error::parse_failed); StringRef Contents = Data.substr(0, SubSectionSize); // Add SubSectionSize to the current offset and align that offset to find @@ -1002,7 +994,7 @@ void COFFDumper::printCodeViewSymbolSection(StringRef SectionName, size_t NextOffset = SectionOffset + SubSectionSize; NextOffset = alignTo(NextOffset, 4); if (NextOffset > SectionContents.size()) - return reportError(object_error::parse_failed, Obj->getFileName()); + return error(object_error::parse_failed); Data = SectionContents.drop_front(NextOffset); // Optionally print the subsection bytes in case our parsing gets confused @@ -1032,19 +1024,17 @@ void COFFDumper::printCodeViewSymbolSection(StringRef SectionName, if (SubSectionSize < 12) { // There should be at least three words to store two function // relocations and size of the code. - reportError(object_error::parse_failed, Obj->getFileName()); + error(object_error::parse_failed); return; } StringRef LinkageName; - if (std::error_code EC = resolveSymbolName(Obj->getCOFFSection(Section), - SectionOffset, LinkageName)) - reportError(EC, Obj->getFileName()); - + error(resolveSymbolName(Obj->getCOFFSection(Section), SectionOffset, + LinkageName)); W.printString("LinkageName", LinkageName); if (FunctionLineTables.count(LinkageName) != 0) { // Saw debug info for this function already? - reportError(object_error::parse_failed, Obj->getFileName()); + error(object_error::parse_failed); return; } @@ -1061,10 +1051,8 @@ void COFFDumper::printCodeViewSymbolSection(StringRef SectionName, reportError(std::move(E), Obj->getFileName()); StringRef LinkageName; - if (std::error_code EC = - resolveSymbolName(Obj->getCOFFSection(Section), SectionContents, - FrameData.getRelocPtr(), LinkageName)) - reportError(EC, Obj->getFileName()); + error(resolveSymbolName(Obj->getCOFFSection(Section), SectionContents, + FrameData.getRelocPtr(), LinkageName)); W.printString("LinkageName", LinkageName); // To find the active frame description, search this array for the @@ -1134,7 +1122,7 @@ void COFFDumper::printCodeViewSymbolSection(StringRef SectionName, uint32_t ColumnIndex = 0; for (const auto &Line : Entry.LineNumbers) { if (Line.Offset >= LineInfo.header()->CodeSize) { - reportError(object_error::parse_failed, Obj->getFileName()); + error(object_error::parse_failed); return; } @@ -1171,9 +1159,10 @@ void COFFDumper::printCodeViewSymbolsSubsection(StringRef Subsection, CompilationCPUType, opts::CodeViewSubsectionBytes); CVSymbolArray Symbols; BinaryStreamReader Reader(BinaryData, llvm::support::little); - if (Error E = Reader.readArray(Symbols, Reader.getLength())) { + if (auto EC = Reader.readArray(Symbols, Reader.getLength())) { + consumeError(std::move(EC)); W.flush(); - reportError(std::move(E), Obj->getFileName()); + error(object_error::parse_failed); } if (Error E = CVSD.dump(Symbols)) { @@ -1229,13 +1218,13 @@ void COFFDumper::printCodeViewInlineeLines(StringRef Subsection) { StringRef COFFDumper::getFileNameForFileOffset(uint32_t FileOffset) { // The file checksum subsection should precede all references to it. if (!CVFileChecksumTable.valid() || !CVStringTable.valid()) - reportError(object_error::parse_failed, Obj->getFileName()); + error(object_error::parse_failed); auto Iter = CVFileChecksumTable.getArray().at(FileOffset); // Check if the file checksum table offset is valid. if (Iter == CVFileChecksumTable.end()) - reportError(object_error::parse_failed, Obj->getFileName()); + error(object_error::parse_failed); return unwrapOrError(Obj->getFileName(), CVStringTable.getString(Iter->FileNameOffset)); @@ -1259,14 +1248,14 @@ void COFFDumper::mergeCodeViewTypes(MergingTypeTableBuilder &CVIDs, reportError(std::move(E), Obj->getFileName()); if (Magic != 4) - reportError(object_error::parse_failed, Obj->getFileName()); + error(object_error::parse_failed); CVTypeArray Types; BinaryStreamReader Reader(Data, llvm::support::little); if (auto EC = Reader.readArray(Types, Reader.getLength())) { consumeError(std::move(EC)); W.flush(); - reportError(object_error::parse_failed, Obj->getFileName()); + error(object_error::parse_failed); } SmallVector SourceToDest; Optional PCHSignature; @@ -1301,7 +1290,7 @@ void COFFDumper::printCodeViewTypeSection(StringRef SectionName, W.printHex("Magic", Magic); if (Magic != COFF::DEBUG_SECTION_MAGIC) - reportError(object_error::parse_failed, Obj->getFileName()); + return error(object_error::parse_failed); Types.reset(Data, 100); @@ -1397,9 +1386,7 @@ void COFFDumper::printRelocation(const SectionRef &Section, int64_t SymbolIndex = -1; if (Symbol != Obj->symbol_end()) { Expected SymbolNameOrErr = Symbol->getName(); - if (!SymbolNameOrErr) - reportError(SymbolNameOrErr.takeError(), Obj->getFileName()); - + error(errorToErrorCode(SymbolNameOrErr.takeError())); SymbolName = *SymbolNameOrErr; SymbolIndex = Obj->getSymbolIndex(Obj->getCOFFSymbol(*Symbol)); } @@ -1476,8 +1463,7 @@ void COFFDumper::printSymbol(const SymbolRef &Sym) { for (uint8_t I = 0; I < Symbol.getNumberOfAuxSymbols(); ++I) { if (Symbol.isFunctionDefinition()) { const coff_aux_function_definition *Aux; - if (std::error_code EC = getSymbolAuxData(Obj, Symbol, I, Aux)) - reportError(EC, Obj->getFileName()); + error(getSymbolAuxData(Obj, Symbol, I, Aux)); DictScope AS(W, "AuxFunctionDef"); W.printNumber("TagIndex", Aux->TagIndex); @@ -1487,15 +1473,14 @@ void COFFDumper::printSymbol(const SymbolRef &Sym) { } else if (Symbol.isAnyUndefined()) { const coff_aux_weak_external *Aux; - if (std::error_code EC = getSymbolAuxData(Obj, Symbol, I, Aux)) - reportError(EC, Obj->getFileName()); + error(getSymbolAuxData(Obj, Symbol, I, Aux)); Expected Linked = Obj->getSymbol(Aux->TagIndex); StringRef LinkedName; std::error_code EC = errorToErrorCode(Linked.takeError()); if (EC || (EC = Obj->getSymbolName(*Linked, LinkedName))) { LinkedName = ""; - reportError(EC, Obj->getFileName()); + error(EC); } DictScope AS(W, "AuxWeakExternal"); @@ -1505,8 +1490,8 @@ void COFFDumper::printSymbol(const SymbolRef &Sym) { } else if (Symbol.isFileRecord()) { const char *FileName; - if (std::error_code EC = getSymbolAuxData(Obj, Symbol, I, FileName)) - reportError(EC, Obj->getFileName()); + error(getSymbolAuxData(Obj, Symbol, I, FileName)); + DictScope AS(W, "AuxFileRecord"); StringRef Name(FileName, Symbol.getNumberOfAuxSymbols() * @@ -1515,8 +1500,7 @@ void COFFDumper::printSymbol(const SymbolRef &Sym) { break; } else if (Symbol.isSectionDefinition()) { const coff_aux_section_definition *Aux; - if (std::error_code EC = getSymbolAuxData(Obj, Symbol, I, Aux)) - reportError(EC, Obj->getFileName()); + error(getSymbolAuxData(Obj, Symbol, I, Aux)); int32_t AuxNumber = Aux->getNumber(Symbol.isBigObj()); @@ -1533,7 +1517,7 @@ void COFFDumper::printSymbol(const SymbolRef &Sym) { const coff_section *Assoc; StringRef AssocName = ""; if (std::error_code EC = Obj->getSection(AuxNumber, Assoc)) - reportError(EC, Obj->getFileName()); + error(EC); Expected Res = getSectionName(Obj, AuxNumber, Assoc); if (!Res) reportError(Res.takeError(), Obj->getFileName()); @@ -1543,8 +1527,7 @@ void COFFDumper::printSymbol(const SymbolRef &Sym) { } } else if (Symbol.isCLRToken()) { const coff_aux_clr_token *Aux; - if (std::error_code EC = getSymbolAuxData(Obj, Symbol, I, Aux)) - reportError(EC, Obj->getFileName()); + error(getSymbolAuxData(Obj, Symbol, I, Aux)); Expected ReferredSym = Obj->getSymbol(Aux->SymbolTableIndex); @@ -1552,7 +1535,7 @@ void COFFDumper::printSymbol(const SymbolRef &Sym) { std::error_code EC = errorToErrorCode(ReferredSym.takeError()); if (EC || (EC = Obj->getSymbolName(*ReferredSym, ReferredName))) { ReferredName = ""; - reportError(EC, Obj->getFileName()); + error(EC); } DictScope AS(W, "AuxCLRToken"); @@ -1619,11 +1602,9 @@ void COFFDumper::printImportedSymbols( iterator_range Range) { for (const ImportedSymbolRef &I : Range) { StringRef Sym; - if (std::error_code EC = I.getSymbolName(Sym)) - reportError(EC, Obj->getFileName()); + error(I.getSymbolName(Sym)); uint16_t Ordinal; - if (std::error_code EC = I.getOrdinal(Ordinal)) - reportError(EC, Obj->getFileName()); + error(I.getOrdinal(Ordinal)); W.printNumber("Symbol", Sym, Ordinal); } } @@ -1635,17 +1616,12 @@ void COFFDumper::printDelayImportedSymbols( for (const ImportedSymbolRef &S : Range) { DictScope Import(W, "Import"); StringRef Sym; - if (std::error_code EC = S.getSymbolName(Sym)) - reportError(EC, Obj->getFileName()); - + error(S.getSymbolName(Sym)); uint16_t Ordinal; - if (std::error_code EC = S.getOrdinal(Ordinal)) - reportError(EC, Obj->getFileName()); + error(S.getOrdinal(Ordinal)); W.printNumber("Symbol", Sym, Ordinal); - uint64_t Addr; - if (std::error_code EC = I.getImportAddress(Index++, Addr)) - reportError(EC, Obj->getFileName()); + error(I.getImportAddress(Index++, Addr)); W.printHex("Address", Addr); } } @@ -1655,16 +1631,13 @@ void COFFDumper::printCOFFImports() { for (const ImportDirectoryEntryRef &I : Obj->import_directories()) { DictScope Import(W, "Import"); StringRef Name; - if (std::error_code EC = I.getName(Name)) - reportError(EC, Obj->getFileName()); + error(I.getName(Name)); W.printString("Name", Name); uint32_t ILTAddr; - if (std::error_code EC = I.getImportLookupTableRVA(ILTAddr)) - reportError(EC, Obj->getFileName()); + error(I.getImportLookupTableRVA(ILTAddr)); W.printHex("ImportLookupTableRVA", ILTAddr); uint32_t IATAddr; - if (std::error_code EC = I.getImportAddressTableRVA(IATAddr)) - reportError(EC, Obj->getFileName()); + error(I.getImportAddressTableRVA(IATAddr)); W.printHex("ImportAddressTableRVA", IATAddr); // The import lookup table can be missing with certain older linkers, so // fall back to the import address table in that case. @@ -1678,12 +1651,10 @@ void COFFDumper::printCOFFImports() { for (const DelayImportDirectoryEntryRef &I : Obj->delay_import_directories()) { DictScope Import(W, "DelayImport"); StringRef Name; - if (std::error_code EC = I.getName(Name)) - reportError(EC, Obj->getFileName()); + error(I.getName(Name)); W.printString("Name", Name); const delay_import_directory_table_entry *Table; - if (std::error_code EC = I.getDelayImportTable(Table)) - reportError(EC, Obj->getFileName()); + error(I.getDelayImportTable(Table)); W.printHex("Attributes", Table->Attributes); W.printHex("ModuleHandle", Table->ModuleHandle); W.printHex("ImportAddressTable", Table->DelayImportAddressTable); @@ -1701,12 +1672,9 @@ void COFFDumper::printCOFFExports() { StringRef Name; uint32_t Ordinal, RVA; - if (std::error_code EC = E.getSymbolName(Name)) - reportError(EC, Obj->getFileName()); - if (std::error_code EC = E.getOrdinal(Ordinal)) - reportError(EC, Obj->getFileName()); - if (std::error_code EC = E.getExportRVA(RVA)) - reportError(EC, Obj->getFileName()); + error(E.getSymbolName(Name)); + error(E.getOrdinal(Ordinal)); + error(E.getExportRVA(RVA)); W.printNumber("Ordinal", Ordinal); W.printString("Name", Name); @@ -1744,10 +1712,8 @@ void COFFDumper::printCOFFBaseReloc() { for (const BaseRelocRef &I : Obj->base_relocs()) { uint8_t Type; uint32_t RVA; - if (std::error_code EC = I.getRVA(RVA)) - reportError(EC, Obj->getFileName()); - if (std::error_code EC = I.getType(Type)) - reportError(EC, Obj->getFileName()); + error(I.getRVA(RVA)); + error(I.getType(Type)); DictScope Import(W, "Entry"); W.printString("Type", getBaseRelocTypeName(Type)); W.printHex("Address", RVA); @@ -1831,7 +1797,7 @@ void COFFDumper::printResourceDirectoryTable( } std::string EntryNameString; if (!llvm::convertUTF16ToUTF8String(RawEntryNameString, EntryNameString)) - reportError(object_error::parse_failed, Obj->getFileName()); + error(object_error::parse_failed); OS << ": "; OS << EntryNameString; } else { @@ -1939,14 +1905,14 @@ void COFFDumper::printAddrsig() { const char *Err; uint64_t SymIndex = decodeULEB128(Cur, &Size, End, &Err); if (Err) - reportError(createError(Err), Obj->getFileName()); + reportError(Err); Expected Sym = Obj->getSymbol(SymIndex); StringRef SymName; std::error_code EC = errorToErrorCode(Sym.takeError()); if (EC || (EC = Obj->getSymbolName(*Sym, SymName))) { SymName = ""; - reportError(EC, Obj->getFileName()); + error(EC); } W.printNumber("Sym", SymName, SymIndex); diff --git a/llvm/tools/llvm-readobj/DwarfCFIEHPrinter.h b/llvm/tools/llvm-readobj/DwarfCFIEHPrinter.h index fdd01e1..440b644 100644 --- a/llvm/tools/llvm-readobj/DwarfCFIEHPrinter.h +++ b/llvm/tools/llvm-readobj/DwarfCFIEHPrinter.h @@ -44,12 +44,12 @@ public: void printUnwindInformation() const; }; -template -static const typename object::ELFObjectFile::Elf_Shdr * -findSectionByAddress(const object::ELFObjectFile *ObjF, uint64_t Addr) { - auto Sections = ObjF->getELFFile()->sections(); +template +static const typename ELFO::Elf_Shdr *findSectionByAddress(const ELFO *Obj, + uint64_t Addr) { + auto Sections = Obj->sections(); if (Error E = Sections.takeError()) - reportError(std::move(E), ObjF->getFileName()); + reportError(toString(std::move(E))); for (const auto &Shdr : *Sections) if (Shdr.sh_addr == Addr) @@ -64,15 +64,13 @@ void PrinterContext::printUnwindInformation() const { auto PHs = Obj->program_headers(); if (Error E = PHs.takeError()) - reportError(std::move(E), ObjF->getFileName()); + reportError(toString(std::move(E))); for (const auto &Phdr : *PHs) { if (Phdr.p_type == ELF::PT_GNU_EH_FRAME) { EHFramePhdr = &Phdr; if (Phdr.p_memsz != Phdr.p_filesz) - reportError(object::createError( - "p_memsz does not match p_filesz for GNU_EH_FRAME"), - ObjF->getFileName()); + reportError("p_memsz does not match p_filesz for GNU_EH_FRAME"); break; } } @@ -83,12 +81,12 @@ void PrinterContext::printUnwindInformation() const { auto Sections = Obj->sections(); if (Error E = Sections.takeError()) - reportError(std::move(E), ObjF->getFileName()); + reportError(toString(std::move(E))); for (const auto &Shdr : *Sections) { auto SectionName = Obj->getSectionName(&Shdr); if (Error E = SectionName.takeError()) - reportError(std::move(E), ObjF->getFileName()); + reportError(toString(std::move(E))); if (*SectionName == ".eh_frame") printEHFrame(&Shdr); @@ -105,11 +103,11 @@ void PrinterContext::printEHFrameHdr(uint64_t EHFrameHdrOffset, W.startLine() << format("Size: 0x%" PRIx64 "\n", EHFrameHdrSize); const object::ELFFile *Obj = ObjF->getELFFile(); - const auto *EHFrameHdrShdr = findSectionByAddress(ObjF, EHFrameHdrAddress); + const auto *EHFrameHdrShdr = findSectionByAddress(Obj, EHFrameHdrAddress); if (EHFrameHdrShdr) { auto SectionName = Obj->getSectionName(EHFrameHdrShdr); if (Error E = SectionName.takeError()) - reportError(std::move(E), ObjF->getFileName()); + reportError(toString(std::move(E))); W.printString("Corresponding Section", *SectionName); } @@ -126,27 +124,22 @@ void PrinterContext::printEHFrameHdr(uint64_t EHFrameHdrOffset, auto Version = DE.getU8(&Offset); W.printNumber("version", Version); if (Version != 1) - reportError( - object::createError("only version 1 of .eh_frame_hdr is supported"), - ObjF->getFileName()); + reportError("only version 1 of .eh_frame_hdr is supported"); uint64_t EHFramePtrEnc = DE.getU8(&Offset); W.startLine() << format("eh_frame_ptr_enc: 0x%" PRIx64 "\n", EHFramePtrEnc); if (EHFramePtrEnc != (dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4)) - reportError(object::createError("unexpected encoding eh_frame_ptr_enc"), - ObjF->getFileName()); + reportError("unexpected encoding eh_frame_ptr_enc"); uint64_t FDECountEnc = DE.getU8(&Offset); W.startLine() << format("fde_count_enc: 0x%" PRIx64 "\n", FDECountEnc); if (FDECountEnc != dwarf::DW_EH_PE_udata4) - reportError(object::createError("unexpected encoding fde_count_enc"), - ObjF->getFileName()); + reportError("unexpected encoding fde_count_enc"); uint64_t TableEnc = DE.getU8(&Offset); W.startLine() << format("table_enc: 0x%" PRIx64 "\n", TableEnc); if (TableEnc != (dwarf::DW_EH_PE_datarel | dwarf::DW_EH_PE_sdata4)) - reportError(object::createError("unexpected encoding table_enc"), - ObjF->getFileName()); + reportError("unexpected encoding table_enc"); auto EHFramePtr = DE.getSigned(&Offset, 4) + EHFrameHdrAddress + 4; W.startLine() << format("eh_frame_ptr: 0x%" PRIx64 "\n", EHFramePtr); @@ -165,8 +158,7 @@ void PrinterContext::printEHFrameHdr(uint64_t EHFrameHdrOffset, W.startLine() << format("address: 0x%" PRIx64 "\n", Address); if (InitialPC < PrevPC) - reportError(object::createError("initial_location is out of order"), - ObjF->getFileName()); + reportError("initial_location is out of order"); PrevPC = InitialPC; ++NumEntries; @@ -186,7 +178,7 @@ void PrinterContext::printEHFrame( const object::ELFFile *Obj = ObjF->getELFFile(); auto Result = Obj->getSectionContents(EHFrameShdr); if (Error E = Result.takeError()) - reportError(std::move(E), ObjF->getFileName()); + reportError(toString(std::move(E))); auto Contents = Result.get(); DWARFDataExtractor DE( diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 6e14c38..6dbe36e0 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -122,9 +122,9 @@ template class DumpStyle; /// the size, entity size and virtual address are different entries in arbitrary /// order (DT_REL, DT_RELSZ, DT_RELENT for example). struct DynRegionInfo { - DynRegionInfo(StringRef ObjName) : FileName(ObjName) {} - DynRegionInfo(const void *A, uint64_t S, uint64_t ES, StringRef ObjName) - : Addr(A), Size(S), EntSize(ES), FileName(ObjName) {} + DynRegionInfo() = default; + DynRegionInfo(const void *A, uint64_t S, uint64_t ES) + : Addr(A), Size(S), EntSize(ES) {} /// Address in current address space. const void *Addr = nullptr; @@ -133,18 +133,14 @@ struct DynRegionInfo { /// Size of each entity in the region. uint64_t EntSize = 0; - /// Name of the file. Used for error reporting. - StringRef FileName; - template ArrayRef getAsArrayRef() const { const Type *Start = reinterpret_cast(Addr); if (!Start) return {Start, Start}; if (EntSize != sizeof(Type) || Size % EntSize) { // TODO: Add a section index to this warning. - reportWarning(createError("invalid section size (" + Twine(Size) + - ") or entity size (" + Twine(EntSize) + ")"), - FileName); + reportWarning("invalid section size (" + Twine(Size) + + ") or entity size (" + Twine(EntSize) + ")"); return {Start, Start}; } return {Start, Start + (Size / EntSize)}; @@ -203,19 +199,18 @@ private: if (DRI.Addr < Obj->base() || reinterpret_cast(DRI.Addr) + DRI.Size > Obj->base() + Obj->getBufSize()) - reportError(llvm::object::object_error::parse_failed, - ObjF->getFileName()); + error(llvm::object::object_error::parse_failed); return DRI; } DynRegionInfo createDRIFrom(const Elf_Phdr *P, uintX_t EntSize) { - return checkDRI({ObjF->getELFFile()->base() + P->p_offset, P->p_filesz, - EntSize, ObjF->getFileName()}); + return checkDRI( + {ObjF->getELFFile()->base() + P->p_offset, P->p_filesz, EntSize}); } DynRegionInfo createDRIFrom(const Elf_Shdr *S) { - return checkDRI({ObjF->getELFFile()->base() + S->sh_offset, S->sh_size, - S->sh_entsize, ObjF->getFileName()}); + return checkDRI( + {ObjF->getELFFile()->base() + S->sh_offset, S->sh_size, S->sh_entsize}); } void loadDynamicTable(const ELFFile *Obj); @@ -367,7 +362,7 @@ public: // It does not print the same warning more than once. WarningHandler = [this](const Twine &Msg) { if (Warnings.insert(Msg.str()).second) - reportWarning(createError(Msg), FileName); + reportWarning(FileName, createError(Msg)); return Error::success(); }; } @@ -745,7 +740,7 @@ std::string ELFDumper::getStaticSymbolName(uint32_t Index) const { Elf_Sym_Range Syms = unwrapOrError(ObjF->getFileName(), Obj->symbols(DotSymtabSec)); if (Index >= Syms.size()) - reportError(createError("Invalid symbol index"), ObjF->getFileName()); + reportError("Invalid symbol index"); const Elf_Sym *Sym = &Syms[Index]; return maybeDemangle( unwrapOrError(ObjF->getFileName(), Sym->getName(StrTable))); @@ -766,7 +761,7 @@ StringRef ELFDumper::getSymbolVersionByIndex(StringRef StrTab, // Lookup this symbol in the version table. LoadVersionMap(); if (VersionIndex >= VersionMap.size() || VersionMap[VersionIndex].isNull()) - reportError(createError("Invalid version entry"), ObjF->getFileName()); + reportError("Invalid version entry"); const VersionMapEntry &Entry = VersionMap[VersionIndex]; // Get the version name string. @@ -780,7 +775,7 @@ StringRef ELFDumper::getSymbolVersionByIndex(StringRef StrTab, IsDefault = false; } if (NameOffset >= StrTab.size()) - reportError(createError("Invalid string offset"), ObjF->getFileName()); + reportError("Invalid string offset"); return StrTab.data() + NameOffset; } @@ -1433,9 +1428,8 @@ void ELFDumper::loadDynamicTable(const ELFFile *Obj) { // This allows us to dump the dynamic sections with a broken sh_entsize // field. if (DynamicSec) { - DynamicTable = - checkDRI({ObjF->getELFFile()->base() + DynamicSec->sh_offset, - DynamicSec->sh_size, sizeof(Elf_Dyn), ObjF->getFileName()}); + DynamicTable = checkDRI({ObjF->getELFFile()->base() + DynamicSec->sh_offset, + DynamicSec->sh_size, sizeof(Elf_Dyn)}); parseDynamicTable(); } @@ -1447,9 +1441,7 @@ void ELFDumper::loadDynamicTable(const ELFFile *Obj) { if (DynamicPhdr->p_offset + DynamicPhdr->p_filesz > ObjF->getMemoryBufferRef().getBufferSize()) { reportWarning( - createError( - "PT_DYNAMIC segment offset + size exceeds the size of the file"), - ObjF->getFileName()); + "PT_DYNAMIC segment offset + size exceeds the size of the file"); return; } @@ -1464,26 +1456,22 @@ void ELFDumper::loadDynamicTable(const ELFFile *Obj) { if (DynamicSec->sh_addr + DynamicSec->sh_size > DynamicPhdr->p_vaddr + DynamicPhdr->p_memsz || DynamicSec->sh_addr < DynamicPhdr->p_vaddr) - reportWarning(createError("The SHT_DYNAMIC section '" + Name + - "' is not contained within the " - "PT_DYNAMIC segment"), - ObjF->getFileName()); + reportWarning("The SHT_DYNAMIC section '" + Name + + "' is not contained within the " + "PT_DYNAMIC segment"); if (DynamicSec->sh_addr != DynamicPhdr->p_vaddr) - reportWarning(createError("The SHT_DYNAMIC section '" + Name + - "' is not at the start of " - "PT_DYNAMIC segment"), - ObjF->getFileName()); + reportWarning("The SHT_DYNAMIC section '" + Name + + "' is not at the start of " + "PT_DYNAMIC segment"); } template ELFDumper::ELFDumper(const object::ELFObjectFile *ObjF, - ScopedPrinter &Writer) - : ObjDumper(Writer), ObjF(ObjF), DynRelRegion(ObjF->getFileName()), - DynRelaRegion(ObjF->getFileName()), DynRelrRegion(ObjF->getFileName()), - DynPLTRelRegion(ObjF->getFileName()), DynSymRegion(ObjF->getFileName()), - DynamicTable(ObjF->getFileName()) { + ScopedPrinter &Writer) + : ObjDumper(Writer), ObjF(ObjF) { const ELFFile *Obj = ObjF->getELFFile(); + for (const Elf_Shdr &Sec : unwrapOrError(ObjF->getFileName(), Obj->sections())) { switch (Sec.sh_type) { @@ -1502,7 +1490,7 @@ ELFDumper::ELFDumper(const object::ELFObjectFile *ObjF, if (Expected E = Obj->getStringTableForSymtab(Sec)) DynamicStringTable = *E; else - reportWarning(E.takeError(), ObjF->getFileName()); + warn(E.takeError()); } break; case ELF::SHT_SYMTAB_SHNDX: @@ -1611,13 +1599,10 @@ template void ELFDumper::parseDynamicTable() { auto toMappedAddr = [&](uint64_t Tag, uint64_t VAddr) -> const uint8_t * { auto MappedAddrOrError = ObjF->getELFFile()->toMappedAddr(VAddr); if (!MappedAddrOrError) { - Error Err = - createError("Unable to parse DT_" + - Twine(getTypeString( - ObjF->getELFFile()->getHeader()->e_machine, Tag)) + - ": " + llvm::toString(MappedAddrOrError.takeError())); - - reportWarning(std::move(Err), ObjF->getFileName()); + reportWarning("Unable to parse DT_" + + Twine(getTypeString( + ObjF->getELFFile()->getHeader()->e_machine, Tag)) + + ": " + llvm::toString(MappedAddrOrError.takeError())); return nullptr; } return MappedAddrOrError.get(); @@ -1686,9 +1671,8 @@ template void ELFDumper::parseDynamicTable() { else if (Dyn.getVal() == DT_RELA) DynPLTRelRegion.EntSize = sizeof(Elf_Rela); else - reportError(createError(Twine("unknown DT_PLTREL value of ") + - Twine((uint64_t)Dyn.getVal())), - ObjF->getFileName()); + reportError(Twine("unknown DT_PLTREL value of ") + + Twine((uint64_t)Dyn.getVal())); break; case ELF::DT_JMPREL: DynPLTRelRegion.Addr = toMappedAddr(Dyn.getTag(), Dyn.getPtr()); @@ -2110,7 +2094,7 @@ template void ELFDumper::printGnuHashTable() { Elf_Sym_Range Syms = dynamic_symbols(); unsigned NumSyms = std::distance(Syms.begin(), Syms.end()); if (!NumSyms) - reportError(createError("No dynamic symbol section"), ObjF->getFileName()); + reportError("No dynamic symbol section"); W.printHexList("Values", GnuHashTable->values(NumSyms)); } @@ -2223,7 +2207,7 @@ MipsGOTParser::MipsGOTParser(const ELFO *Obj, StringRef FileName, if (IsStatic) { GotSec = findSectionByName(*Obj, FileName, ".got"); if (!GotSec) - reportError(createError("Cannot find .got section"), FileName); + reportError("Cannot find .got section"); ArrayRef Content = unwrapOrError(FileName, Obj->getSectionContents(GotSec)); @@ -2270,15 +2254,12 @@ MipsGOTParser::MipsGOTParser(const ELFO *Obj, StringRef FileName, size_t DynSymTotal = DynSyms.size(); if (*DtGotSym > DynSymTotal) - reportError( - createError("MIPS_GOTSYM exceeds a number of dynamic symbols"), - FileName); + reportError("MIPS_GOTSYM exceeds a number of dynamic symbols"); GotSec = findNotEmptySectionByAddress(Obj, FileName, *DtPltGot); if (!GotSec) - reportError(createError("There is no not empty GOT section at 0x" + - Twine::utohexstr(*DtPltGot)), - FileName); + reportError("There is no not empty GOT section at 0x" + + Twine::utohexstr(*DtPltGot)); LocalNum = *DtLocalGotNum; GlobalNum = DynSymTotal - *DtGotSym; @@ -2428,8 +2409,7 @@ MipsGOTParser::getPltSym(const Entry *E) const { template void ELFDumper::printMipsPLTGOT() { const ELFFile *Obj = ObjF->getELFFile(); if (Obj->getHeader()->e_machine != EM_MIPS) - reportError(createError("MIPS PLT GOT is available for MIPS targets only"), - ObjF->getFileName()); + reportError("MIPS PLT GOT is available for MIPS targets only"); MipsGOTParser Parser(Obj, ObjF->getFileName(), dynamic_table(), dynamic_symbols()); @@ -4512,7 +4492,7 @@ void GNUStyle::printNotes(const ELFFile *Obj) { if (Note) printCoreNote(OS, *Note); else - reportWarning(Note.takeError(), this->FileName); + warn(Note.takeError()); } } else if (!Descriptor.empty()) { OS << " description data:"; @@ -4576,6 +4556,7 @@ void DumpStyle::printFunctionStackSize( } } + StringRef FileStr = Obj->getFileName(); std::string FuncName = "?"; // A valid SymbolRef has a non-null object file pointer. if (FuncSym.BasicSymbolRef::getObject()) { @@ -4585,11 +4566,9 @@ void DumpStyle::printFunctionStackSize( FuncName = maybeDemangle(*FuncNameOrErr); else consumeError(FuncNameOrErr.takeError()); - } else { - reportWarning( - createError("could not identify function symbol for stack size entry"), - Obj->getFileName()); - } + } else + reportWarning(" '" + FileStr + + "': could not identify function symbol for stack size entry"); // Extract the size. The expectation is that Offset is pointing to the right // place, i.e. past the function address. @@ -4602,7 +4581,7 @@ void DumpStyle::printFunctionStackSize( createStringError(object_error::parse_failed, "could not extract a valid stack size in section %s", SectionName.data()), - Obj->getFileName()); + FileStr); printStackSizeEntry(StackSize, FuncName); } @@ -4640,14 +4619,13 @@ void DumpStyle::printStackSize(const ELFObjectFile *Obj, auto SectionOrErr = RelocSym->getSection(); if (!SectionOrErr) { - reportWarning( - createError("cannot identify the section for relocation symbol " + - SymName), - FileStr); + reportWarning(" '" + FileStr + + "': cannot identify the section for relocation symbol " + + SymName); + consumeError(SectionOrErr.takeError()); } else if (*SectionOrErr != FunctionSec) { - reportWarning(createError("relocation symbol " + SymName + - " is not in the expected section"), - FileStr); + reportWarning(" '" + FileStr + "': relocation symbol " + SymName + + " is not in the expected section"); // Pretend that the symbol is in the correct section and report its // stack size anyway. FunctionSec = **SectionOrErr; @@ -4735,7 +4713,7 @@ template void DumpStyle::printRelocatableStackSizes( const ELFObjectFile *Obj, std::function PrintHeader) { const ELFFile *EF = Obj->getELFFile(); - + StringRef FileStr = Obj->getFileName(); // Build a map between stack size sections and their corresponding relocation // sections. llvm::MapVector StackSizeRelocMap; @@ -4790,10 +4768,9 @@ void DumpStyle::printRelocatableStackSizes( consumeError(NameOrErr.takeError()); if (RelocSec == NullSection) { - reportWarning(createError("section " + StackSizeSectionName + - " does not have a corresponding " - "relocation section"), - Obj->getFileName()); + reportWarning(" '" + FileStr + "': section " + StackSizeSectionName + + " does not have a corresponding " + "relocation section"); continue; } @@ -4828,7 +4805,7 @@ void DumpStyle::printRelocatableStackSizes( createStringError(object_error::parse_failed, "unsupported relocation type in section %s: %s", RelocSectionName.data(), RelocName.data()), - Obj->getFileName()); + FileStr); } this->printStackSize(Obj, Reloc, FunctionSec, StackSizeSectionName, Resolver, Data); @@ -5248,10 +5225,9 @@ void LLVMStyle::printSectionHeaders(const ELFO *Obj) { this->FileName, Obj->getSection(&Sym, Symtab, this->dumper()->getShndxTable())); if (SymSec == &Sec) - printSymbol( - Obj, &Sym, + printSymbol(Obj, &Sym, unwrapOrError(this->FileName, Obj->symbols(Symtab)).begin(), - StrTable, false); + StrTable, false); } } @@ -5611,8 +5587,7 @@ void LLVMStyle::printAddrsig(const ELFFile *Obj) { const char *Err; uint64_t SymIndex = decodeULEB128(Cur, &Size, End, &Err); if (Err) - reportError(createError(Err), this->FileName); - + reportError(Err); W.printNumber("Sym", this->dumper()->getStaticSymbolName(SymIndex), SymIndex); Cur += Size; @@ -5721,7 +5696,7 @@ void LLVMStyle::printNotes(const ELFFile *Obj) { if (Note) printCoreNoteLLVMStyle(*Note, W); else - reportWarning(Note.takeError(), this->FileName); + warn(Note.takeError()); } } else if (!Descriptor.empty()) { W.printBinaryBlock("Description data", Descriptor); diff --git a/llvm/tools/llvm-readobj/MachODumper.cpp b/llvm/tools/llvm-readobj/MachODumper.cpp index 20a60b3..84f6740 100644 --- a/llvm/tools/llvm-readobj/MachODumper.cpp +++ b/llvm/tools/llvm-readobj/MachODumper.cpp @@ -556,7 +556,7 @@ void MachODumper::printRelocation(const MachOObjectFile *Obj, if (Symbol != Obj->symbol_end()) { Expected TargetNameOrErr = Symbol->getName(); if (!TargetNameOrErr) - reportError(TargetNameOrErr.takeError(), Obj->getFileName()); + error(errorToErrorCode(TargetNameOrErr.takeError())); TargetName = *TargetNameOrErr; } } else if (!IsScattered) { @@ -630,9 +630,7 @@ void MachODumper::printSymbol(const SymbolRef &Symbol) { StringRef SectionName = ""; Expected SecIOrErr = Symbol.getSection(); - if (!SecIOrErr) - reportError(SecIOrErr.takeError(), Obj->getFileName()); - + error(errorToErrorCode(SecIOrErr.takeError())); section_iterator SecI = *SecIOrErr; if (SecI != Obj->section_end()) SectionName = unwrapOrError(Obj->getFileName(), SecI->getName()); diff --git a/llvm/tools/llvm-readobj/ObjDumper.cpp b/llvm/tools/llvm-readobj/ObjDumper.cpp index 9e5ebd9..a055e6e 100644 --- a/llvm/tools/llvm-readobj/ObjDumper.cpp +++ b/llvm/tools/llvm-readobj/ObjDumper.cpp @@ -23,10 +23,6 @@ namespace llvm { -static inline Error createError(const Twine &Msg) { - return createStringError(object::object_error::parse_failed, Msg); -} - ObjDumper::ObjDumper(ScopedPrinter &Writer) : W(Writer) {} ObjDumper::~ObjDumper() { @@ -67,15 +63,10 @@ getSectionRefsByNameOrIndex(const object::ObjectFile *Obj, for (const std::pair &S : SecNames) if (!S.second) - reportWarning( - createError(formatv("could not find section '{0}'", S.first).str()), - Obj->getFileName()); - + reportWarning(formatv("could not find section '{0}'", S.first).str()); for (std::pair S : SecIndices) if (!S.second) - reportWarning( - createError(formatv("could not find section {0}", S.first).str()), - Obj->getFileName()); + reportWarning(formatv("could not find section {0}", S.first).str()); return Ret; } diff --git a/llvm/tools/llvm-readobj/llvm-readobj.cpp b/llvm/tools/llvm-readobj/llvm-readobj.cpp index 00f7ab2..ec67bd5 100644 --- a/llvm/tools/llvm-readobj/llvm-readobj.cpp +++ b/llvm/tools/llvm-readobj/llvm-readobj.cpp @@ -375,46 +375,52 @@ namespace opts { namespace llvm { -LLVM_ATTRIBUTE_NORETURN static void error(Twine Msg) { - // Flush the standard output to print the error at a - // proper place. +LLVM_ATTRIBUTE_NORETURN void reportError(Twine Msg) { fouts().flush(); errs() << "\n"; WithColor::error(errs()) << Msg << "\n"; exit(1); } -LLVM_ATTRIBUTE_NORETURN void reportError(Error Err, StringRef Input) { +void reportError(Error Err, StringRef Input) { assert(Err); if (Input == "-") Input = ""; handleAllErrors(createFileError(Input, std::move(Err)), - [&](const ErrorInfoBase &EI) { error(EI.message()); }); - llvm_unreachable("error() call should never return"); + [&](const ErrorInfoBase &EI) { reportError(EI.message()); }); } -void reportWarning(Error Err, StringRef Input) { - assert(Err); - // Flush the standard output to print the warning at a - // proper place. +void reportWarning(Twine Msg) { fouts().flush(); + errs() << "\n"; + WithColor::warning(errs()) << Msg << "\n"; +} + +void reportWarning(StringRef Input, Error Err) { if (Input == "-") Input = ""; + warn(createFileError(Input, std::move(Err))); +} - handleAllErrors(createFileError(Input, std::move(Err)), - [&](const ErrorInfoBase &EI) { - errs() << "\n"; - WithColor::warning(errs()) << EI.message() << "\n"; - }); +void warn(Error Err) { + handleAllErrors(std::move(Err), [&](const ErrorInfoBase &EI) { + reportWarning(EI.message()); + }); } -LLVM_ATTRIBUTE_NORETURN void reportError(std::error_code EC, StringRef Input) { - assert(EC != readobj_error::success); - reportError(errorCodeToError(EC), Input); +void error(std::error_code EC) { + if (!EC) + return; + reportError(EC.message()); } } // namespace llvm +static void reportError(std::error_code EC, StringRef Input) { + assert(EC != readobj_error::success); + reportError(errorCodeToError(EC), Input); +} + static bool isMipsArch(unsigned Arch) { switch (Arch) { case llvm::Triple::mips: diff --git a/llvm/tools/llvm-readobj/llvm-readobj.h b/llvm/tools/llvm-readobj/llvm-readobj.h index 95049ef..32ad392 100644 --- a/llvm/tools/llvm-readobj/llvm-readobj.h +++ b/llvm/tools/llvm-readobj/llvm-readobj.h @@ -21,9 +21,12 @@ namespace llvm { } // Various helper functions. - LLVM_ATTRIBUTE_NORETURN void reportError(Error Err, StringRef Input); - LLVM_ATTRIBUTE_NORETURN void reportError(std::error_code EC, StringRef Input); - void reportWarning(Error Err, StringRef Input); + LLVM_ATTRIBUTE_NORETURN void reportError(Twine Msg); + void reportError(Error Err, StringRef Input); + void reportWarning(Twine Msg); + void reportWarning(StringRef Input, Error Err); + void warn(llvm::Error Err); + void error(std::error_code EC); template T unwrapOrError(StringRef Input, Expected EO) { if (EO) -- 2.7.4