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/MCInst.h"
|
||||||
#include "llvm/MC/MCInstrDesc.h"
|
#include "llvm/MC/MCInstrDesc.h"
|
||||||
#include "llvm/MC/MCInstrInfo.h"
|
#include "llvm/MC/MCInstrInfo.h"
|
||||||
|
#include "llvm/MC/MCSection.h"
|
||||||
#include "llvm/MC/MCParser/MCAsmLexer.h"
|
#include "llvm/MC/MCParser/MCAsmLexer.h"
|
||||||
#include "llvm/MC/MCParser/MCAsmParser.h"
|
#include "llvm/MC/MCParser/MCAsmParser.h"
|
||||||
#include "llvm/MC/MCParser/MCParsedAsmOperand.h"
|
#include "llvm/MC/MCParser/MCParsedAsmOperand.h"
|
||||||
|
@ -227,6 +228,7 @@ class ARMAsmParser : public MCTargetAsmParser {
|
||||||
bool parseDirectiveRegSave(SMLoc L, bool IsVector);
|
bool parseDirectiveRegSave(SMLoc L, bool IsVector);
|
||||||
bool parseDirectiveInst(SMLoc L, char Suffix = '\0');
|
bool parseDirectiveInst(SMLoc L, char Suffix = '\0');
|
||||||
bool parseDirectiveLtorg(SMLoc L);
|
bool parseDirectiveLtorg(SMLoc L);
|
||||||
|
bool parseDirectiveEven(SMLoc L);
|
||||||
|
|
||||||
StringRef splitMnemonic(StringRef Mnemonic, unsigned &PredicationCode,
|
StringRef splitMnemonic(StringRef Mnemonic, unsigned &PredicationCode,
|
||||||
bool &CarrySetting, unsigned &ProcessorIMod,
|
bool &CarrySetting, unsigned &ProcessorIMod,
|
||||||
|
@ -7912,6 +7914,8 @@ bool ARMAsmParser::ParseDirective(AsmToken DirectiveID) {
|
||||||
return parseDirectiveInst(DirectiveID.getLoc(), 'w');
|
return parseDirectiveInst(DirectiveID.getLoc(), 'w');
|
||||||
else if (IDVal == ".ltorg" || IDVal == ".pool")
|
else if (IDVal == ".ltorg" || IDVal == ".pool")
|
||||||
return parseDirectiveLtorg(DirectiveID.getLoc());
|
return parseDirectiveLtorg(DirectiveID.getLoc());
|
||||||
|
else if (IDVal == ".even")
|
||||||
|
return parseDirectiveEven(DirectiveID.getLoc());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8476,6 +8480,27 @@ bool ARMAsmParser::parseDirectiveLtorg(SMLoc L) {
|
||||||
return false;
|
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.
|
/// Force static initialization.
|
||||||
extern "C" void LLVMInitializeARMAsmParser() {
|
extern "C" void LLVMInitializeARMAsmParser() {
|
||||||
RegisterMCAsmParser<ARMAsmParser> X(TheARMTarget);
|
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