Coverage Report

Created: 2024-01-17 10:31

/src/llvm-project/clang/lib/Basic/Targets/BPF.cpp
Line
Count
Source (jump to first uncovered line)
1
//===--- BPF.cpp - Implement BPF target feature support -------------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// This file implements BPF TargetInfo objects.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#include "BPF.h"
14
#include "Targets.h"
15
#include "clang/Basic/MacroBuilder.h"
16
#include "clang/Basic/TargetBuiltins.h"
17
#include "llvm/ADT/StringRef.h"
18
19
using namespace clang;
20
using namespace clang::targets;
21
22
static constexpr Builtin::Info BuiltinInfo[] = {
23
#define BUILTIN(ID, TYPE, ATTRS)                                               \
24
  {#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},
25
#include "clang/Basic/BuiltinsBPF.def"
26
};
27
28
void BPFTargetInfo::getTargetDefines(const LangOptions &Opts,
29
0
                                     MacroBuilder &Builder) const {
30
0
  Builder.defineMacro("__bpf__");
31
0
  Builder.defineMacro("__BPF__");
32
33
0
  std::string CPU = getTargetOpts().CPU;
34
0
  if (CPU == "probe") {
35
0
    Builder.defineMacro("__BPF_CPU_VERSION__", "0");
36
0
    return;
37
0
  }
38
0
  if (CPU.empty() || CPU == "generic" || CPU == "v1") {
39
0
    Builder.defineMacro("__BPF_CPU_VERSION__", "1");
40
0
    return;
41
0
  }
42
43
0
  std::string CpuVerNumStr = CPU.substr(1);
44
0
  Builder.defineMacro("__BPF_CPU_VERSION__", CpuVerNumStr);
45
46
0
  int CpuVerNum = std::stoi(CpuVerNumStr);
47
0
  if (CpuVerNum >= 2)
48
0
    Builder.defineMacro("__BPF_FEATURE_JMP_EXT");
49
50
0
  if (CpuVerNum >= 3) {
51
0
    Builder.defineMacro("__BPF_FEATURE_JMP32");
52
0
    Builder.defineMacro("__BPF_FEATURE_ALU32");
53
0
  }
54
55
0
  if (CpuVerNum >= 4) {
56
0
    Builder.defineMacro("__BPF_FEATURE_LDSX");
57
0
    Builder.defineMacro("__BPF_FEATURE_MOVSX");
58
0
    Builder.defineMacro("__BPF_FEATURE_BSWAP");
59
0
    Builder.defineMacro("__BPF_FEATURE_SDIV_SMOD");
60
0
    Builder.defineMacro("__BPF_FEATURE_GOTOL");
61
0
    Builder.defineMacro("__BPF_FEATURE_ST");
62
0
  }
63
0
}
64
65
static constexpr llvm::StringLiteral ValidCPUNames[] = {"generic", "v1", "v2",
66
                                                        "v3", "v4", "probe"};
67
68
0
bool BPFTargetInfo::isValidCPUName(StringRef Name) const {
69
0
  return llvm::is_contained(ValidCPUNames, Name);
70
0
}
71
72
0
void BPFTargetInfo::fillValidCPUList(SmallVectorImpl<StringRef> &Values) const {
73
0
  Values.append(std::begin(ValidCPUNames), std::end(ValidCPUNames));
74
0
}
75
76
0
ArrayRef<Builtin::Info> BPFTargetInfo::getTargetBuiltins() const {
77
0
  return llvm::ArrayRef(BuiltinInfo,
78
0
                        clang::BPF::LastTSBuiltin - Builtin::FirstTSBuiltin);
79
0
}
80
81
bool BPFTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
82
0
                                         DiagnosticsEngine &Diags) {
83
0
  for (const auto &Feature : Features) {
84
0
    if (Feature == "+alu32") {
85
0
      HasAlu32 = true;
86
0
    }
87
0
  }
88
89
0
  return true;
90
0
}