Bad codegen for ARM (and maybe others) when optimizing
Dan Olson via digitalmars-d-ldc
digitalmars-d-ldc at puremagic.com
Tue Feb 10 09:56:59 PST 2015
"David Nadlinger" <code at klickverbot.at> writes:
> On Tuesday, 10 February 2015 at 06:07:54 UTC, Kai Nacke wrote:
>> I prefer if you follow the D ABI. My impression is that the
>> difference between fastcc and the standard calling convention is not
>> really great, at least on non-x86 systems.
>
> To further put this into context: LDC supported non-x86_32 platforms
> before the D spec ABI had that "just as C" clause. Walter's position
> once explicitly was that on non-x86 platforms, other compilers are
> "free to innovate", but that seems to have changed.
>
> And in my opinion, rightfully so. We need C ABI compatibility on all
> the platforms anyway, and there is little reason to also maintain a
> second ABI implementation. We can still relax the ABI on the IR
> transformation level for internal function when we are doing LTO
> anyway (LLVM does this by default).
>
> David
So then, I would assume that abi.cpp TargetABI::callingConv() should be
changed to return llvm::CallingConv::C for Linkd?
https://github.com/ldc-developers/ldc/blob/master/gen/abi.cpp#L52
I would have thought extern(C) is enough to be compatible with native C
ABI. We don't expect C or C++ to call extern(D) functions. Or is the
reason for extern(D) C ABI compatibilty more to do with being compatible
with other tools like debuggers.
I now realize that up until this point on iOS, fastcc for D linkage has
been used. I did an experiment and changed to ccc for D linkage. For
some reason I start failing unittests. I'll have to see why.
One peculiarity of fastcc (unlike ccc) is that it passes floating types
in FP registers even though I am selecting softfp (i.e. use hardware
FPU, but pass float types in GP registers). The assembly code for D
math functions looks awesome for fastcc when I compare to ccc.
--
Dan
More information about the digitalmars-d-ldc
mailing list