From: Rafael Espindola Date: Wed, 7 Aug 2013 18:08:19 +0000 (+0000) Subject: Correctly allign arrays on 32 bit systems. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b82f77fbe320a497f0b60d241c59b651b3ce15ca;p=clang Correctly allign arrays on 32 bit systems. Before this patch we would align long long int big[1024]; to 4 bytes on 32 bit systems. The problem is that we were only looking at the element type when getLargeArrayMinWidth returned non zero. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@187897 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 65e5e6daaa..c4bda1f14a 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -1286,13 +1286,14 @@ CharUnits ASTContext::getDeclAlign(const Decl *D, bool RefAsPointee) const { // Adjust alignments of declarations with array type by the // large-array alignment on the target. unsigned MinWidth = Target->getLargeArrayMinWidth(); - const ArrayType *arrayType; - if (MinWidth && (arrayType = getAsArrayType(T))) { - if (isa(arrayType)) - Align = std::max(Align, Target->getLargeArrayAlign()); - else if (isa(arrayType) && - MinWidth <= getTypeSize(cast(arrayType))) - Align = std::max(Align, Target->getLargeArrayAlign()); + if (const ArrayType *arrayType = getAsArrayType(T)) { + if (MinWidth) { + if (isa(arrayType)) + Align = std::max(Align, Target->getLargeArrayAlign()); + else if (isa(arrayType) && + MinWidth <= getTypeSize(cast(arrayType))) + Align = std::max(Align, Target->getLargeArrayAlign()); + } // Walk through any array types while we're at it. T = getBaseElementType(arrayType); diff --git a/test/CodeGen/alignment.c b/test/CodeGen/alignment.c index 98ea01be09..04d6aaccc2 100644 --- a/test/CodeGen/alignment.c +++ b/test/CodeGen/alignment.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -triple i386-unknown-linux-gnu -emit-llvm %s -o - | FileCheck %s __attribute((aligned(16))) float a[128]; union {int a[4]; __attribute((aligned(16))) float b[4];} b; @@ -6,7 +6,8 @@ union {int a[4]; __attribute((aligned(16))) float b[4];} b; // CHECK: @a = {{.*}}zeroinitializer, align 16 // CHECK: @b = {{.*}}zeroinitializer, align 16 - +long long int test5[1024]; +// CHECK-DAG: @test5 = common global [1024 x i64] zeroinitializer, align 8 // PR5279 - Reduced alignment on typedef. typedef int myint __attribute__((aligned(1)));