diff options
| author | jsmall-nvidia <jsmall@nvidia.com> | 2021-06-18 17:09:35 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-06-18 17:09:35 -0400 |
| commit | 0afa24a3fe7d0e1787cc909f9c7641f477c30e5c (patch) | |
| tree | 08724f28641b221167a03ca2192ee8297328becd /source/slang/slang.cpp | |
| parent | 89051251016be7d3798c0b9586c6db7b4ed5f21d (diff) | |
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.
Diffstat (limited to 'source/slang/slang.cpp')
| -rw-r--r-- | source/slang/slang.cpp | 66 |
1 files changed, 49 insertions, 17 deletions
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<StructTagSystem> _createStructTagSystem() +{ + RefPtr<StructTagSystem> 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<ASTBuilder> 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> astBuilder(new ASTBuilder(m_sharedASTBuilder, "Session::astBuilder")); RefPtr<Linkage> linkage = new Linkage(this, astBuilder, getBuiltinLinkage()); - Int targetCount = desc.targetCount; - const uint8_t* targetDescPtr = reinterpret_cast<const uint8_t*>(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); } |
