[Lldb-commits] [lldb] r350240 - [NativePDB] Fix setting breakpoint by file and line.

Zachary Turner via lldb-commits lldb-commits at lists.llvm.org
Wed Jan 2 10:32:51 PST 2019


Author: zturner
Date: Wed Jan  2 10:32:50 2019
New Revision: 350240

URL: http://llvm.org/viewvc/llvm-project?rev=350240&view=rev
Log:
[NativePDB] Fix setting breakpoint by file and line.

There were several problems preventing this from working.  The
first is that when the PDB had an absolute path to the main
source file, we would construct an invalid path by prepending the
compilation directory to it anyway.  So we needed to check if the
path is already absolute first.

Second, LLDB assumes that the zero'th item in the support file list
is the main compilation unit.  We were respecting this requirement,
but LLDB *also* requires that file to appear somewhere in the list
starting from index 1 as well.  So the main compilation file should
appear in the support file list twice.  And when parsing a line
table, it expects the LineEntry records to be constructed using
the 1-based index.  With these two fixes we can now set breakpoints
by file and line using the native PDB reader.

Added:
    lldb/trunk/lit/SymbolFile/NativePDB/Inputs/break-by-function.lldbinit
    lldb/trunk/lit/SymbolFile/NativePDB/Inputs/break-by-line.lldbinit
    lldb/trunk/lit/SymbolFile/NativePDB/break-by-function.cpp
    lldb/trunk/lit/SymbolFile/NativePDB/break-by-line.cpp
Removed:
    lldb/trunk/lit/SymbolFile/NativePDB/Inputs/breakpoints.lldbinit
    lldb/trunk/lit/SymbolFile/NativePDB/simple-breakpoints.cpp
Modified:
    lldb/trunk/source/Plugins/SymbolFile/NativePDB/CompileUnitIndex.cpp
    lldb/trunk/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
    lldb/trunk/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h

Added: lldb/trunk/lit/SymbolFile/NativePDB/Inputs/break-by-function.lldbinit
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/SymbolFile/NativePDB/Inputs/break-by-function.lldbinit?rev=350240&view=auto
==============================================================================
--- lldb/trunk/lit/SymbolFile/NativePDB/Inputs/break-by-function.lldbinit (added)
+++ lldb/trunk/lit/SymbolFile/NativePDB/Inputs/break-by-function.lldbinit Wed Jan  2 10:32:50 2019
@@ -0,0 +1,6 @@
+break set -n main
+break set -n OvlGlobalFn
+break set -n StaticFn
+break set -n DoesntExist
+break list
+quit

Added: lldb/trunk/lit/SymbolFile/NativePDB/Inputs/break-by-line.lldbinit
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/SymbolFile/NativePDB/Inputs/break-by-line.lldbinit?rev=350240&view=auto
==============================================================================
--- lldb/trunk/lit/SymbolFile/NativePDB/Inputs/break-by-line.lldbinit (added)
+++ lldb/trunk/lit/SymbolFile/NativePDB/Inputs/break-by-line.lldbinit Wed Jan  2 10:32:50 2019
@@ -0,0 +1,3 @@
+break set -f break-by-line.cpp -l 14
+break list
+quit

Removed: lldb/trunk/lit/SymbolFile/NativePDB/Inputs/breakpoints.lldbinit
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/SymbolFile/NativePDB/Inputs/breakpoints.lldbinit?rev=350239&view=auto
==============================================================================
--- lldb/trunk/lit/SymbolFile/NativePDB/Inputs/breakpoints.lldbinit (original)
+++ lldb/trunk/lit/SymbolFile/NativePDB/Inputs/breakpoints.lldbinit (removed)
@@ -1,6 +0,0 @@
-break set -n main
-break set -n OvlGlobalFn
-break set -n StaticFn
-break set -n DoesntExist
-break list
-quit

