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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file declares BPF TargetInfo objects. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_BPF_H 14 #define LLVM_CLANG_LIB_BASIC_TARGETS_BPF_H 15 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 21 namespace clang { 22 namespace targets { 23 24 class LLVM_LIBRARY_VISIBILITY BPFTargetInfo : public TargetInfo { 25 bool HasAlu32 = false; 26 27 public: 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 ArrayRef<Builtin::Info> 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_OpenCLKernel: 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 targets 120 } // namespace clang 121 #endif // LLVM_CLANG_LIB_BASIC_TARGETS_BPF_H 122