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