aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/CodeGen/TargetInfo.cpp24
1 files changed, 13 insertions, 11 deletions
diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp
index 7d0d1768ed..196596d40a 100644
--- a/lib/CodeGen/TargetInfo.cpp
+++ b/lib/CodeGen/TargetInfo.cpp
@@ -421,7 +421,16 @@ class EmscriptenABIInfo : public DefaultABIInfo {
explicit EmscriptenABIInfo(CodeGen::CodeGenTypes &CGT) : DefaultABIInfo(CGT) {}
ABIArgInfo classifyReturnType(QualType RetTy) const;
- ABIArgInfo classifyArgumentType(QualType RetTy) const;
+ ABIArgInfo classifyArgumentType(QualType Ty) const;
+
+ // DefaultABIInfo's classifyReturnType and classifyArgumentType are
+ // non-virtual, but computeInfo is virtual, so we overload that.
+ virtual void computeInfo(CGFunctionInfo &FI) const {
+ FI.getReturnInfo() = classifyReturnType(FI.getReturnType());
+ for (CGFunctionInfo::arg_iterator it = FI.arg_begin(), ie = FI.arg_end();
+ it != ie; ++it)
+ it->info = classifyArgumentType(it->type);
+ }
};
class EmscriptenTargetCodeGenInfo : public TargetCodeGenInfo {
@@ -433,15 +442,12 @@ class EmscriptenTargetCodeGenInfo : public TargetCodeGenInfo {
/// \brief Classify argument of given type \p Ty.
ABIArgInfo EmscriptenABIInfo::classifyArgumentType(QualType Ty) const {
if (isAggregateTypeForABI(Ty)) {
+ unsigned TypeAlign = getContext().getTypeAlignInChars(Ty).getQuantity();
if (CGCXXABI::RecordArgABI RAA = getRecordArgABI(Ty, CGT))
- return ABIArgInfo::getIndirect(0, RAA == CGCXXABI::RAA_DirectInMemory);
- return ABIArgInfo::getIndirect(0);
+ return ABIArgInfo::getIndirect(TypeAlign, RAA == CGCXXABI::RAA_DirectInMemory);
+ return ABIArgInfo::getIndirect(TypeAlign);
}
- // We can handle floating-point values directly.
- if (Ty->isFloatingType())
- return ABIArgInfo::getDirect();
-
// Otherwise just do the default thing.
return DefaultABIInfo::classifyArgumentType(Ty);
}
@@ -454,10 +460,6 @@ ABIArgInfo EmscriptenABIInfo::classifyReturnType(QualType RetTy) const {
return ABIArgInfo::getDirect(CGT.ConvertType(QualType(SeltTy, 0)));
}
- // We can handle floating-point values directly.
- if (RetTy->isFloatingType())
- return ABIArgInfo::getDirect();
-
// Otherwise just do the default thing.
return DefaultABIInfo::classifyReturnType(RetTy);
}