On Thursday, 31 August 2017 at 02:31:24 UTC, Michael V. Franklin
wrote:
On Thursday, 31 August 2017 at 02:20:00 UTC, Arun
Chandrasekaran wrote:
Just a thought. Can dmd demangle the symbols before spitting
the output of ld to stderr?
dmd doesn't print the output of ld to stderr, ld does.
I believe binutils has some support for D symbol demangling
thanks to the GDC folks. I tried it once:
http://forum.dlang.org/post/[email protected]
So I think you need to find a way to pass --demangle=dlang to
ld.
Maybe `dmd program.d -L--demangle=dlang`?
Mike
Thanks Mike.
I was looking at src/ddmd/link.d, has the below that reads the
output of ld. So I was wondering if we can plugin the demangle
logic in this function. Nevertheless, good to know the linker
already supports it.
```
private int findNoMainError(int fd)
{
version (OSX)
{
static __gshared const(char)* nmeErrorMessage =
"\"__Dmain\", referenced from:";
}
else
{
static __gshared const(char)* nmeErrorMessage =
"undefined reference to `_Dmain'";
}
FILE* stream = fdopen(fd, "r");
if (stream is null)
return -1;
const(size_t) len = 64 * 1024 - 1;
char[len + 1] buffer; // + '\0'
size_t beg = 0, end = len;
bool nmeFound = false;
for (;;)
{
// read linker output
const(size_t) n = fread(&buffer[beg], 1, len - beg,
stream);
if (beg + n < len && ferror(stream))
return -1;
buffer[(end = beg + n)] = '\0';
// search error message, stop at last complete line
const(char)* lastSep = strrchr(buffer.ptr, '\n');
if (lastSep)
buffer[(end = lastSep - &buffer[0])] = '\0';
if (strstr(&buffer[0], nmeErrorMessage))
nmeFound = true;
if (lastSep)
buffer[end++] = '\n';
if (fwrite(&buffer[0], 1, end, stderr) < end)
return -1;
if (beg + n < len && feof(stream))
break;
// copy over truncated last line
memcpy(&buffer[0], &buffer[end], (beg = len - end));
}
return nmeFound ? 1 : 0;
}
```