EXT_debug_printf - make escape sequences better match C/C++

This commit is contained in:
Jeff Bolz 2020-03-10 10:23:07 -05:00
parent dbb56a1d48
commit ad3f10bbd0
6 changed files with 72 additions and 37 deletions

View File

@ -1,7 +1,7 @@
spv.debugPrintf.frag spv.debugPrintf.frag
// Module Version 10000 // Module Version 10000
// Generated by (magic number): 80008 // Generated by (magic number): 80008
// Id's are bound by 13 // Id's are bound by 17
Capability Shader Capability Shader
Extension "SPV_KHR_non_semantic_info" Extension "SPV_KHR_non_semantic_info"
@ -11,6 +11,8 @@ spv.debugPrintf.frag
EntryPoint Fragment 4 "main" EntryPoint Fragment 4 "main"
ExecutionMode 4 OriginUpperLeft ExecutionMode 4 OriginUpperLeft
6: String "ASDF \ ? \ %d %d %d" 6: String "ASDF \ ? \ %d %d %d"
13: String "ABAZ"
15: String "B#$B1Z"
Source GLSL 450 Source GLSL 450
SourceExtension "GL_EXT_debug_printf" SourceExtension "GL_EXT_debug_printf"
Name 4 "main" Name 4 "main"
@ -23,5 +25,7 @@ spv.debugPrintf.frag
4(main): 2 Function None 3 4(main): 2 Function None 3
5: Label 5: Label
12: 2 ExtInst 11(NonSemantic.DebugPrintf) 1(DebugPrintf) 6 8 9 10 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 Return
FunctionEnd FunctionEnd

View File

@ -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

View File

@ -4,4 +4,10 @@
void main() void main()
{ {
debugPrintfEXT("ASDF \\ \? \x5C %d %d %d", 1, 2, 3); debugPrintfEXT("ASDF \\ \? \x5C %d %d %d", 1, 2, 3);
// ABA{backspace}Z
debugPrintfEXT("\x41\x000042\x41\x8Z");
// B#${bell, aka \a}B1Z
debugPrintfEXT("\102\043\44\7\1021Z");
} }

View File

@ -0,0 +1,11 @@
#version 450
#extension GL_EXT_debug_printf : enable
void main()
{
// invalid hex sequence
debugPrintfEXT("\xZ");
// not an octal sequence
debugPrintfEXT("\8");
}

View File

@ -1045,7 +1045,12 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
case 't': ch = 0x09; break; case 't': ch = 0x09; break;
case 'v': ch = 0x0b; break; case 'v': ch = 0x0b; break;
case 'x': case 'x':
// two character hex value // Hex value, arbitrary number of characters. Terminated by the first
// non-hex digit
{
int numDigits = 0;
ch = 0;
while (true) {
nextCh = getch(); nextCh = getch();
if (nextCh >= '0' && nextCh <= '9') if (nextCh >= '0' && nextCh <= '9')
nextCh -= '0'; nextCh -= '0';
@ -1053,20 +1058,18 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
nextCh -= 'A' - 10; nextCh -= 'A' - 10;
else if (nextCh >= 'a' && nextCh <= 'f') else if (nextCh >= 'a' && nextCh <= 'f')
nextCh -= 'a' - 10; nextCh -= 'a' - 10;
else else {
pp->parseContext.ppError(ppToken->loc, "Expected hex value in escape sequence", "string", ""); ungetch();
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; 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 '0':
case '1': case '1':
case '2': case '2':
@ -1075,20 +1078,23 @@ int TPpContext::tStringInput::scan(TPpToken* ppToken)
case '5': case '5':
case '6': case '6':
case '7': case '7':
// three character octal value // Octal value, up to three octal digits
nextCh = getch() - '0'; {
if (nextCh > 3) int numDigits = 1;
pp->parseContext.ppError(ppToken->loc, "Expected octal value in escape sequence", "string", ""); ch = nextCh - '0';
ch = nextCh * 8 * 8; while (numDigits < 3) {
nextCh = getch() - '0'; nextCh = getch();
if (nextCh > 7) if (nextCh >= '0' && nextCh <= '7')
pp->parseContext.ppError(ppToken->loc, "Expected octal value in escape sequence", "string", ""); nextCh -= '0';
ch += nextCh * 8; else {
nextCh = getch() - '0'; ungetch();
if (nextCh > 7)
pp->parseContext.ppError(ppToken->loc, "Expected octal value in escape sequence", "string", "");
ch += nextCh;
break; break;
}
numDigits++;
ch = ch * 8 + nextCh;
}
break;
}
default: default:
pp->parseContext.ppError(ppToken->loc, "Invalid escape sequence", "string", ""); pp->parseContext.ppError(ppToken->loc, "Invalid escape sequence", "string", "");
break; break;

View File

@ -310,6 +310,7 @@ INSTANTIATE_TEST_CASE_P(
"spv.dataOutIndirect.frag", "spv.dataOutIndirect.frag",
"spv.dataOutIndirect.vert", "spv.dataOutIndirect.vert",
"spv.debugPrintf.frag", "spv.debugPrintf.frag",
"spv.debugPrintf_Error.frag",
"spv.demoteDisabled.frag", "spv.demoteDisabled.frag",
"spv.deepRvalue.frag", "spv.deepRvalue.frag",
"spv.depthOut.frag", "spv.depthOut.frag",