http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54828



             Bug #: 54828

           Summary: [4.7 Regression] ICE in based_loc_descr at

                    dwarf2out.c:10560 with -g -O0

    Classification: Unclassified

           Product: gcc

           Version: 4.7.2

            Status: UNCONFIRMED

          Severity: normal

          Priority: P3

         Component: c++

        AssignedTo: unassig...@gcc.gnu.org

        ReportedBy: j...@freebsd.org





Created attachment 28367

  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=28367

Test case



> g++47 -v --save-temps -c TestFault.cc -g

Using built-in specs.

COLLECT_GCC=g++47

Target: x86_64-portbld-freebsd8.2

Configured with: ./../gcc-4.7-20120818/configure --disable-nls

--enable-languages=c,c++,objc,fortran --libdir=/usr/local/lib/gcc47

--libexecdir=/usr/local/libexec/gcc47 --program-suffix=47

--with-as=/usr/local/bin/as --with-gmp=/usr/local

--with-gxx-include-dir=/usr/local/lib/gcc47/include/c++/

--with-ld=/usr/local/bin/ld --with-libiconv-prefix=/usr/local

--with-pkgversion='FreeBSD Ports Collection' --with-system-zlib

--enable-languages=c,c++,objc,fortran,java --prefix=/usr/local

--mandir=/usr/local/man --infodir=/usr/local/info/gcc47

--build=x86_64-portbld-freebsd8.2

Thread model: posix

gcc version 4.7.2 20120818 (prerelease) (FreeBSD Ports Collection) 

COLLECT_GCC_OPTIONS='-v' '-save-temps' '-c' '-g' '-shared-libgcc'

'-mtune=generic' '-march=x86-64'

 /usr/local/libexec/gcc47/gcc/x86_64-portbld-freebsd8.2/4.7.2/cc1plus -E -quiet

-v TestFault.cc -mtune=generic -march=x86-64 -g -fworking-directory

-fpch-preprocess -o TestFault.ii

ignoring nonexistent directory

"/usr/local/lib/gcc47/gcc/x86_64-portbld-freebsd8.2/4.7.2/../../../../../x86_64-portbld-freebsd8.2/include"

#include "..." search starts here:

#include <...> search starts here:

 /usr/local/lib/gcc47/include/c++/

 /usr/local/lib/gcc47/include/c++//x86_64-portbld-freebsd8.2

 /usr/local/lib/gcc47/include/c++//backward

 /usr/local/lib/gcc47/gcc/x86_64-portbld-freebsd8.2/4.7.2/include

 /usr/local/include

 /usr/local/lib/gcc47/gcc/x86_64-portbld-freebsd8.2/4.7.2/include-fixed

 /usr/include

End of search list.

COLLECT_GCC_OPTIONS='-v' '-save-temps' '-c' '-g' '-shared-libgcc'

'-mtune=generic' '-march=x86-64'

 /usr/local/libexec/gcc47/gcc/x86_64-portbld-freebsd8.2/4.7.2/cc1plus

-fpreprocessed TestFault.ii -quiet -dumpbase TestFault.cc -mtune=generic

-march=x86-64 -auxbase TestFault -g -version -o TestFault.s

GNU C++ (FreeBSD Ports Collection) version 4.7.2 20120818 (prerelease)

(x86_64-portbld-freebsd8.2)

        compiled by GNU C version 4.7.2 20120818 (prerelease), GMP version

5.0.1, MPFR version 3.0.0, MPC version 0.8.2

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072

GNU C++ (FreeBSD Ports Collection) version 4.7.2 20120818 (prerelease)

(x86_64-portbld-freebsd8.2)

        compiled by GNU C version 4.7.2 20120818 (prerelease), GMP version

5.0.1, MPFR version 3.0.0, MPC version 0.8.2

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072

Compiler executable checksum: bd38cbf26a83e7a65b138cf0b63e68eb

TestFault.cc: In constructor 'Foo::Foo()':

TestFault.cc:12:1: internal compiler error: Segmentation fault: 11

Please submit a full bug report,

with preprocessed source if appropriate.

See <http://gcc.gnu.org/bugs.html> for instructions.



Test case is attached.  4.7.2 release also segfaults in the same way. 

4.5.3.20110203 and 4.6.2.20110909 do not.



Enabling optimization prevents the crash.  The stack trace is below.  The

'cfun' global variable is NULL when the fault occurs.  It is set to NULL in

dwarf2out_abstract_function() via push_cfun() because

DECL_STRUCT_FUNCTION(decl) is NULL (verified by running cc1plus under gdb).



I am using the following hackish patch as a temporary workaround:



--- gcc/dwarf2out.c.orig        2012-10-05 13:11:57.000000000 -0400

+++ gcc/dwarf2out.c     2012-10-05 13:27:32.000000000 -0400

@@ -17046,6 +17046,10 @@

     /* We've already generated the abstract instance.  */

     return;



+  /* XXX: Workaround that probably isn't correct. */

+  if (DECL_STRUCT_FUNCTION(decl) == NULL)

+    return;

