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>
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>
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)
{
/* The reason for this is that we don't want to pessimize
code by making vars unnecessarily addressable. */
tree var = create_tmp_var (type);
tree tem = build2 (MODIFY_EXPR, void_type_node, var, t);
mark_addressable (var);
tree var;
if (current_function_decl)
{
var = create_tmp_var (type);
mark_addressable (var);
}
else
{
var = create_tmp_var_raw (type);
TREE_ADDRESSABLE (var) = 1;
}
if (in_expand_p)
{
rtx mem
......@@ -156,8 +164,17 @@ ubsan_encode_value (tree t, bool in_expand_p)
expand_assignment (var, t, false);
return build_fold_addr_expr (var);
}
t = build_fold_addr_expr (var);
return build2 (COMPOUND_EXPR, TREE_TYPE (t), tem, t);
if (current_function_decl)
{
tree tem = build2 (MODIFY_EXPR, void_type_node, var, t);
t = build_fold_addr_expr (var);
return build2 (COMPOUND_EXPR, TREE_TYPE (t), tem, t);
}
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);
......
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