From ce7f30b2a874386a0ce089c98327acb65e87b04d Mon Sep 17 00:00:00 2001 From: Alexandre Ganea Date: Thu, 7 Jan 2021 15:41:47 -0500 Subject: [PATCH] [llvm-pdbutil] Don't crash when printing unknown CodeView type records Differential Revision: https://reviews.llvm.org/D93720 --- llvm/test/tools/llvm-pdbutil/Inputs/unknown-record.obj | Bin 0 -> 3284 bytes llvm/test/tools/llvm-pdbutil/unknown-records.test | 3 +++ llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp | 16 ++++++---------- llvm/tools/llvm-pdbutil/FormatUtil.cpp | 7 ++++--- llvm/tools/llvm-pdbutil/FormatUtil.h | 2 +- 5 files changed, 14 insertions(+), 14 deletions(-) create mode 100644 llvm/test/tools/llvm-pdbutil/Inputs/unknown-record.obj create mode 100644 llvm/test/tools/llvm-pdbutil/unknown-records.test diff --git a/llvm/test/tools/llvm-pdbutil/Inputs/unknown-record.obj b/llvm/test/tools/llvm-pdbutil/Inputs/unknown-record.obj new file mode 100644 index 0000000000000000000000000000000000000000..0be00ffdd922f78b89de62d473473d0f461820db GIT binary patch literal 3284 zcmcInU2GIp6h5=lmj1K5K*eI>SXKq%4!do|(u&>fAB$|e)m>;MW9oKx+79ktc4tdP zF*T?J(F7ACZ@vOA`nr8nWsC5&hOvmW%S zQ_mN-wJ(ZAKxGi$C4jypNn88+2f}-ziRiAL&K7)n2NNwznXzc!P@fgXZ-m>Za=n885=XSqM_u*_XlNssFNP|2qB{HXbs&*Cklv_ z-45z%Ay>>z7}BPvH%qa+p=b1idUjIk&1Ld>S}Ty3e4eqfX>}}V7zKU2gq3M6cvD(B zuNBIQ%hzQa7&x|%m=tUwnq|Ad zo85pGJ3PxaR-xtiv#E_#?csHY;+>rXxg7lgUI56a#4Wsg>DgH9V%L?gtE=w6;C^C+ zXp_m;F6!d&_X|DeC!f3;{rt^8i59?*0#~w;YCeB^F?q_2H>Y|PMLp|a<4>R)fpzqY zP1RBqhFZK~o2sSA(S*-^H0rC49R982Si%>IycP9HzhVxRQHRfWoVy1sJ|q?N0KQhN zcyh#?eXP${eJqNlsv}IE$EmbQ|e3+!zr zWMYCbr5DYO=NVRd%$OUGF7LerbbxiQ2OmV^d@ z8phEDIC;eMYM_YNI22pwUF6l0%biCm)kAM130^LKY$&G{vdV4JFj+v~OF|P5xj>u8 zVqtzxrkbW%p0o^{Oq9FBdytW#p?D}nkY{}rm|tHZzz@O8-m;EnoC_{&JjSsjmq1nA z0-8zmde(`w3VqJ*2GEvWqs01M&|huKvb+o4-c0`%sx*DLZKXoyHd0j+pDNrfSd;yC zHL-nc$BU|wD;%P^hgPy4&CeaQ<$61n;X-b*kjzK}sAolK(@e*<&B~3sw^uKgl4&V! zlu~+5X$=Io^MnblSk!abWLnwVt0Z!{bWs_MgABIItsQdf_O`Y*Wn9lHkzCOj-PW$m z0M)dt&1lf=wRM~ImyfNvZ!3wzv>I#=;656sYxWv`Rr2q9O!DuH`z8NiLh|owxr;7^ z6VbteUPaHU=~7B-xy#xdH5{M6Y=3W|azxLjatDgiZrvy{Uvc zTbaCMelV~&D;SUia&UW~Jtzm1l3FnCc#+~%vY@3_unf&LQbiNzx(7MVb?z&~VGUZ# z%bQwx=Z+rGv;Tvq$Zlt$#IWQa<=W9yNe%Fz5x5%Y2CfCp&uv^avF_pKv(4uZ{S&zG z#*Pu~l=}Xuqa$^fHheKR|Iyp8oj7^Tf>$;Y#zu z*@I`e)-Z%rJWgaib)rxyT))oMHZ-9n4LJ}vPQt9kDSyOr%@YNF#x8~Oha~TTDDV@O zEB6g3f0S~)6a}vJW_9{9iaO3vF2l1$!Ffuj-&6W5>2h8CW)y|f_&T~O_?2P84US}L zvF<2qj5+2#V9ScQ&s^k-4z<|~e!Jk_FMs&5iK4)F5W`ey{f`#K-&UJ6WvKiayb2?t zz;_?7c=F{lQ?@9YZkse^oIe2xX0jGhSaijfLww2}#C+R}LS%8wA$Ei4?hZIt*HiuB qa3~VmN8J;ptZLq7&x9l4{vPvk3x+V_D`k;-DW4e;pZSKj=zjr|e2DV^ literal 0 HcmV?d00001 diff --git a/llvm/test/tools/llvm-pdbutil/unknown-records.test b/llvm/test/tools/llvm-pdbutil/unknown-records.test new file mode 100644 index 0000000..9773b85 --- /dev/null +++ b/llvm/test/tools/llvm-pdbutil/unknown-records.test @@ -0,0 +1,3 @@ +; REQUIRES: diasdk +; RUN: llvm-pdbutil dump -all %p/Inputs/unknown-record.obj | FileCheck %s +; CHECK: UNKNOWN RECORD (0x1609) diff --git a/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp b/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp index aa185e8..3d8a86f 100644 --- a/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp +++ b/llvm/tools/llvm-pdbutil/DumpOutputStyle.cpp @@ -738,21 +738,17 @@ namespace { constexpr uint32_t kNoneUdtKind = 0; constexpr uint32_t kSimpleUdtKind = 1; constexpr uint32_t kUnknownUdtKind = 2; -const StringRef NoneLabel(""); -const StringRef SimpleLabel(""); -const StringRef UnknownLabel(""); - } // namespace -static StringRef getUdtStatLabel(uint32_t Kind) { +static std::string getUdtStatLabel(uint32_t Kind) { if (Kind == kNoneUdtKind) - return NoneLabel; + return ""; if (Kind == kSimpleUdtKind) - return SimpleLabel; + return ""; if (Kind == kUnknownUdtKind) - return UnknownLabel; + return ""; return formatTypeLeafKind(static_cast(Kind)); } @@ -760,7 +756,7 @@ static StringRef getUdtStatLabel(uint32_t Kind) { static uint32_t getLongestTypeLeafName(const StatCollection &Stats) { size_t L = 0; for (const auto &Stat : Stats.Individual) { - StringRef Label = getUdtStatLabel(Stat.first); + std::string Label = getUdtStatLabel(Stat.first); L = std::max(L, Label.size()); } return static_cast(L); @@ -869,7 +865,7 @@ Error DumpOutputStyle::dumpUdtStats() { P.formatLine("{0}", fmt_repeat('-', TableWidth)); for (const auto &Stat : UdtTargetStats.getStatsSortedBySize()) { - StringRef Label = getUdtStatLabel(Stat.first); + std::string Label = getUdtStatLabel(Stat.first); P.formatLine("{0} | {1:N} {2:N}", fmt_align(Label, AlignStyle::Right, FieldWidth), fmt_align(Stat.second.Count, AlignStyle::Right, CD), diff --git a/llvm/tools/llvm-pdbutil/FormatUtil.cpp b/llvm/tools/llvm-pdbutil/FormatUtil.cpp index c9ef196..b483739 100644 --- a/llvm/tools/llvm-pdbutil/FormatUtil.cpp +++ b/llvm/tools/llvm-pdbutil/FormatUtil.cpp @@ -156,16 +156,17 @@ std::string llvm::pdb::formatSymbolKind(SymbolKind K) { return formatUnknownEnum(K); } -StringRef llvm::pdb::formatTypeLeafKind(TypeLeafKind K) { +std::string llvm::pdb::formatTypeLeafKind(TypeLeafKind K) { switch (K) { #define TYPE_RECORD(EnumName, value, name) \ case EnumName: \ return #EnumName; #include "llvm/DebugInfo/CodeView/CodeViewTypes.def" default: - llvm_unreachable("Unknown type leaf kind!"); + return formatv("UNKNOWN RECORD ({0:X})", + static_cast>(K)) + .str(); } - return ""; } std::string llvm::pdb::formatSegmentOffset(uint16_t Segment, uint32_t Offset) { diff --git a/llvm/tools/llvm-pdbutil/FormatUtil.h b/llvm/tools/llvm-pdbutil/FormatUtil.h index 133a0eb..b99ccec 100644 --- a/llvm/tools/llvm-pdbutil/FormatUtil.h +++ b/llvm/tools/llvm-pdbutil/FormatUtil.h @@ -66,7 +66,7 @@ std::string typesetStringList(uint32_t IndentLevel, std::string formatChunkKind(codeview::DebugSubsectionKind Kind, bool Friendly = true); std::string formatSymbolKind(codeview::SymbolKind K); -StringRef formatTypeLeafKind(codeview::TypeLeafKind K); +std::string formatTypeLeafKind(codeview::TypeLeafKind K); /// Returns the number of digits in the given integer. inline int NumDigits(uint64_t N) { -- 2.7.4