esOn 21 Oct 11:44, Joseph S. Myers wrote:
> On Mon, 21 Oct 2013, Ilya Enkovich wrote:
>
> > +DEFHOOK
> > +(builtin_chkp_function,
> > + "Pointers checker instrumentation pass uses this hook to obtain\n\
> > +target-specific functions which implement specified generic checker\n\
> > +builtins.",
> > + tree, (unsigned fcode),
> > + default_builtin_chkp_function)
>
> I don't think that's enough detail. The audience for this hook
> description is back-end maintainers wanting to implement such hooks for
> their back ends, and the hook description should give sufficient
> information to do so. This description says nothing at all about the
> semantics of the hook argument or return value.
>
> If it seems difficult to describe things sufficiently in the context of
> individual hook descriptions, maybe an overview of the feature and
> implementation approach is needed as a new section in the internals
> manual, with hook descriptions then referring to that section, or going in
> appropriate places within that section (if the section is in tm.texi.in).
>
> > +DEFHOOK
> > +(fn_abi_va_list_bounds_size,
> > + "This hook returns size for va_list object or integer_zero_node if\n\
> > +it does not have any (e.g. is scalar pointer to the stack).",
> > + tree, (tree fndecl),
> > + default_fn_abi_va_list_bounds_size)
>
> @code{va_list}, @code{integer_zero_node}, specify semantics of fndecl
> argument.
>
> > DEFHOOK
> > +(load_bounds_for_arg,
> > + "This hook is used to emit insn to load arg's bounds\n\
> > +in case bounds are not passed on register. Return loaded bounds",
> > + rtx, (rtx, rtx, rtx),
> > + default_load_bounds_for_arg)
>
> You need to name all the arguments and explain their semantics by name in
> the documentation (which should end with ".").
>
> > +DEFHOOK
> > +(store_bounds_for_arg,
> > + "This hook is used to emit insn to store arg's bounds\n\
> > +in case bounds are not passed on register.",
> > + void, (rtx, rtx, rtx, rtx),
> > + default_store_bounds_for_arg)
>
> Likewise.
>
> --
> Joseph S. Myers
> [email protected]
Hello Joseph,
Thanks for your comments! I attach a new patch version with changed hooks
documentation. Hope it is more informative now.
Thanks,
Ilya
--
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 8d220f3..79bd0f9 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -4334,6 +4334,13 @@ This hook returns the va_list type of the calling
convention specified by
The default version of this hook returns @code{va_list_type_node}.
@end deftypefn
+@deftypefn {Target Hook} tree TARGET_FN_ABI_VA_LIST_BOUNDS_SIZE (tree
@var{fndecl})
+This hook returns size for @code{va_list} object in function specified
+by @var{fndecl}. This hook is used by Pointers Checker to build bounds for
+@code{va_list} object. Return @code{integer_zero_node} if no bounds should
+be used (e.g. @code{va_list} is a scalar pointer to the stack).
+@end deftypefn
+
@deftypefn {Target Hook} tree TARGET_CANONICAL_VA_LIST_TYPE (tree @var{type})
This hook returns the va_list type of the calling convention specified by the
type of @var{type}. If @var{type} is not a valid va_list type, it returns
@@ -5151,6 +5158,19 @@ defined, then define this hook to return @code{true} if
Otherwise, you should not define this hook.
@end deftypefn
+@deftypefn {Target Hook} rtx TARGET_LOAD_BOUNDS_FOR_ARG (rtx @var{slot}, rtx
@var{arg}, rtx @var{slot_no})
+This hook is used to emit insn to load bounds of @var{arg} passed
+in @var{slot}. In case @var{slot} is not a memory, @var{slot_no} is RTX
+constant holding number of the special slot we should get bounds from.
+Return loaded bounds.
+@end deftypefn
+
+@deftypefn {Target Hook} void TARGET_STORE_BOUNDS_FOR_ARG (rtx @var{arg}, rtx
@var{slot}, rtx @var{bounds}, rtx @var{slot_no})
+This hook is used to emit insn to store bounds of @var{arg} passed
+in @var{slot}. In case @var{slot} is not a memory, @var{slot_no} is RTX
+constant holding number of the special slot we should store bounds to.
+@end deftypefn
+
@node Trampolines
@section Trampolines for Nested Functions
@cindex trampolines for nested functions
@@ -10907,6 +10927,27 @@ ignored. This function should return the result of
the call to the
built-in function.
@end deftypefn
+@deftypefn {Target Hook} tree TARGET_BUILTIN_CHKP_FUNCTION (unsigned
@var{fcode})
+This hook allows target to redefine built-in functions used by
+Pointers Checker for code instrumentation. Hook should return
+fndecl of function implementing generic builtin whose code is
+passed in @var{fcode}. Currently following built-in functions are
+obtained using this hook:
+@code{BUILT_IN_CHKP_BNDMK}, @code{BUILT_IN_CHKP_BNDSTX},
+@code{BUILT_IN_CHKP_BNDLDX}, @code{BUILT_IN_CHKP_BNDCL},
+@code{BUILT_IN_CHKP_BNDCU}, @code{BUILT_IN_CHKP_BNDRET},
+@code{BUILT_IN_CHKP_INTERSECT}, @code{BUILT_IN_CHKP_SET_PTR_BOUNDS},
+@code{BUILT_IN_CHKP_NARROW}, @code{BUILT_IN_CHKP_ARG_BND},
+@code{BUILT_IN_CHKP_SIZEOF}, @code{BUILT_IN_CHKP_EXTRACT_LOWER},
+@code{BUILT_IN_CHKP_EXTRACT_UPPER}.
+@end deftypefn
+@deftypefn {Target Hook} tree TARGET_CHKP_BOUND_TYPE (void)
+Return type to be used for bounds
+@end deftypefn
+@deftypefn {Target Hook} {enum machine_mode} TARGET_CHKP_BOUND_MODE (void)
+Return mode to be used for bounds.
+@end deftypefn
+
@deftypefn {Target Hook} tree TARGET_RESOLVE_OVERLOADED_BUILTIN (unsigned int
@var{loc}, tree @var{fndecl}, void *@var{arglist})
Select a replacement for a machine specific built-in function that
was set up by @samp{TARGET_INIT_BUILTINS}. This is done
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 863e843a..2828361 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -3694,6 +3694,8 @@ stack.
@hook TARGET_FN_ABI_VA_LIST
+@hook TARGET_FN_ABI_VA_LIST_BOUNDS_SIZE
+
@hook TARGET_CANONICAL_VA_LIST_TYPE
@hook TARGET_GIMPLIFY_VA_ARG_EXPR
@@ -4064,6 +4066,10 @@ These machine description macros help implement varargs:
@hook TARGET_PRETEND_OUTGOING_VARARGS_NAMED
+@hook TARGET_LOAD_BOUNDS_FOR_ARG
+
+@hook TARGET_STORE_BOUNDS_FOR_ARG
+
@node Trampolines
@section Trampolines for Nested Functions
@cindex trampolines for nested functions
@@ -8184,6 +8190,10 @@ to by @var{ce_info}.
@hook TARGET_EXPAND_BUILTIN
+@hook TARGET_BUILTIN_CHKP_FUNCTION
+@hook TARGET_CHKP_BOUND_TYPE
+@hook TARGET_CHKP_BOUND_MODE
+
@hook TARGET_RESOLVE_OVERLOADED_BUILTIN
@hook TARGET_FOLD_BUILTIN
diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h
index 7bd2e99..542c3d7 100644
--- a/gcc/langhooks-def.h
+++ b/gcc/langhooks-def.h
@@ -117,6 +117,7 @@ extern void lhd_omp_firstprivatize_type_sizes (struct
gimplify_omp_ctx *,
#define LANG_HOOKS_BLOCK_MAY_FALLTHRU hook_bool_const_tree_true
#define LANG_HOOKS_EH_USE_CXA_END_CLEANUP false
#define LANG_HOOKS_DEEP_UNSHARING false
+#define LANG_HOOKS_CHKP_SUPPORTED false
/* Attribute hooks. */
#define LANG_HOOKS_ATTRIBUTE_TABLE NULL
@@ -302,7 +303,8 @@ extern void lhd_end_section (void);
LANG_HOOKS_EH_PROTECT_CLEANUP_ACTIONS, \
LANG_HOOKS_BLOCK_MAY_FALLTHRU, \
LANG_HOOKS_EH_USE_CXA_END_CLEANUP, \
- LANG_HOOKS_DEEP_UNSHARING \
+ LANG_HOOKS_DEEP_UNSHARING, \
+ LANG_HOOKS_CHKP_SUPPORTED \
}
#endif /* GCC_LANG_HOOKS_DEF_H */
diff --git a/gcc/langhooks.h b/gcc/langhooks.h
index 80d4ef3..a4a8764 100644
--- a/gcc/langhooks.h
+++ b/gcc/langhooks.h
@@ -469,6 +469,9 @@ struct lang_hooks
gimplification. */
bool deep_unsharing;
+ /* True if this language allows pointers checker instrumentation. */
+ bool chkp_supported;
+
/* Whenever you add entries here, make sure you adjust langhooks-def.h
and langhooks.c accordingly. */
};
diff --git a/gcc/target.def b/gcc/target.def
index 6de513f..20fdb0a 100644
--- a/gcc/target.def
+++ b/gcc/target.def
@@ -2023,6 +2023,35 @@ built-in function.",
(tree exp, rtx target, rtx subtarget, enum machine_mode mode, int ignore),
default_expand_builtin)
+DEFHOOK
+(builtin_chkp_function,
+ "This hook allows target to redefine built-in functions used by\n\
+Pointers Checker for code instrumentation. Hook should return\n\
+fndecl of function implementing generic builtin whose code is\n\
+passed in @var{fcode}. Currently following built-in functions are\n\
+obtained using this hook:\n\
+@code{BUILT_IN_CHKP_BNDMK}, @code{BUILT_IN_CHKP_BNDSTX},\n\
+@code{BUILT_IN_CHKP_BNDLDX}, @code{BUILT_IN_CHKP_BNDCL},\n\
+@code{BUILT_IN_CHKP_BNDCU}, @code{BUILT_IN_CHKP_BNDRET},\n\
+@code{BUILT_IN_CHKP_INTERSECT}, @code{BUILT_IN_CHKP_SET_PTR_BOUNDS},\n\
+@code{BUILT_IN_CHKP_NARROW}, @code{BUILT_IN_CHKP_ARG_BND},\n\
+@code{BUILT_IN_CHKP_SIZEOF}, @code{BUILT_IN_CHKP_EXTRACT_LOWER},\n\
+@code{BUILT_IN_CHKP_EXTRACT_UPPER}.",
+ tree, (unsigned fcode),
+ default_builtin_chkp_function)
+
+DEFHOOK
+(chkp_bound_type,
+ "Return type to be used for bounds",
+ tree, (void),
+ default_chkp_bound_type)
+
+DEFHOOK
+(chkp_bound_mode,
+ "Return mode to be used for bounds.",
+ enum machine_mode, (void),
+ default_chkp_bound_mode)
+
/* Select a replacement for a target-specific builtin. This is done
*before* regular type checking, and so allows the target to
implement a crude form of function overloading. The result is a
@@ -3273,6 +3302,15 @@ The default version of this hook returns
@code{va_list_type_node}.",
tree, (tree fndecl),
std_fn_abi_va_list)
+DEFHOOK
+(fn_abi_va_list_bounds_size,
+ "This hook returns size for @code{va_list} object in function specified\n\
+by @var{fndecl}. This hook is used by Pointers Checker to build bounds for\n\
+@code{va_list} object. Return @code{integer_zero_node} if no bounds should\n\
+be used (e.g. @code{va_list} is a scalar pointer to the stack).",
+ tree, (tree fndecl),
+ default_fn_abi_va_list_bounds_size)
+
/* Get the __builtin_va_list type dependent on input type. */
DEFHOOK
(canonical_va_list_type,
@@ -3704,6 +3742,23 @@ not generate any instructions in this case.",
default_setup_incoming_varargs)
DEFHOOK
+(load_bounds_for_arg,
+ "This hook is used to emit insn to load bounds of @var{arg} passed\n\
+in @var{slot}. In case @var{slot} is not a memory, @var{slot_no} is RTX\n\
+constant holding number of the special slot we should get bounds from.\n\
+Return loaded bounds.",
+ rtx, (rtx slot, rtx arg, rtx slot_no),
+ default_load_bounds_for_arg)
+
+DEFHOOK
+(store_bounds_for_arg,
+ "This hook is used to emit insn to store bounds of @var{arg} passed\n\
+in @var{slot}. In case @var{slot} is not a memory, @var{slot_no} is RTX\n\
+constant holding number of the special slot we should store bounds to.",
+ void, (rtx arg, rtx slot, rtx bounds, rtx slot_no),
+ default_store_bounds_for_arg)
+
+DEFHOOK
(strict_argument_naming,
"Define this hook to return @code{true} if the location where a function\n\
argument is passed depends on whether or not it is a named argument.\n\
diff --git a/gcc/targhooks.c b/gcc/targhooks.c
index ec73a64..b912eb8 100644
--- a/gcc/targhooks.c
+++ b/gcc/targhooks.c
@@ -1556,6 +1556,28 @@ default_member_type_forces_blk (const_tree, enum
machine_mode)
{
return false;
}
+rtx
+default_load_bounds_for_arg (rtx addr ATTRIBUTE_UNUSED,
+ rtx ptr ATTRIBUTE_UNUSED,
+ rtx bnd ATTRIBUTE_UNUSED)
+{
+ gcc_unreachable ();
+}
+
+void
+default_store_bounds_for_arg (rtx val ATTRIBUTE_UNUSED,
+ rtx addr ATTRIBUTE_UNUSED,
+ rtx bounds ATTRIBUTE_UNUSED,
+ rtx to ATTRIBUTE_UNUSED)
+{
+ gcc_unreachable ();
+}
+
+tree
+default_fn_abi_va_list_bounds_size (tree fndecl ATTRIBUTE_UNUSED)
+{
+ return integer_zero_node;
+}
/* Default version of canonicalize_comparison. */
@@ -1564,4 +1586,25 @@ default_canonicalize_comparison (int *, rtx *, rtx *,
bool)
{
}
+tree
+default_chkp_bound_type (void)
+{
+ tree res = make_node (BOUND_TYPE);
+ TYPE_PRECISION (res) = TYPE_PRECISION (size_type_node) * 2;
+ layout_type (res);
+ return res;
+}
+
+enum machine_mode
+default_chkp_bound_mode (void)
+{
+ return VOIDmode;
+}
+
+tree
+default_builtin_chkp_function (unsigned int fcode ATTRIBUTE_UNUSED)
+{
+ return NULL_TREE;
+}
+
#include "gt-targhooks.h"
diff --git a/gcc/targhooks.h b/gcc/targhooks.h
index b3bd155..184b9c3 100644
--- a/gcc/targhooks.h
+++ b/gcc/targhooks.h
@@ -202,3 +202,10 @@ extern void default_asm_output_ident_directive (const
char*);
extern enum machine_mode default_cstore_mode (enum insn_code);
extern bool default_member_type_forces_blk (const_tree, enum machine_mode);
+
+extern rtx default_load_bounds_for_arg (rtx, rtx, rtx);
+extern void default_store_bounds_for_arg (rtx, rtx, rtx, rtx);
+extern tree default_fn_abi_va_list_bounds_size (tree);
+extern tree default_chkp_bound_type (void);
+extern enum machine_mode default_chkp_bound_mode (void);
+extern tree default_builtin_chkp_function (unsigned int);