diff --git a/clang/include/clang/Basic/BuiltinsDirectX.def b/clang/include/clang/Basic/BuiltinsDirectX.def new file mode 100644 --- /dev/null +++ b/clang/include/clang/Basic/BuiltinsDirectX.def @@ -0,0 +1,27 @@ +//===-- BuiltinsDirectX.def - DirectX Builtin function database -*- 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 defines the DirectX-specific builtin function database. Users of +// this file must define the BUILTIN macro to make use of this information. +// +//===----------------------------------------------------------------------===// + +// The format of this database matches clang/Basic/Builtins.def. + +#if defined(BUILTIN) && !defined(TARGET_BUILTIN) +# define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BUILTIN(ID, TYPE, ATTRS) +#endif + +#if defined(BUILTIN) && !defined(TARGET_HEADER_BUILTIN) +# define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANG, FEATURE) BUILTIN(ID, TYPE, ATTRS) +#endif + +BUILTIN(__builtin_dx_sin_f32, "ff", "ne") + +#undef BUILTIN +#undef TARGET_BUILTIN diff --git a/clang/include/clang/Basic/TargetBuiltins.h b/clang/include/clang/Basic/TargetBuiltins.h --- a/clang/include/clang/Basic/TargetBuiltins.h +++ b/clang/include/clang/Basic/TargetBuiltins.h @@ -75,6 +75,16 @@ }; } + /// DirectX builtins + namespace DirectX { + enum { + LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1, +#define BUILTIN(ID, TYPE, ATTRS) BI##ID, +#include "clang/Basic/BuiltinsDirectX.def" + LastTSBuiltin + }; + } // namespace DirectX + /// PPC builtins namespace PPC { enum { diff --git a/clang/lib/Basic/Targets/DirectX.h b/clang/lib/Basic/Targets/DirectX.h --- a/clang/lib/Basic/Targets/DirectX.h +++ b/clang/lib/Basic/Targets/DirectX.h @@ -44,6 +44,9 @@ }; class LLVM_LIBRARY_VISIBILITY DirectXTargetInfo : public TargetInfo { + + static const Builtin::Info BuiltinInfo[]; + public: DirectXTargetInfo(const llvm::Triple &Triple, const TargetOptions &) : TargetInfo(Triple) { @@ -66,7 +69,7 @@ return Feature == "directx"; } - ArrayRef getTargetBuiltins() const override { return None; } + ArrayRef getTargetBuiltins() const override; const char *getClobbers() const override { return ""; } diff --git a/clang/lib/Basic/Targets/DirectX.cpp b/clang/lib/Basic/Targets/DirectX.cpp --- a/clang/lib/Basic/Targets/DirectX.cpp +++ b/clang/lib/Basic/Targets/DirectX.cpp @@ -12,6 +12,8 @@ #include "DirectX.h" #include "Targets.h" +#include "clang/Basic/Builtins.h" +#include "clang/Basic/TargetBuiltins.h" using namespace clang; using namespace clang::targets; @@ -20,3 +22,16 @@ MacroBuilder &Builder) const { DefineStd(Builder, "DIRECTX", Opts); } + +const Builtin::Info DirectXTargetInfo::BuiltinInfo[] = { +#define BUILTIN(ID, TYPE, ATTRS) \ + {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr}, +#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \ + {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE}, +#include "clang/Basic/BuiltinsDirectX.def" +}; + +ArrayRef DirectXTargetInfo::getTargetBuiltins() const { + return llvm::makeArrayRef(BuiltinInfo, clang::DirectX::LastTSBuiltin - + Builtin::FirstTSBuiltin); +} diff --git a/clang/test/SemaHLSL/Builtins/sin_f32.hlsl b/clang/test/SemaHLSL/Builtins/sin_f32.hlsl new file mode 100644 --- /dev/null +++ b/clang/test/SemaHLSL/Builtins/sin_f32.hlsl @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.15-library -x hlsl -ast-dump -o - %s | FileCheck %s + +//CHECK: CallExpr 0x{{.+}} 'float' +//CHECK-NEXT:ImplicitCastExpr 0x{{.+}} 'float (*)(float) throw()' +//CHECK-NEXT`-DeclRefExpr 0x{{.+}} '' Function 0x26df56e3fc0 '__builtin_dx_sin_f32' + +float foo(float a) { + return __builtin_dx_sin_f32(a); +}