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