[LLVMdev] Injecting code before function prolog
Dan Gohman
gohman at apple.com
Fri Apr 9 15:40:53 PDT 2010
On Apr 7, 2010, at 10:43 AM, Arlen Cox wrote:
> I'm trying to implement something similar to this:
> http://gcc.gnu.org/wiki/SplitStacks in LLVM. The reason I want this
> is so that I can have dynamically growing and shrinking stacks in my
> programming language. In order to do this, I need to be able to check
> for overflow of a stack frame. The methods of doing this are outlined
> in the link above, but my intention is to pass the current stack limit
> as the first argument to the function.
>
> What I'm hoping to do is to be able to inject the following code (in
> x86 asm, c calling convention) on entry to each function:
> _foo:
> lea -frame_size(%esp), %eax
> cmpl %eax, 4(%esp)
> jb function_entry
> // handle overflow
> function_entry:
> function prolog
> ...
>
> The problem I'm encountering is how to force this before the prolog.
> I'm attempting to add a machine function pass after the emit
> prolog/epilog pass that injects this code, but directly injecting x86
> code seems to be very messy as I have to figure out how LLVM encodes
> the addressing modes and instructions specific to x86. Additionally,
> directly inject x86 code produces an LLVM that is not target
> independent anymore.
>
> Is there a better way to do this? Can I maintain target independence?
> All I really need is to be able to access the stack pointer.
Would it make sense to do this within the TargetRegisterInfo::emitPrologue
hooks?
Dan
More information about the llvm-dev
mailing list