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