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.

llvm-svn: 201988
This commit is contained in:
Saleem Abdulrasool 2014-02-23 17:45:32 +00:00
parent 5afdd1d770
commit fd6ed1ea6b
2 changed files with 48 additions and 0 deletions

View File

@ -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);

View File

@ -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