From 88b8ba10538d68b32e60f97897cb177a399d2d2e Mon Sep 17 00:00:00 2001 From: David Nadlinger Date: Mon, 4 Feb 2013 00:23:40 +0100 Subject: [PATCH] extern(D): Return static arrays via sret parameters. On x86_64, a proper solution (see GitHub #120) is still needed, but this will have to wait until the special case for extern(D) is gone from the implementation. We need this right now as std.digest.md in 2.061 triggers a miscompilation issue in the LLVM x86 backend (not the optimizer!) when returning them directly as LLVM arrays. --- gen/abi-x86-64.cpp | 6 +++++- gen/abi-x86.cpp | 8 +++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/gen/abi-x86-64.cpp b/gen/abi-x86-64.cpp index 29158674..8da094d7 100644 --- a/gen/abi-x86-64.cpp +++ b/gen/abi-x86-64.cpp @@ -425,7 +425,11 @@ bool X86_64TargetABI::returnInArg(TypeFunction* tf) { return false; #endif // All non-structs can be returned in registers. - return (rt->ty == Tstruct); + return rt->ty == Tstruct +#if SARRAYVALUE + || rt->ty == Tsarray +#endif + ; } else { if (rt == Type::tvoid || keepUnchanged(rt)) return false; diff --git a/gen/abi-x86.cpp b/gen/abi-x86.cpp index ddc87236..8f7c02d3 100644 --- a/gen/abi-x86.cpp +++ b/gen/abi-x86.cpp @@ -89,7 +89,13 @@ struct X86TargetABI : TargetABI Type* rt = tf->next->toBasetype(); // D only returns structs on the stack if (tf->linkage == LINKd) - return (rt->ty == Tstruct); + { + return rt->ty == Tstruct +#if SARRAYVALUE + || rt->ty == Tsarray +#endif + ; + } // other ABI's follow C, which is cdouble and creal returned on the stack // as well as structs else