aboutsummaryrefslogtreecommitdiff
path: root/clang/unittests
diff options
context:
space:
mode:
authorVitaly Buka <vitalybuka@google.com>2022-07-16 16:37:28 -0700
committerVitaly Buka <vitalybuka@google.com>2022-07-16 16:47:50 -0700
commit0fbafb5a1c4381ded4bc7f59a5a6091c229faed7 (patch)
tree19344ff0322144dffd3153510864fc54f8fc81db /clang/unittests
parent21ef59a55ed0831f8513eb0da150b010ad43e748 (diff)
downloadllvm-0fbafb5a1c4381ded4bc7f59a5a6091c229faed7.zip
llvm-0fbafb5a1c4381ded4bc7f59a5a6091c229faed7.tar.gz
llvm-0fbafb5a1c4381ded4bc7f59a5a6091c229faed7.tar.bz2
[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.
Diffstat (limited to 'clang/unittests')
-rw-r--r--clang/unittests/Driver/ToolChainTest.cpp91
1 files changed, 48 insertions, 43 deletions
diff --git a/clang/unittests/Driver/ToolChainTest.cpp b/clang/unittests/Driver/ToolChainTest.cpp
index 02ab9e7..64bc616 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) {