10bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 20bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// 30bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Licensed under the Apache License, Version 2.0 (the "License"); 40bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// you may not use this file except in compliance with the License. 50bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// You may obtain a copy of the License at 60bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// 70bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// http://www.apache.org/licenses/LICENSE-2.0 80bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// 90bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Unless required by applicable law or agreed to in writing, software 100bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// distributed under the License is distributed on an "AS IS" BASIS, 110bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 120bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// See the License for the specific language governing permissions and 130bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// limitations under the License. 140bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 150bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#ifndef COMPILER_ANALYZE_CALL_DEPTH_H_ 160bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#define COMPILER_ANALYZE_CALL_DEPTH_H_ 170bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 180bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include "intermediate.h" 190bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 200bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include <set> 210bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#include <limits.h> 220bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 230bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens// Traverses intermediate tree to analyze call depth or detect function recursion 240bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensclass AnalyzeCallDepth : public TIntermTraverser 250bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens{ 260bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capenspublic: 270bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens AnalyzeCallDepth(TIntermNode *root); 280bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens ~AnalyzeCallDepth(); 290bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 301fb04acc3fb3cbcbe4791b5a37930e332e8af4e3Lingfeng Yang virtual bool visitSwitch(Visit, TIntermSwitch*); 310bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens virtual bool visitAggregate(Visit, TIntermAggregate*); 320bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 330bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int analyzeCallDepth(); 340bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 350bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capensprivate: 360bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens class FunctionNode 370bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens { 380bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens public: 390bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens FunctionNode(TIntermAggregate *node); 400bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 410bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens const TString &getName() const; 420bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens void addCallee(FunctionNode *callee); 430bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int analyzeCallDepth(AnalyzeCallDepth *analyzeCallDepth); 440bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int getLastDepth() const; 450bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 460bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens void removeIfUnreachable(); 470bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 480bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens private: 490bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TIntermAggregate *const node; 500bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens TVector<FunctionNode*> callees; 510bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 520bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens Visit visit; 530bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens unsigned int callDepth; 540bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens }; 550bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 560bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens FunctionNode *findFunctionByName(const TString &name); 570bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 580bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens std::vector<FunctionNode*> functions; 590bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens typedef std::set<FunctionNode*> FunctionSet; 600bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens FunctionSet globalFunctionCalls; 610bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens FunctionNode *currentFunction; 620bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens}; 630bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens 640bac285a78df6a6d7a6b68784748b92805420ffbNicolas Capens#endif // COMPILER_ANALYZE_CALL_DEPTH_H_ 65