[llvm-commits] [PATCH] __builtin_debugtrap() intrinsic function (change to Clang and CodeGen)

Eli Friedman eli.friedman at gmail.com
Fri Oct 19 13:28:26 PDT 2012


On Fri, Oct 19, 2012 at 11:23 AM, Shuxin Yang <shuxin.llvm at gmail.com> wrote:
> Hi,
>
>    This patch is to fix radar://8426430. It is about llvm support of
> __builtin_debugtrap()
> which is supposed to consistently raise SIGTRAP across all systems. In
> contrast,
> __builtin_trap() behave differently on different systems. e.g. it raises
> SIGTRAP on ARM, and
> SIGILL on X86. The purpose of __builtin_debugtrap() is to consistently
> provide "trap"
> functionality, in the mean time preserve the compatibility with on gcc on
> __builtin_trap().
>
>   The X86 backend is already able to handle debugtrap(). This patch is to:
>   1) make front-end recognize "__builtin_debugtrap()" (emboddied in the
> one-line change to Clang).
>   2) In DAG legalization phase, by default, "debugtrap" will be replaced
> with "trap", which
>      make the __builtin_debugtrap() "available" to all existing ports
> without the hassle of
>      changing their code.
>   3) If trap-function is specified (via -trap-func=xyz to llc), both
> __builtin_debugtrap() and
>      __builtin_trap() will be expanded into the function call of the
> specified trap function.
>     This behavior may need change in the future.
>
>   The provided testing-case is to make sure 2) and 3) are working for ARM
> port, and we
> already have a testing case for x86.
>
>   This change pass regression test, SingleSource and MultipleSource test.

Index: include/llvm/Intrinsics.td
===================================================================
--- include/llvm/Intrinsics.td	(revision 166287)
+++ include/llvm/Intrinsics.td	(working copy)
@@ -420,7 +420,7 @@
                      GCCBuiltin<"__builtin_flt_rounds">;
 def int_trap : Intrinsic<[], [], [IntrNoReturn]>,
                GCCBuiltin<"__builtin_trap">;
-def int_debugtrap : Intrinsic<[]>,
+def int_debugtrap : Intrinsic<[], [], [IntrNoReturn]>,
                     GCCBuiltin<"__builtin_debugtrap">;

int_debugtrap is intentionally not marked noreturn because you can
"continue" in a debugger.

+      NewVal = DAG.getNode (ISD::TRAP, Node->getDebugLoc(), Node->getVTList(),
+                            Node->getOperand(0));

http://llvm.org/docs/CodingStandards.html#spaces-before-parentheses

-Eli



More information about the llvm-commits mailing list