diff options
author | Fangrui Song <maskray@google.com> | 2019-02-13 01:51:45 +0000 |
---|---|---|
committer | Fangrui Song <maskray@google.com> | 2019-02-13 01:51:45 +0000 |
commit | 12d55990009e5dfc3b19252044f889aed4227be2 (patch) | |
tree | ad90a8d806c844487871a344440ef32755099c9e /llvm/tools/llvm-readobj/ELFDumper.cpp | |
parent | afe1e3e6694e117e25471f4958b53e805f6ddff6 (diff) | |
download | bcm5719-llvm-12d55990009e5dfc3b19252044f889aed4227be2.tar.gz bcm5719-llvm-12d55990009e5dfc3b19252044f889aed4227be2.zip |
[llvm-readobj] Dump GNU_PROPERTY_X86_FEATURE_2_{NEEDED,USED} notes in .note.gnu.property
Summary: And change the output ("X86 features" -> "x86 feature") a bit.
Reviewers: grimar, xiangzhangllvm, hjl.tools, rupprecht
Reviewed By: rupprecht
Subscribers: rupprecht, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D58112
llvm-svn: 353908
Diffstat (limited to 'llvm/tools/llvm-readobj/ELFDumper.cpp')
-rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 59 |
1 files changed, 42 insertions, 17 deletions
diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index deb8fe0adb7..4f5fa2b15f4 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -3650,6 +3650,16 @@ static std::string getGNUProperty(uint32_t Type, uint32_t DataSize, ArrayRef<uint8_t> Data) { std::string str; raw_string_ostream OS(str); + uint32_t pr_data; + auto DumpBit = [&](uint32_t Flag, StringRef Name) { + if (pr_data & Flag) { + pr_data &= ~Flag; + OS << Name; + if (pr_data) + OS << ", "; + } + }; + switch (Type) { default: OS << format("<application-specific type 0x%x>", Type); @@ -3669,31 +3679,46 @@ static std::string getGNUProperty(uint32_t Type, uint32_t DataSize, OS << format(" <corrupt length: 0x%x>", DataSize); return OS.str(); case GNU_PROPERTY_X86_FEATURE_1_AND: - OS << "X86 features: "; + OS << "x86 feature: "; if (DataSize != 4) { OS << format("<corrupt length: 0x%x>", DataSize); return OS.str(); } - uint32_t CFProtection = - support::endian::read32<ELFT::TargetEndianness>(Data.data()); - if (CFProtection == 0) { - OS << "none"; + pr_data = support::endian::read32<ELFT::TargetEndianness>(Data.data()); + if (pr_data == 0) { + OS << "<None>"; return OS.str(); } - if (CFProtection & GNU_PROPERTY_X86_FEATURE_1_IBT) { - OS << "IBT"; - CFProtection &= ~GNU_PROPERTY_X86_FEATURE_1_IBT; - if (CFProtection) - OS << ", "; + DumpBit(GNU_PROPERTY_X86_FEATURE_1_IBT, "IBT"); + DumpBit(GNU_PROPERTY_X86_FEATURE_1_SHSTK, "SHSTK"); + if (pr_data) + OS << format("<unknown flags: 0x%x>", pr_data); + return OS.str(); + case GNU_PROPERTY_X86_FEATURE_2_NEEDED: + case GNU_PROPERTY_X86_FEATURE_2_USED: + OS << "x86 feature " + << (Type == GNU_PROPERTY_X86_FEATURE_2_NEEDED ? "needed: " : "used: "); + if (DataSize != 4) { + OS << format("<corrupt length: 0x%x>", DataSize); + return OS.str(); } - if (CFProtection & GNU_PROPERTY_X86_FEATURE_1_SHSTK) { - OS << "SHSTK"; - CFProtection &= ~GNU_PROPERTY_X86_FEATURE_1_SHSTK; - if (CFProtection) - OS << ", "; + pr_data = support::endian::read32<ELFT::TargetEndianness>(Data.data()); + if (pr_data == 0) { + OS << "<None>"; + return OS.str(); } - if (CFProtection) - OS << format("<unknown flags: 0x%x>", CFProtection); + DumpBit(GNU_PROPERTY_X86_FEATURE_2_X86, "x86"); + DumpBit(GNU_PROPERTY_X86_FEATURE_2_X87, "x87"); + DumpBit(GNU_PROPERTY_X86_FEATURE_2_MMX, "MMX"); + DumpBit(GNU_PROPERTY_X86_FEATURE_2_XMM, "XMM"); + DumpBit(GNU_PROPERTY_X86_FEATURE_2_YMM, "YMM"); + DumpBit(GNU_PROPERTY_X86_FEATURE_2_ZMM, "ZMM"); + DumpBit(GNU_PROPERTY_X86_FEATURE_2_FXSR, "FXSR"); + DumpBit(GNU_PROPERTY_X86_FEATURE_2_XSAVE, "XSAVE"); + DumpBit(GNU_PROPERTY_X86_FEATURE_2_XSAVEOPT, "XSAVEOPT"); + DumpBit(GNU_PROPERTY_X86_FEATURE_2_XSAVEC, "XSAVEC"); + if (pr_data) + OS << format("<unknown flags: 0x%x>", pr_data); return OS.str(); } } |