EXT_debug_printf - make escape sequences better match C/C++
This commit is contained in:
parent
dbb56a1d48
commit
ad3f10bbd0
@ -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
|
||||||
|
7
Test/baseResults/spv.debugPrintf_Error.frag.out
Normal file
7
Test/baseResults/spv.debugPrintf_Error.frag.out
Normal 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
|
@ -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");
|
||||||
}
|
}
|
||||||
|
11
Test/spv.debugPrintf_Error.frag
Normal file
11
Test/spv.debugPrintf_Error.frag
Normal 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");
|
||||||
|
}
|
@ -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;
|
||||||
|
@ -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",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user