[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.
This commit is contained in:
Vitaly Buka 2022-07-16 16:37:28 -07:00
parent 21ef59a55e
commit 0fbafb5a1c

View file

@ -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("-Tpss_6_1", "invalid profile : pss_6_1",
InMemoryFileSystem, 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("-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) {