[libpng16] Added a work around for GCC 4.2 optimization bug

This commit is contained in:
John Bowler 2012-09-06 15:47:49 -05:00 committed by Glenn Randers-Pehrson
parent b257147015
commit 48cbba8e8e
3 changed files with 21 additions and 8 deletions

View File

@ -514,6 +514,7 @@ Version 1.6.0beta30 [September 6, 2012]
elements of the png_icc_matrix and png_icc_vector types. The accidental elements of the png_icc_matrix and png_icc_vector types. The accidental
(harmless) 'const' previously applied to the parameters of two of the (harmless) 'const' previously applied to the parameters of two of the
functions have also been removed. functions have also been removed.
Added a work around for GCC 4.2 optimiztion bug
Send comments/corrections/commendations to png-mng-implement at lists.sf.net Send comments/corrections/commendations to png-mng-implement at lists.sf.net
(subscription required; visit (subscription required; visit

View File

@ -4266,6 +4266,7 @@ Version 1.6.0beta30 [September 6, 2012]
elements of the png_icc_matrix and png_icc_vector types. The accidental elements of the png_icc_matrix and png_icc_vector types. The accidental
(harmless) 'const' previously applied to the parameters of two of the (harmless) 'const' previously applied to the parameters of two of the
functions have also been removed. functions have also been removed.
Added a work around for GCC 4.2 optimiztion bug
Send comments/corrections/commendations to png-mng-implement at lists.sf.net Send comments/corrections/commendations to png-mng-implement at lists.sf.net
(subscription required; visit (subscription required; visit

27
png.c
View File

@ -2155,15 +2155,26 @@ png_find_icc_tag(png_const_bytep profile, png_uint_32 tag, png_uint_32p length)
* png_int_32)[], not (const (png_int_32[])), consequently a compiler may object * png_int_32)[], not (const (png_int_32[])), consequently a compiler may object
* to passing a (png_int_32[]) (which does not have const elements). * to passing a (png_int_32[]) (which does not have const elements).
*/ */
typedef png_int_32 png_icc_vector[3]; #if __GNUC__ == 4 && __GNUC_MINOR__ == 2
typedef png_int_32 (*PNG_RESTRICT png_icc_vectorrp)[3]; /* GCC 4.2 has an optimization bug which means that if this code is compiled
typedef const png_int_32 (*PNG_RESTRICT png_const_icc_vectorrp)[3]; * with any optimization (i.e. not -O0) it somehow manages to make casts to
#define png_cpv(vector) png_constcast(const png_icc_vector*,&vector) * png_const_icc_matrixrp not work in some cases and so warns for some
* function calls. This works round the problem without harming optimization
* with other compilers.
*/
# define PNG_ICC_CONST
#else
# define PNG_ICC_CONST const
#endif
typedef png_int_32 png_icc_vector[3];
typedef png_int_32 (*PNG_RESTRICT png_icc_vectorrp)[3];
typedef PNG_ICC_CONST png_int_32 (*PNG_RESTRICT png_const_icc_vectorrp)[3];
#define png_cpv(vector) png_constcast(PNG_ICC_CONST png_icc_vector*,&vector)
typedef png_int_32 png_icc_matrix[3][3]; typedef png_int_32 png_icc_matrix[3][3];
typedef png_int_32 (*PNG_RESTRICT png_icc_matrixrp)[3][3]; typedef png_int_32 (*PNG_RESTRICT png_icc_matrixrp)[3][3];
typedef const png_int_32 (*PNG_RESTRICT png_const_icc_matrixrp)[3][3]; typedef PNG_ICC_CONST png_int_32 (*PNG_RESTRICT png_const_icc_matrixrp)[3][3];
#define png_cpm(matrix) png_constcast(const png_icc_matrix*,&matrix) #define png_cpm(matrix) png_constcast(PNG_ICC_CONST png_icc_matrix*,&matrix)
/* These two painfully complex routines are to detect under or overflow on /* These two painfully complex routines are to detect under or overflow on
* addition or subtraction of two 32-bit signed integers. There's probably a * addition or subtraction of two 32-bit signed integers. There's probably a