aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2010-09-16 09:38:13 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2010-09-16 09:38:13 +0000
commit23bdc9ca4ff5b204fd3a51aaab2c21cf6a544ff4 (patch)
treedb74c86f639c1dd58991243eee16d61445974c50
parent1716d6278b1443368721b44ddfc0a2bda8ff6f1d (diff)
2010-09-16 Richard Guenther <rguenther@suse.de>
* tree.c (tree_node_structure_for_code): TRANSLATION_UNIT_DECL is TS_TRANSLATION_UNIT_DECL. (initialize_tree_contains_struct): Adjust. (all_translation_units): New global vector. (build_translation_unit_decl): New function. * tree.h (TRANSLATION_UNIT_LANGUAGE): New macro. (struct tree_translation_unit_decl): New. (all_translation_units): Declare. (union tree_node): Add translation_unit_decl member. (build_translation_unit_decl): Declare. * treestruct.def (TS_TRANSLATION_UNIT_DECL): New. * lto-streamer-out.c (pack_ts_translation_unit_decl_value_fields): New function. (pack_value_fields): Call it. (lto_output_tree_ref): Handle references to TRANSLATION_UNIT_DECL. (lto_output_ts_translation_unit_decl_tree_pointers): New function. (lto_output_tree_pointers): Call it. * lto-streamer-in.c (lto_input_tree_ref): Handle references to TRANSLATION_UNIT_DECL. (unpack_ts_translation_unit_decl_value_fields): New function. (unpack_value_fields): Call it. (lto_input_ts_translation_unit_decl_tree_pointers): New function. (lto_input_tree_pointers): Call it. * lto-streamer.c (check_handled_ts_structures): Adjust. * lto-streamer.h (enum LTO_tags): Add LTO_translation_unit_decl_ref. * c-decl.c (all_translation_units): Remove. (pop_scope): Use build_translation_unit_decl. (collect_all_refs): Adjust. (for_each_global_decl): Likewise. (c_write_global_declarations): Likewise. java/ * jcf-parse.c (current_file_list): Remove. (java_parse_file): Use build_translation_unit_decl. Adjust. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@164331 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog33
-rw-r--r--gcc/c-decl.c22
-rw-r--r--gcc/java/ChangeLog5
-rw-r--r--gcc/java/jcf-parse.c17
-rw-r--r--gcc/lto-streamer-in.c25
-rw-r--r--gcc/lto-streamer-out.c27
-rw-r--r--gcc/lto-streamer.c1
-rw-r--r--gcc/lto-streamer.h1
-rw-r--r--gcc/tree.c23
-rw-r--r--gcc/tree.h20
-rw-r--r--gcc/treestruct.def1
11 files changed, 149 insertions, 26 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b10ea89ac20..77010f506e1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,36 @@
+2010-09-16 Richard Guenther <rguenther@suse.de>
+
+ * tree.c (tree_node_structure_for_code): TRANSLATION_UNIT_DECL
+ is TS_TRANSLATION_UNIT_DECL.
+ (initialize_tree_contains_struct): Adjust.
+ (all_translation_units): New global vector.
+ (build_translation_unit_decl): New function.
+ * tree.h (TRANSLATION_UNIT_LANGUAGE): New macro.
+ (struct tree_translation_unit_decl): New.
+ (all_translation_units): Declare.
+ (union tree_node): Add translation_unit_decl member.
+ (build_translation_unit_decl): Declare.
+ * treestruct.def (TS_TRANSLATION_UNIT_DECL): New.
+ * lto-streamer-out.c (pack_ts_translation_unit_decl_value_fields):
+ New function.
+ (pack_value_fields): Call it.
+ (lto_output_tree_ref): Handle references to TRANSLATION_UNIT_DECL.
+ (lto_output_ts_translation_unit_decl_tree_pointers): New function.
+ (lto_output_tree_pointers): Call it.
+ * lto-streamer-in.c (lto_input_tree_ref): Handle references
+ to TRANSLATION_UNIT_DECL.
+ (unpack_ts_translation_unit_decl_value_fields): New function.
+ (unpack_value_fields): Call it.
+ (lto_input_ts_translation_unit_decl_tree_pointers): New function.
+ (lto_input_tree_pointers): Call it.
+ * lto-streamer.c (check_handled_ts_structures): Adjust.
+ * lto-streamer.h (enum LTO_tags): Add LTO_translation_unit_decl_ref.
+ * c-decl.c (all_translation_units): Remove.
+ (pop_scope): Use build_translation_unit_decl.
+ (collect_all_refs): Adjust.
+ (for_each_global_decl): Likewise.
+ (c_write_global_declarations): Likewise.
+
2010-09-16 Jakub Jelinek <jakub@redhat.com>
PR bootstrap/45686
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index 03836b5e644..6c65b27e004 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -118,12 +118,6 @@ static GTY(()) struct stmt_tree_s c_stmt_tree;
tree c_break_label;
tree c_cont_label;
-/* Linked list of TRANSLATION_UNIT_DECLS for the translation units
- included in this invocation. Note that the current translation
- unit is not included in this list. */
-
-static GTY(()) tree all_translation_units;
-
/* A list of decls to be made automatically visible in each file scope. */
static GTY(()) tree visible_builtins;
@@ -1072,10 +1066,7 @@ pop_scope (void)
context = current_function_decl;
else if (scope == file_scope)
{
- tree file_decl = build_decl (UNKNOWN_LOCATION,
- TRANSLATION_UNIT_DECL, 0, 0);
- DECL_CHAIN (file_decl) = all_translation_units;
- all_translation_units = file_decl;
+ tree file_decl = build_translation_unit_decl (NULL_TREE);
context = file_decl;
}
else
@@ -9664,8 +9655,9 @@ static void
collect_all_refs (const char *source_file)
{
tree t;
+ unsigned i;
- for (t = all_translation_units; t; t = TREE_CHAIN (t))
+ FOR_EACH_VEC_ELT (tree, all_translation_units, i, t)
collect_ada_nodes (BLOCK_VARS (DECL_INITIAL (t)), source_file);
}
@@ -9677,8 +9669,9 @@ for_each_global_decl (void (*callback) (tree decl))
tree t;
tree decls;
tree decl;
+ unsigned i;
- for (t = all_translation_units; t; t = TREE_CHAIN (t))
+ FOR_EACH_VEC_ELT (tree, all_translation_units, i, t)
{
decls = DECL_INITIAL (t);
for (decl = BLOCK_VARS (decls); decl; decl = TREE_CHAIN (decl))
@@ -9693,6 +9686,7 @@ void
c_write_global_declarations (void)
{
tree t;
+ unsigned i;
/* We don't want to do this if generating a PCH. */
if (pch_file)
@@ -9729,7 +9723,7 @@ c_write_global_declarations (void)
/* Process all file scopes in this compilation, and the external_scope,
through wrapup_global_declarations and check_global_declarations. */
- for (t = all_translation_units; t; t = DECL_CHAIN (t))
+ FOR_EACH_VEC_ELT (tree, all_translation_units, i, t)
c_write_global_declarations_1 (BLOCK_VARS (DECL_INITIAL (t)));
c_write_global_declarations_1 (BLOCK_VARS (ext_block));
@@ -9742,7 +9736,7 @@ c_write_global_declarations (void)
if (!seen_error ())
{
timevar_push (TV_SYMOUT);
- for (t = all_translation_units; t; t = DECL_CHAIN (t))
+ FOR_EACH_VEC_ELT (tree, all_translation_units, i, t)
c_write_global_declarations_2 (BLOCK_VARS (DECL_INITIAL (t)));
c_write_global_declarations_2 (BLOCK_VARS (ext_block));
timevar_pop (TV_SYMOUT);
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 2866cf949d1..4685dd4b4f2 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,8 @@
+2010-09-16 Richard Guenther <rguenther@suse.de>
+
+ * jcf-parse.c (current_file_list): Remove.
+ (java_parse_file): Use build_translation_unit_decl. Adjust.
+
2010-09-03 Joseph Myers <joseph@codesourcery.com>
* lang.opt (d): New.
diff --git a/gcc/java/jcf-parse.c b/gcc/java/jcf-parse.c
index cb486ae111e..908ed63e205 100644
--- a/gcc/java/jcf-parse.c
+++ b/gcc/java/jcf-parse.c
@@ -80,9 +80,6 @@ static GTY(()) tree parse_roots[2];
/* The METHOD_DECL for the current method. */
#define current_method parse_roots[1]
-/* A list of TRANSLATION_UNIT_DECLs for the files to be compiled. */
-static GTY(()) VEC(tree,gc) *current_file_list;
-
/* Line 0 in current file, if compiling from bytecode. */
static location_t file_start_location;
@@ -1840,9 +1837,7 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
duplicate_class_warning (IDENTIFIER_POINTER (node));
else
{
- tree file_decl = build_decl (input_location,
- TRANSLATION_UNIT_DECL, node, NULL);
- VEC_safe_push (tree, gc, current_file_list, file_decl);
+ build_translation_unit_decl (node);
IS_A_COMMAND_LINE_FILENAME_P (node) = 1;
}
}
@@ -1860,16 +1855,18 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
const char *resource_filename;
/* Only one resource file may be compiled at a time. */
- assert (VEC_length (tree, current_file_list) == 1);
+ assert (VEC_length (tree, all_translation_units) == 1);
- resource_filename = IDENTIFIER_POINTER (DECL_NAME (VEC_index (tree, current_file_list, 0)));
+ resource_filename
+ = IDENTIFIER_POINTER
+ (DECL_NAME (VEC_index (tree, all_translation_units, 0)));
compile_resource_file (resource_name, resource_filename);
goto finish;
}
current_jcf = main_jcf;
- FOR_EACH_VEC_ELT (tree, current_file_list, ix, node)
+ FOR_EACH_VEC_ELT (tree, all_translation_units, ix, node)
{
unsigned char magic_string[4];
char *real_path;
@@ -1956,7 +1953,7 @@ java_parse_file (int set_yydebug ATTRIBUTE_UNUSED)
}
}
- FOR_EACH_VEC_ELT (tree, current_file_list, ix, node)
+ FOR_EACH_VEC_ELT (tree, all_translation_units, ix, node)
{
input_location = DECL_SOURCE_LOCATION (node);
if (CLASS_FILE_P (node))
diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c
index fec9833fa8b..83315e86d1b 100644
--- a/gcc/lto-streamer-in.c
+++ b/gcc/lto-streamer-in.c
@@ -355,6 +355,7 @@ lto_input_tree_ref (struct lto_input_block *ib, struct data_in *data_in,
case LTO_const_decl_ref:
case LTO_imported_decl_ref:
case LTO_label_decl_ref:
+ case LTO_translation_unit_decl_ref:
ix_u = lto_input_uleb128 (ib);
result = lto_file_decl_data_get_var_decl (data_in->file_data, ix_u);
break;
@@ -1683,6 +1684,13 @@ unpack_ts_block_value_fields (struct bitpack_d *bp, tree expr)
BLOCK_NUMBER (expr) = (unsigned) bp_unpack_value (bp, 31);
}
+/* Unpack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL
+ structure of expression EXPR from bitpack BP. */
+
+static void
+unpack_ts_translation_unit_decl_value_fields (struct bitpack_d *bp ATTRIBUTE_UNUSED, tree expr ATTRIBUTE_UNUSED)
+{
+}
/* Unpack all the non-pointer fields in EXPR into a bit pack. */
@@ -1738,6 +1746,9 @@ unpack_value_fields (struct bitpack_d *bp, tree expr)
/* This is only used by High GIMPLE. */
gcc_unreachable ();
}
+
+ if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
+ unpack_ts_translation_unit_decl_value_fields (bp, expr);
}
@@ -2223,6 +2234,17 @@ lto_input_ts_target_option (struct lto_input_block *ib, tree expr)
fatal_error ("cl_target_option size mismatch in LTO reader and writer");
}
+/* Input a TS_TRANSLATION_UNIT_DECL tree from IB and DATA_IN into EXPR. */
+
+static void
+lto_input_ts_translation_unit_decl_tree_pointers (struct lto_input_block *ib,
+ struct data_in *data_in,
+ tree expr)
+{
+ TRANSLATION_UNIT_LANGUAGE (expr) = input_string (data_in, ib);
+ VEC_safe_push (tree, gc, all_translation_units, expr);
+}
+
/* Helper for lto_input_tree. Read all pointer fields in EXPR from
input block IB. DATA_IN contains tables and descriptors for the
file being read. */
@@ -2308,6 +2330,9 @@ lto_input_tree_pointers (struct lto_input_block *ib, struct data_in *data_in,
if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
lto_input_ts_target_option (ib, expr);
+
+ if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
+ lto_input_ts_translation_unit_decl_tree_pointers (ib, data_in, expr);
}
diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c
index d7925268622..addf2c05ad8 100644
--- a/gcc/lto-streamer-out.c
+++ b/gcc/lto-streamer-out.c
@@ -533,6 +533,13 @@ pack_ts_block_value_fields (struct bitpack_d *bp, tree expr)
bp_pack_value (bp, BLOCK_NUMBER (expr), 31);
}
+/* Pack all the non-pointer fields of the TS_TRANSLATION_UNIT_DECL structure
+ of expression EXPR into bitpack BP. */
+
+static void
+pack_ts_translation_unit_decl_value_fields (struct bitpack_d *bp ATTRIBUTE_UNUSED, tree expr ATTRIBUTE_UNUSED)
+{
+}
/* Pack all the non-pointer fields in EXPR into a bit pack. */
@@ -588,6 +595,9 @@ pack_value_fields (struct bitpack_d *bp, tree expr)
/* This is only used by High GIMPLE. */
gcc_unreachable ();
}
+
+ if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
+ pack_ts_translation_unit_decl_value_fields (bp, expr);
}
@@ -721,6 +731,11 @@ lto_output_tree_ref (struct output_block *ob, tree expr)
lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
break;
+ case TRANSLATION_UNIT_DECL:
+ output_record_start (ob, LTO_translation_unit_decl_ref);
+ lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
+ break;
+
default:
/* No other node is indexable, so it should have been handled
by lto_output_tree. */
@@ -1127,6 +1142,15 @@ lto_output_ts_target_option (struct output_block *ob, tree expr)
lto_output_bitpack (&bp);
}
+/* Write a TS_TRANSLATION_UNIT_DECL tree in EXPR to OB. */
+
+static void
+lto_output_ts_translation_unit_decl_tree_pointers (struct output_block *ob,
+ tree expr)
+{
+ output_string (ob, ob->main_stream, TRANSLATION_UNIT_LANGUAGE (expr));
+}
+
/* Helper for lto_output_tree. Write all pointer fields in EXPR to output
block OB. If REF_P is true, the leaves of EXPR are emitted as
references. */
@@ -1209,6 +1233,9 @@ lto_output_tree_pointers (struct output_block *ob, tree expr, bool ref_p)
if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
lto_output_ts_target_option (ob, expr);
+
+ if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
+ lto_output_ts_translation_unit_decl_tree_pointers (ob, expr);
}
diff --git a/gcc/lto-streamer.c b/gcc/lto-streamer.c
index 27b7e560508..dba9d2d5dd7 100644
--- a/gcc/lto-streamer.c
+++ b/gcc/lto-streamer.c
@@ -303,6 +303,7 @@ check_handled_ts_structures (void)
handled_p[TS_OMP_CLAUSE] = true;
handled_p[TS_OPTIMIZATION] = true;
handled_p[TS_TARGET_OPTION] = true;
+ handled_p[TS_TRANSLATION_UNIT_DECL] = true;
/* Anything not marked above will trigger the following assertion.
If this assertion triggers, it means that there is a new TS_*
diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h
index 35a0a9b1a00..e082ffe1a0b 100644
--- a/gcc/lto-streamer.h
+++ b/gcc/lto-streamer.h
@@ -235,6 +235,7 @@ enum LTO_tags
LTO_type_ref,
LTO_const_decl_ref,
LTO_imported_decl_ref,
+ LTO_translation_unit_decl_ref,
LTO_global_decl_ref, /* Do not change. */
/* This tag must always be last. */
diff --git a/gcc/tree.c b/gcc/tree.c
index fd593e39ebd..7746628375d 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -294,6 +294,8 @@ tree_node_structure_for_code (enum tree_code code)
return TS_TYPE_DECL;
case FUNCTION_DECL:
return TS_FUNCTION_DECL;
+ case TRANSLATION_UNIT_DECL:
+ return TS_TRANSLATION_UNIT_DECL;
default:
return TS_DECL_NON_COMMON;
}
@@ -464,6 +466,10 @@ initialize_tree_contains_struct (void)
MARK_TS_DECL_NON_COMMON (code);
break;
+ case TS_TRANSLATION_UNIT_DECL:
+ MARK_TS_DECL_COMMON (code);
+ break;
+
default:
gcc_unreachable ();
}
@@ -471,7 +477,6 @@ initialize_tree_contains_struct (void)
/* Basic consistency checks for attributes used in fold. */
gcc_assert (tree_contains_struct[FUNCTION_DECL][TS_DECL_NON_COMMON]);
- gcc_assert (tree_contains_struct[TRANSLATION_UNIT_DECL][TS_DECL_NON_COMMON]);
gcc_assert (tree_contains_struct[TYPE_DECL][TS_DECL_NON_COMMON]);
gcc_assert (tree_contains_struct[CONST_DECL][TS_DECL_COMMON]);
gcc_assert (tree_contains_struct[VAR_DECL][TS_DECL_COMMON]);
@@ -500,7 +505,6 @@ initialize_tree_contains_struct (void)
gcc_assert (tree_contains_struct[VAR_DECL][TS_DECL_WITH_VIS]);
gcc_assert (tree_contains_struct[FUNCTION_DECL][TS_DECL_WITH_VIS]);
gcc_assert (tree_contains_struct[TYPE_DECL][TS_DECL_WITH_VIS]);
- gcc_assert (tree_contains_struct[TRANSLATION_UNIT_DECL][TS_DECL_WITH_VIS]);
gcc_assert (tree_contains_struct[VAR_DECL][TS_VAR_DECL]);
gcc_assert (tree_contains_struct[FIELD_DECL][TS_FIELD_DECL]);
gcc_assert (tree_contains_struct[PARM_DECL][TS_PARM_DECL]);
@@ -4034,6 +4038,21 @@ build_fn_decl (const char *name, tree type)
return decl;
}
+VEC(tree,gc) *all_translation_units;
+
+/* Builds a new translation-unit decl with name NAME, queues it in the
+ global list of translation-unit decls and returns it. */
+
+tree
+build_translation_unit_decl (tree name)
+{
+ tree tu = build_decl (UNKNOWN_LOCATION, TRANSLATION_UNIT_DECL,
+ name, NULL_TREE);
+ TRANSLATION_UNIT_LANGUAGE (tu) = lang_hooks.name;
+ VEC_safe_push (tree, gc, all_translation_units, tu);
+ return tu;
+}
+
/* BLOCK nodes are used to represent the structure of binding contours
and declarations, once those contours have been exited and their contents
diff --git a/gcc/tree.h b/gcc/tree.h
index d261c3fffef..1ff9d35effa 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -3385,6 +3385,23 @@ struct GTY(()) tree_function_decl {
/* 3 bits left */
};
+/* The source language of the translation-unit. */
+#define TRANSLATION_UNIT_LANGUAGE(NODE) \
+ (TRANSLATION_UNIT_DECL_CHECK (NODE)->translation_unit_decl.language)
+
+/* TRANSLATION_UNIT_DECL inherits from DECL_MINIMAL. */
+
+struct GTY(()) tree_translation_unit_decl {
+ struct tree_decl_common common;
+ /* Source language of this translation unit. Used for DWARF output. */
+ const char * GTY((skip(""))) language;
+ /* TODO: Non-optimization used to build this translation unit. */
+ /* TODO: Root of a partial DWARF tree for global types and decls. */
+};
+
+/* A vector of all translation-units. */
+extern GTY (()) VEC(tree,gc) *all_translation_units;
+
/* For a TYPE_DECL, holds the "original" type. (TREE_TYPE has the copy.) */
#define DECL_ORIGINAL_TYPE(NODE) \
(TYPE_DECL_CHECK (NODE)->decl_non_common.result)
@@ -3490,6 +3507,8 @@ union GTY ((ptr_alias (union lang_tree_node),
struct tree_const_decl GTY ((tag ("TS_CONST_DECL"))) const_decl;
struct tree_type_decl GTY ((tag ("TS_TYPE_DECL"))) type_decl;
struct tree_function_decl GTY ((tag ("TS_FUNCTION_DECL"))) function_decl;
+ struct tree_translation_unit_decl GTY ((tag ("TS_TRANSLATION_UNIT_DECL")))
+ translation_unit_decl;
struct tree_type GTY ((tag ("TS_TYPE"))) type;
struct tree_list GTY ((tag ("TS_LIST"))) list;
struct tree_vec GTY ((tag ("TS_VEC"))) vec;
@@ -4048,6 +4067,7 @@ extern tree build_decl_stat (location_t, enum tree_code,
tree, tree MEM_STAT_DECL);
extern tree build_fn_decl (const char *, tree);
#define build_decl(l,c,t,q) build_decl_stat (l,c,t,q MEM_STAT_INFO)
+extern tree build_translation_unit_decl (tree);
extern tree build_block (tree, tree, tree, tree);
extern tree build_empty_stmt (location_t);
extern tree build_omp_clause (location_t, enum omp_clause_code);
diff --git a/gcc/treestruct.def b/gcc/treestruct.def
index af7c80956b3..89f36f2ab13 100644
--- a/gcc/treestruct.def
+++ b/gcc/treestruct.def
@@ -52,6 +52,7 @@ DEFTREESTRUCT(TS_RESULT_DECL, "result decl")
DEFTREESTRUCT(TS_CONST_DECL, "const decl")
DEFTREESTRUCT(TS_TYPE_DECL, "label decl")
DEFTREESTRUCT(TS_FUNCTION_DECL, "function decl")
+DEFTREESTRUCT(TS_TRANSLATION_UNIT_DECL, "translation-unit decl")
DEFTREESTRUCT(TS_TYPE, "type")
DEFTREESTRUCT(TS_LIST, "list")
DEFTREESTRUCT(TS_VEC, "vec")