public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] gdb/buildsym: Line record use a record flag
@ 2022-04-04 22:07 Lancelot SIX
  0 siblings, 0 replies; only message in thread
From: Lancelot SIX @ 2022-04-04 22:07 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=6cacd78ba5bb705e127d60478c71955b37914c53

commit 6cacd78ba5bb705e127d60478c71955b37914c53
Author: Lancelot SIX <lancelot.six@amd.com>
Date:   Mon Mar 7 17:36:53 2022 +0000

    gdb/buildsym: Line record use a record flag
    
    Currently when recording a line entry (with
    buildsym_compunit::record_line), a boolean argument argument is used to
    indicate that the is_stmt flag should be set for this particular record.
    As a later commit will add support for new flags, instead of adding a
    parameter to record_line for each possible flag, transform the current
    is_stmt parameter into a enum flag.  This flags parameter will allow
    greater flexibility in future commits.
    
    This enum flags type is not propagated into the linetable_entry type as
    this would require a lot of changes across the codebase for no practical
    gain (it currently uses a bitfield where each interesting flag only
    occupy 1 bit in the structure).
    
    Tested on x86_64-linux, no regression observed.
    
    Change-Id: I5d061fa67bdb34918742505ff983d37453839d6a

Diff:
---
 gdb/buildsym-legacy.c |  2 +-
 gdb/buildsym.c        |  4 ++--
 gdb/buildsym.h        | 12 +++++++++++-
 gdb/dwarf2/read.c     | 37 ++++++++++++++++++++++---------------
 4 files changed, 36 insertions(+), 19 deletions(-)

diff --git a/gdb/buildsym-legacy.c b/gdb/buildsym-legacy.c
index b16c97807ac..490eef965d0 100644
--- a/gdb/buildsym-legacy.c
+++ b/gdb/buildsym-legacy.c
@@ -210,7 +210,7 @@ record_line (struct subfile *subfile, int line, CORE_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, true);
+  buildsym_compunit->record_line (subfile, line, pc, LEF_IS_STMT);
 }
 
 /* Start a new compunit_symtab for a new source file in OBJFILE.  Called, for
diff --git a/gdb/buildsym.c b/gdb/buildsym.c
index c970762badb..08e4062fe17 100644
--- a/gdb/buildsym.c
+++ b/gdb/buildsym.c
@@ -667,7 +667,7 @@ buildsym_compunit::pop_subfile ()
 
 void
 buildsym_compunit::record_line (struct subfile *subfile, int line,
-				CORE_ADDR pc, bool is_stmt)
+				CORE_ADDR pc, linetable_entry_flags flags)
 {
   struct linetable_entry *e;
 
@@ -723,7 +723,7 @@ buildsym_compunit::record_line (struct subfile *subfile, int line,
 
   e = subfile->line_vector->item + subfile->line_vector->nitems++;
   e->line = line;
-  e->is_stmt = is_stmt ? 1 : 0;
+  e->is_stmt = (flags & LEF_IS_STMT) != 0;
   e->pc = pc;
 }
 
diff --git a/gdb/buildsym.h b/gdb/buildsym.h
index fa774dbd6fb..00e57787897 100644
--- a/gdb/buildsym.h
+++ b/gdb/buildsym.h
@@ -110,6 +110,16 @@ struct context_stack
 
   };
 
+/* Flags associated with a linetable entry.  */
+
+enum linetable_entry_flag : unsigned
+{
+  /* Indicates this PC is a good location to place a breakpoint at LINE.  */
+  LEF_IS_STMT = 1 << 1,
+};
+DEF_ENUM_FLAGS_TYPE (enum linetable_entry_flag, linetable_entry_flags);
+
+
 /* Buildsym's counterpart to struct compunit_symtab.  */
 
 struct buildsym_compunit
@@ -188,7 +198,7 @@ struct buildsym_compunit
   const char *pop_subfile ();
 
   void record_line (struct subfile *subfile, int line, CORE_ADDR pc,
-		    bool is_stmt);
+		    linetable_entry_flags flags);
 
   struct compunit_symtab *get_compunit_symtab ()
   {
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index cb33171b1a9..d1c0ec2be2d 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -20925,7 +20925,7 @@ public:
   /* Handle DW_LNS_negate_stmt.  */
   void handle_negate_stmt ()
   {
-    m_is_stmt = !m_is_stmt;
+    m_flags ^= LEF_IS_STMT;
   }
 
   /* Handle DW_LNS_const_add_pc.  */
@@ -20984,7 +20984,7 @@ private:
   /* These are initialized in the constructor.  */
 
   CORE_ADDR m_address;
-  bool m_is_stmt;
+  linetable_entry_flags m_flags;
   unsigned int m_discriminator;
 
   /* Additional bits of state we need to track.  */
@@ -20999,9 +20999,9 @@ private:
   CORE_ADDR m_last_address;
 
   /* Set to true when a previous line at the same address (using
-     m_last_address) had m_is_stmt true.  This is reset to false when a
-     line entry at a new address (m_address different to m_last_address) is
-     processed.  */
+     m_last_address) had LEF_IS_STMT set in m_flags.  This is reset to false
+     when a line entry at a new address (m_address different to
+     m_last_address) is processed.  */
   bool m_stmt_at_address = false;
 
   /* When true, record the lines we decode.  */
