[llvm] 034b95e - [llvm-readobj/elf] - Remove `unwrapOrError` calls from DumpStyle<ELFT>::printRelocationsHelper.

Georgii Rymar via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 11 06:50:59 PDT 2020


Author: Georgii Rymar
Date: 2020-08-11T16:49:37+03:00
New Revision: 034b95e2839ee0dbd375cdff7ffe20d6fbfa4750

URL: https://github.com/llvm/llvm-project/commit/034b95e2839ee0dbd375cdff7ffe20d6fbfa4750
DIFF: https://github.com/llvm/llvm-project/commit/034b95e2839ee0dbd375cdff7ffe20d6fbfa4750.diff

LOG: [llvm-readobj/elf] - Remove `unwrapOrError` calls from DumpStyle<ELFT>::printRelocationsHelper.

It removes all `unwrapOrError` calls except the first one, which
is is bit different and can be removed separately.

Differential revision: https://reviews.llvm.org/D85303

Added: 
    

Modified: 
    llvm/test/Object/invalid.test
    llvm/test/tools/llvm-readobj/ELF/packed-relocs-error1.s
    llvm/test/tools/llvm-readobj/ELF/packed-relocs-error2.s
    llvm/test/tools/llvm-readobj/ELF/packed-relocs-error3.s
    llvm/test/tools/llvm-readobj/ELF/packed-relocs-error4.s
    llvm/test/tools/llvm-readobj/ELF/packed-relocs-error5.s
    llvm/test/tools/llvm-readobj/ELF/packed-relocs.test
    llvm/test/tools/llvm-readobj/ELF/relocations.test
    llvm/test/tools/llvm-readobj/ELF/relr-relocs.test
    llvm/tools/llvm-readobj/ELFDumper.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/test/Object/invalid.test b/llvm/test/Object/invalid.test
index 5c04eca1e96b..c3dc175f399c 100644
--- a/llvm/test/Object/invalid.test
+++ b/llvm/test/Object/invalid.test
@@ -249,10 +249,10 @@ Symbols: []
 
 # RUN: yaml2obj %s --docnum=12 -o %t12
 # RUN: yaml2obj %s --docnum=13 -o %t13
-# RUN: not llvm-readobj -r %t12 2>&1 | FileCheck -DFILE=%t12 --check-prefix=INVALID-RELOC-SH-OFFSET %s
-# RUN: not llvm-readobj -r %t13 2>&1 | FileCheck -DFILE=%t13 --check-prefix=INVALID-RELOC-SH-OFFSET %s
+# RUN: llvm-readobj -r %t12 2>&1 | FileCheck -DFILE=%t12 --check-prefix=INVALID-RELOC-SH-OFFSET -DTYPE=SHT_REL %s
+# RUN: llvm-readobj -r %t13 2>&1 | FileCheck -DFILE=%t13 --check-prefix=INVALID-RELOC-SH-OFFSET -DTYPE=SHT_RELA %s
 
-# INVALID-RELOC-SH-OFFSET: error: '[[FILE]]': section [index 1] has a sh_offset (0x10000) + sh_size (0x0) that is greater than the file size (0x160)
+# INVALID-RELOC-SH-OFFSET: warning: '[[FILE]]': unable to read relocations from [[TYPE]] section with index 1: section [index 1] has a sh_offset (0x10000) + sh_size (0x0) that is greater than the file size (0x160)
 
 --- !ELF
 FileHeader:

diff  --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error1.s b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error1.s
index cfe2f8cf5bdb..07fbd78b09ec 100644
--- a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error1.s
+++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error1.s
@@ -1,7 +1,8 @@
 // REQUIRES: x86-registered-target
-// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t
+// RUN: llvm-readobj --relocations %t 2>&1 | FileCheck %s -DFILE=%t
 
-// CHECK: error: '<stdin>': invalid packed relocation header
+// CHECK: warning: '[[FILE]]': unable to read relocations from SHT_ANDROID_REL section with index 3: invalid packed relocation header
 
 .section .rela.dyn, "a", @0x60000001
 .ascii "APS9"

diff  --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error2.s b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error2.s
index 6e8e9bf5bd1e..ea14995e0ded 100644
--- a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error2.s
+++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error2.s
@@ -1,7 +1,8 @@
 // REQUIRES: x86-registered-target
-// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t
+// RUN: llvm-readobj --relocations %t 2>&1 | FileCheck %s -DFILE=%t
 
