linker wrapper

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Thu Nov 11 07:09:34 PST 2010


On 11/11/10 5:32 AM, Steven Schveighoffer wrote:
> On Thu, 11 Nov 2010 08:20:46 -0500, Denis Koroskin <2korden at gmail.com>
> wrote:
>
>> On Thu, 11 Nov 2010 15:54:50 +0300, Steven Schveighoffer
>> <schveiguy at yahoo.com> wrote:
>>
>>> Just saw another linker error in d.learn, and it got me thinking
>>>
>>> dmd just calls the linker, and the linker spits out link errors. But
>>> what if we had a 'linker wrapper' program which translated mangled
>>> names into demangled names? It would at least help people understand
>>> the problem better. How many times does a newbie come back and say "I
>>> have this problem, and dmd spits out some weird message I don't
>>> understand" and it takes a person who half-speaks mangled d names to
>>> understand what the name is.
>>>
>>> Given that D already includes a demangler, wouldn't it be rather
>>> trivial to write this program in D?
>>>
>>> I know it would make my life a bit better.
>>>
>>> Thoughts? Takers?
>>>
>>> -Steve
>>
>> I suggested that previously [1], and I think that need to be a part of
>> DMD for a simple reason: some of the names can't be demangled because
>> their are somewhat "hashed" to avoid limitations such as long literal
>> name. E.g. "_D4math6Mбrix9х44F32__T3addTCЂ–ЎZЂ„ќFЂ—ќЂ˜ґЂ—˜".
>
> Not sure we can do anything about that, if we're only giving dmd object
> files to work with.
>
> I think we need to implement something different in terms of 'hashing'.
> It's another idea I've had, but not sure if I've expressed it.
> Typically, you have things like this in a module:
>
> struct Y(T) {}
>
> struct X(T)
> {
> void foo(Y!T y) {...}
> }
>
> where this is in std.amodule. The seemingly small foo symbol gets
> exploded to the equivalent of:
>
> std.amodule.X!int.foo(std.amodule.Y!int)
>
> I see a lot of repetition in there. I think we can do some kind of
> lossless compression with name mangling so you represent repetetive
> symbols such as module names and type parameters as back references.
>
> These would also be demangleable.
>
>>
>> Given that dmd calls a linker internally, it could also retrieve
>> linker errors (if any present), translate and then show them, with a
>> list of suggestions to fix the problem if possible. Here are an example:
>>
>> module test1;
>> void foo() {}
>>
>> module test2;
>> import test1;
>> void main() { foo(); }
>>
>> #dmd test2.d
>>
>> Desired output: Error: No implementation found for method void foo()
>> defined in module test1. Try linking with test1.d
>> Actual output: Error 42: Symbol Undefined _D5test13fooFZv
>
> This would be cool too. BTW, does anyone know if the linkers used by DMD
> allow options to output easily-parsable errors?
>
> -Steve

Apparently gnu's ld demangles by default:

http://linux.die.net/man/1/ld

(Search for "demangle".) But it recognizes C++ mangling, not D mangling.


Andrei


More information about the Digitalmars-d mailing list