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. 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 > -- Alexander Kornienko | Software Engineer | [email protected] | Google Germany, Munich
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
