// Copyright 2020 The Tint Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #include "src/transform/transform.h" #include #include "src/program_builder.h" #include "src/sem/reference_type.h" TINT_INSTANTIATE_TYPEINFO(tint::transform::Data); namespace tint { namespace transform { Data::Data() = default; Data::Data(const Data&) = default; Data::~Data() = default; Data& Data::operator=(const Data&) = default; DataMap::DataMap() = default; DataMap::DataMap(DataMap&&) = default; DataMap::~DataMap() = default; DataMap& DataMap::operator=(DataMap&&) = default; Output::Output() = default; Output::Output(Program&& p) : program(std::move(p)) {} Transform::Transform() = default; Transform::~Transform() = default; ast::Function* Transform::CloneWithStatementsAtStart( CloneContext* ctx, ast::Function* in, ast::StatementList statements) { for (auto* s : *in->body()) { statements.emplace_back(ctx->Clone(s)); } // Clone arguments outside of create() call to have deterministic ordering auto source = ctx->Clone(in->source()); auto symbol = ctx->Clone(in->symbol()); auto params = ctx->Clone(in->params()); auto* return_type = ctx->Clone(in->return_type()); auto* body = ctx->dst->create( ctx->Clone(in->body()->source()), statements); auto decos = ctx->Clone(in->decorations()); auto ret_decos = ctx->Clone(in->return_type_decorations()); return ctx->dst->create(source, symbol, params, return_type, body, decos, ret_decos); } ast::DecorationList Transform::RemoveDecorations( CloneContext* ctx, const ast::DecorationList& in, std::function should_remove) { ast::DecorationList new_decorations; for (auto* deco : in) { if (!should_remove(deco)) { new_decorations.push_back(ctx->Clone(deco)); } } return new_decorations; } ast::Type* Transform::CreateASTTypeFor(CloneContext* ctx, const sem::Type* ty) { if (ty->Is()) { return ctx->dst->create(); } if (ty->Is()) { return ctx->dst->create(); } if (ty->Is()) { return ctx->dst->create(); } if (ty->Is()) { return ctx->dst->create(); } if (ty->Is()) { return ctx->dst->create(); } if (auto* m = ty->As()) { auto* el = CreateASTTypeFor(ctx, m->type()); return ctx->dst->create(el, m->rows(), m->columns()); } if (auto* v = ty->As()) { auto* el = CreateASTTypeFor(ctx, v->type()); return ctx->dst->create(el, v->size()); } if (auto* a = ty->As()) { auto* el = CreateASTTypeFor(ctx, a->ElemType()); ast::DecorationList decos; if (!a->IsStrideImplicit()) { decos.emplace_back(ctx->dst->create(a->Stride())); } return ctx->dst->create(el, a->Count(), std::move(decos)); } if (auto* s = ty->As()) { return ctx->dst->create( ctx->Clone(s->Declaration()->name())); } if (auto* s = ty->As()) { return CreateASTTypeFor(ctx, s->StoreType()); } if (auto* t = ty->As()) { return ctx->dst->create(t->dim()); } if (auto* t = ty->As()) { return ctx->dst->create( t->dim(), CreateASTTypeFor(ctx, t->type())); } if (auto* t = ty->As()) { return ctx->dst->create( t->dim(), CreateASTTypeFor(ctx, t->type())); } if (auto* t = ty->As()) { return ctx->dst->create( t->dim(), t->image_format(), CreateASTTypeFor(ctx, t->type()), t->access()); } if (auto* s = ty->As()) { return ctx->dst->create(s->kind()); } TINT_UNREACHABLE(ctx->dst->Diagnostics()) << "Unhandled type: " << ty->TypeInfo().name; return nullptr; } } // namespace transform } // namespace tint