Commit 1d4afc04 by Jason Merrill Committed by Jason Merrill

re PR c/59218 (atomic transactions: accesses to volatiles not disallowed in transaction_safe code)

	PR c/59218

	* trans-mem.c (volatile_lvalue_p): Rename from volatile_var_p.
	(diagnose_tm_1_op): Also diagnose volatile accesses in
	transaction_safe function.

From-SVN: r228392
parent 5f62fa6d
2015-10-02 Jason Merrill <jason@redhat.com>
PR c/59218
* trans-mem.c (volatile_lvalue_p): Rename from volatile_var_p.
(diagnose_tm_1_op): Also diagnose volatile accesses in
transaction_safe function.
2015-10-02 Jonathan Wakely <jwakely@redhat.com> 2015-10-02 Jonathan Wakely <jwakely@redhat.com>
* system.h (malloc.h): Don't include obsolete header. * system.h (malloc.h): Don't include obsolete header.
// Transaction-unsafe testcase from TM TS.
// { dg-options -fgnu-tm }
volatile int * p = 0;
__attribute ((transaction_safe))
int f() {
int x = 0; // ok: not volatile
p = &x; // ok: the pointer is not volatile
int i = *p; // { dg-error "volatile" "read through volatile glvalue" }
}
...@@ -7,7 +7,7 @@ int y; ...@@ -7,7 +7,7 @@ int y;
void foo(volatile int x) void foo(volatile int x)
{ {
__transaction_atomic { __transaction_atomic {
x = 5; /* { dg-error "invalid volatile use of 'x' inside transaction" } */ x = 5; /* { dg-error "invalid use of volatile lvalue inside transaction" } */
x += y; x += y;
y++; y++;
} }
...@@ -20,7 +20,7 @@ volatile int i = 0; ...@@ -20,7 +20,7 @@ volatile int i = 0;
void george() void george()
{ {
__transaction_atomic { __transaction_atomic {
if (i == 2) /* { dg-error "invalid volatile use of 'i' inside transaction" } */ if (i == 2) /* { dg-error "invalid use of volatile lvalue inside transaction" } */
i = 1; i = 1;
} }
} }
...@@ -594,32 +594,36 @@ struct diagnose_tm ...@@ -594,32 +594,36 @@ struct diagnose_tm
gimple *stmt; gimple *stmt;
}; };
/* Return true if T is a volatile variable of some kind. */ /* Return true if T is a volatile lvalue of some kind. */
static bool static bool
volatile_var_p (tree t) volatile_lvalue_p (tree t)
{ {
return (SSA_VAR_P (t) return ((SSA_VAR_P (t) || REFERENCE_CLASS_P (t))
&& TREE_THIS_VOLATILE (TREE_TYPE (t))); && TREE_THIS_VOLATILE (TREE_TYPE (t)));
} }
/* Tree callback function for diagnose_tm pass. */ /* Tree callback function for diagnose_tm pass. */
static tree static tree
diagnose_tm_1_op (tree *tp, int *walk_subtrees ATTRIBUTE_UNUSED, diagnose_tm_1_op (tree *tp, int *walk_subtrees, void *data)
void *data)
{ {
struct walk_stmt_info *wi = (struct walk_stmt_info *) data; struct walk_stmt_info *wi = (struct walk_stmt_info *) data;
struct diagnose_tm *d = (struct diagnose_tm *) wi->info; struct diagnose_tm *d = (struct diagnose_tm *) wi->info;
if (volatile_var_p (*tp) if (TYPE_P (*tp))
&& d->block_flags & DIAG_TM_SAFE *walk_subtrees = false;
&& !d->saw_volatile) else if (volatile_lvalue_p (*tp)
&& !d->saw_volatile)
{ {
d->saw_volatile = 1; d->saw_volatile = 1;
error_at (gimple_location (d->stmt), if (d->block_flags & DIAG_TM_SAFE)
"invalid volatile use of %qD inside transaction", error_at (gimple_location (d->stmt),
*tp); "invalid use of volatile lvalue inside transaction");
else if (d->func_flags & DIAG_TM_SAFE)
error_at (gimple_location (d->stmt),
"invalid use of volatile lvalue inside %<transaction_safe%>"
"function");
} }
return NULL_TREE; return NULL_TREE;
...@@ -4298,7 +4302,7 @@ ipa_tm_scan_irr_block (basic_block bb) ...@@ -4298,7 +4302,7 @@ ipa_tm_scan_irr_block (basic_block bb)
{ {
tree lhs = gimple_assign_lhs (stmt); tree lhs = gimple_assign_lhs (stmt);
tree rhs = gimple_assign_rhs1 (stmt); tree rhs = gimple_assign_rhs1 (stmt);
if (volatile_var_p (lhs) || volatile_var_p (rhs)) if (volatile_lvalue_p (lhs) || volatile_lvalue_p (rhs))
return true; return true;
} }
break; break;
...@@ -4306,7 +4310,7 @@ ipa_tm_scan_irr_block (basic_block bb) ...@@ -4306,7 +4310,7 @@ ipa_tm_scan_irr_block (basic_block bb)
case GIMPLE_CALL: case GIMPLE_CALL:
{ {
tree lhs = gimple_call_lhs (stmt); tree lhs = gimple_call_lhs (stmt);
if (lhs && volatile_var_p (lhs)) if (lhs && volatile_lvalue_p (lhs))
return true; return true;
if (is_tm_pure_call (stmt)) if (is_tm_pure_call (stmt))
......
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