1*496f9a7dSJeff Niu //===- SymbolTableAnalysis.h - Analysis for cached symbol tables --*- C++ -*-=// 2*496f9a7dSJeff Niu // 3*496f9a7dSJeff Niu // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*496f9a7dSJeff Niu // See https://llvm.org/LICENSE.txt for license information. 5*496f9a7dSJeff Niu // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*496f9a7dSJeff Niu // 7*496f9a7dSJeff Niu //===----------------------------------------------------------------------===// 8*496f9a7dSJeff Niu 9*496f9a7dSJeff Niu #ifndef MLIR_ANALYSIS_SYMBOLTABLEANALYSIS_H 10*496f9a7dSJeff Niu #define MLIR_ANALYSIS_SYMBOLTABLEANALYSIS_H 11*496f9a7dSJeff Niu 12*496f9a7dSJeff Niu #include "mlir/IR/SymbolTable.h" 13*496f9a7dSJeff Niu #include "mlir/Pass/AnalysisManager.h" 14*496f9a7dSJeff Niu 15*496f9a7dSJeff Niu namespace mlir { 16*496f9a7dSJeff Niu /// This is a simple analysis that contains a symbol table collection and, for 17*496f9a7dSJeff Niu /// simplicity, a reference to the top-level symbol table. This allows symbol 18*496f9a7dSJeff Niu /// tables to be preserved across passes. Most often, symbol tables are 19*496f9a7dSJeff Niu /// automatically kept up-to-date via the `insert` and `erase` functions. 20*496f9a7dSJeff Niu class SymbolTableAnalysis { 21*496f9a7dSJeff Niu public: 22*496f9a7dSJeff Niu /// Create the symbol table analysis at the provided top-level operation and 23*496f9a7dSJeff Niu /// instantiate the symbol table of the top-level operation. SymbolTableAnalysis(Operation * op)24*496f9a7dSJeff Niu SymbolTableAnalysis(Operation *op) 25*496f9a7dSJeff Niu : topLevelSymbolTable(symbolTables.getSymbolTable(op)) {} 26*496f9a7dSJeff Niu 27*496f9a7dSJeff Niu /// Get the symbol table collection. getSymbolTables()28*496f9a7dSJeff Niu SymbolTableCollection &getSymbolTables() { return symbolTables; } 29*496f9a7dSJeff Niu 30*496f9a7dSJeff Niu /// Get the top-level symbol table. getTopLevelSymbolTable()31*496f9a7dSJeff Niu SymbolTable &getTopLevelSymbolTable() { return topLevelSymbolTable; } 32*496f9a7dSJeff Niu 33*496f9a7dSJeff Niu /// Get the top-level operation. 34*496f9a7dSJeff Niu template <typename OpT> getTopLevelOp()35*496f9a7dSJeff Niu OpT getTopLevelOp() { 36*496f9a7dSJeff Niu return cast<OpT>(topLevelSymbolTable.getOp()); 37*496f9a7dSJeff Niu } 38*496f9a7dSJeff Niu 39*496f9a7dSJeff Niu /// Symbol tables are kept up-to-date by passes. Assume that the analysis 40*496f9a7dSJeff Niu /// remains valid. isInvalidated(const AnalysisManager::PreservedAnalyses & pa)41*496f9a7dSJeff Niu bool isInvalidated(const AnalysisManager::PreservedAnalyses &pa) { 42*496f9a7dSJeff Niu return false; 43*496f9a7dSJeff Niu } 44*496f9a7dSJeff Niu 45*496f9a7dSJeff Niu private: 46*496f9a7dSJeff Niu /// The symbol table collection containing cached symbol tables for all nested 47*496f9a7dSJeff Niu /// symbol table operations. 48*496f9a7dSJeff Niu SymbolTableCollection symbolTables; 49*496f9a7dSJeff Niu /// The symbol table of the top-level operation. 50*496f9a7dSJeff Niu SymbolTable &topLevelSymbolTable; 51*496f9a7dSJeff Niu }; 52*496f9a7dSJeff Niu } // namespace mlir 53*496f9a7dSJeff Niu 54*496f9a7dSJeff Niu #endif // MLIR_ANALYSIS_SYMBOLTABLEANALYSIS_H 55