Hi! Cary added recently a debug_hooks->source_line call for asm thunks, but that breaks e.g. for -gstabs+, which emits a relocation relative to whatever label is emitted in the begin_prologue debug hook, so obviously doesn't work well if called before the begin_prologue debug hook.
Fixed by reverting that change and instead setting up proper prologue_location, so that final_start_function called by output_mi_thunk when calling the debug_hooks->begin_prologue hook passes the right line/file. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2012-11-08 Jakub Jelinek <ja...@redhat.com> PR debug/54499 * cgraphunit.c (assemble_thunk): Don't call source_line debug hook here, instead call insn_locations_{init,finalize} and initialize prologue_location. * g++.dg/debug/pr54499.C: New test. --- gcc/cgraphunit.c.jj 2012-11-06 09:03:53.000000000 +0100 +++ gcc/cgraphunit.c 2012-11-08 13:16:48.010938659 +0100 @@ -1413,16 +1413,16 @@ assemble_thunk (struct cgraph_node *node DECL_INITIAL (thunk_fndecl) = fn_block; init_function_start (thunk_fndecl); cfun->is_thunk = 1; + insn_locations_init (); + set_curr_insn_location (DECL_SOURCE_LOCATION (thunk_fndecl)); + prologue_location = curr_insn_location (); assemble_start_function (thunk_fndecl, fnname); - (*debug_hooks->source_line) (DECL_SOURCE_LINE (thunk_fndecl), - DECL_SOURCE_FILE (thunk_fndecl), - /* discriminator */ 0, - /* is_stmt */ 1); targetm.asm_out.output_mi_thunk (asm_out_file, thunk_fndecl, fixed_offset, virtual_value, alias); assemble_end_function (thunk_fndecl, fnname); + insn_locations_finalize (); init_insn_lengths (); free_after_compilation (cfun); set_cfun (NULL); --- gcc/testsuite/g++.dg/debug/pr54499.C.jj 2012-11-08 13:23:19.906740003 +0100 +++ gcc/testsuite/g++.dg/debug/pr54499.C 2012-11-08 13:23:55.189531409 +0100 @@ -0,0 +1,22 @@ +// PR debug/54499 +// { dg-do assemble } + +struct S1 +{ + virtual void f () = 0; +}; + +struct S2 +{ + virtual ~S2 () { } +}; + +struct S3 : public S1, public S2 +{ + void f (); +}; + +void +S3::f () +{ +} Jakub