From d909c4fd20634d46b041829816a49e36b43fcd87 Mon Sep 17 00:00:00 2001 From: Walter Bright Date: Fri, 31 Aug 2012 02:10:34 -0700 Subject: [PATCH] more Win64 fixes --- src/backend/cod1.c | 3 +++ src/backend/out.c | 3 +++ src/e2ir.c | 6 +++--- src/s2ir.c | 6 +++++- src/scanmscoff.c | 8 ++++++-- 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/backend/cod1.c b/src/backend/cod1.c index 22b18f8b2843..36162474700c 100644 --- a/src/backend/cod1.c +++ b/src/backend/cod1.c @@ -2542,6 +2542,9 @@ code *cdfunc(elem *e,regm_t *pretregs) if (config.exe == EX_WIN64) { //printf("[%d] size = %u, numpara = %d ep = %p ", i, psize, numpara, ep); WRTYxx(ep->Ety); printf("\n"); +#ifdef DEBUG + if (psize > REGSIZE) elem_print(e); +#endif assert(psize <= REGSIZE); psize = REGSIZE; } diff --git a/src/backend/out.c b/src/backend/out.c index 029bd126006e..c97b453a58ff 100644 --- a/src/backend/out.c +++ b/src/backend/out.c @@ -333,6 +333,9 @@ void outdata(symbol *s) if (s->Sclass == SCglobal #if ELFOBJ || MACHOBJ || s->Sclass == SCstatic +#endif +#if OMFOBJ + || (s->Sclass == SCstatic && I64) #endif ) objmod->pubdefsize(seg,s,s->Soffset,datasize); /* do the definition */ diff --git a/src/e2ir.c b/src/e2ir.c index bbb7a6615282..5092a1dae530 100644 --- a/src/e2ir.c +++ b/src/e2ir.c @@ -781,7 +781,7 @@ elem *SymbolExp::toElem(IRState *irs) nrvo = 1; } - if (s->Sclass == SCauto || s->Sclass == SCparameter) + if (s->Sclass == SCauto || s->Sclass == SCparameter || s->Sclass == SCshadowreg) { if (fd && fd != irs->getFunc()) { // 'var' is a variable in an enclosing function. @@ -941,7 +941,7 @@ elem *VarExp::toElem(IRState *irs) nrvo = 1; } - if (s->Sclass == SCauto || s->Sclass == SCparameter) + if (s->Sclass == SCauto || s->Sclass == SCparameter || s->Sclass == SCshadowreg) { if (fd && fd != irs->getFunc()) { // 'var' is a variable in an enclosing function. @@ -1064,7 +1064,7 @@ elem *SymOffExp::toElem(IRState *irs) assert(!var->isImportedSymbol()); // This code closely parallels that in VarExp::toElem() - if (s->Sclass == SCauto || s->Sclass == SCparameter) + if (s->Sclass == SCauto || s->Sclass == SCparameter || s->Sclass == SCshadowreg) { if (fd && fd != irs->getFunc()) { // 'var' is a variable in an enclosing function. diff --git a/src/s2ir.c b/src/s2ir.c index fcd9f7baf99f..e67340620331 100644 --- a/src/s2ir.c +++ b/src/s2ir.c @@ -51,6 +51,8 @@ elem *callfunc(Loc loc, elem *exp2_copytotemp(elem *e); elem *incUsageElem(IRState *irs, Loc loc); StructDeclaration *needsPostblit(Type *t); +elem *addressElem(elem *e, Type *t, bool alwaysCopy = false); + #define elem_setLoc(e,loc) ((e)->Esrcpos.Sfilename = (char *)(loc).filename, \ (e)->Esrcpos.Slinnum = (loc).linnum) @@ -1010,7 +1012,9 @@ void SwitchStatement::toIR(IRState *irs) /* Call: * _d_switch_string(string[] si, string econd) */ - elem *eparam = el_param(econd, el_var(si)); + if (config.exe == EX_WIN64) + econd = addressElem(econd, condition->type, true); + elem *eparam = el_param(econd, (config.exe == EX_WIN64) ? el_ptr(si) : el_var(si)); switch (condition->type->nextOf()->ty) { case Tchar: diff --git a/src/scanmscoff.c b/src/scanmscoff.c index d5bf36aa20b4..e3f9914a3f54 100644 --- a/src/scanmscoff.c +++ b/src/scanmscoff.c @@ -68,8 +68,12 @@ void scanMSCoffObjModule(void* pctx, void (*pAddSymbol)(void* pctx, char* name, break; default: - error(loc, "MS-Coff object module %s has magic = %x, should be %x", - module_name, header->f_magic, IMAGE_FILE_MACHINE_AMD64); + if (buf[0] == 0x80) + error(loc, "Object module %s is 32 bit OMF, but it should be 64 bit MS-Coff", + module_name); + else + error(loc, "MS-Coff object module %s has magic = %x, should be %x", + module_name, header->f_magic, IMAGE_FILE_MACHINE_AMD64); return; }