From: Daniel Dunbar Date: Mon, 27 Jul 2009 23:20:52 +0000 (+0000) Subject: llvm-mc: Implement .abort fully in the front end X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=eb6bb32bef6a2bcbe79d1d98f61b7202fcbc8305;p=platform%2Fupstream%2Fllvm.git llvm-mc: Implement .abort fully in the front end llvm-svn: 77272 --- diff --git a/llvm/include/llvm/MC/MCStreamer.h b/llvm/include/llvm/MC/MCStreamer.h index db658d2..0f973eb 100644 --- a/llvm/include/llvm/MC/MCStreamer.h +++ b/llvm/include/llvm/MC/MCStreamer.h @@ -156,13 +156,6 @@ namespace llvm { virtual void EmitZerofill(MCSection *Section, MCSymbol *Symbol = 0, unsigned Size = 0,unsigned Pow2Alignment = 0) = 0; - /// AbortAssembly - Stop and don't produce output, printing @param - /// AbortReason if non-NULL to indicate the reason the assembly is - /// terminated. - /// - /// @param AbortReason - The reason assembly is terminated, if non-NULL. - virtual void AbortAssembly(const char *AbortReason) = 0; - /// @} /// @name Generating Data /// @{ diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp index b77e6ef..b672503 100644 --- a/llvm/lib/MC/MCAsmStreamer.cpp +++ b/llvm/lib/MC/MCAsmStreamer.cpp @@ -55,8 +55,6 @@ namespace { virtual void EmitZerofill(MCSection *Section, MCSymbol *Symbol = NULL, unsigned Size = 0, unsigned Pow2Alignment = 0); - virtual void AbortAssembly(const char *AbortReason = NULL); - virtual void EmitBytes(const StringRef &Data); virtual void EmitValue(const MCValue &Value, unsigned Size); @@ -132,14 +130,6 @@ void MCAsmStreamer::EmitAssemblerFlag(AssemblerFlag Flag) { OS << '\n'; } -void MCAsmStreamer::AbortAssembly(const char *AbortReason) { - OS << ".abort"; - if (AbortReason != NULL) - OS << ' ' << AbortReason; - OS << '\n'; - -} - void MCAsmStreamer::EmitAssignment(MCSymbol *Symbol, const MCValue &Value, bool MakeAbsolute) { assert(!Symbol->getSection() && "Cannot assign to a label!"); diff --git a/llvm/test/MC/AsmParser/directive_abort.s b/llvm/test/MC/AsmParser/directive_abort.s index fefb8e2..3eb8e96f 100644 --- a/llvm/test/MC/AsmParser/directive_abort.s +++ b/llvm/test/MC/AsmParser/directive_abort.s @@ -1,8 +1,6 @@ -# RUN: llvm-mc -triple i386-unknown-unknown %s | FileCheck %s +# RUN: llvm-mc -triple i386-unknown-unknown %s 2> %t +# RUN: FileCheck -input-file %t %s -# CHECK: TEST0: # CHECK: .abort "please stop assembing" -# CHECK: .abort TEST0: .abort "please stop assembing" -.abort diff --git a/llvm/tools/llvm-mc/AsmParser.cpp b/llvm/tools/llvm-mc/AsmParser.cpp index 371a58e..65d48b2 100644 --- a/llvm/tools/llvm-mc/AsmParser.cpp +++ b/llvm/tools/llvm-mc/AsmParser.cpp @@ -14,6 +14,7 @@ #include "AsmParser.h" #include "AsmExpr.h" +#include "llvm/ADT/Twine.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCInst.h" #include "llvm/MC/MCStreamer.h" @@ -23,12 +24,12 @@ #include "llvm/Target/TargetAsmParser.h" using namespace llvm; -void AsmParser::Warning(SMLoc L, const char *Msg) { - Lexer.PrintMessage(L, Msg, "warning"); +void AsmParser::Warning(SMLoc L, const Twine &Msg) { + Lexer.PrintMessage(L, Msg.str(), "warning"); } -bool AsmParser::Error(SMLoc L, const char *Msg) { - Lexer.PrintMessage(L, Msg, "error"); +bool AsmParser::Error(SMLoc L, const Twine &Msg) { + Lexer.PrintMessage(L, Msg.str(), "error"); return true; } @@ -1117,6 +1118,9 @@ bool AsmParser::ParseDirectiveDarwinSubsectionsViaSymbols() { /// ParseDirectiveAbort /// ::= .abort [ "abort_string" ] bool AsmParser::ParseDirectiveAbort() { + // FIXME: Use loc from directive. + SMLoc Loc = Lexer.getLoc(); + StringRef Str = ""; if (Lexer.isNot(asmtok::EndOfStatement)) { if (Lexer.isNot(asmtok::String)) @@ -1133,7 +1137,10 @@ bool AsmParser::ParseDirectiveAbort() { Lexer.Lex(); // FIXME: Handle here. - Out.AbortAssembly(Str.str().c_str()); + if (Str.empty()) + Error(Loc, ".abort detected. Assembly stopping."); + else + Error(Loc, ".abort '" + Str + "' detected. Assembly stopping."); return false; } diff --git a/llvm/tools/llvm-mc/AsmParser.h b/llvm/tools/llvm-mc/AsmParser.h index 3d9842e..dd60338 100644 --- a/llvm/tools/llvm-mc/AsmParser.h +++ b/llvm/tools/llvm-mc/AsmParser.h @@ -25,6 +25,7 @@ class MCInst; class MCStreamer; class MCValue; class TargetAsmParser; +class Twine; class AsmParser : MCAsmParser { public: @@ -52,8 +53,8 @@ public: private: bool ParseStatement(); - void Warning(SMLoc L, const char *Msg); - bool Error(SMLoc L, const char *Msg); + void Warning(SMLoc L, const Twine &Msg); + bool Error(SMLoc L, const Twine &Msg); bool TokError(const char *Msg); void EatToEndOfStatement(); diff --git a/llvm/tools/llvm-mc/MC-X86Specific.cpp b/llvm/tools/llvm-mc/MC-X86Specific.cpp index d16bb15..6e28b02 100644 --- a/llvm/tools/llvm-mc/MC-X86Specific.cpp +++ b/llvm/tools/llvm-mc/MC-X86Specific.cpp @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #include "AsmParser.h" +#include "llvm/ADT/Twine.h" #include "llvm/MC/MCInst.h" #include "llvm/Support/SourceMgr.h" using namespace llvm;