From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:34859) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RFva9-0000MM-JS for qemu-devel@nongnu.org; Mon, 17 Oct 2011 18:22:54 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RFva8-0005WN-AL for qemu-devel@nongnu.org; Mon, 17 Oct 2011 18:22:53 -0400 Received: from mail.mc.net ([209.172.128.24]:49512) by eggs.gnu.org with smtp (Exim 4.71) (envelope-from ) id 1RFva8-0005WF-4u for qemu-devel@nongnu.org; Mon, 17 Oct 2011 18:22:52 -0400 Message-ID: <4E9CAACE.4070804@mc.net> Date: Mon, 17 Oct 2011 17:23:10 -0500 From: Bob Breuer MIME-Version: 1.0 References: <4E9BB180.6080506@mc.net> <4E9C0497.2000605@siriusit.co.uk> <4E9C3703.3040109@mc.net> <4E9C645A.5060200@twiddle.net> <4E9C9C08.20001@mc.net> In-Reply-To: Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] gcc auto-omit-frame-pointer vs msvc longjmp List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Kai Tietz Cc: "gcc@gcc.gnu.org" , Richard Henderson , qemu-devel , Mark Cave-Ayland Kai Tietz wrote: > 2011/10/17 Bob Breuer : >> Richard Henderson wrote: >>> On 10/17/2011 07:09 AM, Bob Breuer wrote: >>>> I don't think this is a free/g_free issue. If I use the following >>>> patch, then I at least get the openbios messages: >>>> >>>> diff --git a/cpu-exec.c b/cpu-exec.c >>>> index a9fa608..dfbd6ea 100644 >>>> --- a/cpu-exec.c >>>> +++ b/cpu-exec.c >>>> @@ -180,6 +180,7 @@ static void cpu_handle_debug_exception(CPUState >>>> /* main execution loop */ >>>> >>>> volatile sig_atomic_t exit_request; >>>> +register void *ebp asm("ebp"); >>>> >>>> int cpu_exec(CPUState *env) >>>> { >>>> @@ -233,6 +234,8 @@ int cpu_exec(CPUState *env) >>>> >>>> /* prepare setjmp context for exception handling */ >>>> for(;;) { >>>> + int dummy = 0; >>>> + ebp = &dummy; >>> See if >>> >>> asm("" : : : "ebp"); >>> >>> also solves the problem. >> No, that doesn't fix it. >> >>>> Google finds a mention of longjmp failing with -fomit-frame-pointer: >>>> http://lua-users.org/lists/lua-l/2005-02/msg00158.html >>>> >>>> Looks like gcc 4.6 turns on -fomit-frame-pointer by default. >>> Hmm. This is the first I've heard of a longjmp implementation >>> failing without a frame pointer. Presumably this is with the >>> mingw i.e. msvc libc? >> Yeah, mingw from www.mingw.org which I believe uses msvcrt.dll, package >> gcc-core-4.6.1-2-mingw32-bin. >> >>> This is something that could be worked around in gcc, I suppose. >>> We recognize longjmp for some things, we could force the use of >>> a frame pointer for msvc targets too. >>> >>> For now it might be best to simply force -fno-omit-frame-pointer >>> for mingw host in the configure script. >> Here's a testcase that crashes on the longjmp: >> >> #include >> #include >> >> jmp_buf env; >> >> int test(void) >> { >> int i; >> >> asm("xor %%ebp,%%ebp" ::: "ebp"); >> >> i = setjmp(env); >> printf("i = %d\n", i); >> >> if (i == 0) >> longjmp(env, 2); >> >> return i; >> } >> >> int main(void) >> { >> return test(); >> } >> >> Remove the asm statement to make it not crash. Obviously with >> omit-frame-pointer, gcc can shove anything into ebp. >> >> Bob > > This crash isn'r related to ebp existing, or not. The issue is the > hidden argument of setjmp, which is missing. If you can try the > following at top of file after include section. > > #define setjmp(BUF) _setjmpex((BUF), NULL) > int __cdecl __attribute__ ((__nothrow__,__returns_twice__)) > _setjmp3(jmp_buf _Buf, void *_Ctx); > ... Did you mean _setjmp3 instead of _setjmpex? With _setjmp3, it works without the asm, but still crashes if I zero out ebp before the setjmp. Aren't the function arguments on the stack anyway? > > This will work as expected with or without omit-frame-pointer. > > The issue is that setjmp has a second (undocumented as usual) > argument, which has a meaning. So why does my testcase above fail with the asm, but work without the asm statement? Compile it with gcc -O2 and try it yourself. > > Regards, > Kai > > PS: _setjmp3 is an export from msvcrt.dll. So if symbol is missing > on link, simply specify msvcrt.dll as argument to link-line.