[dmd-beta] dmd 1.070 and 2.055 beta

Sönke Ludwig ludwig at informatik.uni-luebeck.de
Tue Sep 6 05:40:18 PDT 2011


It's getting more interesting... it works fine if the DLL is loaded from
a D application - loading it from a C++ application (compiled with MSVS
2010) will fail with the exception.

I've uploaded a zip file [1] with the dllmain and the LLVM DLL, a D test
program and the failing C++ project for VS 2010.

The build.cmd builds the DLL and the D test project using equivalent
flags as for the full project, although the flags do not seem to matter.

I will try to see if the LLVM DLL can somehow be ruled out of the
equation when I get some time later.

[1] http://netload.in/dateiuknS5rMdiL/linkproblem.zip.htm


Am 06.09.2011 09:14, schrieb Rainer Schuetze:
>
> With the call LLVMInitializeX86TargetInfo, the llvm DLL will be
> initialized before DllMain of your DLL is called. I could not find a
> matching DLL in the LLVM binary distribution. I guess you have built
> it yourself. Could you provide it for download somewhere?
>
> On 06.09.2011 07:52, 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

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


More information about the dmd-beta mailing list