I am seeing a regression in debug info with this patch: Fri Sep 5 07:35:16 CEST 2003 Jan Hubicka <jh@suse.cz> * opts.c (decode_options): Enable unit-at-a-time at -O2. * params.def (max-inline-insns-single): Set to 500 (max-inline-insns-auto): Set to 150 * invoke.texi (max-inline-insns-single, max-inline-insns-auto): Update. I have a sample program which I compile with "gcc -gstabs+ -O2 -S". The sample program and the assembly output are attached. The problem happens at the end of main: .LM31: ret .size main, .-main .stabs "factorial:F(0,3)",36,0,93,factorial .Lscope7: .stabs "",36,0,0,.Lscope7-main .text .stabs "",100,0,0,.Letext .Letext: .section .note.GNU-stack,"",@progbits .ident "GCC: (GNU) 3.4 20030905 (experimental)" The bad line is the stab for "factorial:F(0,3)" which occurs in the terminal portion of main, between ".size main, .-main" and "stabs "",36,0,0,.Lscope7-main". This messes up the gdb block table for "main", causing a regression in the gdb test script gdb.base/break.exp. In the source file, main comes first, but in the object file, factorial is emitted first. It looks like a scrap of "factorial" was left behind when it was rearranged to be omitted before "main".
Created attachment 4746 [details] Source file Source file which tickles the bug. Compile with: gcc -gstabs+ -O2 -S.
Created attachment 4747 [details] assembly file, good Assembly file with gcc HEAD 2003-09-05 05:00:00 UTC. This file is okay.
Created attachment 4748 [details] assembly file, bad Assembly file with gcc HEAD 2003-09-05 06:00:00 UTC. This file has a bad .stab for "factorial" at the end of main (line 505 of 512).
Created attachment 4749 [details] Source file, smaller example This is a smaller source file with pre-processor gunk stripped out. This is a minimal file that I could find.
Jan, this is your field. The listed patch is certainly not the one that created the problem, as it only enables unit-at-a-time with -O2. Michael, can you try to find out which patch introduced the problem when you go further back and explicitly compile with -funit-at-a-time? W.
Created attachment 4750 [details] assembly file, smaller example, bad Here is the assembly code with gcc HEAD 2003-09-05 06:00:00 UTC. The bad line is line 319 of 326. It's a stab for "factorial" which is in the middle of the epilog for main!
Subject: Re: [3.4 regression] function-at-a-time generates stabs in bad order I agree it would be useful to date-search this with explicit -funit-at-a-time, but I won't have time to do this for several days (maybe a week). Michael C
Might be fixed by <http://gcc.gnu.org/ml/gcc-patches/2003-09/msg01167.html>.
It was fixed by that patch.
This bug still happens with gcc HEAD 2003-11-29 16:28:31 UTC. Here's an excerpt from a recent z0.s, the result of "gcc -gstabs+ -O2 -S z0.c" with gcc HEAD 2003-11-29 16:28:31 UTC. (Other info: binutils 2.14, native i686-pc-linux-gnu, red hat 8.0). .LM15: leave xorl %eax, %eax ret .size main, .-main .stabs "factorial:F(0,1)",36,0,13,factorial .Lscope1: .stabs "",36,0,0,.Lscope1-main .text .stabs "",100,0,0,.Letext .Letext: .section .note.GNU-stack,"",@progbits .ident "GCC: (GNU) 3.4 20031129 (experimental)" The ".stabs" for factorial still appears at the end of "main", right after ".size main, .-main" Also, if you look at gcc/ChangeLog, only half of msg01167.html was committed to gcc HEAD.
I executed Wolfgang's suggestion and did a date search with -funit-at-a-time enabled. The bad .stabs line appeared between 2003-04-11 03:00:00 UTC and 2003-04-11 04:30 UTC (these times are on the subversions.gnu.org repository, cvsroot=:pserver:anoncvs:@subversions.gnu.org:/cvsroot/gcc). The patch which caused this is: 2003-04-10 Zack Weinberg <zack@codesourcery.com> * c-decl.c (struct binding_level): Add shadowed_tags and function_body; remove this_block, tag_transparent, and subblocks_tag_transparent; update comments. ... 2003-04-10 Zack Weinberg <zack@codesourcery.com> * c-tree.h (struct lang_identifier): Replace global_value, local_value members with symbol_value, tag_value. Kill implicit_decl and limbo_value. ... There are two ChangeLog entries here, but only one patch. There is some discussion here: http://gcc.gnu.org/ml/gcc-patches/2003-04/msg00766.html http://gcc.gnu.org/ml/gcc-patches/2003-04/msg00767.html In the followup to 00767, Neil Booth said: "I once tried to remove the extra contour, which gave a bootstrappable compiler but with screwy debug info IIRC. At that point I gave up.", and Zack said "I don't think the debug info is screwed by this ... I suppose we'll find out." Heh. I will attach a couple of generated assembly files from the compilers just before and after the regression. Michael C
Created attachment 5257 [details] good z0.s, gcc HEAD 2003-04-11 03:00:00 UTC Compiler version is gcc HEAD 2003-04-11 03:00:00 UTC from subversions.gnu.org. Compile line is: gcc -funit-at-a-time -gstabs+ -O2 -S z0.41103.s z0.c This is the "before" output (still good).
This is third bug that was caused by these patches.
Created attachment 5258 [details] bad z0.s, gcc HEAD 2003-04-11 04:30:00 UTC Compiler version is gcc HEAD 2003-04-11 04:30:00 UTC from subversions.gnu.org. Compiler command line is gcc -funit-at-a-time -gstabs+ -O2 -o z0.41130.s z0.c. This is the bad assembly file, just after the regression. The bug is at the end of "main": .size main, .-main .stabs "factorial:F(0,1)",36,0,13,factorial .Lscope1: .stabs "",36,0,0,.Lscope1-main The "factorial:F(0,1)" line is misplaced with -funit-at-a-time.
Subject: Re: [3.4 regression] function-at-a-time generates stabs in bad order The present state of c-decl.c is "halfway through a major rewrite" and I am not surprised by the bugs. Unfortunately I ran out of time to work on it, and Geoff's multiple-translation-unit patches make it a lot harder to finish; and I don't think backing it out is feasible. I will see if I can find time to work on this now. Please assign all such bugs to me so I can find them easily. zw
It is Zack's bug.
Fixed by the c-decl.c rewrite: http://gcc.gnu.org/ml/gcc-patches/2004-03/msg01280.html
Given that stabs are only used on a few platforms by deafult, and that Zack doesn't think this easy to fix for 3.4.0, and that the c-decl rewrite may be backported to 3.4.1, which will then fix it, I've retargeted this at 3.4.1.
Subject: Bug 12267 CVSROOT: /cvs/gcc Module name: gcc Changes by: zack@gcc.gnu.org 2004-03-23 23:47:53 Modified files: gcc : ChangeLog c-common.h c-decl.c c-lang.c c-objc-common.c c-opts.c c-parse.in c-tree.h c-typeck.c coverage.c langhooks.c tree.c gcc/cp : ChangeLog cp-lang.c parser.c gcc/objc : objc-act.c objc-act.h objc-lang.c gcc/testsuite : ChangeLog gcc/testsuite/gcc.dg: Wold-style-definition-1.c builtins-30.c decl-5.c local1.c redecl-1.c unused-4.c gcc/testsuite/gcc.dg/noncompile: label-1.c label-lineno-1.c gcc/testsuite/objc.dg: naming-1.m Added files: gcc/testsuite/gcc.dg: Wshadow-2.c gcc/testsuite/gcc.dg/noncompile: incomplete-3.c undeclared-1.c Log message: PR 12267, 12391, 12560, 13129, 14114, 14113 * c-tree.h: Forward declare struct c_binding. Declare c_override_bindings_to_false. Update prototypes. (struct lang_identifier): Update comments. Change fields to be struct c_binding *. (IDENTIFIER_SYMBOL_VALUE, IDENTIFIER_TAG_VALUE) (IDENTIFIER_LABEL_VALUE, C_DECL_INVISIBLE) (KEEP_NO, KEEP_YES, KEEP_MAYBE): Delete. (C_DECL_IN_EXTERNAL_SCOPE, C_DECL_DECLARED_BUILTIN): New. * c-common.h: Update prototypes. * c-decl.c (struct c_scope): Update commentary. Remove names, names_last, parms, parms_last, tags, and shadowed fields. Add bindings and depth fields. (scope_freelist): Move to more appropriate location. (c_print_identifier): Update for changes to struct lang_identifier. (objc_mark_locals_volatile): Update for new bindings structures. (global_bindings_p): Honor c_override_global_bindings_to_false. (pushlevel): Rename to push_scope; take no arguments; use the scope_freelist; initialize scope->depth and check for overflow. (poplevel): Rename to pop_scope; totally rewritten for new bindings structures. (diagnose_mismatched_decls): Use C_DECL_DECLARED_BUILTIN, not C_DECL_INVISIBLE, for certain decisions. Adjust some diagnostics. Improve some commentary. Adjust handling of forward parm decls. (merge_decls): Set C_DECL_DECLARED_BUILTIN when appropriate. Preserve C_DECL_IN_EXTERNAL_SCOPE. (warn_if_shadowing): Correct indentation. Improve diagnostics. (pushdecl): Remove unnecessary assertion. Short-circuit anonymous decls. Rewrite for new bindings structures. Improve commentary. Eliminate the copy_node call. (implicit_decl_warning): Use the "diag" idiom (as seen in locate_old_decl) to reduce code duplication; call locate_old_decl if appropriate. Relocate to remove need for forward declaration. (implicitly_declare): Adjust for new bindings structures. Kludge around Objective-C not-really-builtin functions. (undeclared_variable): Improve diagnostics. If current_function_decl is nonnull but current_function_scope is null, use current_scope. Use bind. (lookup_tag): Adjust for new bindings structures. Kludge around Objective-C's tag declarations that wind up in the external scope. (lookup_name): Adjust for new bindings structures. Kludge around c-common.c's pseudo-typedefs that wind up in the external scope. (lookup_name_current_level): Rename lookup_name_in_scope; take a second argument indicating the scope to examine; rewrite for new bindings structures. (c_init_decl_processing): Adjust for renamed functions. Do not initialize current_file_decl, first_builtin_decl, last_builtin_decl. First scope pushed is the external scope, not the global scope. (builtin_function): Use bind, not pushdecl. Adjust other bits for new data structures. Keep track of builtins that should be made visible automatically. (start_decl): Adjust diagnostics. Remove unnecessary call to expand_decl. (grokparms): Return 0 if arg_types is error_mark_node. (get_parm_info): Rename "void_at_end" argument to "ellipsis", with reversed sense. Rewrite for new bindings structures. Do not leave any decls in the scope, to prevent pop_scope from doing contradictory things with them. (finish_struct, finish_enum): Remove redundant diagnostics. (build_enumerator): Don't cascade diagnostics for error_mark_node. Mark location where -pedantic changes the meaning of the program. (store_parm_decls_newstyle, store_parm_decls_oldstyle): Load the parameter decls into the function's scope structure using bind. Warn here about function definitions in the wrong style. Adjust diagnostics. (store_parm_decls): Correct the determination of whether a function was defined with a prototype. (c_write_global_declarations): Operate on all file decls and on the external scope. Split body of the loop to... (c_write_global_declarations_1): ... this new function, to avoid code duplication. (truly_local_externals, first_builtin_decl, last_builtin_decl) (make_scope, pop_scope, in_parm_level_p, set_block) (any_external_decl, record_external_decl, bind_label, getdecls) (link_hash_hash, link_hash_eq, merge_translation_unit_decls) (c_reset_state): Delete. (visible_builtins, c_override_global_bindings_to_false) (c_binding, I_SYMBOL_BINDING, I_SYMBOL_DECL, I_TAG_BINDING) (I_TAG_DECL, I_LABEL_BINDING, I_LABEL_DECL, file_scope) (external_scope, binding_freelist, bind, free_binding_and_advance) (push_file_scope, pop_file_scope): New. (pushtag, pushdecl_top_level, lookup_label, declare_label) (define_label, c_make_fname_decl, finish_decl) (mark_forward_parm_decls, build_compound_literal) (grokdeclarator, start_function, check_for_loop_decls) (identifier_global_value, record_builtin_type): Minor adjustments for new bindings structures. Improve diagnostics and commentary. * c-objc-common.c (start_cdtor, finish_cdtor): Adjust calls to pushlevel/poplevel respectively. (c_objc_common_finish_file): Don't call merge_translation_unit_decls. * c-opts.c (c_common_parse_file): Remove spurious ATTRIBUTE_UNUSED. Warn about YYDEBUG not being defined only if -dy. Remove no-longer- correct loop over multiple translation units; call fatal_error if requested to compile more than one file at once. (This disables IMA temporarily - an up-front error being preferable to a crash.) * c-parse.in (pushlevel, poplevel rules): Rename push_scope, pop_scope. (all actions): Adjust calls to pushlevel/poplevel. (parsing_iso_function_signature): Delete. (extdef_1): Fold into extdef. (old_style_parm_decls_1): Fold into old_style_parm_decls. Don't warn here about function definitions in the wrong style. (after_tyle_declarator, parm_declarator_starttypename) (parm_declarator_nostarttypename, notype_declarator): Remove commented-out productions. (parmlist_1, parmlist_2): Use make_node, not tree_cons, to create an empty TREE_LIST node. Adjust calls to get_parm_info. (parmlist_2 : ELLIPSIS): Tag the arg-info block with error_mark_node to suppress -Wold-style-definition after this error. (c_parse_file): Don't clear the binding stack or call finish_fname_decls here. Correct comment. * c-typeck.c (same_translation_unit_p): Export. (common_type): Use c_override_global_bindings_to_false, not pushlevel/poplevel/declare_parm_level. * c-lang.c: Override LANG_HOOKS_CLEAR_BINDING_STACK, LANG_HOOKS_PUSHLEVEL, LANG_HOOKS_POPLEVEL, LANG_HOOKS_SET_BLOCK, and LANG_HOOKS_GETDECLS with do-nothing stubs. * objc/objc-lang.c: Likewise. * objc/objc-act.c: Adjust all calls to pushlevel, poplevel, get_parm_info. (OBJC_VOID_AT_END): Delete; replace all uses with void_list_node. (generate_forward_declaration_to_string_table): Delete. * objc/objc-act.h (OCTI_STRG_DECL, UOBJC_STRINGS_decl): Delete. * coverage.c (create_coverage): Don't pushdecl anything. * langhooks.c (lhd_clear_binding_stack): Call lang_hooks.decls.poplevel, not poplevel. * tree.c (list_length): If ENABLE_TREE_CHECKING, abort on a circular list rather than going into an infinite loop. cp: * cp-lang.c (c_reset_state): Delete. (push_file_scope, pop_file_scope): New stubs. * parser.c (c_parse_file): Call sorry() here if called more than once. testsuite: * gcc.dg/Wold-style-definition-1.c, gcc.dg/builtins-30.c * gcc.dg/unused-4.c, gcc.dg/noncompile/label-1.c * gcc.dg/noncompile/label-lineno-1.c, objc.dg/naming-1.m: Adjust error regexps. * gcc.dg/Wshadow-2.c, gcc.dg/noncompile/incomplete-3.c * gcc.dg/noncompile/undeclared-1.c: New test cases. * gcc.dg/decl-5.c, gcc.dg/redecl-1.c: Remove XFAIL. * gcc.dg/local1.c: Add explanatory comment. Patches: http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/ChangeLog.diff?cvsroot=gcc&r1=2.3268&r2=2.3269 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/c-common.h.diff?cvsroot=gcc&r1=1.222&r2=1.223 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/c-decl.c.diff?cvsroot=gcc&r1=1.488&r2=1.489 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/c-lang.c.diff?cvsroot=gcc&r1=1.121&r2=1.122 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/c-objc-common.c.diff?cvsroot=gcc&r1=1.42&r2=1.43 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/c-opts.c.diff?cvsroot=gcc&r1=1.107&r2=1.108 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/c-parse.in.diff?cvsroot=gcc&r1=1.202&r2=1.203 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/c-tree.h.diff?cvsroot=gcc&r1=1.141&r2=1.142 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/c-typeck.c.diff?cvsroot=gcc&r1=1.293&r2=1.294 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/coverage.c.diff?cvsroot=gcc&r1=1.32&r2=1.33 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/langhooks.c.diff?cvsroot=gcc&r1=1.60&r2=1.61 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/tree.c.diff?cvsroot=gcc&r1=1.361&r2=1.362 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/ChangeLog.diff?cvsroot=gcc&r1=1.4010&r2=1.4011 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/cp-lang.c.diff?cvsroot=gcc&r1=1.74&r2=1.75 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/cp/parser.c.diff?cvsroot=gcc&r1=1.186&r2=1.187 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/objc/objc-act.c.diff?cvsroot=gcc&r1=1.207&r2=1.208 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/objc/objc-act.h.diff?cvsroot=gcc&r1=1.20&r2=1.21 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/objc/objc-lang.c.diff?cvsroot=gcc&r1=1.40&r2=1.41 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/ChangeLog.diff?cvsroot=gcc&r1=1.3631&r2=1.3632 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/Wshadow-2.c.diff?cvsroot=gcc&r1=1.1&r2=1.2 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/Wold-style-definition-1.c.diff?cvsroot=gcc&r1=1.1&r2=1.2 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/builtins-30.c.diff?cvsroot=gcc&r1=1.3&r2=1.4 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/decl-5.c.diff?cvsroot=gcc&r1=1.1&r2=1.2 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/local1.c.diff?cvsroot=gcc&r1=1.2&r2=1.3 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/redecl-1.c.diff?cvsroot=gcc&r1=1.2&r2=1.3 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/unused-4.c.diff?cvsroot=gcc&r1=1.2&r2=1.3 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/noncompile/incomplete-3.c.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/noncompile/undeclared-1.c.diff?cvsroot=gcc&r1=NONE&r2=1.1 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/noncompile/label-1.c.diff?cvsroot=gcc&r1=1.1&r2=1.2 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/gcc.dg/noncompile/label-lineno-1.c.diff?cvsroot=gcc&r1=1.3&r2=1.4 http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/testsuite/objc.dg/naming-1.m.diff?cvsroot=gcc&r1=1.2&r2=1.3
fixed in 3.5
This patch would require backporting the c-decl.c rewrite to fix. I am suspending all such bugs until we decide whether or not to do that.
Fixed in GCC 3.5.0, won't fix in 3.4.x.