svga: Fix a strict-aliasing violation in shader dumper

As per the C spec, it is illegal to alias pointers to different
types. This results in undefined behaviour after optimization
passes, resulting in very subtle bugs that happen only on a
full moon..

Use a memcpy() as a well defined coercion between the isomorphic
bit-field interpretations of memory.

V.2: Use C99 compat STATIC_ASSERT() over C11 static_assert().

Signed-off-by: Edward O'Callaghan <funfunctor@folklore1984.net>
Reviewed-by: Charmaine Lee <charmainel@vmware.com>
This commit is contained in:
Edward O'Callaghan 2016-12-06 11:28:56 +11:00
parent e827d91756
commit 8801734da7
1 changed files with 9 additions and 1 deletions

View File

@ -30,6 +30,9 @@
* @author Michal Krol <michal@vmware.com>
*/
#include <assert.h>
#include <string.h>
#include "svga_shader.h"
#include "svga_shader_dump.h"
#include "svga_shader_op.h"
@ -413,6 +416,11 @@ dump_dstreg(struct sh_dstreg dstreg,
static void dump_srcreg( struct sh_srcreg srcreg, struct sh_srcreg *indreg, const struct dump_info *di )
{
struct sh_reg srcreg_sh = {0};
/* bit-fields carefully aligned, ensure they stay that way. */
STATIC_ASSERT(sizeof(struct sh_reg) == sizeof(struct sh_srcreg));
memcpy(&srcreg_sh, &srcreg, sizeof(srcreg_sh));
switch (srcreg.modifier) {
case SVGA3DSRCMOD_NEG:
case SVGA3DSRCMOD_BIASNEG:
@ -427,7 +435,7 @@ static void dump_srcreg( struct sh_srcreg srcreg, struct sh_srcreg *indreg, cons
case SVGA3DSRCMOD_NOT:
_debug_printf( "!" );
}
dump_reg( *(struct sh_reg *) &srcreg, indreg, di );
dump_reg(srcreg_sh, indreg, di );
switch (srcreg.modifier) {
case SVGA3DSRCMOD_NONE:
case SVGA3DSRCMOD_NEG: