[Lldb-commits] [lldb] [lldb][DWARF] Add support for case-insensitive identifier lookups using DW_AT_identifier_case (PR #213323)
via lldb-commits
lldb-commits at lists.llvm.org
Fri Jul 31 10:51:21 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-lldb
Author: Iasonas Karaprodromidis (Iasonaskrpr)
<details>
<summary>Changes</summary>
This patch adds support for case-insensitive lookups. Whether the lookups should be case-sensitive or case-insensitive is determined by DW_AT_identifier_case. If this attribute is not present, then the compile unit is considered case-sensitive.
Changes:
- Added an identifier case field to the compile unit.
- DIL now looks at casing when looking up identifiers and handles them appropriately.
- DWARFUnit now parses DW_AT_identifier_case when asked.
- NameToDIE now looks at casing and searches for identifiers appropriately.
Part of the "Add Fortran support to LLDB" GSoC 2026 project.
---
Patch is 24.93 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/213323.diff
14 Files Affected:
- (modified) lldb/include/lldb/Symbol/CompileUnit.h (+10)
- (modified) lldb/include/lldb/lldb-enumerations.h (+15)
- (modified) lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp (+32)
- (modified) lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h (+3)
- (modified) lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp (+9)
- (modified) lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.h (+22)
- (modified) lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp (+10)
- (modified) lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.h (+9)
- (modified) lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp (+6-3)
- (modified) lldb/source/ValueObject/DILEval.cpp (+35-7)
- (added) lldb/test/API/commands/frame/var-dil/basics/CaseSensitiveLookup/Makefile (+3)
- (added) lldb/test/API/commands/frame/var-dil/basics/CaseSensitiveLookup/TestFrameVarDILCaseSensitiveLookup.py (+59)
- (added) lldb/test/API/commands/frame/var-dil/basics/CaseSensitiveLookup/main.cpp (+6)
- (modified) lldb/unittests/SymbolFile/DWARF/DWARFDebugNamesIndexTest.cpp (+198-3)
``````````diff
diff --git a/lldb/include/lldb/Symbol/CompileUnit.h b/lldb/include/lldb/Symbol/CompileUnit.h
index bb9594699df33..7d99bd16ae02d 100644
--- a/lldb/include/lldb/Symbol/CompileUnit.h
+++ b/lldb/include/lldb/Symbol/CompileUnit.h
@@ -152,6 +152,14 @@ class CompileUnit : public std::enable_shared_from_this<CompileUnit>,
m_language = language;
}
+ lldb::IdentifierCaseType GetCasing() {
+ return m_identifier_case;
+ }
+
+ void SetCasing(lldb::IdentifierCaseType identifier_case){
+ m_identifier_case = identifier_case;
+ }
+
void GetDescription(Stream *s, lldb::DescriptionLevel level) const;
/// Apply a lambda to each function in this compile unit.
@@ -422,6 +430,8 @@ class CompileUnit : public std::enable_shared_from_this<CompileUnit>,
void *m_user_data;
/// The programming language enumeration value.
lldb::LanguageType m_language;
+ /// Used to determine if lookups should be case-insensitive
+ lldb::IdentifierCaseType m_identifier_case = lldb::eCaseSensitive;
/// Compile unit flags that help with partial parsing.
Flags m_flags;
/// Maps UIDs to functions.
diff --git a/lldb/include/lldb/lldb-enumerations.h b/lldb/include/lldb/lldb-enumerations.h
index 32a341b354d9f..4c0d2c27a8745 100644
--- a/lldb/include/lldb/lldb-enumerations.h
+++ b/lldb/include/lldb/lldb-enumerations.h
@@ -631,6 +631,21 @@ enum LanguageType {
eNumLanguageTypes
};
+//----------------------------------------------------------------------
+/// Identifier Case type
+///
+/// this enumeration indetifies the treatment of identifiers within
+/// compilation unit. the default is case sensitive in case it is absent
+/// in compilation unit.
+//----------------------------------------------------------------------
+enum IdentifierCaseType {
+ eCaseSensitive = 0,
+ eUpperCase = 1,
+ eLowerCase = 2,
+ eCaseInsensitive = 3,
+ eCaseUnknown = 4,
+};
+
enum InstrumentationRuntimeType {
eInstrumentationRuntimeTypeAddressSanitizer = 0x0000,
eInstrumentationRuntimeTypeThreadSanitizer = 0x0001,
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
index 4b02124e987e8..7fbef4a831ff1 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.cpp
@@ -888,6 +888,38 @@ llvm::VersionTuple DWARFUnit::GetProducerVersion() {
return m_producer_version;
}
+lldb::IdentifierCaseType DWARFUnit::GetIdentifierCase() {
+ if(m_identifier_case != eCaseUnknown)
+ return m_identifier_case;
+
+ const DWARFDebugInfoEntry *die = GetUnitDIEPtrOnly();
+
+ if(!die)
+ m_identifier_case = eCaseSensitive;
+
+ else {
+ uint64_t identifier_case = die->GetAttributeValueAsUnsigned(this, DW_AT_identifier_case, llvm::dwarf::DW_ID_case_sensitive);
+
+ switch (identifier_case) {
+ case llvm::dwarf::DW_ID_up_case:
+ m_identifier_case = eUpperCase;
+ break;
+ case llvm::dwarf::DW_ID_down_case:
+ m_identifier_case = eLowerCase;
+ break;
+ case llvm::dwarf::DW_ID_case_insensitive:
+ m_identifier_case = eCaseInsensitive;
+ break;
+ case llvm::dwarf::DW_ID_case_sensitive:
+ default:
+ m_identifier_case = eCaseSensitive;
+ break;
+ }
+ }
+
+ return m_identifier_case;
+}
+
uint64_t DWARFUnit::GetDWARFLanguageType() {
if (m_language_type)
return *m_language_type;
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h
index 6fde9af57fa8b..51bafa75ca1cf 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFUnit.h
@@ -204,6 +204,8 @@ class DWARFUnit : public DWARFExpression::Delegate, public UserID {
llvm::VersionTuple GetProducerVersion();
+ lldb::IdentifierCaseType GetIdentifierCase();
+
uint64_t GetDWARFLanguageType();
bool GetIsOptimized();
@@ -352,6 +354,7 @@ class DWARFUnit : public DWARFExpression::Delegate, public UserID {
DWARFProducer m_producer = eProducerInvalid;
llvm::VersionTuple m_producer_version;
std::optional<uint64_t> m_language_type;
+ lldb::IdentifierCaseType m_identifier_case = lldb::eCaseUnknown;
LazyBool m_is_optimized = eLazyBoolCalculate;
std::optional<FileSpec> m_comp_dir;
std::optional<FileSpec> m_file_spec;
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp b/lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp
index 0971e66df86ae..43f53ea34163b 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp
@@ -158,6 +158,15 @@ void ManualDWARFIndex::IndexUnit(DWARFUnit &unit, SymbolFileDWARFDwo *dwp,
const LanguageType cu_language = SymbolFileDWARF::GetLanguage(unit);
+ lldb::IdentifierCaseType cu_identifier_case = unit.GetIdentifierCase();
+
+ // If at least one of the Compile Units is case sensitive, then all compile
+ // units will be case sensitive
+ if(cu_identifier_case != eCaseSensitive)
+ SetNameCaseInsensitive();
+ else
+ SetStrictlyCaseSensitive();
+
// First check if the unit has a DWO ID. If it does then we only want to index
// the .dwo file or nothing at all. If we have a compile unit where we can't
// locate the .dwo/.dwp file we don't want to index anything from the skeleton
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.h b/lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.h
index 41e0e620a4896..5e137c0f930d8 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.h
@@ -169,6 +169,28 @@ class ManualDWARFIndex : public DWARFIndex {
/// True if this index is a partial index, false otherwise.
bool IsPartial() const;
+ void SetNameCaseInsensitive() {
+ m_set.function_basenames.SetNameCaseInsensitive();
+ m_set.function_fullnames.SetNameCaseInsensitive();
+ m_set.function_methods.SetNameCaseInsensitive();
+ m_set.function_selectors.SetNameCaseInsensitive();
+ m_set.objc_class_selectors.SetNameCaseInsensitive();
+ m_set.globals.SetNameCaseInsensitive();
+ m_set.types.SetNameCaseInsensitive();
+ m_set.namespaces.SetNameCaseInsensitive();
+ }
+
+ void SetStrictlyCaseSensitive() {
+ m_set.function_basenames.SetStrictlyCaseSensitive();
+ m_set.function_fullnames.SetStrictlyCaseSensitive();
+ m_set.function_methods.SetStrictlyCaseSensitive();
+ m_set.function_selectors.SetStrictlyCaseSensitive();
+ m_set.objc_class_selectors.SetStrictlyCaseSensitive();
+ m_set.globals.SetStrictlyCaseSensitive();
+ m_set.types.SetStrictlyCaseSensitive();
+ m_set.namespaces.SetStrictlyCaseSensitive();
+ }
+
/// The DWARF file which we are indexing.
SymbolFileDWARF *m_dwarf;
/// Which dwarf units should we skip while building the index.
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp
index b34fda5740924..c370eaa2a6471 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp
@@ -38,6 +38,16 @@ bool NameToDIE::Find(
for (const auto &entry : m_map.equal_range(name))
if (callback(entry.value) == IterationAction::Stop)
return false;
+
+ if (!NameCaseInsensitive)
+ return true;
+
+ for (const auto &entry : m_map){
+ if(ConstString::Equals(ConstString(entry.cstring.GetCString()), name, false))
+ if (callback(entry.value) == IterationAction::Stop)
+ return false;
+ }
+
return true;
}
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.h b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.h
index 9f9b631f178ee..a85c6a2cda846 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.h
@@ -86,8 +86,17 @@ class NameToDIE {
void Clear() { m_map.Clear(); }
+ void SetNameCaseInsensitive() { if(!StrictlyCaseSensitive) NameCaseInsensitive = true; }
+
+ void SetStrictlyCaseSensitive() {
+ NameCaseInsensitive = false;
+ StrictlyCaseSensitive = true;
+ }
+
protected:
UniqueCStringMap<DIERef> m_map;
+ bool NameCaseInsensitive = false;
+ bool StrictlyCaseSensitive = false;
};
} // namespace dwarf
} // namespace lldb_private::plugin
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index 56fbf3fd771b5..881a009553df2 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -792,6 +792,7 @@ lldb::CompUnitSP SymbolFileDWARF::ParseCompileUnit(DWARFCompileUnit &dwarf_cu) {
if (module_sp) {
auto initialize_cu = [&](SupportFileNSP support_file_nsp,
LanguageType cu_language,
+ IdentifierCaseType cu_casing,
SupportFileList &&support_files = {}) {
BuildCuTranslationTable();
cu_sp = std::make_shared<CompileUnit>(
@@ -799,8 +800,10 @@ lldb::CompUnitSP SymbolFileDWARF::ParseCompileUnit(DWARFCompileUnit &dwarf_cu) {
*GetDWARFUnitIndex(dwarf_cu.GetID()), cu_language,
eLazyBoolCalculate, std::move(support_files));
- dwarf_cu.SetLLDBCompUnit(cu_sp.get());
+ cu_sp->SetCasing(cu_casing);
+ dwarf_cu.SetLLDBCompUnit(cu_sp.get());
+
SetCompileUnitAtIndex(dwarf_cu.GetID(), cu_sp);
};
@@ -829,7 +832,7 @@ lldb::CompUnitSP SymbolFileDWARF::ParseCompileUnit(DWARFCompileUnit &dwarf_cu) {
if (support_files.GetSize() == 0)
return false;
initialize_cu(support_files.GetSupportFileAtIndex(0),
- eLanguageTypeUnknown, std::move(support_files));
+ eLanguageTypeUnknown, dwarf_cu.GetIdentifierCase(), std::move(support_files));
return true;
};
@@ -848,7 +851,7 @@ lldb::CompUnitSP SymbolFileDWARF::ParseCompileUnit(DWARFCompileUnit &dwarf_cu) {
MakeAbsoluteAndRemap(cu_file_spec, dwarf_cu, module_sp);
initialize_cu(std::make_shared<SupportFile>(cu_file_spec),
- cu_language);
+ cu_language, dwarf_cu.GetIdentifierCase());
}
}
}
diff --git a/lldb/source/ValueObject/DILEval.cpp b/lldb/source/ValueObject/DILEval.cpp
index 5fc2376be0e75..b358948bee093 100644
--- a/lldb/source/ValueObject/DILEval.cpp
+++ b/lldb/source/ValueObject/DILEval.cpp
@@ -289,14 +289,28 @@ lldb::ValueObjectSP LookupGlobalIdentifier(llvm::StringRef name_ref,
SymbolContext symbol_context =
stack_frame.GetSymbolContext(lldb::eSymbolContextCompUnit);
lldb::VariableListSP variable_list;
- if (symbol_context.comp_unit)
+ lldb::IdentifierCaseType identifier_case = lldb::eCaseSensitive;
+
+ if (symbol_context.comp_unit){
variable_list = symbol_context.comp_unit->GetVariableList(true);
+ identifier_case = symbol_context.comp_unit->GetCasing();
+ }
+
name_ref.consume_front("::");
+
+ std::string search_string;
+ if(identifier_case == lldb::eLowerCase)
+ search_string = name_ref.lower();
+ else if(identifier_case == lldb::eUpperCase)
+ search_string = name_ref.upper();
+ else
+ search_string = name_ref.str();
+
lldb::ValueObjectSP value_sp;
if (variable_list) {
lldb::VariableSP var_sp =
- DILFindVariable(ConstString(name_ref), *variable_list);
+ DILFindVariable(ConstString(search_string), *variable_list);
if (var_sp)
value_sp =
stack_frame.GetValueObjectForFrameVariable(var_sp, use_dynamic);
@@ -308,12 +322,12 @@ lldb::ValueObjectSP LookupGlobalIdentifier(llvm::StringRef name_ref,
// Check for match in modules global variables.
VariableList modules_var_list;
target_sp->GetImages().FindGlobalVariables(
- ConstString(name_ref), std::numeric_limits<uint32_t>::max(),
+ ConstString(search_string), std::numeric_limits<uint32_t>::max(),
modules_var_list);
if (!modules_var_list.Empty()) {
lldb::VariableSP var_sp =
- DILFindVariable(ConstString(name_ref), modules_var_list);
+ DILFindVariable(ConstString(search_string), modules_var_list);
if (var_sp)
value_sp = ValueObjectVariable::Create(&stack_frame, var_sp);
@@ -345,10 +359,24 @@ lldb::ValueObjectSP LookupIdentifier(llvm::StringRef name_ref,
lldb::VariableListSP variable_list(
stack_frame.GetInScopeVariableList(false));
+ SymbolContext sc = stack_frame.GetSymbolContext(lldb::eSymbolContextCompUnit);
+
+ lldb::IdentifierCaseType identifier_case = lldb::eCaseSensitive;
+ if(sc.comp_unit)
+ identifier_case = sc.comp_unit->GetCasing();
+
+ std::string search_string;
+ if(identifier_case == lldb::eLowerCase)
+ search_string = name_ref.lower();
+ else if(identifier_case == lldb::eUpperCase)
+ search_string = name_ref.upper();
+ else
+ search_string = name_ref.str();
+
lldb::ValueObjectSP value_sp;
if (variable_list) {
lldb::VariableSP var_sp =
- variable_list->FindVariable(ConstString(name_ref));
+ variable_list->FindVariable(ConstString(search_string));
if (var_sp)
value_sp =
stack_frame.GetValueObjectForFrameVariable(var_sp, use_dynamic);
@@ -358,12 +386,12 @@ lldb::ValueObjectSP LookupIdentifier(llvm::StringRef name_ref,
return value_sp;
// Try looking for an instance variable (class member).
- SymbolContext sc = stack_frame.GetSymbolContext(
+ sc = stack_frame.GetSymbolContext(
lldb::eSymbolContextFunction | lldb::eSymbolContextBlock);
llvm::StringRef instance_name = sc.GetInstanceName();
value_sp = stack_frame.FindVariable(ConstString(instance_name));
if (value_sp)
- value_sp = value_sp->GetChildMemberWithName(name_ref);
+ value_sp = value_sp->GetChildMemberWithName(search_string);
if (value_sp)
return value_sp;
diff --git a/lldb/test/API/commands/frame/var-dil/basics/CaseSensitiveLookup/Makefile b/lldb/test/API/commands/frame/var-dil/basics/CaseSensitiveLookup/Makefile
new file mode 100644
index 0000000000000..2bb9ce046a907
--- /dev/null
+++ b/lldb/test/API/commands/frame/var-dil/basics/CaseSensitiveLookup/Makefile
@@ -0,0 +1,3 @@
+CXX_SOURCES := main.cpp
+
+include Makefile.rules
\ No newline at end of file
diff --git a/lldb/test/API/commands/frame/var-dil/basics/CaseSensitiveLookup/TestFrameVarDILCaseSensitiveLookup.py b/lldb/test/API/commands/frame/var-dil/basics/CaseSensitiveLookup/TestFrameVarDILCaseSensitiveLookup.py
new file mode 100644
index 0000000000000..876107f1e4017
--- /dev/null
+++ b/lldb/test/API/commands/frame/var-dil/basics/CaseSensitiveLookup/TestFrameVarDILCaseSensitiveLookup.py
@@ -0,0 +1,59 @@
+"""
+Test that DIL matches variables correctly for case-sensitive languages.
+"""
+
+import lldb
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test.decorators import *
+from lldbsuite.test import lldbutil
+
+
+class TestFrameVarDILCaseSensitiveLookup(TestBase):
+ # If your test case doesn't stress debug info, then
+ # set this to true. That way it won't be run once for
+ # each debug info format.
+ NO_DEBUG_INFO_TESTCASE = True
+
+ def test_frame_var(self):
+ self.build()
+ lldbutil.run_to_source_breakpoint(
+ self, "Set a breakpoint here", lldb.SBFileSpec("main.cpp")
+ )
+
+ self.runCmd("settings set target.experimental.use-DIL true")
+
+ self.expect_var_path("globalVar", type="int", value="-559038737") # 0xDEADBEEF
+
+ self.expect(
+ "frame var GlobaLVaR",
+ error=True,
+ substrs=["use of undeclared identifier 'GlobaLVaR'"],
+ )
+ self.expect(
+ "frame var GLOBALVAR",
+ error=True,
+ substrs=["use of undeclared identifier 'GLOBALVAR'"],
+ )
+ self.expect(
+ "frame var globalvar",
+ error=True,
+ substrs=["use of undeclared identifier 'globalvar'"],
+ )
+
+ self.expect_var_path("testVariable", type="int", value="3")
+
+ self.expect(
+ "frame var TestVaRiable",
+ error=True,
+ substrs=["use of undeclared identifier 'TestVaRiable'"],
+ )
+ self.expect(
+ "frame var testvariable",
+ error=True,
+ substrs=["use of undeclared identifier 'testvariable'"],
+ )
+ self.expect(
+ "frame var TESTVARIABLE",
+ error=True,
+ substrs=["use of undeclared identifier 'TESTVARIABLE'"],
+ )
diff --git a/lldb/test/API/commands/frame/var-dil/basics/CaseSensitiveLookup/main.cpp b/lldb/test/API/commands/frame/var-dil/basics/CaseSensitiveLookup/main.cpp
new file mode 100644
index 0000000000000..c604dc67e73bc
--- /dev/null
+++ b/lldb/test/API/commands/frame/var-dil/basics/CaseSensitiveLookup/main.cpp
@@ -0,0 +1,6 @@
+int globalVar = 0xDEADBEEF;
+int main(int argc, char **argv) {
+ int testVariable;
+ testVariable = 3;
+ return 0; // Set a breakpoint here
+}
\ No newline at end of file
diff --git a/lldb/unittests/SymbolFile/DWARF/DWARFDebugNamesIndexTest.cpp b/lldb/unittests/SymbolFile/DWARF/DWARFDebugNamesIndexTest.cpp
index dd8a0742f6b70..854e6e1f49898 100644
--- a/lldb/unittests/SymbolFile/DWARF/DWARFDebugNamesIndexTest.cpp
+++ b/lldb/unittests/SymbolFile/DWARF/DWARFDebugNamesIndexTest.cpp
@@ -1,4 +1,5 @@
-//===-- DWARFDIETest.cpp ----------------------------------------------=---===//
+//===-- DWARFDebugNamesIndexTest.cpp
+//----------------------------------------------=---===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -10,7 +11,9 @@
#include "Plugins/SymbolFile/DWARF/DWARFDebugInfo.h"
#include "Plugins/SymbolFile/DWARF/DWARFDeclContext.h"
#include "Plugins/SymbolFile/DWARF/DebugNamesDWARFIndex.h"
+#include "TestingSupport/SubsystemRAII.h"
#include "TestingSupport/Symbol/YAMLModuleTester.h"
+#include "lldb/Core/Debugger.h"
#include "lldb/lldb-private-enumerations.h"
#include "llvm/ADT/STLExtras.h"
#include "gmock/gmock.h"
@@ -21,6 +24,15 @@ using namespace lldb_private;
using namespace lldb_private::plugin::dwarf;
using StringRef = llvm::StringRef;
+class DWARFDebugNamesIndexTest : public testing::Test {
+public:
+ void SetUp() override {
+ Debugger::Initialize(nullptr);
+ }
+
+ void TearDown() override { Debugger::Terminate(); }
+};
+
static void
check_num_matches(DebugNamesDWARFIndex &index, int expected_num_matches,
llvm::ArrayRef<DWARFDeclContext::Entry> ctx_entries) {
@@ -38,7 +50,7 @@ static DWARFDeclContext::Entry make_entry(const char *c) {
return DWARFDeclContext::Entry(llvm::dwarf::DW_TAG_class_type, c);
}
-TEST(DWARFDebugNamesIndexTest, FullyQualifiedQueryWithIDXParent) {
+TEST_F(DWARFDebugNamesIndexTest, FullyQualifiedQueryWithIDXParent) {
const char *yamldata = R"(
--- !ELF
FileHeader:
@@ -130,7 +142,7 @@ TEST(DWARFDebugNamesIndexTest, FullyQualifiedQueryWithIDXParent) {
check_num_matches(*index, 1, {make_entry("3")});
}
-TEST(DWARFDebugNamesIndexTest, FullyQualifiedQueryWithoutIDXParent) {
+TEST_F(DWARFDebugNamesIndexTest, FullyQualifiedQueryWithoutIDXParent) {
const char *yamldata = R"(
--- !ELF
FileHeader:
@@ -207,3 +219,186 @@ TEST(DWARFDebugNamesIndexTest, FullyQualifiedQueryWithoutIDXParent) {
check_num_matches(*index, 1, {make_entry("2"), make_entry("1")});
check_num_matches(*index, 1, {make_entry("2")});
}
+
+TEST_F(DWARFDebugNamesIndexTest, CaseInsesitiveQuery) {
+ const char *yamldata = R"(
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+DWARF:
+ debug_str:
+ - 'num_int'
+ debug_abbrev:
+ - Table:
+ - Code: 0x1
+ Tag: DW_TAG_compile_unit
+ Children: DW_CHILDREN_yes
+ Attributes:
+ - Attribute: DW_AT_language
+ Form: DW_FORM_data2
+ - Attribute: DW_AT_identifier_case
+ Form: DW_FORM_data1
+ - Code: 0x2
+ Tag: DW_TAG_variable
+ Children: D...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/213323
More information about the lldb-commits
mailing list