digitalmars.D.bugs - [Issue 21120] New: Inconsistent mangling of __init symbol
- d-bugmail puremagic.com (58/60) Aug 05 2020 https://issues.dlang.org/show_bug.cgi?id=21120
https://issues.dlang.org/show_bug.cgi?id=21120 Issue ID: 21120 Summary: Inconsistent mangling of __init symbol Product: D Version: D2 Hardware: All OS: All Status: NEW Severity: major Priority: P1 Component: dmd Assignee: nobody puremagic.com Reporter: johanengelen weka.io Testcase: File three.d: ``` module one.two.three; StructTemplate!B instatiation; struct B { } struct StructTemplate(Opts) { void foo() { someTemplate!StructTemplate(); } } template someTemplate(T) { pragma(msg, "_D" ~ T.mangleof[1..$] ~ "6__initZ"); pragma(mangle, "_D" ~ T.mangleof[1..$] ~ "6__initZ") extern immutable typeof(T.init) initializer; void someTemplate() { auto ptr = &initializer; } } ```dmd -of=/tmp/wrongmangle.o -c three.doutput: _D3one3two5three__T14StructTemplateTSQBjQBiQBh1BZQBe6__initZnm /tmp/wrongmangle.o | grep ".*StructTemplate.*__initZ"outputs: 0000000000000270 S __D3one3two5three__T14StructTemplateTS3oneQBjQBi1BZQBf6__initZ U __D3one3two5three__T14StructTemplateTSQBjQBiQBh1BZQBe6__initZ 00000000000001b8 S __D60TypeInfo_S3one3two5three__T14StructTemplateTSQBjQBiQBh1BZQBe6__initZ As you can see there is an undefined symbol: the one that we defined using pragma(mangle). The mangling is just slightly off to what the compiler defines. Note that the defined symbol `__D3one3two5three__T14StructTemplateTS3oneQBjQBi1BZQBf6__initZ` contains "one" twice. Somehow, the repeated identifier detection/encoding does not work. It _does_ work for the TypeInfo symbol (and all other symbols related to `StructTemplate!B`. This inconsistency between `T.mangleof` and the init symbol mangling is a blocker for implementing a druntime hack to access the init symbol similar to this article: http://dpldocs.info/this-week-in-d/Blog.Posted_2020_07_27.html#zero-runtime-classes --
Aug 05 2020