-// CHECK: error: '<stdin>': malformed sleb128, extends past end
+// CHECK: warning: '[[FILE]]': unable to read relocations from SHT_ANDROID_REL section with index 3: malformed sleb128, extends past end
 
 .section .rela.dyn, "a", @0x60000001
 .ascii "APS2"

diff  --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error3.s b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error3.s
index 8b18ca210aa0..766c551295ae 100644
--- a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error3.s
+++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error3.s
@@ -1,7 +1,8 @@
 // REQUIRES: x86-registered-target
-// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t
+// RUN: llvm-readobj --relocations %t 2>&1 | FileCheck %s -DFILE=%t
 
-// CHECK: error: '<stdin>': malformed sleb128, extends past end
+// CHECK: warning: '[[FILE]]': unable to read relocations from SHT_ANDROID_REL section with index 3: malformed sleb128, extends past end
 
 .section .rela.dyn, "a", @0x60000001
 .ascii "APS2"

diff  --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error4.s b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error4.s
index 05b954108982..191e0b7885c4 100644
--- a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error4.s
+++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error4.s
@@ -1,7 +1,8 @@
 // REQUIRES: x86-registered-target
-// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t
+// RUN: llvm-readobj --relocations %t 2>&1 | FileCheck %s -DFILE=%t
 
-// CHECK: error: '<stdin>': malformed sleb128, extends past end
+// CHECK: warning: '[[FILE]]': unable to read relocations from SHT_ANDROID_REL section with index 3: malformed sleb128, extends past end
 
 .section .rela.dyn, "a", @0x60000001
 .ascii "APS2"

diff  --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error5.s b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error5.s
index db2b05114785..8a6d6560f520 100644
--- a/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error5.s
+++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs-error5.s
@@ -1,7 +1,8 @@
 // REQUIRES: x86-registered-target
-// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | not llvm-readobj -r - 2>&1 | FileCheck %s
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t
+// RUN: llvm-readobj --relocations %t 2>&1 | FileCheck %s -DFILE=%t
 
-// CHECK: error: '<stdin>': relocation group unexpectedly large
+// CHECK: warning: '[[FILE]]': unable to read relocations from SHT_ANDROID_REL section with index 3: relocation group unexpectedly large
 
 .section .rela.dyn, "a", @0x60000001
 .ascii "APS2"

diff  --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs.test b/llvm/test/tools/llvm-readobj/ELF/packed-relocs.test
index e3664d44ccaa..305fef7a6278 100644
--- a/llvm/test/tools/llvm-readobj/ELF/packed-relocs.test
+++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs.test
@@ -1,7 +1,8 @@
 # The binary blobs in this file were created like this:
 # llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu Inputs/elf-packed-relocs1.s -o - | obj2yaml | grep Content:
 
-# RUN: yaml2obj --docnum=1 %s | llvm-readobj --relocations - | FileCheck --check-prefix=LLVM1 %s
+# RUN: yaml2obj --docnum=1 %s -o %t1
+# RUN: llvm-readobj --relocations %t1 | FileCheck --check-prefix=LLVM1 %s
 # LLVM1:      Section (1) .rela.dyn {
 # LLVM1-NEXT:   0x1100 R_X86_64_RELATIVE - 0x0
 # LLVM1-NEXT:   0x1180 R_X86_64_RELATIVE - 0x0
@@ -13,7 +14,7 @@
 # LLVM1-NEXT:   0x119F R_X86_64_64 sym2 0xA
 # LLVM1-NEXT: }
 
-# RUN: yaml2obj --docnum=1 %s | llvm-readelf -relocations - | FileCheck --check-prefix=GNU1 %s
+# RUN: llvm-readelf --relocations %t1 | FileCheck --check-prefix=GNU1 %s
 # GNU1:      Relocation section '.rela.dyn' at offset 0x40 contains 8 entries:
 # GNU1:      0000000000001100  0000000000000008 R_X86_64_RELATIVE                 0
 # GNU1-NEXT: 0000000000001180  0000000000000008 R_X86_64_RELATIVE                 0
@@ -32,18 +33,35 @@ FileHeader:
   Type:    ET_DYN
   Machine: EM_X86_64
 Sections:
