From: Ilya Enkovich <enkovich.gnu@gmail.com>
To: gcc-patches <gcc-patches@gcc.gnu.org>
Subject: Re: [PATCH, Pointer Bounds Checker 4/x] Built-in functions
Date: Fri, 27 Jun 2014 08:11:00 -0000 [thread overview]
Message-ID: <CAMbmDYYgpmx11UG+OMeqwfKRDNT-M5jinrHwYJV-K5=j+gseQw@mail.gmail.com> (raw)
In-Reply-To: <CAMbmDYbUUNcsaSrPQgy99_DAQa9evUEbK=3HfAcwiSwaq0xpYw@mail.gmail.com>
Ping
2014-05-06 16:11 GMT+04:00 Ilya Enkovich <enkovich.gnu@gmail.com>:
> PING
>
> 2014-04-16 16:19 GMT+04:00 Ilya Enkovich <enkovich.gnu@gmail.com>:
>> Hi,
>>
>> This patch introduces built-in functions used by Pointer Bounds Checker. It is mostly similar to what was reverted from 4.9, I just added types and attributes to builtins. This patch also introduces pointer_bounds_type_node to be used in built-in function type declarations.
>>
>> Bootstrapped and tested on linux-x86_64.
>>
>> OK for trunk?
>>
>> Thanks,
>> Ilya
>> --
>> gcc/
>>
>> 2014-04-16 Ilya Enkovich <ilya.enkovich@intel.com>
>>
>> * tree-core.h (tree_index): Add TI_POINTER_BOUNDS_TYPE.
>> * tree.h (pointer_bounds_type_node): New.
>> * tree.c (build_common_tree_nodes): Initialize
>> pointer_bounds_type_node.
>> * builtin-types.def (BT_BND): New.
>> (BT_FN_PTR_CONST_PTR): New.
>> (BT_FN_CONST_PTR_CONST_PTR): New.
>> (BT_FN_BND_CONST_PTR): New.
>> (BT_FN_CONST_PTR_BND): New.
>> (BT_FN_PTR_CONST_PTR_SIZE): New.
>> (BT_FN_PTR_CONST_PTR_CONST_PTR): New.
>> (BT_FN_VOID_PTRPTR_CONST_PTR): New.
>> (BT_FN_VOID_CONST_PTR_SIZE): New.
>> (BT_FN_VOID_PTR_BND): New.
>> (BT_FN_CONST_PTR_CONST_PTR_CONST_PTR): New.
>> (BT_FN_BND_CONST_PTR_SIZE): New.
>> (BT_FN_PTR_CONST_PTR_CONST_PTR_SIZE): New.
>> (BT_FN_VOID_CONST_PTR_BND_CONST_PTR): New.
>> * chkp-builtins.def: New.
>> * builtins.def: include chkp-builtins.def.
>> (DEF_CHKP_BUILTIN): New.
>> * builtins.c (expand_builtin): Support BUILT_IN_CHKP_INIT_PTR_BOUNDS,
>> BUILT_IN_CHKP_NULL_PTR_BOUNDS, BUILT_IN_CHKP_COPY_PTR_BOUNDS,
>> BUILT_IN_CHKP_CHECK_PTR_LBOUNDS, BUILT_IN_CHKP_CHECK_PTR_UBOUNDS,
>> BUILT_IN_CHKP_CHECK_PTR_BOUNDS, BUILT_IN_CHKP_SET_PTR_BOUNDS,
>> BUILT_IN_CHKP_NARROW_PTR_BOUNDS, BUILT_IN_CHKP_STORE_PTR_BOUNDS,
>> BUILT_IN_CHKP_GET_PTR_LBOUND, BUILT_IN_CHKP_GET_PTR_UBOUND,
>> BUILT_IN_CHKP_BNDMK, BUILT_IN_CHKP_BNDSTX, BUILT_IN_CHKP_BNDCL,
>> BUILT_IN_CHKP_BNDCU, BUILT_IN_CHKP_BNDLDX, BUILT_IN_CHKP_BNDRET,
>> BUILT_IN_CHKP_INTERSECT, BUILT_IN_CHKP_NARROW,
>> BUILT_IN_CHKP_EXTRACT_LOWER, BUILT_IN_CHKP_EXTRACT_UPPER.
>> * c-family/c.opt (fcheck-pointer-bounds): New.
>> * toplev.c (process_options): Check Pointer Bounds Checker is supported.
>> * doc/extend.texi: Document Pointer Bounds Checker built-in functions.
>>
>>
>> diff --git a/gcc/builtin-types.def b/gcc/builtin-types.def
>> index fba9c7d..2e5f361 100644
>> --- a/gcc/builtin-types.def
>> +++ b/gcc/builtin-types.def
>> @@ -133,6 +133,8 @@ DEF_PRIMITIVE_TYPE (BT_I4, builtin_type_for_size (BITS_PER_UNIT*4, 1))
>> DEF_PRIMITIVE_TYPE (BT_I8, builtin_type_for_size (BITS_PER_UNIT*8, 1))
>> DEF_PRIMITIVE_TYPE (BT_I16, builtin_type_for_size (BITS_PER_UNIT*16, 1))
>>
>> +DEF_PRIMITIVE_TYPE (BT_BND, pointer_bounds_type_node)
>> +
>> DEF_POINTER_TYPE (BT_PTR_CONST_STRING, BT_CONST_STRING)
>> DEF_POINTER_TYPE (BT_PTR_LONG, BT_LONG)
>> DEF_POINTER_TYPE (BT_PTR_ULONGLONG, BT_ULONGLONG)
>> @@ -234,6 +236,10 @@ DEF_FUNCTION_TYPE_1 (BT_FN_UINT16_UINT16, BT_UINT16, BT_UINT16)
>> DEF_FUNCTION_TYPE_1 (BT_FN_UINT32_UINT32, BT_UINT32, BT_UINT32)
>> DEF_FUNCTION_TYPE_1 (BT_FN_UINT64_UINT64, BT_UINT64, BT_UINT64)
>> DEF_FUNCTION_TYPE_1 (BT_FN_BOOL_INT, BT_BOOL, BT_INT)
>> +DEF_FUNCTION_TYPE_1 (BT_FN_PTR_CONST_PTR, BT_PTR, BT_CONST_PTR)
>> +DEF_FUNCTION_TYPE_1 (BT_FN_CONST_PTR_CONST_PTR, BT_CONST_PTR, BT_CONST_PTR)
>> +DEF_FUNCTION_TYPE_1 (BT_FN_BND_CONST_PTR, BT_BND, BT_CONST_PTR)
>> +DEF_FUNCTION_TYPE_1 (BT_FN_CONST_PTR_BND, BT_CONST_PTR, BT_BND)
>>
>> DEF_POINTER_TYPE (BT_PTR_FN_VOID_PTR, BT_FN_VOID_PTR)
>>
>> @@ -347,6 +353,13 @@ DEF_FUNCTION_TYPE_2 (BT_FN_BOOL_SIZE_CONST_VPTR, BT_BOOL, BT_SIZE,
>> BT_CONST_VOLATILE_PTR)
>> DEF_FUNCTION_TYPE_2 (BT_FN_BOOL_INT_BOOL, BT_BOOL, BT_INT, BT_BOOL)
>> DEF_FUNCTION_TYPE_2 (BT_FN_VOID_UINT_UINT, BT_VOID, BT_UINT, BT_UINT)
>> +DEF_FUNCTION_TYPE_2 (BT_FN_PTR_CONST_PTR_SIZE, BT_PTR, BT_CONST_PTR, BT_SIZE)
>> +DEF_FUNCTION_TYPE_2 (BT_FN_PTR_CONST_PTR_CONST_PTR, BT_PTR, BT_CONST_PTR, BT_CONST_PTR)
>> +DEF_FUNCTION_TYPE_2 (BT_FN_VOID_PTRPTR_CONST_PTR, BT_VOID, BT_PTR_PTR, BT_CONST_PTR)
>> +DEF_FUNCTION_TYPE_2 (BT_FN_VOID_CONST_PTR_SIZE, BT_VOID, BT_CONST_PTR, BT_SIZE)
>> +DEF_FUNCTION_TYPE_2 (BT_FN_VOID_PTR_BND, BT_VOID, BT_PTR, BT_BND)
>> +DEF_FUNCTION_TYPE_2 (BT_FN_CONST_PTR_CONST_PTR_CONST_PTR, BT_CONST_PTR, BT_CONST_PTR, BT_CONST_PTR)
>> +DEF_FUNCTION_TYPE_2 (BT_FN_BND_CONST_PTR_SIZE, BT_BND, BT_CONST_PTR, BT_SIZE)
>>
>> DEF_POINTER_TYPE (BT_PTR_FN_VOID_PTR_PTR, BT_FN_VOID_PTR_PTR)
>>
>> @@ -430,6 +443,8 @@ DEF_FUNCTION_TYPE_3 (BT_FN_VOID_VPTR_I4_INT, BT_VOID, BT_VOLATILE_PTR, BT_I4, BT
>> DEF_FUNCTION_TYPE_3 (BT_FN_VOID_VPTR_I8_INT, BT_VOID, BT_VOLATILE_PTR, BT_I8, BT_INT)
>> DEF_FUNCTION_TYPE_3 (BT_FN_VOID_VPTR_I16_INT, BT_VOID, BT_VOLATILE_PTR, BT_I16, BT_INT)
>> DEF_FUNCTION_TYPE_3 (BT_FN_INT_PTRPTR_SIZE_SIZE, BT_INT, BT_PTR_PTR, BT_SIZE, BT_SIZE)
>> +DEF_FUNCTION_TYPE_3 (BT_FN_PTR_CONST_PTR_CONST_PTR_SIZE, BT_PTR, BT_CONST_PTR, BT_CONST_PTR, BT_SIZE)
>> +DEF_FUNCTION_TYPE_3 (BT_FN_VOID_CONST_PTR_BND_CONST_PTR, BT_VOID, BT_CONST_PTR, BT_BND, BT_CONST_PTR)
>>
>> DEF_FUNCTION_TYPE_4 (BT_FN_SIZE_CONST_PTR_SIZE_SIZE_FILEPTR,
>> BT_SIZE, BT_CONST_PTR, BT_SIZE, BT_SIZE, BT_FILEPTR)
>> diff --git a/gcc/builtins.c b/gcc/builtins.c
>> index dd57b1a..5ec6cb6 100644
>> --- a/gcc/builtins.c
>> +++ b/gcc/builtins.c
>> @@ -5810,7 +5810,19 @@ expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode,
>> && fcode != BUILT_IN_EXECVE
>> && fcode != BUILT_IN_ALLOCA
>> && fcode != BUILT_IN_ALLOCA_WITH_ALIGN
>> - && fcode != BUILT_IN_FREE)
>> + && fcode != BUILT_IN_FREE
>> + && fcode != BUILT_IN_CHKP_SET_PTR_BOUNDS
>> + && fcode != BUILT_IN_CHKP_INIT_PTR_BOUNDS
>> + && fcode != BUILT_IN_CHKP_NULL_PTR_BOUNDS
>> + && fcode != BUILT_IN_CHKP_COPY_PTR_BOUNDS
>> + && fcode != BUILT_IN_CHKP_NARROW_PTR_BOUNDS
>> + && fcode != BUILT_IN_CHKP_STORE_PTR_BOUNDS
>> + && fcode != BUILT_IN_CHKP_CHECK_PTR_LBOUNDS
>> + && fcode != BUILT_IN_CHKP_CHECK_PTR_UBOUNDS
>> + && fcode != BUILT_IN_CHKP_CHECK_PTR_BOUNDS
>> + && fcode != BUILT_IN_CHKP_GET_PTR_LBOUND
>> + && fcode != BUILT_IN_CHKP_GET_PTR_UBOUND
>> + && fcode != BUILT_IN_CHKP_BNDRET)
>> return expand_call (exp, target, ignore);
>>
>> /* The built-in function expanders test for target == const0_rtx
>> @@ -6848,6 +6860,51 @@ expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode,
>> expand_builtin_cilk_pop_frame (exp);
>> return const0_rtx;
>>
>> + case BUILT_IN_CHKP_INIT_PTR_BOUNDS:
>> + case BUILT_IN_CHKP_NULL_PTR_BOUNDS:
>> + case BUILT_IN_CHKP_COPY_PTR_BOUNDS:
>> + case BUILT_IN_CHKP_CHECK_PTR_LBOUNDS:
>> + case BUILT_IN_CHKP_CHECK_PTR_UBOUNDS:
>> + case BUILT_IN_CHKP_CHECK_PTR_BOUNDS:
>> + case BUILT_IN_CHKP_SET_PTR_BOUNDS:
>> + case BUILT_IN_CHKP_NARROW_PTR_BOUNDS:
>> + case BUILT_IN_CHKP_STORE_PTR_BOUNDS:
>> + case BUILT_IN_CHKP_GET_PTR_LBOUND:
>> + case BUILT_IN_CHKP_GET_PTR_UBOUND:
>> + /* We allow user CHKP builtins if Pointer Bounds
>> + Checker is off. */
>> + if (!flag_check_pointer_bounds)
>> + {
>> + if (fcode == BUILT_IN_CHKP_SET_PTR_BOUNDS
>> + || fcode == BUILT_IN_CHKP_NARROW_PTR_BOUNDS
>> + || fcode == BUILT_IN_CHKP_INIT_PTR_BOUNDS
>> + || fcode == BUILT_IN_CHKP_NULL_PTR_BOUNDS
>> + || fcode == BUILT_IN_CHKP_COPY_PTR_BOUNDS)
>> + return expand_normal (CALL_EXPR_ARG (exp, 0));
>> + else if (fcode == BUILT_IN_CHKP_GET_PTR_LBOUND)
>> + return expand_normal (size_zero_node);
>> + else if (fcode == BUILT_IN_CHKP_GET_PTR_UBOUND)
>> + return expand_normal (size_int (-1));
>> + else
>> + return const0_rtx;
>> + }
>> + /* FALLTHROUGH */
>> +
>> + case BUILT_IN_CHKP_BNDMK:
>> + case BUILT_IN_CHKP_BNDSTX:
>> + case BUILT_IN_CHKP_BNDCL:
>> + case BUILT_IN_CHKP_BNDCU:
>> + case BUILT_IN_CHKP_BNDLDX:
>> + case BUILT_IN_CHKP_BNDRET:
>> + case BUILT_IN_CHKP_INTERSECT:
>> + case BUILT_IN_CHKP_NARROW:
>> + case BUILT_IN_CHKP_EXTRACT_LOWER:
>> + case BUILT_IN_CHKP_EXTRACT_UPPER:
>> + /* Software implementation of Pointer Bounds Checker is NYI.
>> + Target support is required. */
>> + error ("Your target platform does not support -fcheck-pointer-bounds");
>> + break;
>> +
>> default: /* just do library call, if unknown builtin */
>> break;
>> }
>> diff --git a/gcc/builtins.def b/gcc/builtins.def
>> index 5a76ba3..ed2617e 100644
>> --- a/gcc/builtins.def
>> +++ b/gcc/builtins.def
>> @@ -176,6 +176,12 @@ along with GCC; see the file COPYING3. If not see
>> DEF_BUILTIN (ENUM, NAME, BUILT_IN_NORMAL, BT_FN_INT_VAR, BT_LAST, \
>> false, false, false, ATTRS, false, flag_cilkplus)
>>
>> +/* Builtin used by the implementation of Pointer Bounds Checker. */
>> +#undef DEF_CHKP_BUILTIN
>> +#define DEF_CHKP_BUILTIN(ENUM, NAME, TYPE, ATTRS) \
>> + DEF_BUILTIN (ENUM, "__builtin_" NAME, BUILT_IN_NORMAL, TYPE, TYPE, \
>> + true, true, false, ATTRS, true, true)
>> +
>> /* Define an attribute list for math functions that are normally
>> "impure" because some of them may write into global memory for
>> `errno'. If !flag_errno_math they are instead "const". */
>> @@ -870,3 +876,6 @@ DEF_GCC_BUILTIN (BUILT_IN_LINE, "LINE", BT_FN_INT, ATTR_NOTHROW_LEAF_LIST)
>>
>> /* Cilk Plus builtins. */
>> #include "cilkplus.def"
>> +
>> +/* Pointer Bounds Checker builtins. */
>> +#include "chkp-builtins.def"
>> diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt
>> index 390c056..3ec5cda 100644
>> --- a/gcc/c-family/c.opt
>> +++ b/gcc/c-family/c.opt
>> @@ -866,6 +866,11 @@ fcanonical-system-headers
>> C ObjC C++ ObjC++
>> Where shorter, use canonicalized paths to systems headers.
>>
>> +fcheck-pointer-bounds
>> +Common Report Var(flag_check_pointer_bounds)
>> +Add Pointer Bounds Checker instrumentation. fchkp-* flags are used to
>> +control instrumentation. Currently available for C, C++ and ObjC.
>> +
>> fcilkplus
>> C ObjC C++ ObjC++ LTO Report Var(flag_cilkplus) Init(0)
>> Enable Cilk Plus
>> diff --git a/gcc/chkp-builtins.def b/gcc/chkp-builtins.def
>> new file mode 100644
>> index 0000000..cae0332
>> --- /dev/null
>> +++ b/gcc/chkp-builtins.def
>> @@ -0,0 +1,71 @@
>> +/* 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_INTERSECT, "__chkp_intersect")
>> +DEF_BUILTIN_STUB (BUILT_IN_CHKP_SIZEOF, "__chkp_sizeof")
>> +DEF_BUILTIN_STUB (BUILT_IN_CHKP_NARROW, "__chkp_narrow")
>> +DEF_CHKP_BUILTIN (BUILT_IN_CHKP_BNDCL, "__chkp_bndcl", BT_FN_VOID_PTR_BND, ATTR_NOTHROW_LEAF_LIST)
>> +DEF_CHKP_BUILTIN (BUILT_IN_CHKP_BNDCU, "__chkp_bndcu", BT_FN_VOID_PTR_BND, ATTR_NOTHROW_LEAF_LIST)
>> +DEF_CHKP_BUILTIN (BUILT_IN_CHKP_BNDSTX, "__chkp_bndstx", BT_FN_VOID_CONST_PTR_BND_CONST_PTR, ATTR_NOTHROW_LEAF_LIST)
>> +DEF_CHKP_BUILTIN (BUILT_IN_CHKP_BNDLDX, "__chkp_bndldx", BT_FN_CONST_PTR_CONST_PTR_CONST_PTR, ATTR_NOTHROW_LEAF_LIST)
>> +DEF_CHKP_BUILTIN (BUILT_IN_CHKP_BNDRET, "__chkp_bndret", BT_FN_BND_CONST_PTR, ATTR_CONST_NOTHROW_LEAF_LIST)
>> +DEF_CHKP_BUILTIN (BUILT_IN_CHKP_BNDMK, "__chkp_bndmk", BT_FN_BND_CONST_PTR_SIZE, ATTR_CONST_NOTHROW_LEAF_LIST)
>> +DEF_CHKP_BUILTIN (BUILT_IN_CHKP_EXTRACT_LOWER, "__chkp_extract_lower", BT_FN_CONST_PTR_BND, ATTR_CONST_NOTHROW_LEAF_LIST)
>> +DEF_CHKP_BUILTIN (BUILT_IN_CHKP_EXTRACT_UPPER, "__chkp_extract_upper", BT_FN_CONST_PTR_BND, ATTR_CONST_NOTHROW_LEAF_LIST)
>> +
>> +/* Pointer Bounds Checker builtins for users.
>> + All 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)
>> diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
>> index 347a94a..1c74990 100644
>> --- a/gcc/doc/extend.texi
>> +++ b/gcc/doc/extend.texi
>> @@ -82,6 +82,7 @@ extensions, accepted by GCC in C90 mode and in C++.
>> * x86 specific memory model extensions for transactional memory:: x86 memory models.
>> * Object Size Checking:: Built-in functions for limited buffer overflow
>> checking.
>> +* Pointer Bounds Checker builtins:: Built-in functions for Pointer Bounds Checker.
>> * Cilk Plus Builtins:: Built-in functions for the Cilk Plus language extension.
>> * Other Builtins:: Other built-in functions.
>> * Target Builtins:: Built-in functions specific to particular targets.
>> @@ -7945,6 +7946,176 @@ format string @var{fmt}. If the compiler is able to optimize them to
>> @code{fputc} etc.@: functions, it does, otherwise the checking function
>> is called and the @var{flag} argument passed to it.
>>
>> +@node Pointer Bounds Checker builtins
>> +@section Pointer Bounds Checker Built-in Functions
>> +@findex __builtin___bnd_set_ptr_bounds
>> +@findex __builtin___bnd_narrow_ptr_bounds
>> +@findex __builtin___bnd_copy_ptr_bounds
>> +@findex __builtin___bnd_init_ptr_bounds
>> +@findex __builtin___bnd_null_ptr_bounds
>> +@findex __builtin___bnd_store_ptr_bounds
>> +@findex __builtin___bnd_chk_ptr_lbounds
>> +@findex __builtin___bnd_chk_ptr_ubounds
>> +@findex __builtin___bnd_chk_ptr_bounds
>> +@findex __builtin___bnd_get_ptr_lbound
>> +@findex __builtin___bnd_get_ptr_ubound
>> +
>> +GCC provides a set of built-in functions to control Pointer Bounds Checker
>> +instrumentation. Note that all Pointer Bounds Checker builtins are allowed
>> +to use even if you compile with Pointer Bounds Checker off. The builtins
>> +behavior may differ in such case as documented below.
>> +
>> +@deftypefn {Built-in Function} void * __builtin___bnd_set_ptr_bounds (const void * @var{q}, size_t @var{size})
>> +
>> +This built-in function returns a new pointer with the value of @var{q}, and
>> +associate it with the bounds [@var{q}, @var{q}+@var{size}-1]. With Pointer
>> +Bounds Checker off built-in function just returns the first argument.
>> +
>> +@smallexample
>> +extern void *__wrap_malloc (size_t n)
>> +@{
>> + void *p = (void *)__real_malloc (n);
>> + if (!p) return __builtin___bnd_null_ptr_bounds (p);
>> + return __builtin___bnd_set_ptr_bounds (p, n);
>> +@}
>> +@end smallexample
>> +
>> +@end deftypefn
>> +
>> +@deftypefn {Built-in Function} void * __builtin___bnd_narrow_ptr_bounds (const void * @var{p}, const void * @var{q}, size_t @var{size})
>> +
>> +This built-in function returns a new pointer with the value of @var{p}
>> +and associate it with the narrowed bounds formed by the intersection
>> +of bounds associated with @var{q} and the [@var{p}, @var{p} + @var{size} - 1].
>> +With Pointer Bounds Checker off built-in function just returns the first
>> +argument.
>> +
>> +@smallexample
>> +void init_objects (object *objs, size_t size)
>> +@{
>> + size_t i;
>> + /* Initialize objects one-by-one passing pointers with bounds of an object,
>> + not the full array of objects. */
>> + for (i = 0; i < size; i++)
>> + init_object (__builtin___bnd_narrow_ptr_bounds (objs + i, objs, sizeof(object)));
>> +@}
>> +@end smallexample
>> +
>> +@end deftypefn
>> +
>> +@deftypefn {Built-in Function} void * __builtin___bnd_copy_ptr_bounds (const void * @var{q}, const void * @var{r})
>> +
>> +This built-in function returns a new pointer with the value of @var{q},
>> +and associate it with the bounds already associated with pointer @var{r}.
>> +With Pointer Bounds Checker off built-in function just returns the first
>> +argument.
>> +
>> +@smallexample
>> +/* Here is a way to get pointer to object's field but
>> + still with the full object's bounds. */
>> +int *field_ptr = __builtin___bnd_copy_ptr_bounds (&objptr->int_filed, objptr);
>> +@end smallexample
>> +
>> +@end deftypefn
>> +
>> +@deftypefn {Built-in Function} void * __builtin___bnd_init_ptr_bounds (const void * @var{q})
>> +
>> +This built-in function returns a new pointer with the value of @var{q}, and
>> +associate it with INIT (allowing full memory access) bounds. With Pointer
>> +Bounds Checker off built-in function just returns the first argument.
>> +
>> +@end deftypefn
>> +
>> +@deftypefn {Built-in Function} void * __builtin___bnd_null_ptr_bounds (const void * @var{q})
>> +
>> +This built-in function returns a new pointer with the value of @var{q}, and
>> +associate it with NULL (allowing no memory access) bounds. With Pointer
>> +Bounds Checker off built-in function just returns the first argument.
>> +
>> +@end deftypefn
>> +
>> +@deftypefn {Built-in Function} void __builtin___bnd_store_ptr_bounds (const void ** @var{ptr_addr}, const void * @var{ptr_val})
>> +
>> +This built-in function stores the bounds associated with pointer @var{ptr_val}
>> +and location @var{ptr_addr} into Bounds Table. This can be useful to propagate
>> +bounds from legacy code without touching the associated pointer's memory when
>> +pointers were copied as integers. With Pointer Bounds Checker off built-in
>> +function call is ignored.
>> +
>> +@end deftypefn
>> +
>> +@deftypefn {Built-in Function} void __builtin___bnd_chk_ptr_lbounds (const void * @var{q})
>> +
>> +This built-in function checks if the pointer @var{q} is within the lower
>> +bound of its associated bounds. With Pointer Bounds Checker off built-in
>> +function call is ignored.
>> +
>> +@smallexample
>> +extern void *__wrap_memset (void *dst, int c, size_t len)
>> +@{
>> + if (len > 0)
>> + @{
>> + __builtin___bnd_chk_ptr_lbounds (dst);
>> + __builtin___bnd_chk_ptr_ubounds ((char *)dst + len - 1);
>> + __real_memset (dst, c, len);
>> + @}
>> + return dst;
>> +@}
>> +@end smallexample
>> +
>> +@end deftypefn
>> +
>> +@deftypefn {Built-in Function} void __builtin___bnd_chk_ptr_ubounds (const void * @var{q})
>> +
>> +This built-in function checks if the pointer @var{q} is within the upper
>> +bound of its associated bounds. With Pointer Bounds Checker off built-in
>> +function call is ignored.
>> +
>> +@end deftypefn
>> +
>> +@deftypefn {Built-in Function} void __builtin___bnd_chk_ptr_bounds (const void * @var{q}, size_t @var{size})
>> +
>> +This built-in function checks if [@var{q}, @var{q} + @var{size} - 1] is within
>> +the lower and upper bounds associated with @var{q}. With Pointer Bounds Checker
>> +off built-in function call is ignored.
>> +
>> +@smallexample
>> +extern void *__wrap_memcpy (void *dst, const void *src, size_t n)
>> +@{
>> + if (n > 0)
>> + @{
>> + __bnd_chk_ptr_bounds (dst, n);
>> + __bnd_chk_ptr_bounds (src, n);
>> + __real_memcpy (dst, src, n);
>> + @}
>> + return dst;
>> +@}
>> +@end smallexample
>> +
>> +@end deftypefn
>> +
>> +@deftypefn {Built-in Function} const void * __builtin___bnd_get_ptr_lbound (const void * @var{q})
>> +
>> +This built-in function returns the lower bound (which is a pointer) associated
>> +with the pointer @var{q}. This is at least useful for debugging using printf.
>> +With Pointer Bounds Checker off built-in function returns 0.
>> +
>> +@smallexample
>> +void *lb = __builtin___bnd_get_ptr_lbound (q);
>> +void *ub = __builtin___bnd_get_ptr_ubound (q);
>> +printf ("q = %p lb(q) = %p ub(q) = %p", q, lb, ub);
>> +@end smallexample
>> +
>> +@end deftypefn
>> +
>> +@deftypefn {Built-in Function} const void * __builtin___bnd_get_ptr_ubound (const void * @var{q})
>> +
>> +This built-in function returns the upper bound (which is a pointer) associated
>> +with the pointer @var{q}. With Pointer Bounds Checker off built-in function
>> +returns -1.
>> +
>> +@end deftypefn
>> +
>> @node Cilk Plus Builtins
>> @section Cilk Plus C/C++ language extension Built-in Functions.
>>
>> diff --git a/gcc/toplev.c b/gcc/toplev.c
>> index 0f7d452..660a10b 100644
>> --- a/gcc/toplev.c
>> +++ b/gcc/toplev.c
>> @@ -1285,6 +1285,12 @@ process_options (void)
>> "and -ftree-loop-linear)");
>> #endif
>>
>> + if (flag_check_pointer_bounds)
>> + {
>> + if (targetm.chkp_bound_mode () == VOIDmode)
>> + error ("-fcheck-pointer-bounds is not supported for this target");
>> + }
>> +
>> /* One region RA really helps to decrease the code size. */
>> if (flag_ira_region == IRA_REGION_AUTODETECT)
>> flag_ira_region
>> diff --git a/gcc/tree-core.h b/gcc/tree-core.h
>> index 1719c7e..b70c262 100644
>> --- a/gcc/tree-core.h
>> +++ b/gcc/tree-core.h
>> @@ -457,6 +457,8 @@ enum tree_index {
>> TI_FILEPTR_TYPE,
>> TI_POINTER_SIZED_TYPE,
>>
>> + TI_POINTER_BOUNDS_TYPE,
>> +
>> TI_DFLOAT32_TYPE,
>> TI_DFLOAT64_TYPE,
>> TI_DFLOAT128_TYPE,
>> diff --git a/gcc/tree.c b/gcc/tree.c
>> index 6a2ca1c..f9aa80f 100644
>> --- a/gcc/tree.c
>> +++ b/gcc/tree.c
>> @@ -9694,6 +9694,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;
>> diff --git a/gcc/tree.h b/gcc/tree.h
>> index f347b9b..801d564 100644
>> --- a/gcc/tree.h
>> +++ b/gcc/tree.h
>> @@ -3242,6 +3242,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]
next prev parent reply other threads:[~2014-06-27 8:11 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-04-16 12:22 Ilya Enkovich
2014-05-06 12:11 ` Ilya Enkovich
2014-06-27 8:11 ` Ilya Enkovich [this message]
2014-07-18 6:17 ` Jeff Law
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAMbmDYYgpmx11UG+OMeqwfKRDNT-M5jinrHwYJV-K5=j+gseQw@mail.gmail.com' \
--to=enkovich.gnu@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).