[MC/ELF] Accept zero for .align directive
authorDavide Italiano <davide@freebsd.org>
Tue, 8 Sep 2015 18:59:47 +0000 (18:59 +0000)
committerDavide Italiano <davide@freebsd.org>
Tue, 8 Sep 2015 18:59:47 +0000 (18:59 +0000)
.align directive refuses alignment 0 -- a comment in the code hints this is
done for GNU as compatibility, but it seems GNU as accepts .align 0
(and silently rounds up alignment to 1).

Differential Revision:  http://reviews.llvm.org/D12682

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

lib/MC/MCParser/AsmParser.cpp
test/MC/ELF/align-zero.s [new file with mode: 0644]

index 5e174de..7126a90 100644 (file)
@@ -2706,7 +2706,11 @@ bool AsmParser::parseDirectiveAlign(bool IsPow2, unsigned ValueSize) {
 
     Alignment = 1ULL << Alignment;
   } else {
-    // Reject alignments that aren't a power of two, for gas compatibility.
+    // Reject alignments that aren't either a power of two or zero,
+    // for gas compatibility. Alignment of zero is silently rounded
+    // up to one.
+    if (Alignment == 0)
+      Alignment = 1;
     if (!isPowerOf2_64(Alignment))
       Error(AlignmentLoc, "alignment must be a power of 2");
   }
diff --git a/test/MC/ELF/align-zero.s b/test/MC/ELF/align-zero.s
new file mode 100644 (file)
index 0000000..d8087d1
--- /dev/null
@@ -0,0 +1,4 @@
+// Test that an alignment of zero is accepted.
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o -
+
+  .align 0