[llvm] bc90219 - [llvm-readobj] - Remove unwrapOrError calls from GNUStyle<ELFT>::printRelocations.
Georgii Rymar via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 17 05:16:58 PDT 2020
Author: Georgii Rymar
Date: 2020-08-17T15:16:36+03:00
New Revision: bc902191d3c002c13436f2c9a299826704861a80
URL: https://github.com/llvm/llvm-project/commit/bc902191d3c002c13436f2c9a299826704861a80
DIFF: https://github.com/llvm/llvm-project/commit/bc902191d3c002c13436f2c9a299826704861a80.diff
LOG: [llvm-readobj] - Remove unwrapOrError calls from GNUStyle<ELFT>::printRelocations.
This fixes existent FIXMEs: we should not error out when unable to
find the number of relocations.
Differential revision: https://reviews.llvm.org/D85891
Added:
Modified:
llvm/test/tools/llvm-readobj/ELF/packed-relocs.test
llvm/test/tools/llvm-readobj/ELF/relr-relocs.test
llvm/tools/llvm-readobj/ELFDumper.cpp
Removed:
################################################################################
diff --git a/llvm/test/tools/llvm-readobj/ELF/packed-relocs.test b/llvm/test/tools/llvm-readobj/ELF/packed-relocs.test
index bdadeddbbeac..43ba16856a78 100644
--- a/llvm/test/tools/llvm-readobj/ELF/packed-relocs.test
+++ b/llvm/test/tools/llvm-readobj/ELF/packed-relocs.test
@@ -49,7 +49,7 @@ Symbols:
# 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
+# RUN: 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 {
@@ -57,8 +57,10 @@ Symbols:
# 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)
+# BROKEN-RELA-GNU: warning: '[[FILE]]': unable to get the number of relocations in 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-GNU: Relocation section '.rela.dyn' at offset 0xffffffff contains <?> 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_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)
## Check we report a warning when the sh_link field of the SHT_ANDROID_RELA section is broken.
@@ -130,7 +132,7 @@ Symbols:
# 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
+# RUN: 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 {
@@ -138,8 +140,10 @@ Symbols:
# 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
+# BROKEN-REL-GNU: warning: '[[FILE]]': unable to get the number of relocations in SHT_ANDROID_REL section with index 1: section [index 1] has a sh_offset (0xffffffff) + sh_size (0x12) that cannot be represented
+# BROKEN-REL-GNU: Relocation section '.rel.dyn' at offset 0xffffffff contains <?> entries:
+# BROKEN-REL-GNU-NEXT: Offset Info Type Sym. Value Symbol's Name
+# BROKEN-REL-GNU-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
## Check we report a warning when the sh_link field of the SHT_ANDROID_REL section is broken.
diff --git a/llvm/test/tools/llvm-readobj/ELF/relr-relocs.test b/llvm/test/tools/llvm-readobj/ELF/relr-relocs.test
index 16bb47ff03c2..22a56c193684 100644
--- a/llvm/test/tools/llvm-readobj/ELF/relr-relocs.test
+++ b/llvm/test/tools/llvm-readobj/ELF/relr-relocs.test
@@ -160,8 +160,8 @@ Sections:
# 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
+# RUN: llvm-readelf --relocations %t2.broken 2>&1 | \
+# RUN: FileCheck -DFILE=%t2.broken --check-prefix=BROKEN-GNU %s -DSECNAME=SHT_RELR
# BROKEN-LLVM: Relocations [
# BROKEN-LLVM-NEXT: Section (1) .relr.dyn {
@@ -169,17 +169,18 @@ Sections:
# 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
+# BROKEN-GNU: warning: '[[FILE]]': unable to get the number of relocations in [[SECNAME]] section with index 1: section [index 1] has an invalid sh_entsize: 1
+# BROKEN-GNU: Relocation section '.relr.dyn' at offset 0x34 contains <?> entries:
+# BROKEN-GNU-NEXT: Offset Info Type Sym. Value Symbol's Name
+# BROKEN-GNU-NEXT: warning: '[[FILE]]': unable to read relocations from [[SECNAME]] section with index 1: 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
+# RUN: llvm-readelf --relocations %t2.broken.android 2>&1 | \
+# RUN: FileCheck -DFILE=%t2.broken.android --check-prefix=BROKEN-GNU %s -DSECNAME=SHT_ANDROID_RELR
## Check the behavior when the sh_link field of the SHT_RELR/SHT_ANDROID_RELR section
## is set to an arbitrary value. Normally, it is set to 0, because such sections contains
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index 461d1894d1ec..e171cdcb2f42 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -3749,30 +3749,47 @@ static bool isRelocationSec(const typename ELFT::Shdr &Sec) {
}
template <class ELFT> void GNUStyle<ELFT>::printRelocations(const ELFO *Obj) {
+ auto GetEntriesNum = [&](const Elf_Shdr &Sec) -> Expected<size_t> {
+ // Android's packed relocation section needs to be unpacked first
+ // to get the actual number of entries.
+ if (Sec.sh_type == ELF::SHT_ANDROID_REL ||
+ Sec.sh_type == ELF::SHT_ANDROID_RELA) {
+ Expected<std::vector<typename ELFT::Rela>> RelasOrErr =
+ Obj->android_relas(&Sec);
+ if (!RelasOrErr)
+ return RelasOrErr.takeError();
+ return RelasOrErr->size();
+ }
+
+ if (!opts::RawRelr && (Sec.sh_type == ELF::SHT_RELR ||
+ Sec.sh_type == ELF::SHT_ANDROID_RELR)) {
+ Expected<Elf_Relr_Range> RelrsOrErr = Obj->relrs(&Sec);
+ if (!RelrsOrErr)
+ return RelrsOrErr.takeError();
+ return Obj->decode_relrs(*RelrsOrErr).size();
+ }
+
+ return Sec.getEntityCount();
+ };
+
bool HasRelocSections = false;
for (const Elf_Shdr &Sec : cantFail(Obj->sections())) {
if (!isRelocationSec<ELFT>(Sec))
continue;
HasRelocSections = true;
- unsigned Entries;
- // Android's packed relocation section needs to be unpacked first
- // to get the actual number of entries.
- if (Sec.sh_type == ELF::SHT_ANDROID_REL ||
- Sec.sh_type == ELF::SHT_ANDROID_RELA) {
- Entries = unwrapOrError(this->FileName, Obj->android_relas(&Sec)).size();
- } else if (!opts::RawRelr && (Sec.sh_type == ELF::SHT_RELR ||
- Sec.sh_type == ELF::SHT_ANDROID_RELR)) {
- Elf_Relr_Range Relrs = unwrapOrError(this->FileName, Obj->relrs(&Sec));
- Entries = Obj->decode_relrs(Relrs).size();
- } else {
- Entries = Sec.getEntityCount();
- }
+ std::string EntriesNum = "<?>";
+ if (Expected<size_t> NumOrErr = GetEntriesNum(Sec))
+ EntriesNum = std::to_string(*NumOrErr);
+ else
+ this->reportUniqueWarning(createError(
+ "unable to get the number of relocations in " + describe(Obj, Sec) +
+ ": " + toString(NumOrErr.takeError())));
uintX_t Offset = Sec.sh_offset;
StringRef Name = this->getPrintableSectionName(Obj, Sec);
OS << "\nRelocation section '" << Name << "' at offset 0x"
- << to_hexString(Offset, false) << " contains " << Entries
+ << to_hexString(Offset, false) << " contains " << EntriesNum
<< " entries:\n";
printRelocHeader(Sec.sh_type);
this->printRelocationsHelper(Obj, Sec);
More information about the llvm-commits
mailing list