Commit 07d72e1d by Jakub Jelinek Committed by Jakub Jelinek

ubsan.h (ubsan_create_data): Change second argument's type to const location_t *.

	* ubsan.h (ubsan_create_data): Change second argument's type
	to const location_t *.
	* ubsan.c (ubsan_source_location): If xloc.file is NULL, set it to
	_("<unknown>").
	(ubsan_create_data): Change second argument to const location_t *PLOC.
	Create Loc field whenever PLOC is non-NULL.
	(ubsan_instrument_unreachable, ubsan_expand_null_ifn,
	ubsan_build_overflow_builtin, instrument_bool_enum_load): Adjust
	callers.
c-family/
	* c-ubsan.c (ubsan_instrument_division, ubsan_instrument_shift,
	ubsan_instrument_vla, ubsan_instrument_return): Adjust
	ubsan_create_data callers.

From-SVN: r208849
parent ed0ca1e1
2014-03-26 Jakub Jelinek <jakub@redhat.com> 2014-03-26 Jakub Jelinek <jakub@redhat.com>
* ubsan.h (ubsan_create_data): Change second argument's type
to const location_t *.
* ubsan.c (ubsan_source_location): If xloc.file is NULL, set it to
_("<unknown>").
(ubsan_create_data): Change second argument to const location_t *PLOC.
Create Loc field whenever PLOC is non-NULL.
(ubsan_instrument_unreachable, ubsan_expand_null_ifn,
ubsan_build_overflow_builtin, instrument_bool_enum_load): Adjust
callers.
PR other/59545 PR other/59545
* real.c (real_to_integer2): Change type of low to UHWI. * real.c (real_to_integer2): Change type of low to UHWI.
......
2014-03-26 Jakub Jelinek <jakub@redhat.com>
* c-ubsan.c (ubsan_instrument_division, ubsan_instrument_shift,
ubsan_instrument_vla, ubsan_instrument_return): Adjust
ubsan_create_data callers.
2014-03-22 Jakub Jelinek <jakub@redhat.com> 2014-03-22 Jakub Jelinek <jakub@redhat.com>
PR debug/60603 PR debug/60603
......
...@@ -73,7 +73,7 @@ ubsan_instrument_division (location_t loc, tree op0, tree op1) ...@@ -73,7 +73,7 @@ ubsan_instrument_division (location_t loc, tree op0, tree op1)
make sure it gets evaluated before the condition. */ make sure it gets evaluated before the condition. */
t = fold_build2 (COMPOUND_EXPR, TREE_TYPE (t), op0, t); t = fold_build2 (COMPOUND_EXPR, TREE_TYPE (t), op0, t);
tree data = ubsan_create_data ("__ubsan_overflow_data", tree data = ubsan_create_data ("__ubsan_overflow_data",
loc, NULL, &loc, NULL,
ubsan_type_descriptor (type, false), ubsan_type_descriptor (type, false),
NULL_TREE); NULL_TREE);
data = build_fold_addr_expr_loc (loc, data); data = build_fold_addr_expr_loc (loc, data);
...@@ -142,7 +142,7 @@ ubsan_instrument_shift (location_t loc, enum tree_code code, ...@@ -142,7 +142,7 @@ ubsan_instrument_shift (location_t loc, enum tree_code code,
make sure it gets evaluated before the condition. */ make sure it gets evaluated before the condition. */
t = fold_build2 (COMPOUND_EXPR, TREE_TYPE (t), op0, t); t = fold_build2 (COMPOUND_EXPR, TREE_TYPE (t), op0, t);
tree data = ubsan_create_data ("__ubsan_shift_data", tree data = ubsan_create_data ("__ubsan_shift_data",
loc, NULL, &loc, NULL,
ubsan_type_descriptor (type0, false), ubsan_type_descriptor (type0, false),
ubsan_type_descriptor (type1, false), ubsan_type_descriptor (type1, false),
NULL_TREE); NULL_TREE);
...@@ -169,7 +169,7 @@ ubsan_instrument_vla (location_t loc, tree size) ...@@ -169,7 +169,7 @@ ubsan_instrument_vla (location_t loc, tree size)
t = fold_build2 (LE_EXPR, boolean_type_node, size, build_int_cst (type, 0)); t = fold_build2 (LE_EXPR, boolean_type_node, size, build_int_cst (type, 0));
tree data = ubsan_create_data ("__ubsan_vla_data", tree data = ubsan_create_data ("__ubsan_vla_data",
loc, NULL, &loc, NULL,
ubsan_type_descriptor (type, false), ubsan_type_descriptor (type, false),
NULL_TREE); NULL_TREE);
data = build_fold_addr_expr_loc (loc, data); data = build_fold_addr_expr_loc (loc, data);
...@@ -185,7 +185,7 @@ ubsan_instrument_vla (location_t loc, tree size) ...@@ -185,7 +185,7 @@ ubsan_instrument_vla (location_t loc, tree size)
tree tree
ubsan_instrument_return (location_t loc) ubsan_instrument_return (location_t loc)
{ {
tree data = ubsan_create_data ("__ubsan_missing_return_data", loc, tree data = ubsan_create_data ("__ubsan_missing_return_data", &loc,
NULL, NULL_TREE); NULL, NULL_TREE);
tree t = builtin_decl_explicit (BUILT_IN_UBSAN_HANDLE_MISSING_RETURN); tree t = builtin_decl_explicit (BUILT_IN_UBSAN_HANDLE_MISSING_RETURN);
return build_call_expr_loc (loc, t, 1, build_fold_addr_expr_loc (loc, data)); return build_call_expr_loc (loc, t, 1, build_fold_addr_expr_loc (loc, data));
......
...@@ -46,6 +46,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -46,6 +46,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-ssanames.h" #include "tree-ssanames.h"
#include "asan.h" #include "asan.h"
#include "gimplify-me.h" #include "gimplify-me.h"
#include "intl.h"
/* Map from a tree to a VAR_DECL tree. */ /* Map from a tree to a VAR_DECL tree. */
...@@ -238,6 +239,8 @@ ubsan_source_location (location_t loc) ...@@ -238,6 +239,8 @@ ubsan_source_location (location_t loc)
tree type = ubsan_source_location_type (); tree type = ubsan_source_location_type ();
xloc = expand_location (loc); xloc = expand_location (loc);
if (xloc.file == NULL)
xloc.file = "<unknown>";
/* Fill in the values from LOC. */ /* Fill in the values from LOC. */
size_t len = strlen (xloc.file); size_t len = strlen (xloc.file);
...@@ -404,7 +407,7 @@ ubsan_type_descriptor (tree type, bool want_pointer_type_p) ...@@ -404,7 +407,7 @@ ubsan_type_descriptor (tree type, bool want_pointer_type_p)
pointer checking. */ pointer checking. */
tree tree
ubsan_create_data (const char *name, location_t loc, ubsan_create_data (const char *name, const location_t *ploc,
const struct ubsan_mismatch_data *mismatch, ...) const struct ubsan_mismatch_data *mismatch, ...)
{ {
va_list args; va_list args;
...@@ -412,17 +415,18 @@ ubsan_create_data (const char *name, location_t loc, ...@@ -412,17 +415,18 @@ ubsan_create_data (const char *name, location_t loc,
tree fields[5]; tree fields[5];
vec<tree, va_gc> *saved_args = NULL; vec<tree, va_gc> *saved_args = NULL;
size_t i = 0; size_t i = 0;
location_t loc = UNKNOWN_LOCATION;
/* Firstly, create a pointer to type descriptor type. */ /* Firstly, create a pointer to type descriptor type. */
tree td_type = ubsan_type_descriptor_type (); tree td_type = ubsan_type_descriptor_type ();
TYPE_READONLY (td_type) = 1; TYPE_READONLY (td_type) = 1;
td_type = build_pointer_type (td_type); td_type = build_pointer_type (td_type);
loc = LOCATION_LOCUS (loc);
/* Create the structure type. */ /* Create the structure type. */
ret = make_node (RECORD_TYPE); ret = make_node (RECORD_TYPE);
if (loc != UNKNOWN_LOCATION) if (ploc != NULL)
{ {
loc = LOCATION_LOCUS (*ploc);
fields[i] = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, fields[i] = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE,
ubsan_source_location_type ()); ubsan_source_location_type ());
DECL_CONTEXT (fields[i]) = ret; DECL_CONTEXT (fields[i]) = ret;
...@@ -481,7 +485,7 @@ ubsan_create_data (const char *name, location_t loc, ...@@ -481,7 +485,7 @@ ubsan_create_data (const char *name, location_t loc,
tree ctor = build_constructor (ret, v); tree ctor = build_constructor (ret, v);
/* If desirable, set the __ubsan_source_location element. */ /* If desirable, set the __ubsan_source_location element. */
if (loc != UNKNOWN_LOCATION) if (ploc != NULL)
CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, ubsan_source_location (loc)); CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, ubsan_source_location (loc));
size_t nelts = vec_safe_length (saved_args); size_t nelts = vec_safe_length (saved_args);
...@@ -513,7 +517,7 @@ tree ...@@ -513,7 +517,7 @@ tree
ubsan_instrument_unreachable (location_t loc) ubsan_instrument_unreachable (location_t loc)
{ {
initialize_sanitizer_builtins (); initialize_sanitizer_builtins ();
tree data = ubsan_create_data ("__ubsan_unreachable_data", loc, NULL, tree data = ubsan_create_data ("__ubsan_unreachable_data", &loc, NULL,
NULL_TREE); NULL_TREE);
tree t = builtin_decl_explicit (BUILT_IN_UBSAN_HANDLE_BUILTIN_UNREACHABLE); tree t = builtin_decl_explicit (BUILT_IN_UBSAN_HANDLE_BUILTIN_UNREACHABLE);
return build_call_expr_loc (loc, t, 1, build_fold_addr_expr_loc (loc, data)); return build_call_expr_loc (loc, t, 1, build_fold_addr_expr_loc (loc, data));
...@@ -583,7 +587,7 @@ ubsan_expand_null_ifn (gimple_stmt_iterator gsi) ...@@ -583,7 +587,7 @@ ubsan_expand_null_ifn (gimple_stmt_iterator gsi)
const struct ubsan_mismatch_data m const struct ubsan_mismatch_data m
= { build_zero_cst (pointer_sized_int_node), ckind }; = { build_zero_cst (pointer_sized_int_node), ckind };
tree data = ubsan_create_data ("__ubsan_null_data", tree data = ubsan_create_data ("__ubsan_null_data",
loc, &m, &loc, &m,
ubsan_type_descriptor (TREE_TYPE (ptr), true), ubsan_type_descriptor (TREE_TYPE (ptr), true),
NULL_TREE); NULL_TREE);
data = build_fold_addr_expr_loc (loc, data); data = build_fold_addr_expr_loc (loc, data);
...@@ -658,7 +662,7 @@ tree ...@@ -658,7 +662,7 @@ tree
ubsan_build_overflow_builtin (tree_code code, location_t loc, tree lhstype, ubsan_build_overflow_builtin (tree_code code, location_t loc, tree lhstype,
tree op0, tree op1) tree op0, tree op1)
{ {
tree data = ubsan_create_data ("__ubsan_overflow_data", loc, NULL, tree data = ubsan_create_data ("__ubsan_overflow_data", &loc, NULL,
ubsan_type_descriptor (lhstype, false), ubsan_type_descriptor (lhstype, false),
NULL_TREE); NULL_TREE);
enum built_in_function fn_code; enum built_in_function fn_code;
...@@ -841,7 +845,7 @@ instrument_bool_enum_load (gimple_stmt_iterator *gsi) ...@@ -841,7 +845,7 @@ instrument_bool_enum_load (gimple_stmt_iterator *gsi)
update_stmt (stmt); update_stmt (stmt);
tree data = ubsan_create_data ("__ubsan_invalid_value_data", tree data = ubsan_create_data ("__ubsan_invalid_value_data",
loc, NULL, &loc, NULL,
ubsan_type_descriptor (type, false), ubsan_type_descriptor (type, false),
NULL_TREE); NULL_TREE);
data = build_fold_addr_expr_loc (loc, data); data = build_fold_addr_expr_loc (loc, data);
......
...@@ -38,7 +38,7 @@ struct ubsan_mismatch_data { ...@@ -38,7 +38,7 @@ struct ubsan_mismatch_data {
extern void ubsan_expand_null_ifn (gimple_stmt_iterator); extern void ubsan_expand_null_ifn (gimple_stmt_iterator);
extern tree ubsan_instrument_unreachable (location_t); extern tree ubsan_instrument_unreachable (location_t);
extern tree ubsan_create_data (const char *, location_t, extern tree ubsan_create_data (const char *, const location_t *,
const struct ubsan_mismatch_data *, ...); const struct ubsan_mismatch_data *, ...);
extern tree ubsan_type_descriptor (tree, bool); extern tree ubsan_type_descriptor (tree, bool);
extern tree ubsan_encode_value (tree, bool = false); extern tree ubsan_encode_value (tree, bool = false);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment