[PATCH] D25796: [CUDA] Create __host__ and device variants of standard allocator declarations.
Artem Belevich via cfe-commits
cfe-commits at lists.llvm.org
Wed Oct 19 14:36:28 PDT 2016
tra created this revision.
tra added a reviewer: jlebar.
tra added a subscriber: cfe-commits.
Implicit functions are treated as if they were __host__ __device__ and clang does not allow overloading
those with __host__ or __device__ variants.
In order for users to provide their own standard allocators, we must create __host__ and __device__ variants of these declarations during CUDA compilation.
https://reviews.llvm.org/D25796
Files:
lib/Sema/SemaExprCXX.cpp
Index: lib/Sema/SemaExprCXX.cpp
===================================================================
--- lib/Sema/SemaExprCXX.cpp
+++ lib/Sema/SemaExprCXX.cpp
@@ -2593,28 +2593,40 @@
getLangOpts().CPlusPlus11 ? EST_BasicNoexcept : EST_DynamicNone;
}
- QualType FnType = Context.getFunctionType(Return, Params, EPI);
- FunctionDecl *Alloc =
- FunctionDecl::Create(Context, GlobalCtx, SourceLocation(),
- SourceLocation(), Name,
- FnType, /*TInfo=*/nullptr, SC_None, false, true);
- Alloc->setImplicit();
+ auto CreateAllocationFunctionDecl = [&]() {
+ QualType FnType = Context.getFunctionType(Return, Params, EPI);
+ FunctionDecl *Alloc = FunctionDecl::Create(
+ Context, GlobalCtx, SourceLocation(), SourceLocation(), Name,
+ FnType, /*TInfo=*/nullptr, SC_None, false, true);
+ Alloc->setImplicit();
- // Implicit sized deallocation functions always have default visibility.
- Alloc->addAttr(VisibilityAttr::CreateImplicit(Context,
- VisibilityAttr::Default));
+ // Implicit sized deallocation functions always have default visibility.
+ Alloc->addAttr(
+ VisibilityAttr::CreateImplicit(Context, VisibilityAttr::Default));
- llvm::SmallVector<ParmVarDecl*, 3> ParamDecls;
- for (QualType T : Params) {
- ParamDecls.push_back(
- ParmVarDecl::Create(Context, Alloc, SourceLocation(), SourceLocation(),
- nullptr, T, /*TInfo=*/nullptr, SC_None, nullptr));
- ParamDecls.back()->setImplicit();
- }
- Alloc->setParams(ParamDecls);
+ llvm::SmallVector<ParmVarDecl *, 3> ParamDecls;
+ for (QualType T : Params) {
+ ParamDecls.push_back(ParmVarDecl::Create(
+ Context, Alloc, SourceLocation(), SourceLocation(), nullptr, T,
+ /*TInfo=*/nullptr, SC_None, nullptr));
+ ParamDecls.back()->setImplicit();
+ }
+ Alloc->setParams(ParamDecls);
+ return Alloc;
+ };
+ FunctionDecl *Alloc = CreateAllocationFunctionDecl();
+ if (LangOpts.CUDA)
+ Alloc->addAttr(CUDAHostAttr::CreateImplicit(Context));
Context.getTranslationUnitDecl()->addDecl(Alloc);
IdResolver.tryAddTopLevelDecl(Alloc, Name);
+
+ if (LangOpts.CUDA) {
+ Alloc = CreateAllocationFunctionDecl();
+ Alloc->addAttr(CUDADeviceAttr::CreateImplicit(Context));
+ Context.getTranslationUnitDecl()->addDecl(Alloc);
+ IdResolver.tryAddTopLevelDecl(Alloc, Name);
+ }
}
FunctionDecl *Sema::FindUsualDeallocationFunction(SourceLocation StartLoc,
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D25796.75229.patch
Type: text/x-patch
Size: 2559 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20161019/9ac04d0b/attachment.bin>
More information about the cfe-commits
mailing list