188c52523SJacques Pienaar //===- SymbolPrivatize.cpp - Pass to mark symbols private -----------------===// 288c52523SJacques Pienaar // 388c52523SJacques Pienaar // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 488c52523SJacques Pienaar // See https://llvm.org/LICENSE.txt for license information. 588c52523SJacques Pienaar // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 688c52523SJacques Pienaar // 788c52523SJacques Pienaar //===----------------------------------------------------------------------===// 888c52523SJacques Pienaar // 988c52523SJacques Pienaar // This file implements an pass that marks all symbols as private unless 1088c52523SJacques Pienaar // excluded. 1188c52523SJacques Pienaar // 1288c52523SJacques Pienaar //===----------------------------------------------------------------------===// 1388c52523SJacques Pienaar 14039b969bSMichele Scuttari #include "mlir/Transforms/Passes.h" 152be8af8fSMichele Scuttari 16*67d0d7acSMichele Scuttari #include "mlir/IR/SymbolTable.h" 17*67d0d7acSMichele Scuttari 18*67d0d7acSMichele Scuttari namespace mlir { 19*67d0d7acSMichele Scuttari #define GEN_PASS_DEF_SYMBOLPRIVATIZE 20*67d0d7acSMichele Scuttari #include "mlir/Transforms/Passes.h.inc" 21*67d0d7acSMichele Scuttari } // namespace mlir 22*67d0d7acSMichele Scuttari 2388c52523SJacques Pienaar using namespace mlir; 2488c52523SJacques Pienaar 2588c52523SJacques Pienaar namespace { 26*67d0d7acSMichele Scuttari struct SymbolPrivatize : public impl::SymbolPrivatizeBase<SymbolPrivatize> { 27039b969bSMichele Scuttari explicit SymbolPrivatize(ArrayRef<std::string> excludeSymbols); 2888c52523SJacques Pienaar LogicalResult initialize(MLIRContext *context) override; 2988c52523SJacques Pienaar void runOnOperation() override; 3088c52523SJacques Pienaar 3188c52523SJacques Pienaar /// Symbols whose visibility won't be changed. 3288c52523SJacques Pienaar DenseSet<StringAttr> excludedSymbols; 3388c52523SJacques Pienaar }; 3488c52523SJacques Pienaar } // namespace 3588c52523SJacques Pienaar SymbolPrivatize(llvm::ArrayRef<std::string> excludeSymbols)36039b969bSMichele ScuttariSymbolPrivatize::SymbolPrivatize(llvm::ArrayRef<std::string> excludeSymbols) { 3788c52523SJacques Pienaar exclude = excludeSymbols; 3888c52523SJacques Pienaar } 3988c52523SJacques Pienaar initialize(MLIRContext * context)40039b969bSMichele ScuttariLogicalResult SymbolPrivatize::initialize(MLIRContext *context) { 4188c52523SJacques Pienaar for (const std::string &symbol : exclude) 4288c52523SJacques Pienaar excludedSymbols.insert(StringAttr::get(context, symbol)); 4388c52523SJacques Pienaar return success(); 4488c52523SJacques Pienaar } 4588c52523SJacques Pienaar runOnOperation()46039b969bSMichele Scuttarivoid SymbolPrivatize::runOnOperation() { 4788c52523SJacques Pienaar for (Region ®ion : getOperation()->getRegions()) { 4888c52523SJacques Pienaar for (Block &block : region) { 4988c52523SJacques Pienaar for (Operation &op : block) { 5088c52523SJacques Pienaar auto symbol = dyn_cast<SymbolOpInterface>(op); 5188c52523SJacques Pienaar if (!symbol) 5288c52523SJacques Pienaar continue; 5388c52523SJacques Pienaar if (!excludedSymbols.contains(symbol.getNameAttr())) 5488c52523SJacques Pienaar symbol.setVisibility(SymbolTable::Visibility::Private); 5588c52523SJacques Pienaar } 5688c52523SJacques Pienaar } 5788c52523SJacques Pienaar } 5888c52523SJacques Pienaar } 5988c52523SJacques Pienaar 6088c52523SJacques Pienaar std::unique_ptr<Pass> createSymbolPrivatizePass(ArrayRef<std::string> exclude)6188c52523SJacques Pienaarmlir::createSymbolPrivatizePass(ArrayRef<std::string> exclude) { 62039b969bSMichele Scuttari return std::make_unique<SymbolPrivatize>(exclude); 6388c52523SJacques Pienaar } 64