17330f729Sjoerg //===--- BPF.h - Declare BPF target feature support -------------*- C++ -*-===// 27330f729Sjoerg // 37330f729Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 47330f729Sjoerg // See https://llvm.org/LICENSE.txt for license information. 57330f729Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 67330f729Sjoerg // 77330f729Sjoerg //===----------------------------------------------------------------------===// 87330f729Sjoerg // 97330f729Sjoerg // This file declares BPF TargetInfo objects. 107330f729Sjoerg // 117330f729Sjoerg //===----------------------------------------------------------------------===// 127330f729Sjoerg 137330f729Sjoerg #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_BPF_H 147330f729Sjoerg #define LLVM_CLANG_LIB_BASIC_TARGETS_BPF_H 157330f729Sjoerg 167330f729Sjoerg #include "clang/Basic/TargetInfo.h" 177330f729Sjoerg #include "clang/Basic/TargetOptions.h" 187330f729Sjoerg #include "llvm/ADT/Triple.h" 197330f729Sjoerg #include "llvm/Support/Compiler.h" 207330f729Sjoerg 217330f729Sjoerg namespace clang { 227330f729Sjoerg namespace targets { 237330f729Sjoerg 247330f729Sjoerg class LLVM_LIBRARY_VISIBILITY BPFTargetInfo : public TargetInfo { 257330f729Sjoerg static const Builtin::Info BuiltinInfo[]; 26*e038c9c4Sjoerg bool HasAlu32 = false; 277330f729Sjoerg 287330f729Sjoerg public: BPFTargetInfo(const llvm::Triple & Triple,const TargetOptions &)297330f729Sjoerg BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &) 307330f729Sjoerg : TargetInfo(Triple) { 317330f729Sjoerg LongWidth = LongAlign = PointerWidth = PointerAlign = 64; 327330f729Sjoerg SizeType = UnsignedLong; 337330f729Sjoerg PtrDiffType = SignedLong; 347330f729Sjoerg IntPtrType = SignedLong; 357330f729Sjoerg IntMaxType = SignedLong; 367330f729Sjoerg Int64Type = SignedLong; 377330f729Sjoerg RegParmMax = 5; 387330f729Sjoerg if (Triple.getArch() == llvm::Triple::bpfeb) { 39*e038c9c4Sjoerg resetDataLayout("E-m:e-p:64:64-i64:64-i128:128-n32:64-S128"); 407330f729Sjoerg } else { 41*e038c9c4Sjoerg resetDataLayout("e-m:e-p:64:64-i64:64-i128:128-n32:64-S128"); 427330f729Sjoerg } 437330f729Sjoerg MaxAtomicPromoteWidth = 64; 447330f729Sjoerg MaxAtomicInlineWidth = 64; 457330f729Sjoerg TLSSupported = false; 467330f729Sjoerg } 477330f729Sjoerg 487330f729Sjoerg void getTargetDefines(const LangOptions &Opts, 497330f729Sjoerg MacroBuilder &Builder) const override; 507330f729Sjoerg hasFeature(StringRef Feature)517330f729Sjoerg bool hasFeature(StringRef Feature) const override { 527330f729Sjoerg return Feature == "bpf" || Feature == "alu32" || Feature == "dwarfris"; 537330f729Sjoerg } 547330f729Sjoerg setFeatureEnabled(llvm::StringMap<bool> & Features,StringRef Name,bool Enabled)557330f729Sjoerg void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name, 567330f729Sjoerg bool Enabled) const override { 577330f729Sjoerg Features[Name] = Enabled; 587330f729Sjoerg } 59*e038c9c4Sjoerg bool handleTargetFeatures(std::vector<std::string> &Features, 60*e038c9c4Sjoerg DiagnosticsEngine &Diags) override; 617330f729Sjoerg 627330f729Sjoerg ArrayRef<Builtin::Info> getTargetBuiltins() const override; 637330f729Sjoerg getClobbers()647330f729Sjoerg const char *getClobbers() const override { return ""; } 657330f729Sjoerg getBuiltinVaListKind()667330f729Sjoerg BuiltinVaListKind getBuiltinVaListKind() const override { 677330f729Sjoerg return TargetInfo::VoidPtrBuiltinVaList; 687330f729Sjoerg } 697330f729Sjoerg isValidGCCRegisterName(StringRef Name)707330f729Sjoerg bool isValidGCCRegisterName(StringRef Name) const override { return true; } getGCCRegNames()717330f729Sjoerg ArrayRef<const char *> getGCCRegNames() const override { return None; } 727330f729Sjoerg validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & Info)737330f729Sjoerg bool validateAsmConstraint(const char *&Name, 74*e038c9c4Sjoerg TargetInfo::ConstraintInfo &Info) const override { 75*e038c9c4Sjoerg switch (*Name) { 76*e038c9c4Sjoerg default: 77*e038c9c4Sjoerg break; 78*e038c9c4Sjoerg case 'w': 79*e038c9c4Sjoerg if (HasAlu32) { 80*e038c9c4Sjoerg Info.setAllowsRegister(); 81*e038c9c4Sjoerg } 82*e038c9c4Sjoerg break; 83*e038c9c4Sjoerg } 847330f729Sjoerg return true; 857330f729Sjoerg } 867330f729Sjoerg getGCCRegAliases()877330f729Sjoerg ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { 887330f729Sjoerg return None; 897330f729Sjoerg } 907330f729Sjoerg allowDebugInfoForExternalRef()91*e038c9c4Sjoerg bool allowDebugInfoForExternalRef() const override { return true; } 92*e038c9c4Sjoerg checkCallingConvention(CallingConv CC)937330f729Sjoerg CallingConvCheckResult checkCallingConvention(CallingConv CC) const override { 947330f729Sjoerg switch (CC) { 957330f729Sjoerg default: 967330f729Sjoerg return CCCR_Warning; 977330f729Sjoerg case CC_C: 987330f729Sjoerg case CC_OpenCLKernel: 997330f729Sjoerg return CCCR_OK; 1007330f729Sjoerg } 1017330f729Sjoerg } 1027330f729Sjoerg 1037330f729Sjoerg bool isValidCPUName(StringRef Name) const override; 1047330f729Sjoerg 1057330f729Sjoerg void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override; 1067330f729Sjoerg setCPU(const std::string & Name)1077330f729Sjoerg bool setCPU(const std::string &Name) override { 108*e038c9c4Sjoerg if (Name == "v3") { 109*e038c9c4Sjoerg HasAlu32 = true; 110*e038c9c4Sjoerg } 111*e038c9c4Sjoerg 1127330f729Sjoerg StringRef CPUName(Name); 1137330f729Sjoerg return isValidCPUName(CPUName); 1147330f729Sjoerg } 1157330f729Sjoerg }; 1167330f729Sjoerg } // namespace targets 1177330f729Sjoerg } // namespace clang 1187330f729Sjoerg #endif // LLVM_CLANG_LIB_BASIC_TARGETS_BPF_H 119