Author: Jan Kratochvil Date: 2021-08-10T20:43:24+02:00 New Revision: f3932b9a0b0b7787ccd3572bad134acc4146acaa
URL: https://github.com/llvm/llvm-project/commit/f3932b9a0b0b7787ccd3572bad134acc4146acaa DIFF: https://github.com/llvm/llvm-project/commit/f3932b9a0b0b7787ccd3572bad134acc4146acaa.diff LOG: [nfc] [lldb] Assertions for D106270 - [DWARF5] Fix offset check when using .debug_names Skeleton vs. DWO units mismatch has been fixed in D106270. As they both have type DWARFUnit it is a bit difficult to debug. So it is better to make it safe against future changes. Reviewed By: kimanh, clayborg Differential Revision: https://reviews.llvm.org/D107659 Added: lldb/test/Shell/SymbolFile/DWARF/x86/Inputs/find-variable-file-3.cpp Modified: lldb/source/Plugins/SymbolFile/DWARF/AppleDWARFIndex.cpp lldb/source/Plugins/SymbolFile/DWARF/DWARFIndex.h lldb/source/Plugins/SymbolFile/DWARF/DebugNamesDWARFIndex.cpp lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.h lldb/test/Shell/SymbolFile/DWARF/x86/find-variable-file.cpp Removed: ################################################################################ diff --git a/lldb/source/Plugins/SymbolFile/DWARF/AppleDWARFIndex.cpp b/lldb/source/Plugins/SymbolFile/DWARF/AppleDWARFIndex.cpp index c786451a03df2..4e09b523b7781 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/AppleDWARFIndex.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/AppleDWARFIndex.cpp @@ -79,6 +79,7 @@ void AppleDWARFIndex::GetGlobalVariables( if (!m_apple_names_up) return; + lldbassert(!cu.GetSymbolFileDWARF().GetDwoNum()); const DWARFUnit &non_skeleton_cu = cu.GetNonSkeletonUnit(); DWARFMappedHash::DIEInfoArray hash_data; m_apple_names_up->AppendAllDIEsInRange(non_skeleton_cu.GetOffset(), diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFIndex.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFIndex.h index 6f2698cc6e6fb..fac6c46b4ccff 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFIndex.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFIndex.h @@ -34,6 +34,7 @@ class DWARFIndex { virtual void GetGlobalVariables(const RegularExpression ®ex, llvm::function_ref<bool(DWARFDIE die)> callback) = 0; + /// \a cu must be the skeleton unit if possible, not GetNonSkeletonUnit(). virtual void GetGlobalVariables(DWARFUnit &cu, llvm::function_ref<bool(DWARFDIE die)> callback) = 0; diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DebugNamesDWARFIndex.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DebugNamesDWARFIndex.cpp index 2b2c13abb250b..4a148e7744bb1 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DebugNamesDWARFIndex.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DebugNamesDWARFIndex.cpp @@ -124,6 +124,7 @@ void DebugNamesDWARFIndex::GetGlobalVariables( void DebugNamesDWARFIndex::GetGlobalVariables( DWARFUnit &cu, llvm::function_ref<bool(DWARFDIE die)> callback) { + lldbassert(!cu.GetSymbolFileDWARF().GetDwoNum()); uint64_t cu_offset = cu.GetOffset(); bool found_entry_for_cu = false; for (const DebugNames::NameIndex &ni: *m_debug_names_up) { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp b/lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp index 242daa9293914..4d36ef9b34bc4 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/ManualDWARFIndex.cpp @@ -359,9 +359,9 @@ void ManualDWARFIndex::GetGlobalVariables( void ManualDWARFIndex::GetGlobalVariables( DWARFUnit &unit, llvm::function_ref<bool(DWARFDIE die)> callback) { + lldbassert(!unit.GetSymbolFileDWARF().GetDwoNum()); Index(); - m_set.globals.FindAllEntriesForUnit(unit.GetNonSkeletonUnit(), - DIERefCallback(callback)); + m_set.globals.FindAllEntriesForUnit(unit, DIERefCallback(callback)); } void ManualDWARFIndex::GetObjCMethods( diff --git a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp index 42e96af84a969..493d1b4a27023 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.cpp @@ -45,15 +45,16 @@ bool NameToDIE::Find(const RegularExpression ®ex, } void NameToDIE::FindAllEntriesForUnit( - const DWARFUnit &unit, - llvm::function_ref<bool(DIERef ref)> callback) const { + DWARFUnit &s_unit, llvm::function_ref<bool(DIERef ref)> callback) const { + lldbassert(!s_unit.GetSymbolFileDWARF().GetDwoNum()); + const DWARFUnit &ns_unit = s_unit.GetNonSkeletonUnit(); const uint32_t size = m_map.GetSize(); for (uint32_t i = 0; i < size; ++i) { const DIERef &die_ref = m_map.GetValueAtIndexUnchecked(i); - if (unit.GetSymbolFileDWARF().GetDwoNum() == die_ref.dwo_num() && - unit.GetDebugSection() == die_ref.section() && - unit.GetOffset() <= die_ref.die_offset() && - die_ref.die_offset() < unit.GetNextUnitOffset()) { + if (ns_unit.GetSymbolFileDWARF().GetDwoNum() == die_ref.dwo_num() && + ns_unit.GetDebugSection() == die_ref.section() && + ns_unit.GetOffset() <= die_ref.die_offset() && + die_ref.die_offset() < ns_unit.GetNextUnitOffset()) { if (!callback(die_ref)) return; } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.h b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.h index a6863f6c95499..994af07189f87 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/NameToDIE.h @@ -38,8 +38,9 @@ class NameToDIE { bool Find(const lldb_private::RegularExpression ®ex, llvm::function_ref<bool(DIERef ref)> callback) const; + /// \a unit must be the skeleton unit if possible, not GetNonSkeletonUnit(). void - FindAllEntriesForUnit(const DWARFUnit &unit, + FindAllEntriesForUnit(DWARFUnit &unit, llvm::function_ref<bool(DIERef ref)> callback) const; void diff --git a/lldb/test/Shell/SymbolFile/DWARF/x86/Inputs/find-variable-file-3.cpp b/lldb/test/Shell/SymbolFile/DWARF/x86/Inputs/find-variable-file-3.cpp new file mode 100644 index 0000000000000..39dceb08bb897 --- /dev/null +++ b/lldb/test/Shell/SymbolFile/DWARF/x86/Inputs/find-variable-file-3.cpp @@ -0,0 +1,2 @@ +// No variable should exist in this file. +void f() {} diff --git a/lldb/test/Shell/SymbolFile/DWARF/x86/find-variable-file.cpp b/lldb/test/Shell/SymbolFile/DWARF/x86/find-variable-file.cpp index 9b23f36a21384..f1a9a4eb12d07 100644 --- a/lldb/test/Shell/SymbolFile/DWARF/x86/find-variable-file.cpp +++ b/lldb/test/Shell/SymbolFile/DWARF/x86/find-variable-file.cpp @@ -31,12 +31,15 @@ // the compile unit using the name index if it is split. // RUN: %clang -c -o %t-1.o --target=x86_64-pc-linux -gdwarf-5 -gsplit-dwarf -gpubnames %s // RUN: %clang -c -o %t-2.o --target=x86_64-pc-linux -gdwarf-5 -gsplit-dwarf -gpubnames %S/Inputs/find-variable-file-2.cpp -// RUN: ld.lld %t-1.o %t-2.o -o %t +// RUN: %clang -c -o %t-3.o --target=x86_64-pc-linux -gdwarf-5 -gsplit-dwarf -gpubnames %S/Inputs/find-variable-file-3.cpp +// RUN: ld.lld %t-1.o %t-2.o %t-3.o -o %t // RUN: llvm-readobj --sections %t | FileCheck %s --check-prefix NAMES // RUN: lldb-test symbols --file=find-variable-file.cpp --find=variable %t | \ // RUN: FileCheck --check-prefix=ONE %s // RUN: lldb-test symbols --file=find-variable-file-2.cpp --find=variable %t | \ // RUN: FileCheck --check-prefix=TWO %s +// RUN: lldb-test symbols --file=find-variable-file-3.cpp --find=variable \ +// RUN: --name=notexists %t // NAMES: Name: .debug_names _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits