Attached patch passes regression tests and benchmark test. OK for google-4_9?
Thanks, Dehao On Tue, May 13, 2014 at 10:43 AM, Dehao Chen <de...@google.com> wrote: > As discussed offline, this is actually due to missing parts of the > previous patch (some changes does not appear in the change log of > r199154). I've updated the patch to include those missing pieces. > Testing on going. > > Dehao > > On Tue, May 13, 2014 at 10:04 AM, Cary Coutant <ccout...@google.com> wrote: >>> The problem is that linemap_location_from_macro_expansion_p will >>> always return true if locus has discriminator. And in linemap_lookup, >>> this will lead to call linemap_macro_map_lookup, in which there is an >>> assertion: >>> >>> linemap_assert (line >= LINEMAPS_MACRO_LOWEST_LOCATION (set)); >>> >>> However, line is actually not a macro location. >> >> That sounds like we're leaking a discriminator location into the >> linemap code. Before you can call >> linemap_location_from_macro_expansion_p, you need to do this (as in >> expand_location_1): >> >> /* 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); >> >> -cary
Index: gcc/diagnostic.c =================================================================== --- gcc/diagnostic.c (revision 210386) +++ gcc/diagnostic.c (working copy) @@ -188,6 +188,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; @@ -514,6 +515,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/tree-ssa-uninit.c =================================================================== --- gcc/tree-ssa-uninit.c (revision 210386) +++ gcc/tree-ssa-uninit.c (working copy) @@ -149,6 +149,7 @@ warn_uninit (enum opt_code wc, tree t, location = (context != NULL && gimple_has_location (context)) ? gimple_location (context) : DECL_SOURCE_LOCATION (var); + location = map_discriminator_location (location); location = linemap_resolve_location (line_table, location, LRK_SPELLING_LOCATION, NULL); Index: gcc/tree-diagnostic.c =================================================================== --- gcc/tree-diagnostic.c (revision 210386) +++ gcc/tree-diagnostic.c (working copy) @@ -108,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/builtins.c =================================================================== --- gcc/builtins.c (revision 210386) +++ gcc/builtins.c (working copy) @@ -59,6 +59,7 @@ along with GCC; see the file COPYING3. If not see #include "builtins.h" #include "ubsan.h" #include "cilk.h" +#include "input.h" static tree do_mpc_arg1 (tree, tree, int (*)(mpc_ptr, mpc_srcptr, mpc_rnd_t)); @@ -12064,13 +12065,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)) {