[PATCH] D136913: [HLSL] support RWByteAddressBuffer.
python3kgae updated this revision to Diff 490274. python3kgae added a comment. Rebase and update test. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D136913/new/ https://reviews.llvm.org/D136913 Files: clang/include/clang/Sema/HLSLExternalSemaSource.h clang/lib/Sema/HLSLExternalSemaSource.cpp clang/lib/Sema/SemaExprMember.cpp clang/test/AST/HLSL/RWByteAddressBuffer.hlsl clang/test/SemaHLSL/BuiltIns/RWByteAddressBuffer.hlsl Index: clang/test/SemaHLSL/BuiltIns/RWByteAddressBuffer.hlsl === --- /dev/null +++ clang/test/SemaHLSL/BuiltIns/RWByteAddressBuffer.hlsl @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -x hlsl -fsyntax-only -verify %s + +typedef vector float3; + +RWByteAddressBuffer Buffer; + +[numthreads(1,1,1)] +void main() { + (void)Buffer.h; // expected-error {{'h' is a private member of 'hlsl::RWByteAddressBuffer'}} + // expected-note@* {{implicitly declared private here}} + Buffer.Load(0); +} Index: clang/test/AST/HLSL/RWByteAddressBuffer.hlsl === --- /dev/null +++ clang/test/AST/HLSL/RWByteAddressBuffer.hlsl @@ -0,0 +1,104 @@ +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -fsyntax-only -ast-dump %s | FileCheck %s + +RWByteAddressBuffer U; +typedef unsigned int uint; +typedef vector float2; + +// CHECK:CXXRecordDecl 0x{{[0-9a-f]+}} <> implicit referenced class RWByteAddressBuffer definition +// CHECK:FinalAttr 0x{{[0-9a-f]+}} <> Implicit final +// CHECK-NEXT:HLSLResourceAttr 0x{{[0-9a-f]+}} <> Implicit UAV RawBuffer +// CHECK-NEXT:-FieldDecl 0x[[HDL:[0-9a-f]+]] <> implicit referenced h 'void *' +// CHECK-NEXT:CXXConstructorDecl 0x{{[0-9a-f]+}} <> used RWByteAddressBuffer 'void ()' inline +// CHECK-NEXT:CompoundStmt 0x{{[0-9a-f]+}} <> +// CHECK-NEXT:BinaryOperator 0x{{[0-9a-f]+}} <> 'void *' lvalue '=' +// CHECK-NEXT:MemberExpr 0x{{[0-9a-f]+}} <> 'void *' lvalue .h 0x[[HDL]] +// CHECK-NEXT:-CXXThisExpr 0x{{[0-9a-f]+}} <> 'hlsl::RWByteAddressBuffer' lvalue implicit this +// CHECK-NEXT:CallExpr 0x{{[0-9a-f]+}} <> 'void *' +// CHECK-NEXT:-DeclRefExpr 0x{{[0-9a-f]+}} <> 'void *(unsigned char) throw()' Function 0x{{[0-9a-f]+}} '__builtin_hlsl_create_handle' 'void *(unsigned char) throw()' +// CHECK-NEXT:-IntegerLiteral 0x{{[0-9a-f]+}} <> 'unsigned char' 1 +// CHECK-NEXT:FunctionTemplateDecl 0x{{[0-9a-f]+}} <> Load +// CHECK-NEXT:TemplateTypeParmDecl 0x{{[0-9a-f]+}} <> class depth 0 index 0 T +// CHECK-NEXT:CXXMethodDecl 0x{{[0-9a-f]+}} <> Load 'T (unsigned int)' +// CHECK-NEXT:ParmVarDecl 0x[[LOAD_PARAM:[0-9a-f]+]] <> ByteAddress 'unsigned int' +// CHECK-NEXT:CompoundStmt 0x{{[0-9a-f]+}} <> +// CHECK-NEXT:ReturnStmt 0x{{[0-9a-f]+}} <> +// CHECK-NEXT:ImplicitCastExpr 0x{{[0-9a-f]+}} <> 'T' +// CHECK-NEXT:UnaryOperator 0x{{[0-9a-f]+}} <> 'T' lvalue prefix '*' cannot overflow +// CHECK-NEXT:CStyleCastExpr 0x{{[0-9a-f]+}} <> 'T *' lvalue +// CHECK-NEXT:inaryOperator 0x{{[0-9a-f]+}} <> 'unsigned char *' '+' +// CHECK-NEXT:ImplicitCastExpr 0x{{[0-9a-f]+}} <> 'unsigned char *' +// CHECK-NEXT:CStyleCastExpr 0x{{[0-9a-f]+}} <> 'unsigned char *' lvalue +// CHECK-NEXT:MemberExpr 0x{{[0-9a-f]+}} <> 'void *' lvalue ->h 0x[[HDL]] +// CHECK-NEXT:CXXThisExpr 0x{{[0-9a-f]+}} <> 'hlsl::RWByteAddressBuffer *' implicit this +// CHECK-NEXT:DeclRefExpr 0x{{[0-9a-f]+}} <> 'unsigned int' ParmVar 0x[[LOAD_PARAM]] 'ByteAddress' 'unsigned int' + +// CHECK:CXXMethodDecl 0x[[LOAD_F:[0-9a-f]+]] <> used Load 'float (unsigned int)' +// CHECK-NEXT:TemplateArgument type 'float' +// CHECK-NEXT:BuiltinType 0x{{[0-9a-f]+}} 'float' + +// CHECK:CXXMethodDecl 0x[[LOAD_F2:[0-9a-f]+]] <> used Load 'float (unsigned int) __attribute__((ext_vector_type(2)))' +// CHECK-NEXT:TemplateArgument type 'float __attribute__((ext_vector_type(2)))' +// CHECK-NEXT:ExtVectorType 0x{{[0-9a-f]+}} 'float __attribute__((ext_vector_type(2)))' 2 +// CHECK-NEXT:BuiltinType 0x{{[0-9a-f]+}} 'float' + +// CHECK:CXXMethodDecl 0x[[LOAD_S:[0-9a-f]+]] <> used Load 'S (unsigned int)' +// CHECK-NEXT:TemplateArgument type 'S' +// CHECK-NEXT:-RecordType 0x{{[0-9a-f]+}} 'S' +// CHECK-NEXT:CXXRecord 0x[[RECORD:[0-9a-f]+]] 'S' + +// CHECK:VarDecl 0x[[BUF:[0-9a-f]+]] <{{.+}}:1, col:21> col:21 used U 'RWByteAddressBuffer':'hlsl::RWByteAddressBuffer' + +// CHECK:FunctionDecl 0x{{[0-9a-f]+}} line:{{[0-9]+}}:7 foo 'float (uint)' +// CHECK-NEXT:ParmVarDecl 0x[[FOO_PARAM:[0-9a-f]+]] col:16 used i 'uint':'unsigned int' +// CHECK-NEXT:CompoundStmt 0x{{[0-9a-f]+}} +// CHECK-NEXT:ReturnStmt 0x{{[0-9a-f]+}} +// CHECK-NEXT:CXXMemberCallExpr 0x{{[0-9a-f]+}} 'float':'float' +// CHECK-NEXT:MemberExpr 0x{{[0-9a-f]+}} '' .Load 0x[[LOAD_F]] +// CHECK-NEXT:DeclRefExpr 0x{{[0-9a-f]+}} 'RWByteAddressBuffer':'hlsl::RWByteAddressBuffer' lvalue Var 0x[[BUF]] 'U' 'RWByteAddressBuffer':'hlsl::RWByteAddressBuffer' +// CHECK-NEXT:ImplicitCastExpr 0x{{[
[PATCH] D136913: [HLSL] support RWByteAddressBuffer.
python3kgae updated this revision to Diff 481858. python3kgae added a comment. Rebase Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D136913/new/ https://reviews.llvm.org/D136913 Files: clang/include/clang/Sema/HLSLExternalSemaSource.h clang/lib/Sema/HLSLExternalSemaSource.cpp clang/lib/Sema/SemaExpr.cpp clang/lib/Sema/SemaExprMember.cpp clang/test/AST/HLSL/RWByteAddressBuffer.hlsl clang/test/SemaHLSL/BuiltIns/RWByteAddressBuffer.hlsl Index: clang/test/SemaHLSL/BuiltIns/RWByteAddressBuffer.hlsl === --- /dev/null +++ clang/test/SemaHLSL/BuiltIns/RWByteAddressBuffer.hlsl @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -x hlsl -fsyntax-only -verify %s + +typedef vector float3; + +RWByteAddressBuffer Buffer; + +[numthreads(1,1,1)] +void main() { + (void)Buffer.h; // expected-error {{'h' is a private member of 'hlsl::RWByteAddressBuffer'}} + // expected-note@* {{implicitly declared private here}} + Buffer.Load(0); +} Index: clang/test/AST/HLSL/RWByteAddressBuffer.hlsl === --- /dev/null +++ clang/test/AST/HLSL/RWByteAddressBuffer.hlsl @@ -0,0 +1,104 @@ +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -fsyntax-only -ast-dump %s | FileCheck %s + +RWByteAddressBuffer U; +typedef unsigned int uint; +typedef vector float2; + +// CHECK:CXXRecordDecl 0x{{[0-9a-f]+}} <> implicit referenced class RWByteAddressBuffer definition +// CHECK:FinalAttr 0x{{[0-9a-f]+}} <> Implicit final +// CHECK-NEXT:HLSLResourceAttr 0x{{[0-9a-f]+}} <> Implicit UAV RawBuffer +// CHECK-NEXT:-FieldDecl 0x[[HDL:[0-9a-f]+]] <> implicit referenced h 'void *' +// CHECK-NEXT:CXXConstructorDecl 0x{{[0-9a-f]+}} <> used RWByteAddressBuffer 'void ()' inline +// CHECK-NEXT:CompoundStmt 0x{{[0-9a-f]+}} <> +// CHECK-NEXT:BinaryOperator 0x{{[0-9a-f]+}} <> 'void *' lvalue '=' +// CHECK-NEXT:MemberExpr 0x{{[0-9a-f]+}} <> 'void *' lvalue ->h 0x[[HDL]] +// CHECK-NEXT:-CXXThisExpr 0x{{[0-9a-f]+}} <> 'hlsl::RWByteAddressBuffer *' implicit this +// CHECK-NEXT:CallExpr 0x{{[0-9a-f]+}} <> 'void *' +// CHECK-NEXT:-DeclRefExpr 0x{{[0-9a-f]+}} <> 'void *(unsigned char) throw()' Function 0x{{[0-9a-f]+}} '__builtin_hlsl_create_handle' 'void *(unsigned char) throw()' +// CHECK-NEXT:-IntegerLiteral 0x{{[0-9a-f]+}} <> 'unsigned char' 1 +// CHECK-NEXT:FunctionTemplateDecl 0x{{[0-9a-f]+}} <> Load +// CHECK-NEXT:TemplateTypeParmDecl 0x{{[0-9a-f]+}} <> class depth 0 index 0 T +// CHECK-NEXT:CXXMethodDecl 0x{{[0-9a-f]+}} <> Load 'T (unsigned int)' +// CHECK-NEXT:ParmVarDecl 0x[[LOAD_PARAM:[0-9a-f]+]] <> ByteAddress 'unsigned int' +// CHECK-NEXT:CompoundStmt 0x{{[0-9a-f]+}} <> +// CHECK-NEXT:ReturnStmt 0x{{[0-9a-f]+}} <> +// CHECK-NEXT:ImplicitCastExpr 0x{{[0-9a-f]+}} <> 'T' +// CHECK-NEXT:UnaryOperator 0x{{[0-9a-f]+}} <> 'T' lvalue prefix '*' cannot overflow +// CHECK-NEXT:CStyleCastExpr 0x{{[0-9a-f]+}} <> 'T *' lvalue +// CHECK-NEXT:inaryOperator 0x{{[0-9a-f]+}} <> 'unsigned char *' '+' +// CHECK-NEXT:ImplicitCastExpr 0x{{[0-9a-f]+}} <> 'unsigned char *' +// CHECK-NEXT:CStyleCastExpr 0x{{[0-9a-f]+}} <> 'unsigned char *' lvalue +// CHECK-NEXT:MemberExpr 0x{{[0-9a-f]+}} <> 'void *' lvalue ->h 0x[[HDL]] +// CHECK-NEXT:CXXThisExpr 0x{{[0-9a-f]+}} <> 'hlsl::RWByteAddressBuffer *' implicit this +// CHECK-NEXT:DeclRefExpr 0x{{[0-9a-f]+}} <> 'unsigned int' ParmVar 0x[[LOAD_PARAM]] 'ByteAddress' 'unsigned int' + +// CHECK:CXXMethodDecl 0x[[LOAD_F:[0-9a-f]+]] <> used Load 'float (unsigned int)' +// CHECK-NEXT:TemplateArgument type 'float' +// CHECK-NEXT:BuiltinType 0x{{[0-9a-f]+}} 'float' + +// CHECK:CXXMethodDecl 0x[[LOAD_F2:[0-9a-f]+]] <> used Load 'float (unsigned int) __attribute__((ext_vector_type(2)))' +// CHECK-NEXT:TemplateArgument type 'float __attribute__((ext_vector_type(2)))' +// CHECK-NEXT:ExtVectorType 0x{{[0-9a-f]+}} 'float __attribute__((ext_vector_type(2)))' 2 +// CHECK-NEXT:BuiltinType 0x{{[0-9a-f]+}} 'float' + +// CHECK:CXXMethodDecl 0x[[LOAD_S:[0-9a-f]+]] <> used Load 'S (unsigned int)' +// CHECK-NEXT:TemplateArgument type 'S' +// CHECK-NEXT:-RecordType 0x{{[0-9a-f]+}} 'S' +// CHECK-NEXT:CXXRecord 0x[[RECORD:[0-9a-f]+]] 'S' + +// CHECK:VarDecl 0x[[BUF:[0-9a-f]+]] <{{.+}}:1, col:21> col:21 used U 'RWByteAddressBuffer':'hlsl::RWByteAddressBuffer' + +// CHECK:FunctionDecl 0x{{[0-9a-f]+}} line:{{[0-9]+}}:7 foo 'float (uint)' +// CHECK-NEXT:ParmVarDecl 0x[[FOO_PARAM:[0-9a-f]+]] col:16 used i 'uint':'unsigned int' +// CHECK-NEXT:CompoundStmt 0x{{[0-9a-f]+}} +// CHECK-NEXT:ReturnStmt 0x{{[0-9a-f]+}} +// CHECK-NEXT:CXXMemberCallExpr 0x{{[0-9a-f]+}} 'float':'float' +// CHECK-NEXT:MemberExpr 0x{{[0-9a-f]+}} '' .Load 0x[[LOAD_F]] +// CHECK-NEXT:DeclRefExpr 0x{{[0-9a-f]+}} 'RWByteAddressBuffer':'hlsl::RWByteAddressBuffer' lvalue Var 0x[[BUF]] 'U' 'RWByteAddressBuffer':'hlsl::RWByteAddressBuffer' +// CHECK-NEXT:ImplicitCastE
[PATCH] D136913: [HLSL] support RWByteAddressBuffer.
python3kgae created this revision. python3kgae added reviewers: pow2clk, beanz, bogner. Herald added a subscriber: Anastasia. Herald added a project: All. python3kgae requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits. Only RWByteAddressBuffer::Load is supported in this PR. Implement Load by cast handle to uint8_t ptr first. Then add the byte address to get target address. Cast the target address to target type ptr and deref. struct RWByteAddressBuffer { void *handle; template Load(uint i) { return *((T*)(((uint8_t*)handle) + i)); } }; Allow ref/ptr use for HLSLExternalSemaSource to skip the check when Location is invalid. Also add HLSLResourceHelper to share code for RWByteAddressBuffer and RWBuffer. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D136913 Files: clang/include/clang/Sema/HLSLExternalSemaSource.h clang/lib/Sema/HLSLExternalSemaSource.cpp clang/lib/Sema/SemaExpr.cpp clang/lib/Sema/SemaExprMember.cpp clang/test/AST/HLSL/RWByteAddressBuffer.hlsl clang/test/SemaHLSL/BuiltIns/RWByteAddressBuffer.hlsl Index: clang/test/SemaHLSL/BuiltIns/RWByteAddressBuffer.hlsl === --- /dev/null +++ clang/test/SemaHLSL/BuiltIns/RWByteAddressBuffer.hlsl @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -x hlsl -fsyntax-only -verify %s + +typedef vector float3; + +RWByteAddressBuffer Buffer; + +[numthreads(1,1,1)] +void main() { + (void)Buffer.h; // expected-error {{'h' is a private member of 'hlsl::RWByteAddressBuffer'}} + // expected-note@* {{implicitly declared private here}} + Buffer.Load(0); +} Index: clang/test/AST/HLSL/RWByteAddressBuffer.hlsl === --- /dev/null +++ clang/test/AST/HLSL/RWByteAddressBuffer.hlsl @@ -0,0 +1,104 @@ +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -fsyntax-only -ast-dump %s | FileCheck %s + +RWByteAddressBuffer U; +typedef unsigned int uint; +typedef vector float2; + +// CHECK:CXXRecordDecl 0x{{[0-9a-f]+}} <> implicit referenced class RWByteAddressBuffer definition +// CHECK:FinalAttr 0x{{[0-9a-f]+}} <> Implicit final +// CHECK-NEXT:HLSLResourceAttr 0x{{[0-9a-f]+}} <> Implicit UAV RawBuffer +// CHECK-NEXT:-FieldDecl 0x[[HDL:[0-9a-f]+]] <> implicit referenced h 'void *' +// CHECK-NEXT:CXXConstructorDecl 0x{{[0-9a-f]+}} <> used RWByteAddressBuffer 'void ()' inline +// CHECK-NEXT:CompoundStmt 0x{{[0-9a-f]+}} <> +// CHECK-NEXT:BinaryOperator 0x{{[0-9a-f]+}} <> 'void *' lvalue '=' +// CHECK-NEXT:MemberExpr 0x{{[0-9a-f]+}} <> 'void *' lvalue ->h 0x[[HDL]] +// CHECK-NEXT:-CXXThisExpr 0x{{[0-9a-f]+}} <> 'hlsl::RWByteAddressBuffer *' implicit this +// CHECK-NEXT:CallExpr 0x{{[0-9a-f]+}} <> 'void *' +// CHECK-NEXT:-DeclRefExpr 0x{{[0-9a-f]+}} <> 'void *(unsigned char) throw()' Function 0x{{[0-9a-f]+}} '__builtin_hlsl_create_handle' 'void *(unsigned char) throw()' +// CHECK-NEXT:-IntegerLiteral 0x{{[0-9a-f]+}} <> 'unsigned char' 1 +// CHECK-NEXT:FunctionTemplateDecl 0x{{[0-9a-f]+}} <> Load +// CHECK-NEXT:TemplateTypeParmDecl 0x{{[0-9a-f]+}} <> class depth 0 index 0 T +// CHECK-NEXT:CXXMethodDecl 0x{{[0-9a-f]+}} <> Load 'T (unsigned int)' +// CHECK-NEXT:ParmVarDecl 0x[[LOAD_PARAM:[0-9a-f]+]] <> ByteAddress 'unsigned int' +// CHECK-NEXT:CompoundStmt 0x{{[0-9a-f]+}} <> +// CHECK-NEXT:ReturnStmt 0x{{[0-9a-f]+}} <> +// CHECK-NEXT:ImplicitCastExpr 0x{{[0-9a-f]+}} <> 'T' +// CHECK-NEXT:UnaryOperator 0x{{[0-9a-f]+}} <> 'T' lvalue prefix '*' cannot overflow +// CHECK-NEXT:CStyleCastExpr 0x{{[0-9a-f]+}} <> 'T *' lvalue +// CHECK-NEXT:inaryOperator 0x{{[0-9a-f]+}} <> 'unsigned char *' '+' +// CHECK-NEXT:ImplicitCastExpr 0x{{[0-9a-f]+}} <> 'unsigned char *' +// CHECK-NEXT:CStyleCastExpr 0x{{[0-9a-f]+}} <> 'unsigned char *' lvalue +// CHECK-NEXT:MemberExpr 0x{{[0-9a-f]+}} <> 'void *' lvalue ->h 0x[[HDL]] +// CHECK-NEXT:CXXThisExpr 0x{{[0-9a-f]+}} <> 'hlsl::RWByteAddressBuffer *' implicit this +// CHECK-NEXT:DeclRefExpr 0x{{[0-9a-f]+}} <> 'unsigned int' ParmVar 0x[[LOAD_PARAM]] 'ByteAddress' 'unsigned int' + +// CHECK:CXXMethodDecl 0x[[LOAD_F:[0-9a-f]+]] <> used Load 'float (unsigned int)' +// CHECK-NEXT:TemplateArgument type 'float' +// CHECK-NEXT:BuiltinType 0x{{[0-9a-f]+}} 'float' + +// CHECK:CXXMethodDecl 0x[[LOAD_F2:[0-9a-f]+]] <> used Load 'float (unsigned int) __attribute__((ext_vector_type(2)))' +// CHECK-NEXT:TemplateArgument type 'float __attribute__((ext_vector_type(2)))' +// CHECK-NEXT:ExtVectorType 0x{{[0-9a-f]+}} 'float __attribute__((ext_vector_type(2)))' 2 +// CHECK-NEXT:BuiltinType 0x{{[0-9a-f]+}} 'float' + +// CHECK:CXXMethodDecl 0x[[LOAD_S:[0-9a-f]+]] <> used Load 'S (unsigned int)' +// CHECK-NEXT:TemplateArgument type 'S' +// CHECK-NEXT:-RecordType 0x{{[0-9a-f]+}} 'S' +// CHECK-NEXT:CXXRecord 0x[[RECORD:[0-9a-f]+]] 'S' + +// CHECK:VarDecl 0x[[BUF:[0-9a-f]+]] <{{.+}}:1, col:21> col:21 used U 'RWByt