Am Thu, 15 Jan 2015 11:51:41 +0000
schrieb "Mike" <[email protected]>:
> On Thursday, 15 January 2015 at 11:42:31 UTC, Dicebot wrote:
> >
> > Random guess: can it possibly confuse template-based variadics
> > with runtime variadics? Latter require RTTI to work. If
> > something like that happens it is surely a bug.
> >
>
> Thanks for the reply. I have to apologize for the last post, as
> I didn't fully reduce the code, and posted prematurely.
>
> Here's a further reduction without any templates or variadics, so
> I'm under the impression that neither templates nor variadics are
> contributing to the problem.
>
> The following code won't execute, but it will reproduce the
> problem at hand: Inflating .rodata with TypeInfo.name.
>
> test.d
> **************************************
> void write(in string text) nothrow {}
>
> final abstract class TestClass1 { }
>
> final abstract class TestClass2 { }
> final abstract class TestClass3 { }
> final abstract class TestClass4 { }
> final abstract class TestClass5 { }
> final abstract class TestClass6 { }
> final abstract class TestClass7 { }
> final abstract class TestClass8 { }
> final abstract class TestClass9 { }
>
> extern(C) void main()
> {
> write("");
> }
>
> compile with:
> gdc -static -frelease -fno-emit-moduleinfo -nophoboslib -nostdlib
> test.d --entry=main -ffunction-sections -fdata-sections
> -Wl,--gc-sections -o test
>
>
> objdump -s -j .rodata test
> *************************************
> Contents of section .rodata:
> 400152 74657374 2e546573 74436c61 73733100 test.TestClass1.
> 400162 74657374 2e546573 74436c61 73733200 test.TestClass2.
> 400172 74657374 2e546573 74436c61 73733300 test.TestClass3.
> 400182 74657374 2e546573 74436c61 73733400 test.TestClass4.
> 400192 74657374 2e546573 74436c61 73733500 test.TestClass5.
> 4001a2 74657374 2e546573 74436c61 73733600 test.TestClass6.
> 4001b2 74657374 2e546573 74436c61 73733700 test.TestClass7.
> 4001c2 74657374 2e546573 74436c61 73733800 test.TestClass8.
> 4001d2 74657374 2e546573 74436c61 73733900 test.TestClass9.
>
>
>
> Interestingly, if I change the argument to `write` from a string
> to a char, all is good.
>
> test.d
> **************************************
> void write(in char text) nothrow {}
>
> final abstract class TestClass1 { }
>
> final abstract class TestClass2 { }
> final abstract class TestClass3 { }
> final abstract class TestClass4 { }
> final abstract class TestClass5 { }
> final abstract class TestClass6 { }
> final abstract class TestClass7 { }
> final abstract class TestClass8 { }
> final abstract class TestClass9 { }
>
> extern(C) void main()
> {
> write(' ');
> }
>
> objdump -s -j .rodata test
> **************************************
> objdump: section '.rodata' mentioned in a -j option, but not
> found in any input file
>
> I guess all I'm really showing is how little I understand about
> this problem. Again, I ask for help.
>
> Mike
The char is probably not placed in rodata but reproduced in some other
way (hardcoded instruction with literal or whatever). This matches the
theory in my other reply.