Index: docs/LangRef.rst =================================================================== --- docs/LangRef.rst +++ docs/LangRef.rst @@ -1430,6 +1430,15 @@ This attribute by itself does not imply restrictions on inter-procedural optimizations. All of the semantic effects the patching may have to be separately conveyed via the linkage type. +``"probe-stack"`` + This attribute indicates that the function will trigger a guard region + in the end of the stack. It ensures that accesses to the stack must be + no further apart than the size of the guard region to a previous + access of the stack. + + If a function that has a ``"probe-stack"`` attribute is inlined into a + function that doesn't have a ``"probe-stack"`` attribute, then the + resulting function will have a ``"probe-stack"`` attribute. ``readnone`` On a function, this attribute indicates that the function computes its result (or decides to unwind an exception) based strictly on its arguments, Index: lib/Transforms/IPO/Inliner.cpp =================================================================== --- lib/Transforms/IPO/Inliner.cpp +++ lib/Transforms/IPO/Inliner.cpp @@ -94,6 +94,12 @@ AttributeFuncs::mergeAttributesForInlining(*Caller, *Callee); + // If the callee requires stack probes, we ensure that the caller will + // require those too + if (Callee->hasFnAttribute("probe-stack")) { + Caller->addFnAttr("probe-stack"); + } + // Look at all of the allocas that we inlined through this call site. If we // have already inlined other allocas through other calls into this function, // then we know that they have disjoint lifetimes and that we can merge them. Index: test/Transforms/Inline/inline-probe-stack.ll =================================================================== --- /dev/null +++ test/Transforms/Inline/inline-probe-stack.ll @@ -0,0 +1,12 @@ +; RUN: opt %s -inline -S | FileCheck %s + +define internal void @inner() "probe-stack" { + ret void +} + +define void @outer() { + call void @inner() + ret void +} +; CHECK: define void @outer() #0 +; CHECK: attributes #0 = { "probe-stack" }