Commit 6d679a7d by Iain Buclaw

libphobos: Merge upstream druntime 4b2674b3

Adds version (BacktraceExternal) for using libexecinfo instead of
internal implementation on FreeBSD, NetBSD, and DragonFly.

Reviewed-on: https://github.com/dlang/druntime/pull/2560

From-SVN: r270482
parent 42d3fe9a
70b9fea60246e63d936ad6826b1b48b6e0f1de8f 4b2674b36b1f6aac75db2a5aa38d67d4be55a987
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the dlang/druntime repository. merge done from the dlang/druntime repository.
...@@ -519,9 +519,8 @@ extern (C) bool runModuleUnitTests() ...@@ -519,9 +519,8 @@ extern (C) bool runModuleUnitTests()
{ {
static enum MAXFRAMES = 128; static enum MAXFRAMES = 128;
void*[MAXFRAMES] callstack; void*[MAXFRAMES] callstack;
int numframes;
numframes = backtrace( callstack.ptr, MAXFRAMES ); auto numframes = backtrace( callstack.ptr, MAXFRAMES );
backtrace_symbols_fd( callstack.ptr, numframes, 2 ); backtrace_symbols_fd( callstack.ptr, numframes, 2 );
} }
......
...@@ -9,15 +9,28 @@ ...@@ -9,15 +9,28 @@
module core.sys.dragonflybsd.execinfo; module core.sys.dragonflybsd.execinfo;
version (DragonFlyBSD): version (DragonFlyBSD):
extern (C):
nothrow:
extern (C) nothrow @system: version (GNU)
version = BacktraceExternal;
import core.sys.dragonflybsd.dlfcn; version (BacktraceExternal)
{
size_t backtrace(void**, size_t);
char** backtrace_symbols(const(void*)*, size_t);
void backtrace_symbols_fd(const(void*)*, size_t, int);
char** backtrace_symbols_fmt(const(void*)*, size_t, const char*);
int backtrace_symbols_fd_fmt(const(void*)*, size_t, int, const char*);
}
else
{
import core.sys.dragonflybsd.dlfcn;
// Use extern (D) so that these functions don't collide with libexecinfo. // Use extern (D) so that these functions don't collide with libexecinfo.
extern (D) int backtrace(void** buffer, int size) extern (D) int backtrace(void** buffer, int size)
{ {
import core.thread : thread_stackBottom; import core.thread : thread_stackBottom;
void** p, pend=cast(void**)thread_stackBottom(); void** p, pend=cast(void**)thread_stackBottom();
...@@ -37,11 +50,11 @@ extern (D) int backtrace(void** buffer, int size) ...@@ -37,11 +50,11 @@ extern (D) int backtrace(void** buffer, int size)
p = pnext; p = pnext;
} }
return i; return i;
} }
extern (D) char** backtrace_symbols(const(void*)* buffer, int size) extern (D) char** backtrace_symbols(const(void*)* buffer, int size)
{ {
static void* realloc(void* p, size_t len) nothrow static void* realloc(void* p, size_t len) nothrow
{ {
static import cstdlib=core.stdc.stdlib; static import cstdlib=core.stdc.stdlib;
...@@ -80,11 +93,11 @@ extern (D) char** backtrace_symbols(const(void*)* buffer, int size) ...@@ -80,11 +93,11 @@ extern (D) char** backtrace_symbols(const(void*)* buffer, int size)
p[i] = cast(char*)p + pos; p[i] = cast(char*)p + pos;
} }
return p; return p;
} }
extern (D) void backtrace_symbols_fd(const(void*)* buffer, int size, int fd) extern (D) void backtrace_symbols_fd(const(void*)* buffer, int size, int fd)
{ {
import core.sys.posix.unistd : write; import core.sys.posix.unistd : write;
import core.stdc.stdlib : alloca; import core.stdc.stdlib : alloca;
...@@ -109,20 +122,20 @@ extern (D) void backtrace_symbols_fd(const(void*)* buffer, int size, int fd) ...@@ -109,20 +122,20 @@ extern (D) void backtrace_symbols_fd(const(void*)* buffer, int size, int fd)
p[len - 1] = '\n'; p[len - 1] = '\n';
write(fd, p, len); write(fd, p, len);
} }
} }
private void fixupDLInfo(const(void)* addr, ref Dl_info info) private void fixupDLInfo(const(void)* addr, ref Dl_info info)
{ {
if (info.dli_fname is null) info.dli_fname = "???"; if (info.dli_fname is null) info.dli_fname = "???";
if (info.dli_fbase is null) info.dli_fbase = null; if (info.dli_fbase is null) info.dli_fbase = null;
if (info.dli_sname is null) info.dli_sname = "???"; if (info.dli_sname is null) info.dli_sname = "???";
if (info.dli_saddr is null) info.dli_saddr = cast(void*)addr; if (info.dli_saddr is null) info.dli_saddr = cast(void*)addr;
} }
private size_t formatStackFrame(char* p, size_t plen, const(void)* addr, const ref Dl_info info) private size_t formatStackFrame(char* p, size_t plen, const(void)* addr, const ref Dl_info info)
{ {
import core.stdc.stdio : snprintf; import core.stdc.stdio : snprintf;
immutable off = addr - info.dli_saddr; immutable off = addr - info.dli_saddr;
...@@ -130,4 +143,5 @@ private size_t formatStackFrame(char* p, size_t plen, const(void)* addr, const r ...@@ -130,4 +143,5 @@ private size_t formatStackFrame(char* p, size_t plen, const(void)* addr, const r
addr, info.dli_sname, off, info.dli_fname); addr, info.dli_sname, off, info.dli_fname);
assert(len > 0); assert(len > 0);
return cast(size_t)len + 1; // + '\0' return cast(size_t)len + 1; // + '\0'
}
} }
...@@ -12,12 +12,25 @@ version (FreeBSD): ...@@ -12,12 +12,25 @@ version (FreeBSD):
extern (C): extern (C):
nothrow: nothrow:
import core.sys.freebsd.dlfcn; version (GNU)
version = BacktraceExternal;
// Use extern (D) so that these functions don't collide with libexecinfo. version (BacktraceExternal)
{
extern (D) int backtrace(void** buffer, int size) size_t backtrace(void**, size_t);
char** backtrace_symbols(const(void*)*, size_t);
void backtrace_symbols_fd(const(void*)*, size_t, int);
char** backtrace_symbols_fmt(const(void*)*, size_t, const char*);
int backtrace_symbols_fd_fmt(const(void*)*, size_t, int, const char*);
}
else
{ {
import core.sys.freebsd.dlfcn;
// Use extern (D) so that these functions don't collide with libexecinfo.
extern (D) int backtrace(void** buffer, int size)
{
import core.thread : thread_stackBottom; import core.thread : thread_stackBottom;
void** p, pend=cast(void**)thread_stackBottom(); void** p, pend=cast(void**)thread_stackBottom();
...@@ -37,11 +50,11 @@ extern (D) int backtrace(void** buffer, int size) ...@@ -37,11 +50,11 @@ extern (D) int backtrace(void** buffer, int size)
p = pnext; p = pnext;
} }
return i; return i;
} }
extern (D) char** backtrace_symbols(const(void*)* buffer, int size) extern (D) char** backtrace_symbols(const(void*)* buffer, int size)
{ {
static void* realloc(void* p, size_t len) nothrow static void* realloc(void* p, size_t len) nothrow
{ {
static import cstdlib=core.stdc.stdlib; static import cstdlib=core.stdc.stdlib;
...@@ -80,11 +93,11 @@ extern (D) char** backtrace_symbols(const(void*)* buffer, int size) ...@@ -80,11 +93,11 @@ extern (D) char** backtrace_symbols(const(void*)* buffer, int size)
p[i] = cast(char*)p + pos; p[i] = cast(char*)p + pos;
} }
return p; return p;
} }
extern (D) void backtrace_symbols_fd(const(void*)* buffer, int size, int fd) extern (D) void backtrace_symbols_fd(const(void*)* buffer, int size, int fd)
{ {
import core.sys.posix.unistd : write; import core.sys.posix.unistd : write;
import core.stdc.stdlib : alloca; import core.stdc.stdlib : alloca;
...@@ -109,20 +122,20 @@ extern (D) void backtrace_symbols_fd(const(void*)* buffer, int size, int fd) ...@@ -109,20 +122,20 @@ extern (D) void backtrace_symbols_fd(const(void*)* buffer, int size, int fd)
p[len - 1] = '\n'; p[len - 1] = '\n';
write(fd, p, len); write(fd, p, len);
} }
} }
private void fixupDLInfo(const(void)* addr, ref Dl_info info) private void fixupDLInfo(const(void)* addr, ref Dl_info info)
{ {
if (info.dli_fname is null) info.dli_fname = "???"; if (info.dli_fname is null) info.dli_fname = "???";
if (info.dli_fbase is null) info.dli_fbase = null; if (info.dli_fbase is null) info.dli_fbase = null;
if (info.dli_sname is null) info.dli_sname = "???"; if (info.dli_sname is null) info.dli_sname = "???";
if (info.dli_saddr is null) info.dli_saddr = cast(void*)addr; if (info.dli_saddr is null) info.dli_saddr = cast(void*)addr;
} }
private size_t formatStackFrame(char* p, size_t plen, const(void)* addr, const ref Dl_info info) private size_t formatStackFrame(char* p, size_t plen, const(void)* addr, const ref Dl_info info)
{ {
import core.stdc.stdio : snprintf; import core.stdc.stdio : snprintf;
immutable off = addr - info.dli_saddr; immutable off = addr - info.dli_saddr;
...@@ -130,4 +143,5 @@ private size_t formatStackFrame(char* p, size_t plen, const(void)* addr, const r ...@@ -130,4 +143,5 @@ private size_t formatStackFrame(char* p, size_t plen, const(void)* addr, const r
addr, info.dli_sname, off, info.dli_fname); addr, info.dli_sname, off, info.dli_fname);
assert(len > 0); assert(len > 0);
return cast(size_t)len + 1; // + '\0' return cast(size_t)len + 1; // + '\0'
}
} }
...@@ -12,12 +12,25 @@ version (NetBSD): ...@@ -12,12 +12,25 @@ version (NetBSD):
extern (C): extern (C):
nothrow: nothrow:
import core.sys.netbsd.dlfcn; version (GNU)
version = BacktraceExternal;
// Use extern (D) so that these functions don't collide with libexecinfo. version (BacktraceExternal)
{
extern (D) int backtrace(void** buffer, int size) size_t backtrace(void**, size_t);
char** backtrace_symbols(const(void*)*, size_t);
void backtrace_symbols_fd(const(void*)*, size_t, int);
char** backtrace_symbols_fmt(const(void*)*, size_t, const char*);
int backtrace_symbols_fd_fmt(const(void*)*, size_t, int, const char*);
}
else
{ {
import core.sys.netbsd.dlfcn;
// Use extern (D) so that these functions don't collide with libexecinfo.
extern (D) int backtrace(void** buffer, int size)
{
import core.thread : thread_stackBottom; import core.thread : thread_stackBottom;
void** p, pend=cast(void**)thread_stackBottom(); void** p, pend=cast(void**)thread_stackBottom();
...@@ -37,11 +50,11 @@ extern (D) int backtrace(void** buffer, int size) ...@@ -37,11 +50,11 @@ extern (D) int backtrace(void** buffer, int size)
p = pnext; p = pnext;
} }
return i; return i;
} }
extern (D) char** backtrace_symbols(const(void*)* buffer, int size) extern (D) char** backtrace_symbols(const(void*)* buffer, int size)
{ {
static void* realloc(void* p, size_t len) nothrow static void* realloc(void* p, size_t len) nothrow
{ {
static import cstdlib=core.stdc.stdlib; static import cstdlib=core.stdc.stdlib;
...@@ -80,11 +93,11 @@ extern (D) char** backtrace_symbols(const(void*)* buffer, int size) ...@@ -80,11 +93,11 @@ extern (D) char** backtrace_symbols(const(void*)* buffer, int size)
p[i] = cast(char*)p + pos; p[i] = cast(char*)p + pos;
} }
return p; return p;
} }
extern (D) void backtrace_symbols_fd(const(void*)* buffer, int size, int fd) extern (D) void backtrace_symbols_fd(const(void*)* buffer, int size, int fd)
{ {
import core.sys.posix.unistd : write; import core.sys.posix.unistd : write;
import core.stdc.stdlib : alloca; import core.stdc.stdlib : alloca;
...@@ -109,20 +122,20 @@ extern (D) void backtrace_symbols_fd(const(void*)* buffer, int size, int fd) ...@@ -109,20 +122,20 @@ extern (D) void backtrace_symbols_fd(const(void*)* buffer, int size, int fd)
p[len - 1] = '\n'; p[len - 1] = '\n';
write(fd, p, len); write(fd, p, len);
} }
} }
private void fixupDLInfo(const(void)* addr, ref Dl_info info) private void fixupDLInfo(const(void)* addr, ref Dl_info info)
{ {
if (info.dli_fname is null) info.dli_fname = "???"; if (info.dli_fname is null) info.dli_fname = "???";
if (info.dli_fbase is null) info.dli_fbase = null; if (info.dli_fbase is null) info.dli_fbase = null;
if (info.dli_sname is null) info.dli_sname = "???"; if (info.dli_sname is null) info.dli_sname = "???";
if (info.dli_saddr is null) info.dli_saddr = cast(void*)addr; if (info.dli_saddr is null) info.dli_saddr = cast(void*)addr;
} }
private size_t formatStackFrame(char* p, size_t plen, const(void)* addr, const ref Dl_info info) private size_t formatStackFrame(char* p, size_t plen, const(void)* addr, const ref Dl_info info)
{ {
import core.stdc.stdio : snprintf; import core.stdc.stdio : snprintf;
immutable off = addr - info.dli_saddr; immutable off = addr - info.dli_saddr;
...@@ -130,4 +143,5 @@ private size_t formatStackFrame(char* p, size_t plen, const(void)* addr, const r ...@@ -130,4 +143,5 @@ private size_t formatStackFrame(char* p, size_t plen, const(void)* addr, const r
addr, info.dli_sname, off, info.dli_fname); addr, info.dli_sname, off, info.dli_fname);
assert(len > 0); assert(len > 0);
return cast(size_t)len + 1; // + '\0' return cast(size_t)len + 1; // + '\0'
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment