Explorar el Código

Don't generate decl for effect object to avoid codegen crash. (#94)

* Don't generate decl for effect object to avoid codegen crash.

* Add technique11 and rewriter test for effect.

* Skip the initializer of effect object.
Xiang Li hace 8 años
padre
commit
9ed2eec376

+ 1 - 0
tools/clang/include/clang/Basic/TokenKinds.def

@@ -515,6 +515,7 @@ KEYWORD(sampler_state               , KEYHLSL)
 KEYWORD(technique                   , KEYHLSL)
 ALIAS("Technique", technique        , KEYHLSL)
 ALIAS("technique10", technique      , KEYHLSL)
+ALIAS("technique11", technique      , KEYHLSL)
 
 // OpenCL address space qualifiers
 KEYWORD(__global                    , KEYOPENCL)

+ 10 - 0
tools/clang/lib/Parse/ParseDecl.cpp

@@ -2501,6 +2501,16 @@ Decl *Parser::ParseDeclarationAfterDeclaratorAndAttributes(
         return nullptr;
       }
 
+
+      // HLSL Change Begin.
+      // Skip the initializer of effect object.
+      if (D.isInvalidType()) {
+        SkipUntil(tok::semi, StopBeforeMatch); // skip until ';'
+        Actions.ActOnUninitializedDecl(ThisDecl, TypeContainsAuto);
+        return nullptr;
+      }
+      // HLSL Change End.
+
       ExprResult Init(ParseInitializer());
 
       // If this is the only decl in (possibly) range based for statement,

+ 1 - 2
tools/clang/lib/Sema/SemaHLSL.cpp

