yaxunl created this revision. yaxunl added a reviewer: rjmccall. Herald added subscribers: t-tye, tpr, dstuttard, nhaehnle, wdng, jvesely, kzhuravl.
MSVC header files using vectorcall to differentiate overloaded functions, which causes failure for AMDGPU target. Let AMDGPU target recognize vectorcall calling convention so that these header files can be compiled. https://reviews.llvm.org/D57716 Files: include/clang/Basic/Specifiers.h lib/AST/ItaniumMangle.cpp lib/AST/Type.cpp lib/AST/TypePrinter.cpp lib/Basic/Targets/AMDGPU.h lib/CodeGen/CGCall.cpp lib/CodeGen/CGDebugInfo.cpp lib/Sema/SemaDeclAttr.cpp test/SemaCUDA/amdgpu-windows-vectorcall.cu
Index: test/SemaCUDA/amdgpu-windows-vectorcall.cu =================================================================== --- /dev/null +++ test/SemaCUDA/amdgpu-windows-vectorcall.cu @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -triple amdgcn-amd-amdhsa -aux-triple x86_64-pc-windows-msvc -fms-compatibility -fcuda-is-device -fsyntax-only -verify %s + +// expected-no-diagnostics +template<class _Ty> + struct A + { + }; + +template<class _Ret, class _Arg0, class _Types> struct A<_Ret (__cdecl _Arg0::*)(_Types) > { }; +template<class _Ret, class _Arg0, class _Types> struct A<_Ret (__vectorcall _Arg0::*)(_Types) > {}; + Index: lib/Sema/SemaDeclAttr.cpp =================================================================== --- lib/Sema/SemaDeclAttr.cpp +++ lib/Sema/SemaDeclAttr.cpp @@ -4568,7 +4568,8 @@ CC = CC_Swift; break; case ParsedAttr::AT_VectorCall: - CC = CC_X86VectorCall; + CC = Context.getTargetInfo().getTriple().isAMDGPU() + ? CC_AMDGPUVectorCall : CC_X86VectorCall; break; case ParsedAttr::AT_AArch64VectorPcs: CC = CC_AArch64VectorCall; Index: lib/CodeGen/CGDebugInfo.cpp =================================================================== --- lib/CodeGen/CGDebugInfo.cpp +++ lib/CodeGen/CGDebugInfo.cpp @@ -1113,6 +1113,7 @@ static unsigned getDwarfCC(CallingConv CC) { switch (CC) { case CC_C: + case CC_AMDGPUVectorCall: // Avoid emitting DW_AT_calling_convention if the C convention was used. return 0; Index: lib/CodeGen/CGCall.cpp =================================================================== --- lib/CodeGen/CGCall.cpp +++ lib/CodeGen/CGCall.cpp @@ -58,6 +58,7 @@ case CC_X86Pascal: return llvm::CallingConv::C; // TODO: Add support for __vectorcall to LLVM. case CC_X86VectorCall: return llvm::CallingConv::X86_VectorCall; + case CC_AMDGPUVectorCall: return llvm::CallingConv::C; case CC_AArch64VectorCall: return llvm::CallingConv::AArch64_VectorCall; case CC_SpirFunction: return llvm::CallingConv::SPIR_FUNC; case CC_OpenCLKernel: return CGM.getTargetCodeGenInfo().getOpenCLKernelCallingConv(); Index: lib/Basic/Targets/AMDGPU.h =================================================================== --- lib/Basic/Targets/AMDGPU.h +++ lib/Basic/Targets/AMDGPU.h @@ -341,6 +341,7 @@ return CCCR_Warning; case CC_C: case CC_OpenCLKernel: + case CC_AMDGPUVectorCall: return CCCR_OK; } } Index: lib/AST/TypePrinter.cpp =================================================================== --- lib/AST/TypePrinter.cpp +++ lib/AST/TypePrinter.cpp @@ -862,6 +862,7 @@ OS << " __attribute__((thiscall))"; break; case CC_X86VectorCall: + case CC_AMDGPUVectorCall: OS << " __attribute__((vectorcall))"; break; case CC_X86Pascal: Index: lib/AST/Type.cpp =================================================================== --- lib/AST/Type.cpp +++ lib/AST/Type.cpp @@ -2826,6 +2826,7 @@ case CC_X86ThisCall: return "thiscall"; case CC_X86Pascal: return "pascal"; case CC_X86VectorCall: return "vectorcall"; + case CC_AMDGPUVectorCall: return "amdgpu_vectorcall"; case CC_Win64: return "ms_abi"; case CC_X86_64SysV: return "sysv_abi"; case CC_X86RegCall : return "regcall"; Index: lib/AST/ItaniumMangle.cpp =================================================================== --- lib/AST/ItaniumMangle.cpp +++ lib/AST/ItaniumMangle.cpp @@ -2648,6 +2648,7 @@ return ""; case CC_X86VectorCall: + case CC_AMDGPUVectorCall: case CC_X86Pascal: case CC_X86RegCall: case CC_AAPCS: Index: include/clang/Basic/Specifiers.h =================================================================== --- include/clang/Basic/Specifiers.h +++ include/clang/Basic/Specifiers.h @@ -251,6 +251,7 @@ CC_PreserveMost, // __attribute__((preserve_most)) CC_PreserveAll, // __attribute__((preserve_all)) CC_AArch64VectorCall, // __attribute__((aarch64_vector_pcs)) + CC_AMDGPUVectorCall, // __attribute__((vectorcall)) }; /// Checks whether the given calling convention supports variadic
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits