aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJørgen Kvalsvik <j@lambda.is>2024-06-04 14:16:22 +0200
committerJørgen Kvalsvik <j@lambda.is>2024-06-26 12:19:34 +0200
commit7a9b535d8abe27abdaa68cdcb22172a666030d06 (patch)
tree32f1ac0fd38eaf6fb2be1aa996b338579490f1b0
parent0bf002100453a0f531855c093f095dc15274a78c (diff)
Record edge true/false value for gcov
Make gcov aware which edges are the true/false to more accurately reconstruct the CFG. There are plenty of bits left in arc_info and it opens up for richer reporting. gcc/ChangeLog: * gcov-io.h (GCOV_ARC_TRUE): New. (GCOV_ARC_FALSE): New. * gcov.cc (struct arc_info): Add true_value, false_value. (read_graph_file): Read true_value, false_value. * profile.cc (branch_prob): Write GCOV_ARC_TRUE, GCOV_ARC_FALSE.
-rw-r--r--gcc/gcov-io.h2
-rw-r--r--gcc/gcov.cc8
-rw-r--r--gcc/profile.cc4
3 files changed, 14 insertions, 0 deletions
diff --git a/gcc/gcov-io.h b/gcc/gcov-io.h
index 20f805598f0..5dc467c92b1 100644
--- a/gcc/gcov-io.h
+++ b/gcc/gcov-io.h
@@ -337,6 +337,8 @@ GCOV_COUNTERS
#define GCOV_ARC_ON_TREE (1 << 0)
#define GCOV_ARC_FAKE (1 << 1)
#define GCOV_ARC_FALLTHROUGH (1 << 2)
+#define GCOV_ARC_TRUE (1 << 3)
+#define GCOV_ARC_FALSE (1 << 4)
/* Object & program summary record. */
diff --git a/gcc/gcov.cc b/gcc/gcov.cc
index 6f3055718d2..2e4bd9d3c5d 100644
--- a/gcc/gcov.cc
+++ b/gcc/gcov.cc
@@ -117,6 +117,12 @@ struct arc_info
/* Loop making arc. */
unsigned int cycle : 1;
+ /* Is a true arc. */
+ unsigned int true_value : 1;
+
+ /* Is a false arc. */
+ unsigned int false_value : 1;
+
/* Links to next arc on src and dst lists. */
struct arc_info *succ_next;
struct arc_info *pred_next;
@@ -2010,6 +2016,8 @@ read_graph_file (void)
arc->on_tree = !!(flags & GCOV_ARC_ON_TREE);
arc->fake = !!(flags & GCOV_ARC_FAKE);
arc->fall_through = !!(flags & GCOV_ARC_FALLTHROUGH);
+ arc->true_value = !!(flags & GCOV_ARC_TRUE);
+ arc->false_value = !!(flags & GCOV_ARC_FALSE);
arc->succ_next = src_blk->succ;
src_blk->succ = arc;
diff --git a/gcc/profile.cc b/gcc/profile.cc
index 2b90e6cc510..25d4f4a4b86 100644
--- a/gcc/profile.cc
+++ b/gcc/profile.cc
@@ -1456,6 +1456,10 @@ branch_prob (bool thunk)
flag_bits |= GCOV_ARC_FAKE;
if (e->flags & EDGE_FALLTHRU)
flag_bits |= GCOV_ARC_FALLTHROUGH;
+ if (e->flags & EDGE_TRUE_VALUE)
+ flag_bits |= GCOV_ARC_TRUE;
+ if (e->flags & EDGE_FALSE_VALUE)
+ flag_bits |= GCOV_ARC_FALSE;
/* On trees we don't have fallthru flags, but we can
recompute them from CFG shape. */
if (e->flags & (EDGE_TRUE_VALUE | EDGE_FALSE_VALUE)