Author: aturetsk Date: Wed Feb 10 05:58:46 2016 New Revision: 260376 URL: http://llvm.org/viewvc/llvm-project?rev=260376&view=rev Log: [X86] Fix stack alignment for MCU target (Clang part), by Anton Nadolskiy.
This patch fixes stack alignments for MCU (should be aligned to 4 bytes). Differential Revision: http://reviews.llvm.org/D15647 Added: cfe/trunk/test/CodeGen/iamcu-abi.c (with props) Modified: cfe/trunk/include/clang/Basic/TargetInfo.h cfe/trunk/lib/AST/ASTContext.cpp cfe/trunk/lib/Basic/Targets.cpp Modified: cfe/trunk/include/clang/Basic/TargetInfo.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TargetInfo.h?rev=260376&r1=260375&r2=260376&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/TargetInfo.h (original) +++ cfe/trunk/include/clang/Basic/TargetInfo.h Wed Feb 10 05:58:46 2016 @@ -940,6 +940,9 @@ public: return false; } + /// \brief Whether target allows to overalign ABI-specified prefered alignment + virtual bool allowsLargerPreferedTypeAlignment() const { return true; } + protected: virtual uint64_t getPointerWidthV(unsigned AddrSpace) const { return PointerWidth; Modified: cfe/trunk/lib/AST/ASTContext.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=260376&r1=260375&r2=260376&view=diff ============================================================================== --- cfe/trunk/lib/AST/ASTContext.cpp (original) +++ cfe/trunk/lib/AST/ASTContext.cpp Wed Feb 10 05:58:46 2016 @@ -1904,8 +1904,8 @@ unsigned ASTContext::getPreferredTypeAli if (T->isMemberPointerType()) return getPreferredTypeAlign(getPointerDiffType().getTypePtr()); - if (Target->getTriple().getArch() == llvm::Triple::xcore) - return ABIAlign; // Never overalign on XCore. + if (!Target->allowsLargerPreferedTypeAlignment()) + return ABIAlign; // Double and long long should be naturally aligned if possible. if (const ComplexType *CT = T->getAs<ComplexType>()) Modified: cfe/trunk/lib/Basic/Targets.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=260376&r1=260375&r2=260376&view=diff ============================================================================== --- cfe/trunk/lib/Basic/Targets.cpp (original) +++ cfe/trunk/lib/Basic/Targets.cpp Wed Feb 10 05:58:46 2016 @@ -3807,6 +3807,8 @@ public: : WindowsX86_32TargetInfo(Triple) { LongDoubleWidth = LongDoubleAlign = 64; LongDoubleFormat = &llvm::APFloat::IEEEdouble; + DataLayoutString = + "e-m:e-p:32:32-i64:32-f64:32-f128:32-n8:16:32-a:0:32-S32"; } void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override { @@ -3926,6 +3928,10 @@ public: Builder.defineMacro("__iamcu"); Builder.defineMacro("__iamcu__"); } + + bool allowsLargerPreferedTypeAlignment() const override { + return false; + } }; // RTEMS Target @@ -7491,6 +7497,9 @@ public: // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister return (RegNo < 2)? RegNo : -1; } + bool allowsLargerPreferedTypeAlignment() const override { + return false; + } }; const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = { Added: cfe/trunk/test/CodeGen/iamcu-abi.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/iamcu-abi.c?rev=260376&view=auto ============================================================================== --- cfe/trunk/test/CodeGen/iamcu-abi.c (added) +++ cfe/trunk/test/CodeGen/iamcu-abi.c Wed Feb 10 05:58:46 2016 @@ -0,0 +1,38 @@ +// RUN: %clang_cc1 -triple i386-pc-elfiamcu -emit-llvm -o - %s | FileCheck %s + +// CHECK: target datalayout = "e-m:e-p:32:32-i64:32-f64:32-f128:32-n8:16:32-a:0:32-S32" +// CHECK: target triple = "i386-pc-elfiamcu" + + +void food(double *d); +void fooll(long long *ll); +void fooull(unsigned long long *ull); +void foold(long double *ld); + +// CHECK-LABEL: define void @testdouble() +// CHECK: alloca double, align 4 +void testdouble() { + double d = 2.0; + food(&d); +} + +// CHECK-LABEL: define void @testlonglong() +// CHECK: alloca i64, align 4 +void testlonglong() { + long long ll = 2; + fooll(&ll); +} + +// CHECK-LABEL: define void @testunsignedlonglong() +// CHECK: alloca i64, align 4 +void testunsignedlonglong() { + unsigned long long ull = 2; + fooull(&ull); +} + +// CHECK-LABEL: define void @testlongdouble() +// CHECK: alloca double, align 4 +void testlongdouble() { + long double ld = 2.0; + foold(&ld); +} Propchange: cfe/trunk/test/CodeGen/iamcu-abi.c ------------------------------------------------------------------------------ svn:eol-style = native Propchange: cfe/trunk/test/CodeGen/iamcu-abi.c ------------------------------------------------------------------------------ svn:keywords = Author Date Id Rev URL Propchange: cfe/trunk/test/CodeGen/iamcu-abi.c ------------------------------------------------------------------------------ svn:mime-type = text/plain _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits