aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/TargetInfo.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2010-09-16 20:42:06 +0000
committerDaniel Dunbar <daniel@zuster.org>2010-09-16 20:42:06 +0000
commite59d8585bb40a8bae6b847ad258536a2c01f20ea (patch)
tree6b0e92b4821daf71e640e55780a2c755f1d6d23f /lib/CodeGen/TargetInfo.cpp
parentcf3b6f2504596812db1fcef0df8ce5b3449c4aac (diff)
IRgen/ABI/x86-32: Realign indirect arguments when the ABI requires us to pass
them with a smaller alignment than the rest of codegen expects. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@114115 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/TargetInfo.cpp')
-rw-r--r--lib/CodeGen/TargetInfo.cpp39
1 files changed, 24 insertions, 15 deletions
diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp
index 3ee4d1ad6d..34a6d37726 100644
--- a/lib/CodeGen/TargetInfo.cpp
+++ b/lib/CodeGen/TargetInfo.cpp
@@ -353,7 +353,7 @@ class X86_32ABIInfo : public ABIInfo {
ABIArgInfo getIndirectResult(QualType Ty, bool ByVal = true) const;
/// \brief Return the alignment to use for the given type on the stack.
- unsigned getTypeStackAlignInBytes(QualType Ty) const;
+ unsigned getTypeStackAlignInBytes(QualType Ty, unsigned Align) const;
public:
@@ -580,16 +580,18 @@ static bool isRecordWithSSEVectorType(ASTContext &Context, QualType Ty) {
return false;
}
-unsigned X86_32ABIInfo::getTypeStackAlignInBytes(QualType Ty) const {
- // On non-Darwin, the stack type alignment is always 4.
- if (!IsDarwinVectorABI)
- return MinABIStackAlignInBytes;
-
- // Otherwise, if the alignment is less than or equal to 4, use the minimum ABI
- // alignment.
- unsigned Align = getContext().getTypeAlign(Ty) / 8;
+unsigned X86_32ABIInfo::getTypeStackAlignInBytes(QualType Ty,
+ unsigned Align) const {
+ // Otherwise, if the alignment is less than or equal to the minimum ABI
+ // alignment, just use the default; the backend will handle this.
if (Align <= MinABIStackAlignInBytes)
+ return 0; // Use default alignment.
+
+ // On non-Darwin, the stack type alignment is always 4.
+ if (!IsDarwinVectorABI) {
+ // Set explicit alignment, since we may need to realign the top.
return MinABIStackAlignInBytes;
+ }
// Otherwise, if the type contains an SSE vector type, the alignment is 16.
if (isRecordWithSSEVectorType(getContext(), Ty))
@@ -602,12 +604,19 @@ ABIArgInfo X86_32ABIInfo::getIndirectResult(QualType Ty, bool ByVal) const {
if (!ByVal)
return ABIArgInfo::getIndirect(0, false);
- // Compute the byval alignment. We trust the back-end to honor the
- // minimum ABI alignment for byval, to make cleaner IR.
- unsigned Align = getTypeStackAlignInBytes(Ty);
- if (Align > MinABIStackAlignInBytes)
- return ABIArgInfo::getIndirect(Align);
- return ABIArgInfo::getIndirect(0);
+ // Compute the byval alignment.
+ unsigned TypeAlign = getContext().getTypeAlign(Ty) / 8;
+ unsigned StackAlign = getTypeStackAlignInBytes(Ty, TypeAlign);
+ if (StackAlign == 0)
+ return ABIArgInfo::getIndirect(0);
+
+ // If the stack alignment is less than the type alignment, realign the
+ // argument.
+ if (StackAlign < TypeAlign)
+ return ABIArgInfo::getIndirect(StackAlign, /*ByVal=*/true,
+ /*Realign=*/true);
+
+ return ABIArgInfo::getIndirect(StackAlign);
}
ABIArgInfo X86_32ABIInfo::classifyArgumentType(QualType Ty) const {