63 lines · cpp
1//===- TargetToDataLayout.cpp - extract data layout from TargetMachine ----===//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/Target/LLVMIR/Transforms/Passes.h"10#include "mlir/Target/LLVMIR/Transforms/TargetUtils.h"11 12#include "mlir/Dialect/DLTI/DLTI.h"13#include "mlir/Dialect/LLVMIR/LLVMDialect.h"14#include "mlir/Target/LLVMIR/Import.h"15 16namespace mlir {17namespace LLVM {18#define GEN_PASS_DEF_LLVMTARGETTODATALAYOUT19#include "mlir/Target/LLVMIR/Transforms/Passes.h.inc"20} // namespace LLVM21} // namespace mlir22 23using namespace mlir;24 25struct TargetToDataLayoutPass26 : public LLVM::impl::LLVMTargetToDataLayoutBase<TargetToDataLayoutPass> {27 using LLVM::impl::LLVMTargetToDataLayoutBase<28 TargetToDataLayoutPass>::LLVMTargetToDataLayoutBase;29 30 void runOnOperation() override {31 Operation *op = getOperation();32 33 if (initializeLLVMTargets)34 LLVM::detail::initializeBackendsOnce();35 36 auto targetAttr = op->getAttrOfType<LLVM::TargetAttrInterface>(37 LLVM::LLVMDialect::getTargetAttrName());38 if (!targetAttr) {39 op->emitError()40 << "no TargetAttrInterface-implementing attribute at key \""41 << LLVM::LLVMDialect::getTargetAttrName() << "\"";42 return signalPassFailure();43 }44 45 FailureOr<llvm::DataLayout> dataLayout =46 LLVM::detail::getDataLayout(targetAttr);47 if (failed(dataLayout)) {48 op->emitError() << "failed to obtain llvm::DataLayout for " << targetAttr;49 return signalPassFailure();50 }51 52 DataLayoutSpecInterface dataLayoutSpec =53 mlir::translateDataLayout(dataLayout.value(), &getContext());54 55 if (auto existingDlSpec = op->getAttrOfType<DataLayoutSpecInterface>(56 DLTIDialect::kDataLayoutAttrName)) {57 dataLayoutSpec = existingDlSpec.combineWith({dataLayoutSpec});58 }59 60 op->setAttr(DLTIDialect::kDataLayoutAttrName, dataLayoutSpec);61 }62};63