aboutsummaryrefslogtreecommitdiff
path: root/config
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2024-02-03 14:37:19 +0100
committerJakub Jelinek <jakub@redhat.com>2024-02-03 14:37:19 +0100
commita4e240643cfa387579d4fa2bf9210a7d20433847 (patch)
treebd0bc2daf2fb8f5075eec70755a5d9b9ac0b2a36 /config
parent51c4eb28c192ecff4463c973a0ff089e04a80b89 (diff)
downloadgcc-a4e240643cfa387579d4fa2bf9210a7d20433847.zip
gcc-a4e240643cfa387579d4fa2bf9210a7d20433847.tar.gz
gcc-a4e240643cfa387579d4fa2bf9210a7d20433847.tar.bz2
ggc-common: Fix save PCH assertion
We are getting a gnuradio PCH ICE /usr/include/pybind11/stl.h:447:1: internal compiler error: in gt_pch_save, at ggc-common.cc:693 0x1304e7d gt_pch_save(_IO_FILE*) ../../gcc/ggc-common.cc:693 0x12a45fb c_common_write_pch() ../../gcc/c-family/c-pch.cc:175 0x18ad711 c_parse_final_cleanups() ../../gcc/cp/decl2.cc:5062 0x213988b c_common_parse_file() ../../gcc/c-family/c-opts.cc:1319 (unfortunately it isn't reproduceable always, but often needs up to 100 attempts, isn't reproduceable in a cross etc.). The bug is in the assertion I've added in gt_pch_save when adding relocation support for the PCH files in case they happen not to be mmapped at the selected address. addr is a relocated address which points to a location in the PCH blob (starting at mmi.preferred_base, with mmi.size bytes) which contains a pointer that needs to be relocated. So the assertion is meant to verify the address is within the PCH blob, obviously it needs to be equal or above mmi.preferred_base, but I got the other comparison wrong and when one is very unlucky and the last sizeof (void *) bytes of the blob happen to be a pointer which needs to be relocated, such as on the s390x host addr 0x8008a04ff8, mmi.preferred_base 0x8000000000 and mmi.size 0x8a05000, addr + sizeof (void *) is equal to mmi.preferred_base + mmi.size and that is still fine, both addresses are end of something. 2024-02-03 Jakub Jelinek <jakub@redhat.com> * ggc-common.cc (gt_pch_save): Allow addr to be equal to mmi.preferred_base + mmi.size - sizeof (void *).
Diffstat (limited to 'config')
0 files changed, 0 insertions, 0 deletions