xref: /netbsd-src/external/apache2/llvm/dist/clang/lib/Basic/Targets/BPF.h (revision e038c9c4676b0f19b1b7dd08a940c6ed64a6d5ae)
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