From 5a504d487c6ce4dc72c8da211c35861691ae6c7c Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Sat, 7 Feb 2015 00:37:15 +0000 Subject: [PATCH] Support: Add dwarf::getVirtuality() git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228474 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/Dwarf.h | 10 +++++++--- lib/Support/Dwarf.cpp | 8 ++++++++ unittests/Support/DwarfTest.cpp | 12 ++++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/include/llvm/Support/Dwarf.h b/include/llvm/Support/Dwarf.h index fc99a4b3236..c2d6e4ceb2f 100644 --- a/include/llvm/Support/Dwarf.h +++ b/include/llvm/Support/Dwarf.h @@ -38,7 +38,8 @@ namespace dwarf { enum LLVMConstants : uint32_t { // LLVM mock tags (see also llvm/Support/Dwarf.def). - DW_TAG_invalid = ~0U, // Tag for invalid results. + DW_TAG_invalid = ~0U, // Tag for invalid results. + DW_VIRTUALITY_invalid = ~0U, // Virtuality for invalid results. // Other constants. DWARF_VERSION = 4, // Default dwarf version we output. @@ -742,11 +743,14 @@ const char *GDBIndexEntryLinkageString(GDBIndexEntryLinkage Linkage); /// \defgroup DwarfConstantsParsing Dwarf constants parsing functions /// /// These functions map their strings back to the corresponding enumeration -/// value or return 0 if there is none. As an exception, \a getTag() returns -/// \a DW_TAG_invalid on invalid input. +/// value or return 0 if there is none, except for these exceptions: +/// +/// \li \a getTag() returns \a DW_TAG_invalid on invalid input. +/// \li \a getVirtuality() returns \a DW_VIRTUALITY_invalid on invalid input. /// /// @{ unsigned getTag(StringRef TagString); +unsigned getVirtuality(StringRef VirtualityString); unsigned getLanguage(StringRef LanguageString); unsigned getAttributeEncoding(StringRef EncodingString); /// @} diff --git a/lib/Support/Dwarf.cpp b/lib/Support/Dwarf.cpp index 866d7e55c85..632ce868c5e 100644 --- a/lib/Support/Dwarf.cpp +++ b/lib/Support/Dwarf.cpp @@ -473,6 +473,14 @@ const char *llvm::dwarf::VirtualityString(unsigned Virtuality) { } } +unsigned llvm::dwarf::getVirtuality(StringRef VirtualityString) { + return StringSwitch(VirtualityString) +#define HANDLE_DW_VIRTUALITY(ID, NAME) \ + .Case("DW_VIRTUALITY_" #NAME, DW_VIRTUALITY_##NAME) +#include "llvm/Support/Dwarf.def" + .Default(DW_VIRTUALITY_invalid); +} + const char *llvm::dwarf::LanguageString(unsigned Language) { switch (Language) { default: diff --git a/unittests/Support/DwarfTest.cpp b/unittests/Support/DwarfTest.cpp index 38a179f7929..dfdf5a26a09 100644 --- a/unittests/Support/DwarfTest.cpp +++ b/unittests/Support/DwarfTest.cpp @@ -109,4 +109,16 @@ TEST(DwarfTest, VirtualityString) { EXPECT_EQ(nullptr, VirtualityString(DW_VIRTUALITY_max + 77)); } +TEST(DwarfTest, getVirtuality) { + EXPECT_EQ(DW_VIRTUALITY_none, getVirtuality("DW_VIRTUALITY_none")); + EXPECT_EQ(DW_VIRTUALITY_virtual, getVirtuality("DW_VIRTUALITY_virtual")); + EXPECT_EQ(DW_VIRTUALITY_pure_virtual, + getVirtuality("DW_VIRTUALITY_pure_virtual")); + + // Invalid strings. + EXPECT_EQ(DW_VIRTUALITY_invalid, getVirtuality("DW_VIRTUALITY_invalid")); + EXPECT_EQ(DW_VIRTUALITY_invalid, getVirtuality("DW_VIRTUALITY_max")); + EXPECT_EQ(DW_VIRTUALITY_invalid, getVirtuality("something else")); +} + } // end namespace -- 2.34.1