//===- TargetToTargetFeatures.cpp - extract features 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" #include "llvm/MC/MCSubtargetInfo.h" namespace mlir { namespace LLVM { #define GEN_PASS_DEF_LLVMTARGETTOTARGETFEATURES #include "mlir/Target/LLVMIR/Transforms/Passes.h.inc" } // namespace LLVM } // namespace mlir using namespace mlir; struct TargetToTargetFeaturesPass : public LLVM::impl::LLVMTargetToTargetFeaturesBase< TargetToTargetFeaturesPass> { using LLVM::impl::LLVMTargetToTargetFeaturesBase< TargetToTargetFeaturesPass>::LLVMTargetToTargetFeaturesBase; void runOnOperation() override { Operation *op = getOperation(); if (initializeLLVMTargets) LLVM::detail::initializeBackendsOnce(); auto targetAttr = op->getAttrOfType( LLVM::LLVMDialect::getTargetAttrName()); if (!targetAttr) { op->emitError() << "no LLVM::TargetAttr attribute at key \"" << LLVM::LLVMDialect::getTargetAttrName() << "\""; return signalPassFailure(); } FailureOr> targetMachine = LLVM::detail::getTargetMachine(targetAttr); if (failed(targetMachine)) { op->emitError() << "failed to obtain llvm::TargetMachine for " << targetAttr; return signalPassFailure(); } llvm::MCSubtargetInfo const *subTargetInfo = (*targetMachine)->getMCSubtargetInfo(); const std::vector enabledFeatures = subTargetInfo->getEnabledProcessorFeatures(); auto plussedFeatures = llvm::to_vector( llvm::map_range(enabledFeatures, [](llvm::SubtargetFeatureKV feature) { return std::string("+") + feature.Key; })); auto plussedFeaturesRefs = llvm::to_vector(llvm::map_range( plussedFeatures, [](auto &it) { return StringRef(it.c_str()); })); auto fullTargetFeaturesAttr = LLVM::TargetFeaturesAttr::get(&getContext(), plussedFeaturesRefs); auto updatedTargetAttr = LLVM::TargetAttr::get(&getContext(), targetAttr.getTriple(), targetAttr.getChip(), fullTargetFeaturesAttr); op->setAttr(LLVM::LLVMDialect::getTargetAttrName(), updatedTargetAttr); } };