python3kgae created this revision.
python3kgae added reviewers: amccarth, craig.topper, hans, rnk, 
stefan_reinalter, beanz, pow2clk.
Herald added subscribers: Anastasia, StephenFan.
Herald added a project: All.
python3kgae requested review of this revision.
Herald added subscribers: cfe-commits, MaskRay.
Herald added a project: clang.

fcgl option will make compilation stop after clang codeGen and output the llvm 
ir.
It is added to check clang codeGen output for HLSL.

It will be translated into -S -emit-llvm and -disable-llvm-passes.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D124983

Files:
  clang/include/clang/Driver/Options.td
  clang/lib/Driver/ToolChains/Clang.cpp
  clang/lib/Driver/ToolChains/HLSL.cpp
  clang/unittests/Driver/ToolChainTest.cpp

Index: clang/unittests/Driver/ToolChainTest.cpp
===================================================================
--- clang/unittests/Driver/ToolChainTest.cpp
+++ clang/unittests/Driver/ToolChainTest.cpp
@@ -610,4 +610,45 @@
   DiagConsumer->clear();
 }
 
+TEST(DxcModeTest, ValidatorFCGL) {
+  IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
+
+  IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> InMemoryFileSystem(
+      new llvm::vfs::InMemoryFileSystem);
+
+  InMemoryFileSystem->addFile("foo.hlsl", 0,
+                              llvm::MemoryBuffer::getMemBuffer("\n"));
+
+  auto *DiagConsumer = new SimpleDiagnosticConsumer;
+  IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
+  DiagnosticsEngine Diags(DiagID, &*DiagOpts, DiagConsumer);
+  Driver TheDriver("/bin/clang", "", Diags, "", InMemoryFileSystem);
+  std::unique_ptr<Compilation> C(TheDriver.BuildCompilation(
+      {"clang", "--driver-mode=dxc", "-fcgl", "foo.hlsl"}));
+  EXPECT_TRUE(C);
+  EXPECT_TRUE(!C->containsError());
+  auto &Jobs = C->getJobs();
+  EXPECT_EQ(Jobs.size(), 1);
+  if (Jobs.size() == 1) {
+    auto &Job = *Jobs.begin();
+    auto &Args = Job.getArguments();
+    // Make sure fcgl translated into -S -emit-llvm and -disable-llvm-passes.
+    bool HasS = false;
+    bool HasEmitLLVM = false;
+    bool HasDisableLLVMPasses = false;
+    for (auto *Arg : Args) {
+      StringRef Str(Arg);
+      if (Str == "-S")
+        HasS = true;
+      else if (Str == "-emit-llvm")
+        HasEmitLLVM = true;
+      else if (Str == "-disable-llvm-passes")
+        HasDisableLLVMPasses = true;
+    }
+    EXPECT_TRUE(HasS);
+    EXPECT_TRUE(HasEmitLLVM);
+    EXPECT_TRUE(HasDisableLLVMPasses);
+  }
+}
+
 } // end anonymous namespace.
Index: clang/lib/Driver/ToolChains/HLSL.cpp
===================================================================
--- clang/lib/Driver/ToolChains/HLSL.cpp
+++ clang/lib/Driver/ToolChains/HLSL.cpp
@@ -169,6 +169,15 @@
       if (!isLegalValidatorVersion(ValVerStr, getDriver()))
         continue;
     }
+    if (A->getOption().getID() == options::OPT_fcgl) {
+      // Translate fcgl into -S -emit-llvm and -disable-llvm-passes.
+      DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_S));
+      DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_emit_llvm));
+      DAL->AddFlagArg(nullptr,
+                      Opts.getOption(options::OPT_disable_llvm_passes));
+      A->claim();
+      continue;
+    }
     DAL->append(A);
   }
   // Add default validator version if not set.
Index: clang/lib/Driver/ToolChains/Clang.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Clang.cpp
+++ clang/lib/Driver/ToolChains/Clang.cpp
@@ -3470,7 +3470,9 @@
 
 static void RenderHLSLOptions(const ArgList &Args, ArgStringList &CmdArgs,
                               types::ID InputType) {
-  const unsigned ForwardedArguments[] = {options::OPT_dxil_validator_version};
+  const unsigned ForwardedArguments[] = {options::OPT_dxil_validator_version,
+                                         options::OPT_S, options::OPT_emit_llvm,
+                                         options::OPT_disable_llvm_passes};
 
   for (const auto &Arg : ForwardedArguments)
     if (const auto *A = Args.getLastArg(Arg))
Index: clang/include/clang/Driver/Options.td
===================================================================
--- clang/include/clang/Driver/Options.td
+++ clang/include/clang/Driver/Options.td
@@ -6736,6 +6736,8 @@
 
 def dxc_Group : OptionGroup<"<clang-dxc options>">, Flags<[DXCOption]>,
   HelpText<"dxc compatibility options">;
+class DXCFlag<string name> : Option<["/", "-"], name, KIND_FLAG>,
+  Group<dxc_Group>, Flags<[DXCOption, NoXarchOption]>;
 class DXCJoinedOrSeparate<string name> : Option<["/", "-"], name,
   KIND_JOINED_OR_SEPARATE>, Group<dxc_Group>, Flags<[DXCOption, NoXarchOption]>;
 
@@ -6760,3 +6762,5 @@
          "lib_6_3, lib_6_4, lib_6_5, lib_6_6, lib_6_7, lib_6_x,"
          "ms_6_5, ms_6_6, ms_6_7,"
          "as_6_5, as_6_6, as_6_7">;
+def fcgl : DXCFlag<"fcgl">,
+  HelpText<"Generate high-level code only. Without any dxil related passes.">;
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to