@@ -2648,6 +2648,19 @@ void CodeGenModule::finalizeKCFITypes() {
2648
2648
}
2649
2649
}
2650
2650
2651
+ template <typename AttrT>
2652
+ void applySYCLAspectsMD (AttrT *A, ASTContext &ACtx, llvm::LLVMContext &LLVMCtx,
2653
+ llvm::Function *F, StringRef MDName) {
2654
+ SmallVector<llvm::Metadata *, 4 > AspectsMD;
2655
+ for (auto *Aspect : A->aspects ()) {
2656
+ llvm::APSInt AspectInt = Aspect->EvaluateKnownConstInt (ACtx);
2657
+ auto *T = llvm::Type::getInt32Ty (LLVMCtx);
2658
+ auto *C = llvm::Constant::getIntegerValue (T, AspectInt);
2659
+ AspectsMD.push_back (llvm::ConstantAsMetadata::get (C));
2660
+ }
2661
+ F->setMetadata (MDName, llvm::MDNode::get (LLVMCtx, AspectsMD));
2662
+ }
2663
+
2651
2664
void CodeGenModule::SetFunctionAttributes (GlobalDecl GD, llvm::Function *F,
2652
2665
bool IsIncompleteFunction,
2653
2666
bool IsThunk) {
@@ -2755,6 +2768,15 @@ void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F,
2755
2768
CalleeIdx, PayloadIndices,
2756
2769
/* VarArgsArePassed */ false )}));
2757
2770
}
2771
+
2772
+ // Apply SYCL specific attributes/metadata.
2773
+ if (const auto *A = FD->getAttr <SYCLDeviceHasAttr>())
2774
+ applySYCLAspectsMD (A, getContext (), getLLVMContext (), F,
2775
+ " sycl_declared_aspects" );
2776
+
2777
+ if (const auto *A = FD->getAttr <SYCLUsesAspectsAttr>())
2778
+ applySYCLAspectsMD (A, getContext (), getLLVMContext (), F,
2779
+ " sycl_used_aspects" );
2758
2780
}
2759
2781
2760
2782
void CodeGenModule::addUsedGlobal (llvm::GlobalValue *GV) {
@@ -4573,20 +4595,8 @@ llvm::Constant *CodeGenModule::GetOrCreateLLVMFunction(
4573
4595
}
4574
4596
4575
4597
assert (F->getName () == MangledName && " name was uniqued!" );
4576
- if (D) {
4598
+ if (D)
4577
4599
SetFunctionAttributes (GD, F, IsIncompleteFunction, IsThunk);
4578
- if (const auto *A = D->getAttr <SYCLDeviceHasAttr>()) {
4579
- SmallVector<llvm::Metadata *, 4 > AspectsMD;
4580
- for (auto *Aspect : A->aspects ()) {
4581
- llvm::APSInt AspectInt = Aspect->EvaluateKnownConstInt (getContext ());
4582
- auto *T = llvm::Type::getInt32Ty (getLLVMContext ());
4583
- auto *C = llvm::Constant::getIntegerValue (T, AspectInt);
4584
- AspectsMD.push_back (llvm::ConstantAsMetadata::get (C));
4585
- }
4586
- F->setMetadata (" sycl_declared_aspects" ,
4587
- llvm::MDNode::get (getLLVMContext (), AspectsMD));
4588
- }
4589
- }
4590
4600
if (ExtraAttrs.hasFnAttrs ()) {
4591
4601
llvm::AttrBuilder B (F->getContext (), ExtraAttrs.getFnAttrs ());
4592
4602
F->addFnAttrs (B);
0 commit comments