@@ -9835,9 +9835,8 @@ bool Sema::DiagnoseHLSLDecl(Declarator &D, DeclContext *DC,
   if (hlsl::IsObjectType(this, qt, &bDeprecatedEffectObject)) {
     if (bDeprecatedEffectObject) {
       Diag(D.getLocStart(), diag::warn_hlsl_effect_object);
-      // Setting to invalid but not returning false prevents cascading errors
-      // on subsequent references to the decl
       D.setInvalidType();
+      return false;
     }
     // Add methods if not ready.
     HLSLExternalSource *hlslSource = HLSLExternalSource::FromSema(this);

+ 25 - 0
tools/clang/test/CodeGenHLSL/effect_skip.hlsl

@@ -0,0 +1,25 @@
+// RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
+
+// CHECK: @main
+
+BlendState NoBlending
+{
+	AlphaToCoverageEnable = FALSE;
+	BlendEnable[0] = FALSE;
+};
+
+BlendState A;
+BlendState B = A;
+
+DepthStencilState DisableDepth
+{
+	DepthEnable = FALSE;
+	DepthWriteMask = ZERO;
+};
+
+float4 main(int4 a : A) : SV_TARGET
+{
+  RenderTargetView rtv { state=foo; };
+  RenderTargetView  rt = rtv;
+  return a + abs(a.yxxx);
+}

+ 5 - 0
tools/clang/test/HLSL/effects-syntax.hlsl

@@ -154,6 +154,11 @@ technique10                                                 /* expected-warning
   pass {}
 }
 
+technique11                                                 /* expected-warning {{effect technique ignored - effect syntax is deprecated}} fxc-pass {{}} */
+{
+  pass {}
+}
+
 // We don't bother handling weird casing, so this will be a syntax error:
 TechNiQue                                                   /* expected-error {{HLSL requires a type specifier for all declarations}} fxc-pass {{}} */
 /*verify-ast

+ 28 - 0
tools/clang/test/HLSL/rewriter/correct_rewrites/effects-syntax_gold.hlsl

@@ -0,0 +1,28 @@
+// Rewrite unchanged result:
+Texture2D tex : register(t1);
+Texture2D tex2 : register(t2);
+Texture2D texa[3];
+SamplerState samLinear : register(s7);
+sampler S : register(s1);
+SamplerComparisonState SC : register(s3);
+float4 main() : SV_Target {
+  int SB;
+  {
+    int StateBlock = 1;
+  }
+  int PixelShadeR = 1;
+  Texture2D l_tex;
+  int foobar;
+  int foobar2;
+  int RenderTargetView = 1;
+  int PixelShader = 1;
+  int pixelshader = 1;
+  int TechNiQue = 1;
+  return tex.Sample(samLinear, float2(0.10000000000000001, 0.20000000000000001));
+}
+
+
+int TechNiQue;
+int foobar3;
+int T5;
+int foobar4;

+ 179 - 0
tools/clang/test/HLSL/rewriter/effects-syntax.hlsl

@@ -0,0 +1,179 @@
+// RUN: %clang_cc1 -fsyntax-only -ffreestanding -verify %s
+// :FXC_VERIFY_ARGUMENTS: /E main /T ps_5_1 /Gec
+
+Texture2D tex : register(t1), tex2 : register(t2)
+/*verify-ast
+  VarDecl <col:1, col:11> col:11 used tex 'Texture2D':'Texture2D<vector<float, 4> >'
+  `-RegisterAssignment <col:17> register(t1)
+  VarDecl <col:1, col:31> col:31 tex2 'Texture2D':'Texture2D<vector<float, 4> >'
+  `-RegisterAssignment <col:38> register(t2)
+  VarDecl <col:1, line:19:10> col:4 texa 'Texture2D [3]'
+*/
+< int foo=1; >                                              /* expected-warning {{possible effect annotation ignored - effect syntax is deprecated}} fxc-pass {{}} */
+{                                                           /* expected-warning {{effect state block ignored - effect syntax is deprecated}} fxc-pass {{}} */
+    Texture = tex;
+    Filter = MIN_MAG_MIP_LINEAR;
+    MaxAnisotropy = 0;
+    AddressU = Wrap;
+    AddressV = Wrap;
+}, texa[3]
+<                                                           /* expected-warning {{possible effect annotation ignored - effect syntax is deprecated}} fxc-pass {{}} */
+  string Name = "texa";
+  int ArraySize = 3;
+>;
+
+Texture texCaps;                                            /* expected-warning {{effect object ignored - effect syntax is deprecated}} fxc-pass {{}} */
+
+SamplerState samLinear : register(s7)
+/*verify-ast
+  VarDecl <col:1, col:14> col:14 used samLinear 'SamplerState'
+  `-RegisterAssignment <col:26> register(s7)
+*/
+< bool foo=1 > 2; >                                         /* expected-warning {{possible effect annotation ignored - effect syntax is deprecated}} fxc-pass {{}} */
+{                                                           /* expected-warning {{effect state block ignored - effect syntax is deprecated}} fxc-pass {{}} */
+    Texture = tex;
+    Filter = MIN_MAG_MIP_LINEAR;
+    MaxAnisotropy = 0;
+    AddressU = Wrap;
+    AddressV = Wrap;
+};
+
+// sampler_state objects legal on both SamplerState and SamplerComparisonState objects:
+sampler S : register(s1) = sampler_state {texture=tex;};    /* expected-warning {{effect sampler_state assignment ignored - effect syntax is deprecated}} fxc-pass {{}} */
+/*verify-ast
+  VarDecl <col:1, col:9> col:9 S 'sampler':'SamplerState'
+  `-RegisterAssignment <col:13> register(s1)
+*/
+SamplerComparisonState SC : register(s3) = sampler_state {texture=tex;};    /* expected-warning {{effect sampler_state assignment ignored - effect syntax is deprecated}} fxc-pass {{}} */
+
+float4 main() : SV_Target
+{
+  StateBlock SB;                                            /* expected-error {{unknown type name 'StateBlock'}} fxc-error {{X3000: unrecognized identifier 'SB'}} fxc-error {{X3000: unrecognized identifier 'StateBlock'}} */
+
+  {
+    int StateBlock = 1;
+  }
+
+  // Note this is ok:
+  int PixelShadeR = 1;
+  RenderTargetView rtv { state=foo; };                      /* expected-warning {{effect object ignored - effect syntax is deprecated}} expected-warning {{effect state block ignored - effect syntax is deprecated}} fxc-pass {{}} */
+  /*verify-ast
+    DeclStmt <col:3, col:38>
+    `-VarDecl <col:3, col:20> col:20 invalid rtv 'RenderTargetView':'deprecated effect object'
+  */
+  Texture2D l_tex { state=foo; };                           /* expected-warning {{effect state block ignored - effect syntax is deprecated}} fxc-pass {{}} */
+  /*verify-ast
+    DeclStmt <col:3, col:33>
+    `-VarDecl <col:3, col:13> col:13 l_tex 'Texture2D':'Texture2D<vector<float, 4> >'
+  */
+
+  // This is allowed (deprecated effect state block warning):
+  int foobar {blah=foo;};                                   /* expected-warning {{effect state block ignored - effect syntax is deprecated}} fxc-pass {{}} */
+  // This is not:
+  int foobar2 {blah=foo;} = 5;                              /* expected-error {{expected ';' at end of declaration}} expected-warning {{effect state block ignored - effect syntax is deprecated}} fxc-error {{X3000: syntax error: unexpected token '='}} */
+
+  // But this isn't:
+  int RenderTargetView = 1;                                 /* fxc-error {{X3000: syntax error: unexpected token 'RenderTargetView'}} */
+  int PixelShader = 1;                                      /* fxc-error {{X3000: syntax error: unexpected token 'PixelShader'}} */
+  int pixelshader = 1;  // nor is this                      /* fxc-error {{X3000: syntax error: unexpected token 'pixelshader'}} */
+
+  // This is not ok:
+  // error X3000: syntax error: unexpected token 'TechNiQue'
+  int TechNiQue = 1;                                        /* fxc-error {{X3000: syntax error: unexpected token 'TechNiQue'}} */
+
+  return tex.Sample(samLinear, float2(0.1,0.2));
+  /*verify-ast
+    ReturnStmt <col:3, col:47>
+    `-CXXMemberCallExpr <col:10, col:47> 'vector<float, 4>'
+      |-MemberExpr <col:10, col:14> '<bound member function type>' .Sample
+      | `-DeclRefExpr <col:10> 'Texture2D':'Texture2D<vector<float, 4> >' lvalue Var 'tex' 'Texture2D':'Texture2D<vector<float, 4> >'
+      |-ImplicitCastExpr <col:21> 'SamplerState' <LValueToRValue>
+      | `-DeclRefExpr <col:21> 'SamplerState' lvalue Var 'samLinear' 'SamplerState'
+      `-CXXFunctionalCastExpr <col:32, col:46> 'float2':'vector<float, 2>' functional cast to float2 <NoOp>
+        `-InitListExpr <col:39, col:43> 'float2':'vector<float, 2>'
+          |-ImplicitCastExpr <col:39> 'float' <FloatingCast>
+          | `-FloatingLiteral <col:39> 'literal float' 1.000000e-01
+          `-ImplicitCastExpr <col:43> 'float' <FloatingCast>
+            `-FloatingLiteral <col:43> 'literal float' 2.000000e-01
+  */
+}
+
+// Effects objects to ignore:
+// These all accept/ignore effect annotations < ... >
+// These all accept/ignore state block syntax
+texture tex1 < int foo=1; > { state=foo; };   // Case insensitive!    /* expected-warning {{effect object ignored - effect syntax is deprecated}} expected-warning {{effect state block ignored - effect syntax is deprecated}} expected-warning {{possible effect annotation ignored - effect syntax is deprecated}} fxc-pass {{}} */
+static const PixelShader ps1 { state=foo; };                /* expected-warning {{effect object ignored - effect syntax is deprecated}} expected-warning {{effect state block ignored - effect syntax is deprecated}} fxc-pass {{}} */
+/*verify-ast
+  VarDecl <col:1, col:26> col:26 invalid ps1 'const PixelShader':'const deprecated effect object' static
+*/
+// expected-note@? {{'PixelShader' declared here}}
+PixelShadeR ps < int foo=1;>  = ps1;   // Case insensitive! /* expected-error {{unknown type name 'PixelShadeR'; did you mean 'PixelShader'?}} expected-warning {{effect object ignored - effect syntax is deprecated}} expected-warning {{possible effect annotation ignored - effect syntax is deprecated}} expected-error {{use of undeclared identifier 'ps1'}}fxc-pass {{}} */
+/*verify-ast
+  VarDecl <col:1, col:13> col:13 invalid ps 'PixelShader':'deprecated effect object'
+*/
+// expected-note@? {{'VertexShader' declared here}}
+VertexShadeR vs;        // Case insensitive!                /* expected-error {{unknown type name 'VertexShadeR'; did you mean 'VertexShader'?}} expected-warning {{effect object ignored - effect syntax is deprecated}} fxc-pass {{}} */
+
+// Case sensitive
+pixelfragment pfrag;                                        /* expected-warning {{effect object ignored - effect syntax is deprecated}} fxc-pass {{}} */
+vertexfragment vfrag;                                       /* expected-warning {{effect object ignored - effect syntax is deprecated}} fxc-pass {{}} */
+ComputeShader cs;                                           /* expected-warning {{effect object ignored - effect syntax is deprecated}} fxc-pass {{}} */
+DomainShader ds;                                            /* expected-warning {{effect object ignored - effect syntax is deprecated}} fxc-pass {{}} */
+GeometryShader gs;                                          /* expected-warning {{effect object ignored - effect syntax is deprecated}} fxc-pass {{}} */
+HullShader hs;                                              /* expected-warning {{effect object ignored - effect syntax is deprecated}} fxc-pass {{}} */
+BlendState BS { state=foo; };                               /* expected-warning {{effect object ignored - effect syntax is deprecated}} expected-warning {{effect state block ignored - effect syntax is deprecated}} fxc-pass {{}} */
+DepthStencilState DSS { state=foo; };                       /* expected-warning {{effect object ignored - effect syntax is deprecated}} expected-warning {{effect state block ignored - effect syntax is deprecated}} fxc-pass {{}} */
+DepthStencilView SDV;                                       /* expected-warning {{effect object ignored - effect syntax is deprecated}} fxc-pass {{}} */
+RasterizerState RS { state=foo; };                          /* expected-warning {{effect object ignored - effect syntax is deprecated}} expected-warning {{effect state block ignored - effect syntax is deprecated}} fxc-pass {{}} */
+RenderTargetView RTV < int foo=1;> ;                        /* expected-warning {{effect object ignored - effect syntax is deprecated}} expected-warning {{possible effect annotation ignored - effect syntax is deprecated}} fxc-pass {{}} */
+
+// Not case-sensitive!  Identifier optional
+technique T0                                                /* expected-warning {{effect technique ignored - effect syntax is deprecated}} fxc-pass {{}} */
+/*verify-ast
+  No matching AST found for line!
+*/
+{
+  pass {}
+}
+Technique                                                   /* expected-warning {{effect technique ignored - effect syntax is deprecated}} fxc-pass {{}} */
+{
+  pass {}
+}
+
+// Case-sensitive:    Identifier optional
+technique10 T10                                             /* expected-warning {{effect technique ignored - effect syntax is deprecated}} fxc-pass {{}} */
+/*verify-ast
+  No matching AST found for line!
+*/
+{
+  pass {}
+}
+
+technique10                                                 /* expected-warning {{effect technique ignored - effect syntax is deprecated}} fxc-pass {{}} */
+{
+  pass {}
+}
+
+// We don't bother handling weird casing, so this will be a syntax error:
+TechNiQue                                                   /* expected-error {{HLSL requires a type specifier for all declarations}} fxc-pass {{}} */
+/*verify-ast
+  VarDecl <col:1> col:1 invalid TechNiQue 'int'
+*/
+{                                                           /* expected-warning {{effect state block ignored - effect syntax is deprecated}} fxc-pass {{}} */
+  pass {}
+}                                                           /* expected-error {{expected ';' after top level declarator}} fxc-pass {{}} */
+int foobar3;
+/*verify-ast
+  VarDecl <col:1, col:5> col:5 foobar3 'int'
+*/
+TechNique T5                                                /* expected-error {{unknown type name 'TechNique'}} fxc-pass {{}} */
+/*verify-ast
+  VarDecl <col:1, col:11> col:11 invalid T5 'int'
+*/
+{                                                           /* expected-warning {{effect state block ignored - effect syntax is deprecated}} fxc-pass {{}} */
+  pass {}
+}                                                           /* expected-error {{expected ';' after top level declarator}} fxc-pass {{}} */
+int foobar4;
+/*verify-ast
+  VarDecl <col:1, col:5> col:5 foobar4 'int'
+*/

+ 5 - 0
tools/clang/unittests/HLSL/CompilerTest.cpp

@@ -333,6 +333,7 @@ public:
   TEST_METHOD(CodeGenDivZero)
   TEST_METHOD(CodeGenDot1)
   TEST_METHOD(CodeGenDynamic_Resources)
+  TEST_METHOD(CodeGenEffectSkip)
   TEST_METHOD(CodeGenEmpty)
   TEST_METHOD(CodeGenEmptyStruct)
   TEST_METHOD(CodeGenEarlyDepthStencil)
@@ -2001,6 +2002,10 @@ TEST_F(CompilerTest, CodeGenDynamic_Resources) {
   CodeGenTestCheck(L"..\\CodeGenHLSL\\dynamic-resources.hlsl");
 }
 
+TEST_F(CompilerTest, CodeGenEffectSkip) {
+  CodeGenTestCheck(L"..\\CodeGenHLSL\\effect_skip.hlsl");
+}
+
 TEST_F(CompilerTest, CodeGenEmpty) {
   CodeGenTest(L"..\\CodeGenHLSL\\empty.hlsl");
 }

+ 5 - 0
tools/clang/unittests/HLSL/RewriterTest.cpp

@@ -69,6 +69,7 @@ public:
   TEST_METHOD(RunUTF16ThreeByteBadChar);
   TEST_METHOD(RunUTF16ThreeByte);
   TEST_METHOD(RunNonUnicode);
+  TEST_METHOD(RunEffect);
 
   dxc::DxcDllSupport m_dllSupport;
 
@@ -391,3 +392,7 @@ TEST_F(RewriterTest, RunNonUnicode) {
   VERIFY_IS_TRUE(strcmp(BlobToUtf8(result).c_str(), "// Rewrite unchanged result:\n\x69\x6e\x74\x20\xce\xb1\xce\xb2\xce\xb3\x3b\n") == 0);
 }
 
+TEST_F(RewriterTest, RunEffect) {
+  CheckVerifiesHLSL(L"rewriter\\effects-syntax.hlsl", L"rewriter\\correct_rewrites\\effects-syntax_gold.hlsl");
+}
+