This patch fixes the discriminator assignments for stmts. It used to apply a signle locus for everything, which is not right (will invalidate locus for macro expansion).
Bootstrapped and passed regression test. OK for google-4_8? Thanks, Dehao Index: gcc/input.c =================================================================== --- gcc/input.c (revision 200625) +++ gcc/input.c (working copy) @@ -308,7 +308,7 @@ location_with_discriminator (location_t locus, int { tree block = LOCATION_BLOCK (locus); location_t ret; - locus = LOCATION_LOCUS (locus); + locus = map_discriminator_location (locus); if (locus == UNKNOWN_LOCATION) return block ? COMBINE_LOCATION_DATA (line_table, locus, block) Index: gcc/tree-cfg.c =================================================================== --- gcc/tree-cfg.c (revision 200625) +++ gcc/tree-cfg.c (working copy) @@ -751,24 +751,22 @@ static void assign_discriminator (location_t locus, basic_block bb) { gimple_stmt_iterator gsi; - tree block = LOCATION_BLOCK (locus); + int discriminator; locus = map_discriminator_location (locus); if (locus == UNKNOWN_LOCATION) return; - locus = location_with_discriminator ( - locus, next_discriminator_for_locus (locus)); + discriminator = next_discriminator_for_locus (locus); - if (block != NULL) - locus = COMBINE_LOCATION_DATA (line_table, locus, block); - for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) { gimple stmt = gsi_stmt (gsi); - if (same_line_p (locus, gimple_location (stmt))) - gimple_set_location (stmt, locus); + location_t stmt_locus = gimple_location (stmt); + if (same_line_p (locus, stmt_locus)) + gimple_set_location ( + stmt, location_with_discriminator (stmt_locus, discriminator)); } }