-  - Name:    .rela.dyn
-    Type:    SHT_ANDROID_RELA
-    Flags:   [ SHF_ALLOC ]
-    Link:    .symtab
-    Content: 41505332088020020108800280010202088180808010818080802002080181808080100802818080802004020C7E048180808010088180808020
+  - Name:     .rela.dyn
+    Type:     SHT_ANDROID_RELA
+    Flags:    [ SHF_ALLOC ]
+    Link:     .symtab
+    Content:  41505332088020020108800280010202088180808010818080802002080181808080100802818080802004020C7E048180808010088180808020
+    ShOffset: [[SHOFFSET=<none>]]
 Symbols:
   - Name:    sym1
     Binding: STB_GLOBAL
   - Name:    sym2
     Binding: STB_GLOBAL
 
-# RUN: yaml2obj --docnum=2 %s | llvm-readobj --relocations - | FileCheck --check-prefix=LLVM2 %s
+## Check we report a warning when we are unable to dump relocations for a SHT_ANDROID_RELA section.
+
+# RUN: yaml2obj --docnum=1 -DSHOFFSET=0xffffffff %s -o %t1.broken
+# RUN: llvm-readobj --relocations %t1.broken 2>&1 | FileCheck -DFILE=%t1.broken --check-prefix=BROKEN-RELA-LLVM %s
+# RUN: not llvm-readelf --relocations %t1.broken 2>&1 | FileCheck -DFILE=%t1.broken --check-prefix=BROKEN-RELA-GNU %s
+
+# BROKEN-RELA-LLVM:      Relocations [
+# BROKEN-RELA-LLVM-NEXT:   Section (1) .rela.dyn {
+# BROKEN-RELA-LLVM-NEXT: warning: '[[FILE]]': unable to read relocations from SHT_ANDROID_RELA section with index 1: section [index 1] has a sh_offset (0xffffffff) + sh_size (0x3a) that is greater than the file size (0x238)
+# BROKEN-RELA-LLVM-NEXT:   }
+# BROKEN-RELA-LLVM-NEXT: ]
+
+## FIXME: GNU still reports an error before trying to dump relocations.
+# BROKEN-RELA-GNU: error: '[[FILE]]': section [index 1] has a sh_offset (0xffffffff) + sh_size (0x3a) that is greater than the file size (0x238)
+
+# RUN: yaml2obj --docnum=2 %s -o %t2
+# RUN: llvm-readobj --relocations %t2 | FileCheck --check-prefix=LLVM2 %s
 # LLVM2:      Section (1) .rel.dyn {
 # LLVM2-NEXT:   0x1008 R_386_32 sym1 0x0
 # LLVM2-NEXT:   0x1010 R_386_GOT32 sym2 0x0
@@ -57,7 +75,7 @@ Symbols:
 # LLVM2-NEXT:   0xFF0 R_386_RELATIVE - 0x0
 # LLVM2-NEXT: }
 
-# RUN: yaml2obj --docnum=2 %s | llvm-readelf -relocations - | FileCheck --check-prefix=GNU2 %s
+# RUN: llvm-readelf --relocations %t2 | FileCheck --check-prefix=GNU2 %s
 # GNU2:      Relocation section '.rel.dyn' at offset 0x34 contains 10 entries:
 # GNU2:      00001008  00000101 R_386_32               00000000   sym1
 # GNU2-NEXT: 00001010  00000203 R_386_GOT32            00000000   sym2
@@ -78,17 +96,33 @@ FileHeader:
   Type:    ET_DYN
   Machine: EM_386
 Sections:
-  - Name:    .rel.dyn
-    Type:    SHT_ANDROID_REL
-    Flags:   [ SHF_ALLOC ]
-    Link:    .symtab
-    Content: 415053320A80200202088102830408037C08
+  - Name:     .rel.dyn
+    Type:     SHT_ANDROID_REL
+    Flags:    [ SHF_ALLOC ]
+    Link:     .symtab
+    Content:  415053320A80200202088102830408037C08
+    ShOffset: [[SHOFFSET=<none>]]
 Symbols:
   - Name:    sym1
     Binding: STB_GLOBAL
   - Name:    sym2
     Binding: STB_GLOBAL
 
