public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v2 1/5] [dap & linetable]: Add column to linetable entry
@ 2024-01-17 21:05 Simon Farre
  2024-01-17 21:05 ` [PATCH v2 2/5] [dap & linetable]: Add column to maint info linetable output Simon Farre
  2024-01-17 21:05 ` [PATCH v2 4/5] [dap & linetable]: Add breakpointLocations request Simon Farre
  0 siblings, 2 replies; 3+ messages in thread
From: Simon Farre @ 2024-01-17 21:05 UTC (permalink / raw)
  To: gdb-patches; +Cc: Simon Farre

This is the first patch in a series meant to introduce the functionality
required to serve the breakpointLocations request in the DAP protocol.
It's useful for end users for other reasons, beyond that though.

For instance with this data exposed to the end user (via Python,
see later patches), a user can implement "step to next breakpoint
location on line" on their own, which maybe will be more easily accepted
than previous attempts of implementing a "next expression" command that
ended up in limbo for various reasons. Such behavior would also provide
the functionality required to serve DAP step/next requests with a
stepping granularity of "statement".

Non-DWARF debug info will just store the value 0 as the column.

I specifically made the column field 29 bits, as this means
linetable_entry will not increase in size, which seemingly is/was an
issue, reading the comment above `linetable_entry`'s definition,
though this comment is 25 years old so it may not be relevant anymore.
29 bits can represent about 500 million
(29 bits=~500 million).

