aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierre-Marie de Rodat <derodat@adacore.com>2015-06-11 12:40:10 +0000
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>2015-06-11 12:40:10 +0000
commit881a5e608a945bebcfbefcf8c521a2e481610789 (patch)
treef7c9d03a32db11d1b9f07488e40eac40beba11a8
parentf13c4673a54c76a1c92018d630f48126349732b0 (diff)
downloadgcc-881a5e608a945bebcfbefcf8c521a2e481610789.zip
gcc-881a5e608a945bebcfbefcf8c521a2e481610789.tar.gz
gcc-881a5e608a945bebcfbefcf8c521a2e481610789.tar.bz2
Restore DW_AT_abstract_origin for cross-unit call sites
PR debug/66503 gcc/ChangeLog: * debug.h (struct gcc_debug_hooks): Add a register_main_translation_unit hook. * debug.c (do_nothing_debug_hooks): Provide a function for this new hook. * dbxout.c (dbx_debug_hooks): Likewise. * sdbout.c (sdb_debug_hooks): Likewise. * vmsdbgout.c (vmsdbg_debug_hooks): Likewise. * dwarf2out.c (main_translation_unit): New global variable. (dwarf2out_register_main_translation_unit): New function implementing the new hook. (dwarf2_debug_hooks): Assign dwarf2out_register_main_translation_unit to this new hook. (dwarf2out_init): Associate any main translation unit to comp_unit_die (). * c/c-decl.c (pop_scope): Register the main translation unit through the new debug hook. * cp/decl.c (cxx_init_decl_processing): Likewise. gcc/ada/ChangeLog: * gcc-interface/utils.c (get_global_context): Register the main translation unit through the new debug hook. gcc/fortran/ChangeLog: * f95-lang.c (gfc_create_decls): Register the main translation unit through the new debug hook. From-SVN: r224371
-rw-r--r--gcc/ChangeLog20
-rw-r--r--gcc/ada/ChangeLog5
-rw-r--r--gcc/ada/gcc-interface/utils.c5
-rw-r--r--gcc/c/c-decl.c1
-rw-r--r--gcc/cp/decl.c2
-rw-r--r--gcc/dbxout.c1
-rw-r--r--gcc/debug.c1
-rw-r--r--gcc/debug.h4
-rw-r--r--gcc/dwarf2out.c27
-rw-r--r--gcc/fortran/ChangeLog5
-rw-r--r--gcc/fortran/f95-lang.c1
-rw-r--r--gcc/sdbout.c1
-rw-r--r--gcc/vmsdbgout.c1
13 files changed, 73 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6327ef5..902f708 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,23 @@
+2015-06-11 Pierre-Marie de Rodat <derodat@adacore.com>
+
+ * debug.h (struct gcc_debug_hooks): Add a
+ register_main_translation_unit hook.
+ * debug.c (do_nothing_debug_hooks): Provide a function for this
+ new hook.
+ * dbxout.c (dbx_debug_hooks): Likewise.
+ * sdbout.c (sdb_debug_hooks): Likewise.
+ * vmsdbgout.c (vmsdbg_debug_hooks): Likewise.
+ * dwarf2out.c (main_translation_unit): New global variable.
+ (dwarf2out_register_main_translation_unit): New function
+ implementing the new hook.
+ (dwarf2_debug_hooks): Assign
+ dwarf2out_register_main_translation_unit to this new hook.
+ (dwarf2out_init): Associate any main translation unit to
+ comp_unit_die ().
+ * c/c-decl.c (pop_scope): Register the main translation unit
+ through the new debug hook.
+ * cp/decl.c (cxx_init_decl_processing): Likewise.
+
2015-06-11 Marek Polacek <polacek@redhat.com>
* match.pd ((x & y) ^ (x | y) -> x ^ y): New pattern.
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index ad509e0..4eeb13e 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,8 @@
+2015-06-11 Pierre-Marie de Rodat <derodat@adacore.com>
+
+ * gcc-interface/utils.c (get_global_context): Register the main
+ translation unit through the new debug hook.
+
2015-06-09 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/misc.c: Remove duplicate include directives.
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index 9076529..655bfa1 100644
--- a/gcc/ada/gcc-interface/utils.c
+++ b/gcc/ada/gcc-interface/utils.c
@@ -667,7 +667,10 @@ static tree
get_global_context (void)
{
if (!global_context)
- global_context = build_translation_unit_decl (NULL_TREE);
+ {
+ global_context = build_translation_unit_decl (NULL_TREE);
+ debug_hooks->register_main_translation_unit (global_context);
+ }
return global_context;
}
diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c
index 7fd662d..3fde22f 100644
--- a/gcc/c/c-decl.c
+++ b/gcc/c/c-decl.c
@@ -1196,6 +1196,7 @@ pop_scope (void)
{
tree file_decl = build_translation_unit_decl (NULL_TREE);
context = file_decl;
+ debug_hooks->register_main_translation_unit (file_decl);
}
else
context = block;
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 3bed538..ffd068a 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -3831,6 +3831,8 @@ cxx_init_decl_processing (void)
global_namespace = build_lang_decl (NAMESPACE_DECL, global_scope_name,
void_type_node);
DECL_CONTEXT (global_namespace) = build_translation_unit_decl (NULL_TREE);
+ debug_hooks->register_main_translation_unit
+ (DECL_CONTEXT (global_namespace));
TREE_PUBLIC (global_namespace) = 1;
begin_scope (sk_namespace, global_namespace);
diff --git a/gcc/dbxout.c b/gcc/dbxout.c
index 48b5065..94fac42 100644
--- a/gcc/dbxout.c
+++ b/gcc/dbxout.c
@@ -380,6 +380,7 @@ const struct gcc_debug_hooks dbx_debug_hooks =
debug_nothing_tree, /* begin_function */
#endif
debug_nothing_int, /* end_function */
+ debug_nothing_tree, /* register_main_translation_unit */
dbxout_function_decl,
dbxout_early_global_decl, /* early_global_decl */
dbxout_late_global_decl, /* late_global_decl */
diff --git a/gcc/debug.c b/gcc/debug.c
index 9c621f8..ab92cc8 100644
--- a/gcc/debug.c
+++ b/gcc/debug.c
@@ -46,6 +46,7 @@ const struct gcc_debug_hooks do_nothing_debug_hooks =
debug_nothing_int_charstar, /* end_epilogue */
debug_nothing_tree, /* begin_function */
debug_nothing_int, /* end_function */
+ debug_nothing_tree, /* register_main_translation_unit */
debug_nothing_tree, /* function_decl */
debug_nothing_tree, /* early_global_decl */
debug_nothing_tree, /* late_global_decl */
diff --git a/gcc/debug.h b/gcc/debug.h
index e7e1334..269c4d8 100644
--- a/gcc/debug.h
+++ b/gcc/debug.h
@@ -89,6 +89,10 @@ struct gcc_debug_hooks
/* Record end of function. LINE is highest line number in function. */
void (* end_function) (unsigned int line);
+ /* Register UNIT as the main translation unit. Called from front-ends when
+ they create their main translation unit. */
+ void (* register_main_translation_unit) (tree);
+
/* Debug information for a function DECL. This might include the
function name (a symbol), its parameters, and the block that
makes up the function's body, and the local variables of the
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index ee2bcb1..8a36fe8 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -2446,6 +2446,7 @@ static void dwarf2out_abstract_function (tree);
static void dwarf2out_var_location (rtx_insn *);
static void dwarf2out_begin_function (tree);
static void dwarf2out_end_function (unsigned int);
+static void dwarf2out_register_main_translation_unit (tree unit);
static void dwarf2out_set_name (tree, tree);
/* The debug hooks structure. */
@@ -2475,6 +2476,7 @@ const struct gcc_debug_hooks dwarf2_debug_hooks =
dwarf2out_end_epilogue,
dwarf2out_begin_function,
dwarf2out_end_function, /* end_function */
+ dwarf2out_register_main_translation_unit,
dwarf2out_function_decl, /* function_decl */
dwarf2out_early_global_decl,
dwarf2out_late_global_decl,
@@ -22505,6 +22507,26 @@ dwarf2out_end_function (unsigned int)
maybe_at_text_label_p = false;
}
+/* Temporary holder for dwarf2out_register_main_translation_unit. Used to let
+ front-ends register a translation unit even before dwarf2out_init is
+ called. */
+static tree main_translation_unit = NULL_TREE;
+
+/* Hook called by front-ends after they built their main translation unit.
+ Associate comp_unit_die to UNIT. */
+
+static void
+dwarf2out_register_main_translation_unit (tree unit)
+{
+ gcc_assert (TREE_CODE (unit) == TRANSLATION_UNIT_DECL
+ && main_translation_unit == NULL_TREE);
+ main_translation_unit = unit;
+ /* If dwarf2out_init has not been called yet, it will perform the association
+ itself looking at main_translation_unit. */
+ if (decl_die_table != NULL)
+ equate_decl_number_to_die (unit, comp_unit_die ());
+}
+
/* Add OPCODE+VAL as an entry at the end of the opcode array in TABLE. */
static void
@@ -23242,6 +23264,11 @@ dwarf2out_init (const char *filename ATTRIBUTE_UNUSED)
/* Make sure the line number table for .text always exists. */
text_section_line_info = new_line_info_table ();
text_section_line_info->end_label = text_end_label;
+
+ /* If front-ends already registered a main translation unit but we were not
+ ready to perform the association, do this now. */
+ if (main_translation_unit != NULL_TREE)
+ equate_decl_number_to_die (main_translation_unit, comp_unit_die ());
}
/* Called before compile () starts outputtting functions, variables
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index d77cc1a..57a9997 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,8 @@
+2015-06-11 Pierre-Marie de Rodat <derodat@adacore.com>
+
+ * f95-lang.c (gfc_create_decls): Register the main translation unit
+ through the new debug hook.
+
2015-06-08 Andrew MacLeod <amacleod@redhat.com>
* convert.c : Adjust include files.
diff --git a/gcc/fortran/f95-lang.c b/gcc/fortran/f95-lang.c
index 6daac83..2c055f5 100644
--- a/gcc/fortran/f95-lang.c
+++ b/gcc/fortran/f95-lang.c
@@ -204,6 +204,7 @@ gfc_create_decls (void)
/* Build our translation-unit decl. */
current_translation_unit = build_translation_unit_decl (NULL_TREE);
+ debug_hooks->register_main_translation_unit (current_translation_unit);
}
diff --git a/gcc/sdbout.c b/gcc/sdbout.c
index f5671c6..033886a 100644
--- a/gcc/sdbout.c
+++ b/gcc/sdbout.c
@@ -296,6 +296,7 @@ const struct gcc_debug_hooks sdb_debug_hooks =
sdbout_end_epilogue, /* end_epilogue */
sdbout_begin_function, /* begin_function */
sdbout_end_function, /* end_function */
+ debug_nothing_tree, /* register_main_translation_unit */
debug_nothing_tree, /* function_decl */
sdbout_early_global_decl, /* early_global_decl */
sdbout_late_global_decl, /* late_global_decl */
diff --git a/gcc/vmsdbgout.c b/gcc/vmsdbgout.c
index 8297e02..8c917e0 100644
--- a/gcc/vmsdbgout.c
+++ b/gcc/vmsdbgout.c
@@ -194,6 +194,7 @@ const struct gcc_debug_hooks vmsdbg_debug_hooks
vmsdbgout_end_epilogue,
vmsdbgout_begin_function,
vmsdbgout_end_function,
+ debug_nothing_tree, /* register_main_translation_unit */
vmsdbgout_function_decl,
vmsdbgout_early_global_decl,
vmsdbgout_late_global_decl,