"Walter Bright" <newshou...@digitalmars.com> wrote in message 
news:l6cm9d$2uq8$1...@digitalmars.com...
> On 11/17/2013 9:25 PM, Daniel Murphy wrote:
>> "Walter Bright" <newshou...@digitalmars.com> wrote in message
>> news:l6c7gt$27fc$1...@digitalmars.com...
>>>>
>>>> Right, I was saying the indirection still exists.
>>>>
>>>>
>>>
>>> No, not really, at least not on Windows. Try calling a function in the
>>> Windows API and disassemble it. You'll see a direct call.
>>
>> You sure about that?
>>
>> src:
>>
>> import core.sys.windows.windows;
>>
>> void main()
>> {
>>      auto x = GetModuleHandleA(null);
>> }
>>
>> obj:
>>
>> __Dmain PROC NEAR
>> ;  COMDEF __Dmain
>>          push    0                                       ; 0000 _ 6A, 00
>>          call    dword ptr [__imp__GetModuleHandleA@4]   ; 0002 _ FF. 15,
>> 00000000(segrel)
>>          xor     eax, eax                                  ; 0008 _ 31. 
>> C0
>>          ret                                             ; 000A _ C3
>> __Dmain ENDP
>>
>>
>> exe:
>>
>> ?_0072  LABEL NEAR
>>          push    0                                       ; 00402010 _ 6A, 
>> 00
>>          call    dword ptr [?_0067]                      ; 00402012 _ FF. 
>> 15,
>> 00401794(d)
>>          xor     eax, eax                                ; 00402018 _ 31. 
>> C0
>>          ret                                             ; 0040201A _ C3
>>
>>
>
> Try this:
>
> extern (Windows) int GetModuleHandleA(char*);
>
> void main()
> {
>     auto x = GetModuleHandleA(null);
> }
>
> and it compiles and links and runs. No indirection (in the object file, 
> the indirection is supplied by linker, triggered by an impdef record in 
> kernel32.lib). The "export" isn't actually needed.

So now we get:

?_0072  LABEL NEAR
        push    0                                       ; 00402010 _ 6A, 00
        call    Unnamed_2_1A0DC                         ; 00402012 _ E8, 
0001A0C5
        xor     eax, eax                                ; 00402017 _ 31. C0
        ret                                             ; 00402019 _ C3

Where Unnamed_2_1A0DC is a thunk in the import table:

Unnamed_2_1A0DC LABEL NEAR
        jmp     dword ptr [?_0067]                      ; 0041C0DC _ FF. 25, 
00401794(d)

That still appears to be a layer of indirection to me...

So the difference is the compiler is unaware the function may be called 
through the import table?  Why would it ever _want_ to use the first 
version, are there any cases that can't simply be rewritten as the second? 


Reply via email to