Skip to content

Commit e9c12ff

Browse files
committed
cgraph: Move next/previous from symtab to toplevel_node [PR122955]
Currently the GC marker functions don't support chain_next on non-toplevel tag structures (and does not error out either). So since r16-4747-g529c25ed6e0a06 if there are a lot of chained symtab_nodes (happens most likely with LTO), the GC marker function could cause a stack overflow because of the recusive nature of the marker. This fixes the problem by moving next/previous to toplevel_node. I had originally thought about doing chain_next/chain_prev and using is_a<symtab_node *> to get if it was symtab_node and then used the next/previous from there. But it was noticed that asm_node had a next too (though not using chain_next) so adding a previous is not going to much more space anyways; there will not be many toplevel inline-asm anyways. Bootstraped and tested on x86_64-linux-gnu. PR ipa/122955 gcc/ChangeLog: * cgraph.h (toplevel_node): Add next and previous fields. Add chain_next and chain_prev to GTY. (symtab_node): Remove next and previous field. Remove chain_next and chain_prev from the GTY. (asm_node): Remove next field. (symtab_node::next_defined_symbol): Use save_as_a<symtab_node*> around next. (symbol_table::unregister): Likewise (FOR_EACH_SYMBOL): Likewise (symbol_table::first_defined_symbol): Likewise (symbol_table::first_variable): Likewise (symbol_table::next_variable): Likewise (symbol_table::first_static_initializer): Likewise (symbol_table::next_static_initializer): Likewise (symbol_table::first_defined_variable): Likewise (symbol_table::next_defined_variable): Likewise (symbol_table::first_defined_function): Likewise (symbol_table::next_defined_function): Likewise (symbol_table::first_function): Likewise (symbol_table::next_function): Likewise (symbol_table::first_function_with_gimple_body): Likewise (symbol_table::next_function_with_gimple_body): Likewise * cgraphunit.cc (analyze_functions): Likewise (output_in_order): Likewise * lto-streamer-out.cc (lto_output): Use save_as_a<asm_node*> around next. * symtab.cc (symtab_node::verify_symtab_nodes): Likewise. gcc/lto/ChangeLog: * lto-partition.cc (lto_1_to_1_map): Use save_as_a<asm_node*> around next. (create_asm_partition): Likewise. Signed-off-by: Andrew Pinski <[email protected]>
1 parent bcbb536 commit e9c12ff

File tree

5 files changed

+48
-42
lines changed

5 files changed

+48
-42
lines changed

gcc/cgraph.h

Lines changed: 34 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,9 @@ enum symbol_partitioning_class
107107

