]> git.sesse.net Git - ffmpeg/commitdiff
avcodec/mpegaudio_tablegen: Avoid write-only buffers
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Tue, 17 Nov 2020 22:20:03 +0000 (23:20 +0100)
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>
Tue, 8 Dec 2020 16:51:47 +0000 (17:51 +0100)
The mpegaudio_tablegen header contains code to initialize several
tables; it is included in both the fixed as well as the floating point
mpegaudio decoders and some of these tables are only used by the fixed
resp. floating point decoders; yet both types are always initialized,
leaving the compiler to figure out that one of them is unused.

GCC 9.3 fails at this (even with -O3):
$ readelf -s mpegaudiodec_fixed.o|grep _float
    28: 0000000000001660 32768 OBJECT  LOCAL  DEFAULT    4 expval_table_float
An actually unused table (expval_table_fixed/float) of size 32KiB is kept
and initialized (the reason for this is probably that this table is read
from, namely to initialize another table: exp_table_fixed/float; of course
the float resp. fixed tables are not used in the fixed resp. floating point
decoder).

Therefore #ifdef the unneeded tables away.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
libavcodec/mpegaudio_tablegen.c
libavcodec/mpegaudio_tablegen.h

index ede7c8e2213dca87affdda01c058be5a77c212ab..ec0d51c67d596f27b174f2c9f54be8a26e9370d9 100644 (file)
@@ -22,6 +22,7 @@
 
 #include <stdlib.h>
 #define CONFIG_HARDCODED_TABLES 0
+#define BUILD_TABLES
 #include "libavutil/tablegen.h"
 #include "mpegaudio_tablegen.h"
 #include "tableprint.h"
index 0b0ea40682dc87d5e29d59bfd9b7f79033d9aef9..dcc09e37b8730220297fda244c52e4a2114e0551 100644 (file)
 #else
 static int8_t   table_4_3_exp[TABLE_4_3_SIZE];
 static uint32_t table_4_3_value[TABLE_4_3_SIZE];
+
+#if defined(BUILD_TABLES) || !USE_FLOATS
+#define FIXED_TABLE
 static uint32_t exp_table_fixed[512];
 static uint32_t expval_table_fixed[512][16];
+#endif
+
+#if defined(BUILD_TABLES) || USE_FLOATS
+#define FLOAT_TABLE
 static float exp_table_float[512];
 static float expval_table_float[512][16];
+#endif
 
 #define FRAC_BITS 23
 #define IMDCT_SCALAR 1.759
@@ -79,13 +87,23 @@ static av_cold void mpegaudio_tableinit(void)
         exp2_val = exp2_base * exp2_lut[exponent & 3] / IMDCT_SCALAR;
         for (value = 0; value < 16; value++) {
             double f = pow43_lut[value] * exp2_val;
+#ifdef FIXED_TABLE
             expval_table_fixed[exponent][value] = (f < 0xFFFFFFFF ? llrint(f) : 0xFFFFFFFF);
+#endif
+#ifdef FLOAT_TABLE
             expval_table_float[exponent][value] = f;
+#endif
         }
+#ifdef FIXED_TABLE
         exp_table_fixed[exponent] = expval_table_fixed[exponent][1];
+#endif
+#ifdef FLOAT_TABLE
         exp_table_float[exponent] = expval_table_float[exponent][1];
+#endif
     }
 }
+#undef FLOAT_TABLE
+#undef FIXED_TABLE
 #endif /* CONFIG_HARDCODED_TABLES */
 
 #endif /* AVCODEC_MPEGAUDIO_TABLEGEN_H */