diff options
-rw-r--r-- | Android.bp | 1 | ||||
-rw-r--r-- | celt/stack_alloc.h | 25 | ||||
-rw-r--r-- | src/analysis.c | 5 |
3 files changed, 27 insertions, 4 deletions
@@ -208,6 +208,7 @@ cc_library { "-DOPUS_BUILD", "-DFIXED_POINT", "-DUSE_ALLOCA", + "-DSIMD_EXTRA_ALLOC_BYTES=16", "-DHAVE_LRINT", "-DHAVE_LRINTF", "-DENABLE_HARDENING", diff --git a/celt/stack_alloc.h b/celt/stack_alloc.h index ae40e2a1..b289facd 100644 --- a/celt/stack_alloc.h +++ b/celt/stack_alloc.h @@ -88,10 +88,22 @@ * @param type Type of element */ +#ifndef SIMD_EXTRA_ALLOC_BYTES +#error define SIMD_EXTRA_ALLOC_BYTES appropriately in your makefile +/* + * Useful values: + * 0 for an all-scalar processor, which should never over-read the arrays + * 16 for an implementation using ARM Neon or X86 SSE4 instructions, which work + * with blocks of 16 bytes (128 bits) + */ +#endif + #if defined(VAR_ARRAYS) #define VARDECL(type, var) -#define ALLOC(var, size, type) type var[size] +// include a full SIMD width afterwards; +#define ALLOC(var, size, type) type var[(size) + ((SIMD_EXTRA_ALLOC_BYTES)/sizeof(type))] + #define SAVE_STACK #define RESTORE_STACK #define ALLOC_STACK @@ -103,9 +115,11 @@ #define VARDECL(type, var) type *var # ifdef _WIN32 -# define ALLOC(var, size, type) var = ((type*)_alloca(sizeof(type)*(size))) +# define ALLOC(var, size, type) var = \ + ((type*)_alloca(sizeof(type)*(size) + SIMD_EXTRA_ALLOC_BYTES)) # else -# define ALLOC(var, size, type) var = ((type*)alloca(sizeof(type)*(size))) +# define ALLOC(var, size, type) var = \ + ((type*)alloca(sizeof(type)*(size) + SIMD_EXTRA_ALLOC_BYTES)) # endif #define SAVE_STACK @@ -151,6 +165,11 @@ extern char *global_stack_top; #endif /* ENABLE_VALGRIND */ +// this path has NOT been modified to be safe in the face of SIMD over-reads +#if SIMD_EXTRA_ALLOC_BYTES != 0 +#error "ALLOC() is not updated in this configuration to provide for SIMD over-reads" +#endif + #include "os_support.h" #define VARDECL(type, var) type *var #define ALLOC(var, size, type) var = PUSH(global_stack, size, type) diff --git a/src/analysis.c b/src/analysis.c index 058328f0..8b4f22d0 100644 --- a/src/analysis.c +++ b/src/analysis.c @@ -149,7 +149,10 @@ static opus_val32 silk_resampler_down2_hp( out32_hp = ADD32( out32_hp, X ); S[ 2 ] = ADD32( -in32, X ); - hp_ener += out32_hp*(opus_val64)out32_hp; + if(__builtin_add_overflow(hp_ener, out32_hp*(opus_val64)out32_hp, &hp_ener)) + { + hp_ener = UINT64_MAX; + } /* Add, convert back to int16 and store to output */ out[ k ] = HALF32(out32); } |