diff --git a/include/llvm/MC/MCParser/AsmParser.h b/include/llvm/MC/MCParser/AsmParser.h index ce7cee95e96..4e89b995ad3 100644 --- a/include/llvm/MC/MCParser/AsmParser.h +++ b/include/llvm/MC/MCParser/AsmParser.h @@ -144,15 +144,6 @@ private: bool ParseDirectiveDarwinZerofill(); // Darwin specific ".zerofill" bool ParseDirectiveDarwinTBSS(); // Darwin specific ".tbss" - // Darwin specific ".subsections_via_symbols" - bool ParseDirectiveDarwinSubsectionsViaSymbols(); - // Darwin specific .dump and .load - bool ParseDirectiveDarwinDumpOrLoad(SMLoc IDLoc, bool IsDump); - // Darwin specific .secure_log_unique - bool ParseDirectiveDarwinSecureLogUnique(SMLoc IDLoc); - // Darwin specific .secure_log_reset - bool ParseDirectiveDarwinSecureLogReset(SMLoc IDLoc); - bool ParseDirectiveAbort(); // ".abort" bool ParseDirectiveInclude(); // ".include" diff --git a/lib/MC/MCParser/AsmParser.cpp b/lib/MC/MCParser/AsmParser.cpp index c4c3ce14506..3a1cfc41a47 100644 --- a/lib/MC/MCParser/AsmParser.cpp +++ b/lib/MC/MCParser/AsmParser.cpp @@ -65,7 +65,26 @@ public: virtual void Initialize(MCAsmParser &Parser) { // Call the base implementation. this->MCAsmParserExtension::Initialize(Parser); + + Parser.AddDirectiveHandler(this, ".subsections_via_symbols", + MCAsmParser::DirectiveHandler( + &DarwinAsmParser::ParseDirectiveSubsectionsViaSymbols)); + Parser.AddDirectiveHandler(this, ".dump", MCAsmParser::DirectiveHandler( + &DarwinAsmParser::ParseDirectiveDumpOrLoad)); + Parser.AddDirectiveHandler(this, ".load", MCAsmParser::DirectiveHandler( + &DarwinAsmParser::ParseDirectiveDumpOrLoad)); + Parser.AddDirectiveHandler(this, ".secure_log_unique", + MCAsmParser::DirectiveHandler( + &DarwinAsmParser::ParseDirectiveSecureLogUnique)); + Parser.AddDirectiveHandler(this, ".secure_log_reset", + MCAsmParser::DirectiveHandler( + &DarwinAsmParser::ParseDirectiveSecureLogReset)); } + + bool ParseDirectiveSubsectionsViaSymbols(StringRef, SMLoc); + bool ParseDirectiveDumpOrLoad(StringRef, SMLoc); + bool ParseDirectiveSecureLogUnique(StringRef, SMLoc); + bool ParseDirectiveSecureLogReset(StringRef, SMLoc); }; } @@ -822,20 +841,10 @@ bool AsmParser::ParseStatement() { if (IDVal == ".tbss") return ParseDirectiveDarwinTBSS(); - if (IDVal == ".subsections_via_symbols") - return ParseDirectiveDarwinSubsectionsViaSymbols(); if (IDVal == ".abort") return ParseDirectiveAbort(); if (IDVal == ".include") return ParseDirectiveInclude(); - if (IDVal == ".dump") - return ParseDirectiveDarwinDumpOrLoad(IDLoc, /*IsDump=*/true); - if (IDVal == ".load") - return ParseDirectiveDarwinDumpOrLoad(IDLoc, /*IsLoad=*/false); - if (IDVal == ".secure_log_unique") - return ParseDirectiveDarwinSecureLogUnique(IDLoc); - if (IDVal == ".secure_log_reset") - return ParseDirectiveDarwinSecureLogReset(IDLoc); // Look up the handler in the handler table. std::pair Handler = @@ -1663,9 +1672,9 @@ bool AsmParser::ParseDirectiveDarwinTBSS() { return false; } -/// ParseDirectiveDarwinSubsectionsViaSymbols +/// ParseDirectiveSubsectionsViaSymbols /// ::= .subsections_via_symbols -bool AsmParser::ParseDirectiveDarwinSubsectionsViaSymbols() { +bool DarwinAsmParser::ParseDirectiveSubsectionsViaSymbols(StringRef, SMLoc) { if (getLexer().isNot(AsmToken::EndOfStatement)) return TokError("unexpected token in '.subsections_via_symbols' directive"); @@ -1764,9 +1773,11 @@ bool AsmParser::ParseDirectiveInclude() { return false; } -/// ParseDirectiveDarwinDumpOrLoad +/// ParseDirectiveDumpOrLoad /// ::= ( .dump | .load ) "filename" -bool AsmParser::ParseDirectiveDarwinDumpOrLoad(SMLoc IDLoc, bool IsDump) { +bool DarwinAsmParser::ParseDirectiveDumpOrLoad(StringRef Directive, + SMLoc IDLoc) { + bool IsDump = Directive == ".dump"; if (getLexer().isNot(AsmToken::String)) return TokError("expected string in '.dump' or '.load' directive"); @@ -1787,19 +1798,19 @@ bool AsmParser::ParseDirectiveDarwinDumpOrLoad(SMLoc IDLoc, bool IsDump) { return false; } -/// ParseDirectiveDarwinSecureLogUnique +/// ParseDirectiveSecureLogUnique /// ::= .secure_log_unique "log message" -bool AsmParser::ParseDirectiveDarwinSecureLogUnique(SMLoc IDLoc) { +bool DarwinAsmParser::ParseDirectiveSecureLogUnique(StringRef, SMLoc IDLoc) { std::string LogMessage; - if (Lexer.isNot(AsmToken::String)) + if (getLexer().isNot(AsmToken::String)) LogMessage = ""; else{ LogMessage = getTok().getString(); Lex(); } - if (Lexer.isNot(AsmToken::EndOfStatement)) + if (getLexer().isNot(AsmToken::EndOfStatement)) return TokError("unexpected token in '.secure_log_unique' directive"); if (getContext().getSecureLogUsed() != false) @@ -1822,9 +1833,9 @@ bool AsmParser::ParseDirectiveDarwinSecureLogUnique(SMLoc IDLoc) { getContext().setSecureLog(OS); } - int CurBuf = SrcMgr.FindBufferContainingLoc(IDLoc); - *OS << SrcMgr.getBufferInfo(CurBuf).Buffer->getBufferIdentifier() << ":" - << SrcMgr.FindLineNumber(IDLoc, CurBuf) << ":" + int CurBuf = getSourceManager().FindBufferContainingLoc(IDLoc); + *OS << getSourceManager().getBufferInfo(CurBuf).Buffer->getBufferIdentifier() + << ":" << getSourceManager().FindLineNumber(IDLoc, CurBuf) << ":" << LogMessage + "\n"; getContext().setSecureLogUsed(true); @@ -1832,9 +1843,9 @@ bool AsmParser::ParseDirectiveDarwinSecureLogUnique(SMLoc IDLoc) { return false; } -/// ParseDirectiveDarwinSecureLogReset +/// ParseDirectiveSecureLogReset /// ::= .secure_log_reset -bool AsmParser::ParseDirectiveDarwinSecureLogReset(SMLoc IDLoc) { +bool DarwinAsmParser::ParseDirectiveSecureLogReset(StringRef, SMLoc IDLoc) { if (getLexer().isNot(AsmToken::EndOfStatement)) return TokError("unexpected token in '.secure_log_reset' directive"); diff --git a/test/MC/AsmParser/directive_subsections_via_symbols.s b/test/MC/AsmParser/directive_subsections_via_symbols.s index 38d69c94c13..355bf509652 100644 --- a/test/MC/AsmParser/directive_subsections_via_symbols.s +++ b/test/MC/AsmParser/directive_subsections_via_symbols.s @@ -1,4 +1,4 @@ -# RUN: llvm-mc -triple i386-unknown-unknown %s | FileCheck %s +# RUN: llvm-mc -triple i386-apple-darwin9 %s | FileCheck %s # CHECK: TEST0: # CHECK: .subsections_via_symbols diff --git a/test/MC/AsmParser/hello.s b/test/MC/AsmParser/hello.s index 01e3b4d58a1..2b62e0f008c 100644 --- a/test/MC/AsmParser/hello.s +++ b/test/MC/AsmParser/hello.s @@ -1,6 +1,6 @@ -// RUN: llvm-mc -triple i386-unknown-unknown %s -o - -// RUN: llvm-mc -triple i386-unknown-unknown %s -o - -output-asm-variant=1 - +// RUN: llvm-mc -triple i386-apple-darwin9 %s -o - +// RUN: llvm-mc -triple i386-apple-darwin9 %s -o - -output-asm-variant=1 + .text .align 4,0x90 .globl _main