--- /dev/null
+//===- SymbolTableAnalysis.h - Analysis for cached symbol tables --*- C++ -*-=//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef MLIR_ANALYSIS_SYMBOLTABLEANALYSIS_H
+#define MLIR_ANALYSIS_SYMBOLTABLEANALYSIS_H
+
+#include "mlir/IR/SymbolTable.h"
+#include "mlir/Pass/AnalysisManager.h"
+
+namespace mlir {
+/// This is a simple analysis that contains a symbol table collection and, for
+/// simplicity, a reference to the top-level symbol table. This allows symbol
+/// tables to be preserved across passes. Most often, symbol tables are
+/// automatically kept up-to-date via the `insert` and `erase` functions.
+class SymbolTableAnalysis {
+public:
+ /// Create the symbol table analysis at the provided top-level operation and
+ /// instantiate the symbol table of the top-level operation.
+ SymbolTableAnalysis(Operation *op)
+ : topLevelSymbolTable(symbolTables.getSymbolTable(op)) {}
+
+ /// Get the symbol table collection.
+ SymbolTableCollection &getSymbolTables() { return symbolTables; }
+
+ /// Get the top-level symbol table.
+ SymbolTable &getTopLevelSymbolTable() { return topLevelSymbolTable; }
+
+ /// Get the top-level operation.
+ template <typename OpT>
+ OpT getTopLevelOp() {
+ return cast<OpT>(topLevelSymbolTable.getOp());
+ }
+
+ /// Symbol tables are kept up-to-date by passes. Assume that the analysis
+ /// remains valid.
+ bool isInvalidated(const AnalysisManager::PreservedAnalyses &pa) {
+ return false;
+ }
+
+private:
+ /// The symbol table collection containing cached symbol tables for all nested
+ /// symbol table operations.
+ SymbolTableCollection symbolTables;
+ /// The symbol table of the top-level operation.
+ SymbolTable &topLevelSymbolTable;
+};
+} // namespace mlir
+
+#endif // MLIR_ANALYSIS_SYMBOLTABLEANALYSIS_H