@@ -622,7 +622,7 @@ chkp_versioning (void)
function. */
static unsigned int
-chkp_produce_thunks (void)
+chkp_produce_thunks (bool early)
{
struct cgraph_node *node;
@@ -631,7 +631,9 @@ chkp_produce_thunks (void)
if (!node->instrumentation_clone
&& node->instrumented_version
&& gimple_has_body_p (node->decl)
- && gimple_has_body_p (node->instrumented_version->decl))
+ && gimple_has_body_p (node->instrumented_version->decl)
+ && (!lookup_attribute ("always_inline", DECL_ATTRIBUTES (node->decl))
+ || !early))
{
node->release_body ();
node->remove_callees ();
@@ -649,12 +651,15 @@ chkp_produce_thunks (void)
/* Mark instrumentation clones created for aliases and thunks
as insttrumented so they could be removed as unreachable
now. */
- FOR_EACH_DEFINED_FUNCTION (node)
+ if (!early)
{
- if (node->instrumentation_clone
- && (node->alias || node->thunk.thunk_p)
- && !chkp_function_instrumented_p (node->decl))
- chkp_function_mark_instrumented (node->decl);
+ FOR_EACH_DEFINED_FUNCTION (node)
+ {
+ if (node->instrumentation_clone
+ && (node->alias || node->thunk.thunk_p)
+ && !chkp_function_instrumented_p (node->decl))
+ chkp_function_mark_instrumented (node->decl);
+ }
}
return TODO_remove_functions;
@@ -673,6 +678,19 @@ const pass_data pass_data_ipa_chkp_versioning =
0 /* todo_flags_finish */
};
+const pass_data pass_data_ipa_chkp_early_produce_thunks =
+{
+ SIMPLE_IPA_PASS, /* type */
+ "chkp_ecleanup", /* name */
+ OPTGROUP_NONE, /* optinfo_flags */
+ TV_NONE, /* tv_id */
+ 0, /* properties_required */
+ 0, /* properties_provided */
+ 0, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ 0 /* todo_flags_finish */
+};
+
const pass_data pass_data_ipa_chkp_produce_thunks =
{
SIMPLE_IPA_PASS, /* type */
@@ -711,6 +729,31 @@ public:
}; // class pass_ipa_chkp_versioning
+class pass_ipa_chkp_early_produce_thunks : public simple_ipa_opt_pass
+{
+public:
+ pass_ipa_chkp_early_produce_thunks (gcc::context *ctxt)
+ : simple_ipa_opt_pass (pass_data_ipa_chkp_early_produce_thunks, ctxt)
+ {}
+
+ /* opt_pass methods: */
+ virtual opt_pass * clone ()
+ {
+ return new pass_ipa_chkp_early_produce_thunks (m_ctxt);
+ }
+
+ virtual bool gate (function *)
+ {
+ return flag_check_pointer_bounds;
+ }
+
+ virtual unsigned int execute (function *)
+ {
+ return chkp_produce_thunks (true);
+ }
+
+}; // class pass_chkp_produce_thunks
+
class pass_ipa_chkp_produce_thunks : public simple_ipa_opt_pass
{
public:
@@ -731,7 +774,7 @@ public:
virtual unsigned int execute (function *)
{
- return chkp_produce_thunks ();
+ return chkp_produce_thunks (false);
}
}; // class pass_chkp_produce_thunks
@@ -743,6 +786,12 @@ make_pass_ipa_chkp_versioning (gcc::context *ctxt)
}
simple_ipa_opt_pass *
+make_pass_ipa_chkp_early_produce_thunks (gcc::context *ctxt)
+{
+ return new pass_ipa_chkp_early_produce_thunks (ctxt);
+}
+
+simple_ipa_opt_pass *
make_pass_ipa_chkp_produce_thunks (gcc::context *ctxt)
{
return new pass_ipa_chkp_produce_thunks (ctxt);
@@ -50,6 +50,7 @@ along with GCC; see the file COPYING3. If not see
NEXT_PASS (pass_ipa_free_lang_data);
NEXT_PASS (pass_ipa_function_and_variable_visibility);
NEXT_PASS (pass_ipa_chkp_versioning);
+ NEXT_PASS (pass_ipa_chkp_early_produce_thunks);
NEXT_PASS (pass_build_ssa_passes);
PUSH_INSERT_PASSES_WITHIN (pass_build_ssa_passes)
NEXT_PASS (pass_fixup_cfg);
@@ -65,7 +66,6 @@ along with GCC; see the file COPYING3. If not see
NEXT_PASS (pass_chkp);
NEXT_PASS (pass_rebuild_cgraph_edges);
POP_INSERT_PASSES ()
- NEXT_PASS (pass_ipa_chkp_produce_thunks);
NEXT_PASS (pass_local_optimization_passes);
PUSH_INSERT_PASSES_WITHIN (pass_local_optimization_passes)
@@ -103,6 +103,7 @@ along with GCC; see the file COPYING3. If not see
NEXT_PASS (pass_rebuild_cgraph_edges);
NEXT_PASS (pass_inline_parameters);
POP_INSERT_PASSES ()
+ NEXT_PASS (pass_ipa_chkp_produce_thunks);
NEXT_PASS (pass_ipa_auto_profile);
NEXT_PASS (pass_ipa_free_inline_summary);
NEXT_PASS (pass_ipa_tree_profile);
new file mode 100644
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target mpx } */
+/* { dg-options "-fcheck-pointer-bounds -mmpx -O2 -Wno-attributes" } */
+
+__attribute__((always_inline)) int f1 (int *p)
+{
+ return *p;
+}
+
+__attribute__((bnd_legacy)) int f2 (int *p)
+{
+ return f1 (p);
+}
@@ -334,6 +334,7 @@ extern void register_pass (opt_pass* pass, pass_positioning_ops pos,
const char* ref_pass_name, int ref_pass_inst_number);
extern simple_ipa_opt_pass *make_pass_ipa_chkp_versioning (gcc::context *ctxt);
+extern simple_ipa_opt_pass *make_pass_ipa_chkp_early_produce_thunks (gcc::context *ctxt);
extern simple_ipa_opt_pass *make_pass_ipa_chkp_produce_thunks (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_chkp (gcc::context *ctxt);
extern gimple_opt_pass *make_pass_chkp_opt (gcc::context *ctxt);