From: Daniel Dunbar Date: Sun, 18 Jul 2010 18:38:02 +0000 (+0000) Subject: MC/AsmParser: Add .macros_{off,on} support, not that makes sense since we don't X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=3c802de01af19964c41cc17e9d788271d42dbcdb;hp=275ce397941bc64c6d1643c8c62dbc97a5ebc717;p=oota-llvm.git MC/AsmParser: Add .macros_{off,on} support, not that makes sense since we don't support macros. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@108649 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index 8ae4fcb514b..d4db857a22c 100644 --- a/lib/MC/MCParser/AsmParser.cpp +++ b/lib/MC/MCParser/AsmParser.cpp @@ -38,6 +38,8 @@ namespace { /// \brief The concrete assembly parser instance. class AsmParser : public MCAsmParser { + friend class GenericAsmParser; + AsmParser(const AsmParser &); // DO NOT IMPLEMENT void operator=(const AsmParser &); // DO NOT IMPLEMENT private: @@ -47,7 +49,7 @@ private: SourceMgr &SrcMgr; MCAsmParserExtension *GenericParser; MCAsmParserExtension *PlatformParser; - + /// This is the current buffer index we're lexing from as managed by the /// SourceMgr object. int CurBuffer; @@ -60,6 +62,10 @@ private: /// parsing and validating the rest of the directive. The handler is passed /// in the directive name and the location of the directive keyword. StringMap > DirectiveMap; + + /// Boolean tracking whether macro substitution is enabled. + unsigned MacrosEnabled : 1; + public: AsmParser(const Target &T, SourceMgr &SM, MCContext &Ctx, MCStreamer &Out, const MCAsmInfo &MAI); @@ -150,6 +156,10 @@ class GenericAsmParser : public MCAsmParserExtension { public: GenericAsmParser() {} + AsmParser &getParser() { + return (AsmParser&) this->MCAsmParserExtension::getParser(); + } + virtual void Initialize(MCAsmParser &Parser) { // Call the base implementation. this->MCAsmParserExtension::Initialize(Parser); @@ -161,11 +171,20 @@ public: &GenericAsmParser::ParseDirectiveLine)); Parser.AddDirectiveHandler(this, ".loc", MCAsmParser::DirectiveHandler( &GenericAsmParser::ParseDirectiveLoc)); + + // Macro directives. + Parser.AddDirectiveHandler(this, ".macros_on", + MCAsmParser::DirectiveHandler( + &GenericAsmParser::ParseDirectiveMacrosOnOff)); + Parser.AddDirectiveHandler(this, ".macros_off", + MCAsmParser::DirectiveHandler( + &GenericAsmParser::ParseDirectiveMacrosOnOff)); } - bool ParseDirectiveFile(StringRef, SMLoc DirectiveLoc); // ".file" - bool ParseDirectiveLine(StringRef, SMLoc DirectiveLoc); // ".line" - bool ParseDirectiveLoc(StringRef, SMLoc DirectiveLoc); // ".loc" + bool ParseDirectiveFile(StringRef, SMLoc DirectiveLoc); + bool ParseDirectiveLine(StringRef, SMLoc DirectiveLoc); + bool ParseDirectiveLoc(StringRef, SMLoc DirectiveLoc); + bool ParseDirectiveMacrosOnOff(StringRef, SMLoc DirectiveLoc); }; } @@ -183,7 +202,7 @@ AsmParser::AsmParser(const Target &T, SourceMgr &_SM, MCContext &_Ctx, MCStreamer &_Out, const MCAsmInfo &_MAI) : Lexer(_MAI), Ctx(_Ctx), Out(_Out), SrcMgr(_SM), GenericParser(new GenericAsmParser), PlatformParser(0), - CurBuffer(0) { + CurBuffer(0), MacrosEnabled(true) { Lexer.setBuffer(SrcMgr.getMemoryBuffer(CurBuffer)); // Initialize the generic parser. @@ -1593,6 +1612,19 @@ bool GenericAsmParser::ParseDirectiveLoc(StringRef, SMLoc DirectiveLoc) { return false; } +/// ParseDirectiveMacrosOnOff +/// ::= .macros_on +/// ::= .macros_off +bool GenericAsmParser::ParseDirectiveMacrosOnOff(StringRef Directive, + SMLoc DirectiveLoc) { + if (getLexer().isNot(AsmToken::EndOfStatement)) + return Error(getLexer().getLoc(), + "unexpected token in '" + Directive + "' directive"); + + getParser().MacrosEnabled = Directive == ".macros_on"; + + return false; +} /// \brief Create an MCAsmParser instance. MCAsmParser *llvm::createMCAsmParser(const Target &T, SourceMgr &SM, diff --git a/test/MC/AsmParser/macros-parsing.s b/test/MC/AsmParser/macros-parsing.s new file mode 100644 index 00000000000..302baa03651 --- /dev/null +++ b/test/MC/AsmParser/macros-parsing.s @@ -0,0 +1,8 @@ +// RUN: llvm-mc %s 2> %t.err +// RUN: FileCheck --check-prefix=CHECK-ERRORS %s < %t.err + +.macros_on +.macros_off + +// CHECK-ERRORS: .abort '"end"' detected +.abort "end"