mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-13 23:26:24 +00:00
CloneContext: Pass the vector to InsertBefore()
There's usually only ever one vector we want to insert into. Inserting into *all* vectors that happen to contain the reference object is likely unintended, and is a foot-gun waiting to go off. Change-Id: I533084ccad102fc998b851fd238fd6bea9299450 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/46445 Commit-Queue: Ben Clayton <bclayton@google.com> Reviewed-by: James Price <jrprice@google.com> Kokoro: Kokoro <noreply+kokoro@google.com>
This commit is contained in:
committed by
Commit Bot service account
parent
90f43cf87f
commit
b4275c870e
@@ -18,6 +18,7 @@
|
||||
|
||||
#include "src/program_builder.h"
|
||||
#include "src/semantic/function.h"
|
||||
#include "src/semantic/statement.h"
|
||||
#include "src/semantic/variable.h"
|
||||
|
||||
namespace tint {
|
||||
@@ -119,7 +120,7 @@ Transform::Output CanonicalizeEntryPointIO::Run(const Program* in,
|
||||
// Initialize it with the value extracted from the new struct parameter.
|
||||
auto* func_const = ctx.dst->Const(
|
||||
func_const_symbol, ctx.Clone(param_ty), func_const_initializer);
|
||||
ctx.InsertBefore(*func->body()->begin(),
|
||||
ctx.InsertBefore(func->body()->statements(), *func->body()->begin(),
|
||||
ctx.dst->WrapInStatement(func_const));
|
||||
|
||||
// Replace all uses of the function parameter with the function const.
|
||||
@@ -134,7 +135,7 @@ Transform::Output CanonicalizeEntryPointIO::Run(const Program* in,
|
||||
ctx.dst->Symbols().New(),
|
||||
ctx.dst->create<ast::Struct>(new_struct_members,
|
||||
ast::DecorationList{}));
|
||||
ctx.InsertBefore(func, in_struct);
|
||||
ctx.InsertBefore(ctx.src->AST().GlobalDeclarations(), func, in_struct);
|
||||
|
||||
// Create a new function parameter using this struct type.
|
||||
auto* struct_param = ctx.dst->Var(new_struct_param_symbol, in_struct,
|
||||
@@ -177,12 +178,13 @@ Transform::Output CanonicalizeEntryPointIO::Run(const Program* in,
|
||||
ctx.dst->Symbols().New(),
|
||||
ctx.dst->create<ast::Struct>(new_struct_members,
|
||||
ast::DecorationList{}));
|
||||
ctx.InsertBefore(func, out_struct);
|
||||
ctx.InsertBefore(ctx.src->AST().GlobalDeclarations(), func, out_struct);
|
||||
new_ret_type = out_struct;
|
||||
|
||||
// Replace all return statements.
|
||||
auto* sem_func = ctx.src->Sem().Get(func);
|
||||
for (auto* ret : sem_func->ReturnStatements()) {
|
||||
auto* ret_sem = ctx.src->Sem().Get(ret);
|
||||
// Reconstruct the return value using the newly created struct.
|
||||
auto* new_ret_value = ctx.Clone(ret->value());
|
||||
ast::ExpressionList ret_values;
|
||||
@@ -193,7 +195,7 @@ Transform::Output CanonicalizeEntryPointIO::Run(const Program* in,
|
||||
auto temp = ctx.dst->Symbols().New();
|
||||
auto* temp_var = ctx.dst->Decl(
|
||||
ctx.dst->Const(temp, ctx.Clone(ret_type), new_ret_value));
|
||||
ctx.InsertBefore(ret, temp_var);
|
||||
ctx.InsertBefore(ret_sem->Block()->statements(), ret, temp_var);
|
||||
new_ret_value = ctx.dst->Expr(temp);
|
||||
}
|
||||
|
||||
|
||||
@@ -96,7 +96,8 @@ void Hlsl::PromoteArrayInitializerToConstVar(CloneContext& ctx) const {
|
||||
auto* dst_ident = ctx.dst->Expr(dst_symbol);
|
||||
|
||||
// Insert the constant before the usage
|
||||
ctx.InsertBefore(src_stmt, dst_var_decl);
|
||||
ctx.InsertBefore(src_sem_stmt->Block()->statements(), src_stmt,
|
||||
dst_var_decl);
|
||||
// Replace the inlined array with a reference to the constant
|
||||
ctx.Replace(src_init, dst_ident);
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "src/ast/return_statement.h"
|
||||
#include "src/program_builder.h"
|
||||
#include "src/semantic/function.h"
|
||||
#include "src/semantic/statement.h"
|
||||
#include "src/semantic/variable.h"
|
||||
|
||||
namespace tint {
|
||||
@@ -162,13 +163,15 @@ void Spirv::HandleEntryPointIOTypes(CloneContext& ctx) const {
|
||||
return_func_symbol, ast::VariableList{store_value},
|
||||
ctx.dst->ty.void_(), ctx.dst->create<ast::BlockStatement>(stores),
|
||||
ast::DecorationList{}, ast::DecorationList{});
|
||||
ctx.InsertBefore(func, return_func);
|
||||
ctx.InsertBefore(ctx.src->AST().GlobalDeclarations(), func, return_func);
|
||||
|
||||
// Replace all return statements with calls to the output function.
|
||||
auto* sem_func = ctx.src->Sem().Get(func);
|
||||
for (auto* ret : sem_func->ReturnStatements()) {
|
||||
auto* ret_sem = ctx.src->Sem().Get(ret);
|
||||
auto* call = ctx.dst->Call(return_func_symbol, ctx.Clone(ret->value()));
|
||||
ctx.InsertBefore(ret, ctx.dst->create<ast::CallStatement>(call));
|
||||
ctx.InsertBefore(ret_sem->Block()->statements(), ret,
|
||||
ctx.dst->create<ast::CallStatement>(call));
|
||||
ctx.Replace(ret, ctx.dst->create<ast::ReturnStatement>());
|
||||
}
|
||||
}
|
||||
@@ -247,7 +250,7 @@ Symbol Spirv::HoistToInputVariables(
|
||||
auto* global_var =
|
||||
ctx.dst->Var(global_var_symbol, ctx.Clone(ty),
|
||||
ast::StorageClass::kInput, nullptr, new_decorations);
|
||||
ctx.InsertBefore(func, global_var);
|
||||
ctx.InsertBefore(ctx.src->AST().GlobalDeclarations(), func, global_var);
|
||||
return global_var_symbol;
|
||||
}
|
||||
|
||||
@@ -269,7 +272,8 @@ Symbol Spirv::HoistToInputVariables(
|
||||
// Create a function-scope variable for the struct.
|
||||
auto* initializer = ctx.dst->Construct(ctx.Clone(ty), init_values);
|
||||
auto* func_var = ctx.dst->Const(func_var_symbol, ctx.Clone(ty), initializer);
|
||||
ctx.InsertBefore(*func->body()->begin(), ctx.dst->WrapInStatement(func_var));
|
||||
ctx.InsertBefore(func->body()->statements(), *func->body()->begin(),
|
||||
ctx.dst->WrapInStatement(func_var));
|
||||
return func_var_symbol;
|
||||
}
|
||||
|
||||
@@ -292,7 +296,7 @@ void Spirv::HoistToOutputVariables(CloneContext& ctx,
|
||||
auto* global_var =
|
||||
ctx.dst->Var(global_var_symbol, ctx.Clone(ty),
|
||||
ast::StorageClass::kOutput, nullptr, new_decorations);
|
||||
ctx.InsertBefore(func, global_var);
|
||||
ctx.InsertBefore(ctx.src->AST().GlobalDeclarations(), func, global_var);
|
||||
|
||||
// Create the assignment instruction.
|
||||
ast::Expression* rhs = ctx.dst->Expr(store_value);
|
||||
|
||||
Reference in New Issue
Block a user