//===- ModuleCombiner.cpp - MLIR SPIR-V Module Combiner ---------*- 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 // //===----------------------------------------------------------------------===// // // This file implements the SPIR-V module combiner library. // //===----------------------------------------------------------------------===// #include "mlir/Dialect/SPIRV/Linking/ModuleCombiner.h" #include "mlir/Dialect/SPIRV/IR/SPIRVAttributes.h" #include "mlir/Dialect/SPIRV/IR/SPIRVDialect.h" #include "mlir/Dialect/SPIRV/IR/SPIRVOps.h" #include "mlir/IR/Attributes.h" #include "mlir/IR/Builders.h" #include "mlir/IR/SymbolTable.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/Hashing.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringMap.h" usingnamespacemlir; static constexpr unsigned maxFreeID = …; /// Returns an unused symbol in `module` for `oldSymbolName` by trying numeric /// suffix in `lastUsedID`. static StringAttr renameSymbol(StringRef oldSymName, unsigned &lastUsedID, spirv::ModuleOp module) { … } /// Checks if a symbol with the same name as `op` already exists in `source`. /// If so, renames `op` and updates all its references in `target`. static LogicalResult updateSymbolAndAllUses(SymbolOpInterface op, spirv::ModuleOp target, spirv::ModuleOp source, unsigned &lastUsedID) { … } /// Computes a hash code to represent `symbolOp` based on all its attributes /// except for the symbol name. /// /// Note: We use the operation's name (not the symbol name) as part of the hash /// computation. This prevents, for example, mistakenly considering a global /// variable and a spec constant as duplicates because their descriptor set + /// binding and spec_id, respectively, happen to hash to the same value. static llvm::hash_code computeHash(SymbolOpInterface symbolOp) { … } namespace mlir { namespace spirv { OwningOpRef<spirv::ModuleOp> combine(ArrayRef<spirv::ModuleOp> inputModules, OpBuilder &combinedModuleBuilder, SymbolRenameListener symRenameListener) { … } } // namespace spirv } // namespace mlir