On Wed, Nov 21, 2018 at 2:06 AM Alexandre Oliva <[email protected]> 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