Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions llvm/include/llvm/BinaryFormat/Dwarf.h
Original file line number Diff line number Diff line change
Expand Up @@ -997,6 +997,7 @@ LLVM_ABI StringRef VisibilityString(unsigned Visibility);
LLVM_ABI StringRef VirtualityString(unsigned Virtuality);
LLVM_ABI StringRef EnumKindString(unsigned EnumKind);
LLVM_ABI StringRef LanguageString(unsigned Language);
LLVM_ABI StringRef SourceLanguageNameString(SourceLanguageName Lang);
LLVM_ABI StringRef CaseString(unsigned Case);
LLVM_ABI StringRef ConventionString(unsigned Convention);
LLVM_ABI StringRef InlineCodeString(unsigned Code);
Expand Down Expand Up @@ -1038,6 +1039,7 @@ LLVM_ABI unsigned getSubOperationEncoding(unsigned OpEncoding,
LLVM_ABI unsigned getVirtuality(StringRef VirtualityString);
LLVM_ABI unsigned getEnumKind(StringRef EnumKindString);
LLVM_ABI unsigned getLanguage(StringRef LanguageString);
LLVM_ABI unsigned getSourceLanguageName(StringRef SourceLanguageNameString);
LLVM_ABI unsigned getCallingConvention(StringRef LanguageString);
LLVM_ABI unsigned getAttributeEncoding(StringRef EncodingString);
LLVM_ABI unsigned getMacinfo(StringRef MacinfoString);
Expand Down
20 changes: 20 additions & 0 deletions llvm/lib/BinaryFormat/Dwarf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -472,6 +472,26 @@ StringRef llvm::dwarf::LanguageDescription(dwarf::SourceLanguageName lname) {
return "Unknown";
}

llvm::StringRef llvm::dwarf::SourceLanguageNameString(SourceLanguageName Lang) {
switch (Lang) {
#define HANDLE_DW_LNAME(ID, NAME, DESC, LOWER_BOUND) \
case DW_LNAME_##NAME: \
return "DW_LNAME_" #NAME;
#include "llvm/BinaryFormat/Dwarf.def"
}

return {};
}

unsigned
llvm::dwarf::getSourceLanguageName(StringRef SourceLanguageNameString) {
return StringSwitch<unsigned>(SourceLanguageNameString)
#define HANDLE_DW_LNAME(ID, NAME, DESC, LOWER_BOUND) \
.Case("DW_LNAME_" #NAME, DW_LNAME_##NAME)
#include "llvm/BinaryFormat/Dwarf.def"
.Default(0);
}

StringRef llvm::dwarf::CaseString(unsigned Case) {
switch (Case) {
case DW_ID_case_sensitive:
Expand Down
35 changes: 35 additions & 0 deletions llvm/unittests/BinaryFormat/DwarfTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -219,4 +219,39 @@ TEST(DwarfTest, lname) {
EXPECT_EQ(roundtrip(DW_LANG_##NAME), DW_LANG_##NAME);
#include "llvm/BinaryFormat/Dwarf.def"
}

TEST(DwarfTest, lname_getSourceLanguageName) {
// Some basics.
EXPECT_EQ(getSourceLanguageName("DW_LNAME_Ada"), DW_LNAME_Ada);
EXPECT_EQ(getSourceLanguageName("DW_LNAME_Metal"), DW_LNAME_Metal);

// Test invalid input.
EXPECT_EQ(getSourceLanguageName(""), 0U);
EXPECT_EQ(getSourceLanguageName("blah"), 0U);
EXPECT_EQ(getSourceLanguageName("DW_LNAME__something_unlikely"), 0U);
EXPECT_EQ(getSourceLanguageName("DW_LANG_C"), 0U);

// Test that we cover all DW_LNAME_ names.
#define xstr(X) #X
#define HANDLE_DW_LNAME(ID, NAME, DESC, LOWER_BOUND) \
EXPECT_EQ(getSourceLanguageName(xstr(DW_LNAME_##NAME)), DW_LNAME_##NAME);
#include "llvm/BinaryFormat/Dwarf.def"
}

TEST(DwarfTest, lname_SourceLanguageNameString) {
// Some basics.
EXPECT_EQ(SourceLanguageNameString(DW_LNAME_C_plus_plus),
"DW_LNAME_C_plus_plus");
EXPECT_EQ(SourceLanguageNameString(DW_LNAME_CPP_for_OpenCL),
"DW_LNAME_CPP_for_OpenCL");

// Test invalid input.
EXPECT_EQ(SourceLanguageNameString(static_cast<SourceLanguageName>(0)), "");

// Test that we cover all DW_LNAME_ names.
#define xstr(X) #X
#define HANDLE_DW_LNAME(ID, NAME, DESC, LOWER_BOUND) \
EXPECT_EQ(SourceLanguageNameString(DW_LNAME_##NAME), xstr(DW_LNAME_##NAME));
#include "llvm/BinaryFormat/Dwarf.def"
}
} // end namespace