/* * Copyright 2021 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "include/private/SkSLProgramElement.h" #include "src/sksl/SkSLProgramSettings.h" #include "src/sksl/ir/SkSLFunctionDefinition.h" #include "src/sksl/ir/SkSLProgram.h" #include "src/sksl/transform/SkSLTransform.h" #include namespace SkSL { bool Transform::EliminateDeadFunctions(Program& program, ProgramUsage* usage) { bool madeChanges = false; if (program.fConfig->fSettings.fRemoveDeadFunctions) { auto isDeadFunction = [&](const ProgramElement* element) { if (!element->is()) { return false; } const FunctionDefinition& fn = element->as(); if (fn.declaration().isMain() || usage->get(fn.declaration()) > 0) { return false; } usage->remove(*element); madeChanges = true; return true; }; program.fOwnedElements.erase(std::remove_if(program.fOwnedElements.begin(), program.fOwnedElements.end(), [&](const std::unique_ptr& pe) { return isDeadFunction(pe.get()); }), program.fOwnedElements.end()); program.fSharedElements.erase(std::remove_if(program.fSharedElements.begin(), program.fSharedElements.end(), isDeadFunction), program.fSharedElements.end()); } return madeChanges; } } // namespace SkSL