mantognini created this revision. mantognini added reviewers: rjmccall, Anastasia. Herald added subscribers: cfe-commits, yaxunl. Herald added a project: clang.
This patch ensures built-in functions are rewritten using the proper parent declaration. Tests are added to ensure the functionality works also with C++ for OpenCL. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D64074 Files: clang/lib/Sema/SemaExpr.cpp clang/test/CodeGenOpenCL/builtins.cl clang/test/CodeGenOpenCL/pipe_builtin.cl clang/test/CodeGenOpenCL/to_addr_builtin.cl Index: clang/test/CodeGenOpenCL/to_addr_builtin.cl =================================================================== --- clang/test/CodeGenOpenCL/to_addr_builtin.cl +++ clang/test/CodeGenOpenCL/to_addr_builtin.cl @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -O0 -cl-std=CL2.0 -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -O0 -cl-std=c++ -o - %s | FileCheck %s // CHECK: %[[A:.*]] = type { float, float, float } typedef struct { Index: clang/test/CodeGenOpenCL/pipe_builtin.cl =================================================================== --- clang/test/CodeGenOpenCL/pipe_builtin.cl +++ clang/test/CodeGenOpenCL/pipe_builtin.cl @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -emit-llvm -cl-ext=+cl_khr_subgroups -O0 -cl-std=CL2.0 -o - %s | FileCheck %s +// RUN: %clang_cc1 -emit-llvm -cl-ext=+cl_khr_subgroups -O0 -cl-std=c++ -o - %s | FileCheck %s // CHECK-DAG: %opencl.pipe_ro_t = type opaque // CHECK-DAG: %opencl.pipe_wo_t = type opaque Index: clang/test/CodeGenOpenCL/builtins.cl =================================================================== --- clang/test/CodeGenOpenCL/builtins.cl +++ clang/test/CodeGenOpenCL/builtins.cl @@ -1,4 +1,5 @@ // RUN: %clang_cc1 %s -finclude-default-header -cl-std=CL2.0 -O0 -emit-llvm -o - -triple "spir-unknown-unknown" | FileCheck %s +// RUN: %clang_cc1 %s -finclude-default-header -cl-std=c++ -fblocks -O0 -emit-llvm -o - -triple "spir-unknown-unknown" | FileCheck %s void testBranchingOnEnqueueKernel(queue_t default_queue, unsigned flags, ndrange_t ndrange) { // Ensure `enqueue_kernel` can be branched upon. Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -5360,7 +5360,7 @@ /// FunctionDecl is returned. /// TODO: Handle pointer return types. static FunctionDecl *rewriteBuiltinFunctionDecl(Sema *Sema, ASTContext &Context, - const FunctionDecl *FDecl, + FunctionDecl *FDecl, MultiExprArg ArgExprs) { QualType DeclType = FDecl->getType(); @@ -5408,7 +5408,7 @@ FunctionProtoType::ExtProtoInfo EPI; QualType OverloadTy = Context.getFunctionType(FT->getReturnType(), OverloadParams, EPI); - DeclContext *Parent = Context.getTranslationUnitDecl(); + DeclContext *Parent = FDecl->getParent(); FunctionDecl *OverloadDecl = FunctionDecl::Create(Context, Parent, FDecl->getLocation(), FDecl->getLocation(),
Index: clang/test/CodeGenOpenCL/to_addr_builtin.cl =================================================================== --- clang/test/CodeGenOpenCL/to_addr_builtin.cl +++ clang/test/CodeGenOpenCL/to_addr_builtin.cl @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -O0 -cl-std=CL2.0 -o - %s | FileCheck %s +// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -O0 -cl-std=c++ -o - %s | FileCheck %s // CHECK: %[[A:.*]] = type { float, float, float } typedef struct { Index: clang/test/CodeGenOpenCL/pipe_builtin.cl =================================================================== --- clang/test/CodeGenOpenCL/pipe_builtin.cl +++ clang/test/CodeGenOpenCL/pipe_builtin.cl @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -emit-llvm -cl-ext=+cl_khr_subgroups -O0 -cl-std=CL2.0 -o - %s | FileCheck %s +// RUN: %clang_cc1 -emit-llvm -cl-ext=+cl_khr_subgroups -O0 -cl-std=c++ -o - %s | FileCheck %s // CHECK-DAG: %opencl.pipe_ro_t = type opaque // CHECK-DAG: %opencl.pipe_wo_t = type opaque Index: clang/test/CodeGenOpenCL/builtins.cl =================================================================== --- clang/test/CodeGenOpenCL/builtins.cl +++ clang/test/CodeGenOpenCL/builtins.cl @@ -1,4 +1,5 @@ // RUN: %clang_cc1 %s -finclude-default-header -cl-std=CL2.0 -O0 -emit-llvm -o - -triple "spir-unknown-unknown" | FileCheck %s +// RUN: %clang_cc1 %s -finclude-default-header -cl-std=c++ -fblocks -O0 -emit-llvm -o - -triple "spir-unknown-unknown" | FileCheck %s void testBranchingOnEnqueueKernel(queue_t default_queue, unsigned flags, ndrange_t ndrange) { // Ensure `enqueue_kernel` can be branched upon. Index: clang/lib/Sema/SemaExpr.cpp =================================================================== --- clang/lib/Sema/SemaExpr.cpp +++ clang/lib/Sema/SemaExpr.cpp @@ -5360,7 +5360,7 @@ /// FunctionDecl is returned. /// TODO: Handle pointer return types. static FunctionDecl *rewriteBuiltinFunctionDecl(Sema *Sema, ASTContext &Context, - const FunctionDecl *FDecl, + FunctionDecl *FDecl, MultiExprArg ArgExprs) { QualType DeclType = FDecl->getType(); @@ -5408,7 +5408,7 @@ FunctionProtoType::ExtProtoInfo EPI; QualType OverloadTy = Context.getFunctionType(FT->getReturnType(), OverloadParams, EPI); - DeclContext *Parent = Context.getTranslationUnitDecl(); + DeclContext *Parent = FDecl->getParent(); FunctionDecl *OverloadDecl = FunctionDecl::Create(Context, Parent, FDecl->getLocation(), FDecl->getLocation(),
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits