Never use .lcomm on platforms where it does not accept an alignment
authorUlrich Weigand <ulrich.weigand@de.ibm.com>
Tue, 27 Nov 2012 16:11:16 +0000 (16:11 +0000)
committerUlrich Weigand <ulrich.weigand@de.ibm.com>
Tue, 27 Nov 2012 16:11:16 +0000 (16:11 +0000)
argument.  Instead, use a pair of .local and .comm directives.

This avoids spurious differences between binaries built by the
integrated assembler vs. those built by the external assembler,
since the external assembler may impose alignment requirements
on .lcomm symbols where the integrated assembler does not.

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

lib/CodeGen/AsmPrinter/AsmPrinter.cpp
test/CodeGen/ARM/2010-12-15-elf-lcomm.ll
test/CodeGen/ARM/elf-lcomm-align.ll

index 52840faf7c30b561426323d2ba27f005ffc9bbe3..72b2f0c62afab4f7ef9028ac00112c376672359d 100644 (file)
@@ -308,8 +308,13 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
       return;
     }
 
-    if (Align == 1 ||
-        MAI->getLCOMMDirectiveAlignmentType() != LCOMM::NoAlignment) {
+    // Use .lcomm only if it supports user-specified alignment.
+    // Otherwise, while it would still be correct to use .lcomm in some
+    // cases (e.g. when Align == 1), the external assembler might enfore
+    // some -unknown- default alignment behavior, which could cause
+    // spurious differences between external and integrated assembler.
+    // Prefer to simply fall back to .local / .comm in this case.
+    if (MAI->getLCOMMDirectiveAlignmentType() != LCOMM::NoAlignment) {
       // .lcomm _foo, 42
       OutStreamer.EmitLocalCommonSymbol(GVSym, Size, Align);
       return;
index 5cfbb4f944f7b79620434242bf9e11eec1e9661a..1272a257931d5ba87b6bad27541537aba31e5e9a 100644 (file)
@@ -10,7 +10,8 @@
 @STRIDE = internal global i32 8
 
 ; ASM:          .type   array00,%object         @ @array00
-; ASM-NEXT:     .lcomm  array00,80
+; ASM-NEXT:     .local  array00
+; ASM-NEXT:     .comm   array00,80,1
 ; ASM-NEXT:     .type   _MergedGlobals,%object  @ @_MergedGlobals
 
 
index 46792990e59397aed4401df6b1664c6444cc7ec5..a98b3c06f5e294cfef40f40134499dd9dcb5e3d5 100644 (file)
@@ -4,8 +4,9 @@
 @c = internal global i8 0, align 1
 @x = internal global i32 0, align 4
 
-; CHECK: .lcomm c,1
-; .lcomm doesn't support alignment.
+; .lcomm doesn't support alignment, so we always use .local/.comm.
+; CHECK: .local c
+; CHECK-NEXT: .comm c,1,1
 ; CHECK: .local x
 ; CHECK-NEXT: .comm x,4,4