1*88c52523SJacques Pienaar //===- SymbolPrivatize.cpp - Pass to mark symbols private -----------------===//
2*88c52523SJacques Pienaar //
3*88c52523SJacques Pienaar // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*88c52523SJacques Pienaar // See https://llvm.org/LICENSE.txt for license information.
5*88c52523SJacques Pienaar // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*88c52523SJacques Pienaar //
7*88c52523SJacques Pienaar //===----------------------------------------------------------------------===//
8*88c52523SJacques Pienaar //
9*88c52523SJacques Pienaar // This file implements an pass that marks all symbols as private unless
10*88c52523SJacques Pienaar // excluded.
11*88c52523SJacques Pienaar //
12*88c52523SJacques Pienaar //===----------------------------------------------------------------------===//
13*88c52523SJacques Pienaar 
14*88c52523SJacques Pienaar #include "PassDetail.h"
15*88c52523SJacques Pienaar #include "mlir/IR/SymbolTable.h"
16*88c52523SJacques Pienaar #include "mlir/Transforms/Passes.h"
17*88c52523SJacques Pienaar 
18*88c52523SJacques Pienaar using namespace mlir;
19*88c52523SJacques Pienaar 
20*88c52523SJacques Pienaar namespace {
21*88c52523SJacques Pienaar struct SymbolPrivatize : public SymbolPrivatizeBase<SymbolPrivatize> {
22*88c52523SJacques Pienaar   explicit SymbolPrivatize(ArrayRef<std::string> excludeSymbols);
23*88c52523SJacques Pienaar   LogicalResult initialize(MLIRContext *context) override;
24*88c52523SJacques Pienaar   void runOnOperation() override;
25*88c52523SJacques Pienaar 
26*88c52523SJacques Pienaar   /// Symbols whose visibility won't be changed.
27*88c52523SJacques Pienaar   DenseSet<StringAttr> excludedSymbols;
28*88c52523SJacques Pienaar };
29*88c52523SJacques Pienaar } // namespace
30*88c52523SJacques Pienaar 
SymbolPrivatize(llvm::ArrayRef<std::string> excludeSymbols)31*88c52523SJacques Pienaar SymbolPrivatize::SymbolPrivatize(llvm::ArrayRef<std::string> excludeSymbols) {
32*88c52523SJacques Pienaar   exclude = excludeSymbols;
33*88c52523SJacques Pienaar }
34*88c52523SJacques Pienaar 
initialize(MLIRContext * context)35*88c52523SJacques Pienaar LogicalResult SymbolPrivatize::initialize(MLIRContext *context) {
36*88c52523SJacques Pienaar   for (const std::string &symbol : exclude)
37*88c52523SJacques Pienaar     excludedSymbols.insert(StringAttr::get(context, symbol));
38*88c52523SJacques Pienaar   return success();
39*88c52523SJacques Pienaar }
40*88c52523SJacques Pienaar 
runOnOperation()41*88c52523SJacques Pienaar void SymbolPrivatize::runOnOperation() {
42*88c52523SJacques Pienaar   for (Region &region : getOperation()->getRegions()) {
43*88c52523SJacques Pienaar     for (Block &block : region) {
44*88c52523SJacques Pienaar       for (Operation &op : block) {
45*88c52523SJacques Pienaar         auto symbol = dyn_cast<SymbolOpInterface>(op);
46*88c52523SJacques Pienaar         if (!symbol)
47*88c52523SJacques Pienaar           continue;
48*88c52523SJacques Pienaar         if (!excludedSymbols.contains(symbol.getNameAttr()))
49*88c52523SJacques Pienaar           symbol.setVisibility(SymbolTable::Visibility::Private);
50*88c52523SJacques Pienaar       }
51*88c52523SJacques Pienaar     }
52*88c52523SJacques Pienaar   }
53*88c52523SJacques Pienaar }
54*88c52523SJacques Pienaar 
55*88c52523SJacques Pienaar std::unique_ptr<Pass>
createSymbolPrivatizePass(ArrayRef<std::string> exclude)56*88c52523SJacques Pienaar mlir::createSymbolPrivatizePass(ArrayRef<std::string> exclude) {
57*88c52523SJacques Pienaar   return std::make_unique<SymbolPrivatize>(exclude);
58*88c52523SJacques Pienaar }
59