c-common.c (handle_bnd_variable_size_attribute): New.
* c-family/c-common.c (handle_bnd_variable_size_attribute): New. (handle_bnd_legacy): New. (c_common_attribute_table): Add bnd_variable_size and bnd_legacy. * doc/extend.texi: Document bnd_variable_size and bnd_legacy attributes. From-SVN: r204197
This commit is contained in:
parent
109719ebd4
commit
2017035a60
|
@ -1,3 +1,11 @@
|
||||||
|
2013-10-30 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||||
|
|
||||||
|
* c-family/c-common.c (handle_bnd_variable_size_attribute): New.
|
||||||
|
(handle_bnd_legacy): New.
|
||||||
|
(c_common_attribute_table): Add bnd_variable_size and bnd_legacy.
|
||||||
|
* doc/extend.texi: Document bnd_variable_size and bnd_legacy
|
||||||
|
attributes.
|
||||||
|
|
||||||
2013-10-29 Ilya Enkovich <ilya.enkovich@intel.com>
|
2013-10-29 Ilya Enkovich <ilya.enkovich@intel.com>
|
||||||
|
|
||||||
* builtin-types.def (BT_FN_VOID_CONST_PTR): New.
|
* builtin-types.def (BT_FN_VOID_CONST_PTR): New.
|
||||||
|
|
|
@ -375,6 +375,8 @@ static tree handle_omp_declare_simd_attribute (tree *, tree, tree, int,
|
||||||
bool *);
|
bool *);
|
||||||
static tree handle_omp_declare_target_attribute (tree *, tree, tree, int,
|
static tree handle_omp_declare_target_attribute (tree *, tree, tree, int,
|
||||||
bool *);
|
bool *);
|
||||||
|
static tree handle_bnd_variable_size_attribute (tree *, tree, tree, int, bool *);
|
||||||
|
static tree handle_bnd_legacy (tree *, tree, tree, int, bool *);
|
||||||
|
|
||||||
static void check_function_nonnull (tree, int, tree *);
|
static void check_function_nonnull (tree, int, tree *);
|
||||||
static void check_nonnull_arg (void *, tree, unsigned HOST_WIDE_INT);
|
static void check_nonnull_arg (void *, tree, unsigned HOST_WIDE_INT);
|
||||||
|
@ -759,6 +761,10 @@ const struct attribute_spec c_common_attribute_table[] =
|
||||||
handle_omp_declare_simd_attribute, false },
|
handle_omp_declare_simd_attribute, false },
|
||||||
{ "omp declare target", 0, 0, true, false, false,
|
{ "omp declare target", 0, 0, true, false, false,
|
||||||
handle_omp_declare_target_attribute, false },
|
handle_omp_declare_target_attribute, false },
|
||||||
|
{ "bnd_variable_size", 0, 0, true, false, false,
|
||||||
|
handle_bnd_variable_size_attribute, false },
|
||||||
|
{ "bnd_legacy", 0, 0, true, false, false,
|
||||||
|
handle_bnd_legacy, false },
|
||||||
{ NULL, 0, 0, false, false, false, NULL, false }
|
{ NULL, 0, 0, false, false, false, NULL, false }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -8018,6 +8024,38 @@ handle_fnspec_attribute (tree *node ATTRIBUTE_UNUSED, tree ARG_UNUSED (name),
|
||||||
return NULL_TREE;
|
return NULL_TREE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Handle a "bnd_variable_size" attribute; arguments as in
|
||||||
|
struct attribute_spec.handler. */
|
||||||
|
|
||||||
|
static tree
|
||||||
|
handle_bnd_variable_size_attribute (tree *node, tree name, tree ARG_UNUSED (args),
|
||||||
|
int ARG_UNUSED (flags), bool *no_add_attrs)
|
||||||
|
{
|
||||||
|
if (TREE_CODE (*node) != FIELD_DECL)
|
||||||
|
{
|
||||||
|
warning (OPT_Wattributes, "%qE attribute ignored", name);
|
||||||
|
*no_add_attrs = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL_TREE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle a "bnd_legacy" attribute; arguments as in
|
||||||
|
struct attribute_spec.handler. */
|
||||||
|
|
||||||
|
static tree
|
||||||
|
handle_bnd_legacy (tree *node, tree name, tree ARG_UNUSED (args),
|
||||||
|
int ARG_UNUSED (flags), bool *no_add_attrs)
|
||||||
|
{
|
||||||
|
if (TREE_CODE (*node) != FUNCTION_DECL)
|
||||||
|
{
|
||||||
|
warning (OPT_Wattributes, "%qE attribute ignored", name);
|
||||||
|
*no_add_attrs = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL_TREE;
|
||||||
|
}
|
||||||
|
|
||||||
/* Handle a "warn_unused" attribute; arguments as in
|
/* Handle a "warn_unused" attribute; arguments as in
|
||||||
struct attribute_spec.handler. */
|
struct attribute_spec.handler. */
|
||||||
|
|
||||||
|
|
|
@ -2138,7 +2138,7 @@ attributes are currently defined for functions on all targets:
|
||||||
@code{returns_nonnull}, @code{gnu_inline},
|
@code{returns_nonnull}, @code{gnu_inline},
|
||||||
@code{externally_visible}, @code{hot}, @code{cold}, @code{artificial},
|
@code{externally_visible}, @code{hot}, @code{cold}, @code{artificial},
|
||||||
@code{no_sanitize_address}, @code{no_address_safety_analysis},
|
@code{no_sanitize_address}, @code{no_address_safety_analysis},
|
||||||
@code{no_sanitize_undefined},
|
@code{no_sanitize_undefined}, @code{bnd_legacy},
|
||||||
@code{error} and @code{warning}.
|
@code{error} and @code{warning}.
|
||||||
Several other attributes are defined for functions on particular
|
Several other attributes are defined for functions on particular
|
||||||
target systems. Other attributes, including @code{section} are
|
target systems. Other attributes, including @code{section} are
|
||||||
|
@ -3549,6 +3549,12 @@ The @code{no_sanitize_undefined} attribute on functions is used
|
||||||
to inform the compiler that it should not check for undefined behavior
|
to inform the compiler that it should not check for undefined behavior
|
||||||
in the function when compiling with the @option{-fsanitize=undefined} option.
|
in the function when compiling with the @option{-fsanitize=undefined} option.
|
||||||
|
|
||||||
|
@item bnd_legacy
|
||||||
|
@cindex @code{bnd_legacy} function attribute
|
||||||
|
The @code{bnd_legacy} attribute on functions is used to inform
|
||||||
|
compiler that function should not be instrumented when compiled
|
||||||
|
with @option{-fcheck-pointers} option.
|
||||||
|
|
||||||
@item regparm (@var{number})
|
@item regparm (@var{number})
|
||||||
@cindex @code{regparm} attribute
|
@cindex @code{regparm} attribute
|
||||||
@cindex functions that are passed arguments in registers on the 386
|
@cindex functions that are passed arguments in registers on the 386
|
||||||
|
@ -5321,12 +5327,12 @@ placed in either the @code{.bss_below100} section or the
|
||||||
The keyword @code{__attribute__} allows you to specify special
|
The keyword @code{__attribute__} allows you to specify special
|
||||||
attributes of @code{struct} and @code{union} types when you define
|
attributes of @code{struct} and @code{union} types when you define
|
||||||
such types. This keyword is followed by an attribute specification
|
such types. This keyword is followed by an attribute specification
|
||||||
inside double parentheses. Seven attributes are currently defined for
|
inside double parentheses. Eight attributes are currently defined for
|
||||||
types: @code{aligned}, @code{packed}, @code{transparent_union},
|
types: @code{aligned}, @code{packed}, @code{transparent_union},
|
||||||
@code{unused}, @code{deprecated}, @code{visibility}, and
|
@code{unused}, @code{deprecated}, @code{visibility}, @code{may_alias}
|
||||||
@code{may_alias}. Other attributes are defined for functions
|
and @code{bnd_variable_size}. Other attributes are defined for
|
||||||
(@pxref{Function Attributes}) and for variables (@pxref{Variable
|
functions (@pxref{Function Attributes}) and for variables
|
||||||
Attributes}).
|
(@pxref{Variable Attributes}).
|
||||||
|
|
||||||
You may also specify any one of these attributes with @samp{__}
|
You may also specify any one of these attributes with @samp{__}
|
||||||
preceding and following its keyword. This allows you to use these
|
preceding and following its keyword. This allows you to use these
|
||||||
|
@ -5618,6 +5624,35 @@ and caught in another, the class must have default visibility.
|
||||||
Otherwise the two shared objects are unable to use the same
|
Otherwise the two shared objects are unable to use the same
|
||||||
typeinfo node and exception handling will break.
|
typeinfo node and exception handling will break.
|
||||||
|
|
||||||
|
@item bnd_variable_size
|
||||||
|
When applied to a structure field, this attribute tells Pointer
|
||||||
|
Bounds Checker that the size of this field should not be computed
|
||||||
|
using static type information. It may be used to mark variable
|
||||||
|
sized static array fields placed at the end of a structure.
|
||||||
|
|
||||||
|
@smallexample
|
||||||
|
struct S
|
||||||
|
@{
|
||||||
|
int size;
|
||||||
|
char data[1];
|
||||||
|
@}
|
||||||
|
S *p = (S *)malloc (sizeof(S) + 100);
|
||||||
|
p->data[10] = 0; //Bounds violation
|
||||||
|
@end smallexample
|
||||||
|
|
||||||
|
By using an attribute for a field we may avoid bound violation
|
||||||
|
we most probably do not want to see:
|
||||||
|
|
||||||
|
@smallexample
|
||||||
|
struct S
|
||||||
|
@{
|
||||||
|
int size;
|
||||||
|
char data[1] __attribute__((bnd_variable_size));
|
||||||
|
@}
|
||||||
|
S *p = (S *)malloc (sizeof(S) + 100);
|
||||||
|
p->data[10] = 0; //OK
|
||||||
|
@end smallexample
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
To specify multiple attributes, separate them by commas within the
|
To specify multiple attributes, separate them by commas within the
|
||||||
|
|
Loading…
Reference in New Issue