diff options
author | Chris Lattner <sabre@nondot.org> | 2010-01-22 19:17:48 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-01-22 19:17:48 +0000 |
commit | d79d9dce47d505369662ae5111dba24f9ccdef68 (patch) | |
tree | a6331f42bbf8981e99a5d78b0ca46729f41a8def /lib/MC | |
parent | 8a23e0b07ba7eef3fd158be43f758d859b115f93 (diff) |
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.cpp | 41 | ||||
-rw-r--r-- | lib/MC/MCStreamer.cpp | 8 |
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, |