Mercurial > projects > ldc
diff gen/abi.cpp @ 1446:fe151804995a
Improve ABI conformance on x86 by passing the `sret` parameter in EAX if there's
no `this`.
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Sun, 31 May 2009 12:43:59 +0200 |
parents | c363d131c1ef |
children | a5526b7a5ae6 |
line wrap: on
line diff
--- a/gen/abi.cpp Sun May 31 17:11:51 2009 +0200 +++ b/gen/abi.cpp Sun May 31 12:43:59 2009 +0200 @@ -196,8 +196,16 @@ Logger::println("Putting context ptr in register"); fty.arg_nest->attrs = llvm::Attribute::InReg; } + else if (IrFuncTyArg* sret = fty.arg_sret) + { + Logger::println("Putting sret ptr in register"); + // sret and inreg are incompatible, but the ABI requires the + // sret parameter to be in EAX in this situation... + sret->attrs = (sret->attrs | llvm::Attribute::InReg) + & ~llvm::Attribute::StructRet; + } // otherwise try to mark the last param inreg - else if (!fty.arg_sret && !fty.args.empty()) + else if (!fty.args.empty()) { // The last parameter is passed in EAX rather than being pushed on the stack if the following conditions are met: // * It fits in EAX.