[llvm-commits] [llvm] r94199 - in /llvm/trunk: 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

Chris Lattner sabre at nondot.org
Fri Jan 22 11:17:49 PST 2010


Author: lattner
Date: Fri Jan 22 13:17:48 2010
New Revision: 94199

URL: http://llvm.org/viewvc/llvm-project?rev=94199&view=rev
Log:
add a new MCAsmStreamer::GetCommentOS method to simplify stuff
that doesn't want to use twines.

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

Modified: llvm/trunk/include/llvm/MC/MCStreamer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=94199&r1=94198&r2=94199&view=diff

==============================================================================
--- llvm/trunk/include/llvm/MC/MCStreamer.h (original)
+++ llvm/trunk/include/llvm/MC/MCStreamer.h Fri Jan 22 13:17:48 2010
@@ -90,6 +90,11 @@
     /// 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
     /// @{
     

Modified: llvm/trunk/include/llvm/Support/raw_ostream.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/raw_ostream.h?rev=94199&r1=94198&r2=94199&view=diff

==============================================================================
--- llvm/trunk/include/llvm/Support/raw_ostream.h (original)
+++ llvm/trunk/include/llvm/Support/raw_ostream.h Fri Jan 22 13:17:48 2010
@@ -456,6 +456,9 @@
   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();

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=94199&r1=94198&r2=94199&view=diff

==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Fri Jan 22 13:17:48 2010
@@ -1126,16 +1126,12 @@
 
 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) {
-      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();

Modified: llvm/trunk/lib/MC/MCAsmStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmStreamer.cpp?rev=94199&r1=94198&r2=94199&view=diff

==============================================================================
--- llvm/trunk/lib/MC/MCAsmStreamer.cpp (original)
+++ llvm/trunk/lib/MC/MCAsmStreamer.cpp Fri Jan 22 13:17:48 2010
@@ -34,20 +34,23 @@
   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 @@
   /// 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 @@
 /// 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();
 }
 
 

Modified: llvm/trunk/lib/MC/MCStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCStreamer.cpp?rev=94199&r1=94198&r2=94199&view=diff

==============================================================================
--- llvm/trunk/lib/MC/MCStreamer.cpp (original)
+++ llvm/trunk/lib/MC/MCStreamer.cpp Fri Jan 22 13:17:48 2010
@@ -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() {
 }
 
+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,

Modified: llvm/trunk/lib/Support/raw_ostream.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/raw_ostream.cpp?rev=94199&r1=94198&r2=94199&view=diff

==============================================================================
--- llvm/trunk/lib/Support/raw_ostream.cpp (original)
+++ llvm/trunk/lib/Support/raw_ostream.cpp Fri Jan 22 13:17:48 2010
@@ -562,6 +562,14 @@
   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!");





More information about the llvm-commits mailing list