X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Flogbacktrace_win.cpp;h=b12c15dc2e2fbc946cc41738e1d7deef81e1c3f8;hp=5c9a420cd5d542dce2459c3dadc31633d0a1f193;hb=7efb623a14099449d514df99a0b9b6de69acbb0f;hpb=c806d8e92f2ccbc2886ffe6257f7597e28c355dd diff --git a/src/common/logbacktrace_win.cpp b/src/common/logbacktrace_win.cpp index 5c9a420c..b12c15dc 100644 --- a/src/common/logbacktrace_win.cpp +++ b/src/common/logbacktrace_win.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 by the Quassel IRC Team * + * Copyright (C) 2005-09 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -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