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