<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jan 6, 2015, at 9:05 AM, David Blaikie <<a href="mailto:dblaikie@gmail.com" class="">dblaikie@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><br class=""><div class="gmail_extra"><br class=""><div class="gmail_quote">On Tue, Jan 6, 2015 at 8:50 AM, Adrian Prantl <span dir="ltr" class=""><<a href="mailto:aprantl@apple.com" target="_blank" class="">aprantl@apple.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: adrian<br class="">
Date: Tue Jan  6 10:50:25 2015<br class="">
New Revision: 225269<br class="">
<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=225269&view=rev" target="_blank" class="">http://llvm.org/viewvc/llvm-project?rev=225269&view=rev</a><br class="">
Log:<br class="">
Implement a very basic colored syntax highlighting for llvm-dwarfdump.<br class="">
The color scheme is the same as the one used by the colorize dwarfdump<br class="">
script on Darwin.<br class="">
A new --color option can be used to forcibly turn color on or off.<br class="">
<br class="">
<a href="http://reviews.llvm.org/D6852" target="_blank" class="">http://reviews.llvm.org/D6852</a><br class="">
<br class="">
Added:<br class="">
    llvm/trunk/lib/DebugInfo/SyntaxHighlighting.cpp<br class="">
    llvm/trunk/lib/DebugInfo/SyntaxHighlighting.h<br class="">
Modified:<br class="">
    llvm/trunk/lib/DebugInfo/CMakeLists.txt<br class="">
    llvm/trunk/lib/DebugInfo/DWARFDebugInfoEntry.cpp<br class="">
    llvm/trunk/lib/DebugInfo/DWARFFormValue.cpp<br class="">
<br class="">
Modified: llvm/trunk/lib/DebugInfo/CMakeLists.txt<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CMakeLists.txt?rev=225269&r1=225268&r2=225269&view=diff" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/CMakeLists.txt?rev=225269&r1=225268&r2=225269&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/DebugInfo/CMakeLists.txt (original)<br class="">
+++ llvm/trunk/lib/DebugInfo/CMakeLists.txt Tue Jan  6 10:50:25 2015<br class="">
@@ -15,4 +15,5 @@ add_llvm_library(LLVMDebugInfo<br class="">
   DWARFFormValue.cpp<br class="">
   DWARFTypeUnit.cpp<br class="">
   DWARFUnit.cpp<br class="">
+  SyntaxHighlighting.cpp<br class="">
   )<br class="">
<br class="">
Modified: llvm/trunk/lib/DebugInfo/DWARFDebugInfoEntry.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARFDebugInfoEntry.cpp?rev=225269&r1=225268&r2=225269&view=diff" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARFDebugInfoEntry.cpp?rev=225269&r1=225268&r2=225269&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/DebugInfo/DWARFDebugInfoEntry.cpp (original)<br class="">
+++ llvm/trunk/lib/DebugInfo/DWARFDebugInfoEntry.cpp Tue Jan  6 10:50:25 2015<br class="">
@@ -7,6 +7,7 @@<br class="">
 //<br class="">
 //===----------------------------------------------------------------------===//<br class="">
<br class="">
+#include "SyntaxHighlighting.h"<br class="">
 #include "llvm/DebugInfo/DWARFDebugInfoEntry.h"<br class="">
 #include "llvm/DebugInfo/DWARFCompileUnit.h"<br class="">
 #include "llvm/DebugInfo/DWARFContext.h"<br class="">
@@ -19,6 +20,7 @@<br class="">
 #include "llvm/Support/raw_ostream.h"<br class="">
 using namespace llvm;<br class="">
 using namespace dwarf;<br class="">
+using namespace syntax;<br class="">
<br class="">
 // Small helper to extract a DIE pointed by a reference<br class="">
 // attribute. It looks up the Unit containing the DIE and calls<br class="">
