demangle tool

Andrei Alexandrescu SeeWebsiteForEmail at erdani.org
Thu Apr 9 13:40:36 PDT 2009


I wrote a simple utility (at the bottom of this message) that may help 
debugging link-time errors. It reads lines from stdin and writes them 
with DMD symbols, if any, demangled.

For example, here's what you see if you add "alias field this;" to Tuple 
in std.typecons and try to build the "new, new" Phobos:

obj/posix/debug/unittest/std/file.o: In function 
`_D3std4file14__T5slurpTiTdZ5slurpFAyaxAaZAS3std8typecons14__T5TupleTiTdZ5Tuple':
/home/andrei/code/dmd/phobos/std/file.d:1772: undefined reference to 
`_D3std8typecons14__T5TupleTiTdZ5Tuple6__initZ'
/home/andrei/code/dmd/phobos/std/file.d:1781: undefined reference to 
`_D3std5array51__T8AppenderTAS3std8typecons14__T5TupleTiTdZ5TupleZ8Appender3putMFxS3std8typecons14__T5TupleTiTdZ5TupleZv'
obj/posix/debug/unittest/std/file.o: In function 
`_D3std5array88__T8appenderTAS3std8typecons14__T5TupleTiTdZ5TupleTS3std8typecons14__T5TupleTiTdZ5TupleZ8appenderFPAS3std8typecons14__T5TupleTiTdZ5TupleZS3std5array51__T8AppenderTAS3std8typecons14__T5TupleTiTdZ5TupleZ8Appender':
/home/andrei/code/dmd/phobos/std/array.d:578: undefined reference to 
`_D3std5array51__T8AppenderTAS3std8typecons14__T5TupleTiTdZ5TupleZ8Appender6__ctorMFNcPAS3std8typecons14__T5TupleTiTdZ5TupleZS3std5array51__T8AppenderTAS3std8typecons14__T5TupleTiTdZ5TupleZ8Appender'
obj/posix/debug/unittest/std/file.o: In function 
`_D3std8typecons14__T5tupleTiTdZ5tupleFidZS3std8typecons14__T5TupleTiTdZ5Tuple':
/home/andrei/code/dmd/phobos/std/typecons.d:515: undefined reference to 
`_D3std8typecons14__T5TupleTiTdZ5Tuple6__initZ'
collect2: ld returned 1 exit status
--- errorlevel 1

However, if you use "make |& ./demangle.d", you see:

obj/posix/debug/unittest/std/file.o: In function `struct 
std.typecons.Tuple!(int, double).Tuple[] std.file.slurp!(int, 
double).slurp(immutable(char)[], const(char[]))':
/home/andrei/code/dmd/phobos/std/file.d:1772: undefined reference to `Z 
std.typecons.Tuple!(int, double).Tuple.__init'
/home/andrei/code/dmd/phobos/std/file.d:1781: undefined reference to 
`void std.array.Appender!(struct std.typecons.Tuple!(int, 
double).Tuple[]).Appender.put(const(struct std.typecons.Tuple!(int, 
double).Tuple))'
obj/posix/debug/unittest/std/file.o: In function `struct 
std.array.Appender!(struct std.typecons.Tuple!(int, 
double).Tuple[]).Appender std.array.appender!(struct 
std.typecons.Tuple!(int, double).Tuple[], struct 
std.typecons.Tuple!(int, double).Tuple).appender(struct 
std.typecons.Tuple!(int, double).Tuple[]*)':
/home/andrei/code/dmd/phobos/std/array.d:578: undefined reference to 
`_D3std5array51__T8AppenderTAS3std8typecons14__T5TupleTiTdZ5TupleZ8Appender6__ctorMFNcPAS3std8typecons14__T5TupleTiTdZ5TupleZS3std5array51__T8AppenderTAS3std8typecons14__T5TupleTiTdZ5TupleZ8Appender'
obj/posix/debug/unittest/std/file.o: In function `struct 
std.typecons.Tuple!(int, double).Tuple std.typecons.tuple!(int, 
double).tuple(int, double)':
/home/andrei/code/dmd/phobos/std/typecons.d:515: undefined reference to 
`Z std.typecons.Tuple!(int, double).Tuple.__init'
collect2: ld returned 1 exit status
--- errorlevel 1
make: *** [obj/posix/debug/unittest/std/file] Error 1

The line wraps are all garbled, but you get the idea: all symbols quoted 
`like this' have been demangled appropriately. Below is the source of 
the demangle script:

#!/home/andrei/bin/rdmd
import std.algorithm, std.demangle, std.getopt, std.stdio;

void main(string[] args)
{
     string lSep = "`", rSep = "'";
     getopt(args, "lsep", &lSep, "rsep", &rSep);
     foreach (line; stdin.byLine())
     {
         auto sym = find(line, lSep);
         if (!sym.length)
         {
             writeln(line);
             continue;
         }
         sym = sym[1 .. $];
         auto before = line[0 .. $ - sym.length];
         sym = sym[0 .. $ - find(sym, rSep).length];
         auto after = line[before.length + sym.length .. $];
         writeln(before, demangle(sym.idup), after);
     }
}


Hope this helps someone,

Andrei



More information about the Digitalmars-d mailing list