Edit

kc3-lang/angle/src/compiler/translator/CallDAG.h

Branch :

  • Show log

    Commit

  • Author : Stuart Morgan
    Date : 2019-08-14 12:25:12
    Hash : 9d737966
    Message : Standardize copyright notices to project style For all "ANGLE Project" copyrights, standardize to the format specified by the style guide. Changes: - "Copyright (c)" and "Copyright(c)" changed to just "Copyright". - Removed the second half of date ranges ("Y1Y1-Y2Y2"->"Y1Y1"). - Fixed a small number of files that had no copyright date using the initial commit year from the version control history. - Fixed one instance of copyright being "The ANGLE Project" rather than "The ANGLE Project Authors" These changes are applied both to the copyright of source file, and where applicable to copyright statements that are generated by templates. BUG=angleproject:3811 Change-Id: I973dd65e4ef9deeba232d5be74c768256a0eb2e5 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1754397 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org>

  • src/compiler/translator/CallDAG.h
  • //
    // Copyright 2002 The ANGLE Project Authors. All rights reserved.
    // Use of this source code is governed by a BSD-style license that can be
    // found in the LICENSE file.
    //
    
    // CallDAG.h: Defines a call graph DAG of functions to be re-used accross
    // analyses, allows to efficiently traverse the functions in topological
    // order.
    
    #ifndef COMPILER_TRANSLATOR_CALLDAG_H_
    #define COMPILER_TRANSLATOR_CALLDAG_H_
    
    #include <map>
    
    #include "compiler/translator/IntermNode.h"
    
    namespace sh
    {
    
    // The translator needs to analyze the the graph of the function calls
    // to run checks and analyses; since in GLSL recursion is not allowed
    // that graph is a DAG.
    // This class is used to precompute that function call DAG so that it
    // can be reused by multiple analyses.
    //
    // It stores a vector of function records, with one record per defined function.
    // Records are accessed by index but a function symbol id can be converted
    // to the index of the corresponding record. The records contain the AST node
    // of the function definition and the indices of the function's callees.
    //
    // In addition, records are in reverse topological order: a function F being
    // called by a function G will have index index(F) < index(G), that way
    // depth-first analysis becomes analysis in the order of indices.
    
    class CallDAG : angle::NonCopyable
    {
      public:
        CallDAG();
        ~CallDAG();
    
        struct Record
        {
            TIntermFunctionDefinition *node;  // Guaranteed to be non-null.
            std::vector<int> callees;
        };
    
        enum InitResult
        {
            INITDAG_SUCCESS,
            INITDAG_RECURSION,
            INITDAG_UNDEFINED,
        };
    
        // Returns INITDAG_SUCCESS if it was able to create the DAG, otherwise prints
        // the initialization error in diagnostics, if present.
        InitResult init(TIntermNode *root, TDiagnostics *diagnostics);
    
        // Returns InvalidIndex if the function wasn't found
        size_t findIndex(const TSymbolUniqueId &id) const;
    
        const Record &getRecordFromIndex(size_t index) const;
        size_t size() const;
        void clear();
    
        const static size_t InvalidIndex;
    
      private:
        std::vector<Record> mRecords;
        std::map<int, int> mFunctionIdToIndex;
    
        class CallDAGCreator;
    };
    
    }  // namespace sh
    
    #endif  // COMPILER_TRANSLATOR_CALLDAG_H_