[cfe-dev] Figuring out if parameter types are passed in same register

Nat! via cfe-dev cfe-dev at lists.llvm.org
Mon Sep 14 03:19:20 PDT 2015


mats petersson wrote:
> I'm assuming you are looking to "not reload edi", but that's not going
> to work if f1 or f2 makes any call that takes an argument [or edi is
> used for something else in the function!].


Actually no. In my case [^1] there is a trampoline function hidden 
between g and f and I would like to figure out, which kind of types I 
can pass transparently on the ABI/architecture.


So it would be more akin to

void  f1( int x)
{
}


void  call( void (*f)( void *), void *arg)
{
    (f)( arg);
}


void  g()
{
    call( (void (*)( void *)) f1, (void *) 1848);
}

This would work on x86_64, but fail on 680x0 AFAIK.

To elaborate a bit more, if the parameters are passed on the stack, then 
trivially types of different size are bound to fail, thats why I am 
looking at registers only.

Thanks for the response.

Ciao
    Nat!

[^1] For the big picture view :) 
https://www.mulle-kybernetik.com/weblog/2015/mulle_objc_meta_call_convention.html. 
I am currently doing "A more formal definition of the mulle-objc meta 
call convention" point 2.





More information about the cfe-dev mailing list