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) {

194 return A.Kind < B.Kind;

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.