Path: blob/main/contrib/llvm-project/clang/lib/Basic/Targets/RISCV.h
35266 views
//===--- RISCV.h - Declare RISC-V target feature support --------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file declares RISC-V TargetInfo objects.9//10//===----------------------------------------------------------------------===//1112#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_RISCV_H13#define LLVM_CLANG_LIB_BASIC_TARGETS_RISCV_H1415#include "clang/Basic/TargetInfo.h"16#include "clang/Basic/TargetOptions.h"17#include "llvm/Support/Compiler.h"18#include "llvm/TargetParser/RISCVISAInfo.h"19#include "llvm/TargetParser/Triple.h"20#include <optional>2122namespace clang {23namespace targets {2425// RISC-V Target26class RISCVTargetInfo : public TargetInfo {27protected:28std::string ABI, CPU;29std::unique_ptr<llvm::RISCVISAInfo> ISAInfo;3031private:32bool FastScalarUnalignedAccess;33bool HasExperimental = false;3435public:36RISCVTargetInfo(const llvm::Triple &Triple, const TargetOptions &)37: TargetInfo(Triple) {38BFloat16Width = 16;39BFloat16Align = 16;40BFloat16Format = &llvm::APFloat::BFloat();41LongDoubleWidth = 128;42LongDoubleAlign = 128;43LongDoubleFormat = &llvm::APFloat::IEEEquad();44SuitableAlign = 128;45WCharType = SignedInt;46WIntType = UnsignedInt;47HasRISCVVTypes = true;48MCountName = "_mcount";49HasFloat16 = true;50HasStrictFP = true;51}5253bool setCPU(const std::string &Name) override {54if (!isValidCPUName(Name))55return false;56CPU = Name;57return true;58}5960StringRef getABI() const override { return ABI; }61void getTargetDefines(const LangOptions &Opts,62MacroBuilder &Builder) const override;6364ArrayRef<Builtin::Info> getTargetBuiltins() const override;6566BuiltinVaListKind getBuiltinVaListKind() const override {67return TargetInfo::VoidPtrBuiltinVaList;68}6970std::string_view getClobbers() const override { return ""; }7172StringRef getConstraintRegister(StringRef Constraint,73StringRef Expression) const override {74return Expression;75}7677ArrayRef<const char *> getGCCRegNames() const override;7879int getEHDataRegisterNumber(unsigned RegNo) const override {80if (RegNo == 0)81return 10;82else if (RegNo == 1)83return 11;84else85return -1;86}8788ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;8990bool validateAsmConstraint(const char *&Name,91TargetInfo::ConstraintInfo &Info) const override;9293std::string convertConstraint(const char *&Constraint) const override;9495bool96initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,97StringRef CPU,98const std::vector<std::string> &FeaturesVec) const override;99100std::optional<std::pair<unsigned, unsigned>>101getVScaleRange(const LangOptions &LangOpts) const override;102103bool hasFeature(StringRef Feature) const override;104105bool handleTargetFeatures(std::vector<std::string> &Features,106DiagnosticsEngine &Diags) override;107108bool hasBitIntType() const override { return true; }109110bool hasBFloat16Type() const override { return true; }111112CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;113114bool useFP16ConversionIntrinsics() const override {115return false;116}117118bool isValidCPUName(StringRef Name) const override;119void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;120bool isValidTuneCPUName(StringRef Name) const override;121void fillValidTuneCPUList(SmallVectorImpl<StringRef> &Values) const override;122bool supportsTargetAttributeTune() const override { return true; }123ParsedTargetAttr parseTargetAttr(StringRef Str) const override;124125std::pair<unsigned, unsigned> hardwareInterferenceSizes() const override {126return std::make_pair(32, 32);127}128};129class LLVM_LIBRARY_VISIBILITY RISCV32TargetInfo : public RISCVTargetInfo {130public:131RISCV32TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)132: RISCVTargetInfo(Triple, Opts) {133IntPtrType = SignedInt;134PtrDiffType = SignedInt;135SizeType = UnsignedInt;136resetDataLayout("e-m:e-p:32:32-i64:64-n32-S128");137}138139bool setABI(const std::string &Name) override {140if (Name == "ilp32e") {141ABI = Name;142resetDataLayout("e-m:e-p:32:32-i64:64-n32-S32");143return true;144}145146if (Name == "ilp32" || Name == "ilp32f" || Name == "ilp32d") {147ABI = Name;148return true;149}150return false;151}152153void setMaxAtomicWidth() override {154MaxAtomicPromoteWidth = 128;155156if (ISAInfo->hasExtension("a"))157MaxAtomicInlineWidth = 32;158}159};160class LLVM_LIBRARY_VISIBILITY RISCV64TargetInfo : public RISCVTargetInfo {161public:162RISCV64TargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)163: RISCVTargetInfo(Triple, Opts) {164LongWidth = LongAlign = PointerWidth = PointerAlign = 64;165IntMaxType = Int64Type = SignedLong;166resetDataLayout("e-m:e-p:64:64-i64:64-i128:128-n32:64-S128");167}168169bool setABI(const std::string &Name) override {170if (Name == "lp64e") {171ABI = Name;172resetDataLayout("e-m:e-p:64:64-i64:64-i128:128-n32:64-S64");173return true;174}175176if (Name == "lp64" || Name == "lp64f" || Name == "lp64d") {177ABI = Name;178return true;179}180return false;181}182183void setMaxAtomicWidth() override {184MaxAtomicPromoteWidth = 128;185186if (ISAInfo->hasExtension("a"))187MaxAtomicInlineWidth = 64;188}189};190} // namespace targets191} // namespace clang192193#endif // LLVM_CLANG_LIB_BASIC_TARGETS_RISCV_H194195196