Add type determiner infrastructure.
This CL adds the Context object, variable ScopeStack and a Function map
into the type determiner.
The sample app is also updated to verify the module produced before
passing to the type determiner.
Bug: tint:5
Change-Id: Ib4af4e4305ee8a306f48e1bd328eaf3ad006fd9a
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/18823
Reviewed-by: David Neto <dneto@google.com>
diff --git a/samples/main.cc b/samples/main.cc
index b4af202..4fc31a4 100644
--- a/samples/main.cc
+++ b/samples/main.cc
@@ -292,22 +292,27 @@
return 1;
}
- auto module = reader->module();
+ auto mod = reader->module();
if (options.dump_ast) {
- std::cout << std::endl << module.to_str() << std::endl;
+ std::cout << std::endl << mod.to_str() << std::endl;
}
if (options.parse_only) {
return 1;
}
- tint::TypeDeterminer td;
- if (!td.Determine(&module)) {
+ if (!mod.IsValid()) {
+ std::cerr << "Invalid module generated..." << std::endl;
+ return 1;
+ }
+
+ tint::TypeDeterminer td(&ctx);
+ if (!td.Determine(&mod)) {
std::cerr << td.error() << std::endl;
return 1;
}
tint::Validator v;
- if (!v.Validate(module)) {
+ if (!v.Validate(mod)) {
std::cerr << v.error() << std::endl;
return 1;
}
@@ -316,14 +321,13 @@
#if TINT_BUILD_SPV_WRITER
if (options.format == Format::kSpirv || options.format == Format::kSpvAsm) {
- writer =
- std::make_unique<tint::writer::spirv::Generator>(std::move(module));
+ writer = std::make_unique<tint::writer::spirv::Generator>(std::move(mod));
}
#endif // TINT_BUILD_SPV_WRITER
#if TINT_BUILD_WGSL_WRITER
if (options.format == Format::kWgsl) {
- writer = std::make_unique<tint::writer::wgsl::Generator>(std::move(module));
+ writer = std::make_unique<tint::writer::wgsl::Generator>(std::move(mod));
}
#endif // TINT_BUILD_WGSL_WRITER
diff --git a/src/type_determiner.cc b/src/type_determiner.cc
index 0faf0af..8abece1 100644
--- a/src/type_determiner.cc
+++ b/src/type_determiner.cc
@@ -16,7 +16,10 @@
namespace tint {
-TypeDeterminer::TypeDeterminer() = default;
+TypeDeterminer::TypeDeterminer(Context* ctx) : ctx_(*ctx) {
+ // TODO(dsinclair): Temporary usage to avoid compiler warning
+ static_cast<void>(ctx_.type_mgr());
+}
TypeDeterminer::~TypeDeterminer() = default;
diff --git a/src/type_determiner.h b/src/type_determiner.h
index 8f2062e..b43f923 100644
--- a/src/type_determiner.h
+++ b/src/type_determiner.h
@@ -16,16 +16,26 @@
#define SRC_TYPE_DETERMINER_H_
#include <string>
+#include <unordered_map>
#include "src/ast/module.h"
+#include "src/context.h"
+#include "src/scope_stack.h"
namespace tint {
+namespace ast {
+
+class Function;
+class Variable;
+
+} // namespace ast
/// Determines types for all items in the given tint module
class TypeDeterminer {
public:
/// Constructor
- TypeDeterminer();
+ /// @param ctx the tint context
+ explicit TypeDeterminer(Context* ctx);
~TypeDeterminer();
/// Runs the type determiner
@@ -37,7 +47,10 @@
const std::string& error() { return error_; }
private:
+ Context& ctx_;
std::string error_;
+ ScopeStack<ast::Variable*> variable_stack_;
+ std::unordered_map<std::string, ast::Function*> name_to_function_;
};
} // namespace tint