From 92f4b5cbeee88f31a8df876f73b823db284f68de Mon Sep 17 00:00:00 2001 From: Erich Keane Date: Tue, 8 Jan 2019 18:44:22 +0000 Subject: [PATCH] Limit COFF 'common' emission to <=32 alignment types. As reported in PR33035, LLVM crashes if given a common object with an alignment of greater than 32 bits. This is because the COFF file format does not support these alignments, so emitting them is broken anyway. This patch changes any global definitions greater than 32 bit alignment to no longer be in 'common'. https://bugs.llvm.org/show_bug.cgi?id=33035 Differential Revision: https://reviews.llvm.org/D56391 Change-Id: I48609289753b7f3b58c5e2bc1712756750fbd45a git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@350643 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CodeGenModule.cpp | 5 +++++ test/CodeGen/microsoft-no-common-align.c | 8 ++++++++ 2 files changed, 13 insertions(+) create mode 100644 test/CodeGen/microsoft-no-common-align.c diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 54190493f0..ab0ac67d8e 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -3761,6 +3761,11 @@ static bool isVarDeclStrongDefinition(const ASTContext &Context, } } } + // COFF doesn't support alignments greater than 32, so these cannot be + // in common. + if (Context.getTargetInfo().getTriple().isKnownWindowsMSVCEnvironment() && + Context.getTypeAlignIfKnown(D->getType()) > 32) + return true; return false; } diff --git a/test/CodeGen/microsoft-no-common-align.c b/test/CodeGen/microsoft-no-common-align.c new file mode 100644 index 0000000000..fc46946c00 --- /dev/null +++ b/test/CodeGen/microsoft-no-common-align.c @@ -0,0 +1,8 @@ +// RUN: %clang_cc1 -triple x86_64-windows-msvc -emit-llvm -o - %s | FileCheck %s +typedef float TooLargeAlignment __attribute__((__vector_size__(64))); +typedef float NormalAlignment __attribute__((__vector_size__(4))); + +TooLargeAlignment TooBig; +// CHECK: @TooBig = dso_local global <16 x float> zeroinitializer, align 64 +NormalAlignment JustRight; +// CHECK: @JustRight = common dso_local global <1 x float> zeroinitializer, align 4 -- 2.50.1