[Mesa-dev] [PATCH] glsl: Properly lex extra tokens when handling # directives.

Kenneth Graunke kenneth at whitecape.org
Thu Jun 12 01:06:14 PDT 2014

On Wednesday, June 11, 2014 11:02:34 PM Matt Turner wrote:
> How did you notice this? (More specifically than semicolons being
> printed in your terminals!)
> Reviewed-by: Matt Turner <mattst88 at gmail.com>

I wrote a patch that altered the Meta GLSL clear shaders, and ran Piglit.  
Basically all of tests/hiz failed, along with some other random tests.  When I 
looked at the Piglit output, I noticed that stdout was:

;;PIGLIT: {'result': 'pass' }

I then reverted my patch, and discovered the bonus semicolons were gone.  I 
checked my code for printfs - none.  I ran valgrind - nothing.  I used gdb and 
put breakpoints on printf, fprintf, and various other output functions.  
Nothing.  I grepped the Mesa source code for print statements with semicolons 
not followed by whitespace or other text.  Nothing.  I grepped the Piglit 
code.  Nothing.

I finally gave up and started over, retyping my patch from scratch, one line 
at a time, compiling and running the hiz test with each change, looking for 
semicolons.  Eventually, I got around to adding my shader source line:

"#extension GL_AMD_vertex_shader_layer : enable;\n"

and suddenly the semicolons appeared.  So I knew it was something in the GLSL 
compiler, related to extension handling.  I put breakpoints before and after 
the preprocessor ran, and did:

(gdb) call printf("\n");

to flush out the semicolons.  Nothing.  I tried before and after the main 
lexer/parser.  Semicolons.  I put a breakpoint in 
_mesa_glsl_process_extension.  Semicolons.  I noticed the parser rule 
shouldn't accept ';', but apparently was anyway.  I added it.  Suddenly, no 
semicolon output.  I looked at the lexer...and realized the normal rule for 
"." didn't apply, since non-annotated rules only happen in the initial state.

That was the strangest bug I've tracked down in a while.  You always think the 
actual executable code you add will have the bug.  But it wasn't - it was the 
(const char *) string data that tripped up an existing bug.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140612/7843f62e/attachment.sig>

More information about the mesa-dev mailing list