EXT_debug_printf - make escape sequences better match C/C++
authorJeff Bolz <jbolz@nvidia.com>
Tue, 10 Mar 2020 15:23:07 +0000 (10:23 -0500)
committerJeff Bolz <jbolz@nvidia.com>
Tue, 10 Mar 2020 15:23:07 +0000 (10:23 -0500)
Test/baseResults/spv.debugPrintf.frag.out
Test/baseResults/spv.debugPrintf_Error.frag.out [new file with mode: 0644]
Test/spv.debugPrintf.frag
Test/spv.debugPrintf_Error.frag [new file with mode: 0644]
glslang/MachineIndependent/preprocessor/PpScanner.cpp
gtests/Spv.FromFile.cpp

index bb6a91f..dbd0b4e 100644 (file)
@@ -1,7 +1,7 @@
 spv.debugPrintf.frag
 // Module Version 10000
 // Generated by (magic number): 80008
-// Id's are bound by 13
+// Id's are bound by 17
 
                               Capability Shader
                               Extension  "SPV_KHR_non_semantic_info"
@@ -11,6 +11,8 @@ spv.debugPrintf.frag
                               EntryPoint Fragment 4  "main"
                               ExecutionMode 4 OriginUpperLeft
                6:             String  "ASDF \ ? \ %d %d %d"
+              13:             String  "ABA\bZ"
+              15:             String  "B#$\aB1Z"
                               Source GLSL 450
                               SourceExtension  "GL_EXT_debug_printf"
                               Name 4  "main"
@@ -23,5 +25,7 @@ spv.debugPrintf.frag
          4(main):           2 Function None 3
                5:             Label
               12:           2 ExtInst 11(NonSemantic.DebugPrintf) 1(DebugPrintf) 6 8 9 10
+              14:           2 ExtInst 11(NonSemantic.DebugPrintf) 1(DebugPrintf) 13
+              16:           2 ExtInst 11(NonSemantic.DebugPrintf) 1(DebugPrintf) 15
                               Return
                               FunctionEnd
diff --git a/Test/baseResults/spv.debugPrintf_Error.frag.out b/Test/baseResults/spv.debugPrintf_Error.frag.out
new file mode 100644 (file)
index 0000000..31ddd9d
--- /dev/null
@@ -0,0 +1,7 @@
+spv.debugPrintf_Error.frag
+ERROR: 0:7: 'string' : Expected hex value in escape sequence 
+ERROR: 0:10: 'string' : Invalid escape sequence 
+ERROR: 2 compilation errors.  No code generated.
+
+
+SPIR-V is not generated for failed compile or link
index 81b6428..3dff629 100644 (file)
@@ -4,4 +4,10 @@
 void main()\r
 {\r
     debugPrintfEXT("ASDF \\ \? \x5C %d %d %d", 1, 2, 3);\r
+\r
+    // ABA{backspace}Z\r
+    debugPrintfEXT("\x41\x000042\x41\x8Z");\r
+\r
+    // B#${bell, aka \a}B1Z\r
+    debugPrintfEXT("\102\043\44\7\1021Z");\r
 }\r
diff --git a/Test/spv.debugPrintf_Error.frag b/Test/spv.debugPrintf_Error.frag
new file mode 100644 (file)
index 0000000..c1980a7
--- /dev/null
@@ -0,0 +1,11 @@
+#version 450\r
+#extension GL_EXT_debug_printf : enable\r
+\r
+void main()\r
+{\r
+    // invalid hex sequence\r
+    debugPrintfEXT("\xZ");\r
+\r
+    // not an octal sequence\r
+    debugPrintfEXT("\8");\r
+}\r
index 6cdadec..e0f44f8 100644 (file)
@@ -1045,28 +1045,31 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
                         case 't':  ch = 0x09; break;
                         case 'v':  ch = 0x0b; break;
                         case 'x': 
