diff mbox series

compute discriminator info for overrides

Message ID or8t1ntf2t.fsf@lxoliva.fsfla.org
State New
Headers show
Series compute discriminator info for overrides | expand

Commit Message

Alexandre Oliva Nov. 21, 2018, 1:05 a.m. UTC
In some cases of overriding or resetting locations, we might retain
discriminator info from earlier locations, when we should take
discriminator information from the overriding location or reset it.

Regstrapped on x86_64-linux-gnu.  Ok to install?

for  gcc/ChangeLog

	* final.c (compute_discriminator): Declare.  Renamed from...
	(maybe_set_discriminator): ... this.  Set and return a local.
	(override_discriminator): New.
	(final_scan_insn_1): Set it.
	(notice_source_line): Adjust.  Always set discriminator.
---
 gcc/final.c |   19 +++++++++++++++----
 1 file changed, 15 insertions(+), 4 deletions(-)

Comments

Richard Biener Nov. 21, 2018, 2:15 p.m. UTC | #1
On Wed, Nov 21, 2018 at 2:06 AM Alexandre Oliva <oliva@adacore.com> wrote:
>
> In some cases of overriding or resetting locations, we might retain
> discriminator info from earlier locations, when we should take
> discriminator information from the overriding location or reset it.
>
> Regstrapped on x86_64-linux-gnu.  Ok to install?

OK.

Richard.

> for  gcc/ChangeLog
>
>         * final.c (compute_discriminator): Declare.  Renamed from...
>         (maybe_set_discriminator): ... this.  Set and return a local.
>         (override_discriminator): New.
>         (final_scan_insn_1): Set it.
>         (notice_source_line): Adjust.  Always set discriminator.
> ---
>  gcc/final.c |   19 +++++++++++++++----
>  1 file changed, 15 insertions(+), 4 deletions(-)
>
> diff --git a/gcc/final.c b/gcc/final.c
> index 0c1ac625f37a..f707d2fc0bcd 100644
> --- a/gcc/final.c
> +++ b/gcc/final.c
> @@ -128,6 +128,7 @@ static int last_discriminator;
>  /* Discriminator to be written to assembly for current instruction.
>     Note: actual usage depends on loc_discriminator_kind setting.  */
>  static int discriminator;
> +static inline int compute_discriminator (location_t loc);
>
>  /* Discriminator identifying current basic block among others sharing
>     the same locus.  */
> @@ -149,6 +150,7 @@ static const char *last_filename;
>  static const char *override_filename;
>  static int override_linenum;
>  static int override_columnnum;
> +static int override_discriminator;
>
>  /* Whether to force emission of a line note before the next insn.  */
>  static bool force_source_line = false;
> @@ -2342,6 +2344,7 @@ final_scan_insn_1 (rtx_insn *insn, FILE *file, int optimize_p ATTRIBUTE_UNUSED,
>                   override_filename = LOCATION_FILE (*locus_ptr);
>                   override_linenum = LOCATION_LINE (*locus_ptr);
>                   override_columnnum = LOCATION_COLUMN (*locus_ptr);
> +                 override_discriminator = compute_discriminator (*locus_ptr);
>                 }
>             }
>           break;
> @@ -2379,12 +2382,14 @@ final_scan_insn_1 (rtx_insn *insn, FILE *file, int optimize_p ATTRIBUTE_UNUSED,
>                   override_filename = LOCATION_FILE (*locus_ptr);
>                   override_linenum = LOCATION_LINE (*locus_ptr);
>                   override_columnnum = LOCATION_COLUMN (*locus_ptr);
> +                 override_discriminator = compute_discriminator (*locus_ptr);
>                 }
>               else
>                 {
>                   override_filename = NULL;
>                   override_linenum = 0;
>                   override_columnnum = 0;
> +                 override_discriminator = 0;
>                 }
>             }
>           break;
> @@ -3185,9 +3190,11 @@ map_decl_to_instance (const_tree decl)
>
>  /* Set DISCRIMINATOR to the appropriate value, possibly derived from LOC.  */
>
> -static inline void
> -maybe_set_discriminator (location_t loc)
> +static inline int
> +compute_discriminator (location_t loc)
>  {
> +  int discriminator;
> +
>    if (!decl_to_instance_map)
>      discriminator = bb_discriminator;
>    else
> @@ -3209,6 +3216,8 @@ maybe_set_discriminator (location_t loc)
>
>        discriminator = map_decl_to_instance (decl);
>      }
> +
> +  return discriminator;
>  }
>
>  /* Return whether a source line note needs to be emitted before INSN.
> @@ -3234,7 +3243,7 @@ notice_source_line (rtx_insn *insn, bool *is_stmt)
>        filename = xloc.file;
>        linenum = xloc.line;
>        columnnum = xloc.column;
> -      maybe_set_discriminator (loc);
> +      discriminator = compute_discriminator (loc);
>        force_source_line = true;
>      }
>    else if (override_filename)
> @@ -3242,6 +3251,7 @@ notice_source_line (rtx_insn *insn, bool *is_stmt)
>        filename = override_filename;
>        linenum = override_linenum;
>        columnnum = override_columnnum;
> +      discriminator = override_discriminator;
>      }
>    else if (INSN_HAS_LOCATION (insn))
>      {
> @@ -3249,13 +3259,14 @@ notice_source_line (rtx_insn *insn, bool *is_stmt)
>        filename = xloc.file;
>        linenum = xloc.line;
>        columnnum = xloc.column;
> -      maybe_set_discriminator (INSN_LOCATION (insn));
> +      discriminator = compute_discriminator (INSN_LOCATION (insn));
>      }
>    else
>      {
>        filename = NULL;
>        linenum = 0;
>        columnnum = 0;
> +      discriminator = 0;
>      }
>
>    if (filename == NULL)
>
> --
> Alexandre Oliva, freedom fighter   https://FSFLA.org/blogs/lxo
> Be the change, be Free!         FSF Latin America board member
> GNU Toolchain Engineer                Free Software Evangelist
> Hay que enGNUrecerse, pero sin perder la terGNUra jamás-GNUChe
diff mbox series

Patch

diff --git a/gcc/final.c b/gcc/final.c
index 0c1ac625f37a..f707d2fc0bcd 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -128,6 +128,7 @@  static int last_discriminator;
 /* Discriminator to be written to assembly for current instruction.
    Note: actual usage depends on loc_discriminator_kind setting.  */
 static int discriminator;
