www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Adjustor thunks and variadic arguments.

reply Iain Buclaw via Digitalmars-d <digitalmars-d puremagic.com> writes:
Hi,

How does LDC handle emitting thunks to external modules that accept
variadic parameters?

If under the same object file, you can happily emit:

sub    offset, %thisreg
jmp    method

But if doing separate compilation, many targets to not support doing
such operations across section boundaries.  So a more general/agnostic
way to go about it is by copying all arguments, adjusting the 'this'
pointer and calling target method at the codegen level.  This works so
long as you are not dealing with a variadic method (ie:
std.stream.Stream.printf)

Example code below:

A.d
---
module A;

interface I_A
{
    bool a(...);
}

class C_A : I_A
{
    bool a(...) { return false; }
}


B.d
---
module B;

import A;

interface I_B : I_A
{
    void b();
}

abstract class C_B : C_A, I_B
{
    abstract void b();
}

void main() { }
Apr 09 2015
parent reply "Daniel Murphy" <yebbliesnospam gmail.com> writes:
"Iain Buclaw via Digitalmars-d"  wrote in message 
news:mailman.1364.1428563414.3111.digitalmars-d puremagic.com...

 If under the same object file, you can happily emit:

 sub    offset, %thisreg
 jmp    method

 But if doing separate compilation, many targets to not support doing
 such operations across section boundaries.  So a more general/agnostic
 way to go about it is by copying all arguments, adjusting the 'this'
 pointer and calling target method at the codegen level.  This works so
 long as you are not dealing with a variadic method (ie:
 std.stream.Stream.printf)
They don't support jumping across section boundaries? But they do support calling? Anyway it sounds like sub offset, %thisreg call method ret would do it
Apr 09 2015
next sibling parent reply Iain Buclaw via Digitalmars-d <digitalmars-d puremagic.com> writes:
On 9 April 2015 at 13:20, Daniel Murphy via Digitalmars-d
<digitalmars-d puremagic.com> wrote:
 "Iain Buclaw via Digitalmars-d"  wrote in message
 news:mailman.1364.1428563414.3111.digitalmars-d puremagic.com...

 If under the same object file, you can happily emit:

 sub    offset, %thisreg
 jmp    method

 But if doing separate compilation, many targets to not support doing
 such operations across section boundaries.  So a more general/agnostic
 way to go about it is by copying all arguments, adjusting the 'this'
 pointer and calling target method at the codegen level.  This works so
 long as you are not dealing with a variadic method (ie:
 std.stream.Stream.printf)
They don't support jumping across section boundaries? But they do support calling? Anyway it sounds like sub offset, %thisreg call method ret would do it
That's not copying arguments. :-) Iain.
Apr 09 2015
parent reply "Daniel Murphy" <yebbliesnospam gmail.com> writes:
"Iain Buclaw via Digitalmars-d"  wrote in message 
news:mailman.1372.1428583102.3111.digitalmars-d puremagic.com...

 That's not copying arguments. :-)
True, but why doesn't jump work?
Apr 09 2015
parent Iain Buclaw via Digitalmars-d <digitalmars-d puremagic.com> writes:
On 9 April 2015 at 15:39, Daniel Murphy via Digitalmars-d
<digitalmars-d puremagic.com> wrote:
 "Iain Buclaw via Digitalmars-d"  wrote in message
 news:mailman.1372.1428583102.3111.digitalmars-d puremagic.com...

 That's not copying arguments. :-)
True, but why doesn't jump work?
Many targets do not support thunks (PPC, IA64, MIPS) - even i386 has it's limitations (if there are no free registers, it's tilt game over!).
From conversations I've been having with GCC folks, jmp won't work
across shared libraries either it seems.
Apr 09 2015
prev sibling parent Iain Buclaw via Digitalmars-d <digitalmars-d puremagic.com> writes:
On 9 April 2015 at 14:38, Iain Buclaw <ibuclaw gdcproject.org> wrote:
 On 9 April 2015 at 13:20, Daniel Murphy via Digitalmars-d
 <digitalmars-d puremagic.com> wrote:
 "Iain Buclaw via Digitalmars-d"  wrote in message
 news:mailman.1364.1428563414.3111.digitalmars-d puremagic.com...

 If under the same object file, you can happily emit:

 sub    offset, %thisreg
 jmp    method

 But if doing separate compilation, many targets to not support doing
 such operations across section boundaries.  So a more general/agnostic
 way to go about it is by copying all arguments, adjusting the 'this'
 pointer and calling target method at the codegen level.  This works so
 long as you are not dealing with a variadic method (ie:
 std.stream.Stream.printf)
They don't support jumping across section boundaries? But they do support calling? Anyway it sounds like sub offset, %thisreg call method ret would do it
That's not copying arguments. :-) Iain.
What is currently happening in GDC (Generic thunks don't support varargs though). https://github.com/D-Programming-GDC/GDC/pull/97#issuecomment-90275901
Apr 09 2015