+

   /* We can be called while recursively when seeing block defining inlined

subroutine

      DIE.  Be sure to not clobber the outer location table nor use it or we

would

      get locations in abstract instantces.  */



GDB info:



Program terminated with signal 6, Aborted.

#0  0x0000000801c8e52c in kill () from /lib/libc.so.7

(gdb) where

#0  0x0000000801c8e52c in kill () from /lib/libc.so.7

#1  0x0000000801c8d32b in abort () from /lib/libc.so.7

#2  0x0000000000c92d45 in real_abort () at

.././../gcc-4.7-20120818/gcc/diagnostic.c:909

#3  diagnostic_action_after_output (context=context@entry=0x13c3c80,

diagnostic=<error reading variable: Unhandled dwarf expression opcode 0xfa>)

    at .././../gcc-4.7-20120818/gcc/diagnostic.c:216

#4  0x0000000000c92efe in diagnostic_report_diagnostic (context=0x13c3c80,

diagnostic=diagnostic@entry=0x7fffffffc920) at

.././../gcc-4.7-20120818/gcc/diagnostic.c:552

#5  0x0000000000c93bf0 in internal_error (gmsgid=<optimized out>) at

.././../gcc-4.7-20120818/gcc/diagnostic.c:845

#6  0x00000000008476e0 in crash_signal (signo=11) at

.././../gcc-4.7-20120818/gcc/toplev.c:346

#7  <signal handler called>

#8  based_loc_descr (reg=reg@entry=0x8020014a0, offset=-16,

initialized=VAR_INIT_STATUS_INITIALIZED) at

.././../gcc-4.7-20120818/gcc/dwarf2out.c:10560

#9  0x00000000006963bf in mem_loc_descriptor (rtl=0x80f00d4f8, mode=DImode,

mem_mode=mem_mode@entry=DImode,

initialized=initialized@entry=VAR_INIT_STATUS_INITIALIZED)

    at .././../gcc-4.7-20120818/gcc/dwarf2out.c:11948

#10 0x000000000069b6d1 in loc_descriptor (rtl=rtl@entry=0x80eec50f0,

mode=mode@entry=VOIDmode,

initialized=initialized@entry=VAR_INIT_STATUS_INITIALIZED)

    at .././../gcc-4.7-20120818/gcc/dwarf2out.c:12605

#11 0x000000000069a9d3 in loc_list_from_tree (loc=loc@entry=0x80e0f9280,

want_address=want_address@entry=2) at

.././../gcc-4.7-20120818/gcc/dwarf2out.c:13592

#12 0x000000000069ab5f in add_bound_info

(subrange_die=subrange_die@entry=0x80f0189b0,

bound_attr=bound_attr@entry=DW_AT_upper_bound, bound=bound@entry=0x80e0f9280)

    at .././../gcc-4.7-20120818/gcc/dwarf2out.c:15656

#13 0x000000000069eadc in add_subscript_info (collapse_p=<optimized out>,

type=<optimized out>, type_die=<optimized out>) at

.././../gcc-4.7-20120818/gcc/dwarf2out.c:15745

#14 gen_array_type_die (type=0x80b493a80, context_die=0x80f0188c0) at

.././../gcc-4.7-20120818/gcc/dwarf2out.c:16460

#15 0x000000000068cf05 in gen_type_die_with_usage (type=0x80b493a80,

context_die=context_die@entry=0x80f0188c0,

usage=usage@entry=DINFO_USAGE_DIR_USE)

    at .././../gcc-4.7-20120818/gcc/dwarf2out.c:19057

#16 0x000000000068d28a in gen_type_die (type=<optimized out>,

context_die=context_die@entry=0x80f0188c0) at

.././../gcc-4.7-20120818/gcc/dwarf2out.c:19103

#17 0x000000000069196a in gen_decl_die (decl=0x80b489e60, origin=0x0,

context_die=0x80f0188c0) at .././../gcc-4.7-20120818/gcc/dwarf2out.c:19647

#18 0x000000000068eee5 in decls_for_scope (stmt=stmt@entry=0x80b745460,

context_die=context_die@entry=0x80f0188c0, depth=depth@entry=2)

    at .././../gcc-4.7-20120818/gcc/dwarf2out.c:19237

#19 0x000000000069f0f2 in gen_lexical_block_die (depth=2,

context_die=<optimized out>, stmt=0x80b745460) at

.././../gcc-4.7-20120818/gcc/dwarf2out.c:18222

#20 gen_block_die (stmt=stmt@entry=0x80b745460,

context_die=context_die@entry=0x80f018730, depth=depth@entry=2) at

.././../gcc-4.7-20120818/gcc/dwarf2out.c:19187

#21 0x000000000068ef4e in decls_for_scope (stmt=stmt@entry=0x80b7454b0,

context_die=context_die@entry=0x80f018730, depth=depth@entry=1)

    at .././../gcc-4.7-20120818/gcc/dwarf2out.c:19251

#22 0x000000000069f0f2 in gen_lexical_block_die (depth=1,

context_die=<optimized out>, stmt=0x80b7454b0) at

.././../gcc-4.7-20120818/gcc/dwarf2out.c:18222

