1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2021 Google LLC 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "include/private/SkSLProgramElement.h" 9cb93a386Sopenharmony_ci#include "src/sksl/SkSLProgramSettings.h" 10cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLFunctionDefinition.h" 11cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLProgram.h" 12cb93a386Sopenharmony_ci#include "src/sksl/transform/SkSLTransform.h" 13cb93a386Sopenharmony_ci 14cb93a386Sopenharmony_ci#include <algorithm> 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_cinamespace SkSL { 17cb93a386Sopenharmony_ci 18cb93a386Sopenharmony_cibool Transform::EliminateDeadFunctions(Program& program, ProgramUsage* usage) { 19cb93a386Sopenharmony_ci bool madeChanges = false; 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_ci if (program.fConfig->fSettings.fRemoveDeadFunctions) { 22cb93a386Sopenharmony_ci auto isDeadFunction = [&](const ProgramElement* element) { 23cb93a386Sopenharmony_ci if (!element->is<FunctionDefinition>()) { 24cb93a386Sopenharmony_ci return false; 25cb93a386Sopenharmony_ci } 26cb93a386Sopenharmony_ci const FunctionDefinition& fn = element->as<FunctionDefinition>(); 27cb93a386Sopenharmony_ci if (fn.declaration().isMain() || usage->get(fn.declaration()) > 0) { 28cb93a386Sopenharmony_ci return false; 29cb93a386Sopenharmony_ci } 30cb93a386Sopenharmony_ci usage->remove(*element); 31cb93a386Sopenharmony_ci madeChanges = true; 32cb93a386Sopenharmony_ci return true; 33cb93a386Sopenharmony_ci }; 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ci program.fOwnedElements.erase(std::remove_if(program.fOwnedElements.begin(), 36cb93a386Sopenharmony_ci program.fOwnedElements.end(), 37cb93a386Sopenharmony_ci [&](const std::unique_ptr<ProgramElement>& pe) { 38cb93a386Sopenharmony_ci return isDeadFunction(pe.get()); 39cb93a386Sopenharmony_ci }), 40cb93a386Sopenharmony_ci program.fOwnedElements.end()); 41cb93a386Sopenharmony_ci program.fSharedElements.erase(std::remove_if(program.fSharedElements.begin(), 42cb93a386Sopenharmony_ci program.fSharedElements.end(), 43cb93a386Sopenharmony_ci isDeadFunction), 44cb93a386Sopenharmony_ci program.fSharedElements.end()); 45cb93a386Sopenharmony_ci } 46cb93a386Sopenharmony_ci return madeChanges; 47cb93a386Sopenharmony_ci} 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci} // namespace SkSL 50