brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 1fb482b Raw
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