[LLVMdev] PSA: Perfectly forwarding thunks can now be expressed in LLVM IR with musttail and varargs

Reid Kleckner rnk at google.com
Wed Oct 8 10:19:47 PDT 2014

+David, Doug, Tim

I've implemented this forwarding for x86 / x86_64.

The one target I know about where varargs are passed differently from
normal arguments is aarch64-apple-ios/macosx. After thinking a bit more, I
think this forwarding thunk representation works fine even on that target.
Typically a forwarding thunk is called indirectly, or at least through a
bitcast, so the LLVM IR call site would look like:

define i32 @forwarding_thunk_caller() {
  %r = call i32 (%struct.Foo*, i64, i8)* bitcast (void (i8*, ...)*
@adjustor_thunk to i32 (%struct.Foo*, i64, i8)*) (%struct.Foo* null, i64
42, i8 13)
  ret i32 %r

The thunk will have a varargs prototype, but it will also arrange to
forward the unconsumed register parameters through to the musttail call
site. I haven't implemented this yet for non-x86 architectures, but I plan
to soon.

Does anyone object to this representation?

On Tue, Sep 2, 2014 at 3:54 PM, Reid Kleckner <rnk at google.com> wrote:

> I needed this functionality to solve http://llvm.org/PR20653, but it
> obviously has far more general applications.
> You can do it like this:
> define i32 @my_forwarding_thunk(i32 %arg1, i8* %arg2, ...) {
>   ... ; define new_arg1 and new_arg2
>   %r = musttail call i32 (i32, i8*, ...)* @the_true_target(i32 %new_arg1,
> i8* %new_arg2, ...)
>   ret i32 %r
> }
> declare i32 @the_true_target(i32, i8*, ...)
> The varargs convention (usually) matches the standard function call
> convention, and everything will line up if you do an indirect call like
> this:
> declare i32 @the_true_target(%struct.Foo* %this, i64, i8)
> define i32 @my_forwarding_thunk(%struct.Foo* %this, ...) {
>   %fptr = ... ; Compute fptr by bitcasting @the_true_target to the varargs
> type
>   %r = musttail call i32 (%struct.Foo*, ...)* %fptr(%struct.Foo* %this,
> ...)
>   ret i32 %r
> }
> Currently this functionality is only implemented for x86 in the absence of
> inreg and for x86_64 in the general case, but I'd like to see it
> implemented for the CPU backends. I'm happy to do some of them, but I don't
> have the time to do all of them.
> Alternatively, it would be great if we could handle forwarding of unused
> register parameters in variadic functions in a general way. Perhaps CCState
> should surface this information.
> Thoughts? This seemed like a reasonable way to represent such thunks, but
> I'd like to know if there are objections.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20141008/32aaea63/attachment.html>

More information about the llvm-dev mailing list