Support: Add dwarf::getLanguage()
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Fri, 6 Feb 2015 22:55:13 +0000 (22:55 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Fri, 6 Feb 2015 22:55:13 +0000 (22:55 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228458 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 5fed4433a7dc07cbfb076264459458cc761fb06c..46bf73285410396aa46218d6561e703fccdb726f 100644 (file)
@@ -755,8 +755,16 @@ const char *GDBIndexEntryKindString(GDBIndexEntryKind Kind);
 const char *GDBIndexEntryLinkageString(GDBIndexEntryLinkage Linkage);
 /// @}
 
-/// \brief Get the tag number associated with a tag string.
+/// \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.
+///
+/// @{
 unsigned getTag(StringRef TagString);
+unsigned getLanguage(StringRef LanguageString);
+/// @}
 
 /// \brief Returns the symbolic string representing Val when used as a value
 /// for attribute Attr.
index 8e36396f070b6d89e5a6faf4382e89b8c8b09852..9972960d3737ef4078cd93108e11222e1fedd1aa 100644 (file)
@@ -489,6 +489,13 @@ const char *llvm::dwarf::LanguageString(unsigned Language) {
   }
 }
 
+unsigned llvm::dwarf::getLanguage(StringRef LanguageString) {
+  return StringSwitch<unsigned>(LanguageString)
+#define HANDLE_DW_LANG(ID, NAME) .Case("DW_LANG_" #NAME, DW_LANG_##NAME)
+#include "llvm/Support/Dwarf.def"
+      .Default(0);
+}
+
 const char *llvm::dwarf::CaseString(unsigned Case) {
   switch (Case) {
   case DW_ID_case_sensitive:             return "DW_ID_case_sensitive";
index a1438205f73343304d29d434f480ad9a05d1ec41..2dccfe7ad3c0ce121ae498f547b0293313a015d9 100644 (file)
@@ -52,4 +52,21 @@ TEST(DwarfTest, LanguageStringOnInvalid) {
   EXPECT_EQ(nullptr, LanguageString(DW_LANG_hi_user));
 }
 
+TEST(DwarfTest, getLanguage) {
+  // A couple of valid languages.
+  EXPECT_EQ(DW_LANG_C89, getLanguage("DW_LANG_C89"));
+  EXPECT_EQ(DW_LANG_C_plus_plus_11, getLanguage("DW_LANG_C_plus_plus_11"));
+  EXPECT_EQ(DW_LANG_OCaml, getLanguage("DW_LANG_OCaml"));
+  EXPECT_EQ(DW_LANG_Mips_Assembler, getLanguage("DW_LANG_Mips_Assembler"));
+
+  // Invalid languages.
+  EXPECT_EQ(0u, getLanguage("DW_LANG_invalid"));
+  EXPECT_EQ(0u, getLanguage("DW_TAG_array_type"));
+  EXPECT_EQ(0u, getLanguage("something else"));
+
+  // Language range markers should not be recognized.
+  EXPECT_EQ(0u, getLanguage("DW_LANG_lo_user"));
+  EXPECT_EQ(0u, getLanguage("DW_LANG_hi_user"));
+}
+
 } // end namespace