diff options
| author | Yong He <yonghe@outlook.com> | 2022-04-21 11:03:30 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-04-21 11:03:30 -0700 |
| commit | 1b6cea2219307f6271e131c43d6e8f48910bd435 (patch) | |
| tree | 988538c9de24409eaf497f55c726f4f5e4709ff5 | |
| parent | 3638e7735be67c8f4dae3f4544134441aa1e029d (diff) | |
Made translation units visible to transitive `import`s. (#2197)
| -rwxr-xr-x | source/slang/slang-compiler.h | 6 | ||||
| -rw-r--r-- | source/slang/slang.cpp | 13 | ||||
| -rw-r--r-- | tools/slang-unit-test/unit-test-translation-unit-import.cpp | 26 |
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"); } |
