[PATCH] D159224: [llvm-objcopy] Add flags to force enable/disable color output

Jonas Devlieghere via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 30 13:59:01 PDT 2023


JDevlieghere created this revision.
JDevlieghere added reviewers: jhenderson, MaskRay.
Herald added a reviewer: alexander-shaposhnikov.
Herald added a project: All.
JDevlieghere requested review of this revision.
Herald added a project: LLVM.

Add flags to force enable (`--color`) and disable (`--no-color`) color output. By default, or when neither flags are passed, `llvm-objcopy` will use colors when its output is going to an interactive terminal. These flags allow you to overwrite that behavior, for example for testing when its output is piped to FileCheck.


https://reviews.llvm.org/D159224

Files:
  llvm/test/tools/llvm-objcopy/tool-color.test
  llvm/tools/llvm-objdump/ObjdumpOpts.td
  llvm/tools/llvm-objdump/llvm-objdump.cpp


Index: llvm/tools/llvm-objdump/llvm-objdump.cpp
===================================================================
--- llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -177,6 +177,8 @@
 
 #define DEBUG_TYPE "objdump"
 
+static bool NoColor;
+static bool ForceColor;
 static uint64_t AdjustVMA;
 static bool AllHeaders;
 static std::string ArchName;
@@ -234,6 +236,9 @@
 StringSet<> objdump::FoundSectionSet;
 static StringRef ToolName;
 
+static bool disableColor(const raw_ostream &OS) { return false; }
+static bool forceColor(const raw_ostream &OS) { return true; }
+
 std::unique_ptr<BuildIDFetcher> BIDFetcher;
 
 Dumper::Dumper(const object::ObjectFile &O) : O(O) {
@@ -1900,6 +1905,9 @@
 
       formatted_raw_ostream FOS(outs());
 
+      if (ForceColor)
+        FOS.enable_colors(true);
+
       std::unordered_map<uint64_t, std::string> AllLabels;
       std::unordered_map<uint64_t, std::vector<std::string>> BBAddrMapLabels;
       if (SymbolizeOperands) {
@@ -3330,6 +3338,18 @@
   else
     parseObjdumpOptions(InputArgs);
 
+  // We need to parse the color flags first. Parsing other properties might
+  // require us to print a colored error message.
+  NoColor = InputArgs.hasArg(OBJDUMP_no_color);
+  ForceColor = InputArgs.hasArg(OBJDUMP_color);
+  if (NoColor && ForceColor)
+    reportCmdLineError("--color and --no-color are mutually exclusive");
+
+  if (NoColor)
+    WithColor::setAutoDetectFunction(disableColor);
+  else if(ForceColor)
+    WithColor::setAutoDetectFunction(forceColor);
+
   if (StartAddress >= StopAddress)
     reportCmdLineError("start address should be less than stop address");
 
Index: llvm/tools/llvm-objdump/ObjdumpOpts.td
===================================================================
--- llvm/tools/llvm-objdump/ObjdumpOpts.td
+++ llvm/tools/llvm-objdump/ObjdumpOpts.td
@@ -78,6 +78,10 @@
 
 def disassemble_zeroes : Flag<["--"], "disassemble-zeroes">,
   HelpText<"Do not skip blocks of zeroes when disassembling">;
+def no_color : Flag<["--"], "no-color">,
+  HelpText<"Disable color output">;
+def color : Flag<["--"], "color">,
+  HelpText<"Force color output">;
 def : Flag<["-"], "z">, Alias<disassemble_zeroes>,
   HelpText<"Alias for --disassemble-zeroes">;
 
Index: llvm/test/tools/llvm-objcopy/tool-color.test
===================================================================
--- /dev/null
+++ llvm/test/tools/llvm-objcopy/tool-color.test
@@ -0,0 +1,8 @@
+# RUN: not llvm-objdump --disassemble doesnotexist --color 2>&1 | FileCheck %s --check-prefix=COLOR
+# RUN: not llvm-objdump --disassemble doesnotexist --no-color 2>&1 | FileCheck %s --check-prefix=NOCOLOR
+# RUN: not llvm-objdump --color --no-color 2>&1 | FileCheck %s --check-prefix=CONFLICT
+
+COLOR: error: 'doesnotexist'
+NOCOLOR-NOT [0;1;31m
+NOCOLOR: error: 'doesnotexist'
+CONFLICT: error: --color and --no-color are mutually exclusive


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D159224.554825.patch
Type: text/x-patch
Size: 2926 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230830/30172dcc/attachment.bin>


More information about the llvm-commits mailing list