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:
parent
e827d91756
commit
8801734da7
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue