From af3d1de89125d918dfb1142b02c4bedf9b7b85cf Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Mon, 12 Jul 2010 17:27:45 +0000 Subject: [PATCH] MC: Add MCAsmParserExtension, a base class for all the target/object specific classes which want to extend the basic asm parser. llvm-svn: 108158 --- llvm/include/llvm/MC/MCParser/AsmParser.h | 3 +- .../llvm/MC/MCParser/MCAsmParserExtension.h | 65 +++++++++++++++++++ llvm/include/llvm/Target/TargetAsmParser.h | 4 +- llvm/lib/MC/MCParser/AsmParser.cpp | 6 ++ llvm/lib/MC/MCParser/CMakeLists.txt | 1 + llvm/lib/MC/MCParser/MCAsmParserExtension.cpp | 21 ++++++ 6 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 llvm/include/llvm/MC/MCParser/MCAsmParserExtension.h create mode 100644 llvm/lib/MC/MCParser/MCAsmParserExtension.cpp diff --git a/llvm/include/llvm/MC/MCParser/AsmParser.h b/llvm/include/llvm/MC/MCParser/AsmParser.h index 5b48757d97a4..0ad7941be2c0 100644 --- a/llvm/include/llvm/MC/MCParser/AsmParser.h +++ b/llvm/include/llvm/MC/MCParser/AsmParser.h @@ -63,7 +63,6 @@ public: ~AsmParser(); bool Run(bool NoInitialTextSection, bool NoFinalize = false); - void AddDirectiveHandler(StringRef Directive, bool (AsmParser::*Handler)(StringRef, SMLoc)) { @@ -71,7 +70,7 @@ public: } public: TargetAsmParser &getTargetParser() const { return *TargetParser; } - void setTargetParser(TargetAsmParser &P) { TargetParser = &P; } + void setTargetParser(TargetAsmParser &P); /// @name MCAsmParser Interface /// { diff --git a/llvm/include/llvm/MC/MCParser/MCAsmParserExtension.h b/llvm/include/llvm/MC/MCParser/MCAsmParserExtension.h new file mode 100644 index 000000000000..8938cf3ef7a7 --- /dev/null +++ b/llvm/include/llvm/MC/MCParser/MCAsmParserExtension.h @@ -0,0 +1,65 @@ +//===-- llvm/MC/MCAsmParserExtension.h - Asm Parser Hooks -------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_MC_MCASMPARSEREXTENSION_H +#define LLVM_MC_MCASMPARSEREXTENSION_H + +#include "llvm/MC/MCParser/MCAsmParser.h" +#include "llvm/Support/SMLoc.h" + +namespace llvm { + +/// \brief Generic interface for extending the MCAsmParser, +/// which is implemented by target and object file assembly parser +/// implementations. +class MCAsmParserExtension { + MCAsmParserExtension(const MCAsmParserExtension &); // DO NOT IMPLEMENT + void operator=(const MCAsmParserExtension &); // DO NOT IMPLEMENT + + MCAsmParser *Parser; + +protected: + MCAsmParserExtension(); + +public: + virtual ~MCAsmParserExtension(); + + /// \brief Initialize the extension for parsing using the given \arg + /// Parser. The extension should use the AsmParser interfaces to register its + /// parsing routines. + virtual void Initialize(MCAsmParser &Parser); + + /// @name MCAsmParser Proxy Interfaces + /// @{ + + MCContext &getContext() { return getParser().getContext(); } + MCAsmLexer &getLexer() { return getParser().getLexer(); } + MCAsmParser &getParser() { return *Parser; } + MCStreamer &getStreamer() { return getParser().getStreamer(); } + void Warning(SMLoc L, const Twine &Msg) { + return getParser().Warning(L, Msg); + } + bool Error(SMLoc L, const Twine &Msg) { + return getParser().Error(L, Msg); + } + + const AsmToken &Lex() { return getParser().Lex(); } + + const AsmToken &getTok() { return getParser().getTok(); } + + bool TokError(const char *Msg) { + return getParser().TokError(Msg); + } + + /// @} +}; + +} // End llvm namespace + +#endif diff --git a/llvm/include/llvm/Target/TargetAsmParser.h b/llvm/include/llvm/Target/TargetAsmParser.h index 85315c155d8a..dc2b2364e595 100644 --- a/llvm/include/llvm/Target/TargetAsmParser.h +++ b/llvm/include/llvm/Target/TargetAsmParser.h @@ -10,6 +10,8 @@ #ifndef LLVM_TARGET_TARGETPARSER_H #define LLVM_TARGET_TARGETPARSER_H +#include "llvm/MC/MCParser/MCAsmParserExtension.h" + namespace llvm { class MCInst; class StringRef; @@ -20,7 +22,7 @@ class MCParsedAsmOperand; template class SmallVectorImpl; /// TargetAsmParser - Generic interface to target specific assembly parsers. -class TargetAsmParser { +class TargetAsmParser : public MCAsmParserExtension { TargetAsmParser(const TargetAsmParser &); // DO NOT IMPLEMENT void operator=(const TargetAsmParser &); // DO NOT IMPLEMENT protected: // Can only create subclasses. diff --git a/llvm/lib/MC/MCParser/AsmParser.cpp b/llvm/lib/MC/MCParser/AsmParser.cpp index a8f2bbddb670..01bc91750145 100644 --- a/llvm/lib/MC/MCParser/AsmParser.cpp +++ b/llvm/lib/MC/MCParser/AsmParser.cpp @@ -47,6 +47,12 @@ AsmParser::AsmParser(const Target &T, SourceMgr &_SM, MCContext &_Ctx, AsmParser::~AsmParser() { } +void AsmParser::setTargetParser(TargetAsmParser &P) { + assert(!TargetParser && "Target parser is already initialized!"); + TargetParser = &P; + TargetParser->Initialize(*this); +} + void AsmParser::Warning(SMLoc L, const Twine &Msg) { PrintMessage(L, Msg.str(), "warning"); } diff --git a/llvm/lib/MC/MCParser/CMakeLists.txt b/llvm/lib/MC/MCParser/CMakeLists.txt index a5c0818d609b..4dae5ea101a4 100644 --- a/llvm/lib/MC/MCParser/CMakeLists.txt +++ b/llvm/lib/MC/MCParser/CMakeLists.txt @@ -3,5 +3,6 @@ add_llvm_library(LLVMMCParser AsmParser.cpp MCAsmLexer.cpp MCAsmParser.cpp + MCAsmParserExtension.cpp TargetAsmParser.cpp ) diff --git a/llvm/lib/MC/MCParser/MCAsmParserExtension.cpp b/llvm/lib/MC/MCParser/MCAsmParserExtension.cpp new file mode 100644 index 000000000000..c30d3067da59 --- /dev/null +++ b/llvm/lib/MC/MCParser/MCAsmParserExtension.cpp @@ -0,0 +1,21 @@ +//===-- MCAsmParserExtension.cpp - Asm Parser Hooks -----------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/MC/MCParser/MCAsmParserExtension.h" +using namespace llvm; + +MCAsmParserExtension::MCAsmParserExtension() { +} + +MCAsmParserExtension::~MCAsmParserExtension() { +} + +void MCAsmParserExtension::Initialize(MCAsmParser &Parser) { + this->Parser = &Parser; +}