X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Flogbacktrace_win.cpp;h=b12c15dc2e2fbc946cc41738e1d7deef81e1c3f8;hp=31d1f957acb99f382bdcc72aed1b3b8f0b724589;hb=7efb623a14099449d514df99a0b9b6de69acbb0f;hpb=f824db0e31b54969e0b7fa0b5405b1e9173d482c diff --git a/src/common/logbacktrace_win.cpp b/src/common/logbacktrace_win.cpp index 31d1f957..b12c15dc 100644 --- a/src/common/logbacktrace_win.cpp +++ b/src/common/logbacktrace_win.cpp @@ -49,7 +49,7 @@ struct EnumModulesContext { EnumModulesContext(HANDLE hProcess, QTextStream &stream) : hProcess(hProcess), stream(stream) {} }; -BOOL CALLBACK EnumModulesCB(PCTSTR ModuleName, DWORD64 BaseOfDll, PVOID UserContext) { +BOOL CALLBACK EnumModulesCB(LPCSTR ModuleName, DWORD64 BaseOfDll, PVOID UserContext) { IMAGEHLP_MODULE64 mod; EnumModulesContext *context = (EnumModulesContext *)UserContext; mod.SizeOfStruct = sizeof(IMAGEHLP_MODULE64); @@ -70,14 +70,12 @@ BOOL CALLBACK EnumModulesCB(PCTSTR ModuleName, DWORD64 BaseOfDll, PVOID UserCont return TRUE; } -// we don't use the ModuleName anyways so we can easily "convert" this -inline BOOL CALLBACK EnumModulesCB(PSTR ModuleName, DWORD64 BaseOfDll, PVOID UserContext) { - return EnumModulesCB(PCTSTR(0), BaseOfDll, UserContext); -} -#ifdef _M_IX86 + +#if defined( _M_IX86 ) && defined(Q_CC_MSVC) // Disable global optimization and ignore /GS waning caused by // inline assembly. + // not needed with mingw cause we can tell mingw which registers we use #pragma optimize("g", off) #pragma warning(push) #pragma warning(disable : 4748) @@ -90,13 +88,26 @@ void Quassel::logBacktrace(const QString &filename) { #ifdef _M_IX86 ZeroMemory(&Context, sizeof(CONTEXT)); Context.ContextFlags = CONTEXT_CONTROL; - __asm { + + +#ifdef __MINGW32__ + asm("Label:\n\t" + "movl %%ebp,%0;\n\t" + "movl %%esp,%1;\n\t" + "movl $Label,%%eax;\n\t" + "movl %%eax,%2;\n\t" + :"=r"(Context.Ebp),"=r"(Context.Esp),"=r"(Context.Eip) + ://no input + :"eax"); +#else + _asm { Label: mov [Context.Ebp], ebp; mov [Context.Esp], esp; mov eax, [Label]; mov [Context.Eip], eax; } +#endif #else RtlCaptureContext(&Context); #endif @@ -202,7 +213,7 @@ void Quassel::logBacktrace(const QString &filename) { logFile.close(); } -#ifdef _M_IX86 +#if defined(_M_IX86) && defined(Q_CC_MSVC) #pragma warning(pop) #pragma optimize("g", on) #endif