summaryrefslogtreecommitdiff
path: root/source/slang/syntax.h
diff options
context:
space:
mode:
authorTim Foley <tfoley@nvidia.com>2017-08-07 14:54:55 -0700
committerTim Foley <tfoley@nvidia.com>2017-08-07 15:16:54 -0700
commit7b54f43fb1b123f451460edb0add218a0428fe95 (patch)
treee492a82b13334955c1c56f6e3f9d25e8165de82c /source/slang/syntax.h
parentca8eea98c89c632dd7b5a6a8b84d379d1e9e59cf (diff)
Remove uses of global variables
There were two main places where global variables were used in the Slang implementation: 1. The "standard library" code was generated as a string at run-time, and stored in a global variable so that it could be amortized across compiles. 2. The representation of types uses some globals (well, class `static` members) to store common types (e.g., `void`) and to deal with memory lifetime for things like canonicalized types. In each case the "simple" fix is to move the relevant state into the `Session` type that controlled their lifetime already (the `Session` destructor was already cleaning up these globals to avoid leaks). For the standard library stuff this really was easy, but for the types it required threading through the `Session` a bit carefully. One more case that I found: there was a function-`static` variable used to generate a unique ID for files output when dumping of intermediates is enabled (this is almost strictly a debugging option). Rather than make this counter per-session (which would lead to different sessions on different threads clobbering the same few files), I went ahead and used an atomic in this case. Note that the remaining case I had been worried about was any function-`static` counter that might be used in generating unique names. It turns out that right now the parser doesn't use such a counter (even in cases where it probably should), and the lowering pass already uses a counter local to the pass (again, whether or not this is a good idea). This change should be a major step toward allowing an application to use Slang in multiple threads, so long as each thread uses a distinct `SlangSession`. The case of using a single session across multiple threads is harder to support, and will require more careful implementation work.
Diffstat (limited to 'source/slang/syntax.h')
-rw-r--r--source/slang/syntax.h38
1 files changed, 35 insertions, 3 deletions
diff --git a/source/slang/syntax.h b/source/slang/syntax.h
index 3f1c47fb9..56b5624b5 100644
--- a/source/slang/syntax.h
+++ b/source/slang/syntax.h
@@ -11,6 +11,7 @@
namespace Slang
{
+ class Session;
class Substitutions;
class SyntaxVisitor;
class FunctionSyntaxNode;
@@ -1074,16 +1075,19 @@ namespace Slang
//
// TODO(tfoley): These should really belong to the compilation context!
//
- void RegisterBuiltinDecl(
+ void registerBuiltinDecl(
+ Session* session,
RefPtr<Decl> decl,
RefPtr<BuiltinTypeModifier> modifier);
- void RegisterMagicDecl(
+ void registerMagicDecl(
+ Session* session,
RefPtr<Decl> decl,
RefPtr<MagicTypeModifier> modifier);
// Look up a magic declaration by its name
RefPtr<Decl> findMagicDecl(
- String const& name);
+ Session* session,
+ String const& name);
// Create an instance of a syntax class by name
SyntaxNodeBase* createInstanceOfSyntaxClassByName(
@@ -1171,6 +1175,34 @@ namespace Slang
return declRef.getDecl()->inner.Ptr();
}
+
+ //
+
+ RefPtr<ArrayExpressionType> getArrayType(
+ ExpressionType* elementType,
+ IntVal* elementCount);
+
+ RefPtr<ArrayExpressionType> getArrayType(
+ ExpressionType* elementType);
+
+ RefPtr<NamedExpressionType> getNamedType(
+ Session* session,
+ DeclRef<TypeDefDecl> const& declRef);
+
+ RefPtr<TypeType> getTypeType(
+ ExpressionType* type);
+
+ RefPtr<FuncType> getFuncType(
+ Session* session,
+ DeclRef<CallableDecl> const& declRef);
+
+ RefPtr<GenericDeclRefType> getGenericDeclRefType(
+ Session* session,
+ DeclRef<GenericDecl> const& declRef);
+
+ RefPtr<SamplerStateType> getSamplerStateType(
+ Session* session);
+
} // namespace Slang
#endif \ No newline at end of file