blob: 97746b68b2ad7b6312e24e5b11048f7a4a77e04e [file] [edit]
//===--- GlobalDecl.cpp - Global declaration holder -------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// GlobalDecl.h is included very widely, so these members are defined here to
// keep the OpenMP and OpenACC declaration hierarchies, the generated attribute
// classes, and the template declaration hierarchy out of it.
//
//===----------------------------------------------------------------------===//
#include "clang/AST/GlobalDecl.h"
#include "clang/AST/Attr.h"
#include "clang/AST/DeclOpenACC.h"
#include "clang/AST/DeclOpenMP.h"
#include "clang/AST/DeclTemplate.h"
using namespace clang;
GlobalDecl::GlobalDecl(const OMPDeclareReductionDecl *D) { Init(D); }
GlobalDecl::GlobalDecl(const OMPDeclareMapperDecl *D) { Init(D); }
GlobalDecl::GlobalDecl(const OpenACCRoutineDecl *D) { Init(D); }
GlobalDecl::GlobalDecl(const OpenACCDeclareDecl *D) { Init(D); }
bool GlobalDecl::hasCUDAGlobalAttr(const Decl *D) {
return D->hasAttr<CUDAGlobalAttr>();
}
bool GlobalDecl::isKernelReference(const Decl *D) {
if (const auto *FD = dyn_cast<FunctionDecl>(D))
return FD->isReferenceableKernel();
if (const auto *FTD = dyn_cast<FunctionTemplateDecl>(D))
return FTD->getTemplatedDecl()->hasAttr<CUDAGlobalAttr>();
return false;
}
KernelReferenceKind
GlobalDecl::getDefaultKernelReference(const FunctionDecl *D) {
return (D->hasAttr<DeviceKernelAttr>() || D->getLangOpts().CUDAIsDevice)
? KernelReferenceKind::Kernel
: KernelReferenceKind::Stub;
}