[Bug other/71101] New: ICE in libcpp/line-map.c:linemap_macro_map_lookup very early in offloading compilation lto1 front end

tschwinge at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri May 13 12:06:00 GMT 2016


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71101

            Bug ID: 71101
           Summary: ICE in libcpp/line-map.c:linemap_macro_map_lookup very
                    early in offloading compilation lto1 front end
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Keywords: openacc, openmp
          Severity: minor
          Priority: P3
         Component: other
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tschwinge at gcc dot gnu.org
                CC: dmalcolm at gcc dot gnu.org
  Target Milestone: ---

I'm running into an ICE in libcpp/line-map code, when in GDB doing a "call
debug_tree(decl)", very early in a lto1 front end that is reading in an
offloading compilation stream.  That setting will be a bit difficult to
reproduce, but perhaps the following information gives enough clues already? 
(Putting David in CC as he's done a lot of line-map changes recently -- but I'm
not claiming that any of his changes are actually related to this.)

Is it maybe just "too early" to call debug_tree in that situation, or should
that be handled in some way or another?

    Breakpoint 2, lto_register_function_decl_in_symtab
(data_in=data_in@entry=0x15832b0, decl=0x7ffff6989d20, ix=ix@entry=175) at
[...]/source-gcc/gcc/lto/lto.c:871
    871     {

Here I manually call:

    (gdb) call debug_tree(decl)                    
     <function_decl 0x7ffff6989d20 main._omp_fn.0
        type <function_type 0x7ffff695dd20
            type <void_type 0x7ffff68dd000 void VOID
                align 8 symtab 0 alias set -1 structural equality
                pointer_to_this <pointer_type 0x7ffff68dd150>>
            QI
            size <integer_cst 0x7ffff68cd468 constant 8>
            unit size <integer_cst 0x7ffff68cd480 constant 1>
            align 8 symtab 0 alias set -1 structural equality
            arg-types <tree_list 0x7ffff6986de8 value <pointer_type
0x7ffff68dd150>
                chain <tree_list 0x7ffff68d0a50 value <void_type 0x7ffff68dd000
void>>>>
        addressable nothrow staticlto1: internal compiler error: in
linemap_macro_map_lookup, at libcpp/line-map.c:984

(Notice the ICE message starting after "addressable nothrow static".)  That's
the following linemap_assert:

    /* Given a source location yielded by a macro map, returns that map.
       Since the set is built chronologically, the logical lines are
       monotonic decreasing, and so the list is sorted and we can use a
       binary search.  */

    static const line_map_macro *
    linemap_macro_map_lookup (struct line_maps *set, source_location line)
    {
      unsigned int md, mn, mx;
      const struct line_map_macro *cached, *result;

      if (IS_ADHOC_LOC (line))
        line = set->location_adhoc_data_map.data[line &
MAX_SOURCE_LOCATION].locus;

      linemap_assert (line >= LINEMAPS_MACRO_LOWEST_LOCATION (set));

Rebuilding that part with "-O0", I see the following backtrace:

    #1  0x0000000000fd4373 in linemap_macro_map_lookup
(set=set@entry=0x7ffff7ff5000, line=line@entry=2) at
[...]/source-gcc/libcpp/line-map.c:986
    #2  0x0000000000fd5131 in linemap_lookup (set=set@entry=0x7ffff7ff5000,
line=line@entry=2) at [...]/source-gcc/libcpp/line-map.c:920
    #3  0x0000000000fd62c4 in linemap_location_in_system_header_p
(set=0x7ffff7ff5000, location=2) at [...]/source-gcc/libcpp/line-map.c:1191
    #4  0x00000000009a2202 in print_node (file=0x7ffff6e91640
<_IO_2_1_stderr_>, prefix=prefix@entry=0x1105de0 "",
node=node@entry=0x7ffff6989d20, indent=indent@entry=0) at
[...]/source-gcc/gcc/print-tree.c:373
    #5  0x00000000009a6380 in debug_tree (node=0x7ffff6989d20) at
[...]/source-gcc/gcc/print-tree.c:976
    #6  <function called from gdb>
    [...]
    (gdb) frame 1
    #1  0x0000000000fd4373 in linemap_macro_map_lookup
