Index: lldb/lit/SymbolFile/NativePDB/Inputs/break-by-line.lldbinit =================================================================== --- /dev/null +++ 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 Index: lldb/lit/SymbolFile/NativePDB/break-by-function.cpp =================================================================== --- lldb/lit/SymbolFile/NativePDB/break-by-function.cpp +++ 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 @@ } -// 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) Index: lldb/lit/SymbolFile/NativePDB/break-by-line.cpp =================================================================== --- /dev/null +++ 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 Index: lldb/source/Plugins/SymbolFile/NativePDB/CompileUnitIndex.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/NativePDB/CompileUnitIndex.cpp +++ lldb/source/Plugins/SymbolFile/NativePDB/CompileUnitIndex.cpp @@ -205,6 +205,12 @@ llvm::cantFail( TypeDeserializer::deserializeAs(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; Index: lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h =================================================================== --- lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h +++ lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h @@ -104,6 +104,8 @@ 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 @@ 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; Index: lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp +++ lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp @@ -875,6 +875,8 @@ 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 @@ 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 @@ // 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 sequence( line_table->CreateLineSequenceContainer()); @@ -1082,6 +1092,13 @@ 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; }