diff options
author | Xiang Li <python3kgae@outlook.com> | 2022-04-15 14:09:10 -0500 |
---|---|---|
committer | Chris Bieneman <chris.bieneman@me.com> | 2022-04-15 14:18:18 -0500 |
commit | 721651be246e26efd767c3ec55c8f06c7b5a9a3d (patch) | |
tree | d9780ff6caa3c4de5fd43640fa717a5b73a577ea /clang/unittests/Driver/ToolChainTest.cpp | |
parent | 69c1a354885134303a17bac9e36a913cee92996c (diff) | |
download | llvm-721651be246e26efd767c3ec55c8f06c7b5a9a3d.zip llvm-721651be246e26efd767c3ec55c8f06c7b5a9a3d.tar.gz llvm-721651be246e26efd767c3ec55c8f06c7b5a9a3d.tar.bz2 |
[HLSL][clang][Driver] Support target profile command line option.
The target profile option(/T) decide the shader model when compile hlsl.
The format is shaderKind_major_minor like ps_6_1.
The shader model is saved as llvm::Triple is clang/llvm like
dxil-unknown-shadermodel6.1-hull.
The main job to support the option is translating ps_6_1 into
shadermodel6.1-pixel.
That is done inside tryParseProfile at HLSL.cpp.
To integrate the option into clang Driver, a new DriverMode DxcMode is
created. When DxcMode is enabled, OSType for TargetTriple will be
forced into Triple::ShaderModel. And new ToolChain HLSLToolChain will
be created when OSType is Triple::ShaderModel.
In HLSLToolChain, ComputeEffectiveClangTriple is overridden to call
tryParseProfile when targetProfile option is set.
To make test work, Fo option is added and .hlsl is added for active
-xhlsl.
Reviewed By: beanz
Differential Revision: https://reviews.llvm.org/D122865
Patch by: Xiang Li <python3kgae@outlook.com>
Diffstat (limited to 'clang/unittests/Driver/ToolChainTest.cpp')
-rw-r--r-- | clang/unittests/Driver/ToolChainTest.cpp | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/clang/unittests/Driver/ToolChainTest.cpp b/clang/unittests/Driver/ToolChainTest.cpp index 286ad84..3d9d266 100644 --- a/clang/unittests/Driver/ToolChainTest.cpp +++ b/clang/unittests/Driver/ToolChainTest.cpp @@ -300,6 +300,12 @@ TEST(ToolChainTest, GetTargetAndMode) { 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 @@ TEST(GetDriverMode, PrefersLastDriverMode) { 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(), 0u); + + 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(), 0u); + + 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(), 0u); + + 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(), 0u); + + 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(), 0u); + + 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(), 0u); + + 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(), 0u); + + 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(), 0u); + + 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(), 0u); + + 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(), 0u); + + // 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(), 1u); + 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(), 2u); + 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(), 3u); + 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(), 4u); + EXPECT_STREQ(DiagConsumer->Errors.back().data(), "invalid profile : foo"); + Diags.Clear(); + DiagConsumer->clear(); +} + } // end anonymous namespace. |