python3kgae updated this revision to Diff 422365.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D122865/new/
https://reviews.llvm.org/D122865
Files:
clang/include/clang/Basic/DiagnosticDriverKinds.td
clang/include/clang/Driver/Driver.h
clang/include/clang/Driver/Options.h
clang/include/clang/Driver/Options.td
clang/lib/Driver/CMakeLists.txt
clang/lib/Driver/Driver.cpp
clang/lib/Driver/ToolChain.cpp
clang/lib/Driver/ToolChains/HLSL.cpp
clang/lib/Driver/ToolChains/HLSL.h
clang/lib/Driver/Types.cpp
clang/test/lit.cfg.py
clang/unittests/Driver/ToolChainTest.cpp
Index: clang/unittests/Driver/ToolChainTest.cpp
===================================================================
--- clang/unittests/Driver/ToolChainTest.cpp
+++ clang/unittests/Driver/ToolChainTest.cpp
@@ -300,6 +300,12 @@
EXPECT_TRUE(Res.ModeSuffix == "clang-cl");
EXPECT_STREQ(Res.DriverMode, "--driver-mode=cl");
EXPECT_FALSE(Res.TargetIsValid);
+
+ Res = ToolChain::getTargetAndModeFromProgramName("clang-dxc");
+ EXPECT_TRUE(Res.TargetPrefix.empty());
+ EXPECT_TRUE(Res.ModeSuffix == "clang-dxc");
+ EXPECT_STREQ(Res.DriverMode, "--driver-mode=dxc");
+ EXPECT_FALSE(Res.TargetIsValid);
}
TEST(ToolChainTest, CommandOutput) {
@@ -361,4 +367,141 @@
EXPECT_EQ(getDriverMode(Args[0], llvm::makeArrayRef(Args).slice(1)), "bar");
}
+TEST(DxcModeTest, TargetProfileValidation) {
+ IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
+ struct SimpleDiagnosticConsumer : public DiagnosticConsumer {
+ void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel,
+ const Diagnostic &Info) override {
+ if (DiagLevel == DiagnosticsEngine::Level::Error) {
+ Errors.emplace_back();
+ Info.FormatDiagnostic(Errors.back());
+ } else {
+ Msgs.emplace_back();
+ Info.FormatDiagnostic(Msgs.back());
+ }
+ }
+ void clear() override {
+ Msgs.clear();
+ Errors.clear();
+ DiagnosticConsumer::clear();
+ }
+ std::vector<SmallString<32>> Msgs;
+ std::vector<SmallString<32>> Errors;
+ };
+
+ 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", "foo.hlsl"}));
+ EXPECT_TRUE(C);
+ EXPECT_TRUE(!C->containsError());
+
+ auto &TC = C->getDefaultToolChain();
+ bool ContainsError = false;
+ auto Args = TheDriver.ParseArgStrings({"-Tvs_6_0"}, false, ContainsError);
+ EXPECT_FALSE(ContainsError);
+ auto Triple = TC.ComputeEffectiveClangTriple(Args);
+ EXPECT_STREQ(Triple.c_str(), "dxil--shadermodel6.0-vertex");
+ EXPECT_EQ(Diags.getNumErrors(), 0);
+
+ Args = TheDriver.ParseArgStrings({"-Ths_6_1"}, false, ContainsError);
+ EXPECT_FALSE(ContainsError);
+ Triple = TC.ComputeEffectiveClangTriple(Args);
+ EXPECT_STREQ(Triple.c_str(), "dxil--shadermodel6.1-hull");
+ EXPECT_EQ(Diags.getNumErrors(), 0);
+
+ Args = TheDriver.ParseArgStrings({"-Tds_6_2"}, false, ContainsError);
+ EXPECT_FALSE(ContainsError);
+ Triple = TC.ComputeEffectiveClangTriple(Args);
+ EXPECT_STREQ(Triple.c_str(), "dxil--shadermodel6.2-domain");
+ EXPECT_EQ(Diags.getNumErrors(), 0);
+
+ Args = TheDriver.ParseArgStrings({"-Tds_6_2"}, false, ContainsError);
+ EXPECT_FALSE(ContainsError);
+ Triple = TC.ComputeEffectiveClangTriple(Args);
+ EXPECT_STREQ(Triple.c_str(), "dxil--shadermodel6.2-domain");
+ EXPECT_EQ(Diags.getNumErrors(), 0);
+
+ Args = TheDriver.ParseArgStrings({"-Tgs_6_3"}, false, ContainsError);
+ EXPECT_FALSE(ContainsError);
+ Triple = TC.ComputeEffectiveClangTriple(Args);
+ EXPECT_STREQ(Triple.c_str(), "dxil--shadermodel6.3-geometry");
+ EXPECT_EQ(Diags.getNumErrors(), 0);
+
+ Args = TheDriver.ParseArgStrings({"-Tps_6_4"}, false, ContainsError);
+ EXPECT_FALSE(ContainsError);
+ Triple = TC.ComputeEffectiveClangTriple(Args);
+ EXPECT_STREQ(Triple.c_str(), "dxil--shadermodel6.4-pixel");
+ EXPECT_EQ(Diags.getNumErrors(), 0);
+
+ Args = TheDriver.ParseArgStrings({"-Tcs_6_5"}, false, ContainsError);
+ EXPECT_FALSE(ContainsError);
+ Triple = TC.ComputeEffectiveClangTriple(Args);
+ EXPECT_STREQ(Triple.c_str(), "dxil--shadermodel6.5-compute");
+ EXPECT_EQ(Diags.getNumErrors(), 0);
+
+ Args = TheDriver.ParseArgStrings({"-Tms_6_6"}, false, ContainsError);
+ EXPECT_FALSE(ContainsError);
+ Triple = TC.ComputeEffectiveClangTriple(Args);
+ EXPECT_STREQ(Triple.c_str(), "dxil--shadermodel6.6-mesh");
+ EXPECT_EQ(Diags.getNumErrors(), 0);
+
+ Args = TheDriver.ParseArgStrings({"-Tas_6_7"}, false, ContainsError);
+ EXPECT_FALSE(ContainsError);
+ Triple = TC.ComputeEffectiveClangTriple(Args);
+ EXPECT_STREQ(Triple.c_str(), "dxil--shadermodel6.7-amplification");
+ EXPECT_EQ(Diags.getNumErrors(), 0);
+
+ Args = TheDriver.ParseArgStrings({"-Tlib_6_x"}, false, ContainsError);
+ EXPECT_FALSE(ContainsError);
+ Triple = TC.ComputeEffectiveClangTriple(Args);
+ EXPECT_STREQ(Triple.c_str(), "dxil--shadermodel6.15-library");
+ EXPECT_EQ(Diags.getNumErrors(), 0);
+
+ // Invalid tests.
+ Args = TheDriver.ParseArgStrings({"-Tpss_6_1"}, false, ContainsError);
+ EXPECT_FALSE(ContainsError);
+ Triple = TC.ComputeEffectiveClangTriple(Args);
+ EXPECT_STREQ(Triple.c_str(), "unknown-unknown-shadermodel");
+ EXPECT_EQ(Diags.getNumErrors(), 1);
+ EXPECT_STREQ(DiagConsumer->Errors.back().data(), "invalid profile : pss_6_1");
+ Diags.Clear();
+ DiagConsumer->clear();
+
+ Args = TheDriver.ParseArgStrings({"-Tps_6_x"}, false, ContainsError);
+ EXPECT_FALSE(ContainsError);
+ Triple = TC.ComputeEffectiveClangTriple(Args);
+ EXPECT_STREQ(Triple.c_str(), "unknown-unknown-shadermodel");
+ EXPECT_EQ(Diags.getNumErrors(), 2);
+ EXPECT_STREQ(DiagConsumer->Errors.back().data(), "invalid profile : ps_6_x");
+ Diags.Clear();
+ DiagConsumer->clear();
+
+ Args = TheDriver.ParseArgStrings({"-Tlib_6_1"}, false, ContainsError);
+ EXPECT_FALSE(ContainsError);
+ Triple = TC.ComputeEffectiveClangTriple(Args);
+ EXPECT_STREQ(Triple.c_str(), "unknown-unknown-shadermodel");
+ EXPECT_EQ(Diags.getNumErrors(), 3);
+ EXPECT_STREQ(DiagConsumer->Errors.back().data(), "invalid profile : lib_6_1");
+ Diags.Clear();
+ DiagConsumer->clear();
+
+ Args = TheDriver.ParseArgStrings({"-Tfoo"}, false, ContainsError);
+ EXPECT_FALSE(ContainsError);
+ Triple = TC.ComputeEffectiveClangTriple(Args);
+ EXPECT_STREQ(Triple.c_str(), "unknown-unknown-shadermodel");
+ EXPECT_EQ(Diags.getNumErrors(), 4);
+ EXPECT_STREQ(DiagConsumer->Errors.back().data(), "invalid profile : foo");
+ Diags.Clear();
+ DiagConsumer->clear();
+}
+
} // end anonymous namespace.
Index: clang/test/lit.cfg.py
===================================================================
--- clang/test/lit.cfg.py
+++ clang/test/lit.cfg.py
@@ -67,6 +67,8 @@
'clang-tblgen', 'clang-scan-deps', 'opt', 'llvm-ifs', 'yaml2obj',
ToolSubst('%clang_extdef_map', command=FindTool(
'clang-extdef-mapping'), unresolved='ignore'),
+ ToolSubst('%clang_dxc', command=config.clang,
+ extra_args=['--driver-mode=dxc']),
]
if config.clang_examples:
Index: clang/lib/Driver/Types.cpp
===================================================================
--- clang/lib/Driver/Types.cpp
+++ clang/lib/Driver/Types.cpp
@@ -273,66 +273,67 @@
types::ID types::lookupTypeForExtension(llvm::StringRef Ext) {
return llvm::StringSwitch<types::ID>(Ext)
- .Case("c", TY_C)
- .Case("C", TY_CXX)
- .Case("F", TY_Fortran)
- .Case("f", TY_PP_Fortran)
- .Case("h", TY_CHeader)
- .Case("H", TY_CXXHeader)
- .Case("i", TY_PP_C)
- .Case("m", TY_ObjC)
- .Case("M", TY_ObjCXX)
- .Case("o", TY_Object)
- .Case("S", TY_Asm)
- .Case("s", TY_PP_Asm)
- .Case("bc", TY_LLVM_BC)
- .Case("cc", TY_CXX)
- .Case("CC", TY_CXX)
- .Case("cl", TY_CL)
- .Case("clcpp", TY_CLCXX)
- .Case("cp", TY_CXX)
- .Case("cu", TY_CUDA)
- .Case("hh", TY_CXXHeader)
- .Case("ii", TY_PP_CXX)
- .Case("ll", TY_LLVM_IR)
- .Case("mi", TY_PP_ObjC)
- .Case("mm", TY_ObjCXX)
- .Case("rs", TY_RenderScript)
- .Case("adb", TY_Ada)
- .Case("ads", TY_Ada)
- .Case("asm", TY_PP_Asm)
- .Case("ast", TY_AST)
- .Case("ccm", TY_CXXModule)
- .Case("cpp", TY_CXX)
- .Case("CPP", TY_CXX)
- .Case("c++", TY_CXX)
- .Case("C++", TY_CXX)
- .Case("cui", TY_PP_CUDA)
- .Case("cxx", TY_CXX)
- .Case("CXX", TY_CXX)
- .Case("F90", TY_Fortran)
- .Case("f90", TY_PP_Fortran)
- .Case("F95", TY_Fortran)
- .Case("f95", TY_PP_Fortran)
- .Case("for", TY_PP_Fortran)
- .Case("FOR", TY_PP_Fortran)
- .Case("fpp", TY_Fortran)
- .Case("FPP", TY_Fortran)
- .Case("gch", TY_PCH)
- .Case("hip", TY_HIP)
- .Case("hpp", TY_CXXHeader)
- .Case("hxx", TY_CXXHeader)
- .Case("iim", TY_PP_CXXModule)
- .Case("lib", TY_Object)
- .Case("mii", TY_PP_ObjCXX)
- .Case("obj", TY_Object)
- .Case("ifs", TY_IFS)
- .Case("pch", TY_PCH)
- .Case("pcm", TY_ModuleFile)
- .Case("c++m", TY_CXXModule)
- .Case("cppm", TY_CXXModule)
- .Case("cxxm", TY_CXXModule)
- .Default(TY_INVALID);
+ .Case("c", TY_C)
+ .Case("C", TY_CXX)
+ .Case("F", TY_Fortran)
+ .Case("f", TY_PP_Fortran)
+ .Case("h", TY_CHeader)
+ .Case("H", TY_CXXHeader)
+ .Case("i", TY_PP_C)
+ .Case("m", TY_ObjC)
+ .Case("M", TY_ObjCXX)
+ .Case("o", TY_Object)
+ .Case("S", TY_Asm)
+ .Case("s", TY_PP_Asm)
+ .Case("bc", TY_LLVM_BC)
+ .Case("cc", TY_CXX)
+ .Case("CC", TY_CXX)
+ .Case("cl", TY_CL)
+ .Case("clcpp", TY_CLCXX)
+ .Case("cp", TY_CXX)
+ .Case("cu", TY_CUDA)
+ .Case("hh", TY_CXXHeader)
+ .Case("ii", TY_PP_CXX)
+ .Case("ll", TY_LLVM_IR)
+ .Case("mi", TY_PP_ObjC)
+ .Case("mm", TY_ObjCXX)
+ .Case("rs", TY_RenderScript)
+ .Case("adb", TY_Ada)
+ .Case("ads", TY_Ada)
+ .Case("asm", TY_PP_Asm)
+ .Case("ast", TY_AST)
+ .Case("ccm", TY_CXXModule)
+ .Case("cpp", TY_CXX)
+ .Case("CPP", TY_CXX)
+ .Case("c++", TY_CXX)
+ .Case("C++", TY_CXX)
+ .Case("cui", TY_PP_CUDA)
+ .Case("cxx", TY_CXX)
+ .Case("CXX", TY_CXX)
+ .Case("F90", TY_Fortran)
+ .Case("f90", TY_PP_Fortran)
+ .Case("F95", TY_Fortran)
+ .Case("f95", TY_PP_Fortran)
+ .Case("for", TY_PP_Fortran)
+ .Case("FOR", TY_PP_Fortran)
+ .Case("fpp", TY_Fortran)
+ .Case("FPP", TY_Fortran)
+ .Case("gch", TY_PCH)
+ .Case("hip", TY_HIP)
+ .Case("hpp", TY_CXXHeader)
+ .Case("hxx", TY_CXXHeader)
+ .Case("iim", TY_PP_CXXModule)
+ .Case("lib", TY_Object)
+ .Case("mii", TY_PP_ObjCXX)
+ .Case("obj", TY_Object)
+ .Case("ifs", TY_IFS)
+ .Case("pch", TY_PCH)
+ .Case("pcm", TY_ModuleFile)
+ .Case("c++m", TY_CXXModule)
+ .Case("cppm", TY_CXXModule)
+ .Case("cxxm", TY_CXXModule)
+ .Case("hlsl", TY_HLSL)
+ .Default(TY_INVALID);
}
types::ID types::lookupTypeForTypeSpecifier(const char *Name) {
Index: clang/lib/Driver/ToolChains/HLSL.h
===================================================================
--- /dev/null
+++ clang/lib/Driver/ToolChains/HLSL.h
@@ -0,0 +1,37 @@
+//===--- HLSL.h - HLSL ToolChain Implementations ----------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_HLSL_H
+#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_HLSL_H
+
+#include "clang/Driver/ToolChain.h"
+
+namespace clang {
+namespace driver {
+
+namespace toolchains {
+
+class LLVM_LIBRARY_VISIBILITY HLSLToolChain : public ToolChain {
+public:
+ HLSLToolChain(const Driver &D, const llvm::Triple &Triple,
+ const llvm::opt::ArgList &Args);
+ bool isPICDefault() const override { return false; }
+ bool isPIEDefault(const llvm::opt::ArgList &Args) const override {
+ return false;
+ }
+ bool isPICDefaultForced() const override { return false; }
+
+ std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args,
+ types::ID InputType) const override;
+};
+
+} // end namespace toolchains
+} // end namespace driver
+} // end namespace clang
+
+#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_HLSL_H
\ No newline at end of file
Index: clang/lib/Driver/ToolChains/HLSL.cpp
===================================================================
--- /dev/null
+++ clang/lib/Driver/ToolChains/HLSL.cpp
@@ -0,0 +1,147 @@
+//===--- HLSL.cpp - HLSL ToolChain Implementations --------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "HLSL.h"
+#include "CommonArgs.h"
+#include "clang/Driver/DriverDiagnostic.h"
+#include "llvm/ADT/StringSwitch.h"
+#include "llvm/ADT/Triple.h"
+
+using namespace clang::driver;
+using namespace clang::driver::tools;
+using namespace clang::driver::toolchains;
+using namespace clang;
+using namespace llvm::opt;
+using namespace llvm;
+
+namespace {
+
+const unsigned OfflineLibMinor = 0xF;
+const unsigned MaxShaderModel6Minor = 7;
+
+bool isLegalVersion(VersionTuple Version, unsigned Major, unsigned MinMinor,
+ unsigned MaxMinor) {
+ VersionTuple Min(Major, MinMinor);
+ VersionTuple Max(Major, MaxMinor);
+ return Min <= Version && Version <= Max;
+}
+
+bool isLegalShaderModel(Triple &T) {
+ if (T.getOS() != Triple::OSType::ShaderModel)
+ return false;
+
+ auto Version = T.getOSVersion();
+ if (Version.getBuild())
+ return false;
+ if (Version.getSubminor())
+ return false;
+ if (!Version.getMinor())
+ return false;
+
+ auto Kind = T.getEnvironment();
+
+ switch (Kind) {
+ default:
+ return false;
+ case Triple::EnvironmentType::Vertex:
+ case Triple::EnvironmentType::Hull:
+ case Triple::EnvironmentType::Domain:
+ case Triple::EnvironmentType::Geometry:
+ case Triple::EnvironmentType::Pixel:
+ case Triple::EnvironmentType::Compute: {
+ if (isLegalVersion(Version, 4, 0, 1))
+ return true;
+ if (isLegalVersion(Version, 5, 0, 1))
+ return true;
+
+ if (isLegalVersion(Version, 6, 0, MaxShaderModel6Minor))
+ return true;
+ } break;
+ case Triple::EnvironmentType::Library: {
+ VersionTuple SM6x(6, OfflineLibMinor);
+ if (Version == SM6x)
+ return true;
+ if (isLegalVersion(Version, 6, 3, MaxShaderModel6Minor))
+ return true;
+ } break;
+ case Triple::EnvironmentType::Amplification:
+ case Triple::EnvironmentType::Mesh: {
+ if (isLegalVersion(Version, 6, 5, MaxShaderModel6Minor))
+ return true;
+ } break;
+ }
+ return false;
+}
+
+std::string tryParseProfile(StringRef Profile) {
+ // [ps|vs|gs|hs|ds|cs|ms|as]_[major]_[minor]
+ SmallVector<StringRef, 3> Parts;
+ Profile.split(Parts, "_");
+ if (Parts.size() != 3)
+ return "";
+
+ Triple::EnvironmentType Kind =
+ StringSwitch<Triple::EnvironmentType>(Parts[0])
+ .Case("ps", Triple::EnvironmentType::Pixel)
+ .Case("vs", Triple::EnvironmentType::Vertex)
+ .Case("gs", Triple::EnvironmentType::Geometry)
+ .Case("hs", Triple::EnvironmentType::Hull)
+ .Case("ds", Triple::EnvironmentType::Domain)
+ .Case("cs", Triple::EnvironmentType::Compute)
+ .Case("lib", Triple::EnvironmentType::Library)
+ .Case("ms", Triple::EnvironmentType::Mesh)
+ .Case("as", Triple::EnvironmentType::Amplification)
+ .Default(Triple::EnvironmentType::UnknownEnvironment);
+ if (Kind == Triple::EnvironmentType::UnknownEnvironment)
+ return "";
+
+ unsigned long long Major = 0;
+ if (llvm::getAsUnsignedInteger(Parts[1], 0, Major))
+ return "";
+
+ unsigned long long Minor = 0;
+ if (Parts[2] == "x")
+ Minor = OfflineLibMinor;
+ else if (llvm::getAsUnsignedInteger(Parts[2], 0, Minor))
+ return "";
+
+ // dxil-unknown-shadermodel-hull
+ llvm::Triple T;
+ T.setArch(Triple::ArchType::dxil);
+ T.setOSName(Triple::getOSTypeName(Triple::OSType::ShaderModel).str() +
+ VersionTuple(Major, Minor).getAsString());
+ T.setEnvironment(Kind);
+ if (isLegalShaderModel(T))
+ return T.getTriple();
+ else
+ return "";
+}
+
+} // namespace
+
+/// DirectX Toolchain
+HLSLToolChain::HLSLToolChain(const Driver &D, const llvm::Triple &Triple,
+ const ArgList &Args)
+ : ToolChain(D, Triple, Args) {}
+
+std::string
+HLSLToolChain::ComputeEffectiveClangTriple(const ArgList &Args,
+ types::ID InputType) const {
+ if (Arg *A = Args.getLastArg(options::OPT_target_profile)) {
+ StringRef Profile = A->getValue();
+ std::string Triple = tryParseProfile(Profile);
+ if (Triple == "") {
+ getDriver().Diag(diag::err_drv_invalid_directx_shader_module) << Profile;
+ Triple = ToolChain::ComputeEffectiveClangTriple(Args, InputType);
+ }
+ A->claim();
+ return Triple;
+ } else {
+ return ToolChain::ComputeEffectiveClangTriple(Args, InputType);
+ }
+}
Index: clang/lib/Driver/ToolChain.cpp
===================================================================
--- clang/lib/Driver/ToolChain.cpp
+++ clang/lib/Driver/ToolChain.cpp
@@ -153,6 +153,7 @@
{"cl", "--driver-mode=cl"},
{"++", "--driver-mode=g++"},
{"flang", "--driver-mode=flang"},
+ {"clang-dxc", "--driver-mode=dxc"},
};
for (size_t i = 0; i < llvm::array_lengthof(DriverSuffixes); ++i) {
Index: clang/lib/Driver/Driver.cpp
===================================================================
--- clang/lib/Driver/Driver.cpp
+++ clang/lib/Driver/Driver.cpp
@@ -25,6 +25,7 @@
#include "ToolChains/Gnu.h"
#include "ToolChains/HIPAMD.h"
#include "ToolChains/HIPSPV.h"
+#include "ToolChains/HLSL.h"
#include "ToolChains/Haiku.h"
#include "ToolChains/Hexagon.h"
#include "ToolChains/Hurd.h"
@@ -231,6 +232,7 @@
.Case("cpp", CPPMode)
.Case("cl", CLMode)
.Case("flang", FlangMode)
+ .Case("dxc", DXCMode)
.Default(None))
Mode = *M;
else
@@ -1190,6 +1192,15 @@
T.setObjectFormat(llvm::Triple::COFF);
TargetTriple = T.str();
}
+
+ if (IsDXCMode()) {
+ // clang-dxc target is build from target_profile option.
+ // Just set OS to shader model to select HLSLToolChain.
+ llvm::Triple T(TargetTriple);
+ T.setOS(llvm::Triple::ShaderModel);
+ TargetTriple = T.str();
+ }
+
if (const Arg *A = Args.getLastArg(options::OPT_target))
TargetTriple = A->getValue();
if (const Arg *A = Args.getLastArg(options::OPT_ccc_install_dir))
@@ -5685,6 +5696,9 @@
case llvm::Triple::ZOS:
TC = std::make_unique<toolchains::ZOS>(*this, Target, Args);
break;
+ case llvm::Triple::ShaderModel:
+ TC = std::make_unique<toolchains::HLSLToolChain>(*this, Target, Args);
+ break;
default:
// Of these targets, Hexagon is the only one that might have
// an OS of Linux, in which case it got handled above already.
@@ -5900,7 +5914,13 @@
} else {
ExcludedFlagsBitmask |= options::CLOption;
}
-
+ if (IsDXCMode()) {
+ // Include DXC and Core options.
+ IncludedFlagsBitmask |= options::DXCOption;
+ IncludedFlagsBitmask |= options::CoreOption;
+ } else {
+ ExcludedFlagsBitmask |= options::DXCOption;
+ }
return std::make_pair(IncludedFlagsBitmask, ExcludedFlagsBitmask);
}
Index: clang/lib/Driver/CMakeLists.txt
===================================================================
--- clang/lib/Driver/CMakeLists.txt
+++ clang/lib/Driver/CMakeLists.txt
@@ -58,6 +58,7 @@
ToolChains/HIPAMD.cpp
ToolChains/HIPSPV.cpp
ToolChains/Hexagon.cpp
+ ToolChains/HLSL.cpp
ToolChains/Hurd.cpp
ToolChains/Linux.cpp
ToolChains/MipsLinux.cpp
Index: clang/include/clang/Driver/Options.td
===================================================================
--- clang/include/clang/Driver/Options.td
+++ clang/include/clang/Driver/Options.td
@@ -49,6 +49,10 @@
// CC1AsOption - This option should be accepted by clang -cc1as.
def CC1AsOption : OptionFlag;
+// DXCOption - This is a dxc.exe compatibility option. Options with this flag
+// are made available when the driver is running in DXC compatibility mode.
+def DXCOption : OptionFlag;
+
// NoDriverOption - This option should not be accepted by the driver.
def NoDriverOption : OptionFlag;
@@ -6631,3 +6635,33 @@
def _SLASH_Zg : CLFlag<"Zg">;
def _SLASH_ZI : CLFlag<"ZI">;
def _SLASH_ZW : CLJoined<"ZW">;
+
+//===----------------------------------------------------------------------===//
+// clang-dxc Options
+//===----------------------------------------------------------------------===//
+
+def dxc_Group : OptionGroup<"<clang-dxc options>">, Flags<[DXCOption]>,
+ HelpText<"dxc compatibility options">;
+
+class DXCJoinedOrSeparate<string name> : Option<["/", "-"], name,
+ KIND_JOINED_OR_SEPARATE>, Group<dxc_Group>, Flags<[DXCOption, NoXarchOption]>;
+
+def dxc_help : Option<["/", "-", "--"], "help", KIND_JOINED>,
+ Group<dxc_Group>, Flags<[DXCOption, NoXarchOption]>, Alias<help>,
+ HelpText<"Display available options">;
+
+
+def Fo : DXCJoinedOrSeparate<"Fo">, Alias<o>,
+ HelpText<"Output object file.">;
+
+def target_profile : DXCJoinedOrSeparate<"T">, MetaVarName<"<profile>">,
+ HelpText<"Set target profile.">,
+ Values<"ps_6_0, ps_6_1, ps_6_2, ps_6_3, ps_6_4, ps_6_5, ps_6_6, ps_6_7,"
+ "vs_6_0, vs_6_1, vs_6_2, vs_6_3, vs_6_4, vs_6_5, vs_6_6, vs_6_7,"
+ "gs_6_0, gs_6_1, gs_6_2, gs_6_3, gs_6_4, gs_6_5, gs_6_6, gs_6_7,"
+ "hs_6_0, hs_6_1, hs_6_2, hs_6_3, hs_6_4, hs_6_5, hs_6_6, hs_6_7,"
+ "ds_6_0, ds_6_1, ds_6_2, ds_6_3, ds_6_4, ds_6_5, ds_6_6, ds_6_7,"
+ "cs_6_0, cs_6_1, cs_6_2, cs_6_3, cs_6_4, cs_6_5, cs_6_6, cs_6_7,"
+ "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">;
Index: clang/include/clang/Driver/Options.h
===================================================================
--- clang/include/clang/Driver/Options.h
+++ clang/include/clang/Driver/Options.h
@@ -35,7 +35,8 @@
FlangOption = (1 << 14),
FC1Option = (1 << 15),
FlangOnlyOption = (1 << 16),
- Ignored = (1 << 17),
+ DXCOption = (1 << 17),
+ Ignored = (1 << 18),
};
enum ID {
Index: clang/include/clang/Driver/Driver.h
===================================================================
--- clang/include/clang/Driver/Driver.h
+++ clang/include/clang/Driver/Driver.h
@@ -68,7 +68,8 @@
GXXMode,
CPPMode,
CLMode,
- FlangMode
+ FlangMode,
+ DXCMode
} Mode;
enum SaveTempsMode {
@@ -198,6 +199,9 @@
/// Other modes fall back to calling gcc which in turn calls gfortran.
bool IsFlangMode() const { return Mode == FlangMode; }
+ /// Whether the driver should follow dxc.exe like behavior.
+ bool IsDXCMode() const { return Mode == DXCMode; }
+
/// Only print tool bindings, don't build any jobs.
unsigned CCCPrintBindings : 1;
Index: clang/include/clang/Basic/DiagnosticDriverKinds.td
===================================================================
--- clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -659,4 +659,7 @@
def err_drv_target_variant_invalid : Error<
"unsupported '%0' value '%1'; use 'ios-macabi' instead">;
+def err_drv_invalid_directx_shader_module : Error<
+ "invalid profile : %0">;
+
}
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits