66 lines · cpp
1//===- AddComdats.cpp - Add comdats to linkonce functions -----------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "mlir/Dialect/LLVMIR/Transforms/AddComdats.h"10#include "mlir/Dialect/LLVMIR/LLVMDialect.h"11#include "mlir/Pass/Pass.h"12 13namespace mlir {14namespace LLVM {15#define GEN_PASS_DEF_LLVMADDCOMDATS16#include "mlir/Dialect/LLVMIR/Transforms/Passes.h.inc"17} // namespace LLVM18} // namespace mlir19 20using namespace mlir;21 22static void addComdat(LLVM::LLVMFuncOp &op, OpBuilder &builder,23 SymbolTable &symbolTable, ModuleOp &module) {24 const char *comdatName = "__llvm_comdat";25 mlir::LLVM::ComdatOp comdatOp =26 symbolTable.lookup<mlir::LLVM::ComdatOp>(comdatName);27 if (!comdatOp) {28 PatternRewriter::InsertionGuard guard(builder);29 builder.setInsertionPointToStart(module.getBody());30 comdatOp =31 mlir::LLVM::ComdatOp::create(builder, module.getLoc(), comdatName);32 symbolTable.insert(comdatOp);33 }34 35 PatternRewriter::InsertionGuard guard(builder);36 builder.setInsertionPointToStart(&comdatOp.getBody().back());37 auto selectorOp = mlir::LLVM::ComdatSelectorOp::create(38 builder, comdatOp.getLoc(), op.getSymName(),39 mlir::LLVM::comdat::Comdat::Any);40 op.setComdatAttr(mlir::SymbolRefAttr::get(41 builder.getContext(), comdatName,42 mlir::FlatSymbolRefAttr::get(selectorOp.getSymNameAttr())));43}44 45namespace {46struct AddComdatsPass : public LLVM::impl::LLVMAddComdatsBase<AddComdatsPass> {47 void runOnOperation() override {48 OpBuilder builder{&getContext()};49 ModuleOp mod = getOperation();50 51 std::unique_ptr<SymbolTable> symbolTable;52 auto getSymTab = [&]() -> SymbolTable & {53 if (!symbolTable)54 symbolTable = std::make_unique<SymbolTable>(mod);55 return *symbolTable;56 };57 for (auto op : mod.getBody()->getOps<LLVM::LLVMFuncOp>()) {58 if (op.getLinkage() == LLVM::Linkage::Linkonce ||59 op.getLinkage() == LLVM::Linkage::LinkonceODR) {60 addComdat(op, builder, getSymTab(), mod);61 }62 }63 }64};65} // namespace66