June 15, 2013 Re: MinGW-w64 runtime library inclusion (Clang-compiled) for proper Win64 support? | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | On Saturday, 15 June 2013 at 21:37:51 UTC, bearophile wrote:
> kink:
>
>> This shouldn't be a problem for Win32 though as x87s should be passed ordinarily by-val.
>
> See the D ABI:
> http://dlang.org/abi.html
… which doesn't fully apply to LDC. ;)
David
|
June 15, 2013 Re: MinGW-w64 runtime library inclusion (Clang-compiled) for proper Win64 support? | ||||
---|---|---|---|---|
| ||||
Posted in reply to David Nadlinger | David Nadlinger:
> … which doesn't fully apply to LDC. ;)
What's the point of not following the ABI of D reals in LDC?
Bye,
bearophile
|
June 15, 2013 Re: MinGW-w64 runtime library inclusion (Clang-compiled) for proper Win64 support? | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | On Saturday, 15 June 2013 at 22:39:17 UTC, bearophile wrote:
> David Nadlinger:
>
>> … which doesn't fully apply to LDC. ;)
>
> What's the point of not following the ABI of D reals in LDC?
The question should be: What's the point of DMD not following the standard C ABI on Win32? ;)
In the case of reals, simple things should work, but DMD packs together 80-bit reals end-to-end (i.e. 10 byte spacing), whereas LLVM chooses 12 byte alignment.
David
|
June 16, 2013 Re: MinGW-w64 runtime library inclusion (Clang-compiled) for proper Win64 support? | ||||
---|---|---|---|---|
| ||||
Posted in reply to David Nadlinger | > In the case of reals, simple things should work, but DMD packs together 80-bit reals end-to-end (i.e. 10 byte spacing), whereas LLVM chooses 12 byte alignment.
For 32-bit LLVM targets that is; sizeof(long double) == 16 bytes for the Win64 targets, so that the required 8-bytes alignment can be enforced.
|
June 16, 2013 Re: MinGW-w64 runtime library inclusion (Clang-compiled) for proper Win64 support? | ||||
---|---|---|---|---|
| ||||
Posted in reply to kink | Okay, I finally got the x87 argument passing to work between Clang and LDC after inserting a few lines into Clang's WinX86_64ABIInfo::classify method. Calling foo(666) in D returns 668.5, as expected. As soon as I've fixed the remaining linking issues for MinGW-w64 CRT (including most modules and most likely all relevant ones), I'll post the required patches for Clang and the CRT so that others can experiment too. |
June 22, 2013 Re: MinGW-w64 runtime library inclusion (Clang-compiled) for proper Win64 support? | ||||
---|---|---|---|---|
| ||||
Posted in reply to kink | I've got to say that I'm not keen on working further on this. I got rid of the linking issues, but the library is surely not 100% functional. My changes to the MinGW-w64 CRT are a messy hack, and that's because the codebase itself is a mess, very ugly and partially from the 80s and 90s of the last century. I'd really suggest mapping the real type to the double type for Windows targets, ideally in all D compilers of course. Here's at least the tiny patch for Clang to enable 80-bit long double support on Win64: diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 4968938..f6ac502 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -3229,8 +3229,8 @@ class VisualStudioWindowsX86_64TargetInfo : public WindowsX86_64TargetInfo { public: VisualStudioWindowsX86_64TargetInfo(const std::string& triple) : WindowsX86_64TargetInfo(triple) { - LongDoubleWidth = LongDoubleAlign = 64; - LongDoubleFormat = &llvm::APFloat::IEEEdouble; + //LongDoubleWidth = LongDoubleAlign = 64; + //LongDoubleFormat = &llvm::APFloat::IEEEdouble; } virtual void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const { diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp index 4fa0c3b..9fb00a5 100644 --- a/lib/CodeGen/TargetInfo.cpp +++ b/lib/CodeGen/TargetInfo.cpp @@ -2584,6 +2584,11 @@ ABIArgInfo WinX86_64ABIInfo::classify(QualType Ty, bool IsReturnType) const { if (Ty->isPromotableIntegerType()) return ABIArgInfo::getExtend(); + if (!IsReturnType && // regular function parameter + Ty->isRealFloatingType() && Size > 64 && // non-complex x87 type (80 bits) + getTarget().getTriple().getOS() == llvm::Triple::Win32) // Win64 Visual Studio target + return ABIArgInfo::getIndirect(0, /*ByVal=*/false); // TODO: is that the right ByVal setting? + return ABIArgInfo::getDirect(); } |
June 29, 2013 Re: MinGW-w64 runtime library inclusion (Clang-compiled) for proper Win64 support? | ||||
---|---|---|---|---|
| ||||
Posted in reply to kink | Hey guys, I didn't want to let my work be in vain - here's the tailored MinGW-w64 CRT: https://github.com/kinke/mingw-w64-crt The Clang patch is included. I cleaned up my changes and the whole source tree; I think the result is not extremely ugly and most of the code should work. ;) |
Copyright © 1999-2021 by the D Language Foundation