From 159ee47db1b9f6f609fe8b6b3e866f995d8f2e5c Mon Sep 17 00:00:00 2001 From: Michael Buch Date: Fri, 3 Oct 2025 09:37:52 +0100 Subject: [PATCH 1/6] [lldb][Language] Simplify SourceLanguage::GetDescription 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`. --- lldb/source/Target/Language.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lldb/source/Target/Language.cpp b/lldb/source/Target/Language.cpp index 484d9badde397..7ce85dd93f091 100644 --- a/lldb/source/Target/Language.cpp +++ b/lldb/source/Target/Language.cpp @@ -559,11 +559,8 @@ lldb::LanguageType SourceLanguage::AsLanguageType() const { } llvm::StringRef SourceLanguage::GetDescription() const { - LanguageType type = AsLanguageType(); - if (type) - return Language::GetNameForLanguageType(type); return llvm::dwarf::LanguageDescription( - (llvm::dwarf::SourceLanguageName)name); + static_cast(name)); } bool SourceLanguage::IsC() const { return name == llvm::dwarf::DW_LNAME_C; } From 29d911d209ec3f64ce2dac02d6b996f6bd33869b Mon Sep 17 00:00:00 2001 From: Michael Buch Date: Fri, 3 Oct 2025 10:21:15 +0100 Subject: [PATCH 2/6] fixup! handle non-standard languages --- lldb/source/Target/Language.cpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/lldb/source/Target/Language.cpp b/lldb/source/Target/Language.cpp index 7ce85dd93f091..5bdb634c29ac4 100644 --- a/lldb/source/Target/Language.cpp +++ b/lldb/source/Target/Language.cpp @@ -542,9 +542,21 @@ Language::Language() = default; // Destructor Language::~Language() = default; +static llvm::dwarf::SourceLanguage +ToDwarfSourceLanguage(lldb::LanguageType language_type) { + if (language_type < lldb::eLanguageTypeLastStandardLanguage) + return static_cast(language_type); + + switch (language_type) { + case eLanguageTypeMipsAssembler: + return llvm::dwarf::DW_LANG_Mips_Assembler; + default: + return llvm::dwarf::DW_LANG_hi_user; + } +} + SourceLanguage::SourceLanguage(lldb::LanguageType language_type) { - auto lname = - llvm::dwarf::toDW_LNAME((llvm::dwarf::SourceLanguage)language_type); + auto lname = llvm::dwarf::toDW_LNAME(ToDwarfSourceLanguage(language_type)); if (!lname) return; name = lname->first; From bc4952c755862307402cfbe3c4d8e0ccaccc24b9 Mon Sep 17 00:00:00 2001 From: Michael Buch Date: Fri, 3 Oct 2025 12:47:32 +0100 Subject: [PATCH 3/6] fixup! add test --- lldb/source/Target/Language.cpp | 5 ++- lldb/unittests/Target/CMakeLists.txt | 1 + lldb/unittests/Target/Language.cpp | 56 ++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 lldb/unittests/Target/Language.cpp diff --git a/lldb/source/Target/Language.cpp b/lldb/source/Target/Language.cpp index 5bdb634c29ac4..fa39e57575cc4 100644 --- a/lldb/source/Target/Language.cpp +++ b/lldb/source/Target/Language.cpp @@ -550,9 +550,10 @@ ToDwarfSourceLanguage(lldb::LanguageType language_type) { switch (language_type) { case eLanguageTypeMipsAssembler: return llvm::dwarf::DW_LANG_Mips_Assembler; - default: - return llvm::dwarf::DW_LANG_hi_user; + default: break; } + + llvm_unreachable("Unhandled language type"); } SourceLanguage::SourceLanguage(lldb::LanguageType language_type) { diff --git a/lldb/unittests/Target/CMakeLists.txt b/lldb/unittests/Target/CMakeLists.txt index 3169339ec699f..0c79675a3d890 100644 --- a/lldb/unittests/Target/CMakeLists.txt +++ b/lldb/unittests/Target/CMakeLists.txt @@ -2,6 +2,7 @@ add_lldb_unittest(TargetTests ABITest.cpp DynamicRegisterInfoTest.cpp ExecutionContextTest.cpp + Language.cpp LocateModuleCallbackTest.cpp MemoryRegionInfoTest.cpp MemoryTest.cpp diff --git a/lldb/unittests/Target/Language.cpp b/lldb/unittests/Target/Language.cpp new file mode 100644 index 0000000000000..4de18b6d2c97b --- /dev/null +++ b/lldb/unittests/Target/Language.cpp @@ -0,0 +1,56 @@ +//===-- LanguageTest.cpp --------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "lldb/Target/Language.h" +#include "lldb/lldb-enumerations.h" +#include "gtest/gtest.h" + +using namespace lldb_private; +using namespace lldb; + +namespace { +class LanguageTest : public ::testing::Test {}; +} // namespace + +TEST_F(LanguageTest, SourceLanguage_GetDescription) { + for (uint32_t i = 1; i < lldb::eNumLanguageTypes; ++i) { + // 0x29 is unassigned + if (i == 0x29) + continue; + + auto lang_type = static_cast(i); + if (lang_type == lldb::eLanguageTypeLastStandardLanguage) + continue; + + SourceLanguage lang(lang_type); + + // eLanguageTypeHIP is not implemented as a DW_LNAME because of a conflict. + if (lang_type == lldb::eLanguageTypeHIP) + EXPECT_FALSE(lang); + else + EXPECT_TRUE(lang); + } + + EXPECT_EQ(SourceLanguage(eLanguageTypeC_plus_plus).GetDescription(), + "ISO C++"); + EXPECT_EQ(SourceLanguage(eLanguageTypeC_plus_plus_17).GetDescription(), + "ISO C++"); + EXPECT_EQ(SourceLanguage(eLanguageTypeC_plus_plus_20).GetDescription(), + "ISO C++"); + + EXPECT_EQ(SourceLanguage(eLanguageTypeObjC).GetDescription(), "Objective C"); + EXPECT_EQ(SourceLanguage(eLanguageTypeMipsAssembler).GetDescription(), + "Assembly"); + + auto next_vendor_language = + static_cast(eLanguageTypeMipsAssembler + 1); + if (next_vendor_language < eNumLanguageTypes) + EXPECT_NE(SourceLanguage(next_vendor_language).GetDescription(), "Unknown"); + + EXPECT_EQ(SourceLanguage(eLanguageTypeUnknown).GetDescription(), "Unknown"); +} From d914c4b7178e78690918ae934adf67aea8fc693f Mon Sep 17 00:00:00 2001 From: Michael Buch Date: Fri, 3 Oct 2025 22:49:52 +0100 Subject: [PATCH 4/6] fixup! add another test --- lldb/unittests/Target/Language.cpp | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lldb/unittests/Target/Language.cpp b/lldb/unittests/Target/Language.cpp index 4de18b6d2c97b..a00fda78d569a 100644 --- a/lldb/unittests/Target/Language.cpp +++ b/lldb/unittests/Target/Language.cpp @@ -54,3 +54,16 @@ TEST_F(LanguageTest, SourceLanguage_GetDescription) { EXPECT_EQ(SourceLanguage(eLanguageTypeUnknown).GetDescription(), "Unknown"); } + +TEST_F(LanguageTest, SourceLanguage_AsLanguageType) { + EXPECT_EQ(SourceLanguage(eLanguageTypeC_plus_plus).AsLanguageType(), + eLanguageTypeC_plus_plus); + EXPECT_EQ(SourceLanguage(eLanguageTypeC_plus_plus_03).AsLanguageType(), + eLanguageTypeC_plus_plus_03); + + // Vendor-specific language code. + EXPECT_EQ(SourceLanguage(eLanguageTypeMipsAssembler).AsLanguageType(), + eLanguageTypeAssembly); + EXPECT_EQ(SourceLanguage(eLanguageTypeUnknown).AsLanguageType(), + eLanguageTypeUnknown); +} From f3411904c56145cd051535acf96c98028dff3efc Mon Sep 17 00:00:00 2001 From: Michael Buch Date: Fri, 3 Oct 2025 22:52:53 +0100 Subject: [PATCH 5/6] fixup! clean up switch statement --- lldb/source/Target/Language.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lldb/source/Target/Language.cpp b/lldb/source/Target/Language.cpp index fa39e57575cc4..68922aed58048 100644 --- a/lldb/source/Target/Language.cpp +++ b/lldb/source/Target/Language.cpp @@ -550,10 +550,9 @@ ToDwarfSourceLanguage(lldb::LanguageType language_type) { switch (language_type) { case eLanguageTypeMipsAssembler: return llvm::dwarf::DW_LANG_Mips_Assembler; - default: break; + default: + llvm_unreachable("Unhandled language type"); } - - llvm_unreachable("Unhandled language type"); } SourceLanguage::SourceLanguage(lldb::LanguageType language_type) { From 376255187af11769e046a1feb3e9f92a5898dbf9 Mon Sep 17 00:00:00 2001 From: Michael Buch Date: Fri, 3 Oct 2025 23:04:55 +0100 Subject: [PATCH 6/6] fixup! llvm_unreachable -> std::optional --- lldb/source/Target/Language.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lldb/source/Target/Language.cpp b/lldb/source/Target/Language.cpp index 68922aed58048..a2c95fd03bd7b 100644 --- a/lldb/source/Target/Language.cpp +++ b/lldb/source/Target/Language.cpp @@ -542,7 +542,7 @@ Language::Language() = default; // Destructor Language::~Language() = default; -static llvm::dwarf::SourceLanguage +static std::optional ToDwarfSourceLanguage(lldb::LanguageType language_type) { if (language_type < lldb::eLanguageTypeLastStandardLanguage) return static_cast(language_type); @@ -551,12 +551,17 @@ ToDwarfSourceLanguage(lldb::LanguageType language_type) { case eLanguageTypeMipsAssembler: return llvm::dwarf::DW_LANG_Mips_Assembler; default: - llvm_unreachable("Unhandled language type"); + return std::nullopt; } } SourceLanguage::SourceLanguage(lldb::LanguageType language_type) { - auto lname = llvm::dwarf::toDW_LNAME(ToDwarfSourceLanguage(language_type)); + std::optional dwarf_lang = + ToDwarfSourceLanguage(language_type); + if (!dwarf_lang) + return; + + auto lname = llvm::dwarf::toDW_LNAME(*dwarf_lang); if (!lname) return; name = lname->first;