xref: /freebsd-src/contrib/llvm-project/clang/lib/Basic/Targets/BPF.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric //===--- BPF.h - Declare BPF target feature support -------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file declares BPF TargetInfo objects.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_BPF_H
140b57cec5SDimitry Andric #define LLVM_CLANG_LIB_BASIC_TARGETS_BPF_H
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric #include "clang/Basic/TargetInfo.h"
170b57cec5SDimitry Andric #include "clang/Basic/TargetOptions.h"
180b57cec5SDimitry Andric #include "llvm/Support/Compiler.h"
1906c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.h"
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric namespace clang {
220b57cec5SDimitry Andric namespace targets {
230b57cec5SDimitry Andric 
240b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY BPFTargetInfo : public TargetInfo {
25fe6060f1SDimitry Andric   bool HasAlu32 = false;
26a7dea167SDimitry Andric 
270b57cec5SDimitry Andric public:
280b57cec5SDimitry Andric   BPFTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
290b57cec5SDimitry Andric       : TargetInfo(Triple) {
300b57cec5SDimitry Andric     LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
310b57cec5SDimitry Andric     SizeType = UnsignedLong;
320b57cec5SDimitry Andric     PtrDiffType = SignedLong;
330b57cec5SDimitry Andric     IntPtrType = SignedLong;
340b57cec5SDimitry Andric     IntMaxType = SignedLong;
350b57cec5SDimitry Andric     Int64Type = SignedLong;
360b57cec5SDimitry Andric     RegParmMax = 5;
370b57cec5SDimitry Andric     if (Triple.getArch() == llvm::Triple::bpfeb) {
385ffd83dbSDimitry Andric       resetDataLayout("E-m:e-p:64:64-i64:64-i128:128-n32:64-S128");
390b57cec5SDimitry Andric     } else {
405ffd83dbSDimitry Andric       resetDataLayout("e-m:e-p:64:64-i64:64-i128:128-n32:64-S128");
410b57cec5SDimitry Andric     }
420b57cec5SDimitry Andric     MaxAtomicPromoteWidth = 64;
430b57cec5SDimitry Andric     MaxAtomicInlineWidth = 64;
440b57cec5SDimitry Andric     TLSSupported = false;
450b57cec5SDimitry Andric   }
460b57cec5SDimitry Andric 
470b57cec5SDimitry Andric   void getTargetDefines(const LangOptions &Opts,
480b57cec5SDimitry Andric                         MacroBuilder &Builder) const override;
490b57cec5SDimitry Andric 
500b57cec5SDimitry Andric   bool hasFeature(StringRef Feature) const override {
510b57cec5SDimitry Andric     return Feature == "bpf" || Feature == "alu32" || Feature == "dwarfris";
520b57cec5SDimitry Andric   }
530b57cec5SDimitry Andric 
540b57cec5SDimitry Andric   void setFeatureEnabled(llvm::StringMap<bool> &Features, StringRef Name,
550b57cec5SDimitry Andric                          bool Enabled) const override {
560b57cec5SDimitry Andric     Features[Name] = Enabled;
570b57cec5SDimitry Andric   }
58fe6060f1SDimitry Andric   bool handleTargetFeatures(std::vector<std::string> &Features,
59fe6060f1SDimitry Andric                             DiagnosticsEngine &Diags) override;
600b57cec5SDimitry Andric 
61a7dea167SDimitry Andric   ArrayRef<Builtin::Info> getTargetBuiltins() const override;
620b57cec5SDimitry Andric 
6306c3fb27SDimitry Andric   std::string_view getClobbers() const override { return ""; }
640b57cec5SDimitry Andric 
650b57cec5SDimitry Andric   BuiltinVaListKind getBuiltinVaListKind() const override {
660b57cec5SDimitry Andric     return TargetInfo::VoidPtrBuiltinVaList;
670b57cec5SDimitry Andric   }
680b57cec5SDimitry Andric 
690b57cec5SDimitry Andric   bool isValidGCCRegisterName(StringRef Name) const override { return true; }
70bdd1243dSDimitry Andric   ArrayRef<const char *> getGCCRegNames() const override {
71bdd1243dSDimitry Andric     return std::nullopt;
72bdd1243dSDimitry Andric   }
730b57cec5SDimitry Andric 
740b57cec5SDimitry Andric   bool validateAsmConstraint(const char *&Name,
75fe6060f1SDimitry Andric                              TargetInfo::ConstraintInfo &Info) const override {
76fe6060f1SDimitry Andric     switch (*Name) {
77fe6060f1SDimitry Andric     default:
78fe6060f1SDimitry Andric       break;
79fe6060f1SDimitry Andric     case 'w':
80fe6060f1SDimitry Andric       if (HasAlu32) {
81fe6060f1SDimitry Andric         Info.setAllowsRegister();
82fe6060f1SDimitry Andric       }
83fe6060f1SDimitry Andric       break;
84fe6060f1SDimitry Andric     }
850b57cec5SDimitry Andric     return true;
860b57cec5SDimitry Andric   }
870b57cec5SDimitry Andric 
880b57cec5SDimitry Andric   ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
89bdd1243dSDimitry Andric     return std::nullopt;
900b57cec5SDimitry Andric   }
910b57cec5SDimitry Andric 
92fe6060f1SDimitry Andric   bool allowDebugInfoForExternalRef() const override { return true; }
93480093f4SDimitry Andric 
940b57cec5SDimitry Andric   CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
950b57cec5SDimitry Andric     switch (CC) {
960b57cec5SDimitry Andric     default:
970b57cec5SDimitry Andric       return CCCR_Warning;
980b57cec5SDimitry Andric     case CC_C:
990b57cec5SDimitry Andric     case CC_OpenCLKernel:
1000b57cec5SDimitry Andric       return CCCR_OK;
1010b57cec5SDimitry Andric     }
1020b57cec5SDimitry Andric   }
1030b57cec5SDimitry Andric 
1040b57cec5SDimitry Andric   bool isValidCPUName(StringRef Name) const override;
1050b57cec5SDimitry Andric 
1060b57cec5SDimitry Andric   void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;
1070b57cec5SDimitry Andric 
1080b57cec5SDimitry Andric   bool setCPU(const std::string &Name) override {
1095f757f3fSDimitry Andric     if (Name == "v3" || Name == "v4") {
110fe6060f1SDimitry Andric       HasAlu32 = true;
111fe6060f1SDimitry Andric     }
112fe6060f1SDimitry Andric 
1130b57cec5SDimitry Andric     StringRef CPUName(Name);
1140b57cec5SDimitry Andric     return isValidCPUName(CPUName);
1150b57cec5SDimitry Andric   }
116*0fca6ea1SDimitry Andric 
117*0fca6ea1SDimitry Andric   std::pair<unsigned, unsigned> hardwareInterferenceSizes() const override {
118*0fca6ea1SDimitry Andric     return std::make_pair(32, 32);
119*0fca6ea1SDimitry Andric   }
1200b57cec5SDimitry Andric };
1210b57cec5SDimitry Andric } // namespace targets
1220b57cec5SDimitry Andric } // namespace clang
1230b57cec5SDimitry Andric #endif // LLVM_CLANG_LIB_BASIC_TARGETS_BPF_H
124