Skip to content

Commit 0c10024

Browse files
Michael137clingfei
authored andcommitted
[llvm][Dwarf] Add DW_LNAME_ string/enum getters (llvm#162434)
These are going to be used in a follow-up patch. And they are generally useful for consumers (we have these for most other attributes).
1 parent 8957462 commit 0c10024

File tree

3 files changed

+57
-0
lines changed

3 files changed

+57
-0
lines changed

llvm/include/llvm/BinaryFormat/Dwarf.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -997,6 +997,7 @@ LLVM_ABI StringRef VisibilityString(unsigned Visibility);
997997
LLVM_ABI StringRef VirtualityString(unsigned Virtuality);
998998
LLVM_ABI StringRef EnumKindString(unsigned EnumKind);
999999
LLVM_ABI StringRef LanguageString(unsigned Language);
1000+
LLVM_ABI StringRef SourceLanguageNameString(SourceLanguageName Lang);
10001001
LLVM_ABI StringRef CaseString(unsigned Case);
10011002
LLVM_ABI StringRef ConventionString(unsigned Convention);
10021003
LLVM_ABI StringRef InlineCodeString(unsigned Code);
@@ -1038,6 +1039,7 @@ LLVM_ABI unsigned getSubOperationEncoding(unsigned OpEncoding,
10381039
LLVM_ABI unsigned getVirtuality(StringRef VirtualityString);
10391040
LLVM_ABI unsigned getEnumKind(StringRef EnumKindString);
10401041
LLVM_ABI unsigned getLanguage(StringRef LanguageString);
1042+
LLVM_ABI unsigned getSourceLanguageName(StringRef SourceLanguageNameString);
10411043
LLVM_ABI unsigned getCallingConvention(StringRef LanguageString);
10421044
LLVM_ABI unsigned getAttributeEncoding(StringRef EncodingString);
10431045
LLVM_ABI unsigned getMacinfo(StringRef MacinfoString);

llvm/lib/BinaryFormat/Dwarf.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,26 @@ StringRef llvm::dwarf::LanguageDescription(dwarf::SourceLanguageName lname) {
472472
return "Unknown";
473473
}
474474

475+
llvm::StringRef llvm::dwarf::SourceLanguageNameString(SourceLanguageName Lang) {
476+
switch (Lang) {
477+
#define HANDLE_DW_LNAME(ID, NAME, DESC, LOWER_BOUND) \
478+
case DW_LNAME_##NAME: \
479+
return "DW_LNAME_" #NAME;
480+
#include "llvm/BinaryFormat/Dwarf.def"
481+
}
482+
483+
return {};
484+
}
485+
486+
unsigned
487+
llvm::dwarf::getSourceLanguageName(StringRef SourceLanguageNameString) {
488+
return StringSwitch<unsigned>(SourceLanguageNameString)
489+
#define HANDLE_DW_LNAME(ID, NAME, DESC, LOWER_BOUND) \
490+
.Case("DW_LNAME_" #NAME, DW_LNAME_##NAME)
491+
#include "llvm/BinaryFormat/Dwarf.def"
492+
.Default(0);
493+
}
494+
475495
StringRef llvm::dwarf::CaseString(unsigned Case) {
476496
switch (Case) {
477497
case DW_ID_case_sensitive:

llvm/unittests/BinaryFormat/DwarfTest.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,4 +219,39 @@ TEST(DwarfTest, lname) {
219219
EXPECT_EQ(roundtrip(DW_LANG_##NAME), DW_LANG_##NAME);
220220
#include "llvm/BinaryFormat/Dwarf.def"
221221
}
222+
223+
TEST(DwarfTest, lname_getSourceLanguageName) {
224+
// Some basics.
225+
EXPECT_EQ(getSourceLanguageName("DW_LNAME_Ada"), DW_LNAME_Ada);
226+
EXPECT_EQ(getSourceLanguageName("DW_LNAME_Metal"), DW_LNAME_Metal);
227+
228+
// Test invalid input.
229+
EXPECT_EQ(getSourceLanguageName(""), 0U);
230+
EXPECT_EQ(getSourceLanguageName("blah"), 0U);
231+
EXPECT_EQ(getSourceLanguageName("DW_LNAME__something_unlikely"), 0U);
232+
EXPECT_EQ(getSourceLanguageName("DW_LANG_C"), 0U);
233+
234+
// Test that we cover all DW_LNAME_ names.
235+
#define xstr(X) #X
236+
#define HANDLE_DW_LNAME(ID, NAME, DESC, LOWER_BOUND) \
237+
EXPECT_EQ(getSourceLanguageName(xstr(DW_LNAME_##NAME)), DW_LNAME_##NAME);
238+
#include "llvm/BinaryFormat/Dwarf.def"
239+
}
240+
241+
TEST(DwarfTest, lname_SourceLanguageNameString) {
242+
// Some basics.
243+
EXPECT_EQ(SourceLanguageNameString(DW_LNAME_C_plus_plus),
244+
"DW_LNAME_C_plus_plus");
245+
EXPECT_EQ(SourceLanguageNameString(DW_LNAME_CPP_for_OpenCL),
246+
"DW_LNAME_CPP_for_OpenCL");
247+
248+
// Test invalid input.
249+
EXPECT_EQ(SourceLanguageNameString(static_cast<SourceLanguageName>(0)), "");
250+
251+
// Test that we cover all DW_LNAME_ names.
252+
#define xstr(X) #X
253+
#define HANDLE_DW_LNAME(ID, NAME, DESC, LOWER_BOUND) \
254+
EXPECT_EQ(SourceLanguageNameString(DW_LNAME_##NAME), xstr(DW_LNAME_##NAME));
255+
#include "llvm/BinaryFormat/Dwarf.def"
256+
}
222257
} // end namespace

0 commit comments

Comments
 (0)