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