xref: /llvm-project/mlir/include/mlir/Analysis/SymbolTableAnalysis.h (revision 496f9a7d8d4b61b6f5dfa21e2614043a2b27cf67)
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