From 58bc4dd4a91443ddd3120b0a2f1801ad4d6aae1c Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 3 Apr 2010 22:12:35 +0000 Subject: [PATCH] add a twine form of MCStreamer::EmitRawText, and mc'ize 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 | 1 + lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 36 +++++++++++++++++++---------------- lib/MC/MCStreamer.cpp | 8 ++++++++ 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index d42342c145e..4667c41d623 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/include/llvm/MC/MCStreamer.h @@ -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; diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 5e0d0dc5006..6791633bcfb 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -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() ? "" : ""); + 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() ? "" : ""); } + 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) { diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 0b88b0fe8bc..4f484a27d32 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -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 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()); +} -- 2.11.0