]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Verify __builtin_unreachable and __builtin_trap are not called with arguments
authorMartin Jambor <jamborm@gcc.gnu.org>
Tue, 26 Apr 2016 11:51:23 +0000 (13:51 +0200)
committerMartin Jambor <jamborm@gcc.gnu.org>
Tue, 26 Apr 2016 11:51:23 +0000 (13:51 +0200)
2016-04-26  Martin Jambor  <mjambor@suse.cz>

* tree-cfg.c (verify_gimple_call): Check that calls to
__builtin_unreachable or __builtin_trap do not have actual arguments.

From-SVN: r235439

gcc/tree-cfg.c

index 04e46fd068c39557316dad8e9bc8d4a4250083df..e1fdc9e2bce0da7bcde8cab762f46910ea29f227 100644 (file)
@@ -3414,6 +3414,30 @@ verify_gimple_call (gcall *stmt)
       return true;
     }
 
+  if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
+    {
+      switch (DECL_FUNCTION_CODE (fndecl))
+       {
+       case BUILT_IN_UNREACHABLE:
+       case BUILT_IN_TRAP:
+         if (gimple_call_num_args (stmt) > 0)
+           {
+             /* Built-in unreachable with parameters might not be caught by
+                undefined behavior sanitizer.  Front-ends do check users do not
+                call them that way but we also produce calls to
+                __builtin_unreachable internally, for example when IPA figures
+                out a call cannot happen in a legal program.  In such cases,
+                we must make sure arguments are stripped off.  */
+             error ("__builtin_unreachable or __builtin_trap call with "
+                    "arguments");
+             return true;
+           }
+         break;
+       default:
+         break;
+       }
+    }
+
   /* ???  The C frontend passes unpromoted arguments in case it
      didn't see a function declaration before the call.  So for now
      leave the call arguments mostly unverified.  Once we gimplify