summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/slang/compiler.h2
-rw-r--r--source/slang/emit.cpp6
-rw-r--r--source/slang/slang.cpp8
3 files changed, 13 insertions, 3 deletions
diff --git a/source/slang/compiler.h b/source/slang/compiler.h
index b1cebc2a1..845de5c81 100644
--- a/source/slang/compiler.h
+++ b/source/slang/compiler.h
@@ -313,6 +313,8 @@ namespace Slang
// Map from the logical name of a module to its definition
Dictionary<Name*, RefPtr<LoadedModule>> mapNameToLoadedModules;
+ // The resulting specialized IR module for each entry point request
+ List<RefPtr<IRModule>> compiledModules;
CompileRequest(Session* session);
diff --git a/source/slang/emit.cpp b/source/slang/emit.cpp
index 46c0b20a9..d2ed1c7c3 100644
--- a/source/slang/emit.cpp
+++ b/source/slang/emit.cpp
@@ -8158,6 +8158,10 @@ String emitEntryPoint(
// TODO: do we want to emit directly from IR, or translate the
// IR back into AST for emission?
visitor.emitIRModule(&context, irModule);
+
+ // retain the specialized ir module, because the current
+ // GlobalGenericParamSubstitution implementation may reference ir objects
+ targetRequest->compileRequest->compiledModules.Add(irModule);
}
destroyIRSpecializationState(irSpecializationState);
@@ -8167,8 +8171,6 @@ String emitEntryPoint(
// Now that we've emitted the code for all the declaratiosn in the file,
// it is time to stich together the final output.
-
-
// There may be global-scope modifiers that we should emit now
visitor.emitGLSLPreprocessorDirectives(translationUnitSyntax);
String prefix = sharedContext.sb.ProduceString();
diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp
index b65ec5615..42e412438 100644
--- a/source/slang/slang.cpp
+++ b/source/slang/slang.cpp
@@ -123,7 +123,13 @@ CompileRequest::CompileRequest(Session* session)
}
CompileRequest::~CompileRequest()
-{}
+{
+ // delete things that may reference IR objects first
+ targets = decltype(targets)();
+ translationUnits = decltype(translationUnits)();
+ entryPoints = decltype(entryPoints)();
+ types = decltype(types)();
+}
RefPtr<Expr> CompileRequest::parseTypeString(TranslationUnitRequest * translationUnit, String typeStr, RefPtr<Scope> scope)