================
@@ -26,23 +26,38 @@ class SparcV8ABIInfo : public DefaultABIInfo {
private:
ABIArgInfo classifyReturnType(QualType RetTy) const;
+ ABIArgInfo classifyArgumentType(QualType Ty) const;
void computeInfo(CGFunctionInfo &FI) const override;
};
} // end anonymous namespace
+ABIArgInfo SparcV8ABIInfo::classifyReturnType(QualType Ty) const {
+ const auto *CT = Ty->getAs<ComplexType>();
+ const auto *BT = Ty->getAs<BuiltinType>();
+ if (CT)
+ BT = CT->getElementType()->getAs<BuiltinType>();
+ bool IsLongDouble = BT && BT->getKind() == BuiltinType::LongDouble;
-ABIArgInfo
-SparcV8ABIInfo::classifyReturnType(QualType Ty) const {
- if (Ty->isAnyComplexType()) {
- return ABIArgInfo::getDirect();
- }
- else {
- return DefaultABIInfo::classifyReturnType(Ty);
- }
+ // long double _Complex is special in that it should be marked as inreg.
+ if (CT)
+ return IsLongDouble ? ABIArgInfo::getDirectInReg()
+ : ABIArgInfo::getDirect();
+
+ if (IsLongDouble)
+ return getNaturalAlignIndirect(Ty, getDataLayout().getAllocaAddrSpace());
+
+ return DefaultABIInfo::classifyReturnType(Ty);
}
-void SparcV8ABIInfo::computeInfo(CGFunctionInfo &FI) const {
+ABIArgInfo SparcV8ABIInfo::classifyArgumentType(QualType Ty) const {
+ if (const auto *BT = Ty->getAs<BuiltinType>();
+ BT && BT->getKind() == BuiltinType::LongDouble)
+ return getNaturalAlignIndirect(Ty, getDataLayout().getAllocaAddrSpace());
----------------
s-barannikov wrote:
This is missing `, /*ByVal=*/false`.
(And SparcV8ABIInfo shouldn't delegate to DefaultABIInfo which adds `byval` to
other arguments, but this is unrelated to this patch.)
https://github.com/llvm/llvm-project/pull/162226
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits