From ad3f54ab8e70aba72eb278d12d5e3c5d8b0de912 Mon Sep 17 00:00:00 2001 From: Andi Kleen Date: Mon, 11 Dec 2017 16:13:53 +0000 Subject: [PATCH] Fix stack overflow with autofdo (PR83355) g++.dg/bprob* is failing currently with autofdo. Running in gdb shows that there is a very deep recursion in get_index_by_decl until it overflows the stack. gcc/: 2017-12-11 Andi Kleen PR gcov-profile/83355 * auto-profile.c (string_table::get_index_by_decl): Don't recurse when abstract origin points to itself. From-SVN: r255540 --- gcc/ChangeLog | 6 ++++++ gcc/auto-profile.c | 2 +- gcc/lto-streamer-in.c | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a00bff3..75a4dc4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-12-11 Andi Kleen + + PR gcov-profile/83355 + * auto-profile.c (string_table::get_index_by_decl): Don't + recurse when abstract origin points to itself. + 2017-12-11 Bin Cheng PR tree-optimization/83320 diff --git a/gcc/auto-profile.c b/gcc/auto-profile.c index 5134a79..403709b 100644 --- a/gcc/auto-profile.c +++ b/gcc/auto-profile.c @@ -477,7 +477,7 @@ string_table::get_index_by_decl (tree decl) const ret = get_index (lang_hooks.dwarf_name (decl, 0)); if (ret != -1) return ret; - if (DECL_ABSTRACT_ORIGIN (decl)) + if (DECL_ABSTRACT_ORIGIN (decl) && DECL_ABSTRACT_ORIGIN (decl) != decl) return get_index_by_decl (DECL_ABSTRACT_ORIGIN (decl)); return -1; diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c index fd6bd06..3db1d38 100644 --- a/gcc/lto-streamer-in.c +++ b/gcc/lto-streamer-in.c @@ -360,6 +360,8 @@ lto_input_tree_ref (struct lto_input_block *ib, struct data_in *data_in, case LTO_label_decl_ref: case LTO_translation_unit_decl_ref: case LTO_namelist_decl_ref: + if (!data_in->file_data->current_decl_state) + printf("tag %d\n", tag); ix_u = streamer_read_uhwi (ib); result = lto_file_decl_data_get_var_decl (data_in->file_data, ix_u); break; -- 2.7.4