//===- TargetUtils.cpp - utils for obtaining generic target backend info --===// // // 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/Dialect/DLTI/DLTI.h" #include "mlir/Dialect/LLVMIR/LLVMDialect.h" #include "mlir/Target/LLVMIR/Import.h" #include "llvm/MC/TargetRegistry.h" #include "llvm/Support/DebugLog.h" #include "llvm/Support/TargetSelect.h" #include "llvm/Target/TargetMachine.h" #define DEBUG_TYPE "mlir-llvm-target-utils" namespace mlir { namespace LLVM { namespace detail { void initializeBackendsOnce() { static const auto initOnce = [] { // Ensure that the targets, that LLVM has been configured to support, // are loaded into the TargetRegistry. llvm::InitializeAllTargets(); llvm::InitializeAllTargetMCs(); return true; }(); (void)initOnce; // Dummy usage. } FailureOr> getTargetMachine(mlir::LLVM::TargetAttrInterface attr) { StringRef triple = attr.getTriple(); StringRef chipAKAcpu = attr.getChip(); // NB: `TargetAttrInterface::getFeatures()` is coarsely typed to work around // cyclic dependency issue in tablegen files. auto featuresAttr = llvm::cast_if_present(attr.getFeatures()); std::string features = featuresAttr ? featuresAttr.getFeaturesString() : ""; std::string error; const llvm::Target *target = llvm::TargetRegistry::lookupTarget(triple, error); if (!target || !error.empty()) { LDBG() << "Looking up target '" << triple << "' failed: " << error << "\n"; return failure(); } return std::unique_ptr(target->createTargetMachine( llvm::Triple(triple), chipAKAcpu, features, {}, {})); } FailureOr getDataLayout(mlir::LLVM::TargetAttrInterface attr) { FailureOr> targetMachine = getTargetMachine(attr); if (failed(targetMachine)) { LDBG() << "Failed to retrieve the target machine for data layout.\n"; return failure(); } return (targetMachine.value())->createDataLayout(); } } // namespace detail } // namespace LLVM } // namespace mlir