Skip to content

Commit 7f51a2a

Browse files
authored
[lldb][Language] Simplify SourceLanguage::GetDescription (llvm#161804)
Currently we don't benefit from the user-friendly names that `LanguageDescription` returns because we would always use `Language::GetNameForLanguageType`. I'm not aware of a situation where `GetDescription` should prefer the non-human readable form of the name with. This patch removes the call to `GetNameForLanguageType`. `LanguageDescription` already handles languages that it doesn't know about. For those it would return `Unknown`. The LLDB language types should all be available via DWARF. If there are languages that don't map cleanly between `lldb::LanguageType` and `DW_LANG`, then we should add explicit support for that in the `SourceLanguage::SourceLanguage` constructor.
1 parent fb458aa commit 7f51a2a

File tree

3 files changed

+90
-6
lines changed

3 files changed

+90
-6
lines changed

lldb/source/Target/Language.cpp

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -543,9 +543,26 @@ Language::Language() = default;
543543
// Destructor
544544
Language::~Language() = default;
545545

546+
static std::optional<llvm::dwarf::SourceLanguage>
547+
ToDwarfSourceLanguage(lldb::LanguageType language_type) {
548+
if (language_type < lldb::eLanguageTypeLastStandardLanguage)
549+
return static_cast<llvm::dwarf::SourceLanguage>(language_type);
550+
551+
switch (language_type) {
552+
case eLanguageTypeMipsAssembler:
553+
return llvm::dwarf::DW_LANG_Mips_Assembler;
554+
default:
555+
return std::nullopt;
556+
}
557+
}
558+
546559
SourceLanguage::SourceLanguage(lldb::LanguageType language_type) {
547-
auto lname =
548-
llvm::dwarf::toDW_LNAME((llvm::dwarf::SourceLanguage)language_type);
560+
std::optional<llvm::dwarf::SourceLanguage> dwarf_lang =
561+
ToDwarfSourceLanguage(language_type);
562+
if (!dwarf_lang)
563+
return;
564+
565+
auto lname = llvm::dwarf::toDW_LNAME(*dwarf_lang);
549566
if (!lname)
550567
return;
551568
name = lname->first;
@@ -560,11 +577,8 @@ lldb::LanguageType SourceLanguage::AsLanguageType() const {
560577
}
561578

562579
llvm::StringRef SourceLanguage::GetDescription() const {
563-
LanguageType type = AsLanguageType();
564-
if (type)
565-
return Language::GetNameForLanguageType(type);
566580
return llvm::dwarf::LanguageDescription(
567-
(llvm::dwarf::SourceLanguageName)name);
581+
static_cast<llvm::dwarf::SourceLanguageName>(name));
568582
}
569583
bool SourceLanguage::IsC() const { return name == llvm::dwarf::DW_LNAME_C; }
570584

lldb/unittests/Target/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ add_lldb_unittest(TargetTests
22
ABITest.cpp
33
DynamicRegisterInfoTest.cpp
44
ExecutionContextTest.cpp
5+
Language.cpp
56
LocateModuleCallbackTest.cpp
67
MemoryRegionInfoTest.cpp
78
MemoryTest.cpp

lldb/unittests/Target/Language.cpp

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
//===-- LanguageTest.cpp --------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "lldb/Target/Language.h"
10+
#include "lldb/lldb-enumerations.h"
11+
#include "gtest/gtest.h"
12+
13+
using namespace lldb_private;
14+
using namespace lldb;
15+
16+
namespace {
17+
class LanguageTest : public ::testing::Test {};
18+
} // namespace
19+
20+
TEST_F(LanguageTest, SourceLanguage_GetDescription) {
21+
for (uint32_t i = 1; i < lldb::eNumLanguageTypes; ++i) {
22+
// 0x29 is unassigned
23+
if (i == 0x29)
24+
continue;
25+
26+
auto lang_type = static_cast<lldb::LanguageType>(i);
27+
if (lang_type == lldb::eLanguageTypeLastStandardLanguage)
28+
continue;
29+
30+
SourceLanguage lang(lang_type);
31+
32+
// eLanguageTypeHIP is not implemented as a DW_LNAME because of a conflict.
33+
if (lang_type == lldb::eLanguageTypeHIP)
34+
EXPECT_FALSE(lang);
35+
else
36+
EXPECT_TRUE(lang);
37+
}
38+
39+
EXPECT_EQ(SourceLanguage(eLanguageTypeC_plus_plus).GetDescription(),
40+
"ISO C++");
41+
EXPECT_EQ(SourceLanguage(eLanguageTypeC_plus_plus_17).GetDescription(),
42+
"ISO C++");
43+
EXPECT_EQ(SourceLanguage(eLanguageTypeC_plus_plus_20).GetDescription(),
44+
"ISO C++");
45+
46+
EXPECT_EQ(SourceLanguage(eLanguageTypeObjC).GetDescription(), "Objective C");
47+
EXPECT_EQ(SourceLanguage(eLanguageTypeMipsAssembler).GetDescription(),
48+
"Assembly");
49+
50+
auto next_vendor_language =
51+
static_cast<lldb::LanguageType>(eLanguageTypeMipsAssembler + 1);
52+
if (next_vendor_language < eNumLanguageTypes)
53+
EXPECT_NE(SourceLanguage(next_vendor_language).GetDescription(), "Unknown");
54+
55+
EXPECT_EQ(SourceLanguage(eLanguageTypeUnknown).GetDescription(), "Unknown");
56+
}
57+
58+
TEST_F(LanguageTest, SourceLanguage_AsLanguageType) {
59+
EXPECT_EQ(SourceLanguage(eLanguageTypeC_plus_plus).AsLanguageType(),
60+
eLanguageTypeC_plus_plus);
61+
EXPECT_EQ(SourceLanguage(eLanguageTypeC_plus_plus_03).AsLanguageType(),
62+
eLanguageTypeC_plus_plus_03);
63+
64+
// Vendor-specific language code.
65+
EXPECT_EQ(SourceLanguage(eLanguageTypeMipsAssembler).AsLanguageType(),
66+
eLanguageTypeAssembly);
67+
EXPECT_EQ(SourceLanguage(eLanguageTypeUnknown).AsLanguageType(),
68+
eLanguageTypeUnknown);
69+
}

0 commit comments

Comments
 (0)