Support: Add dwarf::getVirtuality()
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Sat, 7 Feb 2015 00:37:15 +0000 (00:37 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Sat, 7 Feb 2015 00:37:15 +0000 (00:37 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228474 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Support/Dwarf.h
lib/Support/Dwarf.cpp
unittests/Support/DwarfTest.cpp

index fc99a4b32369c32a7434e7a905ed70c9a13e0b3d..c2d6e4ceb2f452cf88e259f2ecc7c9006d3b1b52 100644 (file)
@@ -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);
 /// @}
index 866d7e55c85f4fc58983e057f276cfe7f55a8606..632ce868c5e5869a170ff4d190026ce0b601c663 100644 (file)
@@ -473,6 +473,14 @@ const char *llvm::dwarf::VirtualityString(unsigned Virtuality) {
   }
 }
 
+unsigned llvm::dwarf::getVirtuality(StringRef VirtualityString) {
+  return StringSwitch<unsigned>(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:
index 38a179f7929772f8abf0f7fe2625897f3b15f21c..dfdf5a26a09db85a3fd212885b80382de6e8a3c8 100644 (file)
@@ -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