+## Check we report a warning when we are unable to dump relocations for a SHT_ANDROID_REL section.
+
+# RUN: yaml2obj --docnum=2 -DSHOFFSET=0xffffffff %s -o %t2.broken
+# RUN: llvm-readobj --relocations %t2.broken 2>&1 | FileCheck -DFILE=%t2.broken --check-prefix=BROKEN-REL-LLVM %s
+# RUN: not llvm-readelf --relocations %t2.broken 2>&1 | FileCheck -DFILE=%t2.broken --check-prefix=BROKEN-REL-GNU %s
+
+# BROKEN-REL-LLVM:      Relocations [
+# BROKEN-REL-LLVM-NEXT:   Section (1) .rel.dyn {
+# BROKEN-REL-LLVM-NEXT: warning: '[[FILE]]': unable to read relocations from SHT_ANDROID_REL section with index 1: section [index 1] has a sh_offset (0xffffffff) + sh_size (0x12) that cannot be represented
+# BROKEN-REL-LLVM-NEXT:   }
+# BROKEN-REL-LLVM-NEXT: ]
+
+## FIXME: GNU still reports an error before trying to dump relocations.
+# BROKEN-REL-GNU: error: '[[FILE]]': section [index 1] has a sh_offset (0xffffffff) + sh_size (0x12) that cannot be represented
+
 # RUN: yaml2obj --docnum=3 %s | llvm-readobj --relocations - | FileCheck --check-prefix=LLVM3 %s
 #
 # LLVM3:      Section (1) .rela.dyn {

diff  --git a/llvm/test/tools/llvm-readobj/ELF/relocations.test b/llvm/test/tools/llvm-readobj/ELF/relocations.test
index 5dd5762fe19b..be8b62838639 100644
--- a/llvm/test/tools/llvm-readobj/ELF/relocations.test
+++ b/llvm/test/tools/llvm-readobj/ELF/relocations.test
@@ -125,10 +125,11 @@ Sections:
   - Name: .text
     Type: SHT_PROGBITS
     Content: '00FFFFFFFF020000001234567890ABCDEF'
-  - Name:   .rel.text
-    Type:   SHT_REL
-    Info:   .text
-    ShName: [[SHNAME=<none>]]
+  - Name:    .rel.text
+    Type:    SHT_REL
+    Info:    .text
+    ShName:  [[SHNAME=<none>]]
+    EntSize: [[ENTSIZEREL=<none>]]
     Relocations:
       - Symbol: rel_0
         Type:   R_X86_64_NONE
@@ -141,10 +142,11 @@ Sections:
       - Offset: 0x9
         Symbol: rel_64
         Type:   R_X86_64_64
-  - Name: .rela.text
-    Type: SHT_RELA
-    Info: .text
-    ShName: [[SHNAME=<none>]]
+  - Name:    .rela.text
+    Type:    SHT_RELA
+    Info:    .text
+    ShName:  [[SHNAME=<none>]]
+    EntSize: [[ENTSIZERELA=<none>]]
     Relocations:
       - Symbol: rela_0
         Type:   R_X86_64_NONE
@@ -194,6 +196,70 @@ Symbols:
     Section: .text
     Value:   0xFFFFFFFFFFFFFFFF
 
