diff -up chromium-83.0.4103.97/third_party/skia/include/private/SkFloatingPoint.h.gcc-float-divide-by-zero chromium-83.0.4103.97/third_party/skia/include/private/SkFloatingPoint.h --- chromium-83.0.4103.97/third_party/skia/include/private/SkFloatingPoint.h.gcc-float-divide-by-zero 2020-06-15 11:09:01.218290365 -0400 +++ chromium-83.0.4103.97/third_party/skia/include/private/SkFloatingPoint.h 2020-06-15 11:14:15.900470624 -0400 @@ -159,7 +159,15 @@ static inline int64_t sk_float_saturate2 // Cast double to float, ignoring any warning about too-large finite values being cast to float. // Clang thinks this is undefined, but it's actually implementation defined to return either // the largest float or infinity (one of the two bracketing representable floats). Good enough! +#if defined(__GNUC__) && __GNUC__ >= 8 +__attribute__((no_sanitize("float-cast-overflow"))) +#else +# if defined(__GNUC__) +__attribute__((no_sanitize_undefined)) +# else [[clang::no_sanitize("float-cast-overflow")]] +# endif +#endif static inline float sk_double_to_float(double x) { return static_cast(x); } @@ -226,12 +234,28 @@ static inline float sk_float_rsqrt(float // IEEE defines how float divide behaves for non-finite values and zero-denoms, but C does not // so we have a helper that suppresses the possible undefined-behavior warnings. +#if defined(__GNUC__) && __GNUC__ >= 8 +__attribute__((no_sanitize("float-divide-by-zero"))) +#else +# if defined(__GNUC__) +__attribute__((no_sanitize_undefined)) +# else [[clang::no_sanitize("float-divide-by-zero")]] +# endif +#endif static inline float sk_ieee_float_divide(float numer, float denom) { return numer / denom; } +#if defined(__GNUC__) && __GNUC__ >= 8 +__attribute__((no_sanitize("float-divide-by-zero"))) +#else +# if defined(__GNUC__) +__attribute__((no_sanitize_undefined)) +# else [[clang::no_sanitize("float-divide-by-zero")]] +# endif +#endif static inline double sk_ieee_double_divide(double numer, double denom) { return numer / denom; }