Author: Vitaly Buka Date: 2022-07-16T16:47:50-07:00 New Revision: 0fbafb5a1c4381ded4bc7f59a5a6091c229faed7
URL: https://github.com/llvm/llvm-project/commit/0fbafb5a1c4381ded4bc7f59a5a6091c229faed7 DIFF: https://github.com/llvm/llvm-project/commit/0fbafb5a1c4381ded4bc7f59a5a6091c229faed7.diff LOG: [test] Fix memory leak in validateTargetProfile Unfortunatly fixing leak expose use-after-free if delete more then one Compilation for the same Driver, so I am changing validateTargetProfile to create own Driver each time. The test was added by D122865. Added: Modified: clang/unittests/Driver/ToolChainTest.cpp Removed: ################################################################################ diff --git a/clang/unittests/Driver/ToolChainTest.cpp b/clang/unittests/Driver/ToolChainTest.cpp index 02ab9e743ebe..64bc616523f0 100644 --- a/clang/unittests/Driver/ToolChainTest.cpp +++ b/clang/unittests/Driver/ToolChainTest.cpp @@ -23,6 +23,7 @@ #include "llvm/Support/VirtualFileSystem.h" #include "llvm/Support/raw_ostream.h" #include "gtest/gtest.h" +#include <memory> using namespace clang; using namespace clang::driver; @@ -388,22 +389,27 @@ struct SimpleDiagnosticConsumer : public DiagnosticConsumer { std::vector<SmallString<32>> Errors; }; -static void validateTargetProfile(StringRef TargetProfile, - StringRef ExpectTriple, Driver &TheDriver, - DiagnosticsEngine &Diags) { - EXPECT_TRUE(TheDriver.BuildCompilation( - {"clang", "--driver-mode=dxc", TargetProfile.data(), "foo.hlsl"})); +static void validateTargetProfile( + StringRef TargetProfile, StringRef ExpectTriple, + IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> &InMemoryFileSystem, + DiagnosticsEngine &Diags) { + Driver TheDriver("/bin/clang", "", Diags, "", InMemoryFileSystem); + std::unique_ptr<Compilation> C{TheDriver.BuildCompilation( + {"clang", "--driver-mode=dxc", TargetProfile.data(), "foo.hlsl"})}; + EXPECT_TRUE(C); EXPECT_STREQ(TheDriver.getTargetTriple().c_str(), ExpectTriple.data()); EXPECT_EQ(Diags.getNumErrors(), 0u); } -static void validateTargetProfile(StringRef TargetProfile, - StringRef ExpectError, Driver &TheDriver, - DiagnosticsEngine &Diags, - SimpleDiagnosticConsumer *DiagConsumer, - unsigned NumOfErrors) { - EXPECT_TRUE(TheDriver.BuildCompilation( - {"clang", "--driver-mode=dxc", TargetProfile.data(), "foo.hlsl"})); +static void validateTargetProfile( + StringRef TargetProfile, StringRef ExpectError, + IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> &InMemoryFileSystem, + DiagnosticsEngine &Diags, SimpleDiagnosticConsumer *DiagConsumer, + unsigned NumOfErrors) { + Driver TheDriver("/bin/clang", "", Diags, "", InMemoryFileSystem); + std::unique_ptr<Compilation> C{TheDriver.BuildCompilation( + {"clang", "--driver-mode=dxc", TargetProfile.data(), "foo.hlsl"})}; + EXPECT_TRUE(C); EXPECT_EQ(Diags.getNumErrors(), NumOfErrors); EXPECT_STREQ(DiagConsumer->Errors.back().c_str(), ExpectError.data()); Diags.Clear(); @@ -422,41 +428,40 @@ TEST(DxcModeTest, TargetProfileValidation) { auto *DiagConsumer = new SimpleDiagnosticConsumer; IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions(); DiagnosticsEngine Diags(DiagID, &*DiagOpts, DiagConsumer); - Driver TheDriver("/bin/clang", "", Diags, "", InMemoryFileSystem); - validateTargetProfile("-Tvs_6_0", "dxil--shadermodel6.0-vertex", TheDriver, - Diags); - validateTargetProfile("-Ths_6_1", "dxil--shadermodel6.1-hull", TheDriver, - Diags); - validateTargetProfile("-Tds_6_2", "dxil--shadermodel6.2-domain", TheDriver, - Diags); - validateTargetProfile("-Tds_6_2", "dxil--shadermodel6.2-domain", TheDriver, - Diags); - validateTargetProfile("-Tgs_6_3", "dxil--shadermodel6.3-geometry", TheDriver, - Diags); - validateTargetProfile("-Tps_6_4", "dxil--shadermodel6.4-pixel", TheDriver, - Diags); - validateTargetProfile("-Tcs_6_5", "dxil--shadermodel6.5-compute", TheDriver, - Diags); - validateTargetProfile("-Tms_6_6", "dxil--shadermodel6.6-mesh", TheDriver, - Diags); + validateTargetProfile("-Tvs_6_0", "dxil--shadermodel6.0-vertex", + InMemoryFileSystem, Diags); + validateTargetProfile("-Ths_6_1", "dxil--shadermodel6.1-hull", + InMemoryFileSystem, Diags); + validateTargetProfile("-Tds_6_2", "dxil--shadermodel6.2-domain", + InMemoryFileSystem, Diags); + validateTargetProfile("-Tds_6_2", "dxil--shadermodel6.2-domain", + InMemoryFileSystem, Diags); + validateTargetProfile("-Tgs_6_3", "dxil--shadermodel6.3-geometry", + InMemoryFileSystem, Diags); + validateTargetProfile("-Tps_6_4", "dxil--shadermodel6.4-pixel", + InMemoryFileSystem, Diags); + validateTargetProfile("-Tcs_6_5", "dxil--shadermodel6.5-compute", + InMemoryFileSystem, Diags); + validateTargetProfile("-Tms_6_6", "dxil--shadermodel6.6-mesh", + InMemoryFileSystem, Diags); validateTargetProfile("-Tas_6_7", "dxil--shadermodel6.7-amplification", - TheDriver, Diags); - validateTargetProfile("-Tlib_6_x", "dxil--shadermodel6.15-library", TheDriver, - Diags); + InMemoryFileSystem, Diags); + validateTargetProfile("-Tlib_6_x", "dxil--shadermodel6.15-library", + InMemoryFileSystem, Diags); // Invalid tests. - validateTargetProfile("-Tpss_6_1", "invalid profile : pss_6_1", TheDriver, - Diags, DiagConsumer, 1); - - validateTargetProfile("-Tps_6_x", "invalid profile : ps_6_x", TheDriver, - Diags, DiagConsumer, 2); - validateTargetProfile("-Tlib_6_1", "invalid profile : lib_6_1", TheDriver, - Diags, DiagConsumer, 3); - validateTargetProfile("-Tfoo", "invalid profile : foo", TheDriver, Diags, - DiagConsumer, 4); - validateTargetProfile("", "target profile option (-T) is missing", TheDriver, - Diags, DiagConsumer, 5); + validateTargetProfile("-Tpss_6_1", "invalid profile : pss_6_1", + InMemoryFileSystem, Diags, DiagConsumer, 1); + + validateTargetProfile("-Tps_6_x", "invalid profile : ps_6_x", + InMemoryFileSystem, Diags, DiagConsumer, 2); + validateTargetProfile("-Tlib_6_1", "invalid profile : lib_6_1", + InMemoryFileSystem, Diags, DiagConsumer, 3); + validateTargetProfile("-Tfoo", "invalid profile : foo", InMemoryFileSystem, + Diags, DiagConsumer, 4); + validateTargetProfile("", "target profile option (-T) is missing", + InMemoryFileSystem, Diags, DiagConsumer, 5); } TEST(DxcModeTest, ValidatorVersionValidation) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits