diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index b37bfe011af1e..517cabdbdbec3 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -1121,16 +1121,6 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy, Fn->setMetadata("loop_fuse", llvm::MDNode::get(getLLVMContext(), AttrMDArgs)); } - if (const auto *A = D->getAttr()) { - SmallVector AspectsMD; - for (auto *Aspect : A->aspects()) { - llvm::APSInt AspectInt = Aspect->EvaluateKnownConstInt(getContext()); - AspectsMD.push_back(llvm::ConstantAsMetadata::get( - Builder.getInt32(AspectInt.getZExtValue()))); - } - Fn->setMetadata("sycl_used_aspects", - llvm::MDNode::get(getLLVMContext(), AspectsMD)); - } // Source location of functions is required to emit required diagnostics in // SYCLPropagateAspectsUsagePass. Save the token in a srcloc metadata node. diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 6cd484d80d863..475f8cf794424 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -2648,6 +2648,19 @@ void CodeGenModule::finalizeKCFITypes() { } } +template +void applySYCLAspectsMD(AttrT *A, ASTContext &ACtx, llvm::LLVMContext &LLVMCtx, + llvm::Function *F, StringRef MDName) { + SmallVector AspectsMD; + for (auto *Aspect : A->aspects()) { + llvm::APSInt AspectInt = Aspect->EvaluateKnownConstInt(ACtx); + auto *T = llvm::Type::getInt32Ty(LLVMCtx); + auto *C = llvm::Constant::getIntegerValue(T, AspectInt); + AspectsMD.push_back(llvm::ConstantAsMetadata::get(C)); + } + F->setMetadata(MDName, llvm::MDNode::get(LLVMCtx, AspectsMD)); +} + void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F, bool IsIncompleteFunction, bool IsThunk) { @@ -2755,6 +2768,15 @@ void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F, CalleeIdx, PayloadIndices, /* VarArgsArePassed */ false)})); } + + // Apply SYCL specific attributes/metadata. + if (const auto *A = FD->getAttr()) + applySYCLAspectsMD(A, getContext(), getLLVMContext(), F, + "sycl_declared_aspects"); + + if (const auto *A = FD->getAttr()) + applySYCLAspectsMD(A, getContext(), getLLVMContext(), F, + "sycl_used_aspects"); } void CodeGenModule::addUsedGlobal(llvm::GlobalValue *GV) { @@ -4573,20 +4595,8 @@ llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction( } assert(F->getName() == MangledName && "name was uniqued!"); - if (D) { + if (D) SetFunctionAttributes(GD, F, IsIncompleteFunction, IsThunk); - if (const auto *A = D->getAttr()) { - SmallVector AspectsMD; - for (auto *Aspect : A->aspects()) { - llvm::APSInt AspectInt = Aspect->EvaluateKnownConstInt(getContext()); - auto *T = llvm::Type::getInt32Ty(getLLVMContext()); - auto *C = llvm::Constant::getIntegerValue(T, AspectInt); - AspectsMD.push_back(llvm::ConstantAsMetadata::get(C)); - } - F->setMetadata("sycl_declared_aspects", - llvm::MDNode::get(getLLVMContext(), AspectsMD)); - } - } if (ExtraAttrs.hasFnAttrs()) { llvm::AttrBuilder B(F->getContext(), ExtraAttrs.getFnAttrs()); F->addFnAttrs(B); diff --git a/clang/test/CodeGenSYCL/uses_aspects.cpp b/clang/test/CodeGenSYCL/uses_aspects.cpp index eb3ec5d815d79..5fd07f6892654 100644 --- a/clang/test/CodeGenSYCL/uses_aspects.cpp +++ b/clang/test/CodeGenSYCL/uses_aspects.cpp @@ -38,6 +38,9 @@ constexpr sycl::aspect getAspect() { return sycl::aspect::cpu; } // CHECK: define dso_local spir_func void @{{.*}}func7{{.*}} !sycl_used_aspects ![[ASPECTS1]] { [[__sycl_detail__::__uses_aspects__(getAspect())]] void func7() {} +// CHECK: declare !sycl_used_aspects ![[ASPECTS1]] spir_func void @{{.*}}func8{{.*}} +[[__sycl_detail__::__uses_aspects__(sycl::aspect::cpu)]] SYCL_EXTERNAL void func8(); + class KernelFunctor { public: void operator()() const { @@ -48,6 +51,7 @@ class KernelFunctor { func5(); func6(); func7(); + func8(); } };