Fix warnings/errors for strict aliasing & function prototypes
This fixes various issues related to gcc's strict-aliasing warning by using unions. It also handles various cases hit with gcc's missing-declarations warning.
This commit is contained in:
8
SPIRV/SpvBuilder.cpp
Executable file → Normal file
8
SPIRV/SpvBuilder.cpp
Executable file → Normal file
@@ -698,7 +698,9 @@ Id Builder::makeFloatConstant(float f, bool specConstant)
|
||||
{
|
||||
Op opcode = specConstant ? OpSpecConstant : OpConstant;
|
||||
Id typeId = makeFloatType(32);
|
||||
unsigned value = *(unsigned int*)&f;
|
||||
union { float fl; unsigned int ui; } u;
|
||||
u.fl = f;
|
||||
unsigned value = u.ui;
|
||||
|
||||
// See if we already made it. Applies only to regular constants, because specialization constants
|
||||
// must remain distinct for the purpose of applying a SpecId decoration.
|
||||
@@ -721,7 +723,9 @@ Id Builder::makeDoubleConstant(double d, bool specConstant)
|
||||
{
|
||||
Op opcode = specConstant ? OpSpecConstant : OpConstant;
|
||||
Id typeId = makeFloatType(64);
|
||||
unsigned long long value = *(unsigned long long*)&d;
|
||||
union { double db; unsigned long long ull; } u;
|
||||
u.db = d;
|
||||
unsigned long long value = u.ull;
|
||||
unsigned op1 = value & 0xFFFFFFFF;
|
||||
unsigned op2 = value >> 32;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user