add a new MCAsmStreamer::GetCommentOS method to simplify stuff
authorChris Lattner <sabre@nondot.org>
Fri, 22 Jan 2010 19:17:48 +0000 (19:17 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 22 Jan 2010 19:17:48 +0000 (19:17 +0000)
that doesn't want to use twines.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94199 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCStreamer.h
include/llvm/Support/raw_ostream.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/MC/MCAsmStreamer.cpp
lib/MC/MCStreamer.cpp
lib/Support/raw_ostream.cpp

index 5470ab2f271d5a3f7e493ad0a8c8a2082e51c822..0842a24962c8c5c8de9f17f9d0bf5eb1ab5e1ceb 100644 (file)
@@ -90,6 +90,11 @@ namespace llvm {
     /// prefix as appropriate.  The added comment should not end with a \n.
     virtual void AddComment(const Twine &T) {}
     
     /// prefix as appropriate.  The added comment should not end with a \n.
     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();
+    
     /// @name Symbol & Section Management
     /// @{
     
     /// @name Symbol & Section Management
     /// @{
     
index d3c45c244d18f0ba8ed48b4e7778b06c0ae5044a..05794e5898878c13012ffa4991396d575b75b7d9 100644 (file)
@@ -456,6 +456,9 @@ public:
   explicit raw_svector_ostream(SmallVectorImpl<char> &O);
   ~raw_svector_ostream();
 
   explicit raw_svector_ostream(SmallVectorImpl<char> &O);
   ~raw_svector_ostream();
 
+  /// clear - Flush the stream and clear the underlying vector.
+  void clear();
+  
   /// str - Flushes the stream contents to the target vector and return a
   /// StringRef for the vector contents.
   StringRef str();
   /// str - Flushes the stream contents to the target vector and return a
   /// StringRef for the vector contents.
   StringRef str();
index 5564fa165970203239ab0cdd3070a72e229ecda7..3f0a9def7fe3c1de0d3779aee55370c9cf08883b 100644 (file)
@@ -1126,16 +1126,12 @@ static void EmitGlobalConstantStruct(const ConstantStruct *CS,
 
 static void EmitGlobalConstantFP(const ConstantFP *CFP, unsigned AddrSpace,
                                  AsmPrinter &AP) {
 
 static void EmitGlobalConstantFP(const ConstantFP *CFP, unsigned AddrSpace,
                                  AsmPrinter &AP) {
-  SmallString<128> TmpBuffer;
-  
   // FP Constants are printed as integer constants to avoid losing
   // precision.
   if (CFP->getType()->isDoubleTy()) {
     if (AP.VerboseAsm) {
   // FP Constants are printed as integer constants to avoid losing
   // precision.
   if (CFP->getType()->isDoubleTy()) {
     if (AP.VerboseAsm) {
-      raw_svector_ostream OS(TmpBuffer);
-      double Val = CFP->getValueAPF().convertToDouble();  // for comment only
-      OS << "double " << Val;
-      AP.OutStreamer.AddComment(OS.str());
+      double Val = CFP->getValueAPF().convertToDouble();
+      AP.OutStreamer.GetCommentOS() << "double " << Val << '\n';
     }
 
     uint64_t Val = CFP->getValueAPF().bitcastToAPInt().getZExtValue();
     }
 
     uint64_t Val = CFP->getValueAPF().bitcastToAPInt().getZExtValue();
index 2c2fb0e8c208f09a095f4747666ac982ff9332d7..4eb1bcdfb818d8c154a46f911124d862fce1e032 100644 (file)
@@ -34,20 +34,23 @@ class MCAsmStreamer : public MCStreamer {
   MCCodeEmitter *Emitter;
   
   SmallString<128> CommentToEmit;
   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),
 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() {
   ~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;
     }
       OS << '\n';
       return;
     }
@@ -61,6 +64,15 @@ public:
   /// verbose assembly output is enabled.
   virtual void AddComment(const Twine &T);
   
   /// 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
   /// @{
 
   /// @name MCStreamer Interface
   /// @{
 
@@ -112,25 +124,36 @@ public:
 /// verbose assembly output is enabled.
 void MCAsmStreamer::AddComment(const Twine &T) {
   if (!IsVerboseAsm) return;
 /// 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);
   T.toVector(CommentToEmit);
+  // Each comment goes on its own line.
+  CommentToEmit.push_back('\n');
 }
 
 void MCAsmStreamer::EmitCommentsAndEOL() {
 }
 
 void MCAsmStreamer::EmitCommentsAndEOL() {
+  if (CommentToEmit.empty() && CommentStream.GetNumBytesInBuffer() == 0) {
+    OS << '\n';
+    return;
+  }
+  
+  CommentStream.flush();
   StringRef Comments = CommentToEmit.str();
   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';
     
     // 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);
     Comments = Comments.substr(Position+1);
-  }
+  } while (!Comments.empty());
   
   
-  CommentToEmit.clear();
+  CommentStream.clear();
 }
 
 
 }
 
 
index 4e9d094550a6e042822c6e1b726433712d656499..15b30794d91e20f0a9fa5e774263899cbb0f97d7 100644 (file)
@@ -9,7 +9,7 @@
 
 #include "llvm/MC/MCStreamer.h"
 #include "llvm/MC/MCExpr.h"
 
 #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) {
 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() {
 }
 
 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,
 /// 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,
index a820210f7bde2aff801b3cf4bbc2532a5c663bb3..7cd16c888b9ec7e4f156db2cdb3eb41e690ad6c1 100644 (file)
@@ -562,6 +562,14 @@ raw_svector_ostream::~raw_svector_ostream() {
   flush();
 }
 
   flush();
 }
 
+/// clear - Flush the stream and clear the underlying vector.
+void raw_svector_ostream::clear() {
+  if (GetNumBytesInBuffer() == 0) flush();
+  
+  OS.clear();
+  SetBuffer(OS.end(), OS.capacity() - OS.size());
+}
+
 void raw_svector_ostream::write_impl(const char *Ptr, size_t Size) {
   assert(Ptr == OS.end() && OS.size() + Size <= OS.capacity() &&
          "Invalid write_impl() call!");
 void raw_svector_ostream::write_impl(const char *Ptr, size_t Size) {
   assert(Ptr == OS.end() && OS.size() + Size <= OS.capacity() &&
          "Invalid write_impl() call!");