Path: blob/main/contrib/llvm-project/clang/lib/Basic/Targets/BPF.cpp
35294 views
//===--- BPF.cpp - Implement BPF target feature support -------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file implements BPF TargetInfo objects.9//10//===----------------------------------------------------------------------===//1112#include "BPF.h"13#include "Targets.h"14#include "clang/Basic/MacroBuilder.h"15#include "clang/Basic/TargetBuiltins.h"16#include "llvm/ADT/StringRef.h"1718using namespace clang;19using namespace clang::targets;2021static constexpr Builtin::Info BuiltinInfo[] = {22#define BUILTIN(ID, TYPE, ATTRS) \23{#ID, TYPE, ATTRS, nullptr, HeaderDesc::NO_HEADER, ALL_LANGUAGES},24#include "clang/Basic/BuiltinsBPF.inc"25};2627void BPFTargetInfo::getTargetDefines(const LangOptions &Opts,28MacroBuilder &Builder) const {29Builder.defineMacro("__bpf__");30Builder.defineMacro("__BPF__");3132std::string CPU = getTargetOpts().CPU;33if (CPU == "probe") {34Builder.defineMacro("__BPF_CPU_VERSION__", "0");35return;36}3738Builder.defineMacro("__BPF_FEATURE_ADDR_SPACE_CAST");3940if (CPU.empty() || CPU == "generic" || CPU == "v1") {41Builder.defineMacro("__BPF_CPU_VERSION__", "1");42return;43}4445std::string CpuVerNumStr = CPU.substr(1);46Builder.defineMacro("__BPF_CPU_VERSION__", CpuVerNumStr);47Builder.defineMacro("__BPF_FEATURE_MAY_GOTO");4849int CpuVerNum = std::stoi(CpuVerNumStr);50if (CpuVerNum >= 2)51Builder.defineMacro("__BPF_FEATURE_JMP_EXT");5253if (CpuVerNum >= 3) {54Builder.defineMacro("__BPF_FEATURE_JMP32");55Builder.defineMacro("__BPF_FEATURE_ALU32");56}5758if (CpuVerNum >= 4) {59Builder.defineMacro("__BPF_FEATURE_LDSX");60Builder.defineMacro("__BPF_FEATURE_MOVSX");61Builder.defineMacro("__BPF_FEATURE_BSWAP");62Builder.defineMacro("__BPF_FEATURE_SDIV_SMOD");63Builder.defineMacro("__BPF_FEATURE_GOTOL");64Builder.defineMacro("__BPF_FEATURE_ST");65}66}6768static constexpr llvm::StringLiteral ValidCPUNames[] = {"generic", "v1", "v2",69"v3", "v4", "probe"};7071bool BPFTargetInfo::isValidCPUName(StringRef Name) const {72return llvm::is_contained(ValidCPUNames, Name);73}7475void BPFTargetInfo::fillValidCPUList(SmallVectorImpl<StringRef> &Values) const {76Values.append(std::begin(ValidCPUNames), std::end(ValidCPUNames));77}7879ArrayRef<Builtin::Info> BPFTargetInfo::getTargetBuiltins() const {80return llvm::ArrayRef(BuiltinInfo,81clang::BPF::LastTSBuiltin - Builtin::FirstTSBuiltin);82}8384bool BPFTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,85DiagnosticsEngine &Diags) {86for (const auto &Feature : Features) {87if (Feature == "+alu32") {88HasAlu32 = true;89}90}9192return true;93}949596