All functions COMDAT on OSX

bitwise via Digitalmars-d digitalmars-d at puremagic.com
Mon Nov 16 09:59:13 PST 2015


On Monday, 16 November 2015 at 17:09:05 UTC, Marc Schütz wrote:
> On Monday, 16 November 2015 at 14:37:33 UTC, bitwise wrote:
>> On Monday, 16 November 2015 at 08:15:39 UTC, Walter Bright 
>> wrote:
>>> On 11/15/2015 8:44 PM, bitwise wrote:
>>>> https://issues.dlang.org/show_bug.cgi?id=15342
>>>>
>>>> DMD emits all functions as COMDAT on OSX.
>>>>
>>>> I'm guessing this was originally a workaround of some 
>>>> kind...does anybody know
>>>> the story?
>>>>
>>>> Thanks,
>>>>      Bit
>>>
>>> It enables:
>>>
>>> 1. the linker to remove duplicates (happens with templates 
>>> and other things)
>>> 2. the linker to remove unreferenced COMDATs
>>
>> I understand what it's for, but it's incorrect behaviour to 
>> have _all_ functions being emitted as comdat. Non-template 
>> functions shouldn't be coalesced in this way. If you compile 
>> the code example in the bug report with *any* compiler other 
>> than DMD/OSX, the example will fail as described, with a 
>> linker error. The example compares dmd/osx with gcc/osx, but 
>> the code will also fail with ldc/osx. And although I don't 
>> have time to check, I'm pretty sure it will fail with dmd/win 
>> as well.
>>
>> If you look at the code I cited, this is obviously a hack:
>>
>> <glue.c#L866-L870>
>> [...]
>> #if TARGET_OSX
>>     s->Sclass = SCcomdat;
>> #else
>>     s->Sclass = SCglobal;
>> #endif
>>     for (Dsymbol *p = fd->parent; p; p = p->parent) {
>>         if (p->isTemplateInstance()) {
>>             s->Sclass = SCcomdat;
>>             break;
>>         }
>>     }
>> [...]
>
> FWIW, that's been in the source since somewhen between 2.025 
> and 2.026:
> https://github.com/D-Programming-Language/dmd/commit/00337ef8d8c4c1c08da68f95963e2fe1658a49ec
>
> Unfortunately there are no intermediate commits in the repo, 
> because only released versions have been imported during the 
> switch to Git.

Yeah... I'm wondering how much chaos it would cause to fix this, 
because it's a blocking issue for fixing shared libs on OSX.

To support shared libraries, I'de have to add a unique linux 
style global ctor/dtor to each module. LDC already does this. 
There is no alternative solution.

I could special case the ctor/dtors in DMD not to be COMDAT, but 
the effect would be the same as fixing the bug anyways, which 
would be that people would get linker errors if they linked(or 
are currently linking) the same module multiple times in their 
binary.

This breakage is necessary to implement shared libraries, and 
facilitate proper linking behaviour.

     Bit



More information about the Digitalmars-d mailing list