From patchwork Tue May 21 00:09:03 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dehao Chen X-Patchwork-Id: 245141 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "localhost", Issuer "www.qmailtoaster.com" (not verified)) by ozlabs.org (Postfix) with ESMTPS id C84052C00B8 for ; Tue, 21 May 2013 10:09:15 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; q=dns; s=default; b=o5YXiVjBsVJCh9m8yP 4tF6WCvucmrwuex4WkYLlpuPLFVt+SoTXSl+EWuFMOPOX6fKAtv0VFpOZ9gdvyf2 cdrqbqKWv/5sLyCRJ3nqx7Ad1xnJ8wZVg1EMZ9xgO0uaRN5B7UJE5gRblXCczkUd 850awh4dtNatmcEZprHXJ4xeo= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :mime-version:in-reply-to:references:date:message-id:subject :from:to:cc:content-type; s=default; bh=d58Yo0pnEU7z0GGouzWbj1S5 Org=; b=CX8n2uwRTHPFfXEmkjrn+xetmb3LSBx4YnpoIM9UoUy1YxdndbqP6/IB ubOrG4atY8hKc2MJxVPTPU5CkTNNEoY1MBZFtqK8Y2qoLG+ehNsaHpTNhfQ8xu5p m3OlZhftYK841UiDSPBK6SNGj/Jz6KZPonALWTe/FZ6vfEhBfpE= Received: (qmail 14094 invoked by alias); 21 May 2013 00:09:08 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 14085 invoked by uid 89); 21 May 2013 00:09:07 -0000 X-Spam-SWARE-Status: No, score=-4.5 required=5.0 tests=AWL, BAYES_00, KHOP_THREADED, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_YE, RP_MATCHES_RCVD, SPF_PASS, TW_FN, TW_TM autolearn=ham version=3.3.1 Received: from mail-ea0-f180.google.com (HELO mail-ea0-f180.google.com) (209.85.215.180) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Tue, 21 May 2013 00:09:05 +0000 Received: by mail-ea0-f180.google.com with SMTP id g10so13832eak.39 for ; Mon, 20 May 2013 17:09:03 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:x-received:in-reply-to:references:date:message-id :subject:from:to:cc:content-type:x-gm-message-state; bh=9M83cQQYceF5NEZuA4H8bNPutWcp5ZUM9b35dWeWn7A=; b=mpJhmcxiSkH/Wg2yLdi499Ql3Zd6EZIMWSAMdEg9KWSnxB0C4MzO1sDfJwK4/bEviL 1MzMJ1BocFgr8l4/fZnq8Aq53NBL3S4Blrc5ZRWZ5GKPPPHFNfEJ6msCs0g4asS7/gjl I88RoO7Zj0CEBo5xlQnpn8Dj+e08ApVhj/kWKa9UTQI3j+0FfYzGi308nyCRtRneMf3Q bWIB22B3eUATL1PeofpQrgsYAw9aEk3BfO5N69AAjYQMgjZB2OxHI3QU29epQpoaFXbV lae58506d9lN4InODBkO56M6DioCI7cixwe5/rYQ45q/jkTjeohbSxtY5qolIdG35eFl 5kqQ== MIME-Version: 1.0 X-Received: by 10.14.106.129 with SMTP id m1mr6234108eeg.31.1369094943351; Mon, 20 May 2013 17:09:03 -0700 (PDT) Received: by 10.14.175.131 with HTTP; Mon, 20 May 2013 17:09:03 -0700 (PDT) In-Reply-To: References: Date: Mon, 20 May 2013 17:09:03 -0700 Message-ID: Subject: Re: [GOOGLE] Back port discriminator patches to gcc-4_8 From: Dehao Chen To: Cary Coutant Cc: GCC Patches X-Gm-Message-State: ALoCoQlupSEPVoG+l+b6hU8nT0mEJw9i04fyYlPyu57P6DLsrQcTlpl9JC3JUsK8Nh5F+lAsh5RTNv1lw6uDCK2RTPSyfahX8KLy6jC9n8YjOt3CZlWAyDs/avgxunHrcDzPS29WA5tnrO6C9gO1vptg5Dsr1eipLWseDL39VyKEmRWL/asxEZSP8YEHzab0ihFkvXHfExRV X-Virus-Found: No Fixed the problem, and retested. New patch attached. Dehao On Mon, May 20, 2013 at 3:53 PM, Cary Coutant wrote: >>> I've updated the patch. Bootstrapped and passed all regression test. >>> >>> OK for google-4_8? > > Index: gcc/Makefile.in > =================================================================== > --- gcc/Makefile.in (revision 199127) > +++ gcc/Makefile.in (working copy) > @@ -1470,7 +1470,7 @@ OBJS-libcommon = diagnostic.o pretty-print.o intl. > # compiler and containing target-dependent code. > OBJS-libcommon-target = $(common_out_object_file) prefix.o params.o \ > opts.o opts-common.o options.o vec.o hooks.o common/common-targhooks.o \ > - hash-table.o file-find.o > + hash-table.o file-find.o vec.o > > This already has vec.o on the previous line. OBJS-libcommon is the one > that's missing vec.o. > > + /* If LOC describes a location with a discriminator, extract the > + discriminator and map it to the real location. */ > + if (min_discriminator_location != UNKNOWN_LOCATION > + && loc >= min_discriminator_location > + && loc < min_discriminator_location + next_discriminator_location) > > The last test should be "loc < next_discriminator_location". > > +bool > +has_discriminator (location_t locus) > +{ > + locus = LOCATION_LOCUS (locus); > + return (min_discriminator_location != UNKNOWN_LOCATION > + && locus >= min_discriminator_location > + && locus < min_discriminator_location + next_discriminator_location); > > Likewise. > > + ret = block ? > + COMBINE_LOCATION_DATA (line_table, next_discriminator_location, block) > + : LOCATION_LOCUS (next_discriminator_location); > + next_discriminator_location++; > + return ret; > > LOCATION_LOCUS is unnecessary here (next_discriminator_location is > never an ad hoc location). This could be: > > ret = next_discriminator_location++; > if (block != NULL) > ret = COMBINE_LOCATION_DATA (line_table, > next_discriminator_location, block); > return ret; > > -cary Index: gcc/final.c =================================================================== --- gcc/final.c (revision 199127) +++ gcc/final.c (working copy) @@ -124,9 +124,6 @@ static int last_linenum; /* Last discriminator written to assembly. */ static int last_discriminator; -/* Discriminator of current block. */ -static int discriminator; - /* Highest line number in current block. */ static int high_block_linenum; @@ -136,9 +133,10 @@ static int high_function_linenum; /* Filename of last NOTE. */ static const char *last_filename; -/* Override filename and line number. */ +/* Override filename, line number, and discriminator. */ static const char *override_filename; static int override_linenum; +static int override_discriminator; /* Whether to force emission of a line note before the next insn. */ static bool force_source_line = false; @@ -1682,7 +1680,7 @@ final_start_function (rtx first, FILE *file, last_filename = LOCATION_FILE (prologue_location); last_linenum = LOCATION_LINE (prologue_location); - last_discriminator = discriminator = 0; + last_discriminator = 0; high_block_linenum = high_function_linenum = last_linenum; @@ -2135,8 +2133,6 @@ final_scan_insn (rtx insn, FILE *file, int optimiz else *seen |= SEEN_BB; - discriminator = NOTE_BASIC_BLOCK (insn)->discriminator; - break; case NOTE_INSN_EH_REGION_BEG: @@ -2229,6 +2225,8 @@ final_scan_insn (rtx insn, FILE *file, int optimiz { override_filename = LOCATION_FILE (*locus_ptr); override_linenum = LOCATION_LINE (*locus_ptr); + override_discriminator = + get_discriminator_from_locus (*locus_ptr); } } break; @@ -2262,11 +2260,14 @@ final_scan_insn (rtx insn, FILE *file, int optimiz { override_filename = LOCATION_FILE (*locus_ptr); override_linenum = LOCATION_LINE (*locus_ptr); + override_discriminator = + get_discriminator_from_locus (*locus_ptr); } else { override_filename = NULL; override_linenum = 0; + override_discriminator = 0; } } break; @@ -2949,6 +2950,17 @@ final_scan_insn (rtx insn, FILE *file, int optimiz } return NEXT_INSN (insn); } + +/* Return discriminator of the statement that produced this insn. */ +int +insn_discriminator (const_rtx insn) +{ + location_t loc = INSN_LOCATION (insn); + if (!loc) + return 0; + return get_discriminator_from_locus (loc); +} + /* Return whether a source line note needs to be emitted before INSN. Sets IS_STMT to TRUE if the line should be marked as a possible @@ -2959,16 +2971,19 @@ notice_source_line (rtx insn, bool *is_stmt) { const char *filename; int linenum; + int discriminator; if (override_filename) { filename = override_filename; linenum = override_linenum; + discriminator = override_discriminator; } else { filename = insn_file (insn); linenum = insn_line (insn); + discriminator = insn_discriminator (insn); } if (filename == NULL) Index: gcc/input.c =================================================================== --- gcc/input.c (revision 199127) +++ gcc/input.c (working copy) @@ -22,6 +22,7 @@ along with GCC; see the file COPYING3. If not see #include "coretypes.h" #include "intl.h" #include "input.h" +#include "vec.h" /* Current position in real source file. */ @@ -29,8 +30,18 @@ location_t input_location; struct line_maps *line_table; +static vec discriminator_location_locations; +static vec discriminator_location_discriminators; +static location_t next_discriminator_location = UNKNOWN_LOCATION; +static location_t min_discriminator_location = UNKNOWN_LOCATION; + /* Expand the source location LOC into a human readable location. If LOC resolves to a builtin location, the file name of the readable + location is set to the string "". */ + + +/* Expand the source location LOC into a human readable location. If + LOC resolves to a builtin location, the file name of the readable location is set to the string "". If EXPANSION_POINT_P is TRUE and LOC is virtual, then it is resolved to the expansion point of the involved macro. Otherwise, it is resolved to the @@ -58,6 +69,13 @@ expand_location_1 (source_location loc, loc = LOCATION_LOCUS (loc); } + /* If LOC describes a location with a discriminator, extract the + discriminator and map it to the real location. */ + if (min_discriminator_location != UNKNOWN_LOCATION + && loc >= min_discriminator_location + && loc < next_discriminator_location) + loc = map_discriminator_location (loc); + memset (&xloc, 0, sizeof (xloc)); if (loc >= RESERVED_LOCATION_COUNT) @@ -278,3 +296,71 @@ dump_line_table_statistics (void) STAT_LABEL (total_used_map_size)); fprintf (stderr, "\n"); } + +/* Associate the DISCRIMINATOR with LOCUS, and return a new locus. + We associate discriminators with a locus by allocating location_t + values beyond those assigned by libcpp. Each new value is mapped + directly to a real location_t value, and separately to the + discriminator. */ + +location_t +location_with_discriminator (location_t locus, int discriminator) +{ + tree block = LOCATION_BLOCK (locus); + location_t ret; + locus = LOCATION_LOCUS (locus); + + if (locus == UNKNOWN_LOCATION) + return block ? COMBINE_LOCATION_DATA (line_table, locus, block) + : locus; + + if (min_discriminator_location == UNKNOWN_LOCATION) + { + min_discriminator_location = line_table->highest_location + 1; + next_discriminator_location = min_discriminator_location; + } + + discriminator_location_locations.safe_push(locus); + discriminator_location_discriminators.safe_push(discriminator); + + if (block != NULL) + ret = COMBINE_LOCATION_DATA (line_table, next_discriminator_location, + block); + else + ret = next_discriminator_location; + next_discriminator_location++; + return ret; +} + +/* Return TRUE if LOCUS represents a location with a discriminator. */ + +bool +has_discriminator (location_t locus) +{ + locus = LOCATION_LOCUS (locus); + return (min_discriminator_location != UNKNOWN_LOCATION + && locus >= min_discriminator_location + && locus < next_discriminator_location); +} + +/* Return the real location_t value for LOCUS. */ + +location_t +map_discriminator_location (location_t locus) +{ + locus = LOCATION_LOCUS (locus); + if (! has_discriminator (locus)) + return locus; + return (location_t) discriminator_location_locations[locus - min_discriminator_location]; +} + +/* Return the discriminator for LOCUS. */ + +int +get_discriminator_from_locus (location_t locus) +{ + locus = LOCATION_LOCUS (locus); + if (! has_discriminator (locus)) + return 0; + return (location_t) discriminator_location_discriminators[locus - min_discriminator_location]; +} Index: gcc/input.h =================================================================== --- gcc/input.h (revision 199127) +++ gcc/input.h (working copy) @@ -47,6 +47,11 @@ typedef source_location location_t; extern location_t input_location; +extern location_t location_with_discriminator (location_t, int); +extern bool has_discriminator (location_t); +extern location_t map_discriminator_location (location_t); +extern int get_discriminator_from_locus (location_t); + #define LOCATION_FILE(LOC) ((expand_location (LOC)).file) #define LOCATION_LINE(LOC) ((expand_location (LOC)).line) #define LOCATION_COLUMN(LOC)((expand_location (LOC)).column) @@ -59,7 +64,8 @@ extern location_t input_location; #define input_line LOCATION_LINE (input_location) #define input_filename LOCATION_FILE (input_location) #define in_system_header_at(LOC) \ - ((linemap_location_in_system_header_p (line_table, LOC))) + ((linemap_location_in_system_header_p (line_table, \ + map_discriminator_location (LOC)))) #define in_system_header (in_system_header_at (input_location)) void dump_line_table_statistics (void); Index: gcc/basic-block.h =================================================================== --- gcc/basic-block.h (revision 199127) +++ gcc/basic-block.h (working copy) @@ -213,11 +213,6 @@ struct GTY((chain_next ("%h.next_bb"), chain_prev /* Expected frequency. Normalized to be in range 0 to BB_FREQ_MAX. */ int frequency; - - /* The discriminator for this block. The discriminator distinguishes - among several basic blocks that share a common locus, allowing for - more accurate sample-based profiling. */ - int discriminator; }; /* This ensures that struct gimple_bb_info is smaller than Index: gcc/gimple-pretty-print.c =================================================================== --- gcc/gimple-pretty-print.c (revision 199127) +++ gcc/gimple-pretty-print.c (working copy) @@ -1859,7 +1859,9 @@ pp_gimple_stmt_1 (pretty_printer *buffer, gimple g if ((flags & TDF_LINENO) && gimple_has_location (gs)) { - expanded_location xloc = expand_location (gimple_location (gs)); + location_t loc = gimple_location (gs); + expanded_location xloc = expand_location (loc); + int discriminator = get_discriminator_from_locus (loc); pp_character (buffer, '['); if (xloc.file) { @@ -1869,6 +1871,11 @@ pp_gimple_stmt_1 (pretty_printer *buffer, gimple g pp_decimal_int (buffer, xloc.line); pp_string (buffer, ":"); pp_decimal_int (buffer, xloc.column); + if (discriminator) + { + pp_string (buffer, " discrim "); + pp_decimal_int (buffer, discriminator); + } pp_string (buffer, "] "); } @@ -2079,8 +2086,6 @@ dump_gimple_bb_header (FILE *outf, basic_block bb, indent, "", get_lineno (gsi_stmt (gsi))); break; } - if (bb->discriminator) - fprintf (outf, ", discriminator %i", bb->discriminator); fputc ('\n', outf); } } Index: gcc/builtins.c =================================================================== --- gcc/builtins.c (revision 199127) +++ gcc/builtins.c (working copy) @@ -48,6 +48,7 @@ along with GCC; see the file COPYING3. If not see #include "value-prof.h" #include "diagnostic-core.h" #include "builtins.h" +#include "input.h" #ifndef PAD_VARARGS_DOWN @@ -12107,13 +12108,16 @@ fold_builtin_next_arg (tree exp, bool va_start_p) tree fntype = TREE_TYPE (current_function_decl); int nargs = call_expr_nargs (exp); tree arg; + location_t loc = LOCATION_LOCUS (input_location); + if (has_discriminator (loc)) + loc = map_discriminator_location (loc); + /* There is good chance the current input_location points inside the definition of the va_start macro (perhaps on the token for builtin) in a system header, so warnings will not be emitted. Use the location in real source code. */ source_location current_location = - linemap_unwind_to_first_non_reserved_loc (line_table, input_location, - NULL); + linemap_unwind_to_first_non_reserved_loc (line_table, loc, NULL); if (!stdarg_p (fntype)) { Index: gcc/cfghooks.c =================================================================== --- gcc/cfghooks.c (revision 199127) +++ gcc/cfghooks.c (working copy) @@ -483,7 +483,6 @@ split_block (basic_block bb, void *i) new_bb->count = bb->count; new_bb->frequency = bb->frequency; - new_bb->discriminator = bb->discriminator; if (dom_info_available_p (CDI_DOMINATORS)) { Index: gcc/diagnostic.c =================================================================== --- gcc/diagnostic.c (revision 199127) +++ gcc/diagnostic.c (working copy) @@ -185,6 +185,7 @@ diagnostic_set_info_translated (diagnostic_info *d va_list *args, location_t location, diagnostic_t kind) { + location = map_discriminator_location (location); diagnostic->message.err_no = errno; diagnostic->message.args_ptr = args; diagnostic->message.format_spec = msg; @@ -477,6 +478,9 @@ diagnostic_report_current_module (diagnostic_conte if (where <= BUILTINS_LOCATION) return; + if (has_discriminator (where)) + where = map_discriminator_location (where); + linemap_resolve_location (line_table, where, LRK_MACRO_DEFINITION_LOCATION, &map); Index: gcc/rtl.h =================================================================== --- gcc/rtl.h (revision 199127) +++ gcc/rtl.h (working copy) @@ -1916,6 +1916,7 @@ extern rtx prev_cc0_setter (rtx); extern int insn_line (const_rtx); extern const char * insn_file (const_rtx); extern tree insn_scope (const_rtx); +extern int insn_discriminator (const_rtx); extern location_t prologue_location, epilogue_location; /* In jump.c */ Index: gcc/print-rtl.c =================================================================== --- gcc/print-rtl.c (revision 199127) +++ gcc/print-rtl.c (working copy) @@ -398,7 +398,13 @@ print_rtx (const_rtx in_rtx) redundant with line number information and do not print anything when there is no location information available. */ if (INSN_LOCATION (in_rtx) && insn_file (in_rtx)) - fprintf(outfile, " %s:%i", insn_file (in_rtx), insn_line (in_rtx)); + { + int discriminator = insn_discriminator (in_rtx); + fprintf (outfile, " %s:%i", insn_file (in_rtx), + insn_line (in_rtx)); + if (discriminator) + fprintf (outfile, " discrim %d", discriminator); + } #endif } else if (i == 6 && GET_CODE (in_rtx) == ASM_OPERANDS) Index: gcc/tree-pretty-print.c =================================================================== --- gcc/tree-pretty-print.c (revision 199127) +++ gcc/tree-pretty-print.c (working copy) @@ -467,6 +467,7 @@ static void dump_location (pretty_printer *buffer, location_t loc) { expanded_location xloc = expand_location (loc); + int discriminator = get_discriminator_from_locus (loc); pp_character (buffer, '['); if (xloc.file) @@ -475,6 +476,11 @@ dump_location (pretty_printer *buffer, location_t pp_string (buffer, " : "); } pp_decimal_int (buffer, xloc.line); + if (discriminator) + { + pp_string (buffer, " discrim "); + pp_decimal_int (buffer, discriminator); + } pp_string (buffer, "] "); } Index: gcc/tree-diagnostic.c =================================================================== --- gcc/tree-diagnostic.c (revision 199127) +++ gcc/tree-diagnostic.c (working copy) @@ -22,6 +22,7 @@ along with GCC; see the file COPYING3. If not see #include "config.h" #include "system.h" #include "coretypes.h" +#include "input.h" #include "tree.h" #include "diagnostic.h" #include "tree-pretty-print.h" @@ -107,6 +108,8 @@ maybe_unwind_expanded_macro_loc (diagnostic_contex unsigned ix; loc_map_pair loc, *iter; + if (has_discriminator (where)) + where = map_discriminator_location (where); map = linemap_lookup (line_table, where); if (!linemap_macro_expansion_map_p (map)) return; Index: gcc/tree-ssa.c =================================================================== --- gcc/tree-ssa.c (revision 199127) +++ gcc/tree-ssa.c (working copy) @@ -28,6 +28,7 @@ along with GCC; see the file COPYING3. If not see #include "ggc.h" #include "langhooks.h" #include "basic-block.h" +#include "input.h" #include "function.h" #include "gimple-pretty-print.h" #include "bitmap.h" @@ -1610,6 +1611,8 @@ warn_uninit (enum opt_code wc, tree t, location = (context != NULL && gimple_has_location (context)) ? gimple_location (context) : DECL_SOURCE_LOCATION (var); + if (has_discriminator (location)) + location = map_discriminator_location (location); location = linemap_resolve_location (line_table, location, LRK_SPELLING_LOCATION, NULL); Index: gcc/tree-cfg.c =================================================================== --- gcc/tree-cfg.c (revision 199127) +++ gcc/tree-cfg.c (working copy) @@ -26,6 +26,7 @@ along with GCC; see the file COPYING3. If not see #include "tm_p.h" #include "basic-block.h" #include "flags.h" +#include "input.h" #include "function.h" #include "ggc.h" #include "gimple-pretty-print.h" @@ -734,8 +735,8 @@ same_line_p (location_t locus1, location_t locus2) if (locus1 == locus2) return true; - from = expand_location (locus1); - to = expand_location (locus2); + from = expand_location_to_spelling_point (locus1); + to = expand_location_to_spelling_point (locus2); if (from.line != to.line) return false; @@ -746,22 +747,64 @@ same_line_p (location_t locus1, location_t locus2) && filename_cmp (from.file, to.file) == 0); } -/* Assign a unique discriminator value to block BB if it begins at the same - LOCUS as its predecessor block. */ +/* Assign a unique discriminator value to instructions in block BB that + have the same LOCUS as its predecessor block. */ static void assign_discriminator (location_t locus, basic_block bb) { gimple first_in_to_bb, last_in_to_bb; + int discriminator = 0; + tree block = LOCATION_BLOCK (locus); + locus = LOCATION_LOCUS (locus); - if (locus == 0 || bb->discriminator != 0) + if (locus == UNKNOWN_LOCATION) return; + if (has_discriminator (locus)) + locus = map_discriminator_location (locus); + + /* Check the locus of the first (non-label) instruction in the block. */ first_in_to_bb = first_non_label_stmt (bb); - last_in_to_bb = last_stmt (bb); - if ((first_in_to_bb && same_line_p (locus, gimple_location (first_in_to_bb))) - || (last_in_to_bb && same_line_p (locus, gimple_location (last_in_to_bb)))) - bb->discriminator = next_discriminator_for_locus (locus); + if (first_in_to_bb) + { + location_t first_locus = gimple_location (first_in_to_bb); + if (! has_discriminator (first_locus) + && (same_line_p (locus, first_locus))) + discriminator = next_discriminator_for_locus (locus); + } + + /* If the first instruction doesn't trigger a discriminator, check the + last instruction of the block. This catches the case where the + increment portion of a for loop is placed at the end of the loop + body. */ + if (discriminator == 0) + { + last_in_to_bb = last_stmt (bb); + if (last_in_to_bb) + { + location_t last_locus = gimple_location (last_in_to_bb); + if (! has_discriminator (last_locus) + && same_line_p (locus, last_locus)) + discriminator = next_discriminator_for_locus (locus); + } + } + + if (discriminator != 0) + { + location_t new_locus = location_with_discriminator (locus, discriminator); + gimple_stmt_iterator gsi; + + if (block != NULL) + new_locus = COMBINE_LOCATION_DATA (line_table, new_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, new_locus); + } + } } /* Create the edges for a GIMPLE_COND starting at block BB. */ Index: gcc/Makefile.in =================================================================== --- gcc/Makefile.in (revision 199127) +++ gcc/Makefile.in (working copy) @@ -1464,7 +1464,7 @@ OBJS = \ # Objects in libcommon.a, potentially used by all host binaries and with # no target dependencies. -OBJS-libcommon = diagnostic.o pretty-print.o intl.o input.o version.o +OBJS-libcommon = diagnostic.o pretty-print.o intl.o input.o version.o vec.o # Objects in libcommon-target.a, used by drivers and by the core # compiler and containing target-dependent code.