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
/// @{
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);
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!");
-# 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
#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"
#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;
}
/// 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))
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;
}
class MCStreamer;
class MCValue;
class TargetAsmParser;
+class Twine;
class AsmParser : MCAsmParser {
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();
//===----------------------------------------------------------------------===//
#include "AsmParser.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/MC/MCInst.h"
#include "llvm/Support/SourceMgr.h"
using namespace llvm;