Skip to content

Commit 0fbafb5

Browse files
committed
[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.
1 parent 21ef59a commit 0fbafb5

File tree

1 file changed

+48
-43
lines changed

1 file changed

+48
-43
lines changed

clang/unittests/Driver/ToolChainTest.cpp

Lines changed: 48 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "llvm/Support/VirtualFileSystem.h"
2424
#include "llvm/Support/raw_ostream.h"
2525
#include "gtest/gtest.h"
26+
#include <memory>
2627
using namespace clang;
2728
using namespace clang::driver;
2829

@@ -388,22 +389,27 @@ struct SimpleDiagnosticConsumer : public DiagnosticConsumer {
388389
std::vector<SmallString<32>> Errors;
389390
};
390391

391-
static void validateTargetProfile(StringRef TargetProfile,
392-
StringRef ExpectTriple, Driver &TheDriver,
393-
DiagnosticsEngine &Diags) {
394-
EXPECT_TRUE(TheDriver.BuildCompilation(
395-
{"clang", "--driver-mode=dxc", TargetProfile.data(), "foo.hlsl"}));
392+
static void validateTargetProfile(
393+
StringRef TargetProfile, StringRef ExpectTriple,
394+
IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> &InMemoryFileSystem,
395+
DiagnosticsEngine &Diags) {
396+
Driver TheDriver("/bin/clang", "", Diags, "", InMemoryFileSystem);
397+
std::unique_ptr<Compilation> C{TheDriver.BuildCompilation(
398+
{"clang", "--driver-mode=dxc", TargetProfile.data(), "foo.hlsl"})};
399+
EXPECT_TRUE(C);
396400
EXPECT_STREQ(TheDriver.getTargetTriple().c_str(), ExpectTriple.data());
397401
EXPECT_EQ(Diags.getNumErrors(), 0u);
398402
}
399403

400-
static void validateTargetProfile(StringRef TargetProfile,
401-
StringRef ExpectError, Driver &TheDriver,
402-
DiagnosticsEngine &Diags,
403-
SimpleDiagnosticConsumer *DiagConsumer,
404-
unsigned NumOfErrors) {
405-
EXPECT_TRUE(TheDriver.BuildCompilation(
406-
{"clang", "--driver-mode=dxc", TargetProfile.data(), "foo.hlsl"}));
404+
static void validateTargetProfile(
405+
StringRef TargetProfile, StringRef ExpectError,
406+
IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> &InMemoryFileSystem,
407+
DiagnosticsEngine &Diags, SimpleDiagnosticConsumer *DiagConsumer,
408+
unsigned NumOfErrors) {
409+
Driver TheDriver("/bin/clang", "", Diags, "", InMemoryFileSystem);
410+
std::unique_ptr<Compilation> C{TheDriver.BuildCompilation(
411+
{"clang", "--driver-mode=dxc", TargetProfile.data(), "foo.hlsl"})};
412+
EXPECT_TRUE(C);
407413
EXPECT_EQ(Diags.getNumErrors(), NumOfErrors);
408414
EXPECT_STREQ(DiagConsumer->Errors.back().c_str(), ExpectError.data());
409415
Diags.Clear();
@@ -422,41 +428,40 @@ TEST(DxcModeTest, TargetProfileValidation) {
422428
auto *DiagConsumer = new SimpleDiagnosticConsumer;
423429
IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
424430
DiagnosticsEngine Diags(DiagID, &*DiagOpts, DiagConsumer);
425-
Driver TheDriver("/bin/clang", "", Diags, "", InMemoryFileSystem);
426431

427-
validateTargetProfile("-Tvs_6_0", "dxil--shadermodel6.0-vertex", TheDriver,
428-
Diags);
429-
validateTargetProfile("-Ths_6_1", "dxil--shadermodel6.1-hull", TheDriver,
430-
Diags);
431-
validateTargetProfile("-Tds_6_2", "dxil--shadermodel6.2-domain", TheDriver,
432-
Diags);
433-
validateTargetProfile("-Tds_6_2", "dxil--shadermodel6.2-domain", TheDriver,
434-
Diags);
435-
validateTargetProfile("-Tgs_6_3", "dxil--shadermodel6.3-geometry", TheDriver,
436-
Diags);
437-
validateTargetProfile("-Tps_6_4", "dxil--shadermodel6.4-pixel", TheDriver,
438-
Diags);
439-
validateTargetProfile("-Tcs_6_5", "dxil--shadermodel6.5-compute", TheDriver,
440-
Diags);
441-
validateTargetProfile("-Tms_6_6", "dxil--shadermodel6.6-mesh", TheDriver,
442-
Diags);
432+
validateTargetProfile("-Tvs_6_0", "dxil--shadermodel6.0-vertex",
433+
InMemoryFileSystem, Diags);
434+
validateTargetProfile("-Ths_6_1", "dxil--shadermodel6.1-hull",
435+
InMemoryFileSystem, Diags);
436+
validateTargetProfile("-Tds_6_2", "dxil--shadermodel6.2-domain",
437+
InMemoryFileSystem, Diags);
438+
validateTargetProfile("-Tds_6_2", "dxil--shadermodel6.2-domain",
439+
InMemoryFileSystem, Diags);
440+
validateTargetProfile("-Tgs_6_3", "dxil--shadermodel6.3-geometry",
441+
InMemoryFileSystem, Diags);
442+
validateTargetProfile("-Tps_6_4", "dxil--shadermodel6.4-pixel",
443+
InMemoryFileSystem, Diags);
444+
validateTargetProfile("-Tcs_6_5", "dxil--shadermodel6.5-compute",
445+
InMemoryFileSystem, Diags);
446+
validateTargetProfile("-Tms_6_6", "dxil--shadermodel6.6-mesh",
447+
InMemoryFileSystem, Diags);
443448
validateTargetProfile("-Tas_6_7", "dxil--shadermodel6.7-amplification",
444-
TheDriver, Diags);
445-
validateTargetProfile("-Tlib_6_x", "dxil--shadermodel6.15-library", TheDriver,
446-
Diags);
449+
InMemoryFileSystem, Diags);
450+
validateTargetProfile("-Tlib_6_x", "dxil--shadermodel6.15-library",
451+
InMemoryFileSystem, Diags);
447452

448453
// Invalid tests.
449-
validateTargetProfile("-Tpss_6_1", "invalid profile : pss_6_1", TheDriver,
450-
Diags, DiagConsumer, 1);
451-
452-
validateTargetProfile("-Tps_6_x", "invalid profile : ps_6_x", TheDriver,
453-
Diags, DiagConsumer, 2);
454-
validateTargetProfile("-Tlib_6_1", "invalid profile : lib_6_1", TheDriver,
455-
Diags, DiagConsumer, 3);
456-
validateTargetProfile("-Tfoo", "invalid profile : foo", TheDriver, Diags,
457-
DiagConsumer, 4);
458-
validateTargetProfile("", "target profile option (-T) is missing", TheDriver,
459-
Diags, DiagConsumer, 5);
454+
validateTargetProfile("-Tpss_6_1", "invalid profile : pss_6_1",
455+
InMemoryFileSystem, Diags, DiagConsumer, 1);
456+
457+
validateTargetProfile("-Tps_6_x", "invalid profile : ps_6_x",
458+
InMemoryFileSystem, Diags, DiagConsumer, 2);
459+
validateTargetProfile("-Tlib_6_1", "invalid profile : lib_6_1",
460+
InMemoryFileSystem, Diags, DiagConsumer, 3);
461+
validateTargetProfile("-Tfoo", "invalid profile : foo", InMemoryFileSystem,
462+
Diags, DiagConsumer, 4);
463+
validateTargetProfile("", "target profile option (-T) is missing",
464+
InMemoryFileSystem, Diags, DiagConsumer, 5);
460465
}
461466

462467
TEST(DxcModeTest, ValidatorVersionValidation) {

0 commit comments

Comments
 (0)