forked from OSchip/llvm-project
ARM IAS: support .even directive
The .even directive aligns content to an evan-numbered address. This is an ARM specific directive applicable to any section. llvm-svn: 198031
This commit is contained in:
parent
bf683fd15c
commit
a554968dde
|
@ -31,6 +31,7 @@
|
|||
#include "llvm/MC/MCInst.h"
|
||||
#include "llvm/MC/MCInstrDesc.h"
|
||||
#include "llvm/MC/MCInstrInfo.h"
|
||||
#include "llvm/MC/MCSection.h"
|
||||
#include "llvm/MC/MCParser/MCAsmLexer.h"
|
||||
#include "llvm/MC/MCParser/MCAsmParser.h"
|
||||
#include "llvm/MC/MCParser/MCParsedAsmOperand.h"
|
||||
|
@ -227,6 +228,7 @@ class ARMAsmParser : public MCTargetAsmParser {
|
|||
bool parseDirectiveRegSave(SMLoc L, bool IsVector);
|
||||
bool parseDirectiveInst(SMLoc L, char Suffix = '\0');
|
||||
bool parseDirectiveLtorg(SMLoc L);
|
||||
bool parseDirectiveEven(SMLoc L);
|
||||
|
||||
StringRef splitMnemonic(StringRef Mnemonic, unsigned &PredicationCode,
|
||||
bool &CarrySetting, unsigned &ProcessorIMod,
|
||||
|
@ -7912,6 +7914,8 @@ bool ARMAsmParser::ParseDirective(AsmToken DirectiveID) {
|
|||
return parseDirectiveInst(DirectiveID.getLoc(), 'w');
|
||||
else if (IDVal == ".ltorg" || IDVal == ".pool")
|
||||
return parseDirectiveLtorg(DirectiveID.getLoc());
|
||||
else if (IDVal == ".even")
|
||||
return parseDirectiveEven(DirectiveID.getLoc());
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -8476,6 +8480,27 @@ bool ARMAsmParser::parseDirectiveLtorg(SMLoc L) {
|
|||
return false;
|
||||
}
|
||||
|
||||
bool ARMAsmParser::parseDirectiveEven(SMLoc L) {
|
||||
const MCSection *Section = getStreamer().getCurrentSection().first;
|
||||
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement)) {
|
||||
TokError("unexpected token in directive");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!Section) {
|
||||
getStreamer().InitToTextSection();
|
||||
Section = getStreamer().getCurrentSection().first;
|
||||
}
|
||||
|
||||
if (Section->UseCodeAlign())
|
||||
getStreamer().EmitCodeAlignment(2, 0);
|
||||
else
|
||||
getStreamer().EmitValueToAlignment(2, 0, 1, 0);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/// Force static initialization.
|
||||
extern "C" void LLVMInitializeARMAsmParser() {
|
||||
RegisterMCAsmParser<ARMAsmParser> X(TheARMTarget);
|
||||
|
|
|
@ -0,0 +1,70 @@
|
|||
@ RUN: llvm-mc -triple armv7-eabi -filetype obj -o - %s | llvm-readobj -s -sd \
|
||||
@ RUN: | FileCheck %s
|
||||
|
||||
.syntax unified
|
||||
|
||||
.text
|
||||
|
||||
.even
|
||||
|
||||
.global aligned_function
|
||||
.type aligned_function,%function
|
||||
aligned_function:
|
||||
bkpt
|
||||
|
||||
.space 5
|
||||
|
||||
.even
|
||||
|
||||
.global unaligned_function
|
||||
.type unaligned_function,%function
|
||||
unaligned_function:
|
||||
bkpt
|
||||
|
||||
@ CHECK: Section {
|
||||
@ CHECK: Name: .text
|
||||
@ CHECK: SectionData (
|
||||
@ CHECK: 0000: 700020E1 00000000 00007000 20E1
|
||||
@ CHECK: )
|
||||
@ CHECK: }
|
||||
|
||||
.data
|
||||
|
||||
.space 15
|
||||
|
||||
.even
|
||||
|
||||
.global classifiable
|
||||
.type classifiable,%object
|
||||
classifiable:
|
||||
.byte 0xf1
|
||||
.byte 0x51
|
||||
.byte 0xa5
|
||||
.byte 0xc1
|
||||
.byte 0x00
|
||||
.byte 0x00
|
||||
.byte 0x1e
|
||||
.byte 0xab
|
||||
|
||||
.even
|
||||
|
||||
.global declassified
|
||||
.type declassified,%object
|
||||
declassified:
|
||||
.byte 0x51
|
||||
.byte 0xa5
|
||||
.byte 0xc1
|
||||
.byte 0xde
|
||||
.byte 0x00
|
||||
.byte 0x00
|
||||
.byte 0xed
|
||||
.byte 0xf1
|
||||
|
||||
@ CHECK: Section {
|
||||
@ CHECK: Name: .data
|
||||
@ CHECK: SectionData (
|
||||
@ CHECK: 0000: 00000000 00000000 00000000 00000000
|
||||
@ CHECK: 0010: F151A5C1 00001EAB 51A5C1DE 0000EDF1
|
||||
@ CHECK: )
|
||||
@ CHECK: }
|
||||
|
Loading…
Reference in New Issue