+## Check we report a warning when we are unable to dump relocations for a section.
+## Check we continue dumping other relocation sections if any.
+
+## Case A: check the case when relocations can't be read from an SHT_REL section.
+# RUN: yaml2obj %s --docnum=1 -DENTSIZEREL=1 -o %t.broken.rel
+# RUN: llvm-readobj --relocations %t.broken.rel 2>&1 \
+# RUN:   | FileCheck %s -DFILE=%t.broken.rel --check-prefix=BROKEN-REL-LLVM
+# RUN: llvm-readelf --relocations %t.broken.rel 2>&1 \
+# RUN:   | FileCheck %s -DFILE=%t.broken.rel --check-prefix=BROKEN-REL-GNU
+
+# BROKEN-REL-LLVM:      Relocations [
+# BROKEN-REL-LLVM-NEXT:   Section (2) .rel.text {
+# BROKEN-REL-LLVM-NEXT: warning: '[[FILE]]': unable to read relocations from SHT_REL section with index 2: section [index 2] has an invalid sh_entsize: 1
+# BROKEN-REL-LLVM-NEXT:   }
+# BROKEN-REL-LLVM-NEXT:   Section (3) .rela.text {
+# BROKEN-REL-LLVM-NEXT:     0x0 R_X86_64_NONE rela_0 0x0
+# BROKEN-REL-LLVM-NEXT:     0x1 R_X86_64_PC32 rela_neg 0xFFFFFFFFFFFFFFFF
+# BROKEN-REL-LLVM-NEXT:     0x5 R_X86_64_PLT32 rela_pos 0x2
+# BROKEN-REL-LLVM-NEXT:     0xFFFFFFFFFFFFFFFF R_X86_64_64 rela_minneg 0x8000000000000000
+# BROKEN-REL-LLVM-NEXT:     0x9 R_X86_64_32S rela_maxpos 0x7FFFFFFFFFFFFFFF
+# BROKEN-REL-LLVM-NEXT:   }
+# BROKEN-REL-LLVM-NEXT: ]
+
+# BROKEN-REL-GNU:      Relocation section '.rel.text' at offset 0x51 contains 64 entries:
+# BROKEN-REL-GNU-NEXT:     Offset             Info             Type       Symbol's Value  Symbol's Name
+# BROKEN-REL-GNU-NEXT: warning: '[[FILE]]': unable to read relocations from SHT_REL section with index 2: section [index 2] has an invalid sh_entsize: 1
+# BROKEN-REL-GNU:      Relocation section '.rela.text' at offset 0x91 contains 5 entries:
+# BROKEN-REL-GNU-NEXT:     Offset             Info             Type       Symbol's Value  Symbol's Name
+# BROKEN-REL-GNU-NEXT: 0000000000000000  0000000500000000 R_X86_64_NONE  0000000000000000 rela_0 + 0
+# BROKEN-REL-GNU-NEXT: 0000000000000001  0000000600000002 R_X86_64_PC32  0000000000000001 rela_neg - 1
+# BROKEN-REL-GNU-NEXT: 0000000000000005  0000000700000004 R_X86_64_PLT32 0000000000000002 rela_pos + 2
+# BROKEN-REL-GNU-NEXT: ffffffffffffffff  0000000800000001 R_X86_64_64    0000000000000003 rela_minneg - 8000000000000000
+# BROKEN-REL-GNU-NEXT: 0000000000000009  000000090000000b R_X86_64_32S   ffffffffffffffff rela_maxpos + 7fffffffffffffff
+
+## Case B: check the case when relocations can't be read from an SHT_RELA section.
+# RUN: yaml2obj %s --docnum=1 -DENTSIZERELA=1 -o %t.broken.rela
+# RUN: llvm-readobj --relocations %t.broken.rela 2>&1 \
+# RUN:   | FileCheck %s -DFILE=%t.broken.rela --check-prefix=BROKEN-RELA-LLVM
+# RUN: llvm-readelf --relocations %t.broken.rela 2>&1 \
+# RUN:   | FileCheck %s -DFILE=%t.broken.rela --check-prefix=BROKEN-RELA-GNU
+
+# BROKEN-RELA-LLVM:      Relocations [
+# BROKEN-RELA-LLVM-NEXT:   Section (2) .rel.text {
+# BROKEN-RELA-LLVM-NEXT:     0x0 R_X86_64_NONE rel_0 0x0
+# BROKEN-RELA-LLVM-NEXT:     0x1 R_X86_64_PC32 rel_neg 0x0
+# BROKEN-RELA-LLVM-NEXT:     0x5 R_X86_64_PLT32 rel_pos 0x0
+# BROKEN-RELA-LLVM-NEXT:     0x9 R_X86_64_64 rel_64 0x0
+# BROKEN-RELA-LLVM-NEXT:   }
+# BROKEN-RELA-LLVM-NEXT:   Section (3) .rela.text {
+# BROKEN-RELA-LLVM-NEXT: warning: '[[FILE]]': unable to read relocations from SHT_RELA section with index 3: section [index 3] has an invalid sh_entsize: 1
+# BROKEN-RELA-LLVM-NEXT:   }
+# BROKEN-RELA-LLVM-NEXT: ]
+
+# BROKEN-RELA-GNU:      Relocation section '.rel.text' at offset 0x51 contains 4 entries:
+# BROKEN-RELA-GNU-NEXT:     Offset             Info             Type       Symbol's Value  Symbol's Name
+# BROKEN-RELA-GNU-NEXT: 0000000000000000  0000000100000000 R_X86_64_NONE  0000000000000000 rel_0
+# BROKEN-RELA-GNU-NEXT: 0000000000000001  0000000200000002 R_X86_64_PC32  0000000000000001 rel_neg
+# BROKEN-RELA-GNU-NEXT: 0000000000000005  0000000300000004 R_X86_64_PLT32 0000000000000002 rel_pos
+# BROKEN-RELA-GNU-NEXT: 0000000000000009  0000000400000001 R_X86_64_64    ffffffffffffffff rel_64
+# BROKEN-RELA-GNU-EMPTY:
+# BROKEN-RELA-GNU-NEXT: Relocation section '.rela.text' at offset 0x91 contains 120 entries:
+# BROKEN-RELA-GNU-NEXT:     Offset             Info             Type               Symbol's Value  Symbol's Name + Addend
+# BROKEN-RELA-GNU-NEXT: warning: '[[FILE]]': unable to read relocations from SHT_RELA section with index 3: section [index 3] has an invalid sh_entsize: 1
+
 ## Show that ELF32 is dumped correctly.
 # RUN: yaml2obj %s --docnum=2 -o %t32
 # RUN: llvm-readobj -r %t32 \

