add a twine form of MCStreamer::EmitRawText, and mc'ize
authorChris Lattner <sabre@nondot.org>
Sat, 3 Apr 2010 22:12:35 +0000 (22:12 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 3 Apr 2010 22:12:35 +0000 (22:12 +0000)
a few more things in AsmPrinter.cpp.

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

include/llvm/MC/MCStreamer.h
lib/CodeGen/AsmPrinter/AsmPrinter.cpp
lib/MC/MCStreamer.cpp

index d42342c145ed9967c2d82fa54a01601b3dfe6cc6..4667c41d62356c0f2c8c9e9db1558efe9abe6448 100644 (file)
@@ -286,6 +286,7 @@ class TargetAsmBackend;
     /// the specified string in the output .s file.  This capability is
     /// indicated by the hasRawTextSupport() predicate.  By default this aborts.
     virtual void EmitRawText(StringRef String);
+    void EmitRawText(const Twine &String);
     
     /// Finish - Finish emission of machine code and flush any output.
     virtual void Finish() = 0;
index 5e0d0dc500611a98c1fb257c63bc3e15baab0eef..6791633bcfb9952331a3240a98fba5797f09cabc 100644 (file)
@@ -164,7 +164,7 @@ void AsmPrinter::EmitLinkage(unsigned Linkage, MCSymbol *GVSym) const {
       // .linkonce discard
       // FIXME: It would be nice to use .linkonce samesize for non-common
       // globals.
-      O << LinkOnce;
+      OutStreamer.EmitRawText(LinkOnce);
     } else {
       // .weak _foo
       OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Weak);
@@ -1386,9 +1386,9 @@ void AsmPrinter::printInlineAsm(const MachineInstr *MI) const {
   if (AsmStr[0] == 0) {
     if (!OutStreamer.hasRawTextSupport()) return;
 
-    OutStreamer.EmitRawText(std::string("\t")+MAI->getCommentString()+
+    OutStreamer.EmitRawText(Twine("\t")+MAI->getCommentString()+
                             MAI->getInlineAsmStart());
-    OutStreamer.EmitRawText(std::string("\t")+MAI->getCommentString()+
+    OutStreamer.EmitRawText(Twine("\t")+MAI->getCommentString()+
                             MAI->getInlineAsmEnd());
     return;
   }
@@ -1396,7 +1396,7 @@ void AsmPrinter::printInlineAsm(const MachineInstr *MI) const {
   // Emit the #APP start marker.  This has to happen even if verbose-asm isn't
   // enabled, so we use EmitRawText.
   if (OutStreamer.hasRawTextSupport())
-    OutStreamer.EmitRawText(std::string("\t")+MAI->getCommentString()+
+    OutStreamer.EmitRawText(Twine("\t")+MAI->getCommentString()+
                             MAI->getInlineAsmStart());
 
   // Emit the inline asm to a temporary string so we can emit it through
@@ -1584,7 +1584,7 @@ void AsmPrinter::printInlineAsm(const MachineInstr *MI) const {
   // Emit the #NOAPP end marker.  This has to happen even if verbose-asm isn't
   // enabled, so we use EmitRawText.
   if (OutStreamer.hasRawTextSupport())
-    OutStreamer.EmitRawText(std::string("\t")+MAI->getCommentString()+
+    OutStreamer.EmitRawText(Twine("\t")+MAI->getCommentString()+
                             MAI->getInlineAsmEnd());
 }
 
@@ -1592,21 +1592,24 @@ void AsmPrinter::printInlineAsm(const MachineInstr *MI) const {
 /// that is an implicit def.
 void AsmPrinter::printImplicitDef(const MachineInstr *MI) const {
   if (!VerboseAsm) return;
-  O.PadToColumn(MAI->getCommentColumn());
-  O << MAI->getCommentString() << " implicit-def: "
-    << TRI->getName(MI->getOperand(0).getReg());
+  OutStreamer.AddComment(Twine("implicit-def: ") +
+                         TRI->getName(MI->getOperand(0).getReg()));
   OutStreamer.AddBlankLine();
 }
 
 void AsmPrinter::printKill(const MachineInstr *MI) const {
   if (!VerboseAsm) return;
   O.PadToColumn(MAI->getCommentColumn());
-  O << MAI->getCommentString() << " kill:";
+  
+  std::string Str = "kill:";
   for (unsigned n = 0, e = MI->getNumOperands(); n != e; ++n) {
-    const MachineOperand &op = MI->getOperand(n);
-    assert(op.isReg() && "KILL instruction must have only register operands");
-    O << ' ' << TRI->getName(op.getReg()) << (op.isDef() ? "<def>" : "<kill>");
+    const MachineOperand &Op = MI->getOperand(n);
+    assert(Op.isReg() && "KILL instruction must have only register operands");
+    Str += ' ';
+    Str += TRI->getName(Op.getReg());
+    Str += (Op.isDef() ? "<def>" : "<kill>");
   }
+  OutStreamer.AddComment(Str);
   OutStreamer.AddBlankLine();
 }
 
@@ -1772,15 +1775,16 @@ void AsmPrinter::EmitBasicBlockStart(const MachineBasicBlock *MBB) const {
 
   // Print the main label for the block.
   if (MBB->pred_empty() || isBlockOnlyReachableByFallthrough(MBB)) {
-    if (VerboseAsm) {
-      // NOTE: Want this comment at start of line.
-      O << MAI->getCommentString() << " BB#" << MBB->getNumber() << ':';
+    if (VerboseAsm && OutStreamer.hasRawTextSupport()) {
       if (const BasicBlock *BB = MBB->getBasicBlock())
         if (BB->hasName())
           OutStreamer.AddComment("%" + BB->getName());
       
       PrintBasicBlockLoopComments(*MBB, LI, *this);
-      OutStreamer.AddBlankLine();
+      
+      // NOTE: Want this comment at start of line, don't emit with AddComment.
+      OutStreamer.EmitRawText(Twine(MAI->getCommentString()) + " BB#" +
+                              Twine(MBB->getNumber()) + ":");
     }
   } else {
     if (VerboseAsm) {
index 0b88b0fe8bc3e0575e721ff687d49acfcd8d52c6..4f484a27d320d167140a8a8f6a733245411a880a 100644 (file)
@@ -10,6 +10,8 @@
 #include "llvm/MC/MCStreamer.h"
 #include "llvm/MC/MCExpr.h"
 #include "llvm/Support/raw_ostream.h"
+#include "llvm/ADT/SmallString.h"
+#include "llvm/ADT/Twine.h"
 #include <cstdlib>
 using namespace llvm;
 
@@ -54,3 +56,9 @@ void MCStreamer::EmitRawText(StringRef String) {
   " something must not be fully mc'ized\n";
   abort();
 }
+
+void MCStreamer::EmitRawText(const Twine &T) {
+  SmallString<128> Str;
+  T.toVector(Str);
+  EmitRawText(Str.str());
+}