Skip to content

Commit 1615b6b

Browse files
committed
Address feedback: split common, vk and ocl builtins
The SPIR-V builtins are now split into 3 differents file: BuiltinsSPIRVCore.td, BuiltinsSPIRVVK.td for Vulkan specific builtins, BuiltinsSPIRVCL.td for OpenCL specific builtins and BuiltinsSPIRVCommon.td for common ones.
1 parent 020a804 commit 1615b6b

15 files changed

+163
-63
lines changed

clang/include/clang/Basic/BuiltinsSPIRV.td

Lines changed: 0 additions & 48 deletions
This file was deleted.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//===--- BuiltinsSPIRVBase.td - SPIRV Builtin function database -*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
include "clang/Basic/BuiltinsBase.td"
10+
11+
class SPIRVBuiltin<string prototype, list<Attribute> Attr> : Builtin {
12+
let Spellings = ["__builtin_spirv_"#NAME];
13+
let Prototype = prototype;
14+
let Attributes = !listconcat([NoThrow], Attr);
15+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//===--- BuiltinsSPIRVCL.td - SPIRV Builtin function database ---*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
include "clang/Basic/BuiltinsSPIRVBase.td"
10+
11+
def generic_cast_to_ptr_explicit
12+
: SPIRVBuiltin<"void*(void*, int)", [NoThrow, Const, CustomTypeChecking]>;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//===- BuiltinsSPIRVCommon.td - SPIRV Builtin function database -*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
include "clang/Basic/BuiltinsSPIRVBase.td"
10+
11+
def distance : SPIRVBuiltin<"void(...)", [NoThrow, Const]>;
12+
def length : SPIRVBuiltin<"void(...)", [NoThrow, Const]>;
13+
def smoothstep : SPIRVBuiltin<"void(...)", [NoThrow, Const, CustomTypeChecking]>;
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
//===--- BuiltinsSPIRVVK.td - SPIRV Builtin function database ---*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
include "clang/Basic/BuiltinsSPIRVBase.td"
10+
11+
12+
def reflect : SPIRVBuiltin<"void(...)", [NoThrow, Const]>;
13+
def faceforward : SPIRVBuiltin<"void(...)", [NoThrow, Const, CustomTypeChecking]>;

clang/include/clang/Basic/CMakeLists.txt

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,17 @@ clang_tablegen(BuiltinsRISCV.inc -gen-clang-builtins
103103
SOURCE BuiltinsRISCV.td
104104
TARGET ClangBuiltinsRISCV)
105105

106-
clang_tablegen(BuiltinsSPIRV.inc -gen-clang-builtins
107-
SOURCE BuiltinsSPIRV.td
108-
TARGET ClangBuiltinsSPIRV)
106+
clang_tablegen(BuiltinsSPIRVCommon.inc -gen-clang-builtins
107+
SOURCE BuiltinsSPIRVCommon.td
108+
TARGET ClangBuiltinsSPIRVCommon)
109+
110+
clang_tablegen(BuiltinsSPIRVVK.inc -gen-clang-builtins
111+
SOURCE BuiltinsSPIRVVK.td
112+
TARGET ClangBuiltinsSPIRVVK)
113+
114+
clang_tablegen(BuiltinsSPIRVCL.inc -gen-clang-builtins
115+
SOURCE BuiltinsSPIRVCL.td
116+
TARGET ClangBuiltinsSPIRVCL)
109117

110118
clang_tablegen(BuiltinsX86.inc -gen-clang-builtins
111119
SOURCE BuiltinsX86.td

clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12741,6 +12741,8 @@ def err_bit_int_max_size : Error<"%select{signed|unsigned}0 _BitInt of bit "
1274112741
"sizes greater than %1 not supported">;
1274212742

1274312743
// SPIR-V builtins diagnostics
12744+
def err_spirv_invalid_target : Error<
12745+
"builtin requires %select{spirv|spirv32 or spirv64}0 target">;
1274412746
def err_spirv_builtin_generic_cast_invalid_arg : Error<
1274512747
"expecting a pointer argument to the generic address space">;
1274612748
def err_spirv_enum_not_int : Error<

clang/include/clang/Basic/TargetBuiltins.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,17 @@ namespace clang {
157157
enum {
158158
LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
159159
#define GET_BUILTIN_ENUMERATORS
160-
#include "clang/Basic/BuiltinsSPIRV.inc"
160+
#include "clang/Basic/BuiltinsSPIRVCommon.inc"
161+
#undef GET_BUILTIN_ENUMERATORS
162+
FirstVKBuiltin,
163+
LastCoreBuiltin = FirstVKBuiltin - 1,
164+
#define GET_BUILTIN_ENUMERATORS
165+
#include "clang/Basic/BuiltinsSPIRVVK.inc"
166+
#undef GET_BUILTIN_ENUMERATORS
167+
FirstCLBuiltin,
168+
LastVKBuiltin = FirstCLBuiltin - 1,
169+
#define GET_BUILTIN_ENUMERATORS
170+
#include "clang/Basic/BuiltinsSPIRVCL.inc"
161171
#undef GET_BUILTIN_ENUMERATORS
162172
LastTSBuiltin
163173
};

clang/include/clang/Sema/SemaSPIRV.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ class SemaSPIRV : public SemaBase {
2121
public:
2222
SemaSPIRV(Sema &S);
2323

24-
bool CheckSPIRVBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall);
24+
bool CheckSPIRVBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
25+
CallExpr *TheCall);
2526
};
2627
} // namespace clang
2728

clang/lib/Basic/Targets/SPIR.cpp

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,48 @@ static constexpr int NumBuiltins =
2424
clang::SPIRV::LastTSBuiltin - Builtin::FirstTSBuiltin;
2525

2626
#define GET_BUILTIN_STR_TABLE
27-
#include "clang/Basic/BuiltinsSPIRV.inc"
27+
#include "clang/Basic/BuiltinsSPIRVCommon.inc"
2828
#undef GET_BUILTIN_STR_TABLE
2929

3030
static constexpr Builtin::Info BuiltinInfos[] = {
3131
#define GET_BUILTIN_INFOS
32-
#include "clang/Basic/BuiltinsSPIRV.inc"
32+
#include "clang/Basic/BuiltinsSPIRVCommon.inc"
3333
#undef GET_BUILTIN_INFOS
3434
};
35-
static_assert(std::size(BuiltinInfos) == NumBuiltins);
35+
36+
namespace CL {
37+
#define GET_BUILTIN_STR_TABLE
38+
#include "clang/Basic/BuiltinsSPIRVCL.inc"
39+
#undef GET_BUILTIN_STR_TABLE
40+
41+
static constexpr Builtin::Info BuiltinInfos[] = {
42+
#define GET_BUILTIN_INFOS
43+
#include "clang/Basic/BuiltinsSPIRVCL.inc"
44+
#undef GET_BUILTIN_INFOS
45+
};
46+
} // namespace CL
47+
48+
namespace VK {
49+
#define GET_BUILTIN_STR_TABLE
50+
#include "clang/Basic/BuiltinsSPIRVVK.inc"
51+
#undef GET_BUILTIN_STR_TABLE
52+
53+
static constexpr Builtin::Info BuiltinInfos[] = {
54+
#define GET_BUILTIN_INFOS
55+
#include "clang/Basic/BuiltinsSPIRVVK.inc"
56+
#undef GET_BUILTIN_INFOS
57+
};
58+
} // namespace VK
59+
60+
static_assert(std::size(BuiltinInfos) + std::size(CL::BuiltinInfos) +
61+
std::size(VK::BuiltinInfos) ==
62+
NumBuiltins);
3663

3764
llvm::SmallVector<Builtin::InfosShard>
3865
BaseSPIRVTargetInfo::getTargetBuiltins() const {
39-
return {{&BuiltinStrings, BuiltinInfos}};
66+
return {{&BuiltinStrings, BuiltinInfos},
67+
{&VK::BuiltinStrings, VK::BuiltinInfos},
68+
{&CL::BuiltinStrings, CL::BuiltinInfos}};
4069
}
4170

4271
void SPIRTargetInfo::getTargetDefines(const LangOptions &Opts,

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,13 @@ static Value *EmitTargetArchBuiltinExpr(CodeGenFunction *CGF,
9696
case llvm::Triple::riscv32:
9797
case llvm::Triple::riscv64:
9898
return CGF->EmitRISCVBuiltinExpr(BuiltinID, E, ReturnValue);
99-
case llvm::Triple::spirv:
10099
case llvm::Triple::spirv32:
101100
case llvm::Triple::spirv64:
102-
if (CGF->getTarget().getTriple().getOS() != llvm::Triple::OSType::AMDHSA)
103-
return CGF->EmitSPIRVBuiltinExpr(BuiltinID, E);
104-
return CGF->EmitAMDGPUBuiltinExpr(BuiltinID, E);
101+
if (CGF->getTarget().getTriple().getOS() == llvm::Triple::OSType::AMDHSA)
102+
return CGF->EmitAMDGPUBuiltinExpr(BuiltinID, E);
103+
[[fallthrough]];
104+
case llvm::Triple::spirv:
105+
return CGF->EmitSPIRVBuiltinExpr(BuiltinID, E);
105106
default:
106107
return nullptr;
107108
}

clang/lib/Sema/SemaChecking.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1986,7 +1986,7 @@ bool Sema::CheckTSBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID,
19861986
case llvm::Triple::spirv32:
19871987
case llvm::Triple::spirv64:
19881988
if (TI.getTriple().getOS() != llvm::Triple::OSType::AMDHSA)
1989-
return SPIRV().CheckSPIRVBuiltinFunctionCall(BuiltinID, TheCall);
1989+
return SPIRV().CheckSPIRVBuiltinFunctionCall(TI, BuiltinID, TheCall);
19901990
return false;
19911991
case llvm::Triple::systemz:
19921992
return SystemZ().CheckSystemZBuiltinFunctionCall(BuiltinID, TheCall);

clang/lib/Sema/SemaSPIRV.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include "clang/Sema/SemaSPIRV.h"
1212
#include "clang/Basic/TargetBuiltins.h"
13+
#include "clang/Basic/TargetInfo.h"
1314
#include "clang/Sema/Sema.h"
1415

1516
// SPIR-V enumerants. Enums have only the required entries, see SPIR-V specs for
@@ -138,8 +139,21 @@ static bool checkGenericCastToPtr(Sema &SemaRef, CallExpr *Call) {
138139
return false;
139140
}
140141

141-
bool SemaSPIRV::CheckSPIRVBuiltinFunctionCall(unsigned BuiltinID,
142+
bool SemaSPIRV::CheckSPIRVBuiltinFunctionCall(const TargetInfo &TI,
143+
unsigned BuiltinID,
142144
CallExpr *TheCall) {
145+
if (BuiltinID >= SPIRV::FirstVKBuiltin && BuiltinID <= SPIRV::LastVKBuiltin &&
146+
TI.getTriple().getArch() != llvm::Triple::spirv) {
147+
SemaRef.Diag(TheCall->getBeginLoc(), diag::err_spirv_invalid_target) << 0;
148+
return true;
149+
}
150+
if (BuiltinID >= SPIRV::FirstCLBuiltin && BuiltinID <= SPIRV::LastTSBuiltin &&
151+
TI.getTriple().getArch() != llvm::Triple::spirv32 &&
152+
TI.getTriple().getArch() != llvm::Triple::spirv64) {
153+
SemaRef.Diag(TheCall->getBeginLoc(), diag::err_spirv_invalid_target) << 1;
154+
return true;
155+
}
156+
143157
switch (BuiltinID) {
144158
case SPIRV::BI__builtin_spirv_distance: {
145159
if (SemaRef.checkArgCount(TheCall, 2))
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// RUN: %clang_cc1 -triple spirv-pc-vulkan-compute -Wno-unused-value -verify=invalid %s -o -
2+
// RUN: %clang_cc1 -triple spirv32 -verify=valid -Wno-unused-value %s -cl-std=CL3.0 -x cl -o -
3+
// RUN: %clang_cc1 -triple spirv64 -verify=valid -Wno-unused-value %s -cl-std=CL3.0 -x cl -o -
4+
5+
typedef float float2 __attribute__((ext_vector_type(2)));
6+
7+
// valid-no-diagnostics
8+
9+
void invalid_builtin_for_target(int* p) {
10+
__builtin_spirv_generic_cast_to_ptr_explicit(p, 7);
11+
// invalid-error@-1 {{builtin requires spirv32 or spirv64 target}}
12+
}
13+
14+
// no error
15+
float valid_builtin(float2 X) { return __builtin_spirv_length(X); }
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// RUN: %clang_cc1 -triple spirv-pc-vulkan-compute -Wno-unused-value -verify=valid %s -o -
2+
// RUN: %clang_cc1 -triple spirv32 -verify=invalid -Wno-unused-value %s -cl-std=CL3.0 -x cl -o -
3+
// RUN: %clang_cc1 -triple spirv64 -verify=invalid -Wno-unused-value %s -cl-std=CL3.0 -x cl -o -
4+
5+
typedef float float2 __attribute__((ext_vector_type(2)));
6+
7+
// valid-no-diagnostics
8+
9+
void call(float2 X, float2 Y) {
10+
__builtin_spirv_reflect(X, Y);
11+
// invalid-error@-1 {{builtin requires spirv target}}
12+
}
13+
14+
// no error
15+
float valid_builtin(float2 X) { return __builtin_spirv_length(X); }

0 commit comments

Comments
 (0)