//===- TargetToDataLayout.cpp - extract data layout from TargetMachine ----===// // // 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 // //===----------------------------------------------------------------------===// #include "mlir/Target/LLVMIR/Transforms/Passes.h" #include "mlir/Target/LLVMIR/Transforms/TargetUtils.h" #include "mlir/Dialect/DLTI/DLTI.h" #include "mlir/Dialect/LLVMIR/LLVMDialect.h" #include "mlir/Target/LLVMIR/Import.h" namespace mlir { namespace LLVM { #define GEN_PASS_DEF_LLVMTARGETTODATALAYOUT #include "mlir/Target/LLVMIR/Transforms/Passes.h.inc" } // namespace LLVM } // namespace mlir using namespace mlir; struct TargetToDataLayoutPass : public LLVM::impl::LLVMTargetToDataLayoutBase { using LLVM::impl::LLVMTargetToDataLayoutBase< TargetToDataLayoutPass>::LLVMTargetToDataLayoutBase; void runOnOperation() override { Operation *op = getOperation(); if (initializeLLVMTargets) LLVM::detail::initializeBackendsOnce(); auto targetAttr = op->getAttrOfType( LLVM::LLVMDialect::getTargetAttrName()); if (!targetAttr) { op->emitError() << "no TargetAttrInterface-implementing attribute at key \"" << LLVM::LLVMDialect::getTargetAttrName() << "\""; return signalPassFailure(); } FailureOr dataLayout = LLVM::detail::getDataLayout(targetAttr); if (failed(dataLayout)) { op->emitError() << "failed to obtain llvm::DataLayout for " << targetAttr; return signalPassFailure(); } DataLayoutSpecInterface dataLayoutSpec = mlir::translateDataLayout(dataLayout.value(), &getContext()); if (auto existingDlSpec = op->getAttrOfType( DLTIDialect::kDataLayoutAttrName)) { dataLayoutSpec = existingDlSpec.combineWith({dataLayoutSpec}); } op->setAttr(DLTIDialect::kDataLayoutAttrName, dataLayoutSpec); } };