Skip to content

Commit f99c7a4

Browse files
committed
[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. (cherry picked from commit 7f51a2a)
1 parent e182da4 commit f99c7a4

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
@@ -548,9 +548,26 @@ Language::Language() = default;
548548
// Destructor
549549
Language::~Language() = default;
550550

551+
static std::optional<llvm::dwarf::SourceLanguage>
552+
ToDwarfSourceLanguage(lldb::LanguageType language_type) {
553+
if (language_type < lldb::eLanguageTypeLastStandardLanguage)
554+
return static_cast<llvm::dwarf::SourceLanguage>(language_type);
555+
556+
switch (language_type) {
557+
case eLanguageTypeMipsAssembler:
558+
return llvm::dwarf::DW_LANG_Mips_Assembler;
559+
default:
560+
return std::nullopt;
561+
}
562+
}
563+
551564
SourceLanguage::SourceLanguage(lldb::LanguageType language_type) {
552-
auto lname =
553-
llvm::dwarf::toDW_LNAME((llvm::dwarf::SourceLanguage)language_type);
565+
std::optional<llvm::dwarf::SourceLanguage> dwarf_lang =
566+
ToDwarfSourceLanguage(language_type);
567+
if (!dwarf_lang)
568+
return;
569+
570+
auto lname = llvm::dwarf::toDW_LNAME(*dwarf_lang);
554571
if (!lname)
555572
return;
556573
name = lname->first;
@@ -565,11 +582,8 @@ lldb::LanguageType SourceLanguage::AsLanguageType() const {
565582
}
566583

567584
llvm::StringRef SourceLanguage::GetDescription() const {
568-
LanguageType type = AsLanguageType();
569-
if (type)
570-
return Language::GetNameForLanguageType(type);
571585
return llvm::dwarf::LanguageDescription(
572-
(llvm::dwarf::SourceLanguageName)name);
586+
static_cast<llvm::dwarf::SourceLanguageName>(name));
573587
}
574588
bool SourceLanguage::IsC() const { return name == llvm::dwarf::DW_LNAME_C; }
575589

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)