opts.c (finish_options): Do not fail for -fgnu-tm.

* opts.c (finish_options): Do not fail for -fgnu-tm.
        * gimple-streamer-out.c (output_gimple_stmt): Handle GIMPLE_TRANSACTION.
        * gimple-streamer-in.c (input_gimple_stmt): Same.
        * lto-cgraph.c (input_overwrite_node): Read tm_clone bit.
        (lto_output_node): Write tm_clone bit.
lto/
        * lto-lang.c (lto_attribute_table): Handle transaction_pure.
        (handle_transaction_pure_attribute): New.

From-SVN: r181629
This commit is contained in:
Aldy Hernandez 2011-11-22 18:37:16 +00:00 committed by Aldy Hernandez
parent 73cd7644a7
commit 57ac2606c4
11 changed files with 82 additions and 2 deletions

View File

@ -1,3 +1,11 @@
2011-11-21 Aldy Hernandez <aldyh@redhat.com>
* opts.c (finish_options): Do not fail for -fgnu-tm.
* gimple-streamer-out.c (output_gimple_stmt): Handle GIMPLE_TRANSACTION.
* gimple-streamer-in.c (input_gimple_stmt): Same.
* lto-cgraph.c (input_overwrite_node): Read tm_clone bit.
(lto_output_node): Write tm_clone bit.
2011-11-22 Ian Lance Taylor <iant@google.com>
* doc/install.texi (Configuration): Correct doc of

View File

@ -238,6 +238,10 @@ input_gimple_stmt (struct lto_input_block *ib, struct data_in *data_in,
case GIMPLE_PREDICT:
break;
case GIMPLE_TRANSACTION:
gimple_transaction_set_label (stmt, stream_read_tree (ib, data_in));
break;
default:
internal_error ("bytecode stream: unknown GIMPLE statement tag %s",
lto_tag_name (tag));

View File

@ -151,6 +151,11 @@ output_gimple_stmt (struct output_block *ob, gimple stmt)
case GIMPLE_PREDICT:
break;
case GIMPLE_TRANSACTION:
gcc_assert (gimple_transaction_body (stmt) == NULL);
stream_write_tree (ob, gimple_transaction_label (stmt), true);
break;
default:
gcc_unreachable ();
}

View File

@ -522,6 +522,7 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
bp_pack_value (&bp, node->frequency, 2);
bp_pack_value (&bp, node->only_called_at_startup, 1);
bp_pack_value (&bp, node->only_called_at_exit, 1);
bp_pack_value (&bp, node->tm_clone, 1);
bp_pack_value (&bp, node->thunk.thunk_p && !boundary_p, 1);
bp_pack_enum (&bp, ld_plugin_symbol_resolution,
LDPR_NUM_KNOWN, node->resolution);
@ -928,6 +929,7 @@ input_overwrite_node (struct lto_file_decl_data *file_data,
node->frequency = (enum node_frequency)bp_unpack_value (bp, 2);
node->only_called_at_startup = bp_unpack_value (bp, 1);
node->only_called_at_exit = bp_unpack_value (bp, 1);
node->tm_clone = bp_unpack_value (bp, 1);
node->thunk.thunk_p = bp_unpack_value (bp, 1);
node->resolution = bp_unpack_enum (bp, ld_plugin_symbol_resolution,
LDPR_NUM_KNOWN);

View File

@ -1,3 +1,8 @@
2011-11-21 Aldy Hernandez <aldyh@redhat.com>
* lto-lang.c (lto_attribute_table): Handle transaction_pure.
(handle_transaction_pure_attribute): New.
2011-11-03 Richard Guenther <rguenther@suse.de>
PR lto/44965

View File

@ -46,6 +46,7 @@ static tree handle_nonnull_attribute (tree *, tree, tree, int, bool *);
static tree handle_nothrow_attribute (tree *, tree, tree, int, bool *);
static tree handle_sentinel_attribute (tree *, tree, tree, int, bool *);
static tree handle_type_generic_attribute (tree *, tree, tree, int, bool *);
static tree handle_transaction_pure_attribute (tree *, tree, tree, int, bool *);
static tree handle_format_attribute (tree *, tree, tree, int, bool *);
static tree handle_format_arg_attribute (tree *, tree, tree, int, bool *);
@ -75,6 +76,8 @@ const struct attribute_spec lto_attribute_table[] =
handle_sentinel_attribute, false },
{ "type generic", 0, 0, false, true, true,
handle_type_generic_attribute, false },
{ "transaction_pure", 0, 0, false, true, true,
handle_transaction_pure_attribute, false },
{ NULL, 0, 0, false, false, false, NULL, false }
};
@ -402,6 +405,20 @@ handle_type_generic_attribute (tree *node, tree ARG_UNUSED (name),
return NULL_TREE;
}
/* Handle a "transaction_pure" attribute. */
static tree
handle_transaction_pure_attribute (tree *node, tree ARG_UNUSED (name),
tree ARG_UNUSED (args),
int ARG_UNUSED (flags),
bool * ARG_UNUSED (no_add_attrs))
{
/* Ensure we have a function type. */
gcc_assert (TREE_CODE (*node) == FUNCTION_TYPE);
return NULL_TREE;
}
/* Handle a "format" attribute; arguments as in
struct attribute_spec.handler. */

View File

@ -784,8 +784,6 @@ finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
#endif
if (!opts->x_flag_fat_lto_objects && !HAVE_LTO_PLUGIN)
error_at (loc, "-fno-fat-lto-objects are supported only with linker plugin.");
if (opts->x_flag_tm)
error_at (loc, "LTO is currently not supported with transactional memory");
}
if ((opts->x_flag_lto_partition_balanced != 0) + (opts->x_flag_lto_partition_1to1 != 0)
+ (opts->x_flag_lto_partition_none != 0) >= 1)

View File

@ -0,0 +1,11 @@
/* { dg-lto-options {{-flto -fgnu-tm}} } */
int i;
main()
{
__transaction_atomic
{
i = 0;
}
}

View File

@ -0,0 +1,7 @@
#define dummy(func) \
__attribute__((noinline,noclone,used)) void func() { asm (""); }
dummy(_ITM_beginTransaction)
dummy(_ITM_commitTransaction)
dummy(_ITM_WU4)
dummy(_ITM_WU8)

View File

@ -0,0 +1,19 @@
/* { dg-lto-options {{-flto -fgnu-tm}} } */
extern void foobar() __attribute__((transaction_callable));
#define dummy(func) \
__attribute__((noinline,noclone,used)) void func() { asm (""); }
dummy(_ITM_beginTransaction)
dummy(_ITM_commitTransaction)
dummy(_ITM_WU4)
dummy(_ITM_WU8)
main()
{
__transaction_relaxed
{
foobar();
}
}

View File

@ -0,0 +1,4 @@
__attribute__((transaction_callable,noinline))
void foobar()
{
}