From ec1c80576d63ac4114d3d43380700117c340b9dc Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Sun, 23 Feb 2014 17:45:32 +0000 Subject: [PATCH] ARM IAS: support .align without parameters .align is handled specially on certain targets. .align without any parameters on ARM indicates a default alignment (4). Handle the special case in the target parser, but fall back to the generic parser for the normal version. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@201988 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 20 ++++++++++++++++ test/MC/ARM/directive-align.s | 28 +++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 test/MC/ARM/directive-align.s diff --git a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index 82b510b9a5d..7c0dcd6c7d2 100644 --- a/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/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 X(TheARMTarget); diff --git a/test/MC/ARM/directive-align.s b/test/MC/ARM/directive-align.s new file mode 100644 index 00000000000..d3e39cb1c56 --- /dev/null +++ b/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 +