+static inline int compute_discriminator (location_t loc);
 
 /* Discriminator identifying current basic block among others sharing
    the same locus.  */
@@ -149,6 +150,7 @@  static const char *last_filename;
 static const char *override_filename;
 static int override_linenum;
 static int override_columnnum;
+static int override_discriminator;
 
 /* Whether to force emission of a line note before the next insn.  */
 static bool force_source_line = false;
@@ -2342,6 +2344,7 @@  final_scan_insn_1 (rtx_insn *insn, FILE *file, int optimize_p ATTRIBUTE_UNUSED,
 		  override_filename = LOCATION_FILE (*locus_ptr);
 		  override_linenum = LOCATION_LINE (*locus_ptr);
 		  override_columnnum = LOCATION_COLUMN (*locus_ptr);
+		  override_discriminator = compute_discriminator (*locus_ptr);
 		}
 	    }
 	  break;
@@ -2379,12 +2382,14 @@  final_scan_insn_1 (rtx_insn *insn, FILE *file, int optimize_p ATTRIBUTE_UNUSED,
 		  override_filename = LOCATION_FILE (*locus_ptr);
 		  override_linenum = LOCATION_LINE (*locus_ptr);
 		  override_columnnum = LOCATION_COLUMN (*locus_ptr);
+		  override_discriminator = compute_discriminator (*locus_ptr);
 		}
 	      else
 		{
 		  override_filename = NULL;
 		  override_linenum = 0;
 		  override_columnnum = 0;
+		  override_discriminator = 0;
 		}
 	    }
 	  break;
@@ -3185,9 +3190,11 @@  map_decl_to_instance (const_tree decl)
 
 /* Set DISCRIMINATOR to the appropriate value, possibly derived from LOC.  */
 
-static inline void
-maybe_set_discriminator (location_t loc)
+static inline int
+compute_discriminator (location_t loc)
 {
+  int discriminator;
+
   if (!decl_to_instance_map)
     discriminator = bb_discriminator;
   else
@@ -3209,6 +3216,8 @@  maybe_set_discriminator (location_t loc)
 
       discriminator = map_decl_to_instance (decl);
     }
+
+  return discriminator;
 }
 
 /* Return whether a source line note needs to be emitted before INSN.
@@ -3234,7 +3243,7 @@  notice_source_line (rtx_insn *insn, bool *is_stmt)
       filename = xloc.file;
       linenum = xloc.line;
       columnnum = xloc.column;
-      maybe_set_discriminator (loc);
+      discriminator = compute_discriminator (loc);
       force_source_line = true;
     }
   else if (override_filename)
@@ -3242,6 +3251,7 @@  notice_source_line (rtx_insn *insn, bool *is_stmt)
       filename = override_filename;
       linenum = override_linenum;
       columnnum = override_columnnum;
+      discriminator = override_discriminator;
     }
   else if (INSN_HAS_LOCATION (insn))
     {
@@ -3249,13 +3259,14 @@  notice_source_line (rtx_insn *insn, bool *is_stmt)
       filename = xloc.file;
       linenum = xloc.line;
       columnnum = xloc.column;
-      maybe_set_discriminator (INSN_LOCATION (insn));
+      discriminator = compute_discriminator (INSN_LOCATION (insn));
     }
   else
     {
       filename = NULL;
       linenum = 0;
       columnnum = 0;
+      discriminator = 0;
     }
 
   if (filename == NULL)