that doesn't want to use twines.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94199
91177308-0d34-0410-b5e6-
96231b3b80d8
/// 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
/// @{
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();
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();
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) {
/// 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
/// @{
/// 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());
#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) {
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,
+/// 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!");