From 0afa24a3fe7d0e1787cc909f9c7641f477c30e5c Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Fri, 18 Jun 2021 17:09:35 -0400 Subject: StructTag versioning (#1888) * #include an absolute path didn't work - because paths were taken to always be relative. * WIP Abi struct. * Use AbiSystem on SessionDesc. * Use mask/shift constants. * Fix issue causing warning on linux. * Abi -> Api. * Fix typo. * Refactor to use StructTag. * Mechanism to be able to follow fields. * Field adding is working. * WIP with StructTagConverter. * First pass of StructTag appears to work. Still needs diagnostics. * Small tidy up around Field. * Use bit field to record what fields are recorded to remove allocation around the m_stack. Use ScopeStack for RAII. * Return SlangResult instead of pointers. * Use SlangResult with copy. * Split StructTagConverter implementations. * Fix some bugs around lazy converting. * First pass at unit test for StructTag. * Testing StructTag going backwards in time. * First pass as StructTag diagnostics. * Make Traits a namespace. * Fix some issues with Traits not being a class. * Fix 32 bit warning. --- source/slang/slang.cpp | 66 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 49 insertions(+), 17 deletions(-) (limited to 'source/slang/slang.cpp') diff --git a/source/slang/slang.cpp b/source/slang/slang.cpp index eed172bbf..8d82ca1b7 100644 --- a/source/slang/slang.cpp +++ b/source/slang/slang.cpp @@ -23,6 +23,7 @@ #include "../core/slang-writer.h" #include "../compiler-core/slang-source-loc.h" +#include "../compiler-core/slang-struct-tag-converter.h" #include "slang-ast-dump.h" @@ -114,6 +115,32 @@ const char* getBuildTagString() return SLANG_TAG_VERSION; } +static RefPtr _createStructTagSystem() +{ + RefPtr system = new StructTagSystem; + + { +#define SLANG_STRUCT_TAG_ADD_CATEGORY(x) system->addCategoryInfo(slang::StructTagCategory::x, #x); + SLANG_STRUCT_TAG_CATEGORIES(SLANG_STRUCT_TAG_ADD_CATEGORY) + } + + { +#define SLANG_STRUCT_TAG_ADD_TYPE(X) system->addType(slang::X::kStructTag, "slang::" #X, sizeof(slang::X)); +SLANG_TAGGED_STRUCTS(SLANG_STRUCT_TAG_ADD_TYPE) + + // Add field that references more tagged structs + { + slang::SessionDesc desc; + auto field = StructTagTypeTraits::getFieldWithCount(&desc, &desc.targets, &desc.targetCount); + + auto type = system->getType(slang::SessionDesc::kStructTag); + type->m_fields.add(field); + } + } + + return system; +} + void Session::init() { SLANG_ASSERT(BaseTypeInfo::check()); @@ -131,6 +158,8 @@ void Session::init() m_sharedASTBuilder = new SharedASTBuilder; m_sharedASTBuilder->init(this); + m_structTagSystem = _createStructTagSystem(); + // Use to create a ASTBuilder RefPtr builtinAstBuilder(new ASTBuilder(m_sharedASTBuilder, "m_builtInLinkage::m_astBuilder")); @@ -438,42 +467,45 @@ ISlangUnknown* Session::getInterface(const Guid& guid) } SLANG_NO_THROW SlangResult SLANG_MCALL Session::createSession( - slang::SessionDesc const& desc, + slang::SessionDesc const& inDesc, slang::ISession** outSession) { + MemoryArena arena(1024); + + LazyStructTagConverter converter(getStructTagSystem(), &arena, nullptr); + + const slang::SessionDesc* desc = nullptr; + SLANG_RETURN_ON_FAIL(converter.convertToCurrent(&inDesc, &desc)); + RefPtr astBuilder(new ASTBuilder(m_sharedASTBuilder, "Session::astBuilder")); RefPtr linkage = new Linkage(this, astBuilder, getBuiltinLinkage()); - Int targetCount = desc.targetCount; - const uint8_t* targetDescPtr = reinterpret_cast(desc.targets); - for(Int ii = 0; ii < targetCount; ++ii) { - slang::TargetDesc targetDesc; - // Copy the size field first. - memcpy(&targetDesc.structureSize, targetDescPtr, sizeof(size_t)); - // Copy the entire desc structure. - memcpy(&targetDesc, targetDescPtr, targetDesc.structureSize); - linkage->addTarget(targetDesc); - targetDescPtr += targetDesc.structureSize; + const Index targetCount = Index(desc->targetCount); + for(Index ii = 0; ii < targetCount; ++ii) + { + const auto& targetDesc = desc->targets[ii]; + linkage->addTarget(targetDesc); + } } - if(desc.flags & slang::kSessionFlag_FalcorCustomSharedKeywordSemantics) + if(desc->flags & slang::kSessionFlag_FalcorCustomSharedKeywordSemantics) { linkage->m_useFalcorCustomSharedKeywordSemantics = true; } - linkage->setMatrixLayoutMode(desc.defaultMatrixLayoutMode); + linkage->setMatrixLayoutMode(desc->defaultMatrixLayoutMode); - Int searchPathCount = desc.searchPathCount; + Int searchPathCount = desc->searchPathCount; for(Int ii = 0; ii < searchPathCount; ++ii) { - linkage->addSearchPath(desc.searchPaths[ii]); + linkage->addSearchPath(desc->searchPaths[ii]); } - Int macroCount = desc.preprocessorMacroCount; + Int macroCount = desc->preprocessorMacroCount; for(Int ii = 0; ii < macroCount; ++ii) { - auto& macro = desc.preprocessorMacros[ii]; + auto& macro = desc->preprocessorMacros[ii]; linkage->addPreprocessorDefine(macro.name, macro.value); } -- cgit v1.2.3