diff  --git a/llvm/test/tools/llvm-readobj/ELF/relr-relocs.test b/llvm/test/tools/llvm-readobj/ELF/relr-relocs.test
index 0d381c746f22..40916af5a0f4 100644
--- a/llvm/test/tools/llvm-readobj/ELF/relr-relocs.test
+++ b/llvm/test/tools/llvm-readobj/ELF/relr-relocs.test
@@ -1,7 +1,7 @@
 ## This is a test to test how SHT_RELR sections are dumped.
 
-# RUN: yaml2obj --docnum=1 %s \
-# RUN:   | llvm-readobj --relocations --raw-relr - \
+# RUN: yaml2obj --docnum=1 %s -o %t1
+# RUN: llvm-readobj --relocations --raw-relr %t1 \
 # RUN:   | FileCheck --check-prefix=RAW-LLVM1 %s
 # RAW-LLVM1:      Section (1) .relr.dyn {
 # RAW-LLVM1-NEXT:   0x10D60
@@ -11,9 +11,7 @@
 # RAW-LLVM1-NEXT:   0xA700550400009
 # RAW-LLVM1-NEXT: }
 
-# RUN: yaml2obj --docnum=1 %s \
-# RUN:   | llvm-readobj --relocations - \
-# RUN:   | FileCheck --check-prefix=LLVM1 %s
+# RUN: llvm-readobj --relocations %t1 | FileCheck --check-prefix=LLVM1 %s
 # LLVM1:      Section (1) .relr.dyn {
 # LLVM1-NEXT:   0x10D60 R_X86_64_RELATIVE - 0x0
 # LLVM1-NEXT:   0x10D68 R_X86_64_RELATIVE - 0x0
@@ -38,8 +36,7 @@
 # LLVM1-NEXT:   0x20390 R_X86_64_RELATIVE - 0x0
 # LLVM1-NEXT: }
 
-# RUN: yaml2obj --docnum=1 %s \
-# RUN:   | llvm-readelf -relocations -raw-relr - \
+# RUN: llvm-readelf --relocations --raw-relr %t1 \
 # RUN:   | FileCheck --check-prefix=RAW-GNU1 %s
 # RAW-GNU1:      Relocation section '.relr.dyn' at offset 0x40 contains 5 entries:
 # RAW-GNU1:      0000000000010d60
@@ -48,9 +45,7 @@
 # RAW-GNU1-NEXT: 00000000000f0501
 # RAW-GNU1-NEXT: 000a700550400009
 
-# RUN: yaml2obj --docnum=1 %s \
-# RUN:   | llvm-readelf -relocations - \
-# RUN:   | FileCheck --check-prefix=GNU1 %s
+# RUN: llvm-readelf --relocations %t1 | FileCheck --check-prefix=GNU1 %s
 # GNU1:      Relocation section '.relr.dyn' at offset 0x40 contains 21 entries:
 # GNU1:      0000000000010d60  0000000000000008 R_X86_64_RELATIVE
 # GNU1-NEXT: 0000000000010d68  0000000000000008 R_X86_64_RELATIVE
@@ -80,7 +75,6 @@ FileHeader:
   Data:    ELFDATA2LSB
   Type:    ET_DYN
   Machine: EM_X86_64
-
 Sections:
   - Name:  .relr.dyn
     Type:  SHT_RELR
@@ -88,9 +82,9 @@ Sections:
     Entries: [ 0x0000000000010D60, 0x0000000000000103, 0x0000000000020000,
                0x00000000000F0501, 0x000A700550400009 ]
 
