We had some odd places where we set target behaviors. We were setting the long size in target-specific code, but it should be language-based. We were not setting the Half float type semantics correctly, and instead were overriding the query in the AST context. This change it moves existing code to the right places in the Target so that as we continue working on target and language feature they are controlled in the right places. It also fixes a bug where the size of `half` was computed incorrectly when native half types are not supported.
103 lines
3.1 KiB
C++
103 lines
3.1 KiB
C++
//===--- DirectX.h - Declare DirectX target feature support -----*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file declares DXIL TargetInfo objects.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_DIRECTX_H
|
|
#define LLVM_CLANG_LIB_BASIC_TARGETS_DIRECTX_H
|
|
#include "clang/Basic/TargetInfo.h"
|
|
#include "clang/Basic/TargetOptions.h"
|
|
#include "llvm/Support/Compiler.h"
|
|
#include "llvm/TargetParser/Triple.h"
|
|
|
|
namespace clang {
|
|
namespace targets {
|
|
|
|
static const unsigned DirectXAddrSpaceMap[] = {
|
|
0, // Default
|
|
1, // opencl_global
|
|
3, // opencl_local
|
|
2, // opencl_constant
|
|
0, // opencl_private
|
|
4, // opencl_generic
|
|
5, // opencl_global_device
|
|
6, // opencl_global_host
|
|
0, // cuda_device
|
|
0, // cuda_constant
|
|
0, // cuda_shared
|
|
// SYCL address space values for this map are dummy
|
|
0, // sycl_global
|
|
0, // sycl_global_device
|
|
0, // sycl_global_host
|
|
0, // sycl_local
|
|
0, // sycl_private
|
|
0, // ptr32_sptr
|
|
0, // ptr32_uptr
|
|
0, // ptr64
|
|
3, // hlsl_groupshared
|
|
// Wasm address space values for this target are dummy values,
|
|
// as it is only enabled for Wasm targets.
|
|
20, // wasm_funcref
|
|
};
|
|
|
|
class LLVM_LIBRARY_VISIBILITY DirectXTargetInfo : public TargetInfo {
|
|
public:
|
|
DirectXTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
|
|
: TargetInfo(Triple) {
|
|
TLSSupported = false;
|
|
VLASupported = false;
|
|
AddrSpaceMap = &DirectXAddrSpaceMap;
|
|
UseAddrSpaceMapMangling = true;
|
|
HasLegalHalfType = true;
|
|
HasFloat16 = true;
|
|
NoAsmVariants = true;
|
|
PlatformMinVersion = Triple.getOSVersion();
|
|
PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
|
|
resetDataLayout("e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:"
|
|
"32-f64:64-n8:16:32:64");
|
|
TheCXXABI.set(TargetCXXABI::Microsoft);
|
|
}
|
|
bool useFP16ConversionIntrinsics() const override { return false; }
|
|
void getTargetDefines(const LangOptions &Opts,
|
|
MacroBuilder &Builder) const override;
|
|
|
|
bool hasFeature(StringRef Feature) const override {
|
|
return Feature == "directx";
|
|
}
|
|
|
|
ArrayRef<Builtin::Info> getTargetBuiltins() const override {
|
|
return std::nullopt;
|
|
}
|
|
|
|
std::string_view getClobbers() const override { return ""; }
|
|
|
|
ArrayRef<const char *> getGCCRegNames() const override {
|
|
return std::nullopt;
|
|
}
|
|
|
|
bool validateAsmConstraint(const char *&Name,
|
|
TargetInfo::ConstraintInfo &info) const override {
|
|
return true;
|
|
}
|
|
|
|
ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {
|
|
return std::nullopt;
|
|
}
|
|
|
|
BuiltinVaListKind getBuiltinVaListKind() const override {
|
|
return TargetInfo::VoidPtrBuiltinVaList;
|
|
}
|
|
};
|
|
|
|
} // namespace targets
|
|
} // namespace clang
|
|
|
|
#endif // LLVM_CLANG_LIB_BASIC_TARGETS_DIRECTX_H
|