Add an assert to leaf_function_p to ensure it is not called from a prolog or...
authorWilco Dijkstra <wdijkstr@arm.com>
Thu, 18 May 2017 15:58:33 +0000 (15:58 +0000)
committerWilco Dijkstra <wilco@gcc.gnu.org>
Thu, 18 May 2017 15:58:33 +0000 (15:58 +0000)
Add an assert to leaf_function_p to ensure it is not called from a
prolog or epilog sequence (which would incorrectly return true in a
non-leaf function).  There are several targets which still call
leaf_function_p, and while most appear safe or appear aware of the
issue, it is likely not all such calls are safe.  This check enables
any such latent bugs to be found.

    gcc/
* final.c (leaf_function_p): Check we are not in a sequence.

From-SVN: r248240

gcc/ChangeLog
gcc/final.c

index f2762580970f71deae668b85d61f40abed471598..a9a861eb5e8c63baea551ccc8a6d051faf008bcf 100644 (file)
@@ -1,3 +1,7 @@
+2017-05-18  Wilco Dijkstra  <wdijkstr@arm.com>
+
+       * final.c (leaf_function_p): Check we are not in a sequence.
+
 2017-05-18  Martin Liska  <mliska@suse.cz>
 
        * cfgrtl.c (rtl_verify_edges): Remove usage of TDF_RTL.
index 820162b2d28d734901375017cf0c7a3095e8903e..e61b78b0a915df748fcf3d73cd46db855cf7a1c6 100644 (file)
@@ -4309,6 +4309,9 @@ leaf_function_p (void)
 {
   rtx_insn *insn;
 
+  /* Ensure we walk the entire function body.  */
+  gcc_assert (!in_sequence_p ());
+
   /* Some back-ends (e.g. s390) want leaf functions to stay leaf
      functions even if they call mcount.  */
   if (crtl->profile && !targetm.keep_leaf_when_profiled ())