aboutsummaryrefslogtreecommitdiff
path: root/clang/unittests/Driver/ToolChainTest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/unittests/Driver/ToolChainTest.cpp')
-rw-r--r--clang/unittests/Driver/ToolChainTest.cpp143
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.