diff options
| author | Yong He <yonghe@outlook.com> | 2024-03-11 14:42:14 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-03-11 14:42:14 -0700 |
| commit | 1bbcf25af514a9ae24f7006747177f2d1b3b7c0d (patch) | |
| tree | f42c17d32040d033742e741548e7b73ff24a5e92 /source/slang/slang-ast-val.cpp | |
| parent | 25a7d51445e64253beca5c4f70ddd52f40226b1d (diff) | |
Link-time specialization fixes. (#3734)
* Fix method synthesis logic for static differentiable methods.
* Support link-time constants in thread group size reflection.
Diffstat (limited to 'source/slang/slang-ast-val.cpp')
| -rw-r--r-- | source/slang/slang-ast-val.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/source/slang/slang-ast-val.cpp b/source/slang/slang-ast-val.cpp index b2b874fad..0dbe65ee0 100644 --- a/source/slang/slang-ast-val.cpp +++ b/source/slang/slang-ast-val.cpp @@ -7,6 +7,7 @@ #include "slang-diagnostics.h" #include "slang-syntax.h" #include "slang-ast-val.h" +#include "slang-mangle.h" namespace Slang { @@ -234,6 +235,15 @@ bool GenericParamIntVal::_isLinkTimeValOverride() return getDeclRef().getDecl()->hasModifier<ExternModifier>(); } +Val* GenericParamIntVal::_linkTimeResolveOverride(Dictionary<String, IntVal*>& map) +{ + auto name = getMangledName(getCurrentASTBuilder(), getDeclRef().declRefBase); + IntVal* v; + if (map.tryGetValue(name, v)) + return v; + return this; +} + // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ErrorIntVal !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! void ErrorIntVal::_toTextOverride(StringBuilder& out) @@ -1088,6 +1098,15 @@ Val* TypeCastIntVal::tryFoldImpl(ASTBuilder* astBuilder, Type* resultType, Val* return nullptr; } +Val* TypeCastIntVal::_linkTimeResolveOverride(Dictionary<String, IntVal*>& map) +{ + auto intValBase = as<IntVal>(getBase()); + if (!intValBase) + return this; + auto resolvedBase = intValBase->linkTimeResolve(map); + return tryFoldImpl(getCurrentASTBuilder(), getType(), resolvedBase, nullptr); +} + Val* TypeCastIntVal::_substituteImplOverride(ASTBuilder* astBuilder, SubstitutionSet subst, int* ioDiff) { int diff = 0; @@ -1310,6 +1329,14 @@ Val* FuncCallIntVal::tryFoldImpl(ASTBuilder* astBuilder, Type* resultType, DeclR return nullptr; } +Val* FuncCallIntVal::_linkTimeResolveOverride(Dictionary<String, IntVal*>& map) +{ + List<IntVal*> newArgs; + for (auto arg : getArgs()) + newArgs.add(as<IntVal>(arg->linkTimeResolve(map))); + return tryFoldImpl(getCurrentASTBuilder(), getType(), getFuncDeclRef(), newArgs, nullptr); +} + Val* FuncCallIntVal::_substituteImplOverride(ASTBuilder* astBuilder, SubstitutionSet subst, int* ioDiff) { int diff = 0; @@ -1506,4 +1533,9 @@ bool IntVal::isLinkTimeVal() SLANG_AST_NODE_VIRTUAL_CALL(IntVal, isLinkTimeVal, ()); } +Val* IntVal::linkTimeResolve(Dictionary<String, IntVal*>& mapMangledNameToVal) +{ + SLANG_AST_NODE_VIRTUAL_CALL(IntVal, linkTimeResolve, (mapMangledNameToVal)); +} + } // namespace Slang |
