From 95062d74676b98a85e4d3db6628d239b15dbeb35 Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere Date: Fri, 1 Sep 2023 08:50:05 -0700 Subject: [llvm-objdump] Enable disassembly color highlighting Enable color highlighting of disassembly in llvm-objdump. This patch introduces a new flag --disassembler-color= that enables or disables highlighting disassembly with ANSI escape codes. The default mode is to enable color highlighting if outputting to a color-enabled terminal. Differential revision: https://reviews.llvm.org/D159224 --- llvm/tools/llvm-objdump/llvm-objdump.cpp | 38 ++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'llvm/tools/llvm-objdump/llvm-objdump.cpp') diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 1e5175b..96d74d6 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -177,6 +177,13 @@ public: #define DEBUG_TYPE "objdump" +enum class ColorOutput { + Auto, + Enable, + Disable, + Invalid, +}; + static uint64_t AdjustVMA; static bool AllHeaders; static std::string ArchName; @@ -189,6 +196,7 @@ bool objdump::TracebackTable; static std::vector DisassembleSymbols; static bool DisassembleZeroes; static std::vector DisassemblerOptions; +static ColorOutput DisassemblyColor; DIDumpType objdump::DwarfDumpType; static bool DynamicRelocations; static bool FaultMapSection; @@ -900,6 +908,19 @@ DisassemblerTarget::DisassemblerTarget(const Target *TheTarget, ObjectFile &Obj, InstPrinter->setPrintBranchImmAsAddress(true); InstPrinter->setSymbolizeOperands(SymbolizeOperands); InstPrinter->setMCInstrAnalysis(InstrAnalysis.get()); + + switch (DisassemblyColor) { + case ColorOutput::Enable: + InstPrinter->setUseColor(true); + break; + case ColorOutput::Auto: + InstPrinter->setUseColor(outs().has_colors()); + break; + case ColorOutput::Disable: + case ColorOutput::Invalid: + InstPrinter->setUseColor(false); + break; + }; } DisassemblerTarget::DisassemblerTarget(DisassemblerTarget &Other, @@ -1900,6 +1921,13 @@ disassembleObject(ObjectFile &Obj, const ObjectFile &DbgObj, formatted_raw_ostream FOS(outs()); + // FIXME: Workaround for bug in formatted_raw_ostream. Color escape codes + // are (incorrectly) written directly to the unbuffered raw_ostream + // wrapped by the formatted_raw_ostream. + if (DisassemblyColor == ColorOutput::Enable || + DisassemblyColor == ColorOutput::Auto) + FOS.SetUnbuffered(); + std::unordered_map AllLabels; std::unordered_map> BBAddrMapLabels; if (SymbolizeOperands) { @@ -3193,6 +3221,16 @@ static void parseObjdumpOptions(const llvm::opt::InputArgList &InputArgs) { if (DbgVariables == DVInvalid) invalidArgValue(A); } + if (const opt::Arg *A = InputArgs.getLastArg(OBJDUMP_disassembler_color_EQ)) { + DisassemblyColor = StringSwitch(A->getValue()) + .Case("on", ColorOutput::Enable) + .Case("off", ColorOutput::Disable) + .Case("terminal", ColorOutput::Auto) + .Default(ColorOutput::Invalid); + if (DisassemblyColor == ColorOutput::Invalid) + invalidArgValue(A); + } + parseIntArg(InputArgs, OBJDUMP_debug_vars_indent_EQ, DbgIndent); parseMachOOptions(InputArgs); -- cgit v1.1