summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>2015-02-06 22:55:13 +0000
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>2015-02-06 22:55:13 +0000
commitd40af00e66b8b15960614d423681953ea7a41eb2 (patch)
tree57e52d848fdf2b191700e0ce81dea0b890302a20
parent0317944b1a6dc9aa06acc66e8849ea63df8f3da1 (diff)
downloadbcm5719-llvm-d40af00e66b8b15960614d423681953ea7a41eb2.tar.gz
bcm5719-llvm-d40af00e66b8b15960614d423681953ea7a41eb2.zip
Support: Add dwarf::getLanguage()
llvm-svn: 228458
-rw-r--r--llvm/include/llvm/Support/Dwarf.h10
-rw-r--r--llvm/lib/Support/Dwarf.cpp7
-rw-r--r--llvm/unittests/Support/DwarfTest.cpp17
3 files changed, 33 insertions, 1 deletions
diff --git a/llvm/include/llvm/Support/Dwarf.h b/llvm/include/llvm/Support/Dwarf.h
index 5fed4433a7d..46bf7328541 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 8e36396f070..9972960d373 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<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";
diff --git a/llvm/unittests/Support/DwarfTest.cpp b/llvm/unittests/Support/DwarfTest.cpp
index a1438205f73..2dccfe7ad3c 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
OpenPOWER on IntegriCloud