MCAsmParserExtension.h revision 93c65e6e661eda75711363bdd5ca15909920e1f0
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===-- llvm/MC/MCAsmParserExtension.h - Asm Parser Hooks -------*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci//
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#ifndef LLVM_MC_MCASMPARSEREXTENSION_H
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define LLVM_MC_MCASMPARSEREXTENSION_H
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "llvm/MC/MCParser/MCAsmParser.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/ADT/StringRef.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "llvm/Support/SMLoc.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace llvm {
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Twine;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// \brief Generic interface for extending the MCAsmParser,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// which is implemented by target and object file assembly parser
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/// implementations.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MCAsmParserExtension {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MCAsmParserExtension(const MCAsmParserExtension &);   // DO NOT IMPLEMENT
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void operator=(const MCAsmParserExtension &);  // DO NOT IMPLEMENT
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MCAsmParser *Parser;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)protected:
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MCAsmParserExtension();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper template for implementing static dispatch functions.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template<typename T, bool (T::*Handler)(StringRef, SMLoc)>
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool HandleDirective(MCAsmParserExtension *Target,
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              StringRef Directive,
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              SMLoc DirectiveLoc) {
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    T *Obj = static_cast<T*>(Target);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (Obj->*Handler)(Directive, DirectiveLoc);
3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool BracketExpressionsSupported;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MCAsmParserExtension();
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \brief Initialize the extension for parsing using the given \arg
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// Parser. The extension should use the AsmParser interfaces to register its
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// parsing routines.
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Initialize(MCAsmParser &Parser);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @name MCAsmParser Proxy Interfaces
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  /// @{
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MCContext &getContext() { return getParser().getContext(); }
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MCAsmLexer &getLexer() { return getParser().getLexer(); }
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MCAsmParser &getParser() { return *Parser; }
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SourceMgr &getSourceManager() { return getParser().getSourceManager(); }
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MCStreamer &getStreamer() { return getParser().getStreamer(); }
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Warning(SMLoc L, const Twine &Msg) {
6003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return getParser().Warning(L, Msg);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool Error(SMLoc L, const Twine &Msg) {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return getParser().Error(L, Msg);
64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool TokError(const Twine &Msg) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return getParser().TokError(Msg);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const AsmToken &Lex() { return getParser().Lex(); }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const AsmToken &getTok() { return getParser().getTok(); }
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasBracketExpressions() const { return BracketExpressionsSupported; }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// @}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // End llvm namespace
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)