[Lldb-commits] [lldb] [lldb] Fix type lookup in DWARF .o files via debug map (PR #87177)
https://github.com/pabusse created https://github.com/llvm/llvm-project/pull/87177 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`. Correct both early exit conditions and add a regression test for lookup of up a type defined in a secondary compilation unit. Fixes #87176 >From 70938a5d70d3d1e861fd8439bd01ebf737252329 Mon Sep 17 00:00:00 2001 From: Pablo Busse Date: Sat, 30 Mar 2024 19:09:40 -0700 Subject: [PATCH] [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 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
[Lldb-commits] [lldb] [lldb] Fix type lookup in DWARF .o files via debug map (PR #87177)
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 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 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/AP