#23 gen_block_die (stmt=stmt@entry=0x80b7454b0,

context_die=context_die@entry=0x80f0185f0, depth=depth@entry=1) at

.././../gcc-4.7-20120818/gcc/dwarf2out.c:19187
#24 0x000000000068ef4e in decls_for_scope (stmt=stmt@entry=0x80b745500,

context_die=context_die@entry=0x80f0185f0, depth=depth@entry=0)

    at .././../gcc-4.7-20120818/gcc/dwarf2out.c:19251

#25 0x000000000068f434 in gen_subprogram_die (decl=decl@entry=0x808ea6800,

context_die=context_die@entry=0x80202e000) at

.././../gcc-4.7-20120818/gcc/dwarf2out.c:17666

#26 0x0000000000691bda in gen_decl_die (decl=decl@entry=0x808ea6800,

origin=<optimized out>, origin@entry=0x0, context_die=0x80202e000)

    at .././../gcc-4.7-20120818/gcc/dwarf2out.c:19601

#27 0x000000000068be5b in dwarf2out_decl (decl=decl@entry=0x808ea6800) at

.././../gcc-4.7-20120818/gcc/dwarf2out.c:19977

#28 0x000000000068c0ec in dwarf2out_abstract_function (decl=0x808ea6800) at

.././../gcc-4.7-20120818/gcc/dwarf2out.c:17080

#29 0x0000000000691e1b in gen_decl_die (decl=0x808f73c00,

origin=origin@entry=0x0, context_die=0x80202e000) at

.././../gcc-4.7-20120818/gcc/dwarf2out.c:19558

#30 0x000000000068be5b in dwarf2out_decl (decl=<optimized out>) at

.././../gcc-4.7-20120818/gcc/dwarf2out.c:19977

#31 0x00000000006a1e39 in dwarf2out_function_decl (decl=<optimized out>) at

.././../gcc-4.7-20120818/gcc/dwarf2out.c:19985

#32 0x00000000006d6c3d in rest_of_handle_final () at

.././../gcc-4.7-20120818/gcc/final.c:4350

#33 0x00000000007b8638 in execute_one_pass (pass=pass@entry=0x1258fa0) at

.././../gcc-4.7-20120818/gcc/passes.c:2084

#34 0x00000000007b8981 in execute_pass_list (pass=0x1258fa0) at

.././../gcc-4.7-20120818/gcc/passes.c:2139

#35 0x00000000007b8993 in execute_pass_list (pass=0x1259d40) at

.././../gcc-4.7-20120818/gcc/passes.c:2140

#36 0x00000000007b8993 in execute_pass_list (pass=0x1259da0) at

.././../gcc-4.7-20120818/gcc/passes.c:2140

#37 0x000000000088e609 in tree_rest_of_compilation (fndecl=0x808f73c00) at

.././../gcc-4.7-20120818/gcc/tree-optimize.c:422

#38 0x000000000064764a in cgraph_expand_function (node=0x80b74e480) at

.././../gcc-4.7-20120818/gcc/cgraphunit.c:1837

#39 0x0000000000649022 in cgraph_output_in_order () at

.././../gcc-4.7-20120818/gcc/cgraphunit.c:2002

#40 cgraph_optimize () at .././../gcc-4.7-20120818/gcc/cgraphunit.c:2213

#41 0x00000000006492aa in cgraph_finalize_compilation_unit () at

.././../gcc-4.7-20120818/gcc/cgraphunit.c:1344

#42 0x000000000052b0cb in cp_write_global_declarations () at

.././../gcc-4.7-20120818/gcc/cp/decl2.c:4057

#43 0x0000000000849257 in compile_file () at

.././../gcc-4.7-20120818/gcc/toplev.c:573

#44 do_compile () at .././../gcc-4.7-20120818/gcc/toplev.c:1938

#45 toplev_main (argc=44, argv=0x7fffffffda10) at

.././../gcc-4.7-20120818/gcc/toplev.c:2014

#46 0x00000000004cde4e in _start ()

(gdb) frame 8

#8  based_loc_descr (reg=reg@entry=0x8020014a0, offset=-16,

initialized=VAR_INIT_STATUS_INITIALIZED) at

.././../gcc-4.7-20120818/gcc/dwarf2out.c:10560

10560     dw_fde_ref fde = cfun->fde;

(gdb) p cfun

$1 = (function *) 0x0

(gdb) frame 28

#28 0x000000000068c0ec in dwarf2out_abstract_function (decl=0x808ea6800) at

.././../gcc-4.7-20120818/gcc/dwarf2out.c:17080

17080     dwarf2out_decl (decl);

(gdb) p decl->function_decl.f

$3 = (function *) 0x0

(gdb) l

17075     current_function_decl = decl;

17076     push_cfun (DECL_STRUCT_FUNCTION (decl));

17077

17078     was_abstract = DECL_ABSTRACT (decl);

17079     set_decl_abstract_flags (decl, 1);

17080     dwarf2out_decl (decl);

17081     if (! was_abstract)

17082       set_decl_abstract_flags (decl, 0);

17083

17084     current_function_decl = save_fn;

Reply via email to