summaryrefslogtreecommitdiff
path: root/source/slang/slang-ast-val.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-03-11 14:42:14 -0700
committerGitHub <noreply@github.com>2024-03-11 14:42:14 -0700
commit1bbcf25af514a9ae24f7006747177f2d1b3b7c0d (patch)
treef42c17d32040d033742e741548e7b73ff24a5e92 /source/slang/slang-ast-val.cpp
parent25a7d51445e64253beca5c4f70ddd52f40226b1d (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.cpp32
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