On 5/19/22 17:02, Jan Hubicka wrote: >> Similarly to cgraph_nodes, it may happen that body_removed is set >> during merging of symbols. >> >> PR ipa/105600 >> >> Patch can bootstrap on x86_64-linux-gnu and survives regression tests. >> >> Ready to be installed? >> Thanks, >> Martin >> >> gcc/ChangeLog: >> >> * ipa-icf.cc (sem_item_optimizer::filter_removed_items): >> Skip variables with body_removed. >> --- >> gcc/ipa-icf.cc | 7 ++++--- >> 1 file changed, 4 insertions(+), 3 deletions(-) >> >> diff --git a/gcc/ipa-icf.cc b/gcc/ipa-icf.cc >> index 765ae746745..6528a7a10b2 100644 >> --- a/gcc/ipa-icf.cc >> +++ b/gcc/ipa-icf.cc >> @@ -2411,10 +2411,11 @@ sem_item_optimizer::filter_removed_items (void) >> { >> /* Filter out non-readonly variables. */ >> tree decl = item->decl; >> - if (TREE_READONLY (decl)) >> - filtered.safe_push (item); >> - else >> + varpool_node *vnode = static_cast <sem_variable >> *>(item)->get_node (); >> + if (!TREE_READONLY (decl) || vnode->body_removed) >> remove_item (item); >> + else >> + filtered.safe_push (item); > > So the situation here is that we merge symbols but keep syntactic alias > because the declarations are not compatible (have different attributes > perhaps because of fortify source)?
The test-case is more about a constexpr symbol or so, I'm not familiar enough with these modern C++. cgraph_node looks like: (gdb) p item->node->debug() _ZN8nlohmann6detail12static_constINS0_10to_json_fnEE5valueE/10 (value) @0x7ffff7fb3200 Type: variable Body removed by symtab_remove_unreachable_nodes Visibility: externally_visible semantic_interposition preempted_reg external public weak comdat comdat_group:_ZN8nlohmann6detail12static_constINS0_10to_json_fnEE5valueE one_only References: Referring: _Z7to_jsonRN8nlohmann10basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmiSaNS_14adl_serializerES2_IhSaIhEEEERK8Settings/1 (addr) _Z7to_jsonRN8nlohmann10basic_jsonISt3mapSt6vectorNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEblmiSaNS_14adl_serializerES2_IhSaIhEEEERK8Settings/1 (addr) Read from file: a.o Availability: not_available Varpool flags: initialized read-only > > Will ICF still see through the aliases and do merging? No. > I think you can > craft a testcase by triggering the attribute mismatch and see what > happens. At the time we implemented ICF these aliases did not exists, > so maybe some TLC is needed here. Please come up with such test case :) Thanks, Martin > > Honza