Skip to content

Commit cf176de

Browse files
authored
[clang][SYCL] Fix field/base builtins for PCH support (#20560)
We have added several builtins for device copyability checking a while back. These are implemented via new AST nodes, so they require implementation of ASTReaderStmt's and ASTWriterStmt's methods. The implementation was in place but it was untested so we never saw that it is missing writing/reading of the builtin expression's type which resulted in crashes during PCH reading.
1 parent aeafda3 commit cf176de

File tree

4 files changed

+35
-0
lines changed

4 files changed

+35
-0
lines changed

clang/lib/Serialization/ASTReaderStmt.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1866,22 +1866,26 @@ void ASTStmtReader::VisitBuiltinBitCastExpr(BuiltinBitCastExpr *E) {
18661866
}
18671867

18681868
void ASTStmtReader::VisitSYCLBuiltinNumFieldsExpr(SYCLBuiltinNumFieldsExpr *E) {
1869+
VisitExpr(E);
18691870
E->setLocation(readSourceLocation());
18701871
E->SourceTy = Record.readType();
18711872
}
18721873

18731874
void ASTStmtReader::VisitSYCLBuiltinFieldTypeExpr(SYCLBuiltinFieldTypeExpr *E) {
1875+
VisitExpr(E);
18741876
E->setLocation(readSourceLocation());
18751877
E->SourceTy = Record.readType();
18761878
E->Index = Record.readExpr();
18771879
}
18781880

18791881
void ASTStmtReader::VisitSYCLBuiltinNumBasesExpr(SYCLBuiltinNumBasesExpr *E) {
1882+
VisitExpr(E);
18801883
E->setLocation(readSourceLocation());
18811884
E->SourceTy = Record.readType();
18821885
}
18831886

18841887
void ASTStmtReader::VisitSYCLBuiltinBaseTypeExpr(SYCLBuiltinBaseTypeExpr *E) {
1888+
VisitExpr(E);
18851889
E->setLocation(readSourceLocation());
18861890
E->SourceTy = Record.readType();
18871891
E->Index = Record.readExpr();

clang/lib/Serialization/ASTWriterStmt.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1869,25 +1869,29 @@ void ASTStmtWriter::VisitBuiltinBitCastExpr(BuiltinBitCastExpr *E) {
18691869
}
18701870

18711871
void ASTStmtWriter::VisitSYCLBuiltinNumFieldsExpr(SYCLBuiltinNumFieldsExpr *E) {
1872+
VisitExpr(E);
18721873
Record.AddSourceLocation(E->getLocation());
18731874
Record.AddTypeRef(E->getSourceType());
18741875
Code = serialization::EXPR_SYCL_BUILTIN_NUM_FIELDS;
18751876
}
18761877

18771878
void ASTStmtWriter::VisitSYCLBuiltinFieldTypeExpr(SYCLBuiltinFieldTypeExpr *E) {
1879+
VisitExpr(E);
18781880
Record.AddSourceLocation(E->getLocation());
18791881
Record.AddTypeRef(E->getSourceType());
18801882
Record.AddStmt(E->getIndex());
18811883
Code = serialization::EXPR_SYCL_BUILTIN_FIELD_TYPE;
18821884
}
18831885

18841886
void ASTStmtWriter::VisitSYCLBuiltinNumBasesExpr(SYCLBuiltinNumBasesExpr *E) {
1887+
VisitExpr(E);
18851888
Record.AddSourceLocation(E->getLocation());
18861889
Record.AddTypeRef(E->getSourceType());
18871890
Code = serialization::EXPR_SYCL_BUILTIN_NUM_BASES;
18881891
}
18891892

18901893
void ASTStmtWriter::VisitSYCLBuiltinBaseTypeExpr(SYCLBuiltinBaseTypeExpr *E) {
1894+
VisitExpr(E);
18911895
Record.AddSourceLocation(E->getLocation());
18921896
Record.AddTypeRef(E->getSourceType());
18931897
Record.AddStmt(E->getIndex());
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Test that __builtin_num_fields, __builtin_num_bases, __builtin_field_type,
2+
// and __builtin_base_type work correctly with PCH.
3+
4+
// RUN: rm -rf %t
5+
// RUN: split-file %s %t
6+
// RUN: %clang_cc1 -std=c++17 -triple spir64-unknown-unknown -fsycl-is-device -emit-pch -x c++-header \
7+
// RUN: %t/pch.h -o %t/pch.h.device.pch
8+
// RUN: %clang_cc1 -std=c++17 -triple spir64-unknown-unknown -fsycl-is-device -verify \
9+
// RUN: -include-pch %t/pch.h.device.pch %t/test.cpp
10+
11+
#--- pch.h
12+
struct Base {};
13+
template <typename T> struct X {
14+
static_assert(__is_same(Base, decltype(__builtin_base_type(T, 0))));
15+
static_assert(__is_same(int, decltype(__builtin_field_type(T, 0))));
16+
static_assert(__builtin_num_fields(T) == 1);
17+
static_assert(__builtin_num_bases(T) == 1);
18+
};
19+
20+
#--- test.cpp
21+
// expected-no-diagnostics
22+
struct A : public Base { int i; };
23+
void foo() {
24+
X<A> x;
25+
}
26+

sycl/test-e2e/PerformanceTests/KernelCompiler/auto-pch.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,4 +102,5 @@ int main(int argc, char **argv) {
102102
run({"sycl/multi_ptr.hpp"});
103103
run({"sycl/builtins.hpp"});
104104
run({"sycl/ext/oneapi/matrix/matrix.hpp"});
105+
run({"sycl/sycl.hpp"});
105106
}

0 commit comments

Comments
 (0)