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>
|
* @author Michal Krol <michal@vmware.com>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "svga_shader.h"
|
#include "svga_shader.h"
|
||||||
#include "svga_shader_dump.h"
|
#include "svga_shader_dump.h"
|
||||||
#include "svga_shader_op.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 )
|
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) {
|
switch (srcreg.modifier) {
|
||||||
case SVGA3DSRCMOD_NEG:
|
case SVGA3DSRCMOD_NEG:
|
||||||
case SVGA3DSRCMOD_BIASNEG:
|
case SVGA3DSRCMOD_BIASNEG:
|
||||||
|
@ -427,7 +435,7 @@ static void dump_srcreg( struct sh_srcreg srcreg, struct sh_srcreg *indreg, cons
|
||||||
case SVGA3DSRCMOD_NOT:
|
case SVGA3DSRCMOD_NOT:
|
||||||
_debug_printf( "!" );
|
_debug_printf( "!" );
|
||||||
}
|
}
|
||||||
dump_reg( *(struct sh_reg *) &srcreg, indreg, di );
|
dump_reg(srcreg_sh, indreg, di );
|
||||||
switch (srcreg.modifier) {
|
switch (srcreg.modifier) {
|
||||||
case SVGA3DSRCMOD_NONE:
|
case SVGA3DSRCMOD_NONE:
|
||||||
case SVGA3DSRCMOD_NEG:
|
case SVGA3DSRCMOD_NEG:
|
||||||
|
|
Loading…
Reference in New Issue