Path: blob/main/contrib/llvm-project/clang/lib/Basic/Targets/SPIR.cpp
35266 views
//===--- SPIR.cpp - Implement SPIR and SPIR-V target feature support ------===//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 implements SPIR and SPIR-V TargetInfo objects.9//10//===----------------------------------------------------------------------===//1112#include "SPIR.h"13#include "AMDGPU.h"14#include "Targets.h"15#include "llvm/TargetParser/TargetParser.h"1617using namespace clang;18using namespace clang::targets;1920void SPIRTargetInfo::getTargetDefines(const LangOptions &Opts,21MacroBuilder &Builder) const {22DefineStd(Builder, "SPIR", Opts);23}2425void SPIR32TargetInfo::getTargetDefines(const LangOptions &Opts,26MacroBuilder &Builder) const {27SPIRTargetInfo::getTargetDefines(Opts, Builder);28DefineStd(Builder, "SPIR32", Opts);29}3031void SPIR64TargetInfo::getTargetDefines(const LangOptions &Opts,32MacroBuilder &Builder) const {33SPIRTargetInfo::getTargetDefines(Opts, Builder);34DefineStd(Builder, "SPIR64", Opts);35}3637void BaseSPIRVTargetInfo::getTargetDefines(const LangOptions &Opts,38MacroBuilder &Builder) const {39DefineStd(Builder, "SPIRV", Opts);40}4142void SPIRVTargetInfo::getTargetDefines(const LangOptions &Opts,43MacroBuilder &Builder) const {44BaseSPIRVTargetInfo::getTargetDefines(Opts, Builder);45}4647void SPIRV32TargetInfo::getTargetDefines(const LangOptions &Opts,48MacroBuilder &Builder) const {49BaseSPIRVTargetInfo::getTargetDefines(Opts, Builder);50DefineStd(Builder, "SPIRV32", Opts);51}5253void SPIRV64TargetInfo::getTargetDefines(const LangOptions &Opts,54MacroBuilder &Builder) const {55BaseSPIRVTargetInfo::getTargetDefines(Opts, Builder);56DefineStd(Builder, "SPIRV64", Opts);57}5859static const AMDGPUTargetInfo AMDGPUTI(llvm::Triple("amdgcn-amd-amdhsa"), {});6061ArrayRef<const char *> SPIRV64AMDGCNTargetInfo::getGCCRegNames() const {62return AMDGPUTI.getGCCRegNames();63}6465bool SPIRV64AMDGCNTargetInfo::initFeatureMap(66llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef,67const std::vector<std::string> &FeatureVec) const {68llvm::AMDGPU::fillAMDGPUFeatureMap({}, getTriple(), Features);6970return TargetInfo::initFeatureMap(Features, Diags, {}, FeatureVec);71}7273bool SPIRV64AMDGCNTargetInfo::validateAsmConstraint(74const char *&Name, TargetInfo::ConstraintInfo &Info) const {75return AMDGPUTI.validateAsmConstraint(Name, Info);76}7778std::string79SPIRV64AMDGCNTargetInfo::convertConstraint(const char *&Constraint) const {80return AMDGPUTI.convertConstraint(Constraint);81}8283ArrayRef<Builtin::Info> SPIRV64AMDGCNTargetInfo::getTargetBuiltins() const {84return AMDGPUTI.getTargetBuiltins();85}8687void SPIRV64AMDGCNTargetInfo::getTargetDefines(const LangOptions &Opts,88MacroBuilder &Builder) const {89BaseSPIRVTargetInfo::getTargetDefines(Opts, Builder);90DefineStd(Builder, "SPIRV64", Opts);9192Builder.defineMacro("__AMD__");93Builder.defineMacro("__AMDGPU__");94Builder.defineMacro("__AMDGCN__");95}9697void SPIRV64AMDGCNTargetInfo::setAuxTarget(const TargetInfo *Aux) {98assert(Aux && "Cannot invoke setAuxTarget without a valid auxiliary target!");99100// This is a 1:1 copy of AMDGPUTargetInfo::setAuxTarget()101assert(HalfFormat == Aux->HalfFormat);102assert(FloatFormat == Aux->FloatFormat);103assert(DoubleFormat == Aux->DoubleFormat);104105// On x86_64 long double is 80-bit extended precision format, which is106// not supported by AMDGPU. 128-bit floating point format is also not107// supported by AMDGPU. Therefore keep its own format for these two types.108auto SaveLongDoubleFormat = LongDoubleFormat;109auto SaveFloat128Format = Float128Format;110auto SaveLongDoubleWidth = LongDoubleWidth;111auto SaveLongDoubleAlign = LongDoubleAlign;112copyAuxTarget(Aux);113LongDoubleFormat = SaveLongDoubleFormat;114Float128Format = SaveFloat128Format;115LongDoubleWidth = SaveLongDoubleWidth;116LongDoubleAlign = SaveLongDoubleAlign;117// For certain builtin types support on the host target, claim they are118// supported to pass the compilation of the host code during the device-side119// compilation.120// FIXME: As the side effect, we also accept `__float128` uses in the device121// code. To reject these builtin types supported in the host target but not in122// the device target, one approach would support `device_builtin` attribute123// so that we could tell the device builtin types from the host ones. This124// also solves the different representations of the same builtin type, such125// as `size_t` in the MSVC environment.126if (Aux->hasFloat128Type()) {127HasFloat128 = true;128Float128Format = DoubleFormat;129}130}131132133