On Tue, Jan 20, 2015 at 11:33 AM, Alexander Kornienko <[email protected]> wrote:
> > > On Tue, Jan 20, 2015 at 7:44 AM, Sameer Sahasrabuddhe < > [email protected]> wrote: > >> Author: sameerds >> Date: Tue Jan 20 00:44:32 2015 >> New Revision: 226548 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=226548&view=rev >> Log: >> Introduce SPIR calling conventions. >> >> This implements Section 3.7 from the SPIR 1.2 spec: >> >> SPIR kernels should use "spir_kernel" calling convention. >> Non-kernel functions use "spir_func" calling convention. All >> other calling conventions are disallowed. >> >> The patch works only for OpenCL source. Any other uses will need >> to ensure that kernels are assigned the spir_kernel calling >> convention correctly. >> >> >> Added: >> cfe/trunk/test/CodeGenOpenCL/spir-calling-conv.cl >> Modified: >> cfe/trunk/include/clang/Basic/Specifiers.h >> cfe/trunk/lib/AST/ASTContext.cpp >> cfe/trunk/lib/AST/Type.cpp >> cfe/trunk/lib/AST/TypePrinter.cpp >> cfe/trunk/lib/Basic/Targets.cpp >> cfe/trunk/lib/CodeGen/CGCall.cpp >> cfe/trunk/lib/Sema/SemaType.cpp >> cfe/trunk/tools/libclang/CXType.cpp >> >> Modified: cfe/trunk/include/clang/Basic/Specifiers.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Specifiers.h?rev=226548&r1=226547&r2=226548&view=diff >> >> ============================================================================== >> --- cfe/trunk/include/clang/Basic/Specifiers.h (original) >> +++ cfe/trunk/include/clang/Basic/Specifiers.h Tue Jan 20 00:44:32 2015 >> @@ -210,7 +210,9 @@ namespace clang { >> CC_AAPCS, // __attribute__((pcs("aapcs"))) >> CC_AAPCS_VFP, // __attribute__((pcs("aapcs-vfp"))) >> CC_PnaclCall, // __attribute__((pnaclcall)) >> - CC_IntelOclBicc // __attribute__((intel_ocl_bicc)) >> + CC_IntelOclBicc, // __attribute__((intel_ocl_bicc)) >> + CC_SpirFunction, // default for OpenCL functions on SPIR target >> + CC_SpirKernel // inferred for OpenCL kernels on SPIR target >> }; >> >> /// \brief Checks whether the given calling convention supports >> variadic >> @@ -222,6 +224,8 @@ namespace clang { >> case CC_X86ThisCall: >> case CC_X86Pascal: >> case CC_X86VectorCall: >> + case CC_SpirFunction: >> + case CC_SpirKernel: >> return false; >> default: >> return true; >> >> Modified: cfe/trunk/lib/AST/ASTContext.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=226548&r1=226547&r2=226548&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/AST/ASTContext.cpp (original) >> +++ cfe/trunk/lib/AST/ASTContext.cpp Tue Jan 20 00:44:32 2015 >> @@ -8043,7 +8043,9 @@ CallingConv ASTContext::getDefaultCallin >> if (IsCXXMethod) >> return ABI->getDefaultMethodCallConv(IsVariadic); >> >> - return (LangOpts.MRTD && !IsVariadic) ? CC_X86StdCall : CC_C; >> + if (LangOpts.MRTD && !IsVariadic) return CC_X86StdCall; >> + >> + return Target->getDefaultCallingConv(TargetInfo::CCMT_Unknown); >> } >> >> bool ASTContext::isNearlyEmpty(const CXXRecordDecl *RD) const { >> >> Modified: cfe/trunk/lib/AST/Type.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Type.cpp?rev=226548&r1=226547&r2=226548&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/AST/Type.cpp (original) >> +++ cfe/trunk/lib/AST/Type.cpp Tue Jan 20 00:44:32 2015 >> @@ -1588,6 +1588,8 @@ StringRef FunctionType::getNameForCallCo >> case CC_AAPCS_VFP: return "aapcs-vfp"; >> case CC_PnaclCall: return "pnaclcall"; >> case CC_IntelOclBicc: return "intel_ocl_bicc"; >> + case CC_SpirFunction: return "spir_function"; >> + case CC_SpirKernel: return "spir_kernel"; >> } >> >> llvm_unreachable("Invalid calling convention."); >> >> Modified: cfe/trunk/lib/AST/TypePrinter.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/TypePrinter.cpp?rev=226548&r1=226547&r2=226548&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/AST/TypePrinter.cpp (original) >> +++ cfe/trunk/lib/AST/TypePrinter.cpp Tue Jan 20 00:44:32 2015 >> @@ -697,6 +697,10 @@ void TypePrinter::printFunctionProtoAfte >> case CC_X86_64SysV: >> OS << " __attribute__((sysv_abi))"; >> break; >> + case CC_SpirFunction: >> + case CC_SpirKernel: >> + // Do nothing. These CCs are not available as attributes. >> + break; >> } >> } >> >> >> Modified: cfe/trunk/lib/Basic/Targets.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets.cpp?rev=226548&r1=226547&r2=226548&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Basic/Targets.cpp (original) >> +++ cfe/trunk/lib/Basic/Targets.cpp Tue Jan 20 00:44:32 2015 >> @@ -6346,6 +6346,15 @@ namespace { >> BuiltinVaListKind getBuiltinVaListKind() const override { >> return TargetInfo::VoidPtrBuiltinVaList; >> } >> + >> + CallingConvCheckResult checkCallingConvention(CallingConv CC) const >> override { >> + return (CC == CC_SpirFunction || >> + CC == CC_SpirKernel) ? CCCR_OK : CCCR_Warning; >> + } >> + >> + CallingConv getDefaultCallingConv(CallingConvMethodType MT) const >> override { >> + return CC_SpirFunction; >> + } >> }; >> >> >> >> Modified: cfe/trunk/lib/CodeGen/CGCall.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=226548&r1=226547&r2=226548&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/CodeGen/CGCall.cpp (original) >> +++ cfe/trunk/lib/CodeGen/CGCall.cpp Tue Jan 20 00:44:32 2015 >> @@ -51,6 +51,8 @@ static unsigned ClangCallConvToLLVMCallC >> case CC_X86Pascal: return llvm::CallingConv::C; >> // TODO: Add support for __vectorcall to LLVM. >> case CC_X86VectorCall: return llvm::CallingConv::X86_VectorCall; >> + case CC_SpirFunction: return llvm::CallingConv::SPIR_FUNC; >> + case CC_SpirKernel: return llvm::CallingConv::SPIR_KERNEL; >> } >> } >> >> >> Modified: cfe/trunk/lib/Sema/SemaType.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=226548&r1=226547&r2=226548&view=diff >> >> ============================================================================== >> --- cfe/trunk/lib/Sema/SemaType.cpp (original) >> +++ cfe/trunk/lib/Sema/SemaType.cpp Tue Jan 20 00:44:32 2015 >> @@ -2476,8 +2476,24 @@ getCCForDeclaratorChunk(Sema &S, Declara >> } >> } >> >> - return S.Context.getDefaultCallingConvention(FTI.isVariadic, >> - IsCXXInstanceMethod); >> + CallingConv CC = S.Context.getDefaultCallingConvention(FTI.isVariadic, >> + >> IsCXXInstanceMethod); >> + >> + // Attribute AT_OpenCLKernel affects the calling convention only on >> + // the SPIR target, hence it cannot be treated as a calling >> + // convention attribute. This is the simplest place to infer >> + // "spir_kernel" for OpenCL kernels on SPIR. >> + if (CC == CC_SpirFunction) { >> + for (const AttributeList *Attr = >> D.getDeclSpec().getAttributes().getList(); >> + Attr; Attr = Attr->getNext()) { >> + if (Attr->getKind() == AttributeList::AT_OpenCLKernel) { >> + CC = CC_SpirKernel; >> + break; >> + } >> + } >> + } >> + >> + return CC; >> } >> >> static TypeSourceInfo *GetFullTypeForDeclarator(TypeProcessingState >> &state, >> >> Added: cfe/trunk/test/CodeGenOpenCL/spir-calling-conv.cl >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/spir-calling-conv.cl?rev=226548&view=auto >> >> ============================================================================== >> --- cfe/trunk/test/CodeGenOpenCL/spir-calling-conv.cl (added) >> +++ cfe/trunk/test/CodeGenOpenCL/spir-calling-conv.cl Tue Jan 20 >> 00:44:32 2015 >> @@ -0,0 +1,18 @@ >> +// RUN: %clang_cc1 %s -triple "spir-unknown-unknown" -emit-llvm -o - | >> FileCheck %s >> + >> +int get_dummy_id(int D); >> + >> +kernel void bar(global int *A); >> + >> +kernel void foo(global int *A) >> +// CHECK: define spir_kernel void @foo(i32 addrspace(1)* %A) >> +{ >> + int id = get_dummy_id(0); >> + // CHECK: %call = tail call spir_func i32 @get_dummy_id(i32 0) >> > > This test fails > <http://lab.llvm.org:8080/green/job/clang-stage2-configure-Rlto_check/1183/>. > Please fix or revert. > Clarification: this test fails only in some configurations, thus it doesn't look like a trivial typo in the test which I could fix myself. This is blocking us, so I'm going to revert the revision. > > Thanks! > > >> + A[id] = id; >> + bar(A); >> + // CHECK: tail call spir_kernel void @bar(i32 addrspace(1)* %A) >> +} >> + >> +// CHECK: declare spir_func i32 @get_dummy_id(i32) >> +// CHECK: declare spir_kernel void @bar(i32 addrspace(1)*) >> >> Modified: cfe/trunk/tools/libclang/CXType.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXType.cpp?rev=226548&r1=226547&r2=226548&view=diff >> >> ============================================================================== >> --- cfe/trunk/tools/libclang/CXType.cpp (original) >> +++ cfe/trunk/tools/libclang/CXType.cpp Tue Jan 20 00:44:32 2015 >> @@ -527,6 +527,9 @@ CXCallingConv clang_getFunctionTypeCalli >> TCALLINGCONV(AAPCS_VFP); >> TCALLINGCONV(PnaclCall); >> TCALLINGCONV(IntelOclBicc); >> + case CC_SpirFunction: return CXCallingConv_Unexposed; >> + case CC_SpirKernel: return CXCallingConv_Unexposed; >> + break; >> } >> #undef TCALLINGCONV >> } >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> > >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
