https://github.com/nebulark created 
https://github.com/llvm/llvm-project/pull/106369

This change moves the flattening of commandline arguments for LF_BUILDINFO into 
the compiler frontend. This way other compiler frontends that use LLVM can do 
that flattening in a way that makes sense for them. E.g. clang wants to ensure 
a "-cc1" argument exists, while other frontends (e.g. rustc) don't.






>From aad31f04028994801a6034b966820ef5353da219 Mon Sep 17 00:00:00 2001
From: Florian Schmiderer <florian.schmide...@posteo.net>
Date: Wed, 28 Aug 2024 12:36:39 +0200
Subject: [PATCH] Flatten compiler args in Frontend, keep existing behaviour as
 fallback for other frontends

---
 clang/lib/CodeGen/BackendUtil.cpp             | 38 +++++++++++++++++++
 llvm/include/llvm/MC/MCTargetOptions.h        |  7 ++++
 llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp | 15 ++++++--
 3 files changed, 57 insertions(+), 3 deletions(-)

diff --git a/clang/lib/CodeGen/BackendUtil.cpp 
b/clang/lib/CodeGen/BackendUtil.cpp
index e765bbf637a661..cc6bb5824cbe98 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -50,6 +50,7 @@
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/PrettyStackTrace.h"
+#include "llvm/Support/Program.h"
 #include "llvm/Support/TimeProfiler.h"
 #include "llvm/Support/Timer.h"
 #include "llvm/Support/ToolOutputFile.h"
@@ -321,6 +322,41 @@ static bool actionRequiresCodeGen(BackendAction Action) {
          Action != Backend_EmitLL;
 }
 
+static std::string flattenClangCommandLine(ArrayRef<std::string> Args,
+                                      StringRef MainFilename) {
+  std::string FlatCmdLine;
+  raw_string_ostream OS(FlatCmdLine);
+  bool PrintedOneArg = false;
+  if (!StringRef(Args[0]).contains("-cc1")) {
+    llvm::sys::printArg(OS, "-cc1", /*Quote=*/true);
+    PrintedOneArg = true;
+  }
+  for (unsigned i = 0; i < Args.size(); i++) {
+    StringRef Arg = Args[i];
+    if (Arg.empty()) {
+      continue;
+    }
+    if (Arg == "-main-file-name" || Arg == "-o") {
+      i++; // Skip this argument and next one.
+      continue;
+    }
+    if (Arg.starts_with("-object-file-name") || Arg == MainFilename) {
+      continue;
+    }
+    // Skip fmessage-length for reproduciability.
+    if (Arg.starts_with("-fmessage-length")) {
+      continue;
+    }
+    if (PrintedOneArg) {
+      OS << " ";
+    }
+    llvm::sys::printArg(OS, Arg, /*Quote=*/true);
+    PrintedOneArg = true;
+  }
+  OS.flush();
+  return FlatCmdLine;
+}
+
 static bool initTargetOptions(DiagnosticsEngine &Diags,
                               llvm::TargetOptions &Options,
                               const CodeGenOptions &CodeGenOpts,
@@ -484,6 +520,8 @@ static bool initTargetOptions(DiagnosticsEngine &Diags,
           Entry.IgnoreSysRoot ? Entry.Path : HSOpts.Sysroot + Entry.Path);
   Options.MCOptions.Argv0 = CodeGenOpts.Argv0;
   Options.MCOptions.CommandLineArgs = CodeGenOpts.CommandLineArgs;
+  Options.MCOptions.CommandlineArgsFlat = flattenClangCommandLine(
+      CodeGenOpts.CommandLineArgs, CodeGenOpts.MainFileName);
   Options.MCOptions.AsSecureLogFile = CodeGenOpts.AsSecureLogFile;
   Options.MCOptions.PPCUseFullRegisterNames =
       CodeGenOpts.PPCUseFullRegisterNames;
diff --git a/llvm/include/llvm/MC/MCTargetOptions.h 
b/llvm/include/llvm/MC/MCTargetOptions.h
index 98317712250bf9..f4a002c82ef329 100644
--- a/llvm/include/llvm/MC/MCTargetOptions.h
+++ b/llvm/include/llvm/MC/MCTargetOptions.h
@@ -92,8 +92,15 @@ class MCTargetOptions {
   std::string AsSecureLogFile;
 
   const char *Argv0 = nullptr;
+
+  // Deprecated: Use FlatCommandlineArgs instead
+  // Arguments here are interpreted as coming from clang, formated and end up 
in LF_BUILDINFO as CommandLineArgs 
   ArrayRef<std::string> CommandLineArgs;
 
+  // Arguments here end up in LF_BUILDINFO as CommandLineArgs without any 
additional formating
+  // If empty falls back to CommandLineArgs
+  std::string CommandlineArgsFlat;
+
   /// Additional paths to search for `.include` directives when using the
   /// integrated assembler.
   std::vector<std::string> IASSearchPaths;
diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp 
b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
index dddc08b3bc0166..f95a8f1c428b86 100644
--- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
@@ -893,6 +893,8 @@ static TypeIndex getStringIdTypeIdx(GlobalTypeTableBuilder 
&TypeTable,
   return TypeTable.writeLeafType(SIR);
 }
 
+// This just exists for backwards compatability for the deprecated 
MCTargetOptions::CommandLineArgs
+// It assumed a clang compiler frontend
 static std::string flattenCommandLine(ArrayRef<std::string> Args,
                                       StringRef MainFilename) {
   std::string FlatCmdLine;
@@ -950,9 +952,16 @@ void CodeViewDebug::emitBuildInfo() {
   if (Asm->TM.Options.MCOptions.Argv0 != nullptr) {
     BuildInfoArgs[BuildInfoRecord::BuildTool] =
         getStringIdTypeIdx(TypeTable, Asm->TM.Options.MCOptions.Argv0);
-    BuildInfoArgs[BuildInfoRecord::CommandLine] = getStringIdTypeIdx(
-        TypeTable, 
flattenCommandLine(Asm->TM.Options.MCOptions.CommandLineArgs,
-                                      MainSourceFile->getFilename()));
+
+    if (!Asm->TM.Options.MCOptions.CommandlineArgsFlat.empty()) {
+      BuildInfoArgs[BuildInfoRecord::CommandLine] = getStringIdTypeIdx(
+          TypeTable, Asm->TM.Options.MCOptions.CommandlineArgsFlat);
+    } else {
+      BuildInfoArgs[BuildInfoRecord::CommandLine] = getStringIdTypeIdx(
+          TypeTable,
+          flattenCommandLine(Asm->TM.Options.MCOptions.CommandLineArgs,
+                             MainSourceFile->getFilename()));
+    }
   }
   BuildInfoRecord BIR(BuildInfoArgs);
   TypeIndex BuildInfoIndex = TypeTable.writeLeafType(BIR);

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to