(set=set@entry=0x7ffff7ff5000, line=line@entry=2) at
[...]/source-gcc/libcpp/line-map.c:986
    986       linemap_assert (line >= LINEMAPS_MACRO_LOWEST_LOCATION (set));
    (gdb) print line
    $1 = 2
    (gdb) print set
    $2 = (line_maps *) 0x7ffff7ff5000
    (gdb) print *set
    $3 = {info_ordinary = {maps = 0x0, allocated = 0, used = 0, cache = 0},
info_macro = {maps = 0x0, allocated = 0, used = 0, cache = 0}, depth = 0,
trace_includes = false, highest_location = 1, highest_line = 1, max_column_hint
= 0, reallocator = 0xa403b0 <realloc_for_line_map(void*, size_t)>,
round_alloc_size = 0x5a9b10 <ggc_round_alloc_size(unsigned long)>,
location_adhoc_data_map = {htab = 0x157e550, curr_loc = 0, allocated = 0, data
= 0x0}, builtin_location = 1, seen_line_directive = false, default_range_bits =
5, num_optimized_ranges = 0, num_unoptimized_ranges = 0}
    (gdb) call line_table_dump(0,set,-1,-1)
    # of ordinary maps:  0
    # of macro maps:     0
    Include stack depth: 0
    Highest location:    1

    Ordinary line maps


    Macro line maps


If that helps any: running through this again, I see "line" is not considered
"IS_ADHOC_LOC":

    (gdb) list
    974        monotonic decreasing, and so the list is sorted and we can use a
    975        binary search.  */
    976
    977     static const line_map_macro *
    978     linemap_macro_map_lookup (struct line_maps *set, source_location
line)
    979     {
    980       unsigned int md, mn, mx;
    981       const struct line_map_macro *cached, *result;
    982
    983       if (IS_ADHOC_LOC (line))
    (gdb) n
    983       if (IS_ADHOC_LOC (line))
    (gdb) s
    IS_ADHOC_LOC (loc=loc@entry=2) at
[...]/source-gcc/gcc/../libcpp/include/line-map.h:975
    975     {
    (gdb) print loc
    $4 = 2
    (gdb) s
    976       return (loc & MAX_SOURCE_LOCATION) != loc;
    (gdb) finish
    Run till exit from #0  IS_ADHOC_LOC (loc=loc@entry=2) at
[...]/source-gcc/gcc/../libcpp/include/line-map.h:976
    0x0000000000fd4318 in linemap_macro_map_lookup
(set=set@entry=0x7ffff7ff5000, line=line@entry=2) at
[...]/source-gcc/libcpp/line-map.c:983
    983       if (IS_ADHOC_LOC (line))
    Value returned is $5 = false
    (gdb) s
    986       linemap_assert (line >= LINEMAPS_MACRO_LOWEST_LOCATION (set));
    (gdb) s
    LINEMAPS_MACRO_LOWEST_LOCATION (set=set@entry=0x7ffff7ff5000) at
[...]/source-gcc/libcpp/include/line-map.h:947
    947     {
    (gdb) list
    942
    943     /* Returns the lowest location [of a token resulting from macro
    944        expansion] encoded in this line table.  */
    945     inline source_location
    946     LINEMAPS_MACRO_LOWEST_LOCATION (const line_maps *set)
    947     {
    948       return LINEMAPS_MACRO_USED (set)
    949              ? MAP_START_LOCATION (LINEMAPS_LAST_MACRO_MAP (set))
    950              : MAX_SOURCE_LOCATION;
    951     }
    (gdb) finish
    Run till exit from #0  LINEMAPS_MACRO_LOWEST_LOCATION
(set=set@entry=0x7ffff7ff5000) at
[...]/source-gcc/libcpp/include/line-map.h:947
    0x0000000000fd4354 in linemap_macro_map_lookup
(set=set@entry=0x7ffff7ff5000, line=line@entry=2) at
[...]/source-gcc/libcpp/line-map.c:986
    986       linemap_assert (line >= LINEMAPS_MACRO_LOWEST_LOCATION (set));
    Value returned is $6 = 2147483647
    (gdb) s

    Breakpoint 1, fancy_abort (
    [...]

And, here is the original source code; the "function_decl 0x7ffff6989d20
main._omp_fn.0" is an outlined function corresponding to the offloaded code
(the structured block/statement after the "#pragma acc parallel"):

    #include <math.h>

    int main(int argc, char *argv[])
    {
      double t1, t2;

      t1 = 7.07 * argc;
    #pragma acc parallel copyout(t2)
      t2 = sin(t1) * cos(t1) + sqrt(-2.0 * logf(t1) / t1);

      return t2 < 0;
    }


More information about the Gcc-bugs mailing list