summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2022-04-21 11:03:30 -0700
committerGitHub <noreply@github.com>2022-04-21 11:03:30 -0700
commit1b6cea2219307f6271e131c43d6e8f48910bd435 (patch)
tree988538c9de24409eaf497f55c726f4f5e4709ff5
parent3638e7735be67c8f4dae3f4544134441aa1e029d (diff)
Made translation units visible to transitive `import`s. (#2197)
-rwxr-xr-xsource/slang/slang-compiler.h6
-rw-r--r--source/slang/slang.cpp13
-rw-r--r--tools/slang-unit-test/unit-test-translation-unit-import.cpp26
3 files changed, 35 insertions, 10 deletions
diff --git a/source/slang/slang-compiler.h b/source/slang/slang-compiler.h
index 1a0e61aee..74929d7da 100755
--- a/source/slang/slang-compiler.h
+++ b/source/slang/slang-compiler.h
@@ -1754,7 +1754,8 @@ namespace Slang
const PathInfo& filePathInfo,
ISlangBlob* fileContentsBlob,
SourceLoc const& loc,
- DiagnosticSink* sink);
+ DiagnosticSink* sink,
+ const LoadedModuleDictionary* additionalLoadedModules);
void loadParsedModule(
RefPtr<FrontEndCompileRequest> compileRequest,
@@ -1938,6 +1939,9 @@ namespace Slang
// Translation units we are being asked to compile
List<RefPtr<TranslationUnitRequest> > translationUnits;
+ // Additional modules that needs to be made visible to `import` while checking.
+ const LoadedModuleDictionary* additionalLoadedModules = nullptr;
+
RefPtr<TranslationUnitRequest> getTranslationUnit(UInt index) { return translationUnits[index]; }
// Compile flags to be shared by all translation units
diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp
index 2ddef9e3e..5d4e61cc0 100644
--- a/source/slang/slang.cpp
+++ b/source/slang/slang.cpp
@@ -960,7 +960,8 @@ SLANG_NO_THROW slang::IModule* SLANG_MCALL Linkage::loadModuleFromSource(
PathInfo::makeFromString(moduleName),
source,
SourceLoc(),
- &sink);
+ &sink,
+ nullptr);
sink.getBlobIfNeeded(outDiagnostics);
return asExternal(module);
@@ -2003,6 +2004,8 @@ RefPtr<ComponentType> createSpecializedGlobalAndEntryPointsComponentType(
void FrontEndCompileRequest::checkAllTranslationUnits()
{
LoadedModuleDictionary loadedModules;
+ if (additionalLoadedModules)
+ loadedModules = *additionalLoadedModules;
// Iterate over all translation units and
// apply the semantic checking logic.
@@ -2604,10 +2607,13 @@ RefPtr<Module> Linkage::loadModule(
const PathInfo& filePathInfo,
ISlangBlob* sourceBlob,
SourceLoc const& srcLoc,
- DiagnosticSink* sink)
+ DiagnosticSink* sink,
+ const LoadedModuleDictionary* additionalLoadedModules)
{
RefPtr<FrontEndCompileRequest> frontEndReq = new FrontEndCompileRequest(this, nullptr, sink);
+ frontEndReq->additionalLoadedModules = additionalLoadedModules;
+
RefPtr<TranslationUnitRequest> translationUnit = new TranslationUnitRequest(frontEndReq);
translationUnit->compileRequest = frontEndReq;
translationUnit->moduleName = name;
@@ -2767,7 +2773,8 @@ RefPtr<Module> Linkage::findOrImportModule(
filePathInfo,
fileContents,
loc,
- sink);
+ sink,
+ loadedModules);
}
//
diff --git a/tools/slang-unit-test/unit-test-translation-unit-import.cpp b/tools/slang-unit-test/unit-test-translation-unit-import.cpp
index dfa75eb9f..9e79831e5 100644
--- a/tools/slang-unit-test/unit-test-translation-unit-import.cpp
+++ b/tools/slang-unit-test/unit-test-translation-unit-import.cpp
@@ -7,6 +7,7 @@
#include "tools/unit-test/slang-unit-test.h"
#include "../../slang-com-ptr.h"
+#include "../../source/core/slang-io.h"
using namespace Slang;
@@ -20,27 +21,38 @@ SLANG_UNIT_TEST(translationUnitImport)
" return 5;"
"};";
- // Source for the second translation unit that imports the first translation unit.
+ // Source for the a file that imports the first translation unit.
// The import should succeed and `f` should be visible to this module.
- const char* userSource =
+ const char* fileSource =
R"(
import generatedUnit;
+ int g(){ return f(); }
+ )";
+
+ // Source for a module that transitively uses the generated source via a file.
+ const char* userSource = R"(
+ import moduleG;
[shader("compute")]
[numthreads(4,1,1)]
void computeMain(
uint3 sv_dispatchThreadID : SV_DispatchThreadID,
uniform RWStructuredBuffer<int> buffer)
{
- buffer[sv_dispatchThreadID.x] = f();
- }
- )";
+ buffer[sv_dispatchThreadID.x] = g();
+ })";
+
+
auto session = spCreateSession();
auto request = spCreateCompileRequest(session);
+
+ File::writeAllText("moduleG.slang", fileSource);
+
spAddCodeGenTarget(request, SLANG_HLSL);
int generatedTranslationUnitIndex = spAddTranslationUnit(request, SLANG_SOURCE_LANGUAGE_SLANG, "generatedUnit");
spAddTranslationUnitSourceString(
request, generatedTranslationUnitIndex, "generatedFile", generatedSource);
+
int entryPointTranslationUnitIndex = spAddTranslationUnit(request, SLANG_SOURCE_LANGUAGE_SLANG, "userUnit");
spAddTranslationUnitSourceString(
request, entryPointTranslationUnitIndex, "userFile", userSource);
@@ -52,8 +64,10 @@ SLANG_UNIT_TEST(translationUnitImport)
Slang::ComPtr<ISlangBlob> outBlob;
spGetEntryPointCodeBlob(request, 0, 0, outBlob.writeRef());
SLANG_CHECK(outBlob && outBlob->getBufferSize() != 0);
-
+
spDestroyCompileRequest(request);
spDestroySession(session);
+
+ File::remove("moduleG.slang");
}