diff options
| author | Yaxun Liu <Yaxun.Liu@amd.com> | 2018-06-12 00:16:33 +0000 | 
|---|---|---|
| committer | Yaxun Liu <Yaxun.Liu@amd.com> | 2018-06-12 00:16:33 +0000 | 
| commit | 6c10a66ec7732e8b7afd8ac0260c2e572fbe0a31 (patch) | |
| tree | f2f1fec310f3a513a61429165579a169f7be6744 /clang/lib/CodeGen | |
| parent | 9deaf68ed1ff782c91cb08b4dd1bd04c7c02653c (diff) | |
| download | bcm5719-llvm-6c10a66ec7732e8b7afd8ac0260c2e572fbe0a31.tar.gz bcm5719-llvm-6c10a66ec7732e8b7afd8ac0260c2e572fbe0a31.zip  | |
[CUDA][HIP] Set kernel calling convention before arrange function
Currently clang set kernel calling convention for CUDA/HIP after
arranging function, which causes incorrect kernel function type since
it depends on calling convention.
This patch moves setting kernel convention before arranging
function.
Differential Revision: https://reviews.llvm.org/D47733
llvm-svn: 334457
Diffstat (limited to 'clang/lib/CodeGen')
| -rw-r--r-- | clang/lib/CodeGen/CGCall.cpp | 15 | ||||
| -rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/CodeGen/TargetInfo.cpp | 7 | ||||
| -rw-r--r-- | clang/lib/CodeGen/TargetInfo.h | 2 | 
4 files changed, 19 insertions, 7 deletions
diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp index 2d8339ef697..064b5fcb102 100644 --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/lib/CodeGen/CGCall.cpp @@ -255,6 +255,16 @@ CodeGenTypes::arrangeCXXMethodType(const CXXRecordDecl *RD,        FTP->getCanonicalTypeUnqualified().getAs<FunctionProtoType>(), MD);  } +/// Set calling convention for CUDA/HIP kernel. +static void setCUDAKernelCallingConvention(CanQualType &FTy, CodeGenModule &CGM, +                                           const FunctionDecl *FD) { +  if (FD->hasAttr<CUDAGlobalAttr>()) { +    const FunctionType *FT = FTy->getAs<FunctionType>(); +    CGM.getTargetCodeGenInfo().setCUDAKernelCallingConvention(FT); +    FTy = FT->getCanonicalTypeUnqualified(); +  } +} +  /// Arrange the argument and result information for a declaration or  /// definition of the given C++ non-static member function.  The  /// member function must be an ordinary function, i.e. not a @@ -264,7 +274,9 @@ CodeGenTypes::arrangeCXXMethodDeclaration(const CXXMethodDecl *MD) {    assert(!isa<CXXConstructorDecl>(MD) && "wrong method for constructors!");    assert(!isa<CXXDestructorDecl>(MD) && "wrong method for destructors!"); -  CanQual<FunctionProtoType> prototype = GetFormalType(MD); +  CanQualType FT = GetFormalType(MD).getAs<Type>(); +  setCUDAKernelCallingConvention(FT, CGM, MD); +  auto prototype = FT.getAs<FunctionProtoType>();    if (MD->isInstance()) {      // The abstract case is perfectly fine. @@ -424,6 +436,7 @@ CodeGenTypes::arrangeFunctionDeclaration(const FunctionDecl *FD) {    CanQualType FTy = FD->getType()->getCanonicalTypeUnqualified();    assert(isa<FunctionType>(FTy)); +  setCUDAKernelCallingConvention(FTy, CGM, FD);    // When declaring a function without a prototype, always use a    // non-variadic type. diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 814eda4381b..6595694ebd5 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -3671,8 +3671,6 @@ void CodeGenModule::EmitGlobalFunctionDefinition(GlobalDecl GD,    MaybeHandleStaticInExternC(D, Fn); -  if (D->hasAttr<CUDAGlobalAttr>()) -    getTargetCodeGenInfo().setCUDAKernelCallingConvention(Fn);    maybeSetTrivialComdat(*D, *Fn); diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index 3ec00553607..b29bcce237c 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -7646,7 +7646,7 @@ public:                              llvm::Function *BlockInvokeFunc,                              llvm::Value *BlockLiteral) const override;    bool shouldEmitStaticExternCAliases() const override; -  void setCUDAKernelCallingConvention(llvm::Function *F) const override; +  void setCUDAKernelCallingConvention(const FunctionType *&FT) const override;  };  } @@ -7783,8 +7783,9 @@ bool AMDGPUTargetCodeGenInfo::shouldEmitStaticExternCAliases() const {  }  void AMDGPUTargetCodeGenInfo::setCUDAKernelCallingConvention( -    llvm::Function *F) const { -  F->setCallingConv(llvm::CallingConv::AMDGPU_KERNEL); +    const FunctionType *&FT) const { +  FT = getABIInfo().getContext().adjustFunctionType( +      FT, FT->getExtInfo().withCallingConv(CC_OpenCLKernel));  }  //===----------------------------------------------------------------------===// diff --git a/clang/lib/CodeGen/TargetInfo.h b/clang/lib/CodeGen/TargetInfo.h index 5c19c714124..b530260ea48 100644 --- a/clang/lib/CodeGen/TargetInfo.h +++ b/clang/lib/CodeGen/TargetInfo.h @@ -302,7 +302,7 @@ public:    /// as 'used', and having internal linkage.    virtual bool shouldEmitStaticExternCAliases() const { return true; } -  virtual void setCUDAKernelCallingConvention(llvm::Function *F) const {} +  virtual void setCUDAKernelCallingConvention(const FunctionType *&FT) const {}  };  } // namespace CodeGen  | 

