Coverage Report

Created: 2026-09-14 06:12

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/keystone/llvm/lib/MC/MCSubtargetInfo.cpp
Line
Count
Source
1
//===-- MCSubtargetInfo.cpp - Subtarget Information -----------------------===//
2
//
3
//                     The LLVM Compiler Infrastructure
4
//
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
7
//
8
//===----------------------------------------------------------------------===//
9
10
#include "llvm/MC/MCSubtargetInfo.h"
11
#include "llvm/ADT/StringRef.h"
12
#include "llvm/ADT/Triple.h"
13
#include "llvm/MC/SubtargetFeature.h"
14
#include "llvm/Support/raw_ostream.h"
15
#include <algorithm>
16
17
using namespace llvm_ks;
18
19
static FeatureBitset getFeatures(StringRef CPU, StringRef FS,
20
                                 ArrayRef<SubtargetFeatureKV> ProcDesc,
21
426k
                                 ArrayRef<SubtargetFeatureKV> ProcFeatures) {
22
426k
  SubtargetFeatures Features(FS);
23
426k
  return Features.getFeatureBits(CPU, ProcDesc, ProcFeatures);
24
426k
}
25
26
260k
void MCSubtargetInfo::InitMCProcessorInfo(StringRef CPU, StringRef FS) {
27
260k
  FeatureBits = getFeatures(CPU, FS, ProcDesc, ProcFeatures);
28
260k
  if (!CPU.empty() && ProcSchedModels)
29
32.9k
      CPUSchedModel = &getSchedModelForCPU(CPU);
30
260k
}
31
32
165k
void MCSubtargetInfo::setDefaultFeatures(StringRef CPU, StringRef FS) {
33
165k
  FeatureBits = getFeatures(CPU, FS, ProcDesc, ProcFeatures);
34
165k
}
35
36
MCSubtargetInfo::MCSubtargetInfo(
37
    const Triple &TT, StringRef C, StringRef FS,
38
    ArrayRef<SubtargetFeatureKV> PF, ArrayRef<SubtargetFeatureKV> PD,
39
    const SubtargetInfoKV *ProcSched)
40
260k
    : TargetTriple(TT), CPU(C), ProcFeatures(PF), ProcDesc(PD),
41
260k
    ProcSchedModels(ProcSched) {
42
260k
  InitMCProcessorInfo(CPU, FS);
43
260k
}
44
45
/// ToggleFeature - Toggle a feature and returns the re-computed feature
46
/// bits. This version does not change the implied bits.
47
7.38k
FeatureBitset MCSubtargetInfo::ToggleFeature(uint64_t FB) {
48
7.38k
  FeatureBits.flip(FB);
49
7.38k
  return FeatureBits;
50
7.38k
}
51
52
4.51k
FeatureBitset MCSubtargetInfo::ToggleFeature(const FeatureBitset &FB) {
53
4.51k
  FeatureBits ^= FB;
54
4.51k
  return FeatureBits;
55
4.51k
}
56
57
/// ToggleFeature - Toggle a feature and returns the re-computed feature
58
/// bits. This version will also change all implied bits.
59
9.33k
FeatureBitset MCSubtargetInfo::ToggleFeature(StringRef FS) {
60
9.33k
  SubtargetFeatures::ToggleFeature(FeatureBits, FS, ProcFeatures);
61
9.33k
  return FeatureBits;
62
9.33k
}
63
64
429k
FeatureBitset MCSubtargetInfo::ApplyFeatureFlag(StringRef FS) {
65
429k
  SubtargetFeatures::ApplyFeatureFlag(FeatureBits, FS, ProcFeatures);
66
429k
  return FeatureBits;
67
429k
}
68
69
32.9k
const MCSchedModel &MCSubtargetInfo::getSchedModelForCPU(StringRef CPU) const {
70
32.9k
  assert(ProcSchedModels && "Processor machine model not available!");
71
72
32.9k
  ArrayRef<SubtargetInfoKV> SchedModels(ProcSchedModels, ProcDesc.size());
73
74
32.9k
  assert(std::is_sorted(SchedModels.begin(), SchedModels.end(),
75
32.9k
                    [](const SubtargetInfoKV &LHS, const SubtargetInfoKV &RHS) {
76
32.9k
                      return strcmp(LHS.Key, RHS.Key) < 0;
77
32.9k
                    }) &&
78
32.9k
         "Processor machine model table is not sorted");
79
80
  // Find entry
81
32.9k
  auto Found =
82
32.9k
    std::lower_bound(SchedModels.begin(), SchedModels.end(), CPU);
83
#if 0
84
  if (Found == SchedModels.end() || StringRef(Found->Key) != CPU) {
85
    if (CPU != "help") // Don't error if the user asked for help.
86
      errs() << "'" << CPU
87
             << "' is not a recognized processor for this target"
88
             << " (ignoring processor)\n";
89
    return MCSchedModel::GetDefaultSchedModel();
90
  }
91
#endif
92
32.9k
  assert(Found->Value && "Missing processor SchedModel value");
93
32.9k
  return *(const MCSchedModel *)Found->Value;
94
32.9k
}
95