mirror of https://github.com/microsoft/clang.git
[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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@260376 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
54d0827c8d
commit
8284fd6aca
|
@ -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;
|
||||
|
|
|
@ -1904,8 +1904,8 @@ unsigned ASTContext::getPreferredTypeAlign(const Type *T) const {
|
|||
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>())
|
||||
|
|
|
@ -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[] = {
|
||||
|
|
|
@ -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);
|
||||
}
|
Loading…
Reference in New Issue