brintos

brintos / llvm-project-archived public Read only

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