Commit 4301ae22 by Jakub Jelinek Committed by Jakub Jelinek

re PR sanitizer/81111 (Cannot build libstdc++ with -fsanitize=undefined)

	PR sanitizer/81111
	* ubsan.c (ubsan_encode_value): If current_function_decl is NULL,
	use create_tmp_var_raw instead of create_tmp_var, mark it addressable
	just by setting TREE_ADDRESSABLE on the result and use a TARGET_EXPR.

	* g++.dg/ubsan/pr81111.C: New test.

From-SVN: r249375
parent 21e4389f
2017-06-19 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/81111
* ubsan.c (ubsan_encode_value): If current_function_decl is NULL,
use create_tmp_var_raw instead of create_tmp_var, mark it addressable
just by setting TREE_ADDRESSABLE on the result and use a TARGET_EXPR.
2017-06-19 Richard Biener <rguenther@suse.de> 2017-06-19 Richard Biener <rguenther@suse.de>
PR middle-end/81118 PR middle-end/81118
......
2017-06-19 Jakub Jelinek <jakub@redhat.com>
PR sanitizer/81111
* g++.dg/ubsan/pr81111.C: New test.
2017-06-19 Richard Biener <rguenther@suse.de> 2017-06-19 Richard Biener <rguenther@suse.de>
PR middle-end/81118 PR middle-end/81118
......
// PR sanitizer/81111
// { dg-do compile }
// { dg-options "-fsanitize=shift" }
template <typename V>
struct N
{
static const V m = (((V)(-1) < 0)
? (V)1 << (sizeof(V) * __CHAR_BIT__ - ((V)(-1) < 0))
: (V) 0);
};
template<typename V>
const V N<V>::m;
template <typename V>
struct O
{
static const V m = (V)1 << sizeof(V) * __CHAR_BIT__;
};
template<typename V>
const V O<V>::m;
void
foo ()
{
N<long long>::m;
N<unsigned long long>::m;
#ifdef __SIZEOF_INT128__
N<__int128>::m;
N<unsigned __int128>::m;
#endif
}
void
bar ()
{
O<long long>::m;
O<unsigned long long>::m;
#ifdef __SIZEOF_INT128__
O<__int128>::m;
O<unsigned __int128>::m;
#endif
}
...@@ -143,9 +143,17 @@ ubsan_encode_value (tree t, bool in_expand_p) ...@@ -143,9 +143,17 @@ ubsan_encode_value (tree t, bool in_expand_p)
{ {
/* The reason for this is that we don't want to pessimize /* The reason for this is that we don't want to pessimize
code by making vars unnecessarily addressable. */ code by making vars unnecessarily addressable. */
tree var = create_tmp_var (type); tree var;
tree tem = build2 (MODIFY_EXPR, void_type_node, var, t); if (current_function_decl)
{
var = create_tmp_var (type);
mark_addressable (var); mark_addressable (var);
}
else
{
var = create_tmp_var_raw (type);
TREE_ADDRESSABLE (var) = 1;
}
if (in_expand_p) if (in_expand_p)
{ {
rtx mem rtx mem
...@@ -156,10 +164,19 @@ ubsan_encode_value (tree t, bool in_expand_p) ...@@ -156,10 +164,19 @@ ubsan_encode_value (tree t, bool in_expand_p)
expand_assignment (var, t, false); expand_assignment (var, t, false);
return build_fold_addr_expr (var); return build_fold_addr_expr (var);
} }
if (current_function_decl)
{
tree tem = build2 (MODIFY_EXPR, void_type_node, var, t);
t = build_fold_addr_expr (var); t = build_fold_addr_expr (var);
return build2 (COMPOUND_EXPR, TREE_TYPE (t), tem, t); return build2 (COMPOUND_EXPR, TREE_TYPE (t), tem, t);
} }
else else
{
var = build4 (TARGET_EXPR, type, var, t, NULL_TREE, NULL_TREE);
return build_fold_addr_expr (var);
}
}
else
return build_fold_addr_expr (t); return build_fold_addr_expr (t);
} }
} }
......
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