Added: lldb/trunk/lit/SymbolFile/NativePDB/break-by-function.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/SymbolFile/NativePDB/break-by-function.cpp?rev=350240&view=auto
==============================================================================
--- lldb/trunk/lit/SymbolFile/NativePDB/break-by-function.cpp (added)
+++ lldb/trunk/lit/SymbolFile/NativePDB/break-by-function.cpp Wed Jan  2 10:32:50 2019
@@ -0,0 +1,57 @@
+// 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-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;
+}
+
+int OvlGlobalFn(int X, int Y) { return X + Y + 42; }
+
+int OvlGlobalFn(int X, int Y, int Z)
+{
+  return X + Y + Z + 42;
+}
+
+static int StaticFn(int X) {
+  return X + 42;
+}
+
+int main(int argc, char **argv) {
+  // Make sure they don't get optimized out.
+  // Note the comments here, we want to make sure the line number reported
+  // for the breakpoint is the first actual line of code.
+  int Result = OvlGlobalFn(argc) + OvlGlobalFn(argc, argc)
+    + OvlGlobalFn(argc, argc, argc) + StaticFn(argc);
+  return Result;
+}
+
+
+// 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 = 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 = 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 = break-by-function.cpp.tmp.exe`main + {{[0-9]+}}
+// CHECK:      2: name = 'OvlGlobalFn', locations = 3
+// 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 = break-by-function.cpp.tmp.exe`StaticFn + {{[0-9]+}}
+// CHECK:      4: name = 'DoesntExist', locations = 0 (pending)

Added: lldb/trunk/lit/SymbolFile/NativePDB/break-by-line.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/SymbolFile/NativePDB/break-by-line.cpp?rev=350240&view=auto
==============================================================================
--- lldb/trunk/lit/SymbolFile/NativePDB/break-by-line.cpp (added)
+++ lldb/trunk/lit/SymbolFile/NativePDB/break-by-line.cpp Wed Jan  2 10:32:50 2019
@@ -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

Removed: lldb/trunk/lit/SymbolFile/NativePDB/simple-breakpoints.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/SymbolFile/NativePDB/simple-breakpoints.cpp?rev=350239&view=auto
==============================================================================
--- lldb/trunk/lit/SymbolFile/NativePDB/simple-breakpoints.cpp (original)
+++ lldb/trunk/lit/SymbolFile/NativePDB/simple-breakpoints.cpp (removed)
@@ -1,63 +0,0 @@
-// 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/breakpoints.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;
-}
-
-int OvlGlobalFn(int X, int Y) { return X + Y + 42; }
-
-int OvlGlobalFn(int X, int Y, int Z)
-{
-  return X + Y + Z + 42;
-}
-
-static int StaticFn(int X) {
-  return X + 42;
-}
-
-int main(int argc, char **argv) {
-  // Make sure they don't get optimized out.
-  // Note the comments here, we want to make sure the line number reported
-  // for the breakpoint is the first actual line of code.
-  int Result = OvlGlobalFn(argc) + OvlGlobalFn(argc, argc)
-    + OvlGlobalFn(argc, argc, argc) + StaticFn(argc);
-  return Result;
-}
-
-
-// CHECK:      (lldb) target create "{{.*}}simple-breakpoints.cpp.tmp.exe"
-// CHECK:      Current executable set to '{{.*}}simple-breakpoints.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:      (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:      (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:      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:      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:      4: name = 'DoesntExist', locations = 0 (pending)

Modified: lldb/trunk/source/Plugins/SymbolFile/NativePDB/CompileUnitIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/NativePDB/CompileUnitIndex.cpp?rev=350240&r1=350239&r2=350240&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/NativePDB/CompileUnitIndex.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/NativePDB/CompileUnitIndex.cpp Wed Jan  2 10:32:50 2019
@@ -205,6 +205,12 @@ CompileUnitIndex::GetMainSourceFile(cons
   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;

Modified: lldb/trunk/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp?rev=350240&r1=350239&r2=350240&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp (original)
+++ lldb/trunk/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp Wed Jan  2 10:32:50 2019
@@ -875,6 +875,8 @@ SymbolFileNativePDB::ParseCompileUnitLan
   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::ResolveSym
   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::ParseCompileUn
       // 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::ParseCompileUn
     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;
 }
 

Modified: lldb/trunk/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h?rev=350240&r1=350239&r2=350240&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h (original)
+++ lldb/trunk/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h Wed Jan  2 10:32:50 2019
@@ -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;




More information about the lldb-commits mailing list