[LLVMdev] Function inlining creates uninitialized stack roots
nicolas geoffray
nicolas.geoffray at gmail.com
Sat Oct 2 12:59:36 PDT 2010
Hi Talin,
You are not doing something wrong, it is just that the LLVM optimizers
consider llvm.gcroot like a regular function call. The alloca is moved in
the first block most probably because the inliner anticipates another
optimization pass (the mem2reg).
Cheers,
Nicolas
On Sat, Oct 2, 2010 at 8:28 PM, Talin <viridia at gmail.com> wrote:
> I'm still putting the final touches on my stack crawler, and I've run into
> a problem having to do with function inlining and local stack roots.
>
> As you know, all local roots must be initialized before you can make any
> call to a function which might crawl the stack. My compiler ensures that all
> local variables of a function are allocated, declared as root, and
> initialized in the first block.
>
> However, the function inlining pass does not seem to preserve these
> constraints. For example, say I have a function F:
>
> void F() {
> f1();
> f2();
> }
>
> Let's say that f1() causes a stack crawl (perhaps by triggering a
> collection cycle), and that f2() declares a stack root 'a'. If the optimizer
> decides to inline f2, then by the time the GCPrinter is called the resulting
> code looks like this:
>
> - a = alloca
> - call f1
> - call llvm.gcroot(a)
> - store null, a
>
> The inliner moved the alloca instruction to the top of the function, but
> not the call to llvm.gcroot or the initialization of the variable. In other
> words, the initialization of the root occurs *after* the call to f1. This
> means that the stack crawler is seeing garbage and therefore crashes hard.
> (Also, I've observed that the call to llvm.gcroot and the initialization
> might not even be in the first block anymore.)
>
> As per usual, I'm not sure if this is a bug in LLVM or my doing something
> wrong...
>
> --
> -- Talin
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20101002/27e0c382/attachment.html>
More information about the llvm-dev
mailing list