diff options
| author | Ryan Prichard <rprichard@google.com> | 2018-10-26 23:01:54 +0000 |
|---|---|---|
| committer | Ryan Prichard <rprichard@google.com> | 2018-10-26 23:01:54 +0000 |
| commit | 0c20b5be7cf7039dc307f135318d537a187d3cc3 (patch) | |
| tree | 167b99af0b6cd98540e131b67bdc2122a2eae5bb /llvm/tools | |
| parent | 20d5a867937c1db29b22b754ee86caae2c68eca9 (diff) | |
| download | bcm5719-llvm-0c20b5be7cf7039dc307f135318d537a187d3cc3.tar.gz bcm5719-llvm-0c20b5be7cf7039dc307f135318d537a187d3cc3.zip | |
[llvm-readobj] Fix bugs with unrecognized types in switch statements
Summary:
Add missing breaks. Several functions used nested switch statements,
where the outer switch branches based on the architecture, and the inner
switch handles architecture-specific types. If the type isn't
architecture-specific, break out to the generic types rather than fall
through.
getElfPtType: For GNU-style output, llvm-readobj prints
"<unknown>: 0xnnnnnnnn" for an unrecognized segment type, unless the
architecture is EM_ARM, EM_MIPS, or EM_MIPS_RS3_LE, in which case it
prints "". This behavior appears accidental, so instead, always print
the "<unknown>: 0xnnnnnnnn" string.
Reviewers: pcc, grimar
Reviewed By: grimar
Subscribers: sdardis, javed.absar, arichardson, kristof.beyls, atanasyan, llvm-commits
Differential Revision: https://reviews.llvm.org/D53730
llvm-svn: 345436
Diffstat (limited to 'llvm/tools')
| -rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 5e8a35f13a1..a1cf0aef1b4 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -1194,6 +1194,7 @@ static const char *getElfSegmentType(unsigned Arch, unsigned Type) { switch (Type) { LLVM_READOBJ_ENUM_CASE(ELF, PT_ARM_EXIDX); } + break; case ELF::EM_MIPS: case ELF::EM_MIPS_RS3_LE: switch (Type) { @@ -1202,6 +1203,7 @@ static const char *getElfSegmentType(unsigned Arch, unsigned Type) { LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_OPTIONS); LLVM_READOBJ_ENUM_CASE(ELF, PT_MIPS_ABIFLAGS); } + break; } switch (Type) { @@ -1248,7 +1250,7 @@ static std::string getElfPtType(unsigned Arch, unsigned Type) { case ELF::EM_ARM: if (Type == ELF::PT_ARM_EXIDX) return "EXIDX"; - return ""; + break; case ELF::EM_MIPS: case ELF::EM_MIPS_RS3_LE: switch (Type) { @@ -1261,7 +1263,7 @@ static std::string getElfPtType(unsigned Arch, unsigned Type) { case PT_MIPS_ABIFLAGS: return "ABIFLAGS"; } - return ""; + break; } } return std::string("<unknown>: ") + to_string(format_hex(Type, 1)); @@ -1638,29 +1640,32 @@ static const char *getTypeString(unsigned Arch, uint64_t Type) { case EM_HEXAGON: switch (Type) { #define HEXAGON_DYNAMIC_TAG(name, value) \ - case DT_##name: \ - return #name; + case DT_##name: \ + return #name; #include "llvm/BinaryFormat/DynamicTags.def" #undef HEXAGON_DYNAMIC_TAG } + break; case EM_MIPS: switch (Type) { #define MIPS_DYNAMIC_TAG(name, value) \ - case DT_##name: \ - return #name; + case DT_##name: \ + return #name; #include "llvm/BinaryFormat/DynamicTags.def" #undef MIPS_DYNAMIC_TAG } + break; - case EM_PPC64: - switch(Type) { + case EM_PPC64: + switch(Type) { #define PPC64_DYNAMIC_TAG(name, value) \ case DT_##name: \ return #name; #include "llvm/BinaryFormat/DynamicTags.def" #undef PPC64_DYNAMIC_TAG } + break; } #undef DYNAMIC_TAG switch (Type) { @@ -2829,11 +2834,13 @@ std::string getSectionTypeString(unsigned Arch, unsigned Type) { case SHT_ARM_OVERLAYSECTION: return "ARM_OVERLAYSECTION"; } + break; case EM_X86_64: switch (Type) { case SHT_X86_64_UNWIND: return "X86_64_UNWIND"; } + break; case EM_MIPS: case EM_MIPS_RS3_LE: switch (Type) { @@ -2846,6 +2853,7 @@ std::string getSectionTypeString(unsigned Arch, unsigned Type) { case SHT_MIPS_DWARF: return "SHT_MIPS_DWARF"; } + break; } switch (Type) { case SHT_NULL: |

