Il 19/09/2013 10:11, Stefan Hajnoczi ha scritto: > On Thu, Sep 19, 2013 at 8:36 AM, Taimoor Mirza <taimoor.m...@gmail.com> wrote: > > Please use Reply-All to keep the CC list on your reply email. This > way others on the mailing list can follow the discussion and > participate. > >> O1 disassembly is at http://pastebin.com/yxWAmmmf >> >> O2 disassembly is at http://pastebin.com/v0uqHuYY > > I diffed them. The differences look reasonable, nothing obviously broken: > * The broken -O2 version inlines qemu_coroutine_switch() into > coroutine_trampoline(). > * The broken -O2 version changes the ordering of basic blocks and > switches a few instructions for shorter/cheaper equivalents. > > Taimoor: Can you try "make check" with the -O2 version? In > particular, the test-coroutine tests may fail and that could help us > figure out which operation is broken. > > Paolo: CCed you in case you want to diff the working -O1 against the > broken -O2 disassembly. Perhaps Taimoor's gcc 4.6.2 -O2 subtly breaks > around the Windows Fiber API calls.
Taimoor, can you please try compiling coroutine-win32.c at -O2 but without the -fstack-protector-all compiler option? If it works, please try with -fstack-protector instead of -fstack-protector-all. Also (separately from the above experiment), can you try this patch and see if it breaks/works at -O1 and -O2? Then, independent of the result, please post -O1 and -O2 assembly outputs with the patch. diff --git a/coroutine-win32.c b/coroutine-win32.c index edc1f72..3b10189 100644 --- a/coroutine-win32.c +++ b/coroutine-win32.c @@ -55,7 +55,13 @@ static void CALLBACK coroutine_trampoline(void *co_) while (true) { co->entry(co->entry_arg); - qemu_coroutine_switch(co, co->caller, COROUTINE_TERMINATE); + Coroutine *to_ = co->caller; + CoroutineWin32 *from = DO_UPCAST(CoroutineWin32, base, co); + CoroutineWin32 *to = DO_UPCAST(CoroutineWin32, base, to_); + + current = to_; + to->action = COROUTINE_TERMINATE; + SwitchToFiber(to->fiber); } } Thanks, Paolo