On Wednesday, 14 January 2015 at 08:42:55 UTC, Iain Buclaw via
D.gnu wrote:
On 14 January 2015 at 04:00, Mike via D.gnu
<d.gnu@puremagic.com> wrote:
On Tuesday, 13 January 2015 at 14:36:15 UTC, Dicebot wrote:
I remember speaking about it with Martin and Daniel during
DConf 2014 and
I think it was Daniel who mentioned that by default
TypeInfo/ModuleInfo is
emitted in some weird packed way. When LDC announced using
--gc-sections by
default it was mentioned they had to change ModuleInfo
emitting to make it
actually work.
Can it be the same issue?
Thanks, Dicebot, for bringing this to my attention. That would
explain what I'm seeing.
Is this something unique to GDC, or is it an artifact inherited
from DMD?
Mike
It's an artifact inherited from DMD.
ModuleInfo is of a dynamic size, depending on what is
implemented in the module.
See:
https://github.com/D-Programming-Language/druntime/blob/081591237ee7d666ffd81463dac1b7f38e7d9798/src/object_.d#L1589
However it's size is correctly recorded before being sent to be
written.
The ModuleInfo symbols themselves aren't put into any particular
section, they also can't go in rodata because of how the D
runtime
start-up works, so they end up in the same section as __gshared
data.
The same is also true with TypeInfo_Class (alias ClassInfo)
where
interface vtables are written packed immediately after the data
structure ends. Again, it's size is treated as dynamic and is
correctly recorded before being written, and again it cannot be
in
rodata because the __monitor field is directly written to.
Ok, but I have a mess of classes generated by templates (and I
love it). Their `name` properties [1] should go in .rodata,
right? But why aren't they being put in their own sections when
compiling with -fdata-sections?
[1] -
https://github.com/D-Programming-GDC/GDC/blob/master/libphobos/libdruntime/object_.d#L81
Mike