brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.1 KiB · 7d3170b Raw
62 lines · cpp
1//===- DIExpressionLegalization.cpp - DIExpression Legalization Patterns --===//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/DIExpressionLegalization.h"10 11#include "llvm/BinaryFormat/Dwarf.h"12 13using namespace mlir;14using namespace LLVM;15 16//===----------------------------------------------------------------------===//17// MergeFragments18//===----------------------------------------------------------------------===//19 20MergeFragments::OpIterT MergeFragments::match(OpIterRange operators) const {21  OpIterT it = operators.begin();22  if (it == operators.end() ||23      it->getOpcode() != llvm::dwarf::DW_OP_LLVM_fragment)24    return operators.begin();25 26  ++it;27  if (it == operators.end() ||28      it->getOpcode() != llvm::dwarf::DW_OP_LLVM_fragment)29    return operators.begin();30 31  return ++it;32}33 34SmallVector<MergeFragments::OperatorT>35MergeFragments::replace(OpIterRange operators) const {36  OpIterT it = operators.begin();37  OperatorT first = *(it++);38  OperatorT second = *it;39  // Add offsets & select the size of the earlier operator (the one closer to40  // the IR value).41  uint64_t offset = first.getArguments()[0] + second.getArguments()[0];42  uint64_t size = first.getArguments()[1];43  OperatorT newOp = OperatorT::get(44      first.getContext(), llvm::dwarf::DW_OP_LLVM_fragment, {offset, size});45  return SmallVector<OperatorT>{newOp};46}47 48//===----------------------------------------------------------------------===//49// Runner50//===----------------------------------------------------------------------===//51 52void mlir::LLVM::legalizeDIExpressionsRecursively(Operation *op) {53  LLVM::DIExpressionRewriter rewriter;54  rewriter.addPattern(std::make_unique<MergeFragments>());55 56  AttrTypeReplacer replacer;57  replacer.addReplacement([&rewriter](LLVM::DIExpressionAttr expr) {58    return rewriter.simplify(expr);59  });60  replacer.recursivelyReplaceElementsIn(op);61}62