-# RUN: yaml2obj --docnum=2 %s \
-# RUN:   | llvm-readobj --relocations --raw-relr - \
-# RUN:   | FileCheck --check-prefix=RAW-LLVM2 %s
+# RUN: yaml2obj --docnum=2 %s -o %t2
+# RUN: llvm-readobj --relocations --raw-relr %t2 | \
+# RUN:   FileCheck --check-prefix=RAW-LLVM2 %s
 # RAW-LLVM2:      Section (1) .relr.dyn {
 # RAW-LLVM2-NEXT:   0x10D60
 # RAW-LLVM2-NEXT:   0x103
@@ -99,9 +93,7 @@ Sections:
 # RAW-LLVM2-NEXT:   0x50400009
 # RAW-LLVM2-NEXT: }
 
-# RUN: yaml2obj --docnum=2 %s \
-# RUN:   | llvm-readobj --relocations - \
-# RUN:   | FileCheck --check-prefix=LLVM2 %s
+# RUN: llvm-readobj --relocations %t2 | FileCheck --check-prefix=LLVM2 %s
 # LLVM2:      Section (1) .relr.dyn {
 # LLVM2-NEXT:   0x10D60 R_386_RELATIVE - 0x0
 # LLVM2-NEXT:   0x10D64 R_386_RELATIVE - 0x0
@@ -119,9 +111,8 @@ Sections:
 # LLVM2-NEXT:   0x200F4 R_386_RELATIVE - 0x0
 # LLVM2-NEXT: }
 
-# RUN: yaml2obj --docnum=2 %s \
-# RUN:   | llvm-readelf -relocations -raw-relr - \
-# RUN:   | FileCheck --check-prefix=RAW-GNU2 %s
+# RUN: llvm-readelf --relocations --raw-relr %t2 | \
+# RUN:   FileCheck --check-prefix=RAW-GNU2 %s
 # RAW-GNU2:      Relocation section '.relr.dyn' at offset 0x34 contains 5 entries:
 # RAW-GNU2:      00010d60
 # RAW-GNU2-NEXT: 00000103
@@ -129,9 +120,7 @@ Sections:
 # RAW-GNU2-NEXT: 000f0501
 # RAW-GNU2-NEXT: 50400009
 
-# RUN: yaml2obj --docnum=2 %s \
-# RUN:   | llvm-readelf -relocations - \
-# RUN:   | FileCheck --check-prefix=GNU2 %s
+# RUN: llvm-readelf --relocations %t2 | FileCheck --check-prefix=GNU2 %s
 # GNU2:      Relocation section '.relr.dyn' at offset 0x34 contains 14 entries:
 # GNU2:      00010d60  00000008 R_386_RELATIVE
 # GNU2-NEXT: 00010d64  00000008 R_386_RELATIVE
@@ -154,10 +143,39 @@ FileHeader:
   Data:    ELFDATA2LSB
   Type:    ET_DYN
   Machine: EM_386
-
 Sections:
-  - Name:  .relr.dyn
-    Type:  SHT_RELR
-    Flags: [ SHF_ALLOC ]
+  - Name:    .relr.dyn
+    Type:    SHT_RELR
+    Flags:   [ SHF_ALLOC ]
     Entries: [ 0x00010D60, 0x00000103, 0x00020000,
                0x000F0501, 0x50400009 ]
+    EntSize: [[ENTSIZE=<none>]]
+    ShType:  [[SHTYPE=<none>]]
+
+## Check we report a warning when we are unable to dump relocations
+## for a SHT_RELR/SHT_ANDROID_RELR section.
+
+## Case A: check the case when relocations can't be read from an SHT_RELR section.
+# RUN: yaml2obj --docnum=2 -DENTSIZE=1 %s -o %t2.broken
+# RUN: llvm-readobj --relocations %t2.broken 2>&1 | \
+# RUN:   FileCheck -DFILE=%t2.broken --check-prefix=BROKEN-LLVM %s -DSECNAME=SHT_RELR
+# RUN: not llvm-readelf --relocations %t2.broken 2>&1 | \
+# RUN:   FileCheck -DFILE=%t2.broken --check-prefix=BROKEN-GNU %s
+
+# BROKEN-LLVM:      Relocations [
+# BROKEN-LLVM-NEXT:   Section (1) .relr.dyn {
+# BROKEN-LLVM-NEXT: warning: '[[FILE]]': unable to read relocations from [[SECNAME]] section with index 1: section [index 1] has an invalid sh_entsize: 1
+# BROKEN-LLVM-NEXT:   }
+# BROKEN-LLVM-NEXT: ]
+
+## FIXME: GNU still reports an error before trying to dump relocations.
+# BROKEN-GNU: error: '[[FILE]]': section [index 1] has an invalid sh_entsize: 1
+
+## Case B: check the case when relocations can't be read from an SHT_ANDROID_RELR section.
+##         SHT_ANDROID_RELR = 0x6fffff00.
+# RUN: yaml2obj --docnum=2 -DENTSIZE=1 -DSHTYPE=0x6fffff00 %s -o %t2.broken.android
+# RUN: llvm-readobj --relocations %t2.broken.android 2>&1 | \
+# RUN:   FileCheck -DFILE=%t2.broken.android --check-prefix=BROKEN-LLVM %s -DSECNAME=SHT_ANDROID_RELR
+
+# RUN: not llvm-readelf --relocations %t2.broken.android 2>&1 | \
+# RUN:   FileCheck -DFILE=%t2.broken.android --check-prefix=BROKEN-GNU %s

