mirror of
https://gcc.gnu.org/git/gcc.git
synced 2026-02-22 03:46:53 -05:00
Fix internal error during inlining after ICF pass
The problem is that the ICF pass identifies two functions, one of which has a static chain while the other does not. The fix is simply to prevent this identification from occurring. gcc/ PR ipa/113996 * ipa-icf.cc (sem_function::get_hash): Hash DECL_STATIC_CHAIN. (sem_function::equals_wpa): Compare it. (sem_function::equals_private): Likewise. gcc/testsuite/ * gnat.dg/lto27.adb: New test.
This commit is contained in:
@@ -304,6 +304,7 @@ sem_function::get_hash (void)
|
||||
(TREE_OPTIMIZATION (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (decl))));
|
||||
hstate.add_flag (DECL_CXX_CONSTRUCTOR_P (decl));
|
||||
hstate.add_flag (DECL_CXX_DESTRUCTOR_P (decl));
|
||||
hstate.add_flag (DECL_STATIC_CHAIN (decl));
|
||||
|
||||
set_hash (hstate.end ());
|
||||
}
|
||||
@@ -655,7 +656,10 @@ sem_function::equals_wpa (sem_item *item,
|
||||
}
|
||||
|
||||
if (list1 || list2)
|
||||
return return_false_with_msg ("Mismatched number of parameters");
|
||||
return return_false_with_msg ("mismatched number of parameters");
|
||||
|
||||
if (DECL_STATIC_CHAIN (decl) != DECL_STATIC_CHAIN (item->decl))
|
||||
return return_false_with_msg ("static chain mismatch");
|
||||
|
||||
if (node->num_references () != item->node->num_references ())
|
||||
return return_false_with_msg ("different number of references");
|
||||
@@ -876,7 +880,10 @@ sem_function::equals_private (sem_item *item)
|
||||
return return_false ();
|
||||
}
|
||||
if (arg1 || arg2)
|
||||
return return_false_with_msg ("Mismatched number of arguments");
|
||||
return return_false_with_msg ("mismatched number of arguments");
|
||||
|
||||
if (DECL_STATIC_CHAIN (decl) != DECL_STATIC_CHAIN (m_compared_func->decl))
|
||||
return return_false_with_msg ("static chain mismatch");
|
||||
|
||||
if (!dyn_cast <cgraph_node *> (node)->has_gimple_body_p ())
|
||||
return true;
|
||||
|
||||
18
gcc/testsuite/gnat.dg/lto27.adb
Normal file
18
gcc/testsuite/gnat.dg/lto27.adb
Normal file
@@ -0,0 +1,18 @@
|
||||
-- { dg-do link }
|
||||
-- { dg-options "-O2 -gnatp -flto" { target lto } }
|
||||
|
||||
with Ada.Containers.Hashed_Maps;
|
||||
with Ada.Strings.Hash;
|
||||
|
||||
procedure Lto27 is
|
||||
subtype Node_Name is String (1 .. 4);
|
||||
|
||||
package Node_Maps is new Ada.Containers.Hashed_Maps
|
||||
(Key_Type => Node_Name,
|
||||
Element_Type => Integer,
|
||||
Hash => Ada.Strings.Hash,
|
||||
Equivalent_Keys => "=");
|
||||
|
||||
begin
|
||||
null;
|
||||
end;
|
||||
Reference in New Issue
Block a user