From 08579bb971afdafa11031926ecdd1502e33851bc Mon Sep 17 00:00:00 2001 From: bruvzg <7645683+bruvzg@users.noreply.github.com> Date: Wed, 8 Jun 2022 13:31:02 +0300 Subject: [PATCH] Fix FreeType crashing in GCC + LTO builds. --- thirdparty/README.md | 5 +++ .../freetype/patches/fix_gcc_lto_build.diff | 34 +++++++++++++++++++ thirdparty/freetype/src/smooth/ftgrays.c | 9 +++++ 3 files changed, 48 insertions(+) create mode 100644 thirdparty/freetype/patches/fix_gcc_lto_build.diff diff --git a/thirdparty/README.md b/thirdparty/README.md index 23a2ec77d9a..28c3e42ee89 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -141,6 +141,11 @@ Files extracted from upstream source: - `include/` folder, minus the `dlg` subfolder - `LICENSE.TXT` and `docs/FTL.TXT` +Some changes have been made in order to prevent LTO from removing code. +They are marked with `// -- GODOT start --` and `// -- GODOT end --` +comments. Apply the patches in the `patches/` folder when syncing on newer upstream +commits. + ## glad diff --git a/thirdparty/freetype/patches/fix_gcc_lto_build.diff b/thirdparty/freetype/patches/fix_gcc_lto_build.diff new file mode 100644 index 00000000000..3c22b464c26 --- /dev/null +++ b/thirdparty/freetype/patches/fix_gcc_lto_build.diff @@ -0,0 +1,34 @@ +diff --git a/thirdparty/freetype/src/smooth/ftgrays.c b/thirdparty/freetype/src/smooth/ftgrays.c +index 622035aa79..5d9e1600b7 100644 +--- a/thirdparty/freetype/src/smooth/ftgrays.c ++++ b/thirdparty/freetype/src/smooth/ftgrays.c +@@ -1907,6 +1907,9 @@ typedef ptrdiff_t FT_PtrDist; + 0 /* delta */ + ) + ++// -- GODOT start -- ++ static volatile int _lto_dummy = 0; ++// -- GODOT end -- + + static int + gray_convert_glyph_inner( RAS_ARG, +@@ -1928,6 +1931,9 @@ typedef ptrdiff_t FT_PtrDist; + ras.max_ey, + ras.cell_null - ras.cell_free, + ras.cell_null - ras.cell_free == 1 ? "" : "s" )); ++// -- GODOT start -- ++ _lto_dummy = error; // Prevents LTO from removing this branch. ++// -- GODOT end -- + } + else + { +@@ -1935,6 +1941,9 @@ typedef ptrdiff_t FT_PtrDist; + + FT_TRACE7(( "band [%d..%d]: to be bisected\n", + ras.min_ey, ras.max_ey )); ++// -- GODOT start -- ++ _lto_dummy = error; // Prevents LTO from removing this branch. ++// -- GODOT end -- + } + + return error; diff --git a/thirdparty/freetype/src/smooth/ftgrays.c b/thirdparty/freetype/src/smooth/ftgrays.c index 622035aa797..5d9e1600b7d 100644 --- a/thirdparty/freetype/src/smooth/ftgrays.c +++ b/thirdparty/freetype/src/smooth/ftgrays.c @@ -1907,6 +1907,9 @@ typedef ptrdiff_t FT_PtrDist; 0 /* delta */ ) +// -- GODOT start -- + static volatile int _lto_dummy = 0; +// -- GODOT end -- static int gray_convert_glyph_inner( RAS_ARG, @@ -1928,6 +1931,9 @@ typedef ptrdiff_t FT_PtrDist; ras.max_ey, ras.cell_null - ras.cell_free, ras.cell_null - ras.cell_free == 1 ? "" : "s" )); +// -- GODOT start -- + _lto_dummy = error; // Prevents LTO from removing this branch. +// -- GODOT end -- } else { @@ -1935,6 +1941,9 @@ typedef ptrdiff_t FT_PtrDist; FT_TRACE7(( "band [%d..%d]: to be bisected\n", ras.min_ey, ras.max_ey )); +// -- GODOT start -- + _lto_dummy = error; // Prevents LTO from removing this branch. +// -- GODOT end -- } return error;