asm_node and symbol_node will now inherit from toplevel_node.
This is now useful for lto partitioning, in future it should be also
useful for toplevel extended assembly.
gcc/ChangeLog:
* cgraph.h (enum symtab_type): Replace with toplevel_type.
(enum toplevel_type): New.
(struct toplevel_node): New.
(struct asm_node): Inherits from toplevel_node.
(test): New.
(symbol_table::finalize_toplevel_asm): Use constructor.
* coretypes.h (struct toplevel_node): New.
(struct asm_node): New.
* lto-streamer-in.cc (lto_input_toplevel_asms): Add
lto_file_data.
---
gcc/cgraph.h | 98 ++++++++++++++++++++++++++++++++----------
gcc/coretypes.h | 10 +++--
gcc/lto-streamer-in.cc | 1 +
3 files changed, 82 insertions(+), 27 deletions(-)
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index deca564a8e3..278479a5510 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -37,10 +37,12 @@ extern void debuginfo_early_stop (void);
class ipa_opt_pass_d;
typedef ipa_opt_pass_d *ipa_opt_pass;
-/* Symbol table consists of functions and variables.
+/* Toplevel consists of functions, variables and assembly.
TODO: add labels and CONST_DECLs. */
-enum symtab_type
+enum toplevel_type
{
+ TOPLEVEL_BASE,
+ TOPLEVEL_ASM,
SYMTAB_SYMBOL,
SYMTAB_FUNCTION,
SYMTAB_VARIABLE
@@ -100,18 +102,37 @@ enum symbol_partitioning_class
SYMBOL_DUPLICATE
};
+/* Base of all toplevel entries.
+ Inherited by symtab_node and asm_node. */
+struct GTY ((desc ("%h.type"), tag ("TOPLEVEL_BASE"))) toplevel_node {
+ /* Constructor. */
+ explicit toplevel_node (toplevel_type t)
+ : lto_file_data (NULL), order (-1), type (t)
+ {}
+
+ /* File stream where this node is being written to. */
+ struct lto_file_decl_data * lto_file_data;
+
+ /* Ordering of all cgraph nodes. */
+ int order;
+
+ /* Type of the node. */
+ ENUM_BITFIELD (toplevel_type) type : 8;
+};
+
/* Base of all entries in the symbol table.
The symtab_node is inherited by cgraph and varpol nodes. */
-struct GTY((desc ("%h.type"), tag ("SYMTAB_SYMBOL"),
+struct GTY ((tag ("SYMTAB_SYMBOL"),
chain_next ("%h.next"), chain_prev ("%h.previous")))
- symtab_node
+ symtab_node: public toplevel_node
{
public:
friend class symbol_table;
/* Constructor. */
- explicit symtab_node (symtab_type t)
- : type (t), resolution (LDPR_UNKNOWN), definition (false), alias (false),
+ explicit symtab_node (toplevel_type t)
+ : toplevel_node (t),
+ resolution (LDPR_UNKNOWN), definition (false), alias (false),
transparent_alias (false), weakref (false), cpp_implicit_alias (false),
symver (false), analyzed (false), writeonly (false),
refuse_visibility_changes (false), externally_visible (false),
@@ -121,9 +142,9 @@ public:
used_from_other_partition (false), in_other_partition (false),
address_taken (false), in_init_priority_hash (false),
need_lto_streaming (false), offloadable (false), ifunc_resolver (false),
- order (-1), next_sharing_asm_name (NULL),
+ next_sharing_asm_name (NULL),
previous_sharing_asm_name (NULL), same_comdat_group (NULL), ref_list (),
- alias_target (NULL), lto_file_data (NULL), aux (NULL),
+ alias_target (NULL), aux (NULL),
x_comdat_group (NULL_TREE), x_section (NULL), m_uid (-1)
{}
@@ -498,9 +519,6 @@ public:
return m_uid;
}
- /* Type of the symbol. */
- ENUM_BITFIELD (symtab_type) type : 8;
-
/* The symbols resolution. */
ENUM_BITFIELD (ld_plugin_symbol_resolution) resolution : 8;
@@ -609,9 +627,6 @@ public:
unsigned ifunc_resolver : 1;
- /* Ordering of all symtab entries. */
- int order;
-
/* Declaration representing the symbol. */
tree decl;
@@ -642,9 +657,6 @@ public:
Once alias is resolved, this pointer become NULL. */
tree alias_target;
- /* File stream where this node is being written to. */
- struct lto_file_decl_data * lto_file_data;
-
void *GTY ((skip)) aux;
/* Comdat group the symbol is in. Can be private if GGC allowed that. */
@@ -2162,13 +2174,14 @@ private:
/* Every top level asm statement is put into a asm_node. */
-struct GTY(()) asm_node {
+struct GTY ((tag ("TOPLEVEL_ASM"))) asm_node: public toplevel_node {
+ explicit asm_node (tree asm_str)
+ : toplevel_node (TOPLEVEL_ASM), next (NULL), asm_str (asm_str)
+ {}
/* Next asm node. */
asm_node *next;
/* String for this asm node. */
tree asm_str;
- /* Ordering of all cgraph nodes. */
- int order;
};
/* Report whether or not THIS symtab node is a function, aka cgraph_node. */
@@ -2191,6 +2204,47 @@ is_a_helper <varpool_node *>::test (symtab_node *p)
return p && p->type == SYMTAB_VARIABLE;
}
+/* Report whether or not THIS toplevel node is a function, aka cgraph_node. */
+
+template <>
+template <>
+inline bool
+is_a_helper <cgraph_node *>::test (toplevel_node *p)
+{
+ return p && p->type == SYMTAB_FUNCTION;
+}
+
+/* Report whether or not THIS toplevel node is a variable, aka varpool_node.
*/
+
+template <>
+template <>
+inline bool
+is_a_helper <varpool_node *>::test (toplevel_node *p)
+{
+ return p && p->type == SYMTAB_VARIABLE;
+}
+
+/* Report whether or not THIS toplevel node is a symtab_node. */
+
+template <>
+template <>
+inline bool
+is_a_helper <symtab_node *>::test (toplevel_node *p)
+{
+ return p && p->type >= SYMTAB_SYMBOL;
+}
+
+/* Report whether or not THIS toplevel node is a toplevel assembly, aka
+ asm_node. */
+
+template <>
+template <>
+inline bool
+is_a_helper <asm_node *>::test (toplevel_node *p)
+{
+ return p && p->type == TOPLEVEL_ASM;
+}
+
typedef void (*cgraph_edge_hook)(cgraph_edge *, void *);
typedef void (*cgraph_node_hook)(cgraph_node *, void *);
typedef void (*varpool_node_hook)(varpool_node *, void *);
@@ -2855,10 +2909,8 @@ symbol_table::finalize_toplevel_asm (tree asm_str)
{
asm_node *node;
- node = ggc_cleared_alloc<asm_node> ();
- node->asm_str = asm_str;
+ node = new (ggc_cleared_alloc<asm_node> ()) asm_node (asm_str);
node->order = order++;
- node->next = NULL;
if (asmnodes == NULL)
asmnodes = node;
diff --git a/gcc/coretypes.h b/gcc/coretypes.h
index b6a922a506c..f4a61c4edc3 100644
--- a/gcc/coretypes.h
+++ b/gcc/coretypes.h
@@ -147,12 +147,14 @@ using dw_cfi_ref = struct dw_cfi_node *;
enum dw_cfi_oprnd_type: int;
enum dwarf_call_frame_info: int;
-/* Subclasses of symtab_node, using indentation to show the class
+/* Subclasses of toplevel_node, using indentation to show the class
hierarchy. */
-struct symtab_node;
- struct cgraph_node;
- struct varpool_node;
+struct toplevel_node;
+ struct asm_node;
+ struct symtab_node;
+ struct cgraph_node;
+ struct varpool_node;
struct cgraph_edge;
union section;
diff --git a/gcc/lto-streamer-in.cc b/gcc/lto-streamer-in.cc
index be818268f85..2efa1f33967 100644
--- a/gcc/lto-streamer-in.cc
+++ b/gcc/lto-streamer-in.cc
@@ -2004,6 +2004,7 @@ lto_input_toplevel_asms (struct lto_file_decl_data
*file_data, int order_base)
{
asm_node *node = symtab->finalize_toplevel_asm (str);
node->order = streamer_read_hwi (&ib) + order_base;
+ node->lto_file_data = file_data;
if (node->order >= symtab->order)
symtab->order = node->order + 1;
}
--
2.50.0