From d40af00e66b8b15960614d423681953ea7a41eb2 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Fri, 6 Feb 2015 22:55:13 +0000 Subject: [PATCH] Support: Add dwarf::getLanguage() llvm-svn: 228458 --- llvm/include/llvm/Support/Dwarf.h | 10 +++++++++- llvm/lib/Support/Dwarf.cpp | 7 +++++++ llvm/unittests/Support/DwarfTest.cpp | 17 +++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/llvm/include/llvm/Support/Dwarf.h b/llvm/include/llvm/Support/Dwarf.h index 5fed443..46bf732 100644 --- a/llvm/include/llvm/Support/Dwarf.h +++ b/llvm/include/llvm/Support/Dwarf.h @@ -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. diff --git a/llvm/lib/Support/Dwarf.cpp b/llvm/lib/Support/Dwarf.cpp index 8e36396..9972960 100644 --- a/llvm/lib/Support/Dwarf.cpp +++ b/llvm/lib/Support/Dwarf.cpp @@ -489,6 +489,13 @@ const char *llvm::dwarf::LanguageString(unsigned Language) { } } +unsigned llvm::dwarf::getLanguage(StringRef LanguageString) { + return StringSwitch(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"; diff --git a/llvm/unittests/Support/DwarfTest.cpp b/llvm/unittests/Support/DwarfTest.cpp index a143820..2dccfe7 100644 --- a/llvm/unittests/Support/DwarfTest.cpp +++ b/llvm/unittests/Support/DwarfTest.cpp @@ -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 -- 2.7.4