diff options
Diffstat (limited to 'lldb')
-rw-r--r-- | lldb/lit/SymbolFile/NativePDB/Inputs/break-by-function.lldbinit (renamed from lldb/lit/SymbolFile/NativePDB/Inputs/breakpoints.lldbinit) | 0 | ||||
-rw-r--r-- | lldb/lit/SymbolFile/NativePDB/Inputs/break-by-line.lldbinit | 3 | ||||
-rw-r--r-- | lldb/lit/SymbolFile/NativePDB/break-by-function.cpp (renamed from lldb/lit/SymbolFile/NativePDB/simple-breakpoints.cpp) | 28 | ||||
-rw-r--r-- | lldb/lit/SymbolFile/NativePDB/break-by-line.cpp | 26 | ||||
-rw-r--r-- | lldb/source/Plugins/SymbolFile/NativePDB/CompileUnitIndex.cpp | 6 | ||||
-rw-r--r-- | lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp | 19 | ||||
-rw-r--r-- | lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h | 6 |
7 files changed, 70 insertions, 18 deletions
diff --git a/lldb/lit/SymbolFile/NativePDB/Inputs/breakpoints.lldbinit b/lldb/lit/SymbolFile/NativePDB/Inputs/break-by-function.lldbinit index ff9bf21a886..ff9bf21a886 100644 --- a/lldb/lit/SymbolFile/NativePDB/Inputs/breakpoints.lldbinit +++ b/lldb/lit/SymbolFile/NativePDB/Inputs/break-by-function.lldbinit diff --git a/lldb/lit/SymbolFile/NativePDB/Inputs/break-by-line.lldbinit b/lldb/lit/SymbolFile/NativePDB/Inputs/break-by-line.lldbinit new file mode 100644 index 00000000000..7daa53ba24e --- /dev/null +++ b/lldb/lit/SymbolFile/NativePDB/Inputs/break-by-line.lldbinit @@ -0,0 +1,3 @@ +break set -f break-by-line.cpp -l 14 +break list +quit diff --git a/lldb/lit/SymbolFile/NativePDB/simple-breakpoints.cpp b/lldb/lit/SymbolFile/NativePDB/break-by-function.cpp index a590fab1faa..c0c26f7617c 100644 --- a/lldb/lit/SymbolFile/NativePDB/simple-breakpoints.cpp +++ b/lldb/lit/SymbolFile/NativePDB/break-by-function.cpp @@ -4,10 +4,11 @@ // Test that we can set simple breakpoints using PDB on any platform. // RUN: %build --compiler=clang-cl --nodefaultlib -o %t.exe -- %s // RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb -f %t.exe -s \ -// RUN: %p/Inputs/breakpoints.lldbinit | FileCheck %s +// RUN: %p/Inputs/break-by-function.lldbinit | FileCheck %s // Use different indentation style for each overload so that the starting // line is in a different place. + int OvlGlobalFn(int X) { return X + 42; } @@ -33,31 +34,24 @@ int main(int argc, char **argv) { } -// CHECK: (lldb) target create "{{.*}}simple-breakpoints.cpp.tmp.exe" -// CHECK: Current executable set to '{{.*}}simple-breakpoints.cpp.tmp.exe' +// CHECK: (lldb) target create "{{.*}}break-by-function.cpp.tmp.exe" +// CHECK: Current executable set to '{{.*}}break-by-function.cpp.tmp.exe' // CHECK: (lldb) break set -n main -// CHECK: Breakpoint 1: where = simple-breakpoints.cpp.tmp.exe`main + {{[0-9]+}} -// CHECK-SAME: at simple-breakpoints.cpp:30 +// CHECK: Breakpoint 1: where = break-by-function.cpp.tmp.exe`main + {{[0-9]+}} // CHECK: (lldb) break set -n OvlGlobalFn // CHECK: Breakpoint 2: 3 locations. // CHECK: (lldb) break set -n StaticFn -// CHECK: Breakpoint 3: where = simple-breakpoints.cpp.tmp.exe`StaticFn + {{[0-9]+}} -// CHECK-SAME: at simple-breakpoints.cpp:23 +// CHECK: Breakpoint 3: where = break-by-function.cpp.tmp.exe`StaticFn + {{[0-9]+}} // CHECK: (lldb) break set -n DoesntExist // CHECK: Breakpoint 4: no locations (pending). // CHECK: (lldb) break list // CHECK: Current breakpoints: // CHECK: 1: name = 'main', locations = 1 -// CHECK: 1.1: where = simple-breakpoints.cpp.tmp.exe`main + {{[0-9]+}} -// CHECK-SAME: at simple-breakpoints.cpp:30 +// CHECK: 1.1: where = break-by-function.cpp.tmp.exe`main + {{[0-9]+}} // CHECK: 2: name = 'OvlGlobalFn', locations = 3 -// CHECK: 2.1: where = simple-breakpoints.cpp.tmp.exe`OvlGlobalFn + {{[0-9]+}} -// CHECK-SAME: at simple-breakpoints.cpp:12 -// CHECK: 2.2: where = simple-breakpoints.cpp.tmp.exe`OvlGlobalFn -// CHECK-SAME: at simple-breakpoints.cpp:15 -// CHECK: 2.3: where = simple-breakpoints.cpp.tmp.exe`OvlGlobalFn + {{[0-9]+}} -// CHECK-SAME: at simple-breakpoints.cpp:19 +// CHECK: 2.1: where = break-by-function.cpp.tmp.exe`OvlGlobalFn + {{[0-9]+}} +// CHECK: 2.2: where = break-by-function.cpp.tmp.exe`OvlGlobalFn +// CHECK: 2.3: where = break-by-function.cpp.tmp.exe`OvlGlobalFn + {{[0-9]+}} // CHECK: 3: name = 'StaticFn', locations = 1 -// CHECK: 3.1: where = simple-breakpoints.cpp.tmp.exe`StaticFn + {{[0-9]+}} -// CHECK-SAME: at simple-breakpoints.cpp:23 +// CHECK: 3.1: where = break-by-function.cpp.tmp.exe`StaticFn + {{[0-9]+}} // CHECK: 4: name = 'DoesntExist', locations = 0 (pending) diff --git a/lldb/lit/SymbolFile/NativePDB/break-by-line.cpp b/lldb/lit/SymbolFile/NativePDB/break-by-line.cpp new file mode 100644 index 00000000000..ae3269f3719 --- /dev/null +++ b/lldb/lit/SymbolFile/NativePDB/break-by-line.cpp @@ -0,0 +1,26 @@ +// clang-format off +// REQUIRES: lld + +// Test that we can set simple breakpoints using PDB on any platform. +// RUN: %build --compiler=clang-cl --nodefaultlib -o %t.exe -- %s +// RUN: env LLDB_USE_NATIVE_PDB_READER=1 %lldb -f %t.exe -s \ +// RUN: %p/Inputs/break-by-line.lldbinit | FileCheck %s + +// This is a separate test from break-by-function.cpp because this test is +// sensitive to edits in the source file. + +namespace NS { + int NamespaceFn(int X) { + return X + 42; + } +} + +int main(int argc, char **argv) { + return NS::NamespaceFn(argc); +} + + +// CHECK: (lldb) target create "{{.*}}break-by-line.cpp.tmp.exe" +// CHECK: Current executable set to '{{.*}}break-by-line.cpp.tmp.exe' +// CHECK: (lldb) break set -f break-by-line.cpp -l 14 +// CHECK: Breakpoint 1: where = break-by-line.cpp.tmp.exe`NS::NamespaceFn + {{[0-9]+}} at break-by-line.cpp:14 diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/CompileUnitIndex.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/CompileUnitIndex.cpp index 68d8ded4a27..67ea05767fd 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/CompileUnitIndex.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/CompileUnitIndex.cpp @@ -205,6 +205,12 @@ CompileUnitIndex::GetMainSourceFile(const CompilandIndexItem &item) const { llvm::cantFail( TypeDeserializer::deserializeAs<StringIdRecord>(file_cvt, file_name)); + llvm::sys::path::Style style = working_dir.String.startswith("/") + ? llvm::sys::path::Style::posix + : llvm::sys::path::Style::windows; + if (llvm::sys::path::is_absolute(file_name.String, style)) + return file_name.String; + llvm::SmallString<64> absolute_path = working_dir.String; llvm::sys::path::append(absolute_path, file_name.String); return absolute_path; diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp index b41e52eb67d..0208d3cbaa5 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp @@ -875,6 +875,8 @@ SymbolFileNativePDB::ParseCompileUnitLanguage(const SymbolContext &sc) { return TranslateLanguage(item->m_compile_opts->getLanguage()); } +void SymbolFileNativePDB::AddSymbols(Symtab &symtab) { return; } + size_t SymbolFileNativePDB::ParseCompileUnitFunctions(const SymbolContext &sc) { lldbassert(sc.comp_unit); return false; @@ -949,6 +951,12 @@ uint32_t SymbolFileNativePDB::ResolveSymbolContext( return resolved_flags; } +uint32_t SymbolFileNativePDB::ResolveSymbolContext( + const FileSpec &file_spec, uint32_t line, bool check_inlines, + lldb::SymbolContextItem resolve_scope, SymbolContextList &sc_list) { + return 0; +} + static void AppendLineEntryToSequence(LineTable &table, LineSequence &sequence, const CompilandIndexItem &cci, lldb::addr_t base_addr, @@ -1037,7 +1045,9 @@ bool SymbolFileNativePDB::ParseCompileUnitLineTable(const SymbolContext &sc) { // LLDB wants the index of the file in the list of support files. auto fn_iter = llvm::find(cci->m_file_list, *efn); lldbassert(fn_iter != cci->m_file_list.end()); - uint32_t file_index = std::distance(cci->m_file_list.begin(), fn_iter); + // LLDB support file indices are 1-based. + uint32_t file_index = + 1 + std::distance(cci->m_file_list.begin(), fn_iter); std::unique_ptr<LineSequence> sequence( line_table->CreateLineSequenceContainer()); @@ -1082,6 +1092,13 @@ bool SymbolFileNativePDB::ParseCompileUnitSupportFiles( support_files.Append(spec); } + llvm::SmallString<64> main_source_file = + m_index->compilands().GetMainSourceFile(*cci); + FileSpec::Style style = main_source_file.startswith("/") + ? FileSpec::Style::posix + : FileSpec::Style::windows; + FileSpec spec(main_source_file, style); + support_files.Insert(0, spec); return true; } diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h index 39abb9ca633..dece19dbb71 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h +++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h @@ -104,6 +104,8 @@ public: size_t ParseTypes(const SymbolContext &sc) override; size_t ParseVariablesForContext(const SymbolContext &sc) override; + void AddSymbols(Symtab &symtab) override; + CompilerDecl GetDeclForUID(lldb::user_id_t uid) override; CompilerDeclContext GetDeclContextForUID(lldb::user_id_t uid) override; CompilerDeclContext GetDeclContextContainingUID(lldb::user_id_t uid) override; @@ -116,6 +118,10 @@ public: uint32_t ResolveSymbolContext(const Address &so_addr, lldb::SymbolContextItem resolve_scope, SymbolContext &sc) override; + uint32_t ResolveSymbolContext(const FileSpec &file_spec, uint32_t line, + bool check_inlines, + lldb::SymbolContextItem resolve_scope, + SymbolContextList &sc_list) override; size_t GetTypes(SymbolContextScope *sc_scope, lldb::TypeClass type_mask, TypeList &type_list) override; |