[Lldb-commits] [lldb] [lldb][Language] Simplify SourceLanguage::GetDescription (PR #161804)

Michael Buch via lldb-commits lldb-commits at lists.llvm.org
Fri Oct 3 10:32:00 PDT 2025


https://github.com/Michael137 updated https://github.com/llvm/llvm-project/pull/161804

>From 159ee47db1b9f6f609fe8b6b3e866f995d8f2e5c Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 3 Oct 2025 09:37:52 +0100
Subject: [PATCH 1/3] [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<llvm::dwarf::SourceLanguageName>(name));
 }
 bool SourceLanguage::IsC() const { return name == llvm::dwarf::DW_LNAME_C; }
 

>From 29d911d209ec3f64ce2dac02d6b996f6bd33869b Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 3 Oct 2025 10:21:15 +0100
Subject: [PATCH 2/3] 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<llvm::dwarf::SourceLanguage>(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 <michaelbuch12 at gmail.com>
Date: Fri, 3 Oct 2025 12:47:32 +0100
Subject: [PATCH 3/3] 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<lldb::LanguageType>(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<lldb::LanguageType>(eLanguageTypeMipsAssembler + 1);
+  if (next_vendor_language < eNumLanguageTypes)
+    EXPECT_NE(SourceLanguage(next_vendor_language).GetDescription(), "Unknown");
+
+  EXPECT_EQ(SourceLanguage(eLanguageTypeUnknown).GetDescription(), "Unknown");
+}



More information about the lldb-commits mailing list