[Lldb-commits] [lldb] [lldb] Fix type lookup in DWARF .o files via debug map (PR #87177)
Pablo Busse via lldb-commits
lldb-commits at lists.llvm.org
Sat Mar 30 22:30:45 PDT 2024
https://github.com/pabusse updated https://github.com/llvm/llvm-project/pull/87177
>From 70938a5d70d3d1e861fd8439bd01ebf737252329 Mon Sep 17 00:00:00 2001
From: Pablo Busse <pabusse at microsoft.com>
Date: Sat, 30 Mar 2024 19:09:40 -0700
Subject: [PATCH 1/2] [lldb] Fix type lookup in DWARF .o files via debug map
An inverted condition causes SymbolFileDWARFDebugMap::FindTypes to bail out
after inspecting the first .o file in each module.
The same kind of bug is found in SymbolFileDWARFDebugMap::ParseDeclsForContext.
This change fixes the early-exit conditions and adds a regression test for
lookup of up a type defined in a secondary compilation unit.
---
.../DWARF/SymbolFileDWARFDebugMap.cpp | 4 +--
.../functionalities/type_find_first/Makefile | 2 +-
.../type_find_first/TestFindFirstType.py | 27 ++++++++++---------
.../functionalities/type_find_first/main.cpp | 5 ++++
.../functionalities/type_find_first/other.cpp | 4 +++
5 files changed, 26 insertions(+), 16 deletions(-)
create mode 100644 lldb/test/API/functionalities/type_find_first/other.cpp
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
index 6dd3eb3677b7af..4bc2cfd60688a8 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp
@@ -1233,7 +1233,7 @@ void SymbolFileDWARFDebugMap::FindTypes(const TypeQuery &query,
std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
oso_dwarf->FindTypes(query, results);
- return !results.Done(query); // Keep iterating if we aren't done.
+ return results.Done(query); // Keep iterating if we aren't done.
});
}
@@ -1391,7 +1391,7 @@ void SymbolFileDWARFDebugMap::ParseDeclsForContext(
lldb_private::CompilerDeclContext decl_ctx) {
ForEachSymbolFile([&](SymbolFileDWARF *oso_dwarf) -> bool {
oso_dwarf->ParseDeclsForContext(decl_ctx);
- return true; // Keep iterating
+ return false; // Keep iterating
});
}
diff --git a/lldb/test/API/functionalities/type_find_first/Makefile b/lldb/test/API/functionalities/type_find_first/Makefile
index 3d0b98f13f3d7b..e027553c7a6b09 100644
--- a/lldb/test/API/functionalities/type_find_first/Makefile
+++ b/lldb/test/API/functionalities/type_find_first/Makefile
@@ -1,2 +1,2 @@
-CXX_SOURCES := main.cpp
+CXX_SOURCES := main.cpp other.cpp
include Makefile.rules
diff --git a/lldb/test/API/functionalities/type_find_first/TestFindFirstType.py b/lldb/test/API/functionalities/type_find_first/TestFindFirstType.py
index 6347a35e72ea3f..4e0ee2ca685e73 100644
--- a/lldb/test/API/functionalities/type_find_first/TestFindFirstType.py
+++ b/lldb/test/API/functionalities/type_find_first/TestFindFirstType.py
@@ -8,8 +8,6 @@
class TypeFindFirstTestCase(TestBase):
- NO_DEBUG_INFO_TESTCASE = True
-
def test_find_first_type(self):
"""
Test SBTarget::FindFirstType() and SBModule::FindFirstType() APIs.
@@ -19,19 +17,22 @@ def test_find_first_type(self):
basename, FindFirstType() could end up failing depending on which
type was found first in the debug info indexes. This test will
ensure this doesn't regress in the future.
+
+ The test also looks for a type defined in a different compilation unit
+ to verify that SymbolFileDWARFDebugMap searches each symbol file in a
+ module.
"""
self.build()
target = self.createTestTarget()
- # Test the SBTarget APIs for FindFirstType
- integer_type = target.FindFirstType("Integer::Point")
- self.assertTrue(integer_type.IsValid())
- float_type = target.FindFirstType("Float::Point")
- self.assertTrue(float_type.IsValid())
-
- # Test the SBModule APIs for FindFirstType
exe_module = target.GetModuleAtIndex(0)
self.assertTrue(exe_module.IsValid())
- integer_type = exe_module.FindFirstType("Integer::Point")
- self.assertTrue(integer_type.IsValid())
- float_type = exe_module.FindFirstType("Float::Point")
- self.assertTrue(float_type.IsValid())
+ # Test the SBTarget and SBModule APIs for FindFirstType
+ for api in [target, exe_module]:
+ integer_type = api.FindFirstType("Integer::Point")
+ self.assertTrue(integer_type.IsValid())
+ float_type = api.FindFirstType("Float::Point")
+ self.assertTrue(float_type.IsValid())
+ external_type = api.FindFirstType("OtherCompilationUnit::Type");
+ self.assertTrue(external_type.IsValid())
+ nonexistent_type = api.FindFirstType("NonexistentType");
+ self.assertFalse(nonexistent_type.IsValid())
diff --git a/lldb/test/API/functionalities/type_find_first/main.cpp b/lldb/test/API/functionalities/type_find_first/main.cpp
index f4e467286004d6..bbb060872a1e9a 100644
--- a/lldb/test/API/functionalities/type_find_first/main.cpp
+++ b/lldb/test/API/functionalities/type_find_first/main.cpp
@@ -10,8 +10,13 @@ struct Point {
};
} // namespace Float
+namespace OtherCompilationUnit {
+void Function();
+} // namespace OtherCompilationUnit
+
int main(int argc, char const *argv[]) {
Integer::Point ip = {2, 3};
Float::Point fp = {2.0, 3.0};
+ OtherCompilationUnit::Function();
return 0;
}
diff --git a/lldb/test/API/functionalities/type_find_first/other.cpp b/lldb/test/API/functionalities/type_find_first/other.cpp
new file mode 100644
index 00000000000000..b91edcd8e1d76d
--- /dev/null
+++ b/lldb/test/API/functionalities/type_find_first/other.cpp
@@ -0,0 +1,4 @@
+namespace OtherCompilationUnit {
+struct Type {};
+void Function() { Type typeIsActuallyUsed; }
+} // namespace OtherCompilationUnit
\ No newline at end of file
>From d2edbf5c70f269ce0d293f6635b1ab0508c2aacf Mon Sep 17 00:00:00 2001
From: Pablo Busse <pabusse at microsoft.com>
Date: Sat, 30 Mar 2024 22:29:40 -0700
Subject: [PATCH 2/2] python lints
---
.../API/functionalities/type_find_first/TestFindFirstType.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/lldb/test/API/functionalities/type_find_first/TestFindFirstType.py b/lldb/test/API/functionalities/type_find_first/TestFindFirstType.py
index 4e0ee2ca685e73..b1c5659a324a4c 100644
--- a/lldb/test/API/functionalities/type_find_first/TestFindFirstType.py
+++ b/lldb/test/API/functionalities/type_find_first/TestFindFirstType.py
@@ -32,7 +32,7 @@ def test_find_first_type(self):
self.assertTrue(integer_type.IsValid())
float_type = api.FindFirstType("Float::Point")
self.assertTrue(float_type.IsValid())
- external_type = api.FindFirstType("OtherCompilationUnit::Type");
+ external_type = api.FindFirstType("OtherCompilationUnit::Type")
self.assertTrue(external_type.IsValid())
- nonexistent_type = api.FindFirstType("NonexistentType");
+ nonexistent_type = api.FindFirstType("NonexistentType")
self.assertFalse(nonexistent_type.IsValid())
More information about the lldb-commits
mailing list