summaryrefslogtreecommitdiff
path: root/lib/MC
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-01-22 19:17:48 +0000
committerChris Lattner <sabre@nondot.org>2010-01-22 19:17:48 +0000
commitd79d9dce47d505369662ae5111dba24f9ccdef68 (patch)
treea6331f42bbf8981e99a5d78b0ca46729f41a8def /lib/MC
parent8a23e0b07ba7eef3fd158be43f758d859b115f93 (diff)
downloadllvm-d79d9dce47d505369662ae5111dba24f9ccdef68.tar.gz
llvm-d79d9dce47d505369662ae5111dba24f9ccdef68.tar.bz2
llvm-d79d9dce47d505369662ae5111dba24f9ccdef68.tar.xz
add a new MCAsmStreamer::GetCommentOS method to simplify stuff
that doesn't want to use twines. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94199 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC')
-rw-r--r--lib/MC/MCAsmStreamer.cpp41
-rw-r--r--lib/MC/MCStreamer.cpp8
2 files changed, 39 insertions, 10 deletions
diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp
index 2c2fb0e8c2..4eb1bcdfb8 100644
--- a/lib/MC/MCAsmStreamer.cpp
+++ b/lib/MC/MCAsmStreamer.cpp
@@ -34,20 +34,23 @@ class MCAsmStreamer : public MCStreamer {
MCCodeEmitter *Emitter;
SmallString<128> CommentToEmit;
+ raw_svector_ostream CommentStream;
public:
MCAsmStreamer(MCContext &Context, formatted_raw_ostream &os,
const MCAsmInfo &mai,
bool isLittleEndian, bool isVerboseAsm, MCInstPrinter *printer,
MCCodeEmitter *emitter)
: MCStreamer(Context), OS(os), MAI(mai), IsLittleEndian(isLittleEndian),
- IsVerboseAsm(isVerboseAsm), InstPrinter(printer), Emitter(emitter) {}
+ IsVerboseAsm(isVerboseAsm), InstPrinter(printer), Emitter(emitter),
+ CommentStream(CommentToEmit) {}
~MCAsmStreamer() {}
bool isLittleEndian() const { return IsLittleEndian; }
inline void EmitEOL() {
- if (CommentToEmit.empty()) {
+ // If we don't have any comments, just emit a \n.
+ if (!IsVerboseAsm) {
OS << '\n';
return;
}
@@ -61,6 +64,15 @@ public:
/// verbose assembly output is enabled.
virtual void AddComment(const Twine &T);
+ /// GetCommentOS - Return a raw_ostream that comments can be written to.
+ /// Unlike AddComment, you are required to terminate comments with \n if you
+ /// use this method.
+ virtual raw_ostream &GetCommentOS() {
+ if (!IsVerboseAsm)
+ return nulls(); // Discard comments unless in verbose asm mode.
+ return CommentStream;
+ }
+
/// @name MCStreamer Interface
/// @{
@@ -112,25 +124,36 @@ public:
/// verbose assembly output is enabled.
void MCAsmStreamer::AddComment(const Twine &T) {
if (!IsVerboseAsm) return;
- // Each comment goes on its own line.
- if (!CommentToEmit.empty())
- CommentToEmit.push_back('\n');
+
+ // Make sure that CommentStream is flushed.
+ CommentStream.flush();
+
T.toVector(CommentToEmit);
+ // Each comment goes on its own line.
+ CommentToEmit.push_back('\n');
}
void MCAsmStreamer::EmitCommentsAndEOL() {
+ if (CommentToEmit.empty() && CommentStream.GetNumBytesInBuffer() == 0) {
+ OS << '\n';
+ return;
+ }
+
+ CommentStream.flush();
StringRef Comments = CommentToEmit.str();
- while (!Comments.empty()) {
+
+ assert(Comments.back() == '\n' &&
+ "Comment array not newline terminated");
+ do {
// Emit a line of comments.
OS.PadToColumn(MAI.getCommentColumn());
size_t Position = Comments.find('\n');
OS << MAI.getCommentString() << ' ' << Comments.substr(0, Position) << '\n';
- if (Position == StringRef::npos) break;
Comments = Comments.substr(Position+1);
- }
+ } while (!Comments.empty());
- CommentToEmit.clear();
+ CommentStream.clear();
}
diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp
index 4e9d094550..15b30794d9 100644
--- a/lib/MC/MCStreamer.cpp
+++ b/lib/MC/MCStreamer.cpp
@@ -9,7 +9,7 @@
#include "llvm/MC/MCStreamer.h"
#include "llvm/MC/MCExpr.h"
-
+#include "llvm/Support/raw_ostream.h"
using namespace llvm;
MCStreamer::MCStreamer(MCContext &_Context) : Context(_Context), CurSection(0) {
@@ -18,6 +18,12 @@ MCStreamer::MCStreamer(MCContext &_Context) : Context(_Context), CurSection(0) {
MCStreamer::~MCStreamer() {
}
+raw_ostream &MCStreamer::GetCommentOS() {
+ // By default, discard comments.
+ return nulls();
+}
+
+
/// EmitIntValue - Special case of EmitValue that avoids the client having to
/// pass in a MCExpr for constant integers.
void MCStreamer::EmitIntValue(uint64_t Value, unsigned Size,