[llvm] r237851 - Don't generate comments in the DebugLocStream unless required. NFC.

Pete Cooper peter_cooper at apple.com
Wed May 20 15:51:28 PDT 2015


Author: pete
Date: Wed May 20 17:51:27 2015
New Revision: 237851

URL: http://llvm.org/viewvc/llvm-project?rev=237851&view=rev
Log:
Don't generate comments in the DebugLocStream unless required.  NFC.

The ByteStreamer here wasn't taking account of whether the asm streamer was text based and verbose.  Only with that combination should we emit comments.

This change makes sure that we only actually convert a Twine to a string using Twine::str() if we need the comment.  This saves about 10000 small allocations on a test case involving the verify-use_list-order bitcode going through llc with debug info.

Note, this is NFC as the comments would ultimately never be emitted unless required.

Reviewed by Duncan Exon Smith and David Blaikie.

Modified:
    llvm/trunk/lib/CodeGen/AsmPrinter/ByteStreamer.h
    llvm/trunk/lib/CodeGen/AsmPrinter/DebugLocStream.h
    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/ByteStreamer.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/ByteStreamer.h?rev=237851&r1=237850&r2=237851&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/ByteStreamer.h (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/ByteStreamer.h Wed May 20 17:51:27 2015
@@ -72,26 +72,34 @@ class HashingByteStreamer : public ByteS
 class BufferByteStreamer : public ByteStreamer {
 private:
   SmallVectorImpl<char> &Buffer;
-  // FIXME: This is actually only needed for textual asm output.
   SmallVectorImpl<std::string> &Comments;
 
+  /// \brief Only verbose textual output needs comments.  This will be set to
+  /// true for that case, and false otherwise.  If false, comments passed in to
+  /// the emit methods will be ignored.
+  bool GenerateComments;
+
 public:
   BufferByteStreamer(SmallVectorImpl<char> &Buffer,
-                     SmallVectorImpl<std::string> &Comments)
-  : Buffer(Buffer), Comments(Comments) {}
+                     SmallVectorImpl<std::string> &Comments,
+                     bool GenerateComments)
+  : Buffer(Buffer), Comments(Comments), GenerateComments(GenerateComments) {}
   void EmitInt8(uint8_t Byte, const Twine &Comment) override {
     Buffer.push_back(Byte);
-    Comments.push_back(Comment.str());
+    if (GenerateComments)
+      Comments.push_back(Comment.str());
   }
   void EmitSLEB128(uint64_t DWord, const Twine &Comment) override {
     raw_svector_ostream OSE(Buffer);
     encodeSLEB128(DWord, OSE);
-    Comments.push_back(Comment.str());
+    if (GenerateComments)
+      Comments.push_back(Comment.str());
   }
   void EmitULEB128(uint64_t DWord, const Twine &Comment) override {
     raw_svector_ostream OSE(Buffer);
     encodeULEB128(DWord, OSE);
-    Comments.push_back(Comment.str());
+    if (GenerateComments)
+      Comments.push_back(Comment.str());
   }
 };
 

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DebugLocStream.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DebugLocStream.h?rev=237851&r1=237850&r2=237851&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DebugLocStream.h (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DebugLocStream.h Wed May 20 17:51:27 2015
@@ -23,7 +23,6 @@ class MCSymbol;
 /// Stores a unified stream of .debug_loc entries.  There's \a List for each
 /// variable/inlined-at pair, and an \a Entry for each \a DebugLocEntry.
 ///
-/// FIXME: Why do we have comments even when it's an object stream?
 /// FIXME: Do we need all these temp symbols?
 /// FIXME: Why not output directly to the output stream?
 class DebugLocStream {
@@ -52,7 +51,12 @@ private:
   SmallString<256> DWARFBytes;
   SmallVector<std::string, 32> Comments;
 
+  /// \brief Only verbose textual output needs comments.  This will be set to
+  /// true for that case, and false otherwise.
+  bool GenerateComments;
+
 public:
+  DebugLocStream(bool GenerateComments) : GenerateComments(GenerateComments) { }
   size_t getNumLists() const { return Lists.size(); }
   const List &getList(size_t LI) const { return Lists[LI]; }
   ArrayRef<List> getLists() const { return Lists; }
@@ -78,7 +82,7 @@ public:
   }
 
   BufferByteStreamer getStreamer() {
-    return BufferByteStreamer(DWARFBytes, Comments);
+    return BufferByteStreamer(DWARFBytes, Comments, GenerateComments);
   }
 
   ArrayRef<Entry> getEntries(const List &L) const {

Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp?rev=237851&r1=237850&r2=237851&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfDebug.cpp Wed May 20 17:51:27 2015
@@ -192,8 +192,8 @@ static LLVM_CONSTEXPR DwarfAccelTable::A
     DwarfAccelTable::Atom(dwarf::DW_ATOM_type_flags, dwarf::DW_FORM_data1)};
 
 DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)
-    : Asm(A), MMI(Asm->MMI), PrevLabel(nullptr),
-      InfoHolder(A, "info_string", DIEValueAllocator),
+    : Asm(A), MMI(Asm->MMI), DebugLocs(A->OutStreamer->isVerboseAsm()),
+      PrevLabel(nullptr), InfoHolder(A, "info_string", DIEValueAllocator),
       UsedNonDefaultText(false),
       SkeletonHolder(A, "skel_string", DIEValueAllocator),
       IsDarwin(Triple(A->getTargetTriple()).isOSDarwin()),





More information about the llvm-commits mailing list