On Thu, Aug 6, 2026 at 5:45 PM Nazar Kazakov
<[email protected]> wrote:
>
> On 2026-07-15 08:11, Richard Biener wrote:
> > Is this happening in a build without -flto?  If so then I'd suggest to
> > isolate the TU having the issue.  You can also try to see whether
> > -fcompare-debug catches any issue (though in principle that's
> > somewhat an unrelated class of problems).
> >
> > You can see whether disabling address-space randomization helps
> > (it would still be a GCC bug).
> >
> > Once you have a reproducer (preprocessed source) please file
> > a bugreport.
>
> Hello Richard,
>
> I've managed to get a reproducer, it's not minimal though :)
> I didn't manage to create an account on bugzilla (got no response
> to the email asking for an account), so I'll post reproduction
> steps here. Sorry in advance for a lot of text.

I've put this in https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126707
that it happens with PCH only makes it tricky, given a testcase requires
the ability to produce the PCH, meaning a large part of the environment
rather than just preprocessed source.  So I don't have high hopes of
somebody narrowing this down.

Can you see whether setarch -R (disabled address-space randomization) helps?

> I've tested this on:
> * 16-core x86_64 machine with 32G of RAM
>    kernel: Linux 6.12.95+deb13-amd64 #1 SMP PREEMPT_DYNAMIC Debian
> 6.12.95-1 (2026-07-04) x86_64 GNU/Linux
> * 8-core x86_64 machine with 16G of RAM
>    kernel: Linux 7.1.5 #1-NixOS SMP PREEMPT_DYNAMIC Fri Jul 24 14:21:27
> UTC 2026 x86_64 GNU/Linux
>
> I've run the following commands:
> podman run -it --rm --network host --workdir /src -v .:/src
> debian:sid-20260803
> apt update && apt install g++ git #installs gcc (Debian 16.1.0-3) 16.1.0
> git clone https://github.com/KhronosGroup/glslang.git
> cd glslang && git checkout vulkan-sdk-1.4.350.1
>
> cat <<EOF >/src/glslang/glslang/build_info.h
> #ifndef GLSLANG_BUILD_INFO
> #define GLSLANG_BUILD_INFO
>
> #define GLSLANG_VERSION_MAJOR 16
> #define GLSLANG_VERSION_MINOR 3
> #define GLSLANG_VERSION_PATCH 0
> #define GLSLANG_VERSION_FLAVOR ""
>
> #define GLSLANG_VERSION_GREATER_THAN(major, minor, patch) \
>      ((GLSLANG_VERSION_MAJOR) > (major) || ((major) ==
> GLSLANG_VERSION_MAJOR && \
>      ((GLSLANG_VERSION_MINOR) > (minor) || ((minor) ==
> GLSLANG_VERSION_MINOR && \
>       (GLSLANG_VERSION_PATCH) > (patch)))))
>
> #define GLSLANG_VERSION_GREATER_OR_EQUAL_TO(major, minor, patch) \
>      ((GLSLANG_VERSION_MAJOR) > (major) || ((major) ==
> GLSLANG_VERSION_MAJOR && \
>      ((GLSLANG_VERSION_MINOR) > (minor) || ((minor) ==
> GLSLANG_VERSION_MINOR && \
>       (GLSLANG_VERSION_PATCH >= (patch))))))
>
> #define GLSLANG_VERSION_LESS_THAN(major, minor, patch) \
>      ((GLSLANG_VERSION_MAJOR) < (major) || ((major) ==
> GLSLANG_VERSION_MAJOR && \
>      ((GLSLANG_VERSION_MINOR) < (minor) || ((minor) ==
> GLSLANG_VERSION_MINOR && \
>       (GLSLANG_VERSION_PATCH) < (patch)))))
>
> #define GLSLANG_VERSION_LESS_OR_EQUAL_TO(major, minor, patch) \
>      ((GLSLANG_VERSION_MAJOR) < (major) || ((major) ==
> GLSLANG_VERSION_MAJOR && \
>      ((GLSLANG_VERSION_MINOR) < (minor) || ((minor) ==
> GLSLANG_VERSION_MINOR && \
>       (GLSLANG_VERSION_PATCH <= (patch))))))
>
> #endif // GLSLANG_BUILD_INFO
> EOF
> mkdir -p /src/glslang/_builddir/glslang/CMakeFiles/glslang.dir
> cat <<EOF
>  >/src/glslang/_builddir/glslang/CMakeFiles/glslang.dir/cmake_pch.hxx
> /* generated by CMake */
>
> #pragma GCC system_header
> #ifdef __cplusplus
> #include "/src/glslang/glslang/MachineIndependent/pch.h"
> #endif // __cplusplus
> EOF
> cat <<EOF
>  >/src/glslang/_builddir/glslang/CMakeFiles/glslang.dir/cmake_pch.hxx.cxx
> /* generated by CMake */
> EOF
> cd _builddir
> cat <<EOF >compile.sh
> #!/usr/bin/env bash
> set -eux
> c++ -DENABLE_HLSL -DENABLE_OPT=0 -DENABLE_SPIRV
> -DGLSLANG_IS_SHARED_LIBRARY=1 -DGLSLANG_OSINCLUDE_UNIX
> -DGLSLANG_TEST_BUILD -Dglslang_EXPORTS -I/src/glslang/glslang/..
> -I/src/glslang/_builddir/include -O2 -pipe -g -Wp,-D_FORTIFY_SOURCE=3
> -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong
> -grecord-gcc-switches -fasynchronous-unwind-tables
> -fstack-clash-protection -fcf-protection -fno-omit-frame-pointer
> -mno-omit-leaf-frame-pointer -fdump-rtl-vartrack-details -DNDEBUG
> -std=c++17 -fPIC -fvisibility=hidden -Wall -Wmaybe-uninitialized
> -Wuninitialized -Wunused -Wunused-local-typedefs -Wimplicit-fallthrough
> -Wunused-parameter -Wunused-value -Wunused-variable
> -Wunused-but-set-parameter -Wunused-but-set-variable -fno-rtti
> -fno-exceptions -Werror=deprecated-copy -Winvalid-pch -x c++-header
> -include
> /src/glslang/_builddir/glslang/CMakeFiles/glslang.dir/cmake_pch.hxx -o
> glslang/CMakeFiles/glslang.dir/cmake_pch.hxx.gch -c
> /src/glslang/_builddir/glslang/CMakeFiles/glslang.dir/cmake_pch.hxx.cxx
> c++ -DENABLE_HLSL -DENABLE_OPT=0 -DENABLE_SPIRV
> -DGLSLANG_IS_SHARED_LIBRARY=1 -DGLSLANG_OSINCLUDE_UNIX
> -DGLSLANG_TEST_BUILD -Dglslang_EXPORTS -I/src/glslang -O2 -pipe -g
> -Wp,-D_FORTIFY_SOURCE=3 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions
> -fstack-protector-strong -grecord-gcc-switches
> -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection
> -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer
> -fdump-rtl-vartrack-details -DNDEBUG -std=c++17 -fPIC
> -fvisibility=hidden -Wall -Wmaybe-uninitialized -Wuninitialized -Wunused
> -Wunused-local-typedefs -Wimplicit-fallthrough -Wunused-parameter
> -Wunused-value -Wunused-variable -Wunused-but-set-parameter
> -Wunused-but-set-variable -fno-rtti -fno-exceptions
> -Werror=deprecated-copy -Winvalid-pch -include
> /src/glslang/_builddir/glslang/CMakeFiles/glslang.dir/cmake_pch.hxx -o
> /src/glslang/glslang/MachineIndependent/ShaderLang.cpp.o -c
> /src/glslang/glslang/MachineIndependent/ShaderLang.cpp
>
> EOF
> chmod +x compile.sh
> cat <<EOF >clean.sh
> #!/usr/bin/env bash
> set -eux
> rm -f glslang/CMakeFiles/glslang.dir/cmake_pch.hxx.gch
> rm -f /src/glslang/glslang/MachineIndependent/ShaderLang.cpp.*
> EOF
> chmod +x clean.sh
>
> ./clean.sh
> ./compile.sh
> mkdir build_reference
> sha256sum /src/glslang/glslang/MachineIndependent/ShaderLang.cpp.o >
> build_reference/sha256.txt
> mv glslang/CMakeFiles/glslang.dir/cmake_pch.hxx.gch
> /src/glslang/glslang/MachineIndependent/ShaderLang.cpp.*
> build_reference/
>
> for x in $(seq 1 1000); do ./clean.sh; ./compile.sh; sha256sum
> /src/glslang/glslang/MachineIndependent/ShaderLang.cpp.o >
> build_result_$x.txt; if [ "$(cat build_result_$x.txt)" != "$(cat
> build_reference/sha256.txt)" ]; then mkdir checkout_$x; mv
> glslang/CMakeFiles/glslang.dir/cmake_pch.hxx.gch
> /src/glslang/glslang/MachineIndependent/ShaderLang.cpp.* checkout_$x/;
> fi; done
>
> After about 15-20 minutes I reliably get a checkout_* directory with a
> different
> build result.
>
> My guess is that it's related to the interaction between pre-compiled
> headers and
> variable tracking pass. I've worked around that by disabling
> pre-compiled headers
> in glslang build for now, but the bug is still there in gcc I think.
>
> Thanks,
> Nazar Kazakov

Reply via email to