@@ -21131,7 +21131,8 @@ dwarf_record_line_p (struct dwarf2_cu *cu,
 
 static void
 dwarf_record_line_1 (struct gdbarch *gdbarch, struct subfile *subfile,
-		     unsigned int line, CORE_ADDR address, bool is_stmt,
+		     unsigned int line, CORE_ADDR address,
+		     linetable_entry_flags flags,
 		     struct dwarf2_cu *cu)
 {
   CORE_ADDR addr = gdbarch_addr_bits_remove (gdbarch, address);
@@ -21145,7 +21146,7 @@ dwarf_record_line_1 (struct gdbarch *gdbarch, struct subfile *subfile,
     }
 
   if (cu != nullptr)
-    cu->get_builder ()->record_line (subfile, line, addr, is_stmt);
+    cu->get_builder ()->record_line (subfile, line, addr, flags);
 }
 
 /* Subroutine of dwarf_decode_lines_1 to simplify it.
@@ -21168,7 +21169,7 @@ dwarf_finish_line (struct gdbarch *gdbarch, struct subfile *subfile,
 		  paddress (gdbarch, address));
     }
 
-  dwarf_record_line_1 (gdbarch, subfile, 0, address, true, cu);
+  dwarf_record_line_1 (gdbarch, subfile, 0, address, LEF_IS_STMT, cu);
 }
 
 void
@@ -21181,7 +21182,8 @@ lnp_state_machine::record_line (bool end_sequence)
 		  " address %s, is_stmt %u, discrim %u%s\n",
 		  m_line, m_file,
 		  paddress (m_gdbarch, m_address),
-		  m_is_stmt, m_discriminator,
+		  (m_flags & LEF_IS_STMT) != 0,
+		  m_discriminator,
 		  (end_sequence ? "\t(end sequence)" : ""));
     }
 
@@ -21216,7 +21218,8 @@ lnp_state_machine::record_line (bool end_sequence)
 	    = m_last_subfile != m_cu->get_builder ()->get_current_subfile ();
 	  bool ignore_this_line
 	   = ((file_changed && !end_sequence && m_last_address == m_address
-	       && !m_is_stmt && m_stmt_at_address)
+	       && ((m_flags & LEF_IS_STMT) == 0)
+	       && m_stmt_at_address)
 	      || (!end_sequence && m_line == 0));
 
 	  if ((file_changed && !ignore_this_line) || end_sequence)
@@ -21227,7 +21230,9 @@ lnp_state_machine::record_line (bool end_sequence)
 
 	  if (!end_sequence && !ignore_this_line)
 	    {
-	      bool is_stmt = producer_is_codewarrior (m_cu) || m_is_stmt;
+	      linetable_entry_flags lte_flags = m_flags;
+	      if (producer_is_codewarrior (m_cu))
+		lte_flags |= LEF_IS_STMT;
 
 	      if (dwarf_record_line_p (m_cu, m_line, m_last_line,
 				       m_line_has_non_zero_discriminator,
@@ -21236,7 +21241,7 @@ lnp_state_machine::record_line (bool end_sequence)
 		  buildsym_compunit *builder = m_cu->get_builder ();
 		  dwarf_record_line_1 (m_gdbarch,
 				       builder->get_current_subfile (),
-				       m_line, m_address, is_stmt,
+				       m_line, m_address, lte_flags,
 				       m_currently_recording_lines ? m_cu : nullptr);
 		}
 	      m_last_subfile = m_cu->get_builder ()->get_current_subfile ();
@@ -21245,14 +21250,14 @@ lnp_state_machine::record_line (bool end_sequence)
 	}
     }
 
-  /* Track whether we have seen any m_is_stmt true at m_address in case we
+  /* Track whether we have seen any IS_STMT true at m_address in case we
      have multiple line table entries all at m_address.  */
   if (m_last_address != m_address)
     {
       m_stmt_at_address = false;
       m_last_address = m_address;
     }
-  m_stmt_at_address |= m_is_stmt;
+  m_stmt_at_address |= (m_flags & LEF_IS_STMT) != 0;
 }
 
 lnp_state_machine::lnp_state_machine (struct dwarf2_cu *cu, gdbarch *arch,
@@ -21270,7 +21275,9 @@ lnp_state_machine::lnp_state_machine (struct dwarf2_cu *cu, gdbarch *arch,
      and also record it in case it needs it.  This is currently used by MIPS
      code, cf. `mips_adjust_dwarf2_line'.  */
   m_address = gdbarch_adjust_dwarf2_line (arch, 0, 0);
-  m_is_stmt = lh->default_is_stmt;
+  m_flags = 0;
+  if (lh->default_is_stmt)
+    m_flags |= LEF_IS_STMT;
   m_discriminator = 0;
 
   m_last_address = m_address;


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-04-04 22:07 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-04-04 22:07 [binutils-gdb] gdb/buildsym: Line record use a record flag Lancelot SIX

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).