[llvm-dev] conceiving of a frontend feature which requires LLVM support: builtin to determine stack size upper bound

Manuel Jacob via llvm-dev llvm-dev at lists.llvm.org
Sat Oct 21 18:23:57 PDT 2017


[+CC John Regehr]

Hi Andrew,

Good to know that someone is working on a feature like this.  Many 
languages - even those used for embedded applications - are happily 
ignoring the issue of an overflowing stack.

Some comments inline...

On 2017-10-21 19:43, Andrew Kelley via llvm-dev wrote:
> Here is a feature I would like to introduce to my frontend:
> 
> A builtin function to calculate the upper bound of the stack size of 
> any
> given function.
> 
> The idea here is that, if we do not have any:
>  * external library calls

As was discussed in the upstream issue, this can be solved by providing 
the upper stack size bound for the external function.  LLVM's function 
attributes can be used for this.

>  * alloca

I was going to write that this shouldn't be problem.  But of course 
there are variably-sized allocas, which are hard to support.

>  * indirect function calls

These can be supported by passing the upper bound along with the 
function pointer.

>  * non-tail-recursion

In some cases, a tight upper bound can be calculated even for recursive 
functions, although this is non-trivial and impossible to do for the 
general case.

>  * inline assembly that modifies the stack pointer
> 
> Then, we can look at a given function and determine precisely how much
> stack space is needed to spawn a thread to run that function. This 
> provides
> two benefits:
>  * Statically guarantee that stack overflow will not occur
>  * Threads can have smaller stack sizes, lowering the cost of creating 
> a
> thread
> 
> This feature requires tight coupling with LLVM, because:
>  * We need to know the stack size post-optimizations
>  * Frontend needs to make a compile error if non-tail-recursion occurs, 
> but
> LLVM might introduce (or remove?) tail recursion, and so we would need 
> to
> capture this error from LLVM and report it back in the frontend.
> 
> 
> What do you think? Is this feature reasonable to achieve with LLVM and 
> in
> scope of the LLVM project?

Writing this analysis on the MIR level shouldn't be too difficult.  The 
basic pieces (for a single function) are already there.  Search LLVM's 
source code for "FrameLowering" and "MachineFrameInfo".  Your analysis 
would have to scan the machine code for function calls to find the worst 
case call sequence.

The machine code can contain calls to additional functions, like memcpy 
and functions from compiler-rt, whose stack usage information has to be 
provided externally.

For embedded applications you have to keep in mind interrupts.  A 
possible solution is described in this paper: 
https://www.cs.utah.edu/~regehr/papers/p751-regehr.pdf

> I would propose an LLVM builtin function to perform this calculation, 
> and I
> can work on a proof-of-concept if llvm-dev thinks this idea is worth
> pursuing.

What do you mean by "LLVM builtin function"?

-Manuel

> 
> Upstream issue: https://github.com/zig-lang/zig/issues/157
> 
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev


More information about the llvm-dev mailing list