diff options
Diffstat (limited to 'source/slang/slang-ir-serialize.cpp')
| -rw-r--r-- | source/slang/slang-ir-serialize.cpp | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/source/slang/slang-ir-serialize.cpp b/source/slang/slang-ir-serialize.cpp index 5c16f70f3..fcde8dcda 100644 --- a/source/slang/slang-ir-serialize.cpp +++ b/source/slang/slang-ir-serialize.cpp @@ -1357,19 +1357,25 @@ static int _calcFixSourceLoc(const IRSerialData::DebugSourceInfo& info, SourceVi return int(sourceView->getRange().begin.getRaw()) - int(info.m_startSourceLoc); } -/* static */Result IRSerialReader::readStreamModules(Stream* stream, Session* session, SourceManager* sourceManager, List<RefPtr<IRModule>>& outModules) +// TODO: The following function isn't really part of the IR serialization system, but rather +// a layered "container" format, and as such probably belongs in a higher-level system that +// simply calls into the `IRSerialReader` rather than being part of it... +// +/* static */Result IRSerialReader::readStreamModules(Stream* stream, Session* session, SourceManager* sourceManager, List<RefPtr<IRModule>>& outModules, List<FrontEndCompileRequest::ExtraEntryPointInfo>& outEntryPoints) { // Load up the module RiffContainer container; SLANG_RETURN_ON_FAIL(RiffUtil::read(stream, container)); List<RiffContainer::ListChunk*> moduleChunks; + List<RiffContainer::DataChunk*> entryPointChunks; // First try to find a list { RiffContainer::ListChunk* listChunk = container.getRoot()->findListRec(IRSerialBinary::kSlangModuleListFourCc); if (listChunk) { listChunk->findContained(IRSerialBinary::kSlangModuleFourCc, moduleChunks); + listChunk->findContained(IRSerialBinary::kEntryPointFourCc, entryPointChunks); } else { @@ -1399,6 +1405,30 @@ static int _calcFixSourceLoc(const IRSerialData::DebugSourceInfo& info, SourceVi outModules.add(irModule); } + for( auto entryPointChunk : entryPointChunks ) + { + auto reader = entryPointChunk->asReadHelper(); + + auto readString = [&]() + { + uint32_t length = 0; + reader.read(length); + + char* begin = (char*) reader.getData(); + reader.skip(length+1); + + return UnownedStringSlice(begin, begin + length); + }; + + FrontEndCompileRequest::ExtraEntryPointInfo entryPointInfo; + + entryPointInfo.name = session->getNamePool()->getName(readString()); + reader.read(entryPointInfo.profile); + entryPointInfo.mangledName = readString(); + + outEntryPoints.add(entryPointInfo); + } + return SLANG_OK; } |
