This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix up assembly thunks with -gstabs+ (PR debug/54499)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Jason Merrill <jason at redhat dot com>, Cary Coutant <ccoutant at google dot com>, Jan Hubicka <jh at suse dot cz>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Thu, 8 Nov 2012 20:55:06 +0100
- Subject: [PATCH] Fix up assembly thunks with -gstabs+ (PR debug/54499)
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
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 <jakub@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