xref: /openbsd-src/gnu/llvm/clang/lib/Basic/Targets/BPF.h (revision 12c855180aad702bbcca06e0398d774beeafb155)
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