]> granicus.if.org Git - clang/commitdiff
Limit COFF 'common' emission to <=32 alignment types.
authorErich Keane <erich.keane@intel.com>
Tue, 8 Jan 2019 18:44:22 +0000 (18:44 +0000)
committerErich Keane <erich.keane@intel.com>
Tue, 8 Jan 2019 18:44:22 +0000 (18:44 +0000)
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
test/CodeGen/microsoft-no-common-align.c [new file with mode: 0644]

index 54190493f043c59a06d3fe1631d54f5a8edeb42a..ab0ac67d8e8d40330097332d3f756ce54f83b91f 100644 (file)
@@ -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 (file)
index 0000000..fc46946
--- /dev/null
@@ -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