40 LLVM::LLVMDialect::getTargetAttrName());
42 op->
emitError() <<
"no LLVM::TargetAttr attribute at key \""
43 << LLVM::LLVMDialect::getTargetAttrName() <<
"\"";
47 FailureOr<std::unique_ptr<llvm::TargetMachine>> targetMachine =
49 if (failed(targetMachine)) {
50 op->
emitError() <<
"failed to obtain llvm::TargetMachine for "
55 llvm::MCSubtargetInfo
const *subTargetInfo =
56 (*targetMachine)->getMCSubtargetInfo();
58 const std::vector<llvm::SubtargetFeatureKV> enabledFeatures =
59 subTargetInfo->getEnabledProcessorFeatures();
61 auto plussedFeatures = llvm::to_vector(
62 llvm::map_range(enabledFeatures, [](llvm::SubtargetFeatureKV feature) {
63 return std::string(
"+") + feature.Key;
66 auto plussedFeaturesRefs = llvm::to_vector(llvm::map_range(
67 plussedFeatures, [](
auto &it) {
return StringRef(it.c_str()); }));
69 auto fullTargetFeaturesAttr =
70 LLVM::TargetFeaturesAttr::get(&
getContext(), plussedFeaturesRefs);
72 auto updatedTargetAttr =
73 LLVM::TargetAttr::get(&
getContext(), targetAttr.getTriple(),
74 targetAttr.getChip(), fullTargetFeaturesAttr);
76 op->
setAttr(LLVM::LLVMDialect::getTargetAttrName(), updatedTargetAttr);