1e5dd7070Spatrick //===--- TCE.h - Declare TCE 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 TCE TargetInfo objects. 10e5dd7070Spatrick // 11e5dd7070Spatrick //===----------------------------------------------------------------------===// 12e5dd7070Spatrick 13e5dd7070Spatrick #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_TCE_H 14e5dd7070Spatrick #define LLVM_CLANG_LIB_BASIC_TARGETS_TCE_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 // llvm and clang cannot be used directly to output native binaries for 25e5dd7070Spatrick // target, but is used to compile C code to llvm bitcode with correct 26e5dd7070Spatrick // type and alignment information. 27e5dd7070Spatrick // 28e5dd7070Spatrick // TCE uses the llvm bitcode as input and uses it for generating customized 29e5dd7070Spatrick // target processor and program binary. TCE co-design environment is 30e5dd7070Spatrick // publicly available in http://tce.cs.tut.fi 31e5dd7070Spatrick 32e5dd7070Spatrick static const unsigned TCEOpenCLAddrSpaceMap[] = { 33e5dd7070Spatrick 0, // Default 34e5dd7070Spatrick 3, // opencl_global 35e5dd7070Spatrick 4, // opencl_local 36e5dd7070Spatrick 5, // opencl_constant 37e5dd7070Spatrick 0, // opencl_private 38a9ac8606Spatrick 1, // opencl_global_device 39a9ac8606Spatrick 1, // opencl_global_host 40e5dd7070Spatrick // FIXME: generic has to be added to the target 41e5dd7070Spatrick 0, // opencl_generic 42e5dd7070Spatrick 0, // cuda_device 43e5dd7070Spatrick 0, // cuda_constant 44e5dd7070Spatrick 0, // cuda_shared 45a9ac8606Spatrick 0, // sycl_global 46a9ac8606Spatrick 0, // sycl_global_device 47a9ac8606Spatrick 0, // sycl_global_host 48a9ac8606Spatrick 0, // sycl_local 49a9ac8606Spatrick 0, // sycl_private 50e5dd7070Spatrick 0, // ptr32_sptr 51e5dd7070Spatrick 0, // ptr32_uptr 52e5dd7070Spatrick 0, // ptr64 53*12c85518Srobert 0, // hlsl_groupshared 54e5dd7070Spatrick }; 55e5dd7070Spatrick 56e5dd7070Spatrick class LLVM_LIBRARY_VISIBILITY TCETargetInfo : public TargetInfo { 57e5dd7070Spatrick public: TCETargetInfo(const llvm::Triple & Triple,const TargetOptions &)58e5dd7070Spatrick TCETargetInfo(const llvm::Triple &Triple, const TargetOptions &) 59e5dd7070Spatrick : TargetInfo(Triple) { 60e5dd7070Spatrick TLSSupported = false; 61e5dd7070Spatrick IntWidth = 32; 62e5dd7070Spatrick LongWidth = LongLongWidth = 32; 63e5dd7070Spatrick PointerWidth = 32; 64e5dd7070Spatrick IntAlign = 32; 65e5dd7070Spatrick LongAlign = LongLongAlign = 32; 66e5dd7070Spatrick PointerAlign = 32; 67e5dd7070Spatrick SuitableAlign = 32; 68e5dd7070Spatrick SizeType = UnsignedInt; 69e5dd7070Spatrick IntMaxType = SignedLong; 70e5dd7070Spatrick IntPtrType = SignedInt; 71e5dd7070Spatrick PtrDiffType = SignedInt; 72e5dd7070Spatrick FloatWidth = 32; 73e5dd7070Spatrick FloatAlign = 32; 74e5dd7070Spatrick DoubleWidth = 32; 75e5dd7070Spatrick DoubleAlign = 32; 76e5dd7070Spatrick LongDoubleWidth = 32; 77e5dd7070Spatrick LongDoubleAlign = 32; 78e5dd7070Spatrick FloatFormat = &llvm::APFloat::IEEEsingle(); 79e5dd7070Spatrick DoubleFormat = &llvm::APFloat::IEEEsingle(); 80e5dd7070Spatrick LongDoubleFormat = &llvm::APFloat::IEEEsingle(); 81e5dd7070Spatrick resetDataLayout("E-p:32:32:32-i1:8:8-i8:8:32-" 82e5dd7070Spatrick "i16:16:32-i32:32:32-i64:32:32-" 83e5dd7070Spatrick "f32:32:32-f64:32:32-v64:32:32-" 84e5dd7070Spatrick "v128:32:32-v256:32:32-v512:32:32-" 85e5dd7070Spatrick "v1024:32:32-a0:0:32-n32"); 86e5dd7070Spatrick AddrSpaceMap = &TCEOpenCLAddrSpaceMap; 87e5dd7070Spatrick UseAddrSpaceMapMangling = true; 88e5dd7070Spatrick } 89e5dd7070Spatrick 90e5dd7070Spatrick void getTargetDefines(const LangOptions &Opts, 91e5dd7070Spatrick MacroBuilder &Builder) const override; 92e5dd7070Spatrick hasFeature(StringRef Feature)93e5dd7070Spatrick bool hasFeature(StringRef Feature) const override { return Feature == "tce"; } 94e5dd7070Spatrick getTargetBuiltins()95*12c85518Srobert ArrayRef<Builtin::Info> getTargetBuiltins() const override { 96*12c85518Srobert return std::nullopt; 97*12c85518Srobert } 98e5dd7070Spatrick getClobbers()99e5dd7070Spatrick const char *getClobbers() const override { return ""; } 100e5dd7070Spatrick getBuiltinVaListKind()101e5dd7070Spatrick BuiltinVaListKind getBuiltinVaListKind() const override { 102e5dd7070Spatrick return TargetInfo::VoidPtrBuiltinVaList; 103e5dd7070Spatrick } 104e5dd7070Spatrick getGCCRegNames()105*12c85518Srobert ArrayRef<const char *> getGCCRegNames() const override { 106*12c85518Srobert return std::nullopt; 107*12c85518Srobert } 108e5dd7070Spatrick validateAsmConstraint(const char * & Name,TargetInfo::ConstraintInfo & info)109e5dd7070Spatrick bool validateAsmConstraint(const char *&Name, 110e5dd7070Spatrick TargetInfo::ConstraintInfo &info) const override { 111e5dd7070Spatrick return true; 112e5dd7070Spatrick } 113e5dd7070Spatrick getGCCRegAliases()114e5dd7070Spatrick ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { 115*12c85518Srobert return std::nullopt; 116e5dd7070Spatrick } 117e5dd7070Spatrick }; 118e5dd7070Spatrick 119e5dd7070Spatrick class LLVM_LIBRARY_VISIBILITY TCELETargetInfo : public TCETargetInfo { 120e5dd7070Spatrick public: TCELETargetInfo(const llvm::Triple & Triple,const TargetOptions & Opts)121e5dd7070Spatrick TCELETargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts) 122e5dd7070Spatrick : TCETargetInfo(Triple, Opts) { 123e5dd7070Spatrick BigEndian = false; 124e5dd7070Spatrick 125e5dd7070Spatrick resetDataLayout("e-p:32:32:32-i1:8:8-i8:8:32-" 126e5dd7070Spatrick "i16:16:32-i32:32:32-i64:32:32-" 127e5dd7070Spatrick "f32:32:32-f64:32:32-v64:32:32-" 128e5dd7070Spatrick "v128:32:32-v256:32:32-v512:32:32-" 129e5dd7070Spatrick "v1024:32:32-a0:0:32-n32"); 130e5dd7070Spatrick } 131e5dd7070Spatrick 132e5dd7070Spatrick void getTargetDefines(const LangOptions &Opts, 133e5dd7070Spatrick MacroBuilder &Builder) const override; 134e5dd7070Spatrick }; 135e5dd7070Spatrick } // namespace targets 136e5dd7070Spatrick } // namespace clang 137e5dd7070Spatrick #endif // LLVM_CLANG_LIB_BASIC_TARGETS_TCE_H 138