diff options
Diffstat (limited to 'gcc/cgraph.c')
-rw-r--r-- | gcc/cgraph.c | 40 |
1 files changed, 35 insertions, 5 deletions
diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 88cf8ac818e..10a22334771 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -131,13 +131,23 @@ static GTY((param_is (struct cgraph_varpool_node))) htab_t cgraph_varpool_hash; /* Queue of cgraph nodes scheduled to be lowered and output. */ struct cgraph_varpool_node *cgraph_varpool_nodes_queue, *cgraph_varpool_first_unanalyzed_node; - /* The linked list of cgraph varpool nodes. */ static GTY(()) struct cgraph_varpool_node *cgraph_varpool_nodes; /* End of the varpool queue. Needs to be QTYed to work with PCH. */ static GTY(()) struct cgraph_varpool_node *cgraph_varpool_last_needed_node; +/* Linked list of cgraph asm nodes. */ +struct cgraph_asm_node *cgraph_asm_nodes; + +/* Last node in cgraph_asm_nodes. */ +static GTY(()) struct cgraph_asm_node *cgraph_asm_last_node; + +/* The order index of the next cgraph node to be created. This is + used so that we can sort the cgraph nodes in order by when we saw + them, to support -fno-toplevel-reorder. */ +int cgraph_order; + static hashval_t hash_node (const void *); static int eq_node (const void *, const void *); @@ -169,6 +179,7 @@ cgraph_create_node (void) node = GGC_CNEW (struct cgraph_node); node->next = cgraph_nodes; node->uid = cgraph_max_uid++; + node->order = cgraph_order++; if (cgraph_nodes) cgraph_nodes->previous = node; node->previous = NULL; @@ -745,6 +756,7 @@ cgraph_varpool_node (tree decl) return *slot; node = GGC_CNEW (struct cgraph_varpool_node); node->decl = decl; + node->order = cgraph_order++; node->next = cgraph_varpool_nodes; cgraph_varpool_nodes = node; *slot = node; @@ -847,12 +859,11 @@ decide_is_variable_needed (struct cgraph_varpool_node *node, tree decl) if (TREE_PUBLIC (decl) && !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl)) return true; - if (flag_unit_at_a_time) + /* When not reordering top level variables, we have to assume that + we are going to keep everything. */ + if (flag_unit_at_a_time && flag_toplevel_reorder) return false; - /* If not doing unit at a time, then we'll only defer this function - if its marked for inlining. Otherwise we want to emit it now. */ - /* We want to emit COMDAT variables only when absolutely necessary. */ if (DECL_COMDAT (decl)) return false; @@ -889,6 +900,25 @@ cgraph_varpool_finalize_decl (tree decl) cgraph_varpool_assemble_pending_decls (); } +/* Add a top-level asm statement to the list. */ + +struct cgraph_asm_node * +cgraph_add_asm_node (tree asm_str) +{ + struct cgraph_asm_node *node; + + node = GGC_CNEW (struct cgraph_asm_node); + node->asm_str = asm_str; + node->order = cgraph_order++; + node->next = NULL; + if (cgraph_asm_nodes == NULL) + cgraph_asm_nodes = node; + else + cgraph_asm_last_node->next = node; + cgraph_asm_last_node = node; + return node; +} + /* Return true when the DECL can possibly be inlined. */ bool cgraph_function_possibly_inlined_p (tree decl) |