Mercurial > projects > ldc
changeset 739:1ae94fb1dbbd
Fix accidental double-inreg caused by shared TupleType. Enabled inreg by default.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Thu, 30 Oct 2008 10:16:37 +0100 |
parents | ecb429ee0648 |
children | 96484f5bf5af |
files | dmd/mtype.c gen/functions.cpp premake.lua |
diffstat | 3 files changed, 7 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/dmd/mtype.c Thu Oct 30 10:15:42 2008 +0100 +++ b/dmd/mtype.c Thu Oct 30 10:16:37 2008 +0100 @@ -3454,7 +3454,7 @@ } } if (t->ty == Ttuple) - *pt = t; + *pt = t->syntaxCopy(); else *pt = t->merge(); }
--- a/gen/functions.cpp Thu Oct 30 10:15:42 2008 +0100 +++ b/gen/functions.cpp Thu Oct 30 10:16:37 2008 +0100 @@ -203,16 +203,18 @@ // pass first param in EAX if it fits, is not floating point and is not a 3 byte struct. // FIXME: struct are not passed in EAX yet + int n_inreg = f->reverseParams ? n - 1 : 0; + Argument* arg = Argument::getNth(f->parameters, n_inreg); + // if there is a implicit context parameter, pass it in EAX if (usesthis || usesnest) { f->thisAttrs |= llvm::Attribute::InReg; + assert((!arg || (arg->llvmAttrs & llvm::Attribute::InReg) == 0) && "can't have two inreg args!"); } // otherwise check the first formal parameter else { - int inreg = f->reverseParams ? n - 1 : 0; - Argument* arg = Argument::getNth(f->parameters, inreg); Type* t = arg->type->toBasetype(); // 32bit ints, pointers, classes, static arrays and AAs @@ -223,6 +225,7 @@ (t->size() <= PTRSIZE)) { arg->llvmAttrs |= llvm::Attribute::InReg; + assert((f->thisAttrs & llvm::Attribute::InReg) == 0 && "can't have two inreg args!"); } } }