From 7f6e95917bb1929115b4cffa2ed9035aa8710ee4 Mon Sep 17 00:00:00 2001 From: Yong He Date: Mon, 18 Mar 2024 15:16:15 -0700 Subject: Fix name mangling and source file finding logic for precompiled module validation. (#3784) * Fix name mangling. * Fix source validation. * Caching and search path fixes. --- source/slang/slang.cpp | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) (limited to 'source/slang/slang.cpp') diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp index 978dff7c4..241ec7f43 100644 --- a/source/slang/slang.cpp +++ b/source/slang/slang.cpp @@ -486,6 +486,7 @@ SlangResult Session::_readBuiltinModule(ISlangFileSystem* fileSystem, Scope* sco { RefPtr module(new Module(linkage, srcModule.astBuilder)); module->setName(moduleName); + module->setDigest(srcModule.digest); ModuleDecl* moduleDecl = as(srcModule.astRootNode); // Set the module back reference on the decl @@ -3699,7 +3700,7 @@ bool Linkage::isBinaryModuleUpToDate(String fromPath, RiffContainer* container) // If we cannot find the source file from `fromPath`, // try again from the module's source file path. if (moduleHeader.dependentFiles.getCount() != 0) - sourceFile = loadSourceFile(moduleHeader.dependentFiles.getFirst(), file); + sourceFile = loadSourceFile(Path::getParentDirectory(moduleHeader.dependentFiles.getFirst()), file); } if (!sourceFile) return false; @@ -3922,7 +3923,27 @@ ISlangUnknown* Module::getInterface(const Guid& guid) void Module::buildHash(DigestBuilder& builder) { - SLANG_UNUSED(builder); + builder.append(computeDigest()); +} + +SHA1::Digest Module::computeDigest() +{ + if (m_digest == SHA1::Digest()) + { + DigestBuilder digestBuilder; + auto version = String(getBuildTagString()); + digestBuilder.append(version); + getOptionSet().buildHash(digestBuilder); + + auto fileDependencies = getFileDependencies(); + + for (auto file : fileDependencies) + { + digestBuilder.append(file->getDigest()); + } + m_digest = digestBuilder.finalize(); + } + return m_digest; } void Module::addModuleDependency(Module* module) @@ -4245,12 +4266,6 @@ SLANG_NO_THROW void SLANG_MCALL ComponentType::getEntryPointHash( // will already be reflected in the resulting hash. getLinkage()->buildHash(builder, targetIndex); - // Enumerate all file dependencies and add them to the hash. - for (SourceFile* sourceFile : getFileDependencies()) - { - builder.append(sourceFile->getDigest()); - } - buildHash(builder); // Add the name and name override for the specified entry point to the hash. @@ -5239,7 +5254,7 @@ void Linkage::prepareDeserializedModule(SerialContainerData::Module& moduleEntry } } module->setPathInfo(filePathInfo); - + module->setDigest(moduleEntry.digest); module->_collectShaderParams(); module->_discoverEntryPoints(sink); -- cgit v1.2.3