181ad6265SDimitry Andric //===--- CSKY.h - Declare CSKY target feature support -----------*- C++ -*-===// 281ad6265SDimitry Andric // 381ad6265SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 481ad6265SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 581ad6265SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 681ad6265SDimitry Andric // 781ad6265SDimitry Andric //===----------------------------------------------------------------------===// 881ad6265SDimitry Andric // 981ad6265SDimitry Andric // This file declares CSKY TargetInfo objects. 1081ad6265SDimitry Andric // 1181ad6265SDimitry Andric //===----------------------------------------------------------------------===// 1281ad6265SDimitry Andric 1381ad6265SDimitry Andric #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_CSKY_H 1481ad6265SDimitry Andric #define LLVM_CLANG_LIB_BASIC_TARGETS_CSKY_H 1581ad6265SDimitry Andric 1681ad6265SDimitry Andric #include "clang/Basic/MacroBuilder.h" 1781ad6265SDimitry Andric #include "clang/Basic/TargetInfo.h" 1806c3fb27SDimitry Andric #include "llvm/TargetParser/CSKYTargetParser.h" 1981ad6265SDimitry Andric 2081ad6265SDimitry Andric namespace clang { 2181ad6265SDimitry Andric namespace targets { 2281ad6265SDimitry Andric 2381ad6265SDimitry Andric class LLVM_LIBRARY_VISIBILITY CSKYTargetInfo : public TargetInfo { 2481ad6265SDimitry Andric protected: 2581ad6265SDimitry Andric std::string ABI; 2681ad6265SDimitry Andric llvm::CSKY::ArchKind Arch = llvm::CSKY::ArchKind::INVALID; 2781ad6265SDimitry Andric std::string CPU; 2881ad6265SDimitry Andric 2981ad6265SDimitry Andric bool HardFloat = false; 3081ad6265SDimitry Andric bool HardFloatABI = false; 3181ad6265SDimitry Andric bool FPUV2_SF = false; 3281ad6265SDimitry Andric bool FPUV2_DF = false; 3381ad6265SDimitry Andric bool FPUV3_SF = false; 3481ad6265SDimitry Andric bool FPUV3_DF = false; 3581ad6265SDimitry Andric bool VDSPV2 = false; 3681ad6265SDimitry Andric bool VDSPV1 = false; 3781ad6265SDimitry Andric bool DSPV2 = false; 3881ad6265SDimitry Andric bool is3E3R1 = false; 3981ad6265SDimitry Andric 4081ad6265SDimitry Andric public: 4181ad6265SDimitry Andric CSKYTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 4281ad6265SDimitry Andric : TargetInfo(Triple) { 4381ad6265SDimitry Andric NoAsmVariants = true; 4481ad6265SDimitry Andric LongLongAlign = 32; 4581ad6265SDimitry Andric SuitableAlign = 32; 4681ad6265SDimitry Andric DoubleAlign = LongDoubleAlign = 32; 4781ad6265SDimitry Andric SizeType = UnsignedInt; 4881ad6265SDimitry Andric PtrDiffType = SignedInt; 4981ad6265SDimitry Andric IntPtrType = SignedInt; 5081ad6265SDimitry Andric WCharType = SignedInt; 5181ad6265SDimitry Andric WIntType = UnsignedInt; 5281ad6265SDimitry Andric 5381ad6265SDimitry Andric UseZeroLengthBitfieldAlignment = true; 5481ad6265SDimitry Andric MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32; 5581ad6265SDimitry Andric resetDataLayout("e-m:e-S32-p:32:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-" 5681ad6265SDimitry Andric "v64:32:32-v128:32:32-a:0:32-Fi32-n32"); 5781ad6265SDimitry Andric 5881ad6265SDimitry Andric setABI("abiv2"); 5981ad6265SDimitry Andric } 6081ad6265SDimitry Andric 6181ad6265SDimitry Andric StringRef getABI() const override { return ABI; } 6281ad6265SDimitry Andric bool setABI(const std::string &Name) override { 6381ad6265SDimitry Andric if (Name == "abiv2" || Name == "abiv1") { 6481ad6265SDimitry Andric ABI = Name; 6581ad6265SDimitry Andric return true; 6681ad6265SDimitry Andric } 6781ad6265SDimitry Andric return false; 6881ad6265SDimitry Andric } 6981ad6265SDimitry Andric 7081ad6265SDimitry Andric bool setCPU(const std::string &Name) override; 7181ad6265SDimitry Andric 7281ad6265SDimitry Andric bool isValidCPUName(StringRef Name) const override; 7381ad6265SDimitry Andric 74*0fca6ea1SDimitry Andric unsigned getMinGlobalAlign(uint64_t, bool HasNonWeakDef) const override; 7581ad6265SDimitry Andric 7681ad6265SDimitry Andric ArrayRef<Builtin::Info> getTargetBuiltins() const override; 7781ad6265SDimitry Andric 7881ad6265SDimitry Andric BuiltinVaListKind getBuiltinVaListKind() const override { 7981ad6265SDimitry Andric return VoidPtrBuiltinVaList; 8081ad6265SDimitry Andric } 8181ad6265SDimitry Andric 8281ad6265SDimitry Andric bool validateAsmConstraint(const char *&Name, 8381ad6265SDimitry Andric TargetInfo::ConstraintInfo &info) const override; 8481ad6265SDimitry Andric 8506c3fb27SDimitry Andric std::string_view getClobbers() const override { return ""; } 8681ad6265SDimitry Andric 8781ad6265SDimitry Andric void getTargetDefines(const LangOptions &Opts, 8881ad6265SDimitry Andric MacroBuilder &Builder) const override; 8981ad6265SDimitry Andric bool hasFeature(StringRef Feature) const override; 9081ad6265SDimitry Andric bool handleTargetFeatures(std::vector<std::string> &Features, 9181ad6265SDimitry Andric DiagnosticsEngine &Diags) override; 9281ad6265SDimitry Andric 9381ad6265SDimitry Andric /// Whether target allows to overalign ABI-specified preferred alignment 9481ad6265SDimitry Andric bool allowsLargerPreferedTypeAlignment() const override { return false; } 9581ad6265SDimitry Andric 9681ad6265SDimitry Andric bool hasBitIntType() const override { return true; } 9781ad6265SDimitry Andric 9881ad6265SDimitry Andric protected: 9981ad6265SDimitry Andric ArrayRef<const char *> getGCCRegNames() const override; 10081ad6265SDimitry Andric 10181ad6265SDimitry Andric ArrayRef<GCCRegAlias> getGCCRegAliases() const override; 10281ad6265SDimitry Andric }; 10381ad6265SDimitry Andric 10481ad6265SDimitry Andric } // namespace targets 10581ad6265SDimitry Andric } // namespace clang 10681ad6265SDimitry Andric 10781ad6265SDimitry Andric #endif // LLVM_CLANG_LIB_BASIC_TARGETS_CSKY_H 108