Skip to content
This repository has been archived by the owner on Apr 23, 2020. It is now read-only.

Commit

Permalink
ARM IAS: support .align without parameters
Browse files Browse the repository at this point in the history
.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
  • Loading branch information
compnerd committed Feb 23, 2014
1 parent 69f706d commit ec1c805
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 0 deletions.
20 changes: 20 additions & 0 deletions lib/Target/ARM/AsmParser/ARMAsmParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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;
}

Expand Down Expand Up @@ -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);
Expand Down
28 changes: 28 additions & 0 deletions test/MC/ARM/directive-align.s
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit ec1c805

Please sign in to comment.