]> granicus.if.org Git - clang/commitdiff
Re-commit r344234 "clang-cl: Add /showFilenames option (PR31957)"
authorHans Wennborg <hans@hanshq.net>
Sat, 13 Oct 2018 19:13:14 +0000 (19:13 +0000)
committerHans Wennborg <hans@hanshq.net>
Sat, 13 Oct 2018 19:13:14 +0000 (19:13 +0000)
The test was failing on e.g. PPC which can't target Windows. Fix by
requiring X86 target in the test. Also, make sure the output goes to a
temporary directory, since CWD may not be writable.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@344462 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Driver/CLCompatOptions.td
include/clang/Driver/Job.h
lib/Driver/Job.cpp
lib/Driver/ToolChains/Clang.cpp
test/Driver/cl-showfilenames.c [new file with mode: 0644]

index 62a4497ac42ec85540dd9a96a0f335dad85dc097..3c2bef74ed0a130eee8bcc2bf1bb1faeda1ce97c 100644 (file)
@@ -158,6 +158,10 @@ def _SLASH_Qvec_ : CLFlag<"Qvec-">,
 def _SLASH_showIncludes : CLFlag<"showIncludes">,
   HelpText<"Print info about included files to stderr">,
   Alias<show_includes>;
+def _SLASH_showFilenames : CLFlag<"showFilenames">,
+  HelpText<"Print the name of each compiled file">;
+def _SLASH_showFilenames_ : CLFlag<"showFilenames-">,
+  HelpText<"Don't print the name of each compiled file (default)">;
 def _SLASH_source_charset : CLCompileJoined<"source-charset:">,
   HelpText<"Source encoding, supports only UTF-8">, Alias<finput_charset_EQ>;
 def _SLASH_execution_charset : CLCompileJoined<"execution-charset:">,
index 10b97b98a2cff833f00ef81c0f76e02a05140938..870a31c520933f050d943d7c19b9af9df2d28f5b 100644 (file)
@@ -56,6 +56,9 @@ class Command {
   /// The list of program arguments which are inputs.
   llvm::opt::ArgStringList InputFilenames;
 
+  /// Whether to print the input filenames when executing.
+  bool PrintInputFilenames = false;
+
   /// Response file name, if this command is set to use one, or nullptr
   /// otherwise
   const char *ResponseFile = nullptr;
@@ -125,6 +128,9 @@ public:
 
   /// Print a command argument, and optionally quote it.
   static void printArg(llvm::raw_ostream &OS, StringRef Arg, bool Quote);
+
+  /// Set whether to print the input filenames when executing.
+  void setPrintInputFilenames(bool P) { PrintInputFilenames = P; }
 };
 
 /// Like Command, but with a fallback which is executed in case
index b6322b6ce2b048926cee4d6bd57bef8922de3dc8..8d1dfbe12d7300b45720bfaf414ce5ee6dbe7a7d 100644 (file)
@@ -316,6 +316,12 @@ void Command::setEnvironment(llvm::ArrayRef<const char *> NewEnvironment) {
 
 int Command::Execute(ArrayRef<llvm::Optional<StringRef>> Redirects,
                      std::string *ErrMsg, bool *ExecutionFailed) const {
+  if (PrintInputFilenames) {
+    for (const char *Arg : InputFilenames)
+      llvm::outs() << llvm::sys::path::filename(Arg) << "\n";
+    llvm::outs().flush();
+  }
+
   SmallVector<const char*, 128> Argv;
 
   Optional<ArrayRef<StringRef>> Env;
index 127f80696220d22bec89d1aac783a7e22f84d818..4d2cb14a51bb16600ead87650b95a9e89de089e1 100644 (file)
@@ -5067,6 +5067,13 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
     C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
   }
 
+  // Make the compile command echo its inputs for /showFilenames.
+  if (Output.getType() == types::TY_Object &&
+      Args.hasFlag(options::OPT__SLASH_showFilenames,
+                   options::OPT__SLASH_showFilenames_, false)) {
+    C.getJobs().getJobs().back()->setPrintInputFilenames(true);
+  }
+
   if (Arg *A = Args.getLastArg(options::OPT_pg))
     if (!shouldUseFramePointer(Args, Triple))
       D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
diff --git a/test/Driver/cl-showfilenames.c b/test/Driver/cl-showfilenames.c
new file mode 100644 (file)
index 0000000..5defcd1
--- /dev/null
@@ -0,0 +1,23 @@
+// We have to run the compilation step to see the output, so we must be able to
+// target Windows.
+// REQUIRES: x86-registered-target
+
+// RUN: %clang_cl /c /Fo%T/ /showFilenames -- %s 2>&1 | FileCheck -check-prefix=show %s
+// RUN: %clang_cl /c /Fo%T/ /showFilenames -- %s %S/Inputs/wildcard*.c 2>&1 | FileCheck -check-prefix=multiple %s
+
+// RUN: %clang_cl /c /Fo%T/ -- %s 2>&1 | FileCheck -check-prefix=noshow %s
+// RUN: %clang_cl /c /Fo%T/ /showFilenames /showFilenames- -- %s 2>&1 | FileCheck -check-prefix=noshow %s
+
+
+#pragma message "Hello"
+
+// show: cl-showfilenames.c
+// show-NEXT: warning: Hello
+
+// multiple: cl-showfilenames.c
+// multiple-NEXT: warning: Hello
+// multiple: wildcard1.c
+// multiple-NEXT: wildcard2.c
+
+// noshow: warning: Hello
+// noshow-NOT: cl-showfilenames.c