@@ -39,15 +41,17 @@ void DWARFDebugInfoEntryMinimal::dump(ra<br class="">
<br class="">
   if (debug_info_data.isValidOffset(offset)) {<br class="">
     uint32_t abbrCode = debug_info_data.getULEB128(&offset);<br class="">
+    WithColor(OS, syntax::Address).get() << format("\n0x%8.8x: ", Offset);<br class="">
<br class="">
-    OS << format("\n0x%8.8x: ", Offset);<br class="">
     if (abbrCode) {<br class="">
       if (AbbrevDecl) {<br class="">
-        const char *tagString = TagString(getTag());<br class="">
-        if (tagString)<br class="">
-          OS.indent(indent) << tagString;<br class="">
-        else<br class="">
-          OS.indent(indent) << format("DW_TAG_Unknown_%x", getTag());<br class="">
+          const char *tagString = TagString(getTag());<br class="">
+          if (tagString)<br class="">
+            WithColor(OS, syntax::Tag).get().indent(indent) << tagString;<br class="">
+          else<br class="">
+            WithColor(OS, syntax::Tag).get().indent(indent) <<<br class="">
+              format("DW_TAG_Unknown_%x", getTag());<br class=""></blockquote><div class=""><br class="">Perhaps we could/should introduce a non-member form of indent something like:<br class=""><br class="">stream << indent(2) << ...<br class=""></div></div></div></div></div></blockquote><div><br class=""></div><div>I think that would be nice. Thinking of it, it might be even better to have something like</div><div><br class=""></div><div>OS << indent(2) << color(syntax::Attribute) << text << color_reset;</div><div><br class=""></div><div>where color and color_reset are the identity if color support is not enabled.</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="gmail_extra"><div class="gmail_quote"><div class=""><br class="">?<br class=""> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br class="">
         OS << format(" [%u] %c\n", abbrCode,<br class="">
                      AbbrevDecl->hasChildren() ? '*' : ' ');<br class="">
<br class="">
@@ -114,9 +118,10 @@ void DWARFDebugInfoEntryMinimal::dumpAtt<br class="">
   OS.indent(indent+2);<br class="">
   const char *attrString = AttributeString(attr);<br class="">
   if (attrString)<br class="">
-    OS << attrString;<br class="">
+    WithColor(OS, syntax::Attribute) << attrString;<br class="">
   else<br class="">
-    OS << format("DW_AT_Unknown_%x", attr);<br class="">
+    WithColor(OS, syntax::Attribute).get() << format("DW_AT_Unknown_%x", attr);<br class=""></blockquote><div class=""><br class="">Why do some calls have get, and some not?<br class=""></div></div></div></div></div></blockquote><div><br class=""></div><div>The C++ type system cannot infer that we want the llvm::ostream &operator() if the format template is involved. Maybe having both forms is even worse compared to having calls to get() everywhere?</div><div><br class=""></div><div>-- adrian</div></div><div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="gmail_extra"><div class="gmail_quote"><div class=""> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br class="">
   const char *formString = FormEncodingString(form);<br class="">
   if (formString)<br class="">
     OS << " [" << formString << ']';<br class="">
@@ -132,7 +137,9 @@ void DWARFDebugInfoEntryMinimal::dumpAtt<br class="">
<br class="">
   const char *Name = nullptr;<br class="">
   std::string File;<br class="">
+  auto Color = syntax::Enumerator;<br class="">
   if (attr == DW_AT_decl_file || attr == DW_AT_call_file) {<br class="">
+  Color = syntax::String;<br class="">
     if (const auto *LT = u->getContext().getLineTableForUnit(u))<br class="">
       if (LT->getFileNameByIndex(<br class="">
              formValue.getAsUnsignedConstant().getValue(),<br class="">
@@ -144,13 +151,12 @@ void DWARFDebugInfoEntryMinimal::dumpAtt<br class="">
   } else if (Optional<uint64_t> Val = formValue.getAsUnsignedConstant())<br class="">
     Name = AttributeValueString(attr, *Val);<br class="">
<br class="">
-  if (Name) {<br class="">
-    OS << Name;<br class="">
-  } else if (attr == DW_AT_decl_line || attr == DW_AT_call_line) {<br class="">
+  if (Name)<br class="">
+    WithColor(OS, Color) << Name;<br class="">
+  else if (attr == DW_AT_decl_line || attr == DW_AT_call_line)<br class="">
     OS << *formValue.getAsUnsignedConstant();<br class="">
-  } else {<br class="">
+  else<br class="">
     formValue.dump(OS, u);<br class="">
-  }<br class="">
<br class="">
   // We have dumped the attribute raw value. For some attributes<br class="">
   // having both the raw value and the pretty-printed value is<br class="">
<br class="">
Modified: llvm/trunk/lib/DebugInfo/DWARFFormValue.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARFFormValue.cpp?rev=225269&r1=225268&r2=225269&view=diff" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARFFormValue.cpp?rev=225269&r1=225268&r2=225269&view=diff</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/DebugInfo/DWARFFormValue.cpp (original)<br class="">
+++ llvm/trunk/lib/DebugInfo/DWARFFormValue.cpp Tue Jan  6 10:50:25 2015<br class="">
@@ -7,6 +7,7 @@<br class="">
 //<br class="">
 //===----------------------------------------------------------------------===//<br class="">
<br class="">
+#include "SyntaxHighlighting.h"<br class="">
 #include "llvm/DebugInfo/DWARFFormValue.h"<br class="">
 #include "llvm/ADT/ArrayRef.h"<br class="">
 #include "llvm/ADT/StringRef.h"<br class="">
@@ -19,6 +20,7 @@<br class="">
 #include <cassert><br class="">
 using namespace llvm;<br class="">
 using namespace dwarf;<br class="">
+using namespace syntax;<br class="">
<br class="">
 namespace {<br class="">
 uint8_t getRefAddrSize(uint8_t AddrSize, uint16_t Version) {<br class="">
@@ -423,9 +425,10 @@ DWARFFormValue::dump(raw_ostream &OS, co<br class="">
     OS << format(" .debug_str[0x%8.8x] = ", (uint32_t)uvalue);<br class="">
     Optional<const char *> DbgStr = getAsCString(cu);<br class="">
     if (DbgStr.hasValue()) {<br class="">
-      OS << '"';<br class="">
-      OS.write_escaped(DbgStr.getValue());<br class="">
-      OS << '"';<br class="">
+      raw_ostream &COS = WithColor(OS, syntax::String);<br class="">
+      COS << '"';<br class="">
+      COS.write_escaped(DbgStr.getValue());<br class="">
+      COS << '"';<br class="">
     }<br class="">
     break;<br class="">
   }<br class="">
@@ -433,9 +436,10 @@ DWARFFormValue::dump(raw_ostream &OS, co<br class="">
     OS << format(" indexed (%8.8x) string = ", (uint32_t)uvalue);<br class="">
     Optional<const char *> DbgStr = getAsCString(cu);<br class="">
     if (DbgStr.hasValue()) {<br class="">
-      OS << '"';<br class="">
-      OS.write_escaped(DbgStr.getValue());<br class="">
-      OS << '"';<br class="">
+      raw_ostream &COS = WithColor(OS, syntax::String);<br class="">
+      COS << '"';<br class="">
+      COS.write_escaped(DbgStr.getValue());<br class="">
+      COS << '"';<br class="">
     }<br class="">
     break;<br class="">
   }<br class="">
@@ -479,8 +483,12 @@ DWARFFormValue::dump(raw_ostream &OS, co<br class="">
     break;<br class="">
   }<br class="">
<br class="">
-  if (cu_relative_offset)<br class="">
-    OS << format(" => {0x%8.8" PRIx64 "}", uvalue + (cu ? cu->getOffset() : 0));<br class="">
+  if (cu_relative_offset) {<br class="">
+    OS << " => {";<br class="">
+    WithColor(OS, syntax::Address).get()<br class="">
+      << format("0x%8.8" PRIx64, uvalue + (cu ? cu->getOffset() : 0));<br class="">
+    OS << "}";<br class="">
+  }<br class="">
 }<br class="">
<br class="">
 Optional<const char *> DWARFFormValue::getAsCString(const DWARFUnit *U) const {<br class="">
<br class="">
Added: llvm/trunk/lib/DebugInfo/SyntaxHighlighting.cpp<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/SyntaxHighlighting.cpp?rev=225269&view=auto" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/SyntaxHighlighting.cpp?rev=225269&view=auto</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/DebugInfo/SyntaxHighlighting.cpp (added)<br class="">
+++ llvm/trunk/lib/DebugInfo/SyntaxHighlighting.cpp Tue Jan  6 10:50:25 2015<br class="">
@@ -0,0 +1,37 @@<br class="">
+//===-- SyntaxHighlighting.cpp ----------------------------------*- C++ -*-===//<br class="">
+//<br class="">
+//                     The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is distributed under the University of Illinois Open Source<br class="">
+// License. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+#include "SyntaxHighlighting.h"<br class="">
+#include "llvm/Support/CommandLine.h"<br class="">
+using namespace llvm;<br class="">
+using namespace dwarf;<br class="">
+using namespace syntax;<br class="">
+<br class="">
+static cl::opt<cl::boolOrDefault><br class="">
+    UseColor("color",<br class="">
+             cl::desc("use colored syntax highlighting (default=autodetect)"),<br class="">
+             cl::init(cl::BOU_UNSET));<br class="">
+<br class="">
+WithColor::WithColor(llvm::raw_ostream &OS, enum HighlightColor Type) : OS(OS) {<br class="">
+  // Detect color from terminal type unless the user passed the --color option.<br class="">
+  if (UseColor == cl::BOU_UNSET ? OS.has_colors() : UseColor == cl::BOU_TRUE) {<br class="">
+    switch (Type) {<br class="">
+    case Address:    OS.changeColor(llvm::raw_ostream::YELLOW);  break;<br class="">
+    case String:     OS.changeColor(llvm::raw_ostream::GREEN);   break;<br class="">
+    case Tag:        OS.changeColor(llvm::raw_ostream::BLUE);    break;<br class="">
+    case Attribute:  OS.changeColor(llvm::raw_ostream::CYAN);    break;<br class="">
+    case Enumerator: OS.changeColor(llvm::raw_ostream::MAGENTA); break;<br class="">
+    }<br class="">
+  }<br class="">
+}<br class="">
+<br class="">
+WithColor::~WithColor() {<br class="">
+  if (UseColor == cl::BOU_UNSET ? OS.has_colors() : UseColor == cl::BOU_TRUE)<br class="">
+    OS.resetColor();<br class="">
+}<br class="">
<br class="">
Added: llvm/trunk/lib/DebugInfo/SyntaxHighlighting.h<br class="">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/SyntaxHighlighting.h?rev=225269&view=auto" target="_blank" class="">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/SyntaxHighlighting.h?rev=225269&view=auto</a><br class="">
==============================================================================<br class="">
--- llvm/trunk/lib/DebugInfo/SyntaxHighlighting.h (added)<br class="">
+++ llvm/trunk/lib/DebugInfo/SyntaxHighlighting.h Tue Jan  6 10:50:25 2015<br class="">
@@ -0,0 +1,39 @@<br class="">
+//===-- SyntaxHighlighting.h ------------------------------------*- C++ -*-===//<br class="">
+//<br class="">
+//                     The LLVM Compiler Infrastructure<br class="">
+//<br class="">
+// This file is distributed under the University of Illinois Open Source<br class="">
+// License. See LICENSE.TXT for details.<br class="">
+//<br class="">
+//===----------------------------------------------------------------------===//<br class="">
+<br class="">
+#ifndef LLVM_LIB_DEBUGINFO_SYNTAXHIGHLIGHTING_H<br class="">
+#define LLVM_LIB_DEBUGINFO_SYNTAXHIGHLIGHTING_H<br class="">
+<br class="">
+#include "llvm/Support/raw_ostream.h"<br class="">
+<br class="">
+namespace llvm {<br class="">
+namespace dwarf {<br class="">
+namespace syntax {<br class="">
+<br class="">
+// Symbolic names for various syntax elements.<br class="">
+enum HighlightColor { Address, String, Tag, Attribute, Enumerator };<br class="">
+<br class="">
+/// An RAII object that temporarily switches an output stream to a<br class="">
+/// specific color.<br class="">
+class WithColor {<br class="">
+  llvm::raw_ostream &OS;<br class="">
+<br class="">
+public:<br class="">
+  /// To be used like this: WithColor(OS, syntax::String) << "text";<br class="">
+  WithColor(llvm::raw_ostream &OS, enum HighlightColor Type);<br class="">
+  ~WithColor();<br class="">
+<br class="">
+  llvm::raw_ostream& get() { return OS; }<br class="">
+  operator llvm::raw_ostream& () { return OS; }<br class="">
+};<br class="">
+}<br class="">
+}<br class="">
+}<br class="">
+<br class="">
+#endif<br class="">
<br class="">
<br class="">
_______________________________________________<br class="">
llvm-commits mailing list<br class="">
<a href="mailto:llvm-commits@cs.uiuc.edu" class="">llvm-commits@cs.uiuc.edu</a><br class="">
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank" class="">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br class="">
</blockquote></div><br class=""></div></div>
</div></blockquote></div><br class=""></body></html>