On Wed, Nov 21, 2018 at 2:06 AM Alexandre Oliva <ol...@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