@@ -565,25 +565,10 @@ chkp_maybe_create_clone (tree fndecl)
if (gimple_has_body_p (fndecl))
{
- /* If function will not be instrumented, then it's instrumented
- version is a thunk for the original. */
- if (!chkp_instrumentable_p (fndecl))
- {
- clone->remove_callees ();
- clone->remove_all_references ();
- clone->thunk.thunk_p = true;
- clone->thunk.add_pointer_bounds_args = true;
- clone->create_edge (node, NULL, 0, CGRAPH_FREQ_BASE);
- /* Thunk shouldn't be a cdtor. */
- DECL_STATIC_CONSTRUCTOR (clone->decl) = 0;
- DECL_STATIC_DESTRUCTOR (clone->decl) = 0;
- }
- else
- {
- tree_function_versioning (fndecl, new_decl, NULL, false,
- NULL, false, NULL, NULL);
- clone->lowered = true;
- }
+ gcc_assert (chkp_instrumentable_p (fndecl));
+ tree_function_versioning (fndecl, new_decl, NULL, false,
+ NULL, false, NULL, NULL);
+ clone->lowered = true;
}
/* New params are inserted after versioning because it
new file mode 100644
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-fcheck-pointer-bounds -mmpx" } */
+
+void (*b) ();
+
+void fn1 (const int *p1)
+{
+ static void *a = &&conv_1234_123C;
+ conv_1234_123C:
+ ;
+}
+
+void fn2 ()
+{
+ b = fn1;
+}
@@ -4090,7 +4090,7 @@ chkp_replace_function_pointer (tree *op, int *walk_subtrees,
void *data ATTRIBUTE_UNUSED)
{
if (TREE_CODE (*op) == FUNCTION_DECL
- && !lookup_attribute ("bnd_legacy", DECL_ATTRIBUTES (*op))
+ && chkp_instrumentable_p (*op)
&& (DECL_BUILT_IN_CLASS (*op) == NOT_BUILT_IN
/* For builtins we replace pointers only for selected
function and functions having definitions. */