41 LLVM::LLVMDialect::getTargetAttrName());
43 op->
emitError() <<
"no LLVM::TargetAttr attribute at key \""
44 << LLVM::LLVMDialect::getTargetAttrName() <<
"\"";
48 FailureOr<std::unique_ptr<llvm::TargetMachine>> targetMachine =
50 if (failed(targetMachine)) {
51 op->
emitError() <<
"failed to obtain llvm::TargetMachine for "
56 llvm::MCSubtargetInfo
const *subTargetInfo =
57 (*targetMachine)->getMCSubtargetInfo();
59 const std::vector<llvm::SubtargetFeatureKV> enabledFeatures =
60 subTargetInfo->getEnabledProcessorFeatures();
62 auto plussedFeatures = llvm::map_to_vector(
63 enabledFeatures, [](llvm::SubtargetFeatureKV feature) {
64 return std::string(
"+") + feature.Key;
67 auto plussedFeaturesRefs = llvm::map_to_vector(
68 plussedFeatures, [](
auto &it) {
return StringRef(it.c_str()); });
70 auto fullTargetFeaturesAttr =
71 LLVM::TargetFeaturesAttr::get(&
getContext(), plussedFeaturesRefs);
73 auto updatedTargetAttr =
74 LLVM::TargetAttr::get(&
getContext(), targetAttr.getTriple(),
75 targetAttr.getChip(), fullTargetFeaturesAttr);
77 op->
setAttr(LLVM::LLVMDialect::getTargetAttrName(), updatedTargetAttr);