From 692175399453d70083772033e13a11e408576327 Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere Date: Fri, 9 Mar 2018 09:56:24 +0000 Subject: [PATCH] [Support] Move syntax highlighting into support Move the DWARF syntax highlighting into support. This has several advantages, most notably that this makes the WithColor RAII wrapper available outside libDebugInfo. Furthermore, several projects all have their own code for handling colored output. This provides a place to centralize it. Differential revision: https://reviews.llvm.org/D44215 llvm-svn: 327108 --- .../llvm/Support/WithColor.h} | 24 +++----- llvm/lib/DebugInfo/DWARF/CMakeLists.txt | 1 - llvm/lib/DebugInfo/DWARF/DWARFDebugMacro.cpp | 5 +- llvm/lib/DebugInfo/DWARF/DWARFDie.cpp | 19 ++++--- llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp | 12 ++-- llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp | 11 ++-- llvm/lib/DebugInfo/DWARF/SyntaxHighlighting.cpp | 49 ---------------- llvm/lib/Support/CMakeLists.txt | 1 + llvm/lib/Support/WithColor.cpp | 65 ++++++++++++++++++++++ 9 files changed, 98 insertions(+), 89 deletions(-) rename llvm/{lib/DebugInfo/DWARF/SyntaxHighlighting.h => include/llvm/Support/WithColor.h} (62%) delete mode 100644 llvm/lib/DebugInfo/DWARF/SyntaxHighlighting.cpp create mode 100644 llvm/lib/Support/WithColor.cpp diff --git a/llvm/lib/DebugInfo/DWARF/SyntaxHighlighting.h b/llvm/include/llvm/Support/WithColor.h similarity index 62% rename from llvm/lib/DebugInfo/DWARF/SyntaxHighlighting.h rename to llvm/include/llvm/Support/WithColor.h index 9aa0604..39c9953 100644 --- a/llvm/lib/DebugInfo/DWARF/SyntaxHighlighting.h +++ b/llvm/include/llvm/Support/WithColor.h @@ -1,4 +1,4 @@ -//===- SyntaxHighlighting.h -------------------------------------*- C++ -*-===// +//===- WithColor.h ----------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -7,18 +7,15 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_LIB_DEBUGINFO_SYNTAXHIGHLIGHTING_H -#define LLVM_LIB_DEBUGINFO_SYNTAXHIGHLIGHTING_H +#ifndef LLVM_SUPPORT_WITHCOLOR_H +#define LLVM_SUPPORT_WITHCOLOR_H namespace llvm { class raw_ostream; -namespace dwarf { -namespace syntax { - // Symbolic names for various syntax elements. -enum HighlightColor { +enum class HighlightColor { Address, String, Tag, @@ -30,25 +27,22 @@ enum HighlightColor { Note }; -/// An RAII object that temporarily switches an output stream to a -/// specific color. +/// An RAII object that temporarily switches an output stream to a specific +/// color. class WithColor { raw_ostream &OS; /// Determine whether colors should be displayed. bool colorsEnabled(raw_ostream &OS); public: - /// To be used like this: WithColor(OS, syntax::String) << "text"; - WithColor(raw_ostream &OS, enum HighlightColor Type); + /// To be used like this: WithColor(OS, HighlightColor::String) << "text"; + WithColor(raw_ostream &OS, HighlightColor S); ~WithColor(); raw_ostream &get() { return OS; } operator raw_ostream &() { return OS; } }; -} // end namespace syntax -} // end namespace dwarf - } // end namespace llvm -#endif // LLVM_LIB_DEBUGINFO_SYNTAXHIGHLIGHTING_H +#endif // LLVM_LIB_DEBUGINFO_WITHCOLOR_H diff --git a/llvm/lib/DebugInfo/DWARF/CMakeLists.txt b/llvm/lib/DebugInfo/DWARF/CMakeLists.txt index 28632b6..8dd4edc 100644 --- a/llvm/lib/DebugInfo/DWARF/CMakeLists.txt +++ b/llvm/lib/DebugInfo/DWARF/CMakeLists.txt @@ -24,7 +24,6 @@ add_llvm_library(LLVMDebugInfoDWARF DWARFUnitIndex.cpp DWARFUnit.cpp DWARFVerifier.cpp - SyntaxHighlighting.cpp ADDITIONAL_HEADER_DIRS ${LLVM_MAIN_INCLUDE_DIR}/llvm/DebugInfo/DWARF diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugMacro.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugMacro.cpp index 1b77be6..6d789c3 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFDebugMacro.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugMacro.cpp @@ -8,14 +8,13 @@ //===----------------------------------------------------------------------===// #include "llvm/DebugInfo/DWARF/DWARFDebugMacro.h" -#include "SyntaxHighlighting.h" #include "llvm/BinaryFormat/Dwarf.h" +#include "llvm/Support/WithColor.h" #include "llvm/Support/raw_ostream.h" #include using namespace llvm; using namespace dwarf; -using namespace syntax; void DWARFDebugMacro::dump(raw_ostream &OS) const { unsigned IndLevel = 0; @@ -29,7 +28,7 @@ void DWARFDebugMacro::dump(raw_ostream &OS) const { OS << " "; IndLevel += (E.Type == DW_MACINFO_start_file); - WithColor(OS, syntax::Macro).get() << MacinfoString(E.Type); + WithColor(OS, HighlightColor::Macro).get() << MacinfoString(E.Type); switch (E.Type) { default: // Got a corrupted ".debug_macinfo" section (invalid macinfo type). diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp index 17559d2..82f373e 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// #include "llvm/DebugInfo/DWARF/DWARFDie.h" -#include "SyntaxHighlighting.h" #include "llvm/ADT/None.h" #include "llvm/ADT/Optional.h" #include "llvm/ADT/StringRef.h" @@ -23,6 +22,7 @@ #include "llvm/Support/DataExtractor.h" #include "llvm/Support/Format.h" #include "llvm/Support/MathExtras.h" +#include "llvm/Support/WithColor.h" #include "llvm/Support/raw_ostream.h" #include #include @@ -34,7 +34,6 @@ using namespace llvm; using namespace dwarf; using namespace object; -using namespace syntax; static void dumpApplePropertyAttribute(raw_ostream &OS, uint64_t Val) { OS << " ("; @@ -191,9 +190,10 @@ static void dumpAttribute(raw_ostream &OS, const DWARFDie &Die, OS.indent(Indent + 2); auto attrString = AttributeString(Attr); if (!attrString.empty()) - WithColor(OS, syntax::Attribute) << attrString; + WithColor(OS, HighlightColor::Attribute) << attrString; else - WithColor(OS, syntax::Attribute).get() << format("DW_AT_Unknown_%x", Attr); + WithColor(OS, HighlightColor::Attribute).get() + << format("DW_AT_Unknown_%x", Attr); if (DumpOpts.Verbose || DumpOpts.ShowForm) { auto formString = FormEncodingString(Form); @@ -214,9 +214,9 @@ static void dumpAttribute(raw_ostream &OS, const DWARFDie &Die, StringRef Name; std::string File; - auto Color = syntax::Enumerator; + auto Color = HighlightColor::Enumerator; if (Attr == DW_AT_decl_file || Attr == DW_AT_call_file) { - Color = syntax::String; + Color = HighlightColor::String; if (const auto *LT = U->getContext().getLineTableForUnit(U)) if (LT->getFileNameByIndex( formValue.getAsUnsignedConstant().getValue(), @@ -459,16 +459,17 @@ void DWARFDie::dump(raw_ostream &OS, unsigned Indent, if (debug_info_data.isValidOffset(offset)) { uint32_t abbrCode = debug_info_data.getULEB128(&offset); if (DumpOpts.ShowAddresses) - WithColor(OS, syntax::Address).get() << format("\n0x%8.8x: ", Offset); + WithColor(OS, HighlightColor::Address).get() + << format("\n0x%8.8x: ", Offset); if (abbrCode) { auto AbbrevDecl = getAbbreviationDeclarationPtr(); if (AbbrevDecl) { auto tagString = TagString(getTag()); if (!tagString.empty()) - WithColor(OS, syntax::Tag).get().indent(Indent) << tagString; + WithColor(OS, HighlightColor::Tag).get().indent(Indent) << tagString; else - WithColor(OS, syntax::Tag).get().indent(Indent) + WithColor(OS, HighlightColor::Tag).get().indent(Indent) << format("DW_TAG_Unknown_%x", getTag()); if (DumpOpts.Verbose) diff --git a/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp b/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp index 5ccd429..3066c37 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFFormValue.cpp @@ -8,7 +8,6 @@ //===----------------------------------------------------------------------===// #include "llvm/DebugInfo/DWARF/DWARFFormValue.h" -#include "SyntaxHighlighting.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/None.h" #include "llvm/ADT/Optional.h" @@ -19,6 +18,7 @@ #include "llvm/DebugInfo/DWARF/DWARFUnit.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/Format.h" +#include "llvm/Support/WithColor.h" #include "llvm/Support/raw_ostream.h" #include #include @@ -26,7 +26,6 @@ using namespace llvm; using namespace dwarf; -using namespace syntax; static const DWARFFormValue::FormClass DWARF5FormClasses[] = { DWARFFormValue::FC_Unknown, // 0x0 @@ -421,8 +420,9 @@ bool DWARFFormValue::extractValue(const DWARFDataExtractor &Data, void DWARFFormValue::dump(raw_ostream &OS, DIDumpOptions DumpOpts) const { uint64_t UValue = Value.uval; bool CURelativeOffset = false; - raw_ostream &AddrOS = - DumpOpts.ShowAddresses ? WithColor(OS, syntax::Address).get() : nulls(); + raw_ostream &AddrOS = DumpOpts.ShowAddresses + ? WithColor(OS, HighlightColor::Address).get() + : nulls(); switch (Form) { case DW_FORM_addr: AddrOS << format("0x%016" PRIx64, UValue); @@ -584,7 +584,7 @@ void DWARFFormValue::dump(raw_ostream &OS, DIDumpOptions DumpOpts) const { if (CURelativeOffset) { if (DumpOpts.Verbose) OS << " => {"; - WithColor(OS, syntax::Address).get() + WithColor(OS, HighlightColor::Address).get() << format("0x%8.8" PRIx64, UValue + (U ? U->getOffset() : 0)); if (DumpOpts.Verbose) OS << "}"; @@ -594,7 +594,7 @@ void DWARFFormValue::dump(raw_ostream &OS, DIDumpOptions DumpOpts) const { void DWARFFormValue::dumpString(raw_ostream &OS) const { Optional DbgStr = getAsCString(); if (DbgStr.hasValue()) { - auto COS = WithColor(OS, syntax::String); + auto COS = WithColor(OS, HighlightColor::String); COS.get() << '"'; COS.get().write_escaped(DbgStr.getValue()); COS.get() << '"'; diff --git a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp index 171ff63..16e0d8a 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp @@ -7,8 +7,8 @@ // //===----------------------------------------------------------------------===// -#include "SyntaxHighlighting.h" #include "llvm/DebugInfo/DWARF/DWARFVerifier.h" +#include "llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h" #include "llvm/DebugInfo/DWARF/DWARFCompileUnit.h" #include "llvm/DebugInfo/DWARF/DWARFContext.h" #include "llvm/DebugInfo/DWARF/DWARFDebugLine.h" @@ -16,8 +16,8 @@ #include "llvm/DebugInfo/DWARF/DWARFExpression.h" #include "llvm/DebugInfo/DWARF/DWARFFormValue.h" #include "llvm/DebugInfo/DWARF/DWARFSection.h" -#include "llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h" #include "llvm/Support/FormatVariadic.h" +#include "llvm/Support/WithColor.h" #include "llvm/Support/raw_ostream.h" #include #include @@ -26,7 +26,6 @@ using namespace llvm; using namespace dwarf; using namespace object; -using namespace syntax; DWARFVerifier::DieRangeInfo::address_range_iterator DWARFVerifier::DieRangeInfo::insert(const DWARFAddressRange &R) { @@ -885,13 +884,13 @@ bool DWARFVerifier::handleAccelTables() { } raw_ostream &DWARFVerifier::error() const { - return WithColor(OS, syntax::Error).get() << "error: "; + return WithColor(OS, HighlightColor::Error).get() << "error: "; } raw_ostream &DWARFVerifier::warn() const { - return WithColor(OS, syntax::Warning).get() << "warning: "; + return WithColor(OS, HighlightColor::Warning).get() << "warning: "; } raw_ostream &DWARFVerifier::note() const { - return WithColor(OS, syntax::Note).get() << "note: "; + return WithColor(OS, HighlightColor::Note).get() << "note: "; } diff --git a/llvm/lib/DebugInfo/DWARF/SyntaxHighlighting.cpp b/llvm/lib/DebugInfo/DWARF/SyntaxHighlighting.cpp deleted file mode 100644 index f60f962..0000000 --- a/llvm/lib/DebugInfo/DWARF/SyntaxHighlighting.cpp +++ /dev/null @@ -1,49 +0,0 @@ -//===- SyntaxHighlighting.cpp ---------------------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// - -#include "SyntaxHighlighting.h" -#include "llvm/Support/CommandLine.h" -#include "llvm/Support/raw_ostream.h" - -using namespace llvm; -using namespace dwarf; -using namespace syntax; - -static cl::opt - UseColor("color", - cl::desc("use colored syntax highlighting (default=autodetect)"), - cl::init(cl::BOU_UNSET)); - -bool WithColor::colorsEnabled(raw_ostream &OS) { - if (UseColor == cl::BOU_UNSET) - return OS.has_colors(); - return UseColor == cl::BOU_TRUE; -} - -WithColor::WithColor(raw_ostream &OS, enum HighlightColor Type) : OS(OS) { - // Detect color from terminal type unless the user passed the --color option. - if (colorsEnabled(OS)) { - switch (Type) { - case Address: OS.changeColor(raw_ostream::YELLOW); break; - case String: OS.changeColor(raw_ostream::GREEN); break; - case Tag: OS.changeColor(raw_ostream::BLUE); break; - case Attribute: OS.changeColor(raw_ostream::CYAN); break; - case Enumerator: OS.changeColor(raw_ostream::MAGENTA); break; - case Macro: OS.changeColor(raw_ostream::RED); break; - case Error: OS.changeColor(raw_ostream::RED, true); break; - case Warning: OS.changeColor(raw_ostream::MAGENTA, true); break; - case Note: OS.changeColor(raw_ostream::BLACK, true); break; - } - } -} - -WithColor::~WithColor() { - if (colorsEnabled(OS)) - OS.resetColor(); -} diff --git a/llvm/lib/Support/CMakeLists.txt b/llvm/lib/Support/CMakeLists.txt index f4bda2f..b8f11fe 100644 --- a/llvm/lib/Support/CMakeLists.txt +++ b/llvm/lib/Support/CMakeLists.txt @@ -120,6 +120,7 @@ add_llvm_library(LLVMSupport Twine.cpp Unicode.cpp UnicodeCaseFold.cpp + WithColor.cpp YAMLParser.cpp YAMLTraits.cpp raw_os_ostream.cpp diff --git a/llvm/lib/Support/WithColor.cpp b/llvm/lib/Support/WithColor.cpp new file mode 100644 index 0000000..39a582d --- /dev/null +++ b/llvm/lib/Support/WithColor.cpp @@ -0,0 +1,65 @@ +//===- WithColor.cpp ------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Support/WithColor.h" +#include "llvm/Support/CommandLine.h" +#include "llvm/Support/raw_ostream.h" + +using namespace llvm; + +static cl::opt + UseColor("color", + cl::desc("use colored syntax highlighting (default=autodetect)"), + cl::init(cl::BOU_UNSET)); + +bool WithColor::colorsEnabled(raw_ostream &OS) { + if (UseColor == cl::BOU_UNSET) + return OS.has_colors(); + return UseColor == cl::BOU_TRUE; +} + +WithColor::WithColor(raw_ostream &OS, HighlightColor Color) : OS(OS) { + // Detect color from terminal type unless the user passed the --color option. + if (colorsEnabled(OS)) { + switch (Color) { + case HighlightColor::Address: + OS.changeColor(raw_ostream::YELLOW); + break; + case HighlightColor::String: + OS.changeColor(raw_ostream::GREEN); + break; + case HighlightColor::Tag: + OS.changeColor(raw_ostream::BLUE); + break; + case HighlightColor::Attribute: + OS.changeColor(raw_ostream::CYAN); + break; + case HighlightColor::Enumerator: + OS.changeColor(raw_ostream::MAGENTA); + break; + case HighlightColor::Macro: + OS.changeColor(raw_ostream::RED); + break; + case HighlightColor::Error: + OS.changeColor(raw_ostream::RED, true); + break; + case HighlightColor::Warning: + OS.changeColor(raw_ostream::MAGENTA, true); + break; + case HighlightColor::Note: + OS.changeColor(raw_ostream::BLACK, true); + break; + } + } +} + +WithColor::~WithColor() { + if (colorsEnabled(OS)) + OS.resetColor(); +} -- 2.7.4