Fix accidental double-inreg caused by shared TupleType. Enabled inreg by default.

This commit is contained in:
Christian Kamm
2008-10-30 10:16:37 +01:00
parent 0e5d9f970b
commit 36a98404ae
3 changed files with 7 additions and 4 deletions

View File

@@ -3454,7 +3454,7 @@ L1:
}
}
if (t->ty == Ttuple)
*pt = t;
*pt = t->syntaxCopy();
else
*pt = t->merge();
}

View File

@@ -203,16 +203,18 @@ const llvm::FunctionType* DtoFunctionType(Type* type, const LLType* thistype, co
// 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 @@ const llvm::FunctionType* DtoFunctionType(Type* type, const LLType* thistype, co
(t->size() <= PTRSIZE))
{
arg->llvmAttrs |= llvm::Attribute::InReg;
assert((f->thisAttrs & llvm::Attribute::InReg) == 0 && "can't have two inreg args!");
}
}
}

View File

@@ -39,7 +39,7 @@ io.write("Default target: '"..TRIPLE.."'\n");
-- x86 ABI support
X86_REVERSE_PARAMS = 1
X86_PASS_IN_EAX = 0 --disabled for now
X86_PASS_IN_EAX = 1
-- D version - don't change these !!!
DMDV1 = "1"