| Thread overview | ||||||||
|---|---|---|---|---|---|---|---|---|
|
April 09, 2015 Adjustor thunks and variadic arguments. | ||||
|---|---|---|---|---|
| ||||
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() { }
| ||||
April 09, 2015 Re: Adjustor thunks and variadic arguments. | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Iain Buclaw | "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 | |||
April 09, 2015 Re: Adjustor thunks and variadic arguments. | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Daniel Murphy | 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.
| |||
April 09, 2015 Re: Adjustor thunks and variadic arguments. | ||||
|---|---|---|---|---|
| ||||
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 | ||||
April 09, 2015 Re: Adjustor thunks and variadic arguments. | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Iain Buclaw | "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? | |||
April 09, 2015 Re: Adjustor thunks and variadic arguments. | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Daniel Murphy | 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. | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply