================
@@ -277,6 +313,22 @@ ABIArgInfo SparcV9ABIInfo::classifyType(QualType Ty,
unsigned SizeLimit,
return ABIArgInfo::getExtend(Ty);
}
+ // When being GCC-compatible, cast a complex char, short and int to an
integer
+ // type of the right size to get the correct scalar-like behavior. Other
+ // complex types fall through and are treated like a struct containing the
+ // real and imaginary parts, e.g. `{ i64, i64 }` or `{ double, double }`.
+ if (IsComplexGnuABI) {
+ const auto *CT = Ty->getAs<ComplexType>();
+ if (CT && CT->getElementType()->isIntegerType()) {
+ uint64_t ElementTypeSize = Context.getTypeSize(CT->getElementType());
+ if (ElementTypeSize < 32) {
----------------
koachan wrote:
> I tried <= 64 too but that failed.
I suppose extending an `i64` will result in an `i128` and those are treated
differently than an `{ i64, i64 }` struct.
https://github.com/llvm/llvm-project/pull/212340
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits