[Support] Move Target/CPU Printing out of CommandLine
authorArchibald Elliott <archibald.elliott@arm.com>
Tue, 13 Dec 2022 22:02:58 +0000 (22:02 +0000)
committerArchibald Elliott <archibald.elliott@arm.com>
Tue, 20 Dec 2022 09:56:14 +0000 (09:56 +0000)
This change is rather more invasive than intended. The main intention
here is to make CommandLine.cpp not rely on llvm/Support/Host.h. Right
now, this reliance is only in 3 superficial places:
- Choosing how to expand response files (in two places)
- Printing the default triple and current CPU in `--version` output.

The built in version system has a method for adding "extra version
printers", commonly used by several tools (such as llc) to report the
registered targets in the built version of LLVM. It was reasonably easy
to move the logic for printing the default triple and current CPU into
a similar function, and register it with any relevant binaries.

The incompatible change here is that now, even if
LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO is defined, most binaries
will no longer print out the default target triple and cpu when provided
with `--version`, for instance llvm-as and llvm-dis. This breakage is
intended, but the changes in this patch keep printing the default target
and detected in `llc` and `opt` as these were remarked as important
binaries in the LLVM install.

The change to expanding response files may also be controversial, but I
believe that these macros should correspond exactly to the host triple
introspection used before.

Differential Revision: https://reviews.llvm.org/D137837

llvm/include/llvm/Support/Host.h
llvm/lib/MC/TargetRegistry.cpp
llvm/lib/Support/CommandLine.cpp
llvm/lib/Support/Host.cpp
llvm/test/tools/llvm-libtool-darwin/ignored-options.test
llvm/tools/llc/llc.cpp
llvm/tools/llvm-exegesis/llvm-exegesis.cpp
llvm/tools/llvm-mca/llvm-mca.cpp
llvm/tools/opt/opt.cpp

