tree-core.h (tree_index): Add TI_POINTER_BOUNDS_TYPE.
* tree-core.h (tree_index): Add TI_POINTER_BOUNDS_TYPE. * tree.h (POINTER_BOUNDS_P): New. (BOUNDED_TYPE_P): New. (BOUNDED_P): New. (pointer_bounds_type_node): New. * tree.c (build_common_tree_nodes): Initialize pointer_bounds_type_node. * gimple.h (gimple_call_get_nobnd_arg_index): New. (gimple_call_num_nobnd_args): New. (gimple_call_nobnd_arg): New. (gimple_return_retbnd): New. (gimple_return_set_retbnd): New * gimple.c (gimple_build_return): Increase number of ops for return statement. (gimple_call_get_nobnd_arg_index): New. * gimple-pretty-print.c (dump_gimple_return): Print second op. From-SVN: r204199
This commit is contained in:
parent
0038da6695
commit
ea9637cdcd
8 changed files with 185 additions and 3 deletions
|
@ -1,3 +1,22 @@
|
|||
2013-10-30 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||
|
||||
* tree-core.h (tree_index): Add TI_POINTER_BOUNDS_TYPE.
|
||||
* tree.h (POINTER_BOUNDS_P): New.
|
||||
(BOUNDED_TYPE_P): New.
|
||||
(BOUNDED_P): New.
|
||||
(pointer_bounds_type_node): New.
|
||||
* tree.c (build_common_tree_nodes): Initialize
|
||||
pointer_bounds_type_node.
|
||||
* gimple.h (gimple_call_get_nobnd_arg_index): New.
|
||||
(gimple_call_num_nobnd_args): New.
|
||||
(gimple_call_nobnd_arg): New.
|
||||
(gimple_return_retbnd): New.
|
||||
(gimple_return_set_retbnd): New
|
||||
* gimple.c (gimple_build_return): Increase number of ops
|
||||
for return statement.
|
||||
(gimple_call_get_nobnd_arg_index): New.
|
||||
* gimple-pretty-print.c (dump_gimple_return): Print second op.
|
||||
|
||||
2013-10-30 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||
|
||||
* ipa.c (cgraph_build_static_cdtor_1): Support contructors
|
||||
|
|
73
gcc/chkp-builtins.def
Normal file
73
gcc/chkp-builtins.def
Normal file
|
@ -0,0 +1,73 @@
|
|||
/* This file contains the definitions and documentation for the
|
||||
builtins used in the GNU compiler.
|
||||
Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
GCC is free software; you can redistribute it and/or modify it under
|
||||
the terms of the GNU General Public License as published by the Free
|
||||
Software Foundation; either version 3, or (at your option) any later
|
||||
version.
|
||||
|
||||
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GCC; see the file COPYING3. If not see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
/* Before including this file, you should define macros:
|
||||
|
||||
DEF_BUILTIN_STUB(ENUM, NAME)
|
||||
DEF_CHKP_BUILTIN(ENUM, NAME, TYPE, ATTRS)
|
||||
|
||||
See builtins.def for details. */
|
||||
|
||||
/* Following builtins are used by compiler for Pointer Bounds Checker
|
||||
instrumentation. Currently these generic builtins are not
|
||||
implemented and target has to provide his own version. See
|
||||
builtin_chkp_function target hook documentation for more details. */
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_BNDMK, "__chkp_bndmk")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_BNDSTX, "__chkp_bndstx")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_BNDCL, "__chkp_bndcl")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_BNDCU, "__chkp_bndcu")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_BNDLDX, "__chkp_bndldx")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_BNDRET, "__chkp_bndret")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_INTERSECT, "__chkp_intersect")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_ARG_BND, "__chkp_arg_bnd")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_SIZEOF, "__chkp_sizeof")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_EXTRACT_LOWER, "__chkp_extract_lower")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_EXTRACT_UPPER, "__chkp_extract_upper")
|
||||
DEF_BUILTIN_STUB (BUILT_IN_CHKP_NARROW, "__chkp_narrow")
|
||||
|
||||
/* Pointer Bounds Checker builtins for users. Only
|
||||
BUILT_IN_CHKP_SET_PTR_BOUNDS may be redefined
|
||||
by target. Other builtins calls are expanded
|
||||
in the Pointer Bounds Checker pass. */
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_SET_PTR_BOUNDS, "__bnd_set_ptr_bounds", BT_FN_PTR_CONST_PTR_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_INIT_PTR_BOUNDS, "__bnd_init_ptr_bounds", BT_FN_PTR_CONST_PTR, ATTR_CONST_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_NULL_PTR_BOUNDS, "__bnd_null_ptr_bounds", BT_FN_PTR_CONST_PTR, ATTR_CONST_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_COPY_PTR_BOUNDS, "__bnd_copy_ptr_bounds", BT_FN_PTR_CONST_PTR_CONST_PTR, ATTR_CONST_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_NARROW_PTR_BOUNDS, "__bnd_narrow_ptr_bounds", BT_FN_PTR_CONST_PTR_CONST_PTR_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_STORE_PTR_BOUNDS, "__bnd_store_ptr_bounds", BT_FN_VOID_PTRPTR_CONST_PTR, ATTR_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_CHECK_PTR_LBOUNDS, "__bnd_chk_ptr_lbounds", BT_FN_VOID_CONST_PTR, ATTR_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_CHECK_PTR_UBOUNDS, "__bnd_chk_ptr_ubounds", BT_FN_VOID_CONST_PTR, ATTR_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_CHECK_PTR_BOUNDS, "__bnd_chk_ptr_bounds", BT_FN_VOID_CONST_PTR_SIZE, ATTR_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_GET_PTR_LBOUND, "__bnd_get_ptr_lbound", BT_FN_CONST_PTR_CONST_PTR, ATTR_CONST_NOTHROW_LEAF_LIST)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_GET_PTR_UBOUND, "__bnd_get_ptr_ubound", BT_FN_CONST_PTR_CONST_PTR, ATTR_CONST_NOTHROW_LEAF_LIST)
|
||||
|
||||
/* Pointer Bounds Checker specific versions of string functions. */
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMCPY_NOBND, "chkp_memcpy_nobnd", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMCPY_NOCHK, "chkp_memcpy_nochk", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMCPY_NOBND_NOCHK, "chkp_memcpy_nobnd_nochk", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMMOVE_NOBND, "chkp_memmove_nobnd", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMMOVE_NOCHK, "chkp_memmove_nochk", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMMOVE_NOBND_NOCHK, "chkp_memmove_nobnd_nochk", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMPCPY_NOBND, "chkp_mempcpy_nobnd", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMPCPY_NOCHK, "chkp_mempcpy_nochk", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMPCPY_NOBND_NOCHK, "chkp_mempcpy_nobnd_nochk", BT_FN_PTR_PTR_CONST_PTR_SIZE, ATTR_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMSET_NOBND, "chkp_memset_nobnd", BT_FN_PTR_PTR_INT_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMSET_NOCHK, "chkp_memset_nochk", BT_FN_PTR_PTR_INT_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
|
||||
DEF_CHKP_BUILTIN (BUILT_IN_CHKP_MEMSET_NOBND_NOCHK, "chkp_memset_nobnd_nochk", BT_FN_PTR_PTR_INT_SIZE, ATTR_RET1_NOTHROW_NONNULL_LEAF)
|
|
@ -539,11 +539,12 @@ dump_gimple_assign (pretty_printer *buffer, gimple gs, int spc, int flags)
|
|||
static void
|
||||
dump_gimple_return (pretty_printer *buffer, gimple gs, int spc, int flags)
|
||||
{
|
||||
tree t;
|
||||
tree t, t2;
|
||||
|
||||
t = gimple_return_retval (gs);
|
||||
t2 = gimple_return_retbnd (gs);
|
||||
if (flags & TDF_RAW)
|
||||
dump_gimple_fmt (buffer, spc, flags, "%G <%T>", gs, t);
|
||||
dump_gimple_fmt (buffer, spc, flags, "%G <%T %T>", gs, t, t2);
|
||||
else
|
||||
{
|
||||
pp_string (buffer, "return");
|
||||
|
@ -552,6 +553,11 @@ dump_gimple_return (pretty_printer *buffer, gimple gs, int spc, int flags)
|
|||
pp_space (buffer);
|
||||
dump_generic_node (buffer, t, spc, flags, false);
|
||||
}
|
||||
if (t2)
|
||||
{
|
||||
pp_string (buffer, ", ");
|
||||
dump_generic_node (buffer, t2, spc, flags, false);
|
||||
}
|
||||
pp_semicolon (buffer);
|
||||
}
|
||||
}
|
||||
|
|
22
gcc/gimple.c
22
gcc/gimple.c
|
@ -174,7 +174,7 @@ gimple_build_with_ops_stat (enum gimple_code code, unsigned subcode,
|
|||
gimple
|
||||
gimple_build_return (tree retval)
|
||||
{
|
||||
gimple s = gimple_build_with_ops (GIMPLE_RETURN, ERROR_MARK, 1);
|
||||
gimple s = gimple_build_with_ops (GIMPLE_RETURN, ERROR_MARK, 2);
|
||||
if (retval)
|
||||
gimple_return_set_retval (s, retval);
|
||||
return s;
|
||||
|
@ -366,6 +366,26 @@ gimple_build_call_from_tree (tree t)
|
|||
}
|
||||
|
||||
|
||||
/* Return index of INDEX's non bound argument of the call. */
|
||||
|
||||
unsigned
|
||||
gimple_call_get_nobnd_arg_index (const_gimple gs, unsigned index)
|
||||
{
|
||||
unsigned num_args = gimple_call_num_args (gs);
|
||||
for (unsigned n = 0; n < num_args; n++)
|
||||
{
|
||||
if (POINTER_BOUNDS_P (gimple_call_arg (gs, n)))
|
||||
continue;
|
||||
else if (index)
|
||||
index--;
|
||||
else
|
||||
return n;
|
||||
}
|
||||
|
||||
gcc_unreachable ();
|
||||
}
|
||||
|
||||
|
||||
/* Extract the operands and code for expression EXPR into *SUBCODE_P,
|
||||
*OP1_P, *OP2_P and *OP3_P respectively. */
|
||||
|
||||
|
|
47
gcc/gimple.h
47
gcc/gimple.h
|
@ -918,6 +918,7 @@ extern tree get_initialized_tmp_var (tree, gimple_seq *, gimple_seq *);
|
|||
extern tree get_formal_tmp_var (tree, gimple_seq *);
|
||||
extern void declare_vars (tree, gimple, bool);
|
||||
extern void annotate_all_with_location (gimple_seq, location_t);
|
||||
extern unsigned gimple_call_get_nobnd_arg_index (const_gimple, unsigned);
|
||||
|
||||
/* Validation of GIMPLE expressions. Note that these predicates only check
|
||||
the basic form of the expression, they don't recurse to make sure that
|
||||
|
@ -2413,6 +2414,32 @@ gimple_call_arg (const_gimple gs, unsigned index)
|
|||
}
|
||||
|
||||
|
||||
/* Return the number of arguments used by call statement GS
|
||||
ignoring bound ones. */
|
||||
|
||||
static inline unsigned
|
||||
gimple_call_num_nobnd_args (const_gimple gs)
|
||||
{
|
||||
unsigned num_args = gimple_call_num_args (gs);
|
||||
unsigned res = num_args;
|
||||
for (unsigned n = 0; n < num_args; n++)
|
||||
if (POINTER_BOUNDS_P (gimple_call_arg (gs, n)))
|
||||
res--;
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
/* Return INDEX's call argument ignoring bound ones. */
|
||||
static inline tree
|
||||
gimple_call_nobnd_arg (const_gimple gs, unsigned index)
|
||||
{
|
||||
/* No bound args may exist if pointers checker is off. */
|
||||
if (!flag_check_pointer_bounds)
|
||||
return gimple_call_arg (gs, index);
|
||||
return gimple_call_arg (gs, gimple_call_get_nobnd_arg_index (gs, index));
|
||||
}
|
||||
|
||||
|
||||
/* Return a pointer to the argument at position INDEX for call
|
||||
statement GS. */
|
||||
|
||||
|
@ -5219,6 +5246,26 @@ gimple_return_set_retval (gimple gs, tree retval)
|
|||
}
|
||||
|
||||
|
||||
/* Return the return bounds for GIMPLE_RETURN GS. */
|
||||
|
||||
static inline tree
|
||||
gimple_return_retbnd (const_gimple gs)
|
||||
{
|
||||
GIMPLE_CHECK (gs, GIMPLE_RETURN);
|
||||
return gimple_op (gs, 1);
|
||||
}
|
||||
|
||||
|
||||
/* Set RETVAL to be the return bounds for GIMPLE_RETURN GS. */
|
||||
|
||||
static inline void
|
||||
gimple_return_set_retbnd (gimple gs, tree retval)
|
||||
{
|
||||
GIMPLE_CHECK (gs, GIMPLE_RETURN);
|
||||
gimple_set_op (gs, 1, retval);
|
||||
}
|
||||
|
||||
|
||||
/* Returns true when the gimple statement STMT is any of the OpenMP types. */
|
||||
|
||||
#define CASE_GIMPLE_OMP \
|
||||
|
|
|
@ -448,6 +448,8 @@ enum tree_index {
|
|||
TI_FILEPTR_TYPE,
|
||||
TI_POINTER_SIZED_TYPE,
|
||||
|
||||
TI_POINTER_BOUNDS_TYPE,
|
||||
|
||||
TI_DFLOAT32_TYPE,
|
||||
TI_DFLOAT64_TYPE,
|
||||
TI_DFLOAT128_TYPE,
|
||||
|
|
|
@ -9765,6 +9765,8 @@ build_common_tree_nodes (bool signed_char, bool short_double)
|
|||
void_type_node = make_node (VOID_TYPE);
|
||||
layout_type (void_type_node);
|
||||
|
||||
pointer_bounds_type_node = targetm.chkp_bound_type ();
|
||||
|
||||
/* We are not going to have real types in C with less than byte alignment,
|
||||
so we might as well not have any types that claim to have it. */
|
||||
TYPE_ALIGN (void_type_node) = BITS_PER_UNIT;
|
||||
|
|
13
gcc/tree.h
13
gcc/tree.h
|
@ -546,6 +546,17 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int,
|
|||
#define POINTER_BOUNDS_TYPE_P(NODE) \
|
||||
(TREE_CODE (NODE) == POINTER_BOUNDS_TYPE)
|
||||
|
||||
/* Nonzero if this node has a pointer bounds type. */
|
||||
#define POINTER_BOUNDS_P(NODE) \
|
||||
(POINTER_BOUNDS_TYPE_P (TREE_TYPE (NODE)))
|
||||
|
||||
/* Nonzero if this type supposes bounds existence. */
|
||||
#define BOUNDED_TYPE_P(type) (POINTER_TYPE_P (type))
|
||||
|
||||
/* Nonzero for objects with bounded type. */
|
||||
#define BOUNDED_P(node) \
|
||||
BOUNDED_TYPE_P (TREE_TYPE (node))
|
||||
|
||||
/* Nonzero if this type is the (possibly qualified) void type. */
|
||||
#define VOID_TYPE_P(NODE) (TREE_CODE (NODE) == VOID_TYPE)
|
||||
|
||||
|
@ -3200,6 +3211,8 @@ tree_operand_check_code (const_tree __t, enum tree_code __code, int __i,
|
|||
#define complex_double_type_node global_trees[TI_COMPLEX_DOUBLE_TYPE]
|
||||
#define complex_long_double_type_node global_trees[TI_COMPLEX_LONG_DOUBLE_TYPE]
|
||||
|
||||
#define pointer_bounds_type_node global_trees[TI_POINTER_BOUNDS_TYPE]
|
||||
|
||||
#define void_type_node global_trees[TI_VOID_TYPE]
|
||||
/* The C type `void *'. */
|
||||
#define ptr_type_node global_trees[TI_PTR_TYPE]
|
||||
|
|
Loading…
Add table
Reference in a new issue