Commit: a31a87f8943aa4029ff0f23a6dc46f5d0c895e8b Author: Ankit Meel Date: Thu Oct 1 23:51:01 2020 +0530 Branches: master https://developer.blender.org/rBa31a87f8943aa4029ff0f23a6dc46f5d0c895e8b
T81340: UBSan: load of value .. not valid for GPU enum type The underlying type of the enum cannot be fixed here due to its usage in C code. All the values possible in the width of the underlying type are not valid for an enum. Only 0 to (2*max - 1) if all enumerators are unsigned. So the macro asks for the biggest value among the //listed// ones. If any enumerator C is set to say `A|B`, then C would be the maximum. (2*max-1) is used as the mask. The warnings (for each enum modified in this commit): GPU_vertex_buffer.h:43:1: runtime error: load of value 4294967291 which is not a valid value for type 'GPUVertBufStatus' https://github.com/llvm/llvm-project/commit/1c2c9867 Ref T81340 Reviewed By: fclem Differential Revision: https://developer.blender.org/D9067 =================================================================== M source/blender/blenlib/BLI_utildefines.h M source/blender/gpu/GPU_batch.h M source/blender/gpu/GPU_framebuffer.h M source/blender/gpu/GPU_platform.h M source/blender/gpu/GPU_state.h M source/blender/gpu/GPU_texture.h M source/blender/gpu/GPU_vertex_buffer.h M source/blender/gpu/intern/gpu_texture_private.hh =================================================================== diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h index 326015e8d80..40d24f07c25 100644 --- a/source/blender/blenlib/BLI_utildefines.h +++ b/source/blender/blenlib/BLI_utildefines.h @@ -782,7 +782,8 @@ extern bool BLI_memory_is_zero(const void *arr, const size_t arr_size); /* Useful to port C code using enums to C++ where enums are strongly typed. * To use after the enum declaration. */ -# define ENUM_OPERATORS(_enum_type) \ +/* If any enumerator `C` is set to say `A|B`, then `C` would be the max enum value. */ +# define ENUM_OPERATORS(_enum_type, _max_enum_value) \ inline constexpr _enum_type operator|(_enum_type a, _enum_type b) \ { \ return static_cast<_enum_type>(static_cast<int>(a) | b); \ @@ -793,7 +794,7 @@ extern bool BLI_memory_is_zero(const void *arr, const size_t arr_size); } \ inline constexpr _enum_type operator~(_enum_type a) \ { \ - return static_cast<_enum_type>(~static_cast<int>(a)); \ + return static_cast<_enum_type>(~static_cast<int>(a) & (2 * _max_enum_value - 1)); \ } \ inline _enum_type &operator|=(_enum_type &a, _enum_type b) \ { \ @@ -806,7 +807,7 @@ extern bool BLI_memory_is_zero(const void *arr, const size_t arr_size); #else /* Output nothing. */ -# define ENUM_OPERATORS(_type) +# define ENUM_OPERATORS(_type, _max) #endif /** \} */ diff --git a/source/blender/gpu/GPU_batch.h b/source/blender/gpu/GPU_batch.h index 6fc2f646831..e5f36c1ae46 100644 --- a/source/blender/gpu/GPU_batch.h +++ b/source/blender/gpu/GPU_batch.h @@ -66,7 +66,7 @@ typedef enum eGPUBatchFlag { BLI_STATIC_ASSERT(GPU_BATCH_OWNS_INDEX < GPU_BATCH_INIT, "eGPUBatchFlag: Error: status flags are shadowed by the ownership bits!") -ENUM_OPERATORS(eGPUBatchFlag) +ENUM_OPERATORS(eGPUBatchFlag, GPU_BATCH_DIRTY) #ifdef __cplusplus extern "C" { diff --git a/source/blender/gpu/GPU_framebuffer.h b/source/blender/gpu/GPU_framebuffer.h index be55cd7af2d..c0f91756bf6 100644 --- a/source/blender/gpu/GPU_framebuffer.h +++ b/source/blender/gpu/GPU_framebuffer.h @@ -38,7 +38,7 @@ typedef enum eGPUFrameBufferBits { GPU_STENCIL_BIT = (1 << 2), } eGPUFrameBufferBits; -ENUM_OPERATORS(eGPUFrameBufferBits) +ENUM_OPERATORS(eGPUFrameBufferBits, GPU_STENCIL_BIT) #ifdef __cplusplus extern "C" { diff --git a/source/blender/gpu/GPU_platform.h b/source/blender/gpu/GPU_platform.h index a89298c0d01..bb7e1d58041 100644 --- a/source/blender/gpu/GPU_platform.h +++ b/source/blender/gpu/GPU_platform.h @@ -39,7 +39,7 @@ typedef enum eGPUDeviceType { GPU_DEVICE_ANY = (0xff), } eGPUDeviceType; -ENUM_OPERATORS(eGPUDeviceType) +ENUM_OPERATORS(eGPUDeviceType, GPU_DEVICE_ANY) typedef enum eGPUOSType { GPU_OS_WIN = (1 << 8), diff --git a/source/blender/gpu/GPU_state.h b/source/blender/gpu/GPU_state.h index 04cf7bc54ba..d650936b44a 100644 --- a/source/blender/gpu/GPU_state.h +++ b/source/blender/gpu/GPU_state.h @@ -33,7 +33,7 @@ typedef enum eGPUWriteMask { GPU_WRITE_COLOR = (GPU_WRITE_RED | GPU_WRITE_GREEN | GPU_WRITE_BLUE | GPU_WRITE_ALPHA), } eGPUWriteMask; -ENUM_OPERATORS(eGPUWriteMask) +ENUM_OPERATORS(eGPUWriteMask, GPU_WRITE_COLOR) typedef enum eGPUBarrier { GPU_BARRIER_NONE = 0, @@ -41,7 +41,7 @@ typedef enum eGPUBarrier { GPU_BARRIER_TEXTURE_FETCH = (1 << 1), } eGPUBarrier; -ENUM_OPERATORS(eGPUBarrier) +ENUM_OPERATORS(eGPUBarrier, GPU_BARRIER_TEXTURE_FETCH) /** * Defines the fixed pipeline blending equation. diff --git a/source/blender/gpu/GPU_texture.h b/source/blender/gpu/GPU_texture.h index 862da60c845..25af7d592f7 100644 --- a/source/blender/gpu/GPU_texture.h +++ b/source/blender/gpu/GPU_texture.h @@ -62,7 +62,7 @@ typedef enum eGPUSamplerState { GPU_SAMPLER_MAX = (GPU_SAMPLER_ICON + 1), } eGPUSamplerState; -ENUM_OPERATORS(eGPUSamplerState) +ENUM_OPERATORS(eGPUSamplerState, GPU_SAMPLER_REPEAT) #ifdef __cplusplus extern "C" { diff --git a/source/blender/gpu/GPU_vertex_buffer.h b/source/blender/gpu/GPU_vertex_buffer.h index 36caee10072..eeaebd3fae5 100644 --- a/source/blender/gpu/GPU_vertex_buffer.h +++ b/source/blender/gpu/GPU_vertex_buffer.h @@ -40,7 +40,7 @@ typedef enum { GPU_VERTBUF_DATA_UPLOADED = (1 << 2), } GPUVertBufStatus; -ENUM_OPERATORS(GPUVertBufStatus) +ENUM_OPERATORS(GPUVertBufStatus, GPU_VERTBUF_DATA_UPLOADED) #ifdef __cplusplus extern "C" { diff --git a/source/blender/gpu/intern/gpu_texture_private.hh b/source/blender/gpu/intern/gpu_texture_private.hh index b489493c5c1..250dee62f96 100644 --- a/source/blender/gpu/intern/gpu_texture_private.hh +++ b/source/blender/gpu/intern/gpu_texture_private.hh @@ -42,7 +42,7 @@ typedef enum eGPUTextureFormatFlag { GPU_FORMAT_DEPTH_STENCIL = (GPU_FORMAT_DEPTH | GPU_FORMAT_STENCIL), } eGPUTextureFormatFlag; -ENUM_OPERATORS(eGPUTextureFormatFlag) +ENUM_OPERATORS(eGPUTextureFormatFlag, GPU_FORMAT_DEPTH_STENCIL) typedef enum eGPUTextureType { GPU_TEXTURE_1D = (1 << 0), @@ -57,7 +57,7 @@ typedef enum eGPUTextureType { GPU_TEXTURE_CUBE_ARRAY = (GPU_TEXTURE_CUBE | GPU_TEXTURE_ARRAY), } eGPUTextureType; -ENUM_OPERATORS(eGPUTextureType) +ENUM_OPERATORS(eGPUTextureType, GPU_TEXTURE_CUBE_ARRAY) #ifdef DEBUG # define DEBUG_NAME_LEN 64 _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs