LLVM: lib/TargetParser/TargetParser.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
17
18using namespace llvm;
19using namespace AMDGPU;
20
21
24
26
28 return nullptr;
29
30 return F;
31}
32
33
36
37
38 Bits |= Implies;
39 for (const auto &FE : FeatureTable)
40 if (Implies.test(FE.Value))
41 setImpliedBits(Bits, FE.Implies.getAsBitset(), FeatureTable);
42}
43
47 if (CPU.empty())
48 return std::nullopt;
49
51 if (!CPUEntry)
52 return std::nullopt;
53
54
58
59 [[maybe_unused]] unsigned BitSize = Bits.size();
61 assert(FE.Value < BitSize && "Target Feature is out of range");
62 if (Bits[FE.Value])
63 DefaultFeatures[FE.Key] = true;
64 }
65 return DefaultFeatures;
66}
67
68namespace {
69
70struct GPUInfo {
74 unsigned Features;
75};
76
77constexpr GPUInfo R600GPUs[] = {
78
79
106};
107
108
109
110constexpr GPUInfo AMDGCNGPUs[] = {
111
112
113
179
186
187};
188
191
192 auto I =
193 llvm::lower_bound(Table, Search, [](const GPUInfo &A, const GPUInfo &B) {
195 });
196
197 if (I == Table.end() || I->Kind != Search.Kind)
198 return nullptr;
199 return I;
200}
201
202}
203
205 switch (AK) {
208 return "gfx9";
211 return "gfx10";
213 return "gfx11";
215 return "gfx12";
216 default: {
218 return ArchName.empty() ? "" : ArchName.drop_back(2);
219 }
220 }
221}
222
224 if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
225 return Entry->CanonicalName;
226 return "";
227}
228
230 if (const auto *Entry = getArchEntry(AK, R600GPUs))
231 return Entry->CanonicalName;
232 return "";
233}
234
236 for (const auto &C : AMDGCNGPUs) {
237 if (CPU == C.Name)
238 return C.Kind;
239 }
240
242}
243
245 for (const auto &C : R600GPUs) {
246 if (CPU == C.Name)
247 return C.Kind;
248 }
249
251}
252
254 if (const auto *Entry = getArchEntry(AK, AMDGCNGPUs))
255 return Entry->Features;
257}
258
260 if (const auto *Entry = getArchEntry(AK, R600GPUs))
261 return Entry->Features;
263}
264
266
267 for (const auto &C : AMDGCNGPUs)
269}
270
272 for (const auto &C : R600GPUs)
274}
275
279 if (GPU == "generic-hsa")
280 return {7, 0, 0};
281 if (GPU == "generic")
282 return {6, 0, 0};
283 return {0, 0, 0};
284 }
285
286
287 switch (AK) {
288 case GK_GFX600: return {6, 0, 0};
289 case GK_GFX601: return {6, 0, 1};
290 case GK_GFX602: return {6, 0, 2};
291 case GK_GFX700: return {7, 0, 0};
292 case GK_GFX701: return {7, 0, 1};
293 case GK_GFX702: return {7, 0, 2};
294 case GK_GFX703: return {7, 0, 3};
295 case GK_GFX704: return {7, 0, 4};
296 case GK_GFX705: return {7, 0, 5};
297 case GK_GFX801: return {8, 0, 1};
298 case GK_GFX802: return {8, 0, 2};
299 case GK_GFX803: return {8, 0, 3};
300 case GK_GFX805: return {8, 0, 5};
301 case GK_GFX810: return {8, 1, 0};
302 case GK_GFX900: return {9, 0, 0};
303 case GK_GFX902: return {9, 0, 2};
304 case GK_GFX904: return {9, 0, 4};
305 case GK_GFX906: return {9, 0, 6};
306 case GK_GFX908: return {9, 0, 8};
307 case GK_GFX909: return {9, 0, 9};
308 case GK_GFX90A: return {9, 0, 10};
309 case GK_GFX90C: return {9, 0, 12};
310 case GK_GFX942: return {9, 4, 2};
311 case GK_GFX950: return {9, 5, 0};
335
336
337
338
339
340
341
342
343
344
345
346
347
348
355 default: return {0, 0, 0};
356 }
357
358}
359
368
369static std::pair<FeatureError, StringRef>
373 const bool IsNullGPU = GPU.empty();
374 const bool TargetHasWave32 = DefaultFeatures.count("wavefrontsize32");
375 const bool TargetHasWave64 = DefaultFeatures.count("wavefrontsize64");
376 const bool HaveWave32 = Features.count("wavefrontsize32");
377 const bool HaveWave64 = Features.count("wavefrontsize64");
378 if (HaveWave32 && HaveWave64)
380 "'wavefrontsize32' and 'wavefrontsize64' are mutually exclusive"};
381
382 if (HaveWave32 && !IsNullGPU && TargetHasWave64)
384
385 if (HaveWave64 && !IsNullGPU && TargetHasWave32)
387
388
389
390 if (!IsNullGPU && !HaveWave32 && !HaveWave64 && !TargetHasWave32 &&
391 !TargetHasWave64)
392 Features.insert(std::make_pair("wavefrontsize32", true));
393
394 for (const auto &Entry : DefaultFeatures) {
395 if (!Features.count(Entry.getKey()))
396 Features[Entry.getKey()] = Entry.getValue();
397 }
398
400}
401
402
403
404
408 switch (Kind) {
411 Features["ci-insts"] = true;
412 Features["dot7-insts"] = true;
413 Features["dot8-insts"] = true;
414 Features["dl-insts"] = true;
415 Features["16-bit-insts"] = true;
416 Features["dpp"] = true;
417 Features["gfx8-insts"] = true;
418 Features["gfx9-insts"] = true;
419 Features["gfx10-insts"] = true;
420 Features["gfx10-3-insts"] = true;
421 Features["gfx11-insts"] = true;
422 Features["gfx12-insts"] = true;
423 Features["gfx1250-insts"] = true;
424 Features["bitop3-insts"] = true;
425 Features["prng-inst"] = true;
426 Features["tanh-insts"] = true;
427 Features["tensor-cvt-lut-insts"] = true;
428 Features["transpose-load-f4f6-insts"] = true;
429 Features["bf16-trans-insts"] = true;
430 Features["bf16-cvt-insts"] = true;
431 Features["bf16-pk-insts"] = true;
432 Features["fp8-conversion-insts"] = true;
433 Features["fp8e5m3-insts"] = true;
434 Features["permlane16-swap"] = true;
435 Features["ashr-pk-insts"] = true;
436 Features["add-min-max-insts"] = true;
437 Features["pk-add-min-max-insts"] = true;
438 Features["atomic-buffer-pk-add-bf16-inst"] = true;
439 Features["vmem-pref-insts"] = true;
440 Features["atomic-fadd-rtn-insts"] = true;
441 Features["atomic-buffer-global-pk-add-f16-insts"] = true;
442 Features["atomic-flat-pk-add-16-insts"] = true;
443 Features["atomic-global-pk-add-bf16-inst"] = true;
444 Features["atomic-ds-pk-add-16-insts"] = true;
445 Features["setprio-inc-wg-inst"] = true;
446 Features["atomic-fmin-fmax-global-f32"] = true;
447 Features["atomic-fmin-fmax-global-f64"] = true;
448 Features["wavefrontsize32"] = true;
449 Features["clusters"] = true;
450 Features["cube-insts"] = true;
451 Features["lerp-inst"] = true;
452 Features["sad-insts"] = true;
453 Features["qsad-insts"] = true;
454 Features["cvt-pknorm-vop2-insts"] = true;
455 break;
459 Features["ci-insts"] = true;
460 Features["dot7-insts"] = true;
461 Features["dot8-insts"] = true;
462 Features["dot9-insts"] = true;
463 Features["dot10-insts"] = true;
464 Features["dot11-insts"] = true;
465 Features["dot12-insts"] = true;
466 Features["dl-insts"] = true;
467 Features["atomic-ds-pk-add-16-insts"] = true;
468 Features["atomic-flat-pk-add-16-insts"] = true;
469 Features["atomic-buffer-global-pk-add-f16-insts"] = true;
470 Features["atomic-buffer-pk-add-bf16-inst"] = true;
471 Features["atomic-global-pk-add-bf16-inst"] = true;
472 Features["16-bit-insts"] = true;
473 Features["dpp"] = true;
474 Features["gfx8-insts"] = true;
475 Features["gfx9-insts"] = true;
476 Features["gfx10-insts"] = true;
477 Features["gfx10-3-insts"] = true;
478 Features["gfx11-insts"] = true;
479 Features["gfx12-insts"] = true;
480 Features["atomic-fadd-rtn-insts"] = true;
481 Features["image-insts"] = true;
482 Features["cube-insts"] = true;
483 Features["lerp-inst"] = true;
484 Features["sad-insts"] = true;
485 Features["qsad-insts"] = true;
486 Features["cvt-pknorm-vop2-insts"] = true;
487 Features["fp8-conversion-insts"] = true;
488 Features["atomic-fmin-fmax-global-f32"] = true;
489 break;
499 Features["ci-insts"] = true;
500 Features["dot5-insts"] = true;
501 Features["dot7-insts"] = true;
502 Features["dot8-insts"] = true;
503 Features["dot9-insts"] = true;
504 Features["dot10-insts"] = true;
505 Features["dot12-insts"] = true;
506 Features["dl-insts"] = true;
507 Features["16-bit-insts"] = true;
508 Features["dpp"] = true;
509 Features["gfx8-insts"] = true;
510 Features["gfx9-insts"] = true;
511 Features["gfx10-insts"] = true;
512 Features["gfx10-3-insts"] = true;
513 Features["gfx11-insts"] = true;
514 Features["atomic-fadd-rtn-insts"] = true;
515 Features["image-insts"] = true;
516 Features["cube-insts"] = true;
517 Features["lerp-inst"] = true;
518 Features["sad-insts"] = true;
519 Features["qsad-insts"] = true;
520 Features["cvt-pknorm-vop2-insts"] = true;
521 Features["gws"] = true;
522 Features["atomic-fmin-fmax-global-f32"] = true;
523 break;
532 Features["ci-insts"] = true;
533 Features["dot1-insts"] = true;
534 Features["dot2-insts"] = true;
535 Features["dot5-insts"] = true;
536 Features["dot6-insts"] = true;
537 Features["dot7-insts"] = true;
538 Features["dot10-insts"] = true;
539 Features["dl-insts"] = true;
540 Features["16-bit-insts"] = true;
541 Features["dpp"] = true;
542 Features["gfx8-insts"] = true;
543 Features["gfx9-insts"] = true;
544 Features["gfx10-insts"] = true;
545 Features["gfx10-3-insts"] = true;
546 Features["image-insts"] = true;
547 Features["s-memrealtime"] = true;
548 Features["s-memtime-inst"] = true;
549 Features["gws"] = true;
550 Features["vmem-to-lds-load-insts"] = true;
551 Features["atomic-fmin-fmax-global-f32"] = true;
552 Features["atomic-fmin-fmax-global-f64"] = true;
553 Features["cube-insts"] = true;
554 Features["lerp-inst"] = true;
555 Features["sad-insts"] = true;
556 Features["qsad-insts"] = true;
557 Features["cvt-pknorm-vop2-insts"] = true;
558 break;
561 Features["dot1-insts"] = true;
562 Features["dot2-insts"] = true;
563 Features["dot5-insts"] = true;
564 Features["dot6-insts"] = true;
565 Features["dot7-insts"] = true;
566 Features["dot10-insts"] = true;
567 [[fallthrough]];
571 Features["dl-insts"] = true;
572 Features["ci-insts"] = true;
573 Features["16-bit-insts"] = true;
574 Features["dpp"] = true;
575 Features["gfx8-insts"] = true;
576 Features["gfx9-insts"] = true;
577 Features["gfx10-insts"] = true;
578 Features["image-insts"] = true;
579 Features["s-memrealtime"] = true;
580 Features["s-memtime-inst"] = true;
581 Features["gws"] = true;
582 Features["vmem-to-lds-load-insts"] = true;
583 Features["atomic-fmin-fmax-global-f32"] = true;
584 Features["atomic-fmin-fmax-global-f64"] = true;
585 Features["cube-insts"] = true;
586 Features["lerp-inst"] = true;
587 Features["sad-insts"] = true;
588 Features["qsad-insts"] = true;
589 Features["cvt-pknorm-vop2-insts"] = true;
590 break;
592 Features["bitop3-insts"] = true;
593 Features["fp6bf6-cvt-scale-insts"] = true;
594 Features["fp4-cvt-scale-insts"] = true;
595 Features["bf8-cvt-scale-insts"] = true;
596 Features["fp8-cvt-scale-insts"] = true;
597 Features["f16bf16-to-fp6bf6-cvt-scale-insts"] = true;
598 Features["f32-to-f16bf16-cvt-sr-insts"] = true;
599 Features["prng-inst"] = true;
600 Features["permlane16-swap"] = true;
601 Features["permlane32-swap"] = true;
602 Features["ashr-pk-insts"] = true;
603 Features["dot12-insts"] = true;
604 Features["dot13-insts"] = true;
605 Features["atomic-buffer-pk-add-bf16-inst"] = true;
606 Features["gfx950-insts"] = true;
607 [[fallthrough]];
609 Features["fp8-insts"] = true;
610 Features["fp8-conversion-insts"] = true;
612 Features["xf32-insts"] = true;
613 [[fallthrough]];
615 Features["gfx940-insts"] = true;
616 Features["atomic-ds-pk-add-16-insts"] = true;
617 Features["atomic-flat-pk-add-16-insts"] = true;
618 Features["atomic-global-pk-add-bf16-inst"] = true;
619 Features["gfx90a-insts"] = true;
620 Features["atomic-buffer-global-pk-add-f16-insts"] = true;
621 Features["atomic-fadd-rtn-insts"] = true;
622 Features["dot3-insts"] = true;
623 Features["dot4-insts"] = true;
624 Features["dot5-insts"] = true;
625 Features["dot6-insts"] = true;
626 Features["mai-insts"] = true;
627 Features["dl-insts"] = true;
628 Features["dot1-insts"] = true;
629 Features["dot2-insts"] = true;
630 Features["dot7-insts"] = true;
631 Features["dot10-insts"] = true;
632 Features["gfx9-insts"] = true;
633 Features["gfx8-insts"] = true;
634 Features["16-bit-insts"] = true;
635 Features["dpp"] = true;
636 Features["s-memrealtime"] = true;
637 Features["ci-insts"] = true;
638 Features["s-memtime-inst"] = true;
639 Features["gws"] = true;
640 Features["vmem-to-lds-load-insts"] = true;
641 Features["atomic-fmin-fmax-global-f64"] = true;
642 Features["wavefrontsize64"] = true;
643 Features["cube-insts"] = true;
644 Features["lerp-inst"] = true;
645 Features["sad-insts"] = true;
646 Features["qsad-insts"] = true;
647 Features["cvt-pknorm-vop2-insts"] = true;
648 break;
650 Features["gfx90a-insts"] = true;
651 Features["atomic-buffer-global-pk-add-f16-insts"] = true;
652 Features["atomic-fadd-rtn-insts"] = true;
653 Features["atomic-fmin-fmax-global-f64"] = true;
654 [[fallthrough]];
656 Features["dot3-insts"] = true;
657 Features["dot4-insts"] = true;
658 Features["dot5-insts"] = true;
659 Features["dot6-insts"] = true;
660 Features["mai-insts"] = true;
661 [[fallthrough]];
663 Features["dl-insts"] = true;
664 Features["dot1-insts"] = true;
665 Features["dot2-insts"] = true;
666 Features["dot7-insts"] = true;
667 Features["dot10-insts"] = true;
668 [[fallthrough]];
675 Features["gfx9-insts"] = true;
676 Features["vmem-to-lds-load-insts"] = true;
677 [[fallthrough]];
683 Features["gfx8-insts"] = true;
684 Features["16-bit-insts"] = true;
685 Features["dpp"] = true;
686 Features["s-memrealtime"] = true;
687 Features["ci-insts"] = true;
688 Features["image-insts"] = true;
689 Features["s-memtime-inst"] = true;
690 Features["gws"] = true;
691 Features["wavefrontsize64"] = true;
692 Features["cube-insts"] = true;
693 Features["lerp-inst"] = true;
694 Features["sad-insts"] = true;
695 Features["qsad-insts"] = true;
696 Features["cvt-pknorm-vop2-insts"] = true;
697 break;
704 Features["ci-insts"] = true;
705 Features["cube-insts"] = true;
706 Features["lerp-inst"] = true;
707 Features["sad-insts"] = true;
708 Features["qsad-insts"] = true;
709 Features["cvt-pknorm-vop2-insts"] = true;
710 Features["image-insts"] = true;
711 Features["s-memtime-inst"] = true;
712 Features["gws"] = true;
713 Features["atomic-fmin-fmax-global-f32"] = true;
714 Features["atomic-fmin-fmax-global-f64"] = true;
715 Features["wavefrontsize64"] = true;
716 break;
720 Features["image-insts"] = true;
721 Features["s-memtime-inst"] = true;
722 Features["gws"] = true;
723 Features["atomic-fmin-fmax-global-f32"] = true;
724 Features["atomic-fmin-fmax-global-f64"] = true;
725 Features["wavefrontsize64"] = true;
726 Features["cube-insts"] = true;
727 Features["lerp-inst"] = true;
728 Features["sad-insts"] = true;
729 Features["cvt-pknorm-vop2-insts"] = true;
730 break;
732 break;
733 default:
735 }
736}
737
738
739
740
741std::pair<FeatureError, StringRef>
744
746
747
748
749 Features["16-bit-insts"] = true;
750 Features["ashr-pk-insts"] = true;
751 Features["atomic-buffer-pk-add-bf16-inst"] = true;
752 Features["atomic-buffer-global-pk-add-f16-insts"] = true;
753 Features["atomic-ds-pk-add-16-insts"] = true;
754 Features["atomic-fadd-rtn-insts"] = true;
755 Features["atomic-flat-pk-add-16-insts"] = true;
756 Features["atomic-global-pk-add-bf16-inst"] = true;
757 Features["bf16-trans-insts"] = true;
758 Features["bf16-cvt-insts"] = true;
759 Features["bf8-cvt-scale-insts"] = true;
760 Features["bitop3-insts"] = true;
761 Features["ci-insts"] = true;
762 Features["dl-insts"] = true;
763 Features["dot1-insts"] = true;
764 Features["dot2-insts"] = true;
765 Features["dot3-insts"] = true;
766 Features["dot4-insts"] = true;
767 Features["dot5-insts"] = true;
768 Features["dot6-insts"] = true;
769 Features["dot7-insts"] = true;
770 Features["dot8-insts"] = true;
771 Features["dot9-insts"] = true;
772 Features["dot10-insts"] = true;
773 Features["dot11-insts"] = true;
774 Features["dot12-insts"] = true;
775 Features["dot13-insts"] = true;
776 Features["dpp"] = true;
777 Features["f16bf16-to-fp6bf6-cvt-scale-insts"] = true;
778 Features["f32-to-f16bf16-cvt-sr-insts"] = true;
779 Features["fp4-cvt-scale-insts"] = true;
780 Features["fp6bf6-cvt-scale-insts"] = true;
781 Features["fp8e5m3-insts"] = true;
782 Features["fp8-conversion-insts"] = true;
783 Features["fp8-cvt-scale-insts"] = true;
784 Features["fp8-insts"] = true;
785 Features["gfx8-insts"] = true;
786 Features["gfx9-insts"] = true;
787 Features["gfx90a-insts"] = true;
788 Features["gfx940-insts"] = true;
789 Features["gfx950-insts"] = true;
790 Features["gfx10-insts"] = true;
791 Features["gfx10-3-insts"] = true;
792 Features["gfx11-insts"] = true;
793 Features["gfx12-insts"] = true;
794 Features["gfx1250-insts"] = true;
795 Features["gws"] = true;
796 Features["image-insts"] = true;
797 Features["mai-insts"] = true;
798 Features["permlane16-swap"] = true;
799 Features["permlane32-swap"] = true;
800 Features["prng-inst"] = true;
801 Features["setprio-inc-wg-inst"] = true;
802 Features["s-memrealtime"] = true;
803 Features["s-memtime-inst"] = true;
804 Features["tanh-insts"] = true;
805 Features["tensor-cvt-lut-insts"] = true;
806 Features["transpose-load-f4f6-insts"] = true;
807 Features["vmem-pref-insts"] = true;
808 Features["vmem-to-lds-load-insts"] = true;
809 Features["wavefrontsize32"] = true;
810 Features["wavefrontsize64"] = true;
811 } else if (T.isAMDGCN()) {
815 } else {
817 GPU = "r600";
818
824
825 break;
838 break;
839 default:
841 }
842 }
844}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static void fillAMDGCNFeatureMap(StringRef GPU, const Triple &T, StringMap< bool > &Features)
Fills Features map with default values for given target GPU.
Definition TargetParser.cpp:405
static void setImpliedBits(FeatureBitset &Bits, const FeatureBitset &Implies, ArrayRef< BasicSubtargetFeatureKV > FeatureTable)
For each feature that is (transitively) implied by this feature, set it.
Definition TargetParser.cpp:34
static std::pair< FeatureError, StringRef > insertWaveSizeFeature(StringRef GPU, const Triple &T, const StringMap< bool > &DefaultFeatures, StringMap< bool > &Features)
Definition TargetParser.cpp:370
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
const FeatureBitset & getAsBitset() const
Container class for subtarget features.
constexpr bool test(unsigned I) const
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
size_type count(StringRef Key) const
count - Return 1 if the element is in the map, 0 otherwise.
bool insert(MapEntryTy *KeyValue)
insert - Insert the specified key/value pair into the map.
StringRef - Represent a constant reference to a string, i.e.
constexpr bool empty() const
empty - Check if the string is empty.
StringRef drop_back(size_t N=1) const
Return a StringRef equal to 'this' but with the last N elements dropped.
Triple - Helper class for working with autoconf configuration names.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
LLVM_ABI StringRef getArchNameR600(GPUKind AK)
Definition TargetParser.cpp:229
GPUKind
GPU kinds supported by the AMDGPU target.
LLVM_ABI StringRef getCanonicalArchName(const Triple &T, StringRef Arch)
Definition TargetParser.cpp:360
LLVM_ABI void fillValidArchListR600(SmallVectorImpl< StringRef > &Values)
Definition TargetParser.cpp:271
LLVM_ABI StringRef getArchFamilyNameAMDGCN(GPUKind AK)
Definition TargetParser.cpp:204
LLVM_ABI IsaVersion getIsaVersion(StringRef GPU)
Definition TargetParser.cpp:276
LLVM_ABI void fillValidArchListAMDGCN(SmallVectorImpl< StringRef > &Values)
Definition TargetParser.cpp:265
LLVM_ABI GPUKind parseArchAMDGCN(StringRef CPU)
Definition TargetParser.cpp:235
@ UNSUPPORTED_TARGET_FEATURE
@ INVALID_FEATURE_COMBINATION
@ FEATURE_FAST_DENORMAL_F32
LLVM_ABI std::pair< FeatureError, StringRef > fillAMDGPUFeatureMap(StringRef GPU, const Triple &T, StringMap< bool > &Features)
Fills Features map with default values for given target GPU.
Definition TargetParser.cpp:742
LLVM_ABI StringRef getArchNameAMDGCN(GPUKind AK)
Definition TargetParser.cpp:223
LLVM_ABI unsigned getArchAttrAMDGCN(GPUKind AK)
Definition TargetParser.cpp:253
LLVM_ABI unsigned getArchAttrR600(GPUKind AK)
Definition TargetParser.cpp:259
LLVM_ABI GPUKind parseArchR600(StringRef CPU)
Definition TargetParser.cpp:244
@ C
The default llvm calling convention, compatible with C.
This is an optimization pass for GlobalISel generic memory operations.
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
auto lower_bound(R &&Range, T &&Value)
Provide wrappers to std::lower_bound which take ranges instead of having to pass begin/end explicitly...
LLVM_ABI std::optional< llvm::StringMap< bool > > getCPUDefaultTargetFeatures(StringRef CPU, ArrayRef< BasicSubtargetSubTypeKV > ProcDesc, ArrayRef< BasicSubtargetFeatureKV > ProcFeatures)
Definition TargetParser.cpp:44
Instruction set architecture version.
Used to provide key value pairs for feature and CPU bit flags.
FeatureBitArray Implies
K-V bit mask.