blob: c0ca1493e9d664b85fe2625bb3c4abb7333c2188 [file] [log] [blame]
Kevin Enderbyca9c42c2009-09-15 00:27:25 +00001//===-- ARMAsmParser.cpp - Parse ARM assembly to MCInst instructions ------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "ARM.h"
11#include "llvm/ADT/SmallVector.h"
12#include "llvm/ADT/Twine.h"
13#include "llvm/MC/MCAsmLexer.h"
14#include "llvm/MC/MCAsmParser.h"
15#include "llvm/MC/MCStreamer.h"
16#include "llvm/MC/MCExpr.h"
17#include "llvm/MC/MCInst.h"
18#include "llvm/Support/SourceMgr.h"
19#include "llvm/Target/TargetRegistry.h"
20#include "llvm/Target/TargetAsmParser.h"
21using namespace llvm;
22
23namespace {
24struct ARMOperand;
25
26class ARMAsmParser : public TargetAsmParser {
27 MCAsmParser &Parser;
28
29private:
30 MCAsmParser &getParser() const { return Parser; }
31
32 MCAsmLexer &getLexer() const { return Parser.getLexer(); }
33
34 void Warning(SMLoc L, const Twine &Msg) { Parser.Warning(L, Msg); }
35
36 bool Error(SMLoc L, const Twine &Msg) { return Parser.Error(L, Msg); }
37
38 bool ParseDirectiveWord(unsigned Size, SMLoc L);
39
40public:
41 ARMAsmParser(const Target &T, MCAsmParser &_Parser)
42 : TargetAsmParser(T), Parser(_Parser) {}
43
44 virtual bool ParseInstruction(const StringRef &Name, MCInst &Inst);
45
46 virtual bool ParseDirective(AsmToken DirectiveID);
47};
48
49} // end anonymous namespace
50
51bool ARMAsmParser::ParseInstruction(const StringRef &Name, MCInst &Inst) {
52 SMLoc Loc = getLexer().getTok().getLoc();
53 Error(Loc, "ARMAsmParser::ParseInstruction currently unimplemented");
54 return true;
55}
56
57bool ARMAsmParser::ParseDirective(AsmToken DirectiveID) {
58 StringRef IDVal = DirectiveID.getIdentifier();
59 if (IDVal == ".word")
60 return ParseDirectiveWord(4, DirectiveID.getLoc());
61 return true;
62}
63
64/// ParseDirectiveWord
65/// ::= .word [ expression (, expression)* ]
66bool ARMAsmParser::ParseDirectiveWord(unsigned Size, SMLoc L) {
67 if (getLexer().isNot(AsmToken::EndOfStatement)) {
68 for (;;) {
69 const MCExpr *Value;
70 if (getParser().ParseExpression(Value))
71 return true;
72
73 getParser().getStreamer().EmitValue(Value, Size);
74
75 if (getLexer().is(AsmToken::EndOfStatement))
76 break;
77
78 // FIXME: Improve diagnostic.
79 if (getLexer().isNot(AsmToken::Comma))
80 return Error(L, "unexpected token in directive");
81 getLexer().Lex();
82 }
83 }
84
85 getLexer().Lex();
86 return false;
87}
88
89// Force static initialization.
90extern "C" void LLVMInitializeARMAsmParser() {
91 RegisterAsmParser<ARMAsmParser> X(TheARMTarget);
92 RegisterAsmParser<ARMAsmParser> Y(TheThumbTarget);
93}