index dcebebd..d1318b1 100644 (file)
@@ -19,6 +19,7 @@ namespace llvm {
 class MallocAllocator;
 class StringRef;
 template <typename ValueTy, typename AllocatorTy> class StringMap;
+class raw_ostream;
 
 namespace sys {
 
@@ -54,6 +55,10 @@ namespace sys {
   /// \return - True on success.
   bool getHostCPUFeatures(StringMap<bool, MallocAllocator> &Features);
 
+  /// This is a function compatible with cl::AddExtraVersionPrinter, which adds
+  /// info about the current target triple and detected CPU.
+  void printDefaultTargetAndDetectedCPU(raw_ostream &OS);
+
   namespace detail {
   /// Helper functions to extract HostCPUName from /proc/cpuinfo on linux.
   StringRef getHostCPUNameForPowerPC(StringRef ProcCpuinfoContent);
index 57444fd..b54853a 100644 (file)
@@ -123,6 +123,7 @@ void TargetRegistry::printRegisteredTargetsForVersion(raw_ostream &OS) {
   }
   array_pod_sort(Targets.begin(), Targets.end(), TargetArraySortFn);
 
+  OS << "\n";
   OS << "  Registered Targets:\n";
   for (const auto &Target : Targets) {
     OS << "    " << Target.first;
index 24fe049..6663250 100644 (file)
@@ -27,7 +27,6 @@
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringMap.h"
 #include "llvm/ADT/StringRef.h"
-#include "llvm/ADT/Triple.h"
 #include "llvm/ADT/Twine.h"
 #include "llvm/Config/config.h"
 #include "llvm/Support/ConvertUTF.h"
@@ -35,7 +34,6 @@
 #include "llvm/Support/Error.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/FileSystem.h"
-#include "llvm/Support/Host.h"
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/Path.h"
@@ -1358,9 +1356,11 @@ Error ExpansionContext::expandResponseFiles(
 bool cl::expandResponseFiles(int Argc, const char *const *Argv,
                              const char *EnvVar, StringSaver &Saver,
                              SmallVectorImpl<const char *> &NewArgv) {
-  auto Tokenize = Triple(sys::getProcessTriple()).isOSWindows()
-                      ? cl::TokenizeWindowsCommandLine
-                      : cl::TokenizeGNUCommandLine;
+#ifdef _WIN32
+  auto Tokenize = cl::TokenizeWindowsCommandLine;
+#else
+  auto Tokenize = cl::TokenizeGNUCommandLine;
+#endif
   // The environment variable specifies initial options.
   if (EnvVar)
     if (std::optional<std::string> EnvValue = sys::Process::GetEnv(EnvVar))
@@ -1504,9 +1504,12 @@ bool CommandLineParser::ParseCommandLineOptions(int argc,
   // Expand response files.
   SmallVector<const char *, 20> newArgv(argv, argv + argc);
   BumpPtrAllocator A;
-  ExpansionContext ECtx(A, Triple(sys::getProcessTriple()).isOSWindows()
-                               ? cl::TokenizeWindowsCommandLine
-                               : cl::TokenizeGNUCommandLine);
+#ifdef _WIN32
+  auto Tokenize = cl::TokenizeWindowsCommandLine;
+#else
+  auto Tokenize = cl::TokenizeGNUCommandLine;
+#endif
+  ExpansionContext ECtx(A, Tokenize);
   if (Error Err = ECtx.expandResponseFiles(newArgv)) {
     *Errs << toString(std::move(Err)) << '\n';
     return false;
@@ -2535,7 +2538,7 @@ public:
 namespace {
 class VersionPrinter {
 public:
-  void print() {
+  void print(std::vector<VersionPrinterTy> ExtraPrinters = {}) {
     raw_ostream &OS = outs();
 #ifdef PACKAGE_VENDOR
     OS << PACKAGE_VENDOR << " ";
@@ -2551,15 +2554,14 @@ public:
 #ifndef NDEBUG
     OS << " with assertions";
 #endif
-#if LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO
-    std::string CPU = std::string(sys::getHostCPUName());
-    if (CPU == "generic")
-      CPU = "(unknown)";
-    OS << ".\n"
-       << "  Default target: " << sys::getDefaultTargetTriple() << '\n'
-       << "  Host CPU: " << CPU;
-#endif
-    OS << '\n';
+    OS << ".\n";
+
+    // Iterate over any registered extra printers and call them to add further
+    // information.
+    if (!ExtraPrinters.empty()) {
+      for (const auto &I : ExtraPrinters)
+        I(outs());
+    }
   }
   void operator=(bool OptionWasSpecified);
 };
@@ -2686,15 +2688,7 @@ void VersionPrinter::operator=(bool OptionWasSpecified) {
     CommonOptions->OverrideVersionPrinter(outs());
     exit(0);
   }
-  print();
-
-  // Iterate over any registered extra printers and call them to add further
-  // information.
-  if (!CommonOptions->ExtraVersionPrinters.empty()) {
-    outs() << '\n';
-    for (const auto &I : CommonOptions->ExtraVersionPrinters)
-      I(outs());
-  }
+  print(CommonOptions->ExtraVersionPrinters);
 
   exit(0);
 }
@@ -2749,7 +2743,7 @@ void cl::PrintHelpMessage(bool Hidden, bool Categorized) {
 
 /// Utility function for printing version number.
 void cl::PrintVersionMessage() {
-  CommonOptions->VersionPrinterInstance.print();
+  CommonOptions->VersionPrinterInstance.print(CommonOptions->ExtraVersionPrinters);
 }
 
 void cl::SetVersionPrinter(VersionPrinterTy func) {
index 2bd2948..f2ecf0a 100644 (file)
@@ -1855,3 +1855,13 @@ std::string sys::getProcessTriple() {
 
   return PT.str();
 }
+
+void sys::printDefaultTargetAndDetectedCPU(raw_ostream &OS) {
+#if LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO
+  std::string CPU = std::string(sys::getHostCPUName());
+  if (CPU == "generic")
+    CPU = "(unknown)";
+  OS << "  Default target: " << sys::getDefaultTargetTriple() << '\n'
+     << "  Host CPU: " << CPU << '\n';
+#endif
+}
index 3b5386e..ce2f1af 100644 (file)
@@ -3,6 +3,6 @@
 # RUN: llvm-libtool-darwin -V -syslibroot foo | FileCheck %s
 # RUN: llvm-libtool-darwin -h | FileCheck --check-prefix=HELP %s
 
-# CHECK: Default target:
+# CHECK: LLVM version
 
 # HELP-NOT: syslibroot
index 4f8c7b9..c871d55 100644 (file)
@@ -374,6 +374,8 @@ int main(int argc, char **argv) {
   // Initialize debugging passes.
   initializeScavengerTestPass(*Registry);
 
+  // Register the Target and CPU printer for --version.
+  cl::AddExtraVersionPrinter(sys::printDefaultTargetAndDetectedCPU);
   // Register the target printer for --version.
   cl::AddExtraVersionPrinter(TargetRegistry::printRegisteredTargetsForVersion);
 
index d13abd1..04aac6a 100644 (file)
@@ -582,6 +582,9 @@ int main(int Argc, char **Argv) {
   InitializeAllTargets();
   InitializeAllTargetMCs();
 
+  // Register the Target and CPU printer for --version.
+  cl::AddExtraVersionPrinter(sys::printDefaultTargetAndDetectedCPU);
+
   // Enable printing of available targets when flag --version is specified.
   cl::AddExtraVersionPrinter(TargetRegistry::printRegisteredTargetsForVersion);
 
index 2a27fea..73c3418 100644 (file)
@@ -322,6 +322,9 @@ int main(int argc, char **argv) {
   InitializeAllAsmParsers();
   InitializeAllTargetMCAs();
 
+  // Register the Target and CPU printer for --version.
+  cl::AddExtraVersionPrinter(sys::printDefaultTargetAndDetectedCPU);
+
   // Enable printing of available targets when flag --version is specified.
   cl::AddExtraVersionPrinter(TargetRegistry::printRegisteredTargetsForVersion);
 
index 63fbf3c..b0b13fd 100644 (file)
@@ -469,6 +469,9 @@ int main(int argc, char **argv) {
     PluginList.emplace_back(Plugin.get());
   });
 
+  // Register the Target and CPU printer for --version.
+  cl::AddExtraVersionPrinter(sys::printDefaultTargetAndDetectedCPU);
+
   cl::ParseCommandLineOptions(argc, argv,
     "llvm .bc -> .bc modular optimizer and analysis printer\n");