diff options
author | Jan Hubicka <jh@suse.cz> | 2012-05-09 09:01:39 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2012-05-09 07:01:39 +0000 |
commit | 0d6bf48c3ea3b48f462be944e46ced4bf3f08884 (patch) | |
tree | e597dfea9b0d87794f19fd362d4d0233467a72af /gcc/varpool.c | |
parent | 36e0c0a5157a20eda403d230392327c73a9b9e12 (diff) | |
download | gcc-0d6bf48c3ea3b48f462be944e46ced4bf3f08884.zip gcc-0d6bf48c3ea3b48f462be944e46ced4bf3f08884.tar.gz gcc-0d6bf48c3ea3b48f462be944e46ced4bf3f08884.tar.bz2 |
cgraphbuild.c (build_cgraph_edges): Do not finalize vars with VALUE_EXPR.
* cgraphbuild.c (build_cgraph_edges): Do not finalize vars
with VALUE_EXPR.
* cgraph.h (varpool_can_remove_if_no_refs): Vars with VALUE_EXPR
are removable.
* toplev.c (wrapup_global_declaration_2): Vars with VALUE_EXPR
need to wrapup.
(compile_file): Do not output variables.
* cgraphbuild.c (varpool_finalize_decl): When var is finalized late,
output it.
* langhooks.c: Include timevar.h
(write_global_declarations): Finalize compilation unit after wrapup;
set timevars correctly.
* passes.c (rest_of_decl_compilation): Decls with VALUE_EXPR needs
not to be added to varpool.
* varpool.c (varpool_assemble_decl): Sanity check that we are called
only on cases where it makes sense; skip constant pool and value expr
vars.
* lto.c (do_whole_program_analysis): Set timevars correctly.
(lto_main): Likewise.
* trans-common.c (create_common): Do not fake TREE_ASM_WRITTEN.
* trans-decl.c (gfc_finish_cray_pointee): Likewise.
From-SVN: r187314
Diffstat (limited to 'gcc/varpool.c')
-rw-r--r-- | gcc/varpool.c | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/gcc/varpool.c b/gcc/varpool.c index 103b5b5..5ab294b 100644 --- a/gcc/varpool.c +++ b/gcc/varpool.c @@ -269,24 +269,42 @@ assemble_aliases (struct varpool_node *node) } /* Output one variable, if necessary. Return whether we output it. */ + bool varpool_assemble_decl (struct varpool_node *node) { tree decl = node->symbol.decl; - if (!TREE_ASM_WRITTEN (decl) - && !node->alias - && !node->symbol.in_other_partition - && !DECL_EXTERNAL (decl) - && (TREE_CODE (decl) != VAR_DECL || !DECL_HAS_VALUE_EXPR_P (decl))) + /* Aliases are outout when their target is produced or by + output_weakrefs. */ + if (node->alias) + return false; + + /* Constant pool is output from RTL land when the reference + survive till this level. */ + if (DECL_IN_CONSTANT_POOL (decl)) + return false; + + /* Decls with VALUE_EXPR should not be in the varpool at all. They + are not real variables, but just info for debugging and codegen. + Unfortunately at the moment emutls is not updating varpool correctly + after turning real vars into value_expr vars. */ + if (DECL_HAS_VALUE_EXPR_P (decl) + && !targetm.have_tls) + return false; + + gcc_checking_assert (!TREE_ASM_WRITTEN (decl) + && TREE_CODE (decl) == VAR_DECL + && !DECL_HAS_VALUE_EXPR_P (decl)); + + if (!node->symbol.in_other_partition + && !DECL_EXTERNAL (decl)) { assemble_variable (decl, 0, 1, 0); - if (TREE_ASM_WRITTEN (decl)) - { - node->finalized = 1; - assemble_aliases (node); - return true; - } + gcc_assert (TREE_ASM_WRITTEN (decl)); + node->finalized = 1; + assemble_aliases (node); + return true; } return false; |