mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-24 12:29:33 +00:00
[Sparc] Add support for parsing directives in SparcAsmParser.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@202564 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c9bf74fdc5
commit
17e9537004
@ -73,7 +73,9 @@ class SparcAsmParser : public MCTargetAsmParser {
|
||||
unsigned &RegKind);
|
||||
|
||||
bool matchSparcAsmModifiers(const MCExpr *&EVal, SMLoc &EndLoc);
|
||||
bool parseDirectiveWord(unsigned Size, SMLoc L);
|
||||
|
||||
bool is64Bit() const { return STI.getTargetTriple().startswith("sparcv9"); }
|
||||
public:
|
||||
SparcAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser,
|
||||
const MCInstrInfo &MII)
|
||||
@ -482,8 +484,52 @@ ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
|
||||
bool SparcAsmParser::
|
||||
ParseDirective(AsmToken DirectiveID)
|
||||
{
|
||||
// Ignore all directives for now.
|
||||
Parser.eatToEndOfStatement();
|
||||
StringRef IDVal = DirectiveID.getString();
|
||||
|
||||
if (IDVal == ".byte")
|
||||
return parseDirectiveWord(1, DirectiveID.getLoc());
|
||||
|
||||
if (IDVal == ".half")
|
||||
return parseDirectiveWord(2, DirectiveID.getLoc());
|
||||
|
||||
if (IDVal == ".word")
|
||||
return parseDirectiveWord(4, DirectiveID.getLoc());
|
||||
|
||||
if (IDVal == ".nword")
|
||||
return parseDirectiveWord(is64Bit() ? 8 : 4, DirectiveID.getLoc());
|
||||
|
||||
if (is64Bit() && IDVal == ".xword")
|
||||
return parseDirectiveWord(8, DirectiveID.getLoc());
|
||||
|
||||
if (IDVal == ".register") {
|
||||
// For now, ignore .register directive.
|
||||
Parser.eatToEndOfStatement();
|
||||
return false;
|
||||
}
|
||||
|
||||
// Let the MC layer to handle other directives.
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SparcAsmParser:: parseDirectiveWord(unsigned Size, SMLoc L) {
|
||||
if (getLexer().isNot(AsmToken::EndOfStatement)) {
|
||||
for (;;) {
|
||||
const MCExpr *Value;
|
||||
if (getParser().parseExpression(Value))
|
||||
return true;
|
||||
|
||||
getParser().getStreamer().EmitValue(Value, Size);
|
||||
|
||||
if (getLexer().is(AsmToken::EndOfStatement))
|
||||
break;
|
||||
|
||||
// FIXME: Improve diagnostic.
|
||||
if (getLexer().isNot(AsmToken::Comma))
|
||||
return Error(L, "unexpected token in directive");
|
||||
Parser.Lex();
|
||||
}
|
||||
}
|
||||
Parser.Lex();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -2,8 +2,6 @@
|
||||
; (even when the output is assembly).
|
||||
; FIXME: SPARC doesn't use the integrated assembler by default in all cases
|
||||
; so we only test that -filetype=obj tries to parse the assembly.
|
||||
; FIXME: SPARC seems to accept directives that don't exist
|
||||
; XFAIL: *
|
||||
|
||||
; SKIP: not llc -march=sparc < %s > /dev/null 2> %t1
|
||||
; SKIP: FileCheck %s < %t1
|
||||
|
10
test/MC/Sparc/sparc-directive-xword.s
Normal file
10
test/MC/Sparc/sparc-directive-xword.s
Normal file
@ -0,0 +1,10 @@
|
||||
! RUN: not llvm-mc %s -arch=sparc -show-encoding 2>&1 | FileCheck %s --check-prefix=SPARC32
|
||||
! RUN: llvm-mc %s -arch=sparcv9 -show-encoding | FileCheck %s --check-prefix=SPARC64
|
||||
|
||||
! SPARC32: error: unknown directive
|
||||
! SPARC32-NEXT: .xword 65536
|
||||
! SPARC32-NEXT: ^
|
||||
|
||||
! SPARC64: .xword 65536
|
||||
.xword 65536
|
||||
|
19
test/MC/Sparc/sparc-directives.s
Normal file
19
test/MC/Sparc/sparc-directives.s
Normal file
@ -0,0 +1,19 @@
|
||||
! RUN: llvm-mc %s -arch=sparc -show-encoding | FileCheck %s --check-prefix=SPARC32
|
||||
! RUN: llvm-mc %s -arch=sparcv9 -show-encoding | FileCheck %s --check-prefix=SPARC64
|
||||
|
||||
! SPARC32: .byte 24
|
||||
! SPARC64: .byte 24
|
||||
.byte 24
|
||||
|
||||
! SPARC32: .half 1024
|
||||
! SPARC64: .half 1024
|
||||
.half 1024
|
||||
|
||||
! SPARC32: .word 65536
|
||||
! SPARC64: .word 65536
|
||||
.word 65536
|
||||
|
||||
! SPARC32: .word 65536
|
||||
! SPARC64: .xword 65536
|
||||
.nword 65536
|
||||
|
Loading…
x
Reference in New Issue
Block a user