122 lines · c
1//===--- BPF.h - Declare BPF target feature support -------------*- C++ -*-===//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-exception6//7//===----------------------------------------------------------------------===//8//9// This file declares BPF TargetInfo objects.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_BPF_H14#define LLVM_CLANG_LIB_BASIC_TARGETS_BPF_H15 16#include "clang/Basic/TargetInfo.h"17#include "clang/Basic/TargetOptions.h"18#include "llvm/Support/Compiler.h"19#include "llvm/TargetParser/Triple.h"20 21namespace clang {22namespace targets {23 24class LLVM_LIBRARY_VISIBILITY BPFTargetInfo : public TargetInfo {25 bool HasAlu32 = false;26 27public:28 BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)29 : TargetInfo(Triple) {30 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;31 SizeType = UnsignedLong;32 PtrDiffType = SignedLong;33 IntPtrType = SignedLong;34 IntMaxType = SignedLong;35 Int64Type = SignedLong;36 RegParmMax = 5;37 if (Triple.getArch() == llvm::Triple::bpfeb) {38 resetDataLayout("E-m:e-p:64:64-i64:64-i128:128-n32:64-S128");39 } else {40 resetDataLayout("e-m:e-p:64:64-i64:64-i128:128-n32:64-S128");41 }42 MaxAtomicPromoteWidth = 64;43 MaxAtomicInlineWidth = 64;44 TLSSupported = false;45 }46 47 void getTargetDefines(const LangOptions &Opts,48 MacroBuilder &Builder) const override;49 50 bool hasFeature(StringRef Feature) const override {51 return Feature == "bpf" || Feature == "alu32" || Feature == "dwarfris";52 }53 54 void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,55 bool Enabled) const override {56 Features[Name] = Enabled;57 }58 bool handleTargetFeatures(std::vector<std::string> &Features,59 DiagnosticsEngine &Diags) override;60 61 llvm::SmallVector<Builtin::InfosShard> getTargetBuiltins() const override;62 63 std::string_view getClobbers() const override { return ""; }64 65 BuiltinVaListKind getBuiltinVaListKind() const override {66 return TargetInfo::VoidPtrBuiltinVaList;67 }68 69 bool isValidGCCRegisterName(StringRef Name) const override { return true; }70 ArrayRef<const char *> getGCCRegNames() const override { return {}; }71 72 bool validateAsmConstraint(const char *&Name,73 TargetInfo::ConstraintInfo &Info) const override {74 switch (*Name) {75 default:76 break;77 case 'w':78 if (HasAlu32) {79 Info.setAllowsRegister();80 }81 break;82 }83 return true;84 }85 86 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {87 return {};88 }89 90 bool allowDebugInfoForExternalRef() const override { return true; }91 92 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {93 switch (CC) {94 default:95 return CCCR_Warning;96 case CC_C:97 case CC_DeviceKernel:98 return CCCR_OK;99 }100 }101 102 bool isValidCPUName(StringRef Name) const override;103 104 void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;105 106 bool setCPU(const std::string &Name) override {107 if (Name == "v3" || Name == "v4") {108 HasAlu32 = true;109 }110 111 StringRef CPUName(Name);112 return isValidCPUName(CPUName);113 }114 115 std::pair<unsigned, unsigned> hardwareInterferenceSizes() const override {116 return std::make_pair(32, 32);117 }118};119} // namespace targets120} // namespace clang121#endif // LLVM_CLANG_LIB_BASIC_TARGETS_BPF_H122