Remove Variable::name().
This CL removes the name getter from the Variable class. All usages are
updated to use the symbol.
Change-Id: I3e4d86d2124d39023cad6113c62230c1757ece71
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/36780
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/ast/function.cc b/src/ast/function.cc
index 1c22b9a..7e076b3 100644
--- a/src/ast/function.cc
+++ b/src/ast/function.cc
@@ -69,7 +69,7 @@
void Function::add_referenced_module_variable(Variable* var) {
for (const auto* v : referenced_module_vars_) {
- if (v->name() == var->name()) {
+ if (v->symbol() == var->symbol()) {
return;
}
}
@@ -78,7 +78,7 @@
void Function::add_local_referenced_module_variable(Variable* var) {
for (const auto* v : local_referenced_module_vars_) {
- if (v->name() == var->name()) {
+ if (v->symbol() == var->symbol()) {
return;
}
}
diff --git a/src/ast/variable.cc b/src/ast/variable.cc
index a01a9dd..777b6e3 100644
--- a/src/ast/variable.cc
+++ b/src/ast/variable.cc
@@ -85,7 +85,7 @@
Variable* Variable::Clone(CloneContext* ctx) const {
return ctx->mod->create<Variable>(ctx->Clone(source()), ctx->Clone(symbol_),
- name(), storage_class(), ctx->Clone(type()),
+ name_, storage_class(), ctx->Clone(type()),
is_const_, ctx->Clone(constructor()),
ctx->Clone(decorations_));
}
diff --git a/src/ast/variable.h b/src/ast/variable.h
index 5403264..a805485 100644
--- a/src/ast/variable.h
+++ b/src/ast/variable.h
@@ -104,8 +104,6 @@
/// @returns the variable symbol
const Symbol& symbol() const { return symbol_; }
- /// @returns the variable name
- const std::string& name() const { return name_; }
/// @returns the variable's type.
type::Type* type() const { return type_; }
diff --git a/src/ast/variable_test.cc b/src/ast/variable_test.cc
index c97442c..925415d 100644
--- a/src/ast/variable_test.cc
+++ b/src/ast/variable_test.cc
@@ -30,7 +30,6 @@
auto* v = Var("my_var", StorageClass::kFunction, ty.i32);
EXPECT_EQ(v->symbol(), Symbol(1));
- EXPECT_EQ(v->name(), "my_var");
EXPECT_EQ(v->storage_class(), StorageClass::kFunction);
EXPECT_EQ(v->type(), ty.i32);
EXPECT_EQ(v->source().range.begin.line, 0u);
@@ -45,7 +44,6 @@
"i", StorageClass::kPrivate, ty.f32, nullptr, VariableDecorationList{});
EXPECT_EQ(v->symbol(), Symbol(1));
- EXPECT_EQ(v->name(), "i");
EXPECT_EQ(v->storage_class(), StorageClass::kPrivate);
EXPECT_EQ(v->type(), ty.f32);
EXPECT_EQ(v->source().range.begin.line, 27u);
@@ -61,7 +59,6 @@
VariableDecorationList{});
EXPECT_EQ(v->symbol(), Symbol(1));
- EXPECT_EQ(v->name(), "a_var");
EXPECT_EQ(v->storage_class(), StorageClass::kWorkgroup);
EXPECT_EQ(v->type(), ty.i32);
EXPECT_EQ(v->source().range.begin.line, 27u);
diff --git a/src/inspector/inspector.cc b/src/inspector/inspector.cc
index 8d8c1fe..a06bd77 100644
--- a/src/inspector/inspector.cc
+++ b/src/inspector/inspector.cc
@@ -64,10 +64,11 @@
entry_point.workgroup_size_z) = func->workgroup_size();
for (auto* var : func->referenced_module_variables()) {
+ auto name = namer_->NameFor(var->symbol());
if (var->storage_class() == ast::StorageClass::kInput) {
- entry_point.input_variables.push_back(var->name());
+ entry_point.input_variables.push_back(name);
} else {
- entry_point.output_variables.push_back(var->name());
+ entry_point.output_variables.push_back(name);
}
}
result.push_back(std::move(entry_point));
diff --git a/src/reader/wgsl/parser_impl_function_decl_test.cc b/src/reader/wgsl/parser_impl_function_decl_test.cc
index e7e38ec..c8de535 100644
--- a/src/reader/wgsl/parser_impl_function_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_function_decl_test.cc
@@ -42,8 +42,8 @@
EXPECT_TRUE(f->return_type()->Is<ast::type::Void>());
ASSERT_EQ(f->params().size(), 2u);
- EXPECT_EQ(f->params()[0]->name(), "a");
- EXPECT_EQ(f->params()[1]->name(), "b");
+ EXPECT_EQ(f->params()[0]->symbol(), p->get_module().RegisterSymbol("a"));
+ EXPECT_EQ(f->params()[1]->symbol(), p->get_module().RegisterSymbol("b"));
ASSERT_NE(f->return_type(), nullptr);
EXPECT_TRUE(f->return_type()->Is<ast::type::Void>());
diff --git a/src/reader/wgsl/parser_impl_function_header_test.cc b/src/reader/wgsl/parser_impl_function_header_test.cc
index 9b53b21..529de06 100644
--- a/src/reader/wgsl/parser_impl_function_header_test.cc
+++ b/src/reader/wgsl/parser_impl_function_header_test.cc
@@ -33,8 +33,8 @@
EXPECT_EQ(f->name, "main");
ASSERT_EQ(f->params.size(), 2u);
- EXPECT_EQ(f->params[0]->name(), "a");
- EXPECT_EQ(f->params[1]->name(), "b");
+ EXPECT_EQ(f->params[0]->symbol(), p->get_module().RegisterSymbol("a"));
+ EXPECT_EQ(f->params[1]->symbol(), p->get_module().RegisterSymbol("b"));
EXPECT_TRUE(f->return_type->Is<ast::type::Void>());
}
diff --git a/src/reader/wgsl/parser_impl_global_constant_decl_test.cc b/src/reader/wgsl/parser_impl_global_constant_decl_test.cc
index 5e2804b..89864db 100644
--- a/src/reader/wgsl/parser_impl_global_constant_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_global_constant_decl_test.cc
@@ -33,7 +33,7 @@
ASSERT_NE(e.value, nullptr);
EXPECT_TRUE(e->is_const());
- EXPECT_EQ(e->name(), "a");
+ EXPECT_EQ(e->symbol(), p->get_module().RegisterSymbol("a"));
ASSERT_NE(e->type(), nullptr);
EXPECT_TRUE(e->type()->Is<ast::type::F32>());
diff --git a/src/reader/wgsl/parser_impl_global_decl_test.cc b/src/reader/wgsl/parser_impl_global_decl_test.cc
index 04adade..6256f02 100644
--- a/src/reader/wgsl/parser_impl_global_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_global_decl_test.cc
@@ -38,7 +38,7 @@
ASSERT_EQ(m.global_variables().size(), 1u);
auto* v = m.global_variables()[0];
- EXPECT_EQ(v->name(), "a");
+ EXPECT_EQ(v->symbol(), p->get_module().RegisterSymbol("a"));
}
TEST_F(ParserImplTest, GlobalDecl_GlobalVariable_Invalid) {
@@ -64,7 +64,7 @@
ASSERT_EQ(m.global_variables().size(), 1u);
auto* v = m.global_variables()[0];
- EXPECT_EQ(v->name(), "a");
+ EXPECT_EQ(v->symbol(), p->get_module().RegisterSymbol("a"));
}
TEST_F(ParserImplTest, GlobalDecl_GlobalConstant_Invalid) {
diff --git a/src/reader/wgsl/parser_impl_global_variable_decl_test.cc b/src/reader/wgsl/parser_impl_global_variable_decl_test.cc
index a42c8d3..be1199a 100644
--- a/src/reader/wgsl/parser_impl_global_variable_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_global_variable_decl_test.cc
@@ -36,7 +36,7 @@
EXPECT_FALSE(e.errored);
ASSERT_NE(e.value, nullptr);
- EXPECT_EQ(e->name(), "a");
+ EXPECT_EQ(e->symbol(), p->get_module().RegisterSymbol("a"));
EXPECT_TRUE(e->type()->Is<ast::type::F32>());
EXPECT_EQ(e->storage_class(), ast::StorageClass::kOutput);
@@ -59,7 +59,7 @@
EXPECT_FALSE(e.errored);
ASSERT_NE(e.value, nullptr);
- EXPECT_EQ(e->name(), "a");
+ EXPECT_EQ(e->symbol(), p->get_module().RegisterSymbol("a"));
EXPECT_TRUE(e->type()->Is<ast::type::F32>());
EXPECT_EQ(e->storage_class(), ast::StorageClass::kOutput);
@@ -84,7 +84,7 @@
EXPECT_FALSE(e.errored);
ASSERT_NE(e.value, nullptr);
- EXPECT_EQ(e->name(), "a");
+ EXPECT_EQ(e->symbol(), p->get_module().RegisterSymbol("a"));
ASSERT_NE(e->type(), nullptr);
EXPECT_TRUE(e->type()->Is<ast::type::F32>());
EXPECT_EQ(e->storage_class(), ast::StorageClass::kOutput);
@@ -114,7 +114,7 @@
EXPECT_FALSE(e.errored);
ASSERT_NE(e.value, nullptr);
- EXPECT_EQ(e->name(), "a");
+ EXPECT_EQ(e->symbol(), p->get_module().RegisterSymbol("a"));
ASSERT_NE(e->type(), nullptr);
EXPECT_TRUE(e->type()->Is<ast::type::F32>());
EXPECT_EQ(e->storage_class(), ast::StorageClass::kOutput);
diff --git a/src/reader/wgsl/parser_impl_param_list_test.cc b/src/reader/wgsl/parser_impl_param_list_test.cc
index 622514d..58b3cbd 100644
--- a/src/reader/wgsl/parser_impl_param_list_test.cc
+++ b/src/reader/wgsl/parser_impl_param_list_test.cc
@@ -38,7 +38,7 @@
ASSERT_FALSE(e.errored);
EXPECT_EQ(e.value.size(), 1u);
- EXPECT_EQ(e.value[0]->name(), "a");
+ EXPECT_EQ(e.value[0]->symbol(), p->get_module().RegisterSymbol("a"));
EXPECT_EQ(e.value[0]->type(), i32);
EXPECT_TRUE(e.value[0]->is_const());
@@ -61,7 +61,7 @@
ASSERT_FALSE(e.errored);
EXPECT_EQ(e.value.size(), 3u);
- EXPECT_EQ(e.value[0]->name(), "a");
+ EXPECT_EQ(e.value[0]->symbol(), p->get_module().RegisterSymbol("a"));
EXPECT_EQ(e.value[0]->type(), i32);
EXPECT_TRUE(e.value[0]->is_const());
@@ -70,7 +70,7 @@
ASSERT_EQ(e.value[0]->source().range.end.line, 1u);
ASSERT_EQ(e.value[0]->source().range.end.column, 2u);
- EXPECT_EQ(e.value[1]->name(), "b");
+ EXPECT_EQ(e.value[1]->symbol(), p->get_module().RegisterSymbol("b"));
EXPECT_EQ(e.value[1]->type(), f32);
EXPECT_TRUE(e.value[1]->is_const());
@@ -79,7 +79,7 @@
ASSERT_EQ(e.value[1]->source().range.end.line, 1u);
ASSERT_EQ(e.value[1]->source().range.end.column, 11u);
- EXPECT_EQ(e.value[2]->name(), "c");
+ EXPECT_EQ(e.value[2]->symbol(), p->get_module().RegisterSymbol("c"));
EXPECT_EQ(e.value[2]->type(), vec2);
EXPECT_TRUE(e.value[2]->is_const());
diff --git a/src/reader/wgsl/parser_impl_variable_stmt_test.cc b/src/reader/wgsl/parser_impl_variable_stmt_test.cc
index d541af3..1a4aeba 100644
--- a/src/reader/wgsl/parser_impl_variable_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_variable_stmt_test.cc
@@ -32,7 +32,7 @@
ASSERT_NE(e.value, nullptr);
ASSERT_TRUE(e->Is<ast::VariableDeclStatement>());
ASSERT_NE(e->variable(), nullptr);
- EXPECT_EQ(e->variable()->name(), "a");
+ EXPECT_EQ(e->variable()->symbol(), p->get_module().RegisterSymbol("a"));
ASSERT_EQ(e->source().range.begin.line, 1u);
ASSERT_EQ(e->source().range.begin.column, 5u);
@@ -51,7 +51,7 @@
ASSERT_NE(e.value, nullptr);
ASSERT_TRUE(e->Is<ast::VariableDeclStatement>());
ASSERT_NE(e->variable(), nullptr);
- EXPECT_EQ(e->variable()->name(), "a");
+ EXPECT_EQ(e->variable()->symbol(), p->get_module().RegisterSymbol("a"));
ASSERT_EQ(e->source().range.begin.line, 1u);
ASSERT_EQ(e->source().range.begin.column, 5u);
diff --git a/src/transform/first_index_offset.cc b/src/transform/first_index_offset.cc
index db1ddd4..3cafccb 100644
--- a/src/transform/first_index_offset.cc
+++ b/src/transform/first_index_offset.cc
@@ -86,7 +86,7 @@
// First do a quick check to see if the transform has already been applied.
for (ast::Variable* var : in->global_variables()) {
if (auto* dec_var = var->As<ast::Variable>()) {
- if (dec_var->name() == kBufferName) {
+ if (dec_var->symbol() == in->RegisterSymbol(kBufferName)) {
diag::Diagnostic err;
err.message = "First index offset transform has already been applied.";
err.severity = diag::Severity::Error;
@@ -110,8 +110,8 @@
return out;
}
- std::string vertex_index_name;
- std::string instance_index_name;
+ Symbol vertex_index_sym;
+ Symbol instance_index_sym;
// Lazilly construct the UniformBuffer on first call to
// maybe_create_buffer_var()
@@ -134,15 +134,17 @@
if (auto* blt_dec = dec->As<ast::BuiltinDecoration>()) {
ast::Builtin blt_type = blt_dec->value();
if (blt_type == ast::Builtin::kVertexIdx) {
- vertex_index_name = var->name();
+ vertex_index_sym = var->symbol();
has_vertex_index_ = true;
return clone_variable_with_new_name(
- ctx, var, kIndexOffsetPrefix + var->name());
+ ctx, var,
+ kIndexOffsetPrefix + in->SymbolToName(var->symbol()));
} else if (blt_type == ast::Builtin::kInstanceIdx) {
- instance_index_name = var->name();
+ instance_index_sym = var->symbol();
has_instance_index_ = true;
return clone_variable_with_new_name(
- ctx, var, kIndexOffsetPrefix + var->name());
+ ctx, var,
+ kIndexOffsetPrefix + in->SymbolToName(var->symbol()));
}
}
}
@@ -161,11 +163,12 @@
func->local_referenced_builtin_variables()) {
if (data.second->value() == ast::Builtin::kVertexIdx) {
statements.emplace_back(CreateFirstIndexOffset(
- vertex_index_name, kFirstVertexName, buffer_var, ctx->mod));
+ in->SymbolToName(vertex_index_sym), kFirstVertexName,
+ buffer_var, ctx->mod));
} else if (data.second->value() == ast::Builtin::kInstanceIdx) {
statements.emplace_back(CreateFirstIndexOffset(
- instance_index_name, kFirstInstanceName, buffer_var,
- ctx->mod));
+ in->SymbolToName(instance_index_sym), kFirstInstanceName,
+ buffer_var, ctx->mod));
}
}
return CloneWithStatementsAtStart(ctx, func, statements);
@@ -252,12 +255,13 @@
ast::Variable* buffer_var,
ast::Module* mod) {
auto* buffer = mod->create<ast::IdentifierExpression>(
- Source{}, mod->RegisterSymbol(buffer_var->name()), buffer_var->name());
+ Source{}, buffer_var->symbol(), mod->SymbolToName(buffer_var->symbol()));
+
+ auto lhs_name = kIndexOffsetPrefix + original_name;
auto* constructor = mod->create<ast::BinaryExpression>(
Source{}, ast::BinaryOp::kAdd,
mod->create<ast::IdentifierExpression>(
- Source{}, mod->RegisterSymbol(kIndexOffsetPrefix + original_name),
- kIndexOffsetPrefix + original_name),
+ Source{}, mod->RegisterSymbol(lhs_name), lhs_name),
mod->create<ast::MemberAccessorExpression>(
Source{}, buffer,
mod->create<ast::IdentifierExpression>(
diff --git a/src/transform/first_index_offset.h b/src/transform/first_index_offset.h
index 873ffc8..64ad7a3 100644
--- a/src/transform/first_index_offset.h
+++ b/src/transform/first_index_offset.h
@@ -19,6 +19,7 @@
#include "src/ast/module.h"
#include "src/ast/variable_decl_statement.h"
+#include "src/symbol.h"
#include "src/transform/transform.h"
namespace tint {
diff --git a/src/transform/vertex_pulling.cc b/src/transform/vertex_pulling.cc
index 7b986fa..9709919 100644
--- a/src/transform/vertex_pulling.cc
+++ b/src/transform/vertex_pulling.cc
@@ -155,7 +155,7 @@
for (auto* d : v->decorations()) {
if (auto* builtin = d->As<ast::BuiltinDecoration>()) {
if (builtin->value() == ast::Builtin::kVertexIdx) {
- vertex_index_name = v->name();
+ vertex_index_name = in->SymbolToName(v->symbol());
return;
}
}
@@ -203,7 +203,7 @@
for (auto* d : v->decorations()) {
if (auto* builtin = d->As<ast::BuiltinDecoration>()) {
if (builtin->value() == ast::Builtin::kInstanceIdx) {
- instance_index_name = v->name();
+ instance_index_name = in->SymbolToName(v->symbol());
return;
}
}
@@ -244,7 +244,7 @@
v = out->create<ast::Variable>(
Source{}, // source
v->symbol(), // symbol
- v->name(), // name
+ out->SymbolToName(v->symbol()), // name
ast::StorageClass::kPrivate, // storage_class
v->type(), // type
false, // is_const
@@ -358,10 +358,11 @@
Source{}, CreatePullingPositionIdent(), pos_value);
stmts.emplace_back(set_pos_expr);
+ auto ident_name = in->SymbolToName(v->symbol());
stmts.emplace_back(out->create<ast::AssignmentStatement>(
Source{},
out->create<ast::IdentifierExpression>(
- Source{}, out->RegisterSymbol(v->name()), v->name()),
+ Source{}, out->RegisterSymbol(ident_name), ident_name),
AccessByFormat(i, attribute_desc.format)));
}
}
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index 9dae4b8..051e81f 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -175,7 +175,7 @@
}
}
- std::unordered_set<std::string> emitted_globals;
+ std::unordered_set<uint32_t> emitted_globals;
// Make sure all entry point data is emitted before the entry point functions
for (auto* func : module_->functions()) {
if (!func->IsEntryPoint()) {
@@ -1285,7 +1285,7 @@
}
// Array name is output as part of the type
if (!v->type()->Is<ast::type::Array>()) {
- out << " " << v->name();
+ out << " " << namer_->NameFor(v->symbol());
}
}
@@ -1305,7 +1305,7 @@
bool GeneratorImpl::EmitEntryPointData(
std::ostream& out,
ast::Function* func,
- std::unordered_set<std::string>& emitted_globals) {
+ std::unordered_set<uint32_t>& emitted_globals) {
std::vector<std::pair<ast::Variable*, ast::VariableDecoration*>> in_variables;
std::vector<std::pair<ast::Variable*, ast::VariableDecoration*>> outvariables;
for (auto data : func->referenced_location_variables()) {
@@ -1338,22 +1338,24 @@
// set. https://bugs.chromium.org/p/tint/issues/detail?id=104
auto* binding = data.second.binding;
if (binding == nullptr) {
- error_ = "unable to find binding information for uniform: " + var->name();
+ error_ = "unable to find binding information for uniform: " +
+ module_->SymbolToName(var->symbol());
return false;
}
// auto* set = data.second.set;
// If the global has already been emitted we skip it, it's been emitted by
// a previous entry point.
- if (emitted_globals.count(var->name()) != 0) {
+ if (emitted_globals.count(var->symbol().value()) != 0) {
continue;
}
- emitted_globals.insert(var->name());
+ emitted_globals.insert(var->symbol().value());
auto* type = var->type()->UnwrapIfNeeded();
if (auto* strct = type->As<ast::type::Struct>()) {
- out << "ConstantBuffer<" << strct->name() << "> " << var->name()
- << " : register(b" << binding->value() << ");" << std::endl;
+ out << "ConstantBuffer<" << strct->name() << "> "
+ << namer_->NameFor(var->symbol()) << " : register(b"
+ << binding->value() << ");" << std::endl;
} else {
// TODO(dsinclair): There is outstanding spec work to require all uniform
// buffers to be [[block]] decorated, which means structs. This is
@@ -1361,7 +1363,7 @@
// is not a block.
// Relevant: https://github.com/gpuweb/gpuweb/issues/1004
// https://github.com/gpuweb/gpuweb/issues/1008
- auto name = "cbuffer_" + var->name();
+ auto name = "cbuffer_" + namer_->NameFor(var->symbol());
out << "cbuffer " << name << " : register(b" << binding->value() << ") {"
<< std::endl;
@@ -1370,7 +1372,7 @@
if (!EmitType(out, type, Symbol())) {
return false;
}
- out << " " << var->name() << ";" << std::endl;
+ out << " " << namer_->NameFor(var->symbol()) << ";" << std::endl;
decrement_indent();
out << "};" << std::endl;
}
@@ -1388,10 +1390,10 @@
// If the global has already been emitted we skip it, it's been emitted by
// a previous entry point.
- if (emitted_globals.count(var->name()) != 0) {
+ if (emitted_globals.count(var->symbol().value()) != 0) {
continue;
}
- emitted_globals.insert(var->name());
+ emitted_globals.insert(var->symbol().value());
auto* ac = var->type()->As<ast::type::AccessControl>();
if (ac == nullptr) {
@@ -1402,8 +1404,8 @@
if (ac->IsReadWrite()) {
out << "RW";
}
- out << "ByteAddressBuffer " << var->name() << " : register(u"
- << binding->value() << ");" << std::endl;
+ out << "ByteAddressBuffer " << namer_->NameFor(var->symbol())
+ << " : register(u" << binding->value() << ");" << std::endl;
emitted_storagebuffer = true;
}
if (emitted_storagebuffer) {
@@ -1430,7 +1432,7 @@
return false;
}
- out << " " << var->name() << " : ";
+ out << " " << namer_->NameFor(var->symbol()) << " : ";
if (auto* location = deco->As<ast::LocationDecoration>()) {
if (func->pipeline_stage() == ast::PipelineStage::kCompute) {
error_ = "invalid location variable for pipeline stage";
@@ -1475,7 +1477,7 @@
return false;
}
- out << " " << var->name() << " : ";
+ out << " " << namer_->NameFor(var->symbol()) << " : ";
if (auto* location = deco->As<ast::LocationDecoration>()) {
auto loc = location->value();
@@ -1697,7 +1699,7 @@
}
out << pre.str();
- out << var->name() << " = ";
+ out << namer_->NameFor(var->symbol()) << " = ";
if (var->constructor() != nullptr) {
out << constructor_out.str();
} else {
@@ -2289,7 +2291,7 @@
return false;
}
if (!var->type()->Is<ast::type::Array>()) {
- out << " " << var->name();
+ out << " " << namer_->NameFor(var->symbol());
}
out << constructor_out.str() << ";" << std::endl;
@@ -2337,8 +2339,8 @@
if (!EmitType(out, var->type(), var->symbol())) {
return false;
}
- out << " " << var->name() << " = WGSL_SPEC_CONSTANT_" << const_id << ";"
- << std::endl;
+ out << " " << namer_->NameFor(var->symbol()) << " = WGSL_SPEC_CONSTANT_"
+ << const_id << ";" << std::endl;
out << "#undef WGSL_SPEC_CONSTANT_" << const_id << std::endl;
} else {
out << "static const ";
@@ -2346,7 +2348,7 @@
return false;
}
if (!var->type()->Is<ast::type::Array>()) {
- out << " " << var->name();
+ out << " " << namer_->NameFor(var->symbol());
}
if (var->constructor() != nullptr) {
diff --git a/src/writer/hlsl/generator_impl.h b/src/writer/hlsl/generator_impl.h
index 4a2a371..9c1a113 100644
--- a/src/writer/hlsl/generator_impl.h
+++ b/src/writer/hlsl/generator_impl.h
@@ -224,7 +224,7 @@
/// @returns true if the entry point data was emitted
bool EmitEntryPointData(std::ostream& out,
ast::Function* func,
- std::unordered_set<std::string>& emitted_globals);
+ std::unordered_set<uint32_t>& emitted_globals);
/// Handles emitting the entry point function
/// @param out the output stream
/// @param func the entry point
diff --git a/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc b/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc
index 6bce585..73bd4c4 100644
--- a/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc
+++ b/src/writer/hlsl/generator_impl_function_entry_point_data_test.cc
@@ -72,7 +72,7 @@
mod->AddFunction(func);
- std::unordered_set<std::string> globals;
+ std::unordered_set<uint32_t> globals;
ASSERT_TRUE(td.Determine()) << td.error();
ASSERT_TRUE(gen.EmitEntryPointData(out, func, globals)) << gen.error();
@@ -122,7 +122,7 @@
mod->AddFunction(func);
- std::unordered_set<std::string> globals;
+ std::unordered_set<uint32_t> globals;
ASSERT_TRUE(td.Determine()) << td.error();
ASSERT_TRUE(gen.EmitEntryPointData(out, func, globals)) << gen.error();
@@ -172,7 +172,7 @@
mod->AddFunction(func);
- std::unordered_set<std::string> globals;
+ std::unordered_set<uint32_t> globals;
ASSERT_TRUE(td.Determine()) << td.error();
ASSERT_TRUE(gen.EmitEntryPointData(out, func, globals)) << gen.error();
@@ -222,7 +222,7 @@
mod->AddFunction(func);
- std::unordered_set<std::string> globals;
+ std::unordered_set<uint32_t> globals;
ASSERT_TRUE(td.Determine()) << td.error();
ASSERT_TRUE(gen.EmitEntryPointData(out, func, globals)) << gen.error();
@@ -269,7 +269,7 @@
mod->AddFunction(func);
- std::unordered_set<std::string> globals;
+ std::unordered_set<uint32_t> globals;
ASSERT_TRUE(td.Determine()) << td.error();
ASSERT_FALSE(gen.EmitEntryPointData(out, func, globals)) << gen.error();
@@ -311,7 +311,7 @@
mod->AddFunction(func);
- std::unordered_set<std::string> globals;
+ std::unordered_set<uint32_t> globals;
ASSERT_TRUE(td.Determine()) << td.error();
ASSERT_FALSE(gen.EmitEntryPointData(out, func, globals)) << gen.error();
@@ -361,7 +361,7 @@
mod->AddFunction(func);
- std::unordered_set<std::string> globals;
+ std::unordered_set<uint32_t> globals;
ASSERT_TRUE(td.Determine()) << td.error();
ASSERT_TRUE(gen.EmitEntryPointData(out, func, globals)) << gen.error();
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index 0ae6660..f9b425a 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -607,7 +607,7 @@
out_ << ", ";
}
first = false;
- out_ << var->name();
+ out_ << namer_->NameFor(var->symbol());
}
for (const auto& data : func->referenced_uniform_variables()) {
@@ -616,7 +616,7 @@
out_ << ", ";
}
first = false;
- out_ << var->name();
+ out_ << namer_->NameFor(var->symbol());
}
for (const auto& data : func->referenced_storagebuffer_variables()) {
@@ -625,7 +625,7 @@
out_ << ", ";
}
first = false;
- out_ << var->name();
+ out_ << namer_->NameFor(var->symbol());
}
const auto& params = expr->params();
@@ -1035,7 +1035,7 @@
return false;
}
- out_ << " " << var->name() << " [[";
+ out_ << " " << namer_->NameFor(var->symbol()) << " [[";
if (func->pipeline_stage() == ast::PipelineStage::kVertex) {
out_ << "attribute(" << loc << ")";
} else if (func->pipeline_stage() == ast::PipelineStage::kFragment) {
@@ -1072,7 +1072,7 @@
return false;
}
- out_ << " " << var->name() << " [[";
+ out_ << " " << namer_->NameFor(var->symbol()) << " [[";
if (auto* location = deco->As<ast::LocationDecoration>()) {
auto loc = location->value();
@@ -1275,7 +1275,7 @@
if (!EmitType(var->type(), Symbol())) {
return false;
}
- out_ << "& " << var->name();
+ out_ << "& " << namer_->NameFor(var->symbol());
}
for (const auto& data : func->referenced_uniform_variables()) {
@@ -1290,7 +1290,7 @@
if (!EmitType(var->type(), Symbol())) {
return false;
}
- out_ << "& " << var->name();
+ out_ << "& " << namer_->NameFor(var->symbol());
}
for (const auto& data : func->referenced_storagebuffer_variables()) {
@@ -1313,7 +1313,7 @@
if (!EmitType(ac->type(), Symbol())) {
return false;
}
- out_ << "& " << var->name();
+ out_ << "& " << namer_->NameFor(var->symbol());
}
for (auto* v : func->params()) {
@@ -1327,7 +1327,7 @@
}
// Array name is output as part of the type
if (!v->type()->Is<ast::type::Array>()) {
- out_ << " " << v->name();
+ out_ << " " << namer_->NameFor(v->symbol());
}
}
@@ -1419,7 +1419,7 @@
error_ = "unknown builtin";
return false;
}
- out_ << " " << var->name() << " [[" << attr << "]]";
+ out_ << " " << namer_->NameFor(var->symbol()) << " [[" << attr << "]]";
}
for (auto data : func->referenced_uniform_variables()) {
@@ -1434,7 +1434,8 @@
// set. https://bugs.chromium.org/p/tint/issues/detail?id=104
auto* binding = data.second.binding;
if (binding == nullptr) {
- error_ = "unable to find binding information for uniform: " + var->name();
+ error_ = "unable to find binding information for uniform: " +
+ module_->SymbolToName(var->symbol());
return false;
}
// auto* set = data.second.set;
@@ -1445,7 +1446,8 @@
if (!EmitType(var->type(), Symbol())) {
return false;
}
- out_ << "& " << var->name() << " [[buffer(" << binding->value() << ")]]";
+ out_ << "& " << namer_->NameFor(var->symbol()) << " [[buffer("
+ << binding->value() << ")]]";
}
for (auto data : func->referenced_storagebuffer_variables()) {
@@ -1474,7 +1476,8 @@
if (!EmitType(ac->type(), Symbol())) {
return false;
}
- out_ << "& " << var->name() << " [[buffer(" << binding->value() << ")]]";
+ out_ << "& " << namer_->NameFor(var->symbol()) << " [[buffer("
+ << binding->value() << ")]]";
}
out_ << ") {" << std::endl;
@@ -1589,7 +1592,7 @@
make_indent();
auto* var = decl->variable();
- out_ << var->name() << " = ";
+ out_ << namer_->NameFor(var->symbol()) << " = ";
if (var->constructor() != nullptr) {
if (!EmitExpression(var->constructor())) {
return false;
@@ -2020,7 +2023,7 @@
return false;
}
if (!var->type()->Is<ast::type::Array>()) {
- out_ << " " << var->name();
+ out_ << " " << namer_->NameFor(var->symbol());
}
if (!skip_constructor) {
@@ -2062,7 +2065,7 @@
return false;
}
if (!var->type()->Is<ast::type::Array>()) {
- out_ << " " << var->name();
+ out_ << " " << namer_->NameFor(var->symbol());
}
if (var->HasConstantIdDecoration()) {
diff --git a/src/writer/wgsl/generator.cc b/src/writer/wgsl/generator.cc
index 3f01dc9..e9d0a9b 100644
--- a/src/writer/wgsl/generator.cc
+++ b/src/writer/wgsl/generator.cc
@@ -21,17 +21,18 @@
namespace wgsl {
Generator::Generator(ast::Module module)
- : Text(std::move(module)), impl_(std::make_unique<GeneratorImpl>()) {}
+ : Text(std::move(module)),
+ impl_(std::make_unique<GeneratorImpl>(&module_)) {}
Generator::~Generator() = default;
void Generator::Reset() {
set_error("");
- impl_ = std::make_unique<GeneratorImpl>();
+ impl_ = std::make_unique<GeneratorImpl>(&module_);
}
bool Generator::Generate() {
- auto ret = impl_->Generate(module_);
+ auto ret = impl_->Generate();
if (!ret) {
error_ = impl_->error();
}
@@ -40,7 +41,7 @@
bool Generator::GenerateEntryPoint(ast::PipelineStage stage,
const std::string& name) {
- auto ret = impl_->GenerateEntryPoint(module_, stage, name);
+ auto ret = impl_->GenerateEntryPoint(stage, name);
if (!ret) {
error_ = impl_->error();
}
diff --git a/src/writer/wgsl/generator_impl.cc b/src/writer/wgsl/generator_impl.cc
index 58982dd..09509b4 100644
--- a/src/writer/wgsl/generator_impl.cc
+++ b/src/writer/wgsl/generator_impl.cc
@@ -78,29 +78,30 @@
namespace writer {
namespace wgsl {
-GeneratorImpl::GeneratorImpl() : TextGenerator() {}
+GeneratorImpl::GeneratorImpl(ast::Module* module)
+ : TextGenerator(), module_(*module) {}
GeneratorImpl::~GeneratorImpl() = default;
-bool GeneratorImpl::Generate(const ast::Module& module) {
- for (auto* const ty : module.constructed_types()) {
+bool GeneratorImpl::Generate() {
+ for (auto* const ty : module_.constructed_types()) {
if (!EmitConstructedType(ty)) {
return false;
}
}
- if (!module.constructed_types().empty())
+ if (!module_.constructed_types().empty())
out_ << std::endl;
- for (auto* var : module.global_variables()) {
+ for (auto* var : module_.global_variables()) {
if (!EmitVariable(var)) {
return false;
}
}
- if (!module.global_variables().empty()) {
+ if (!module_.global_variables().empty()) {
out_ << std::endl;
}
- for (auto* func : module.functions()) {
+ for (auto* func : module_.functions()) {
if (!EmitFunction(func)) {
return false;
}
@@ -110,11 +111,10 @@
return true;
}
-bool GeneratorImpl::GenerateEntryPoint(const ast::Module& module,
- ast::PipelineStage stage,
+bool GeneratorImpl::GenerateEntryPoint(ast::PipelineStage stage,
const std::string& name) {
auto* func =
- module.FindFunctionBySymbolAndStage(module.GetSymbol(name), stage);
+ module_.FindFunctionBySymbolAndStage(module_.GetSymbol(name), stage);
if (func == nullptr) {
error_ = "Unable to find requested entry point: " + name;
return false;
@@ -122,18 +122,18 @@
// TODO(dsinclair): We always emit constructed types even if they aren't
// strictly needed
- for (auto* const ty : module.constructed_types()) {
+ for (auto* const ty : module_.constructed_types()) {
if (!EmitConstructedType(ty)) {
return false;
}
}
- if (!module.constructed_types().empty()) {
+ if (!module_.constructed_types().empty()) {
out_ << std::endl;
}
// TODO(dsinclair): This should be smarter and only emit needed const
// variables
- for (auto* var : module.global_variables()) {
+ for (auto* var : module_.global_variables()) {
if (!var->is_const()) {
continue;
}
@@ -153,8 +153,8 @@
out_ << std::endl;
}
- for (auto* f : module.functions()) {
- if (!f->HasAncestorEntryPoint(module.GetSymbol(name))) {
+ for (auto* f : module_.functions()) {
+ if (!f->HasAncestorEntryPoint(module_.GetSymbol(name))) {
continue;
}
@@ -370,7 +370,7 @@
}
first = false;
- out_ << v->name() << " : ";
+ out_ << module_.SymbolToName(v->symbol()) << " : ";
if (!EmitType(v->type())) {
return false;
@@ -597,7 +597,7 @@
}
}
- out_ << " " << var->name() << " : ";
+ out_ << " " << module_.SymbolToName(var->symbol()) << " : ";
if (!EmitType(var->type())) {
return false;
}
diff --git a/src/writer/wgsl/generator_impl.h b/src/writer/wgsl/generator_impl.h
index c4544e3..f21b602 100644
--- a/src/writer/wgsl/generator_impl.h
+++ b/src/writer/wgsl/generator_impl.h
@@ -53,22 +53,19 @@
class GeneratorImpl : public TextGenerator {
public:
/// Constructor
- GeneratorImpl();
+ /// @param module the module to generate
+ explicit GeneratorImpl(ast::Module* mod);
~GeneratorImpl();
/// Generates the result data
- /// @param module the module to generate
/// @returns true on successful generation; false otherwise
- bool Generate(const ast::Module& module);
+ bool Generate();
/// Generates a single entry point
- /// @param module the module to generate from
/// @param stage the pipeline stage
/// @param name the entry point name
/// @returns true on successful generation; false otherwise
- bool GenerateEntryPoint(const ast::Module& module,
- ast::PipelineStage stage,
- const std::string& name);
+ bool GenerateEntryPoint(ast::PipelineStage stage, const std::string& name);
/// Handles generating a constructed type
/// @param ty the constructed to generate
@@ -206,6 +203,9 @@
/// @param var the decorated variable
/// @returns true if the variable decoration was emitted
bool EmitVariableDecorations(ast::Variable* var);
+
+ private:
+ ast::Module& module_;
};
} // namespace wgsl
diff --git a/src/writer/wgsl/generator_impl_function_test.cc b/src/writer/wgsl/generator_impl_function_test.cc
index 2deb562..37d61cb 100644
--- a/src/writer/wgsl/generator_impl_function_test.cc
+++ b/src/writer/wgsl/generator_impl_function_test.cc
@@ -226,7 +226,7 @@
ASSERT_TRUE(td.Determine()) << td.error();
- ASSERT_TRUE(gen.Generate(*mod)) << gen.error();
+ ASSERT_TRUE(gen.Generate()) << gen.error();
EXPECT_EQ(gen.result(), R"([[block]]
struct Data {
[[offset(0)]]
diff --git a/src/writer/wgsl/generator_impl_test.cc b/src/writer/wgsl/generator_impl_test.cc
index 99121ca..37f080a 100644
--- a/src/writer/wgsl/generator_impl_test.cc
+++ b/src/writer/wgsl/generator_impl_test.cc
@@ -33,7 +33,7 @@
mod->AddFunction(Func("my_func", ast::VariableList{}, ty.void_,
ast::StatementList{}, ast::FunctionDecorationList{}));
- ASSERT_TRUE(gen.Generate(*mod)) << gen.error();
+ ASSERT_TRUE(gen.Generate()) << gen.error();
EXPECT_EQ(gen.result(), R"(fn my_func() -> void {
}
diff --git a/src/writer/wgsl/test_helper.h b/src/writer/wgsl/test_helper.h
index d6c5a93..8ef37bd 100644
--- a/src/writer/wgsl/test_helper.h
+++ b/src/writer/wgsl/test_helper.h
@@ -31,7 +31,7 @@
template <typename BASE>
class TestHelperBase : public BASE, public ast::BuilderWithModule {
public:
- TestHelperBase() : td(mod), gen() {}
+ TestHelperBase() : td(mod), gen(mod) {}
~TestHelperBase() = default;