[dmd-beta] dmd 1.070 and 2.055 beta

Rainer Schuetze r.sagitario at gmx.de
Tue Sep 6 12:13:32 PDT 2011


I can reproduce the issue on Win7 64, but not on XP. I have debugged it 
a little until I noticed that the generated code for TLS access seems 
broken:

dmd 2.054 generated this code for the append operation

  push        1
1000207D  mov         ecx,dword ptr [__tls_index (1006BF98h)]
10002083  mov         edx,dword ptr fs:[2Ch]
1000208A  mov         ebx,dword ptr [edx+ecx*4]
1000208D  lea         esi,[ebx+4]
10002093  push        esi
10002094  mov         eax,offset TypeInfo_Ai at __init (1005E9A0h)
10002099  push        eax
1000209A  call        __d_arrayappendcT (10004D68h)

while the beta generates

push        1
10002076  mov         ecx,dword ptr fs:[2Ch]
1000207D  mov         edx,dword ptr [ecx]
1000207F  lea         ebx,[edx+4]
10002085  push        ebx
10002086  mov         esi,offset TypeInfo_Ai at __init (10067A90h)
1000208B  push        esi
1000208C  call        __d_arrayappendcT (10004F9Ch)

so it completely ignores the tls_index. I guess it works on XP because 
there are less DLLs that use TLS, so the DLLs index ends up as 0.

Rainer

PS: one possibly bad thing: printf is imported from the LLVM DLL, not 
from the dmc runtime library. This might add more confusion.


On 06.09.2011 15:06, Sönke Ludwig wrote:
> I will try that in a few hours when I'm back from work.
>
> Am 06.09.2011 08:16, schrieb Walter Bright:
>> Could you get the druntime sources for the last dmd release, try 
>> those, and see if it works successfully?
>>
>> On 9/5/2011 10:52 PM, Sönke Ludwig wrote:
>>> Am 05.09.2011 23:53, schrieb Rainer Schuetze:
>>>> On 05.09.2011 21:35, Sönke Ludwig wrote:
>>>>> Am 05.09.2011 19:54, schrieb Rainer Schuetze:
>>>>>>
>>>>>> What OS are you running on?
>>>>>>
>>>>>> Your code works for me (XP SP3). Also Visual D works fine AFAICT 
>>>>>> (its a plugin DLL to VS).
>>>>>>
>>>>> Windows 7 x64 SP1... But it is more complicated than it seemed.
>>>>>
>>>>> I had another file linked to the DLL that I thought had not 
>>>>> effect. But actually it used a function from another DLL* that was 
>>>>> linked in statically via passing a .lib file to the command line 
>>>>> (along with the source files). The error does not occur if 
>>>>> compiling and linking is done by separate invocations of dmd. Also 
>>>>> commenting out all the lines that use a function from the external 
>>>>> DLL fixes the problem.
>>>>>
>>>>> (* that DLL is LLVM 2.9, so no D code inside)
>>>>>
>>>>>
>>>>
>>>> There might be issues if you are calling another DLL from inside 
>>>> the (non-shared) static constructors and that DLL also uses TLS. In 
>>>> DllMain(DLL_PROCESS_ATTACH), each existing thread is initialized by 
>>>> just swapping the TLS data of the DLL and then running the module 
>>>> initialization. So if another DLL is called, it will only see the 
>>>> TLS of the thread that called DllMain.
>>>>
>>>> I don't think anything in this code has changes recently. Is this a 
>>>> regression from the last dmd version?
>>>>
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> dmd-beta mailing list
>>>> dmd-beta at puremagic.com
>>>> http://lists.puremagic.com/mailman/listinfo/dmd-beta
>>> Yes, it is a regression in the first beta. The new beta also has it.
>>>
>>> In general, the LLVM DLL was not called at all before the error 
>>> occurs, the pure fact that there was a dependency to it somewhere in 
>>> the code causes the problem. Also, it doesn't matter whether the 
>>> array is used somwhere inside of DllMain or later from within an 
>>> exported function (this was actually the case before I tried to 
>>> strip it down). There is just one static constructor in the code. 
>>> Commenting it out does not affect the problem.
>>>
>>> I now completely removed any other code and just put in one function 
>>> call after the array appending line. Commenting out the llvm call 
>>> will cause the array to be correctly initialized/referenced, 
>>> otherwise it contains garbage in its ptr/length fields. (making it 
>>> __gshared also fixes it)
>>>
>>> The llvm.lib containing the llvm functions was generated from the 
>>> dll using implib.
>>>
>>> ---
>>> import std.c.windows.windows;
>>> import core.sys.windows.dll;
>>>
>>> import llvm.target;
>>> int[] test;
>>>
>>> extern (Windows)
>>> BOOL DllMain(HINSTANCE hInstance, ULONG ulReason, LPVOID pvReserved)
>>> {
>>>     switch (ulReason) {
>>>         default: return false;
>>>         case DLL_PROCESS_ATTACH:
>>>             if( !dll_process_attach( hInstance, true ) ) return false;
>>>             test ~= 1; // throws out of memory
>>>             LLVMInitializeX86TargetInfo(); // commenting out this 
>>> will make it work
>>>             break;
>>>         case DLL_PROCESS_DETACH: dll_process_detach( hInstance, true 
>>> ); break;
>>>         case DLL_THREAD_ATTACH: dll_thread_attach( true, true ); break;
>>>         case DLL_THREAD_DETACH: dll_thread_detach( true, true ); break;
>>>     }
>>>     return true;
>>> }
>>> ---
>>>
>>>
>>> _______________________________________________
>>> dmd-beta mailing list
>>> dmd-beta at puremagic.com
>>> http://lists.puremagic.com/mailman/listinfo/dmd-beta
>>
>>
>> _______________________________________________
>> dmd-beta mailing list
>> dmd-beta at puremagic.com
>> http://lists.puremagic.com/mailman/listinfo/dmd-beta
>
>
>
> _______________________________________________
> dmd-beta mailing list
> dmd-beta at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/dmd-beta

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/dmd-beta/attachments/20110906/4586715c/attachment.html>


More information about the dmd-beta mailing list