From 05c809728906a35f29321349adb89548793b7f9d Mon Sep 17 00:00:00 2001 From: Walter Bright Date: Tue, 21 Nov 2017 18:25:58 -0800 Subject: [PATCH] fix Issue 17997 - autotester's d_do_test has strange failures with Win32 --- src/ddmd/backend/cgcod.c | 2 ++ src/ddmd/backend/cod1.c | 1 + src/ddmd/backend/cod3.c | 4 +++- src/ddmd/backend/cod5.c | 1 + src/ddmd/backend/code.h | 1 + src/ddmd/dsymbolsem.d | 2 +- 6 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/ddmd/backend/cgcod.c b/src/ddmd/backend/cgcod.c index 46e41fd4a8c6..19df5010c42f 100644 --- a/src/ddmd/backend/cgcod.c +++ b/src/ddmd/backend/cgcod.c @@ -84,6 +84,7 @@ char needframe; // if TRUE, then we will need the frame // pointer (BP for the 8088) char gotref; // !=0 if the GOTsym was referenced unsigned usednteh; // if !=0, then used NT exception handling +bool calledFinally; // true if called a BC_finally block /* Register contents */ con_t regcon; @@ -174,6 +175,7 @@ void codgen(Symbol *sfunc) memset(_8087elems,0,sizeof(_8087elems)); #endif + calledFinally = false; usednteh = 0; #if (MARS) && TARGET_WINDOS if (sfunc->Sfunc->Fflags3 & Fjmonitor) diff --git a/src/ddmd/backend/cod1.c b/src/ddmd/backend/cod1.c index e55382951a1b..361bf751a470 100644 --- a/src/ddmd/backend/cod1.c +++ b/src/ddmd/backend/cod1.c @@ -2960,6 +2960,7 @@ void cdfunc(CodeBuilder& cdb,elem *e,regm_t *pretregs) * A better solution is turn this off only inside the cleanup code. */ !usednteh && + !calledFinally && (numpara || config.exe == EX_WIN64) && stackpush == 0 && // cgstate.funcarg needs to be at top of stack (cgstate.funcargtos == ~0 || numpara < cgstate.funcargtos) && diff --git a/src/ddmd/backend/cod3.c b/src/ddmd/backend/cod3.c index 81dd3b3f891b..b472c086daf2 100644 --- a/src/ddmd/backend/cod3.c +++ b/src/ddmd/backend/cod3.c @@ -754,6 +754,7 @@ static code *callFinallyBlock(block *bf, regm_t retregs) CodeBuilder cdbr; int nalign = 0; + calledFinally = true; unsigned npush = gensaverestore(retregs,cdbs,cdbr); if (STACKALIGN == 16) @@ -949,7 +950,8 @@ void outblkexitcode(CodeBuilder& cdb, block *bl, int& anyspill, const char* sfls /* Need to use frame pointer to access locals, not the stack pointer, * because we'll be calling the BC_finally blocks and the stack will be off. */ - usednteh |= EHtry; + needframe = 1; + //usednteh |= EHtry; } else if (config.ehmethod == EH_SEH || config.ehmethod == EH_WIN32) { diff --git a/src/ddmd/backend/cod5.c b/src/ddmd/backend/cod5.c index 6c73fdad9798..a2b28e931831 100644 --- a/src/ddmd/backend/cod5.c +++ b/src/ddmd/backend/cod5.c @@ -51,6 +51,7 @@ void cod5_prol_epi() anyiasm || Alloca.size || usednteh || + calledFinally || tyf & (mTYnaked | mTYloadds) || tym == TYifunc || tym == TYmfunc || // can't yet handle ECX passed as parameter diff --git a/src/ddmd/backend/code.h b/src/ddmd/backend/code.h index 77ff56b37cbc..8dc99013cfe8 100644 --- a/src/ddmd/backend/code.h +++ b/src/ddmd/backend/code.h @@ -237,6 +237,7 @@ extern int reflocal; extern bool anyiasm; extern char calledafunc; extern void(*cdxxx[])(CodeBuilder&,elem *,regm_t *); +extern bool calledFinally; void stackoffsets(int); void codgen(Symbol *); diff --git a/src/ddmd/dsymbolsem.d b/src/ddmd/dsymbolsem.d index 34e825aba28e..491acb3a1002 100644 --- a/src/ddmd/dsymbolsem.d +++ b/src/ddmd/dsymbolsem.d @@ -1202,7 +1202,7 @@ extern(C++) final class Semantic3Visitor : Visitor /* Disable optimization on Win32 due to * https://issues.dlang.org/show_bug.cgi?id=17997 */ - if (!global.params.isWindows || global.params.is64bit) +// if (!global.params.isWindows || global.params.is64bit) funcdecl.eh_none = true; // don't generate unwind tables for this function }