From: Tom de Vries <tdevries@suse.de>
To: gcc-patches@gcc.gnu.org
Cc: Richard Biener <rguenther@suse.de>,
Jakub Jelinek <jakub@redhat.com>,
Jim Wilson <wilson@tuliptree.org>
Subject: [RFC][debug] Add -fadd-debug-nops
Date: Mon, 16 Jul 2018 13:29:00 -0000 [thread overview]
Message-ID: <20180716132909.633uvqxojzgg3wg6@delia> (raw)
Hi,
this is an idea that I'm currently playing around with: adding nops in
an optimized application with debug info can improve the debug info.
Consider f.i. this gdb session in foo of pr54200-2.c (using -Os):
...
(gdb) n
26 return a; /* { dg-final { gdb-test . "(int)a" "6" } } */
(gdb) p a
'a' has unknown type; cast it to its declared type
(gdb) n
main () at pr54200-2.c:34
34 return 0;
...
The problem is that the scope in which a is declared ends at .LBE7, and the
statement .loc for line 26 ends up attached to the ret insn:
...
.loc 1 24 11
addl %edx, %eax
.LVL1:
# DEBUG a => ax
.loc 1 26 7 is_stmt 1
.LBE7:
.loc 1 28 1 is_stmt 0
ret
.cfi_endproc
...
This patch fixes the problem (for Og and Os, the 'DEBUG a => ax' is missing
for O1 and higher) by adding a nop before the ret insn:
...
.loc 1 24 11
addl %edx, %eax
.LVL1:
# DEBUG a => ax
.loc 1 26 7 is_stmt 1
+ nop
.LBE7:
.loc 1 28 1 is_stmt 0
ret
.cfi_endproc
...
and instead we have:
...
(gdb) n
26 return a; /* { dg-final { gdb-test . "(int)a" "6" } } */
(gdb) p a
$1 = 6
(gdb) n
main () at pr54200-2.c:34
34 return 0;
...
Any comments?
Thanks,
- Tom
[debug] Add -fadd-debug-nops
---
gcc/common.opt | 4 ++++
gcc/testsuite/gcc.dg/guality/pr54200-2.c | 37 ++++++++++++++++++++++++++++++++
gcc/var-tracking.c | 16 ++++++++++++++
3 files changed, 57 insertions(+)
diff --git a/gcc/common.opt b/gcc/common.opt
index c29abdb5cb1..8e2876d2b8e 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -1504,6 +1504,10 @@ Common Report Var(flag_hoist_adjacent_loads) Optimization
Enable hoisting adjacent loads to encourage generating conditional move
instructions.
+fadd-debug-nops
+Common Report Var(flag_add_debug_nops) Optimization
+Add nops if that improves debugging of optimized code
+
fkeep-gc-roots-live
Common Undocumented Report Var(flag_keep_gc_roots_live) Optimization
; Always keep a pointer to a live memory block
diff --git a/gcc/testsuite/gcc.dg/guality/pr54200-2.c b/gcc/testsuite/gcc.dg/guality/pr54200-2.c
new file mode 100644
index 00000000000..2694f7401e2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/guality/pr54200-2.c
@@ -0,0 +1,37 @@
+/* { dg-do run } */
+/* { dg-skip-if "" { *-*-* } { "*" } { "-Og" "-Os" "-O0" } } */
+/* { dg-options "-g -fadd-debug-nops -DMAIN" } */
+
+#include "prevent-optimization.h"
+
+int o ATTRIBUTE_USED;
+
+void
+bar (void)
+{
+ o = 2;
+}
+
+int __attribute__((noinline,noclone))
+foo (int z, int x, int b)
+{
+ if (x == 1)
+ {
+ bar ();
+ return z;
+ }
+ else
+ {
+ int a = (x + z) + b;
+ /* Add cast to prevent unsupported. */
+ return a; /* { dg-final { gdb-test . "(int)a" "6" } } */
+ }
+}
+
+#ifdef MAIN
+int main ()
+{
+ foo (3, 2, 1);
+ return 0;
+}
+#endif
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index 5537fa64085..230845a38a0 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -9994,6 +9994,15 @@ reemit_marker_as_note (rtx_insn *insn)
}
}
+static void
+emit_nop_before (rtx_insn *insn)
+{
+ rtx_insn *insert_after = PREV_INSN (insn);
+ while (INSN_LOCATION (insert_after) == INSN_LOCATION (insn))
+ insert_after = PREV_INSN (insert_after);
+ emit_insn_after (gen_nop (), insert_after);
+}
+
/* Allocate and initialize the data structures for variable tracking
and parse the RTL to get the micro operations. */
@@ -10224,6 +10233,13 @@ vt_initialize (void)
continue;
}
+ /* Add debug nops before ret insn. */
+ if (optimize
+ && flag_add_debug_nops
+ && cfun->debug_nonbind_markers
+ && returnjump_p (insn))
+ emit_nop_before (insn);
+
if (MAY_HAVE_DEBUG_BIND_INSNS)
{
if (CALL_P (insn))
next reply other threads:[~2018-07-16 13:29 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-16 13:29 Tom de Vries [this message]
2018-07-16 13:34 ` Jakub Jelinek
2018-07-16 14:32 ` Tom de Vries
2018-07-17 1:02 ` Alexandre Oliva
2018-07-16 13:50 ` Richard Biener
2018-07-16 15:10 ` Tom de Vries
2018-07-24 11:30 ` Tom de Vries
2018-07-24 11:35 ` [RFC 1/3, debug] Add fdebug-nops Tom de Vries
2018-07-24 14:59 ` [PATCH, " Tom de Vries
2018-07-24 19:07 ` [RFC 1/3, " Alexandre Oliva
2018-07-24 21:04 ` Tom de Vries
2018-07-26 7:50 ` Alexandre Oliva
2018-07-24 11:37 ` [RFC 2/3, debug] Add fkeep-vars-live Tom de Vries
2018-07-24 11:46 ` Jakub Jelinek
2018-07-24 12:34 ` Tom de Vries
2018-07-24 15:03 ` [PATCH, " Tom de Vries
2018-07-25 11:06 ` Jakub Jelinek
2018-07-25 11:41 ` Richard Biener
2018-07-25 11:47 ` Richard Biener
2018-07-24 19:11 ` [RFC 2/3, " Alexandre Oliva
2018-07-25 11:02 ` Jakub Jelinek
2018-07-26 7:47 ` Alexandre Oliva
2018-07-24 11:38 ` [RFC 3/3, debug] Add fdebug-nops and fkeep-vars-live to Og only Tom de Vries
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180716132909.633uvqxojzgg3wg6@delia \
--to=tdevries@suse.de \
--cc=gcc-patches@gcc.gnu.org \
--cc=jakub@redhat.com \
--cc=rguenther@suse.de \
--cc=wilson@tuliptree.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).