From f9507ffa5b1c8697009e86bbedaacb51e4c6735d Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Mon, 27 Jul 2009 23:20:52 +0000 Subject: [PATCH] llvm-mc: Implement .abort fully in the front end git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77272 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCStreamer.h | 7 ------- lib/MC/MCAsmStreamer.cpp | 10 ---------- test/MC/AsmParser/directive_abort.s | 6 ++---- tools/llvm-mc/AsmParser.cpp | 17 ++++++++++++----- tools/llvm-mc/AsmParser.h | 5 +++-- tools/llvm-mc/MC-X86Specific.cpp | 1 + 6 files changed, 18 insertions(+), 28 deletions(-) diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index db658d2c4d6..0f973eb7509 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/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/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index b77e6efac39..b67250383a0 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/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/test/MC/AsmParser/directive_abort.s b/test/MC/AsmParser/directive_abort.s index fefb8e24cc1..3eb8e96f2f8 100644 --- a/test/MC/AsmParser/directive_abort.s +++ b/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/tools/llvm-mc/AsmParser.cpp b/tools/llvm-mc/AsmParser.cpp index 371a58e6ca9..65d48b23cbd 100644 --- a/tools/llvm-mc/AsmParser.cpp +++ b/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/tools/llvm-mc/AsmParser.h b/tools/llvm-mc/AsmParser.h index 3d9842e642b..dd6033847b4 100644 --- a/tools/llvm-mc/AsmParser.h +++ b/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/tools/llvm-mc/MC-X86Specific.cpp b/tools/llvm-mc/MC-X86Specific.cpp index d16bb15d380..6e28b028c3f 100644 --- a/tools/llvm-mc/MC-X86Specific.cpp +++ b/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;