diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/AST/ASTContext.cpp | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index ccbea263aa5..32adf3ae735 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -563,11 +563,14 @@ ASTContext::getTypeInfo(const Type *T) { /// a data type. unsigned ASTContext::getPreferredTypeAlign(const Type *T) { unsigned ABIAlign = getTypeAlign(T); - - // Doubles should be naturally aligned if possible. - if (T->isSpecificBuiltinType(BuiltinType::Double)) - return std::max(ABIAlign, 64U); - + + // Double and long long should be naturally aligned if possible. + if (const ComplexType* CT = T->getAsComplexType()) + T = CT->getElementType().getTypePtr(); + if (T->isSpecificBuiltinType(BuiltinType::Double) || + T->isSpecificBuiltinType(BuiltinType::LongLong)) + return std::max(ABIAlign, (unsigned)getTypeSize(T)); + return ABIAlign; } |