[PATCH] D15647: [X86] Fix stack alignment for MCU target (Clang part)

Anton Nadolskiy via cfe-commits cfe-commits at lists.llvm.org
Fri Dec 18 10:02:41 PST 2015


anadolskiy created this revision.
anadolskiy added a reviewer: rjmccall.
anadolskiy added a subscriber: cfe-commits.

This patch fixes stack alignments for MCU (should be aligned to 4 bytes) 
LLVM part: http://reviews.llvm.org/D15646

http://reviews.llvm.org/D15647

Files:
  tools/clang/lib/AST/ASTContext.cpp
  tools/clang/lib/Basic/Targets.cpp
  tools/clang/test/CodeGen/iamcu-abi.c

Index: tools/clang/test/CodeGen/iamcu-abi.c
===================================================================
--- tools/clang/test/CodeGen/iamcu-abi.c
+++ tools/clang/test/CodeGen/iamcu-abi.c
@@ -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);
+}
Index: tools/clang/lib/Basic/Targets.cpp
===================================================================
--- tools/clang/lib/Basic/Targets.cpp
+++ tools/clang/lib/Basic/Targets.cpp
@@ -3877,6 +3877,8 @@
   MCUX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
     LongDoubleWidth = 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";
   }
 
   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
Index: tools/clang/lib/AST/ASTContext.cpp
===================================================================
--- tools/clang/lib/AST/ASTContext.cpp
+++ tools/clang/lib/AST/ASTContext.cpp
@@ -1898,8 +1898,9 @@
   if (T->isMemberPointerType())
     return getPreferredTypeAlign(getPointerDiffType().getTypePtr());
 
-  if (Target->getTriple().getArch() == llvm::Triple::xcore)
-    return ABIAlign;  // Never overalign on XCore.
+  if (Target->getTriple().getArch() == llvm::Triple::xcore ||
+      Target->getTriple().isOSIAMCU())
+    return ABIAlign;  // Never overalign on XCore and IAMCU.
 
   // Double and long long should be naturally aligned if possible.
   if (const ComplexType *CT = T->getAs<ComplexType>())


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D15647.43244.patch
Type: text/x-patch
Size: 2412 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20151218/f1ea1d65/attachment.bin>


More information about the cfe-commits mailing list