108108
/* Base of all toplevel entries.
109109
Inherited by symtab_node and asm_node. */
110-
struct GTY ((desc ("%h.type"), tag ("TOPLEVEL_BASE"))) toplevel_node {
110+
struct GTY ((desc ("%h.type"), tag ("TOPLEVEL_BASE"),
111+
chain_next("%h.next"),
112+
chain_prev("%h.previous"))) toplevel_node {
111113
/* Constructor. */
112114
explicit toplevel_node (toplevel_type t)
113115
: lto_file_data (NULL), order (-1), type (t)
@@ -116,6 +118,10 @@ struct GTY ((desc ("%h.type"), tag ("TOPLEVEL_BASE"))) toplevel_node {
116118
/* File stream where this node is being written to. */
117119
struct lto_file_decl_data * lto_file_data;
118120

121+
/* Linked list of toplevel entries. */
122+
toplevel_node *next = nullptr;
123+
toplevel_node *previous = nullptr;
124+
119125
/* Ordering of all cgraph nodes. */
120126
int order;
121127

@@ -125,8 +131,7 @@ struct GTY ((desc ("%h.type"), tag ("TOPLEVEL_BASE"))) toplevel_node {
125131

126132
/* Base of all entries in the symbol table.
127133
The symtab_node is inherited by cgraph and varpol nodes. */
128-
struct GTY ((tag ("SYMTAB_SYMBOL"),
129-
chain_next ("%h.next"), chain_prev ("%h.previous")))
134+
struct GTY ((tag ("SYMTAB_SYMBOL")))
130135
symtab_node: public toplevel_node
131136
{
132137
public:
@@ -633,10 +638,6 @@ struct GTY ((tag ("SYMTAB_SYMBOL"),
633638
/* Declaration representing the symbol. */
634639
tree decl;
635640

636-
/* Linked list of symbol table entries starting with symtab_nodes. */
637-
symtab_node *next;
638-
symtab_node *previous;
639-
640641
/* Linked list of symbols with the same asm name. There may be multiple
641642
entries for single symbol name during LTO, because symbols are renamed
642643
only after partitioning.
@@ -2243,10 +2244,8 @@ struct GTY((tag ("SYMTAB_VARIABLE"))) varpool_node : public symtab_node
22432244

22442245
struct GTY ((tag ("TOPLEVEL_ASM"))) asm_node: public toplevel_node {
22452246
explicit asm_node (tree asm_str)
2246-
: toplevel_node (TOPLEVEL_ASM), next (NULL), asm_str (asm_str)
2247+
: toplevel_node (TOPLEVEL_ASM), asm_str (asm_str)
22472248
{}
2248-
/* Next asm node. */
2249-
asm_node *next;
22502249
/* String for this asm node. */
22512250
tree asm_str;
22522251
};
@@ -2867,9 +2866,9 @@ symtab_node::get_alias_target_tree ()
28672866
inline symtab_node *
28682867
symtab_node::next_defined_symbol (void)
28692868
{
2870-
symtab_node *node1 = next;
2869+
symtab_node *node1 = safe_as_a<symtab_node *>(next);
28712870

2872-
for (; node1; node1 = node1->next)
2871+
for (; node1; node1 = safe_as_a<symtab_node *>(node1->next))
28732872
if (node1->definition)
28742873
return node1;
28752874

@@ -2997,7 +2996,7 @@ symbol_table::unregister (symtab_node *node)
29972996
if (node->previous)
29982997
node->previous->next = node->next;
29992998
else
3000-
nodes = node->next;
2999+
nodes = safe_as_a<symtab_node *>(node->next);
30013000

30023001
if (node->next)
30033002
node->next->previous = node->previous;
@@ -3026,15 +3025,17 @@ symbol_table::first_symbol (void)
30263025

30273026
/* Walk all symbols. */
30283027
#define FOR_EACH_SYMBOL(node) \
3029-
for ((node) = symtab->first_symbol (); (node); (node) = (node)->next)
3028+
for ((node) = symtab->first_symbol (); (node); \
3029+
(node) = safe_as_a<symtab_node *>((node)->next))
30303030

30313031
/* Return first static symbol with definition. */
30323032
inline symtab_node *
30333033
symbol_table::first_defined_symbol (void)
30343034
{
30353035
symtab_node *node;
30363036

3037-
for (node = nodes; node; node = node->next)
3037+
for (node = nodes; node;
3038+
node = safe_as_a<symtab_node *>(node->next))
30383039
if (node->definition)
30393040
return node;
30403041

@@ -3051,7 +3052,7 @@ inline varpool_node *
30513052
symbol_table::first_variable (void)
30523053
{
30533054
symtab_node *node;
3054-
for (node = nodes; node; node = node->next)
3055+
for (node = nodes; node; node = safe_as_a<symtab_node *>(node->next))
30553056
if (varpool_node *vnode = dyn_cast <varpool_node *> (node))
30563057
return vnode;
30573058
return NULL;
@@ -3061,8 +3062,8 @@ symbol_table::first_variable (void)
30613062
inline varpool_node *
30623063
symbol_table::next_variable (varpool_node *node)
30633064
{
3064-
symtab_node *node1 = node->next;
3065-
for (; node1; node1 = node1->next)
3065+
symtab_node *node1 = safe_as_a<symtab_node *>(node->next);
3066+
for (; node1; node1 = safe_as_a<symtab_node *>(node1->next))
30663067
if (varpool_node *vnode1 = dyn_cast <varpool_node *> (node1))
30673068
return vnode1;
30683069
return NULL;
@@ -3078,7 +3079,7 @@ inline varpool_node *
30783079
symbol_table::first_static_initializer (void)
30793080
{
30803081
symtab_node *node;
3081-
for (node = nodes; node; node = node->next)
3082+
for (node = nodes; node; node = safe_as_a<symtab_node *>(node->next))
30823083
{
30833084
varpool_node *vnode = dyn_cast <varpool_node *> (node);
30843085
if (vnode && DECL_INITIAL (node->decl))
@@ -3091,8 +3092,8 @@ symbol_table::first_static_initializer (void)
30913092
inline varpool_node *
30923093
symbol_table::next_static_initializer (varpool_node *node)
30933094
{
3094-
symtab_node *node1 = node->next;
3095-
for (; node1; node1 = node1->next)
3095+
symtab_node *node1 = safe_as_a<symtab_node *>(node->next);
3096+
for (; node1; node1 = safe_as_a<symtab_node *>(node1->next))
30963097
{
30973098
varpool_node *vnode1 = dyn_cast <varpool_node *> (node1);
30983099
if (vnode1 && DECL_INITIAL (node1->decl))
@@ -3111,7 +3112,7 @@ inline varpool_node *
31113112
symbol_table::first_defined_variable (void)
31123113
{
31133114
symtab_node *node;
3114-
for (node = nodes; node; node = node->next)
3115+
for (node = nodes; node; node = safe_as_a<symtab_node *>(node->next))
31153116
{
31163117
varpool_node *vnode = dyn_cast <varpool_node *> (node);
31173118
if (vnode && vnode->definition)
@@ -3124,8 +3125,8 @@ symbol_table::first_defined_variable (void)
31243125
inline varpool_node *
31253126
symbol_table::next_defined_variable (varpool_node *node)
31263127
{
3127-
symtab_node *node1 = node->next;
3128-
for (; node1; node1 = node1->next)
3128+
symtab_node *node1 = safe_as_a<symtab_node *>(node->next);
3129+
for (; node1; node1 = safe_as_a<symtab_node *>(node1->next))
31293130
{
31303131
varpool_node *vnode1 = dyn_cast <varpool_node *> (node1);
31313132
if (vnode1 && vnode1->definition)
@@ -3143,7 +3144,7 @@ inline cgraph_node *
31433144
symbol_table::first_defined_function (void)
31443145
{
31453146
symtab_node *node;
3146-
for (node = nodes; node; node = node->next)
3147+
for (node = nodes; node; node = safe_as_a<symtab_node *>(node->next))
31473148
{
31483149
cgraph_node *cn = dyn_cast <cgraph_node *> (node);
31493150
if (cn && cn->definition)
@@ -3156,8 +3157,8 @@ symbol_table::first_defined_function (void)
31563157
inline cgraph_node *
31573158
symbol_table::next_defined_function (cgraph_node *node)
31583159
{
3159-
symtab_node *node1 = node->next;
3160-
for (; node1; node1 = node1->next)
3160+
symtab_node *node1 = safe_as_a<symtab_node *>(node->next);
3161+
for (; node1; node1 = safe_as_a<symtab_node *>(node1->next))
31613162
{
31623163
cgraph_node *cn1 = dyn_cast <cgraph_node *> (node1);
31633164
if (cn1 && cn1->definition)
@@ -3176,7 +3177,7 @@ inline cgraph_node *
31763177
symbol_table::first_function (void)
31773178
{
31783179
symtab_node *node;
3179-
for (node = nodes; node; node = node->next)
3180+
for (node = nodes; node; node = safe_as_a<symtab_node *>(node->next))
31803181
if (cgraph_node *cn = dyn_cast <cgraph_node *> (node))
31813182
return cn;
31823183
return NULL;
@@ -3186,8 +3187,8 @@ symbol_table::first_function (void)
31863187
inline cgraph_node *
31873188
symbol_table::next_function (cgraph_node *node)
31883189
{
3189-
symtab_node *node1 = node->next;
3190-
for (; node1; node1 = node1->next)
3190+
symtab_node *node1 = safe_as_a<symtab_node *>(node->next);
3191+
for (; node1; node1 = safe_as_a<symtab_node *>(node1->next))
31913192
if (cgraph_node *cn1 = dyn_cast <cgraph_node *> (node1))
31923193
return cn1;
31933194
return NULL;
@@ -3198,7 +3199,7 @@ inline cgraph_node *
31983199
symbol_table::first_function_with_gimple_body (void)
31993200
{
32003201
symtab_node *node;
3201-
for (node = nodes; node; node = node->next)
3202+
for (node = nodes; node; node = safe_as_a<symtab_node *>(node->next))
32023203
{
32033204
cgraph_node *cn = dyn_cast <cgraph_node *> (node);
32043205
if (cn && cn->has_gimple_body_p ())
@@ -3211,8 +3212,8 @@ symbol_table::first_function_with_gimple_body (void)
32113212
inline cgraph_node *
32123213
symbol_table::next_function_with_gimple_body (cgraph_node *node)
32133214
{
3214-
symtab_node *node1 = node->next;
3215-
for (; node1; node1 = node1->next)
3215+
symtab_node *node1 = safe_as_a<symtab_node *>(node->next);
3216+
for (; node1; node1 = safe_as_a<symtab_node *>(node1->next))
32163217
{
32173218
cgraph_node *cn1 = dyn_cast <cgraph_node *> (node1);
32183219
if (cn1 && cn1->has_gimple_body_p ())

gcc/cgraphunit.cc

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1210,8 +1210,8 @@ analyze_functions (bool first_time)
12101210

12111211
/* First identify the trivially needed symbols. */
12121212
for (node = symtab->first_symbol ();
1213-
node != first_analyzed
1214-
&& node != first_analyzed_var; node = node->next)
1213+
node != first_analyzed && node != first_analyzed_var;
1214+
node = safe_as_a<symtab_node *>(node->next))
12151215
{
12161216
/* Convert COMDAT group designators to IDENTIFIER_NODEs. */
12171217
node->get_comdat_group_id ();
@@ -1373,7 +1373,7 @@ analyze_functions (bool first_time)
13731373
node != first_handled
13741374
&& node != first_handled_var; node = next)
13751375
{
1376-
next = node->next;
1376+
next = safe_as_a<symtab_node *>(node->next);
13771377
/* For symbols declared locally we clear TREE_READONLY when emitting
13781378
the constructor (if one is needed). For external declarations we can
13791379
not safely assume that the type is readonly because we may be called
@@ -1428,7 +1428,7 @@ analyze_functions (bool first_time)
14281428
}
14291429
node->aux = NULL;
14301430
}
1431-
for (;node; node = node->next)
1431+
for (;node; node = safe_as_a<symtab_node *>(node->next))
14321432
node->aux = NULL;
14331433
first_analyzed = symtab->first_function ();
14341434
first_analyzed_var = symtab->first_variable ();
@@ -2203,7 +2203,8 @@ output_in_order (void)
22032203
&& !DECL_HAS_VALUE_EXPR_P (vnode->decl))
22042204
nodes.safe_push (cgraph_order_sort (vnode));
22052205

2206-
for (anode = symtab->first_asm_symbol (); anode; anode = anode->next)
2206+
for (anode = symtab->first_asm_symbol (); anode;
2207+
anode = safe_as_a<asm_node*>(anode->next))
22072208
nodes.safe_push (cgraph_order_sort (anode));
22082209

22092210
/* Sort nodes by order. */

gcc/lto-streamer-out.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2828,7 +2828,9 @@ lto_output (void)
28282828
if (!flag_wpa)
28292829
{
28302830
asm_node *anode;
2831-
for (anode = symtab->first_asm_symbol (); anode; anode = anode->next)
2831+
for (anode = symtab->first_asm_symbol ();
2832+
anode;
2833+
anode = safe_as_a<asm_node*>(anode->next))
28322834
lto_set_symtab_encoder_in_partition (encoder, anode);
28332835
}
28342836

gcc/lto/lto-partition.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ lto_1_to_1_map (void)
383383
}
384384

385385
struct asm_node *anode;
386-
for (anode = symtab->first_asm_symbol (); anode; anode = anode->next)
386+
for (anode = symtab->first_asm_symbol (); anode; anode = safe_as_a<asm_node*>(anode->next))
387387
node_into_file_partition (anode, pmap);
388388

389389
create_partition_if_empty ();
@@ -406,7 +406,7 @@ create_asm_partition (void)
406406
if (anode)
407407
{
408408
ltrans_partition partition = new_partition ("asm_nodes");
409-
for (; anode; anode = anode->next)
409+
for (; anode; anode = safe_as_a<asm_node*>(anode->next))
410410
add_symbol_to_partition (partition, anode);
411411
}
412412
}

gcc/symtab.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1485,7 +1485,9 @@ symtab_node::verify_symtab_nodes (void)
14851485
hash_map<tree, symtab_node *> comdat_head_map (251);
14861486
asm_node *anode;
14871487

1488-
for (anode = symtab->first_asm_symbol (); anode; anode = anode->next)
1488+
for (anode = symtab->first_asm_symbol ();
1489+
anode;
1490+
anode = safe_as_a<asm_node*>(anode->next))
14891491
if (anode->order < 0 || anode->order >= symtab->order)
14901492
{
14911493
error ("invalid order in asm node %i", anode->order);

0 commit comments

Comments
 (0)