This comment is 25 years old, so it might not be relevant any
longer, but I figured making it 29 bits makes it impossible to argue
against storing it (since the size doesn't change).

No changes has been made to sorting of the entries etc. They work just
like before, just that now entries store a "column" field.

v2:
Fix breaking tests

watchpoint.exp uses until for no reason really. And because it uses
until, it expects to step out of the for loop - but since we now record
"logical breakpoint locations" on a line (i.e the column metadata
provided by the compilers) "until" may not necessarily "move forward"
(unless, of course, explicitly given a line number).

By "no reason", I mean that no watchpoint is triggered during an "until"
command, so there's no reason to use in the test.

After discussion on IRC, the `until` command probably has a bug, because
it's expected to move to the "next line" and step out of a for loop,
for instance.
---
 gdb/buildsym-legacy.c                         |  4 ++--
 gdb/buildsym-legacy.h                         |  2 +-
 gdb/buildsym.c                                |  3 ++-
 gdb/buildsym.h                                |  4 ++--
 gdb/coffread.c                                |  4 ++--
 gdb/dbxread.c                                 |  6 ++---
 gdb/dwarf2/read.c                             | 24 +++++++++++++++----
 gdb/mdebugread.c                              |  2 +-
 gdb/symtab.h                                  |  9 +++++--
 gdb/testsuite/gdb.base/watchpoint.exp         | 16 ++++---------
 .../dw2-out-of-range-end-of-seq.exp           |  2 +-
 11 files changed, 44 insertions(+), 32 deletions(-)

diff --git a/gdb/buildsym-legacy.c b/gdb/buildsym-legacy.c
index 84bc96e843b..f267896a3b6 100644
--- a/gdb/buildsym-legacy.c
+++ b/gdb/buildsym-legacy.c
@@ -205,12 +205,12 @@ finish_block (struct symbol *symbol, struct pending_block *old_blocks,
 }
 
 void
-record_line (struct subfile *subfile, int line, unrelocated_addr pc)
+record_line (struct subfile *subfile, int line, uint col, unrelocated_addr pc)
 {
   gdb_assert (buildsym_compunit != nullptr);
   /* Assume every line entry is a statement start, that is a good place to
      put a breakpoint for that line number.  */
-  buildsym_compunit->record_line (subfile, line, pc, LEF_IS_STMT);
+  buildsym_compunit->record_line (subfile, line, col, pc, LEF_IS_STMT);
 }
 
 /* Start a new compunit_symtab for a new source file in OBJFILE.  Called, for
diff --git a/gdb/buildsym-legacy.h b/gdb/buildsym-legacy.h
index 1fb545831b8..45eacb15d30 100644
--- a/gdb/buildsym-legacy.h
+++ b/gdb/buildsym-legacy.h
@@ -76,7 +76,7 @@ extern struct context_stack *push_context (int desc, CORE_ADDR valu);
 
 extern struct context_stack pop_context ();
 
-extern void record_line (struct subfile *subfile, int line,
+extern void record_line (struct subfile *subfile, int line, uint col,
 			 unrelocated_addr pc);
 
 extern struct compunit_symtab *start_compunit_symtab (struct objfile *objfile,
diff --git a/gdb/buildsym.c b/gdb/buildsym.c
index a963219a0d2..75229d6ccda 100644
--- a/gdb/buildsym.c
+++ b/gdb/buildsym.c
@@ -623,7 +623,7 @@ buildsym_compunit::pop_subfile ()
    line vector for SUBFILE.  */
 
 void
-buildsym_compunit::record_line (struct subfile *subfile, int line,
+buildsym_compunit::record_line (struct subfile *subfile, int line, uint col,
 				unrelocated_addr pc, linetable_entry_flags flags)
 {
   m_have_line_numbers = true;
@@ -664,6 +664,7 @@ buildsym_compunit::record_line (struct subfile *subfile, int line,
   subfile->line_vector_entries.emplace_back ();
   linetable_entry &e = subfile->line_vector_entries.back ();
   e.line = line;
+  e.col = col;
   e.is_stmt = (flags & LEF_IS_STMT) != 0;
   e.set_unrelocated_pc (pc);
   e.prologue_end = (flags & LEF_PROLOGUE_END) != 0;
diff --git a/gdb/buildsym.h b/gdb/buildsym.h
index 79ece794559..a7f9c45b936 100644
--- a/gdb/buildsym.h
+++ b/gdb/buildsym.h
@@ -243,8 +243,8 @@ struct buildsym_compunit
 
   const char *pop_subfile ();
 
-  void record_line (struct subfile *subfile, int line, unrelocated_addr pc,
-		    linetable_entry_flags flags);
+  void record_line (struct subfile *subfile, int line, uint col,
+  		    unrelocated_addr pc, linetable_entry_flags flags);
 
   struct compunit_symtab *get_compunit_symtab ()
   {
diff --git a/gdb/coffread.c b/gdb/coffread.c
index 30a38035c52..77f9c11146b 100644
--- a/gdb/coffread.c
+++ b/gdb/coffread.c
@@ -1097,7 +1097,7 @@ coff_symtab_read (minimal_symbol_reader &reader,
 		 other statement-line-number.  */
 	      if (fcn_last_line == 1)
 		record_line
-		  (get_current_subfile (), fcn_first_line,
+		  (get_current_subfile (), fcn_first_line, 0,
 		   unrelocated_addr (gdbarch_addr_bits_remove (gdbarch,
 							       fcn_first_line_addr)));
 	      else
@@ -1430,7 +1430,7 @@ enter_linenos (file_ptr file_offset, int first_line,
 	{
 	  CORE_ADDR addr = lptr.l_addr.l_paddr;
 	  record_line (get_current_subfile (),
-		       first_line + L_LNNO32 (&lptr),
+		       first_line + L_LNNO32 (&lptr), 0,
 		       unrelocated_addr (gdbarch_addr_bits_remove (gdbarch,
 								   addr)));
 	}
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index 1734e8062fb..12a3d877ff9 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -2478,7 +2478,7 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name,
 	      CORE_ADDR addr = last_function_start + valu;
 
 	      record_line
-		(get_current_subfile (), 0,
+		(get_current_subfile (), 0, 0,
 		 unrelocated_addr (gdbarch_addr_bits_remove (gdbarch, addr)
 				   - objfile->text_section_offset ()));
 	    }
@@ -2688,14 +2688,14 @@ process_one_symbol (int type, int desc, CORE_ADDR valu, const char *name,
 			   last_function_start : valu;
 
 	  record_line
-	    (get_current_subfile (), desc,
+	    (get_current_subfile (), desc, 0,
 	     unrelocated_addr (gdbarch_addr_bits_remove (gdbarch, addr)
 			       - objfile->text_section_offset ()));
 	  sline_found_in_function = 1;
 	}
       else
 	record_line
-	  (get_current_subfile (), desc,
+	  (get_current_subfile (), desc, 0,
 	   unrelocated_addr (gdbarch_addr_bits_remove (gdbarch, valu)
 			     - objfile->text_section_offset ()));
       break;
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index a50248c4d56..a4f62e6c59e 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -18114,6 +18114,10 @@ class lnp_state_machine
     advance_line (line_delta);
   }
 
+  void set_column (unsigned int column) noexcept {
+    m_col = column;
+  }
+
   /* Handle DW_LNS_set_file.  */
   void handle_set_file (file_name_index file);
 
@@ -18185,6 +18189,8 @@ class lnp_state_machine
   file_name_index m_file = 1;
   unsigned int m_line = 1;
 
+  unsigned int m_col = 1;
+
   /* These are initialized in the constructor.  */
 
   unrelocated_addr m_address;
@@ -18215,6 +18221,8 @@ class lnp_state_machine
      consecutive entries for the same line.  This can happen, for
      example, when discriminators are present.  PR 17276.  */
   unsigned int m_last_line = 0;
+  unsigned int m_last_col = 0;
+
   bool m_line_has_non_zero_discriminator = false;
 };
 
@@ -18318,6 +18326,7 @@ lnp_state_machine::handle_const_add_pc ()
 static int
 dwarf_record_line_p (struct dwarf2_cu *cu,
 		     unsigned int line, unsigned int last_line,
+		     uint col, uint last_col,
 		     int line_has_non_zero_discriminator,
 		     struct subfile *last_subfile)
 {
@@ -18325,6 +18334,8 @@ dwarf_record_line_p (struct dwarf2_cu *cu,
     return 1;
   if (line != last_line)
     return 1;
+  else if(line == last_line && col != last_col)
+    return 1;
   /* Same line for the same file that we've seen already.
      As a last check, for pr 17276, only record the line if the line
      has never had a non-zero discriminator.  */
@@ -18338,7 +18349,7 @@ dwarf_record_line_p (struct dwarf2_cu *cu,
 
 static void
 dwarf_record_line_1 (struct gdbarch *gdbarch, struct subfile *subfile,
-		     unsigned int line, unrelocated_addr address,
+		     unsigned int line, uint col, unrelocated_addr address,
 		     linetable_entry_flags flags,
 		     struct dwarf2_cu *cu)
 {
@@ -18355,7 +18366,7 @@ dwarf_record_line_1 (struct gdbarch *gdbarch, struct subfile *subfile,
     }
 
   if (cu != nullptr)
-    cu->get_builder ()->record_line (subfile, line, addr, flags);
+    cu->get_builder ()->record_line (subfile, line, col, addr, flags);
 }
 
 /* Subroutine of dwarf_decode_lines_1 to simplify it.
@@ -18378,7 +18389,7 @@ dwarf_finish_line (struct gdbarch *gdbarch, struct subfile *subfile,
 		  paddress (gdbarch, (CORE_ADDR) address));
     }
 
-  dwarf_record_line_1 (gdbarch, subfile, 0, address, LEF_IS_STMT, cu);
+  dwarf_record_line_1 (gdbarch, subfile, 0, 0, address, LEF_IS_STMT, cu);
 }
 
 void
@@ -18444,17 +18455,19 @@ lnp_state_machine::record_line (bool end_sequence)
 	    lte_flags |= LEF_IS_STMT;
 
 	  if (dwarf_record_line_p (m_cu, m_line, m_last_line,
+	  			   m_col, m_last_col,
 				   m_line_has_non_zero_discriminator,
 				   m_last_subfile))
 	    {
 	      buildsym_compunit *builder = m_cu->get_builder ();
 	      dwarf_record_line_1 (m_gdbarch,
 				   builder->get_current_subfile (),
-				   m_line, m_address, lte_flags,
+				   m_line, m_col, m_address, lte_flags,
 				   m_currently_recording_lines ? m_cu : nullptr);
 	    }
 	  m_last_subfile = m_cu->get_builder ()->get_current_subfile ();
 	  m_last_line = m_line;
+	  m_last_col = m_col;
 	}
     }
 
@@ -18670,7 +18683,8 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu,
 	      }
 	      break;
 	    case DW_LNS_set_column:
-	      (void) read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
+	      state_machine.set_column (
+		read_unsigned_leb128 (abfd, line_ptr, &bytes_read));
 	      line_ptr += bytes_read;
 	      break;
 	    case DW_LNS_negate_stmt:
diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c
index 73df0ed8165..b5cbe4548a7 100644
--- a/gdb/mdebugread.c
+++ b/gdb/mdebugread.c
@@ -4008,7 +4008,7 @@ mdebug_expand_psymtab (legacy_psymtab *pst, struct objfile *objfile)
 		{
 		  /* Handle encoded stab line number.  */
 		  record_line
-		    (get_current_subfile (), sh.index,
+		    (get_current_subfile (), sh.index, 0,
 		     unrelocated_addr (gdbarch_addr_bits_remove (gdbarch,
 								 valu)));
 		}
diff --git a/gdb/symtab.h b/gdb/symtab.h
index eecd999b7e6..38d08fe8599 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -1616,14 +1616,19 @@ struct linetable_entry
     return m_pc < other.m_pc;
   }
 
-  /* Two entries are equal if they have the same line and PC.  The
+  /* Two entries are equal if they have the same line, PC and col.  The
      other members are ignored.  */
   bool operator== (const linetable_entry &other) const
-  { return line == other.line && m_pc == other.m_pc; }
+  { return line == other.line && m_pc == other.m_pc && col == other.col; }
 
   /* The line number for this entry.  */
   int line;
 
+  /* The column number for entry.  Assume a maximum of circa 500M columns,
+     a similar assumption is made for line after all.  Keeps an identical
+     size for linetable_entry (16 bytes).  */
+  unsigned int col : 29;
+
   /* True if this PC is a good location to place a breakpoint for LINE.  */
   bool is_stmt : 1;
 
diff --git a/gdb/testsuite/gdb.base/watchpoint.exp b/gdb/testsuite/gdb.base/watchpoint.exp
index 2449663ef8b..83fc42c0f6c 100644
--- a/gdb/testsuite/gdb.base/watchpoint.exp
+++ b/gdb/testsuite/gdb.base/watchpoint.exp
@@ -327,19 +327,11 @@ proc test_stepping {} {
 	# stepping through the loop once, and the debugger should not
 	# stop for any of the remaining iterations.
 
-	gdb_test "until" "ival1 = count.*" "until to ival1 assignment"
-	gdb_test "until" "ival3 = count.*" "until to ival3 assignment"
-	set test "until out of loop"
-	gdb_test_multiple "until" $test {
-	    -re "(for \\(count = 0|\}).*$gdb_prompt $" {
-		gdb_test "until" "ival1 = count; /. Outside loop ./" $test
-	    }
-	    -re "ival1 = count; /. Outside loop ./.*$gdb_prompt $" {
-		pass $test
-	    }
-	}
+	gdb_test "tbreak watchpoint.c:185" \
+		".*watchpoint.c:185.*" \
+		"set temporarybreakpoint to before assignment of ival2"
 
-	gdb_test "step" "ival2 = count.*" "step to ival2 assignment"
+	gdb_test "continue" "ival2 = count.*" "cont to ival2 assignment"
 
 	# Check that the watchpoint is triggered during a step.
 	gdb_test "step" \
diff --git a/gdb/testsuite/gdb.dwarf2/dw2-out-of-range-end-of-seq.exp b/gdb/testsuite/gdb.dwarf2/dw2-out-of-range-end-of-seq.exp
index 060b5b6dbfa..33c417576e6 100644
--- a/gdb/testsuite/gdb.dwarf2/dw2-out-of-range-end-of-seq.exp
+++ b/gdb/testsuite/gdb.dwarf2/dw2-out-of-range-end-of-seq.exp
@@ -84,7 +84,7 @@ if ![runto_main] {
 }
 
 set test "END with address 1 eliminated"
-gdb_test_multiple "maint info line-table \\b$srcfile$" $test {
+gdb_test_multiple "maint info line-table $srcfile" $test {
     -re -wrap "END *0x0*1 *$hex *Y *\r\n.*" {
 	fail $gdb_test_name
     }
-- 
2.43.0


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH v2 2/5] [dap & linetable]: Add column to maint info linetable output
  2024-01-17 21:05 [PATCH v2 1/5] [dap & linetable]: Add column to linetable entry Simon Farre
@ 2024-01-17 21:05 ` Simon Farre
  2024-01-17 21:05 ` [PATCH v2 4/5] [dap & linetable]: Add breakpointLocations request Simon Farre
  1 sibling, 0 replies; 3+ messages in thread
From: Simon Farre @ 2024-01-17 21:05 UTC (permalink / raw)
  To: gdb-patches; +Cc: Simon Farre

This adds "COL" to the output of the maintenance command "info
line-table"

v2.
maint info line-table: Make display of column optional

Toggle the display (on) of column meta data by adding `-show-col`
to the command. This command is used way too much in testing to change
at this point making any feature that touches this almost impossible to
move forward due to test maintenance hell.
---
 gdb/symmisc.c | 102 +++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 76 insertions(+), 26 deletions(-)

diff --git a/gdb/symmisc.c b/gdb/symmisc.c
index 5dfb9fca8f0..b7dccb3893e 100644
--- a/gdb/symmisc.c
+++ b/gdb/symmisc.c
@@ -937,17 +937,67 @@ block_depth (const struct block *block)
     }
   return i;
 }
-\f
+
+static void
+output_lt_row (ui_out *uiout, int i, const linetable_entry &item,
+	       const objfile *obj)
+{
+  ui_out_emit_tuple tuple_emitter (uiout, nullptr);
+  uiout->field_signed ("index", i);
+  if (item.line > 0)
+    {
+      uiout->field_signed ("line", item.line);
+    }
+  else
+    {
+      uiout->field_string ("line", _ ("END"));
+    }
+  uiout->field_core_addr ("rel-address", obj->arch (), item.pc (obj));
+  uiout->field_core_addr ("unrel-address", obj->arch (),
+			  CORE_ADDR (item.unrelocated_pc ()));
+  uiout->field_string ("is-stmt", item.is_stmt ? "Y" : "");
+  uiout->field_string ("prologue-end", item.prologue_end ? "Y" : "");
+  uiout->field_string ("epilogue-begin", item.epilogue_begin ? "Y" : "");
+  uiout->text ("\n");
+}
+
+static auto
+output_lt_row_with_col (ui_out *uiout, int i, const linetable_entry &item,
+			const objfile *obj)
+{
+  ui_out_emit_tuple tuple_emitter (uiout, nullptr);
+  uiout->field_signed ("index", i);
+  if (item.line > 0)
+    {
+      uiout->field_signed ("line", item.line);
+      uiout->field_signed ("col", item.col);
+    }
+  else
+    {
+      uiout->field_string ("line", _ ("END"));
+      uiout->field_string ("col", _ ("END"));
+    }
+  uiout->field_core_addr ("rel-address", obj->arch (), item.pc (obj));
+  uiout->field_core_addr ("unrel-address", obj->arch (),
+			  CORE_ADDR (item.unrelocated_pc ()));
+  uiout->field_string ("is-stmt", item.is_stmt ? "Y" : "");
+  uiout->field_string ("prologue-end", item.prologue_end ? "Y" : "");
+  uiout->field_string ("epilogue-begin", item.epilogue_begin ? "Y" : "");
+  uiout->text ("\n");
+}
 
 /* Used by MAINTENANCE_INFO_LINE_TABLES to print the information about a
    single line table.  */
 
 static int
-maintenance_print_one_line_table (struct symtab *symtab, void *data)
+maintenance_print_one_line_table (struct symtab *symtab, void *data,
+				  bool display_col)
 {
   const struct linetable *linetable;
   struct objfile *objfile;
 
+  const auto columns = display_col ? 8 : 7;
+
   objfile = symtab->compunit ()->objfile ();
   gdb_printf (_("objfile: %ps ((struct objfile *) %s)\n"),
 	      styled_string (file_name_style.style (),
@@ -973,9 +1023,11 @@ maintenance_print_one_line_table (struct symtab *symtab, void *data)
       /* Leave space for 6 digits of index and line number.  After that the
 	 tables will just not format as well.  */
       struct ui_out *uiout = current_uiout;
-      ui_out_emit_table table_emitter (uiout, 7, -1, "line-table");
+      ui_out_emit_table table_emitter (uiout, columns, -1, "line-table");
       uiout->table_header (6, ui_left, "index", _("INDEX"));
       uiout->table_header (6, ui_left, "line", _("LINE"));
+      if (display_col)
+	uiout->table_header (6, ui_left, "col", _("COL"));
       uiout->table_header (18, ui_left, "rel-address", _("REL-ADDRESS"));
       uiout->table_header (18, ui_left, "unrel-address", _("UNREL-ADDRESS"));
       uiout->table_header (7, ui_left, "is-stmt", _("IS-STMT"));
@@ -983,26 +1035,12 @@ maintenance_print_one_line_table (struct symtab *symtab, void *data)
       uiout->table_header (14, ui_left, "epilogue-begin", _("EPILOGUE-BEGIN"));
       uiout->table_body ();
 
-      for (int i = 0; i < linetable->nitems; ++i)
-	{
-	  const linetable_entry *item;
-
-	  item = &linetable->item [i];
-	  ui_out_emit_tuple tuple_emitter (uiout, nullptr);
-	  uiout->field_signed ("index", i);
-	  if (item->line > 0)
-	    uiout->field_signed ("line", item->line);
-	  else
-	    uiout->field_string ("line", _("END"));
-	  uiout->field_core_addr ("rel-address", objfile->arch (),
-				  item->pc (objfile));
-	  uiout->field_core_addr ("unrel-address", objfile->arch (),
-				  CORE_ADDR (item->unrelocated_pc ()));
-	  uiout->field_string ("is-stmt", item->is_stmt ? "Y" : "");
-	  uiout->field_string ("prologue-end", item->prologue_end ? "Y" : "");
-	  uiout->field_string ("epilogue-begin", item->epilogue_begin ? "Y" : "");
-	  uiout->text ("\n");
-	}
+      if (display_col)
+	for (int i = 0; i < linetable->nitems; ++i)
+	  output_lt_row_with_col (uiout, i, linetable->item[i], objfile);
+      else
+	for (int i = 0; i < linetable->nitems; ++i)
+	  output_lt_row (uiout, i, linetable->item[i], objfile);
     }
 
   return 0;
@@ -1011,9 +1049,20 @@ maintenance_print_one_line_table (struct symtab *symtab, void *data)
 /* Implement the 'maint info line-table' command.  */
 
 static void
-maintenance_info_line_tables (const char *regexp, int from_tty)
+maintenance_info_line_tables (const char* args, int from_tty)
 {
   dont_repeat ();
+  const char* regexp = nullptr;
+  bool show_column = false;
+  gdb_argv argv (args);
+
+  for (auto i = 0; argv != nullptr && argv[i] != nullptr; ++i)
+    {
+      if (strcmp (argv[i], "-show-col") == 0)
+	show_column = true;
+      else
+	regexp = argv[i];
+    }
 
   if (regexp != NULL)
     re_comp (regexp);
@@ -1030,7 +1079,7 @@ maintenance_info_line_tables (const char *regexp, int from_tty)
 		if (regexp == NULL
 		    || re_exec (symtab_to_filename_for_display (symtab)))
 		  {
-		    maintenance_print_one_line_table (symtab, NULL);
+		    maintenance_print_one_line_table (symtab, NULL, show_column);
 		    gdb_printf ("\n");
 		  }
 	      }
@@ -1080,7 +1129,8 @@ With an argument REGEXP, list the symbol tables with matching names."),
   add_cmd ("line-table", class_maintenance, maintenance_info_line_tables, _("\
 List the contents of all line tables, from all symbol tables.\n\
 With an argument REGEXP, list just the line tables for the symbol\n\
-tables with matching names."),
+tables with matching names.\n\
+With the argument -show-col this command also displays column information."),
 	   &maintenanceinfolist);
 
   add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
-- 
2.43.0


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH v2 4/5] [dap & linetable]: Add breakpointLocations request
  2024-01-17 21:05 [PATCH v2 1/5] [dap & linetable]: Add column to linetable entry Simon Farre
  2024-01-17 21:05 ` [PATCH v2 2/5] [dap & linetable]: Add column to maint info linetable output Simon Farre
@ 2024-01-17 21:05 ` Simon Farre
  1 sibling, 0 replies; 3+ messages in thread
From: Simon Farre @ 2024-01-17 21:05 UTC (permalink / raw)
  To: gdb-patches; +Cc: Simon Farre

This adds the breakpointLocations request.

Testing might strictly not be possible for this feature. Users are going
to have wildly varying compilers and compiler versions that outputs
wildly different debug symbol information. So unless we can restrain the
tests to some specific toolchain that I can handroll the tests for, this
will not be useful (and handrolling for a specific compiler defeats the
purpose - as one can just use the eyes then to verify).

v2:
Fixed type check issue

Forgot the obligatory **args at the end of breakpoint_locations
---
 gdb/python/lib/gdb/dap/breakpoint.py | 27 +++++++++++++++++++++++++++
 1 file changed, 27 insertions(+)

diff --git a/gdb/python/lib/gdb/dap/breakpoint.py b/gdb/python/lib/gdb/dap/breakpoint.py
index 9cbd7ae0c47..70c93b0a03d 100644
--- a/gdb/python/lib/gdb/dap/breakpoint.py
+++ b/gdb/python/lib/gdb/dap/breakpoint.py
@@ -437,3 +437,30 @@ def set_exception_breakpoints(
     return {
         "breakpoints": _set_exception_catchpoints(options),
     }
+
+
+@in_gdb_thread
+def _get_logical_bp_locations(name: str, line: int):
+    linetable = gdb.lookup_linetable(name)
+    if linetable is not None:
+        return [
+            {"line": lte.line, "column": lte.column} for lte in linetable.line(line)
+        ]
+    else:
+        return []
+
+
+@request("breakpointLocations")
+@capability("supportsBreakpointLocationsRequest")
+def breakpoint_locations(
+    *,
+    # This is a Source but we don't type-check it.
+    source,
+    line: int,
+    column: Optional[int],
+    endLine: Optional[int],
+    endColumn: Optional[int],
+    **args,
+):
+    # for now we don't support column, endLine, endColumn. We just return per line
+    return {"breakpoints": _get_logical_bp_locations(source["path"], line)}
-- 
2.43.0


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2024-01-17 21:05 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-01-17 21:05 [PATCH v2 1/5] [dap & linetable]: Add column to linetable entry Simon Farre
2024-01-17 21:05 ` [PATCH v2 2/5] [dap & linetable]: Add column to maint info linetable output Simon Farre
2024-01-17 21:05 ` [PATCH v2 4/5] [dap & linetable]: Add breakpointLocations request Simon Farre

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).