summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp20
-rw-r--r--llvm/test/MC/ARM/directive-align.s28
2 files changed, 48 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
index 82b510b9a5d..7c0dcd6c7d2 100644
--- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
+++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp
@@ -228,6 +228,7 @@ class ARMAsmParser : public MCTargetAsmParser {
bool parseDirectiveMovSP(SMLoc L);
bool parseDirectiveObjectArch(SMLoc L);
bool parseDirectiveArchExtension(SMLoc L);
+ bool parseDirectiveAlign(SMLoc L);
StringRef splitMnemonic(StringRef Mnemonic, unsigned &PredicationCode,
bool &CarrySetting, unsigned &ProcessorIMod,
@@ -8022,6 +8023,8 @@ bool ARMAsmParser::ParseDirective(AsmToken DirectiveID) {
return parseDirectiveObjectArch(DirectiveID.getLoc());
else if (IDVal == ".arch_extension")
return parseDirectiveArchExtension(DirectiveID.getLoc());
+ else if (IDVal == ".align")
+ return parseDirectiveAlign(DirectiveID.getLoc());
return true;
}
@@ -9061,6 +9064,23 @@ bool ARMAsmParser::parseDirectiveObjectArch(SMLoc L) {
return false;
}
+/// parseDirectiveAlign
+/// ::= .align
+bool ARMAsmParser::parseDirectiveAlign(SMLoc L) {
+ // NOTE: if this is not the end of the statement, fall back to the target
+ // agnostic handling for this directive which will correctly handle this.
+ if (getLexer().isNot(AsmToken::EndOfStatement))
+ return true;
+
+ // '.align' is target specifically handled to mean 2**2 byte alignment.
+ if (getStreamer().getCurrentSection().first->UseCodeAlign())
+ getStreamer().EmitCodeAlignment(4, 0);
+ else
+ getStreamer().EmitValueToAlignment(4, 0, 1, 0);
+
+ return false;
+}
+
/// Force static initialization.
extern "C" void LLVMInitializeARMAsmParser() {
RegisterMCAsmParser<ARMAsmParser> X(TheARMTarget);
diff --git a/llvm/test/MC/ARM/directive-align.s b/llvm/test/MC/ARM/directive-align.s
new file mode 100644
index 00000000000..d3e39cb1c56
--- /dev/null
+++ b/llvm/test/MC/ARM/directive-align.s
@@ -0,0 +1,28 @@
+@ RUN: llvm-mc -triple armv7-eabi %s | FileCheck %s
+
+ .data
+
+unaligned:
+ .byte 1
+ .align
+
+@ CHECK-LABEL: unaligned
+@ CHECK-NEXT: .byte 1
+@ CHECK-NEXT: .align 2
+
+aligned:
+ .long 0x1d10c1e5
+ .align
+
+@ CHECK-LABEL: aligned
+@ CHECK-NEXT: .long 487637477
+@ CHECK-NEXT: .align 2
+
+trailer:
+ .long 0xd1ab011c
+ .align 2
+
+@ CHECK-LABEL: trailer
+@ CHECK-NEXT: .long 3517645084
+@ CHECK-NEXT: .align 2
+
OpenPOWER on IntegriCloud