diff  --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index e5a591d31514..bce636f4641e 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -5524,33 +5524,54 @@ void DumpStyle<ELFT>::printRelocationsHelper(const ELFFile<ELFT> *Obj,
   unsigned SecNdx = &Sec - &cantFail(Obj->sections()).front();
   unsigned RelNdx = 0;
 
+  auto Warn = [&](Error &&E) {
+    this->reportUniqueWarning(createError("unable to read relocations from " +
+                                          describe(Obj, Sec) + ": " +
+                                          toString(std::move(E))));
+  };
+
   switch (Sec.sh_type) {
   case ELF::SHT_REL:
-    for (const Elf_Rel &R : unwrapOrError(this->FileName, Obj->rels(&Sec)))
-      printRelReloc(Obj, SecNdx, SymTab, R, ++RelNdx);
+    if (Expected<Elf_Rel_Range> RangeOrErr = Obj->rels(&Sec)) {
+      for (const Elf_Rel &R : *RangeOrErr)
+        printRelReloc(Obj, SecNdx, SymTab, R, ++RelNdx);
+    } else {
+      Warn(RangeOrErr.takeError());
+    }
     break;
   case ELF::SHT_RELA:
-    for (const Elf_Rela &R : unwrapOrError(this->FileName, Obj->relas(&Sec)))
-      printRelaReloc(Obj, SecNdx, SymTab, R, ++RelNdx);
+    if (Expected<Elf_Rela_Range> RangeOrErr = Obj->relas(&Sec)) {
+      for (const Elf_Rela &R : *RangeOrErr)
+        printRelaReloc(Obj, SecNdx, SymTab, R, ++RelNdx);
+    } else {
+      Warn(RangeOrErr.takeError());
+    }
     break;
   case ELF::SHT_RELR:
   case ELF::SHT_ANDROID_RELR: {
-    Elf_Relr_Range Relrs = unwrapOrError(this->FileName, Obj->relrs(&Sec));
+    Expected<Elf_Relr_Range> RangeOrErr = Obj->relrs(&Sec);
+    if (!RangeOrErr) {
+      Warn(RangeOrErr.takeError());
+      break;
+    }
     if (opts::RawRelr) {
-      for (const Elf_Relr &R : Relrs)
+      for (const Elf_Relr &R : *RangeOrErr)
         printRelrReloc(R);
       break;
     }
 
-    for (const Elf_Rel &R : Obj->decode_relrs(Relrs))
+    for (const Elf_Rel &R : Obj->decode_relrs(*RangeOrErr))
       printRelReloc(Obj, SecNdx, SymTab, R, ++RelNdx);
     break;
   }
   case ELF::SHT_ANDROID_REL:
   case ELF::SHT_ANDROID_RELA:
-    for (const Elf_Rela &R :
-         unwrapOrError(this->FileName, Obj->android_relas(&Sec)))
-      printRelaReloc(Obj, SecNdx, SymTab, R, ++RelNdx);
+    if (Expected<std::vector<Elf_Rela>> RelasOrErr = Obj->android_relas(&Sec)) {
+      for (const Elf_Rela &R : *RelasOrErr)
+        printRelaReloc(Obj, SecNdx, SymTab, R, ++RelNdx);
+    } else {
+      Warn(RelasOrErr.takeError());
+    }
     break;
   }
 }


        


More information about the llvm-commits mailing list