-                            // two character hex value
-                            nextCh = getch();
-                            if (nextCh >= '0' && nextCh <= '9')
-                                nextCh -= '0';
-                            else if (nextCh >= 'A' && nextCh <= 'F')
-                                nextCh -= 'A' - 10;
-                            else if (nextCh >= 'a' && nextCh <= 'f')
-                                nextCh -= 'a' - 10;
-                            else
-                                pp->parseContext.ppError(ppToken->loc, "Expected hex value in escape sequence", "string", "");
-                            ch = nextCh * 0x10;
-                            nextCh = getch();
-                            if (nextCh >= '0' && nextCh <= '9')
-                                nextCh -= '0';
-                            else if (nextCh >= 'A' && nextCh <= 'F')
-                                nextCh -= 'A' - 10;
-                            else if (nextCh >= 'a' && nextCh <= 'f')
-                                nextCh -= 'a' - 10;
-                            else
-                                pp->parseContext.ppError(ppToken->loc, "Expected hex value in escape sequence", "string", "");
-                            ch += nextCh;
-                            break;
+                            // Hex value, arbitrary number of characters. Terminated by the first
+                            // non-hex digit
+                            {
+                                int numDigits = 0;
+                                ch = 0;
+                                while (true) {
+                                    nextCh = getch();
+                                    if (nextCh >= '0' && nextCh <= '9')
+                                        nextCh -= '0';
+                                    else if (nextCh >= 'A' && nextCh <= 'F')
+                                        nextCh -= 'A' - 10;
+                                    else if (nextCh >= 'a' && nextCh <= 'f')
+                                        nextCh -= 'a' - 10;
+                                    else {
+                                        ungetch();
+                                        break;
+                                    }
+                                    numDigits++;
+                                    ch = ch * 0x10 + nextCh;
+                                }
+                                if (numDigits == 0) {
+                                    pp->parseContext.ppError(ppToken->loc, "Expected hex value in escape sequence", "string", "");
+                                }
+                                break;
+                            }
                         case '0':
                         case '1':
                         case '2':
@@ -1075,20 +1078,23 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
                         case '5':
                         case '6':
                         case '7':
-                            // three character octal value
-                            nextCh = getch() - '0';
-                            if (nextCh > 3)
-                                pp->parseContext.ppError(ppToken->loc, "Expected octal value in escape sequence", "string", "");
-                            ch = nextCh * 8 * 8;
-                            nextCh = getch() - '0';
-                            if (nextCh > 7)
-                                pp->parseContext.ppError(ppToken->loc, "Expected octal value in escape sequence", "string", "");
-                            ch += nextCh * 8;
-                            nextCh = getch() - '0';
-                            if (nextCh > 7)
-                                pp->parseContext.ppError(ppToken->loc, "Expected octal value in escape sequence", "string", "");
-                            ch += nextCh;
-                            break;
+                            // Octal value, up to three octal digits
+                            {
+                                int numDigits = 1;
+                                ch = nextCh - '0';
+                                while (numDigits < 3) {
+                                    nextCh = getch();
+                                    if (nextCh >= '0' && nextCh <= '7')
+                                        nextCh -= '0';
+                                    else {
+                                        ungetch();
+                                        break;
+                                    }
+                                    numDigits++;
+                                    ch = ch * 8 + nextCh;
+                                }
+                                break;
+                            }
                         default:
                             pp->parseContext.ppError(ppToken->loc, "Invalid escape sequence", "string", "");
                             break;
index 110313e..244fa1e 100644 (file)
@@ -310,6 +310,7 @@ INSTANTIATE_TEST_CASE_P(
         "spv.dataOutIndirect.frag",
         "spv.dataOutIndirect.vert",
         "spv.debugPrintf.frag",
+        "spv.debugPrintf_Error.frag",
         "spv.demoteDisabled.frag",
         "spv.deepRvalue.frag",
         "spv.depthOut.frag",