diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/AST/ASTContext.cpp | 2 | ||||
| -rw-r--r-- | clang/test/CodeGen/align-systemz.c | 14 | ||||
| -rw-r--r-- | clang/test/Sema/align-systemz.c | 17 |
3 files changed, 32 insertions, 1 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 899f8c5ff52..c54a006d26a 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -1335,7 +1335,7 @@ CharUnits ASTContext::getDeclAlign(const Decl *D, bool ForAlignof) const { } Align = std::max(Align, getPreferredTypeAlign(T.getTypePtr())); if (const VarDecl *VD = dyn_cast<VarDecl>(D)) { - if (VD->hasGlobalStorage()) + if (VD->hasGlobalStorage() && !ForAlignof) Align = std::max(Align, getTargetInfo().getMinGlobalAlign()); } } diff --git a/clang/test/CodeGen/align-systemz.c b/clang/test/CodeGen/align-systemz.c new file mode 100644 index 00000000000..277492c0601 --- /dev/null +++ b/clang/test/CodeGen/align-systemz.c @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 -triple s390x-linux-gnu -emit-llvm %s -o - | FileCheck %s + +// SystemZ prefers to align all global variables to two bytes. + +struct test { + signed char a; +}; + +char c; +// CHECK-DAG: @c = common global i8 0, align 2 + +struct test s; +// CHECK-DAG: @s = common global %struct.test zeroinitializer, align 2 + diff --git a/clang/test/Sema/align-systemz.c b/clang/test/Sema/align-systemz.c new file mode 100644 index 00000000000..6928549de11 --- /dev/null +++ b/clang/test/Sema/align-systemz.c @@ -0,0 +1,17 @@ +// RUN: %clang_cc1 -triple s390x-linux-gnu -fsyntax-only -verify %s +// expected-no-diagnostics + +// SystemZ prefers to align all global variables to two bytes, +// but this should *not* be reflected in the ABI alignment as +// retrieved via __alignof__. + +struct test { + signed char a; +}; + +char c; +struct test s; + +int chk1[__alignof__(c) == 1 ? 1 : -1]; +int chk2[__alignof__(s) == 1 ? 1 : -1]; + |

