Skip to content

Commit d465594

Browse files
Merge from 'main' to 'sycl-web' (1 commits)
CONFLICT (content): Merge conflict in clang/lib/CodeGen/CGBuiltin.cpp
2 parents 895bb1e + 16c84c4 commit d465594

File tree

20 files changed

+264
-100
lines changed

20 files changed

+264
-100
lines changed

.github/new-prs-labeler.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,12 @@ backend:DirectX:
660660
- '**/*dxil*/**'
661661
- '**/*DXContainer*'
662662
- '**/*DXContainer*/**'
663+
- clang/lib/Sema/SemaDirectX.cpp
664+
- clang/include/clang/Sema/SemaDirectX.h
665+
- clang/include/clang/Basic/BuiltinsDirectX.td
666+
- clang/lib/CodeGen/TargetBuiltins/DirectX.cpp
667+
- clang/test/CodeGenDirectX/**
668+
- clang/test/SemaDirectX/**
663669

664670
backend:SPIR-V:
665671
- clang/lib/Driver/ToolChains/SPIRV.*

clang/include/clang/Basic/Builtins.td

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4910,12 +4910,6 @@ def HLSLDotProduct : LangBuiltin<"HLSL_LANG"> {
49104910
let Prototype = "void(...)";
49114911
}
49124912

4913-
def HLSLDot2Add : LangBuiltin<"HLSL_LANG"> {
4914-
let Spellings = ["__builtin_hlsl_dot2add"];
4915-
let Attributes = [NoThrow, Const];
4916-
let Prototype = "float(_ExtVector<2, _Float16>, _ExtVector<2, _Float16>, float)";
4917-
}
4918-
49194913
def HLSLDot4AddI8Packed : LangBuiltin<"HLSL_LANG"> {
49204914
let Spellings = ["__builtin_hlsl_dot4add_i8packed"];
49214915
let Attributes = [NoThrow, Const];
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//===--- BuiltinsDirectX.td - DirectX Builtin function database -----------===//
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+
def DxDot2Add : Builtin {
12+
let Spellings = ["__builtin_dx_dot2add"];
13+
let Attributes = [NoThrow, Const];
14+
let Prototype = "float(_ExtVector<2, _Float16>, _ExtVector<2, _Float16>, float)";
15+
}

clang/include/clang/Basic/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ clang_tablegen(BuiltinsBPF.inc -gen-clang-builtins
8282
SOURCE BuiltinsBPF.td
8383
TARGET ClangBuiltinsBPF)
8484

85+
clang_tablegen(BuiltinsDirectX.inc -gen-clang-builtins
86+
SOURCE BuiltinsDirectX.td
87+
TARGET ClangBuiltinsDirectX)
88+
8589
clang_tablegen(BuiltinsHexagon.inc -gen-clang-builtins
8690
SOURCE BuiltinsHexagon.td
8791
TARGET ClangBuiltinsHexagon)

clang/include/clang/Basic/TargetBuiltins.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,17 @@ namespace clang {
141141
};
142142
}
143143

144+
/// DirectX builtins
145+
namespace DirectX {
146+
enum {
147+
LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
148+
#define GET_BUILTIN_ENUMERATORS
149+
#include "clang/Basic/BuiltinsDirectX.inc"
150+
#undef GET_BUILTIN_ENUMERATORS
151+
LastTSBuiltin
152+
};
153+
} // namespace DirectX
154+
144155
/// SPIRV builtins
145156
namespace SPIRV {
146157
enum {

clang/include/clang/Sema/Sema.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ class SemaAVR;
160160
class SemaBPF;
161161
class SemaCodeCompletion;
162162
class SemaCUDA;
163+
class SemaDirectX;
163164
class SemaHLSL;
164165
class SemaHexagon;
165166
class SemaLoongArch;
@@ -1079,6 +1080,11 @@ class Sema final : public SemaBase {
10791080
return *CUDAPtr;
10801081
}
10811082

1083+
SemaDirectX &DirectX() {
1084+
assert(DirectXPtr);
1085+
return *DirectXPtr;
1086+
}
1087+
10821088
SemaHLSL &HLSL() {
10831089
assert(HLSLPtr);
10841090
return *HLSLPtr;
@@ -1217,6 +1223,7 @@ class Sema final : public SemaBase {
12171223
std::unique_ptr<SemaBPF> BPFPtr;
12181224
std::unique_ptr<SemaCodeCompletion> CodeCompletionPtr;
12191225
std::unique_ptr<SemaCUDA> CUDAPtr;
1226+
std::unique_ptr<SemaDirectX> DirectXPtr;
12201227
std::unique_ptr<SemaHLSL> HLSLPtr;
12211228
std::unique_ptr<SemaHexagon> HexagonPtr;
12221229
std::unique_ptr<SemaLoongArch> LoongArchPtr;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//===----- SemaDirectX.h ----- Semantic Analysis for DirectX constructs----===//
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+
/// \file
9+
/// This file declares semantic analysis for DirectX constructs.
10+
///
11+
//===----------------------------------------------------------------------===//
12+
13+
#ifndef LLVM_CLANG_SEMA_SEMADIRECTX_H
14+
#define LLVM_CLANG_SEMA_SEMADIRECTX_H
15+
16+
#include "clang/AST/ASTFwd.h"
17+
#include "clang/Sema/SemaBase.h"
18+
19+
namespace clang {
20+
class SemaDirectX : public SemaBase {
21+
public:
22+
SemaDirectX(Sema &S);
23+
24+
bool CheckDirectXBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall);
25+
};
26+
} // namespace clang
27+
28+
#endif // LLVM_CLANG_SEMA_SEMADIRECTX_H

clang/lib/Basic/Targets/DirectX.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,31 @@
1212

1313
#include "DirectX.h"
1414
#include "Targets.h"
15+
#include "clang/Basic/TargetBuiltins.h"
1516

1617
using namespace clang;
1718
using namespace clang::targets;
1819

20+
static constexpr int NumBuiltins =
21+
clang::DirectX::LastTSBuiltin - Builtin::FirstTSBuiltin;
22+
23+
#define GET_BUILTIN_STR_TABLE
24+
#include "clang/Basic/BuiltinsDirectX.inc"
25+
#undef GET_BUILTIN_STR_TABLE
26+
27+
static constexpr Builtin::Info BuiltinInfos[] = {
28+
#define GET_BUILTIN_INFOS
29+
#include "clang/Basic/BuiltinsDirectX.inc"
30+
#undef GET_BUILTIN_INFOS
31+
};
32+
static_assert(std::size(BuiltinInfos) == NumBuiltins);
33+
1934
void DirectXTargetInfo::getTargetDefines(const LangOptions &Opts,
2035
MacroBuilder &Builder) const {
2136
DefineStd(Builder, "DIRECTX", Opts);
2237
}
38+
39+
llvm::SmallVector<Builtin::InfosShard>
40+
DirectXTargetInfo::getTargetBuiltins() const {
41+
return {{&BuiltinStrings, BuiltinInfos}};
42+
}

clang/lib/Basic/Targets/DirectX.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,7 @@ class LLVM_LIBRARY_VISIBILITY DirectXTargetInfo : public TargetInfo {
7373
return Feature == "directx";
7474
}
7575

76-
llvm::SmallVector<Builtin::InfosShard> getTargetBuiltins() const override {
77-
return {};
78-
}
76+
llvm::SmallVector<Builtin::InfosShard> getTargetBuiltins() const override;
7977

8078
std::string_view getClobbers() const override { return ""; }
8179

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 79 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,84 @@ using namespace clang;
4343
using namespace CodeGen;
4444
using namespace llvm;
4545

46+
static Value *EmitTargetArchBuiltinExpr(CodeGenFunction *CGF,
47+
unsigned BuiltinID, const CallExpr *E,
48+
ReturnValueSlot ReturnValue,
49+
llvm::Triple::ArchType Arch) {
50+
// When compiling in HipStdPar mode we have to be conservative in rejecting
51+
// target specific features in the FE, and defer the possible error to the
52+
// AcceleratorCodeSelection pass, wherein iff an unsupported target builtin is
53+
// referenced by an accelerator executable function, we emit an error.
54+
// Returning nullptr here leads to the builtin being handled in
55+
// EmitStdParUnsupportedBuiltin.
56+
if (CGF->getLangOpts().HIPStdPar && CGF->getLangOpts().CUDAIsDevice &&
57+
Arch != CGF->getTarget().getTriple().getArch())
58+
return nullptr;
59+
60+
switch (Arch) {
61+
case llvm::Triple::arm:
62+
case llvm::Triple::armeb:
63+
case llvm::Triple::thumb:
64+
case llvm::Triple::thumbeb:
65+
return CGF->EmitARMBuiltinExpr(BuiltinID, E, ReturnValue, Arch);
66+
case llvm::Triple::aarch64:
67+
case llvm::Triple::aarch64_32:
68+
case llvm::Triple::aarch64_be:
69+
return CGF->EmitAArch64BuiltinExpr(BuiltinID, E, Arch);
70+
case llvm::Triple::bpfeb:
71+
case llvm::Triple::bpfel:
72+
return CGF->EmitBPFBuiltinExpr(BuiltinID, E);
73+
case llvm::Triple::dxil:
74+
return CGF->EmitDirectXBuiltinExpr(BuiltinID, E);
75+
case llvm::Triple::x86:
76+
case llvm::Triple::x86_64:
77+
return CGF->EmitX86BuiltinExpr(BuiltinID, E);
78+
case llvm::Triple::ppc:
79+
case llvm::Triple::ppcle:
80+
case llvm::Triple::ppc64:
81+
case llvm::Triple::ppc64le:
82+
return CGF->EmitPPCBuiltinExpr(BuiltinID, E);
83+
case llvm::Triple::r600:
84+
case llvm::Triple::amdgcn:
85+
return CGF->EmitAMDGPUBuiltinExpr(BuiltinID, E);
86+
case llvm::Triple::systemz:
87+
return CGF->EmitSystemZBuiltinExpr(BuiltinID, E);
88+
case llvm::Triple::nvptx:
89+
case llvm::Triple::nvptx64:
90+
return CGF->EmitNVPTXBuiltinExpr(BuiltinID, E);
91+
case llvm::Triple::wasm32:
92+
case llvm::Triple::wasm64:
93+
return CGF->EmitWebAssemblyBuiltinExpr(BuiltinID, E);
94+
case llvm::Triple::hexagon:
95+
return CGF->EmitHexagonBuiltinExpr(BuiltinID, E);
96+
case llvm::Triple::riscv32:
97+
case llvm::Triple::riscv64:
98+
return CGF->EmitRISCVBuiltinExpr(BuiltinID, E, ReturnValue);
99+
case llvm::Triple::spirv:
100+
return CGF->EmitSPIRVBuiltinExpr(BuiltinID, E);
101+
case llvm::Triple::spirv64:
102+
if (CGF->getTarget().getTriple().getOS() != llvm::Triple::OSType::AMDHSA)
103+
return nullptr;
104+
return CGF->EmitAMDGPUBuiltinExpr(BuiltinID, E);
105+
default:
106+
return nullptr;
107+
}
108+
}
109+
110+
Value *CodeGenFunction::EmitTargetBuiltinExpr(unsigned BuiltinID,
111+
const CallExpr *E,
112+
ReturnValueSlot ReturnValue) {
113+
if (getContext().BuiltinInfo.isAuxBuiltinID(BuiltinID)) {
114+
assert(getContext().getAuxTargetInfo() && "Missing aux target info");
115+
return EmitTargetArchBuiltinExpr(
116+
this, getContext().BuiltinInfo.getAuxBuiltinID(BuiltinID), E,
117+
ReturnValue, getContext().getAuxTargetInfo()->getTriple().getArch());
118+
}
119+
120+
return EmitTargetArchBuiltinExpr(this, BuiltinID, E, ReturnValue,
121+
getTarget().getTriple().getArch());
122+
}
123+
46124
static void initializeAlloca(CodeGenFunction &CGF, AllocaInst *AI, Value *Size,
47125
Align AlignmentInBytes) {
48126
ConstantInt *Byte;
@@ -6214,82 +6292,6 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
62146292
return GetUndefRValue(E->getType());
62156293
}
62166294

6217-
static Value *EmitTargetArchBuiltinExpr(CodeGenFunction *CGF,
6218-
unsigned BuiltinID, const CallExpr *E,
6219-
ReturnValueSlot ReturnValue,
6220-
llvm::Triple::ArchType Arch) {
6221-
// When compiling in HipStdPar mode we have to be conservative in rejecting
6222-
// target specific features in the FE, and defer the possible error to the
6223-
// AcceleratorCodeSelection pass, wherein iff an unsupported target builtin is
6224-
// referenced by an accelerator executable function, we emit an error.
6225-
// Returning nullptr here leads to the builtin being handled in
6226-
// EmitStdParUnsupportedBuiltin.
6227-
if (CGF->getLangOpts().HIPStdPar && CGF->getLangOpts().CUDAIsDevice &&
6228-
Arch != CGF->getTarget().getTriple().getArch())
6229-
return nullptr;
6230-
6231-
switch (Arch) {
6232-
case llvm::Triple::arm:
6233-
case llvm::Triple::armeb:
6234-
case llvm::Triple::thumb:
6235-
case llvm::Triple::thumbeb:
6236-
return CGF->EmitARMBuiltinExpr(BuiltinID, E, ReturnValue, Arch);
6237-
case llvm::Triple::aarch64:
6238-
case llvm::Triple::aarch64_32:
6239-
case llvm::Triple::aarch64_be:
6240-
return CGF->EmitAArch64BuiltinExpr(BuiltinID, E, Arch);
6241-
case llvm::Triple::bpfeb:
6242-
case llvm::Triple::bpfel:
6243-
return CGF->EmitBPFBuiltinExpr(BuiltinID, E);
6244-
case llvm::Triple::x86:
6245-
case llvm::Triple::x86_64:
6246-
return CGF->EmitX86BuiltinExpr(BuiltinID, E);
6247-
case llvm::Triple::ppc:
6248-
case llvm::Triple::ppcle:
6249-
case llvm::Triple::ppc64:
6250-
case llvm::Triple::ppc64le:
6251-
return CGF->EmitPPCBuiltinExpr(BuiltinID, E);
6252-
case llvm::Triple::r600:
6253-
case llvm::Triple::amdgcn:
6254-
return CGF->EmitAMDGPUBuiltinExpr(BuiltinID, E);
6255-
case llvm::Triple::systemz:
6256-
return CGF->EmitSystemZBuiltinExpr(BuiltinID, E);
6257-
case llvm::Triple::nvptx:
6258-
case llvm::Triple::nvptx64:
6259-
return CGF->EmitNVPTXBuiltinExpr(BuiltinID, E);
6260-
case llvm::Triple::wasm32:
6261-
case llvm::Triple::wasm64:
6262-
return CGF->EmitWebAssemblyBuiltinExpr(BuiltinID, E);
6263-
case llvm::Triple::hexagon:
6264-
return CGF->EmitHexagonBuiltinExpr(BuiltinID, E);
6265-
case llvm::Triple::riscv32:
6266-
case llvm::Triple::riscv64:
6267-
return CGF->EmitRISCVBuiltinExpr(BuiltinID, E, ReturnValue);
6268-
case llvm::Triple::spirv:
6269-
return CGF->EmitSPIRVBuiltinExpr(BuiltinID, E);
6270-
case llvm::Triple::spirv64:
6271-
if (CGF->getTarget().getTriple().getOS() != llvm::Triple::OSType::AMDHSA)
6272-
return nullptr;
6273-
return CGF->EmitAMDGPUBuiltinExpr(BuiltinID, E);
6274-
default:
6275-
return nullptr;
6276-
}
6277-
}
6278-
6279-
Value *CodeGenFunction::EmitTargetBuiltinExpr(unsigned BuiltinID,
6280-
const CallExpr *E,
6281-
ReturnValueSlot ReturnValue) {
6282-
if (getContext().BuiltinInfo.isAuxBuiltinID(BuiltinID)) {
6283-
assert(getContext().getAuxTargetInfo() && "Missing aux target info");
6284-
return EmitTargetArchBuiltinExpr(
6285-
this, getContext().BuiltinInfo.getAuxBuiltinID(BuiltinID), E,
6286-
ReturnValue, getContext().getAuxTargetInfo()->getTriple().getArch());
6287-
}
6288-
6289-
return EmitTargetArchBuiltinExpr(this, BuiltinID, E, ReturnValue,
6290-
getTarget().getTriple().getArch());
6291-
}
6292-
62936295
namespace {
62946296
struct BuiltinAlignArgs {
62956297
llvm::Value *Src = nullptr;
@@ -6708,4 +6710,4 @@ RValue CodeGenFunction::EmitIntelSYCLAllocaBuiltin(
67086710
// If a slot is provided, store pointer there.
67096711
Builder.CreateStore(Allocation, ReturnValue.getValue());
67106712
return RValue::getAggregate(ReturnValue.getValue());
6711-
}
6713+
}

0 commit comments

Comments
 (0)