]> git.ipfire.org Git - thirdparty/gcc.git/commit
ipa-devirt: Fix crash in obj_type_ref_class [PR95114]
authorRichard Sandiford <richard.sandiford@arm.com>
Mon, 13 Jul 2020 12:47:39 +0000 (13:47 +0100)
committerGiuliano Belinassi <giuliano.belinassi@usp.br>
Mon, 17 Aug 2020 16:17:28 +0000 (13:17 -0300)
commit9f779e058e1755f00734b5cee18eb7c599f32956
tree0c940d7d1af92fa44b90069e1190daf2302c5fac
parent6d720ae99eca058f8873a7449d2a005bfc178918
ipa-devirt: Fix crash in obj_type_ref_class [PR95114]

The testcase has failed since r9-5035, because obj_type_ref_class
tries to look up an ODR type when no ODR type information is
available.  (The information was available earlier in the
compilation, but was freed during pass_ipa_free_lang_data.)
We then crash dereferencing the null get_odr_type result.

The test passes with -O2.  However, it fails again if -fdump-tree-all
is used, since obj_type_ref_class is called indirectly from the
dump routines.

Other code creates ODR type entries on the fly by passing “true”
as the insert parameter.  But obj_type_ref_class can't do that
unconditionally, since it should have no side-effects when used
from the dumping code.

Following a suggestion from Honza, this patch adds parameters
to say whether the routines are being called from dump routines
and uses those to derive the insert parameter.

gcc/
PR middle-end/95114
* tree.h (virtual_method_call_p): Add a default-false parameter
that indicates whether the function is being called from dump
routines.
(obj_type_ref_class): Likewise.
* tree.c (virtual_method_call_p): Likewise.
* ipa-devirt.c (obj_type_ref_class): Likewise.  Lazily add ODR
type information for the type when the parameter is false.
* tree-pretty-print.c (dump_generic_node): Update calls to
virtual_method_call_p and obj_type_ref_class accordingly.

gcc/testsuite/
PR middle-end/95114
* g++.target/aarch64/pr95114.C: New test.
gcc/ipa-devirt.c
gcc/testsuite/g++.target/aarch64/pr95114.C [new file with mode: 0644]
gcc/tree-pretty-print.c
gcc/tree.c
gcc/tree.h