diff --git a/src/nvcore/Debug.cpp b/src/nvcore/Debug.cpp index 837e16e..c861a66 100644 --- a/src/nvcore/Debug.cpp +++ b/src/nvcore/Debug.cpp @@ -28,7 +28,7 @@ #endif #if NV_OS_LINUX && defined(HAVE_EXECINFO_H) -# include +# include // backtrace # if NV_CC_GNUC // defined(HAVE_CXXABI_H) # include # endif @@ -39,6 +39,13 @@ # include # include // sysctl # include +# undef HAVE_EXECINFO_H +# if defined(HAVE_EXECINFO_H) // only after OSX 10.5 +# include // backtrace +# if NV_CC_GNUC // defined(HAVE_CXXABI_H) +# include +# endif +# endif #endif #include // std::runtime_error @@ -128,6 +135,10 @@ namespace #if defined(HAVE_EXECINFO_H) // NV_OS_LINUX + static bool nvHasStackTrace() { + return backtrace != NULL; + } + static void nvPrintStackTrace(void * trace[], int size, int start=0) { char ** string_array = backtrace_symbols(trace, size); @@ -166,24 +177,36 @@ namespace static void * callerAddress(void * secret) { -# if NV_OS_DARWIN && NV_CPU_PPC - ucontext_t * ucp = (ucontext_t *)secret; - return (void *) ucp->uc_mcontext->ss.srr0; -# elif NV_OS_DARWIN && NV_CPU_X86 - ucontext_t * ucp = (ucontext_t *)secret; - return (void *) ucp->uc_mcontext->ss.eip; -# elif NV_CPU_X86_64 - // #define REG_RIP REG_INDEX(rip) // seems to be 16 - ucontext_t * ucp = (ucontext_t *)secret; - return (void *)ucp->uc_mcontext.gregs[REG_RIP]; -# elif NV_CPU_X86 - ucontext_t * ucp = (ucontext_t *)secret; - return (void *)ucp->uc_mcontext.gregs[14/*REG_EIP*/]; -# elif NV_CPU_PPC - ucontext_t * ucp = (ucontext_t *)secret; - return (void *) ucp->uc_mcontext.regs->nip; +# if NV_OS_DARWIN +# if defined(_STRUCT_MCONTEXT) +# if NV_CPU_PPC + ucontext_t * ucp = (ucontext_t *)secret; + return (void *) ucp->uc_mcontext->__ss.__srr0; +# elif NV_CPU_X86 + ucontext_t * ucp = (ucontext_t *)secret; + return (void *) ucp->uc_mcontext->__ss.__eip; +# endif +# else +# if NV_CPU_PPC + ucontext_t * ucp = (ucontext_t *)secret; + return (void *) ucp->uc_mcontext->ss.srr0; +# elif NV_CPU_X86 + ucontext_t * ucp = (ucontext_t *)secret; + return (void *) ucp->uc_mcontext->ss.eip; +# endif +# endif # else - return NULL; +# if NV_CPU_X86_64 + // #define REG_RIP REG_INDEX(rip) // seems to be 16 + ucontext_t * ucp = (ucontext_t *)secret; + return (void *)ucp->uc_mcontext.gregs[REG_RIP]; +# elif NV_CPU_X86 + ucontext_t * ucp = (ucontext_t *)secret; + return (void *)ucp->uc_mcontext.gregs[14/*REG_EIP*/]; +# elif NV_CPU_PPC + ucontext_t * ucp = (ucontext_t *)secret; + return (void *) ucp->uc_mcontext.regs->nip; +# endif # endif // How to obtain the instruction pointers in different platforms, from mlton's source code. @@ -228,17 +251,18 @@ namespace } # if defined(HAVE_EXECINFO_H) + if (nvHasStackTrace()) // in case of weak linking + { + void * trace[64]; + int size = backtrace(trace, 64); - void * trace[64]; - int size = backtrace(trace, 64); - - if (pnt != NULL) { - // Overwrite sigaction with caller's address. - trace[1] = pnt; + if (pnt != NULL) { + // Overwrite sigaction with caller's address. + trace[1] = pnt; + } + + nvPrintStackTrace(trace, size, 1); } - - nvPrintStackTrace(trace, size, 1); - # endif // defined(HAVE_EXECINFO_H) exit(0); @@ -373,9 +397,12 @@ namespace # endif # if defined(HAVE_EXECINFO_H) - void * trace[64]; - int size = backtrace(trace, 64); - nvPrintStackTrace(trace, size, 3); + if (nvHasStackTrace()) + { + void * trace[64]; + int size = backtrace(trace, 64); + nvPrintStackTrace(trace, size, 3); + } # endif // Exit cleanly. @@ -422,9 +449,12 @@ void NV_CDECL nvDebug(const char *msg, ...) void debug::dumpInfo() { #if !NV_OS_WIN32 && defined(HAVE_SIGNAL_H) && defined(HAVE_EXECINFO_H) - void * trace[64]; - int size = backtrace(trace, 64); - nvPrintStackTrace(trace, size, 1); + if (nvHasStackTrace()) + { + void * trace[64]; + int size = backtrace(trace, 64); + nvPrintStackTrace(trace, size, 1); + } #endif } diff --git a/src/nvcore/DefsGnucDarwin.h b/src/nvcore/DefsGnucDarwin.h index 1e6e41a..5442b79 100644 --- a/src/nvcore/DefsGnucDarwin.h +++ b/src/nvcore/DefsGnucDarwin.h @@ -2,8 +2,7 @@ #error "Do not include this file directly." #endif -#include // uint8_t, int8_t, ... - +#include // uint8_t, int8_t, ... // Function linkage #define DLL_IMPORT diff --git a/src/nvcore/DefsVcWin32.h b/src/nvcore/DefsVcWin32.h index 6149cbb..c025625 100644 --- a/src/nvcore/DefsVcWin32.h +++ b/src/nvcore/DefsVcWin32.h @@ -19,7 +19,9 @@ // Set standard function names. #define snprintf _snprintf -#define vsnprintf _vsnprintf +#if _MSC_VER < 1500 +# define vsnprintf _vsnprintf +#endif #define vsscanf _vsscanf #define chdir _chdir #define getcwd _getcwd diff --git a/src/nvcore/Prefetch.h b/src/nvcore/Prefetch.h index aa0bcfc..71bd0ed 100644 --- a/src/nvcore/Prefetch.h +++ b/src/nvcore/Prefetch.h @@ -24,7 +24,7 @@ __forceinline void nvPrefetch(const void * mem) #else // NV_CC_MSVC // do nothing in other case. -#define piPrefetch(ptr) +#define nvPrefetch(ptr) #endif // NV_CC_MSVC