fix PR6921 a different way. Intead of increasing the
authorChris Lattner <sabre@nondot.org>
Mon, 26 Apr 2010 18:46:46 +0000 (18:46 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 26 Apr 2010 18:46:46 +0000 (18:46 +0000)
alignment of globals with a specified alignment, we fix
common variables to obey their alignment.  Add a comment
explaining why this behavior is important.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@102365 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/AsmPrinter/AsmPrinter.cpp
test/CodeGen/X86/alignment.ll [new file with mode: 0644]
test/CodeGen/X86/unaligned-load.ll

index 4660e1b2ccd650e9d8ff42bd3b4b1e2ed216266a..6fc883359bebd77a5c6ab1771b0b7efef2c3d4f1 100644 (file)
@@ -228,7 +228,15 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
 
   const TargetData *TD = TM.getTargetData();
   unsigned Size = TD->getTypeAllocSize(GV->getType()->getElementType());
-  unsigned AlignLog = TD->getPreferredAlignmentLog(GV);
+  
+  // If the alignment is specified, we *must* obey it.  Overaligning a global
+  // with a specified alignment is a prompt way to break globals emitted to
+  // sections and expected to be contiguous (e.g. ObjC metadata).
+  unsigned AlignLog;
+  if (unsigned GVAlign = GV->getAlignment())
+    AlignLog = Log2_32(GVAlign);
+  else
+    AlignLog = TD->getPreferredAlignmentLog(GV);
   
   // Handle common and BSS local symbols (.lcomm).
   if (GVKind.isCommon() || GVKind.isBSSLocal()) {
diff --git a/test/CodeGen/X86/alignment.ll b/test/CodeGen/X86/alignment.ll
new file mode 100644 (file)
index 0000000..06a4f3f
--- /dev/null
@@ -0,0 +1,18 @@
+; RUN: llc %s -o - -mtriple=x86_64-linux-gnu | FileCheck %s
+
+; This cannot get rounded up to the preferred alignment (16) if they have an
+; explicit alignment specified.
+@GlobalA = global { [384 x i8] } zeroinitializer, align 8 
+
+; CHECK:       .bss
+; CHECK:       .globl  GlobalA
+; CHECK:       .align  8
+; CHECK: GlobalA:
+; CHECK:       .zero   384
+
+; Common variables should not get rounded up to the preferred alignment (16) if
+; they have an explicit alignment specified.
+; PR6921
+@GlobalB = common global { [384 x i8] } zeroinitializer, align 8
+
+; CHECK:       .comm   GlobalB,384,8
\ No newline at end of file
index e210531068ec703b9864f74b0b0c66692215b40a..b26097f31b4827353fde8ccfade735d1736e192e 100644 (file)
@@ -28,6 +28,7 @@ return:
 
 declare void @llvm.memcpy.i64(i8* nocapture, i8* nocapture, i64, i32) nounwind
 
+; CORE2: .section
 ; CORE2: .align  3
 ; CORE2-NEXT: _.str1:
 ; CORE2-NEXT: .asciz "DHRYSTONE PROGRAM, SOME STRING"