aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/trans.c
diff options
context:
space:
mode:
authorNicolas Setton <setton@adacore.com>2008-06-06 21:36:28 +0000
committerOlivier Hainque <hainque@gcc.gnu.org>2008-06-06 21:36:28 +0000
commit081a52ed5221b9fe0280f80b3646c6118eb3ed1c (patch)
tree92a62fd35271bf3f29e34745397c5bfee0abfb25 /gcc/ada/trans.c
parente919209b4eb54e6f731510475c4b8ed64c23140e (diff)
downloadgcc-081a52ed5221b9fe0280f80b3646c6118eb3ed1c.zip
gcc-081a52ed5221b9fe0280f80b3646c6118eb3ed1c.tar.gz
gcc-081a52ed5221b9fe0280f80b3646c6118eb3ed1c.tar.bz2
ada-tree.h (DECL_PARALLEL_TYPE): New language specific attribute...
2008-06-06 Nicolas Setton <setton@adacore.com> Olivier Hainque <hainque@adacore.com> * ada-tree.h (DECL_PARALLEL_TYPE): New language specific attribute, parallel descriptive type attached to another type for debug info generation purposes. * utils.c (add_parallel_type): New function, register parallel type to be attached to a type. (get_parallel_type): New function, fetch a registered parallel type, if any. (rest_of_record_type_compilation): Register the parallel type we make for variable size records. * gigi.h (add_parallel_type, get_parallel_type): Declare. * decl.c (gnat_to_gnu_entity, maybe_pad_type): Register the parallel debug types we make. * trans.c (extract_encoding, decode_name): New functions. (gigi): If the DWARF attribute extensions are available, setup to use them. * lang.opt: Register language specific processing request for -gdwarf+. * misc.c (gnat_dwarf_extensions): New global variable. How much do we want of our DWARF extensions. 0 by default. (gnat_handle_option) <OPT_gdwarf_>: Increment gnat_dwarf_extensions. (gnat_post_options): Map gnat_dwarf_extensions to the common use_gnu_debug_info_extensions for later processing. Co-Authored-By: Olivier Hainque <hainque@adacore.com> From-SVN: r136506
Diffstat (limited to 'gcc/ada/trans.c')
-rw-r--r--gcc/ada/trans.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/gcc/ada/trans.c b/gcc/ada/trans.c
index dda85c5..fd69b3e 100644
--- a/gcc/ada/trans.c
+++ b/gcc/ada/trans.c
@@ -56,6 +56,10 @@
#include "einfo.h"
#include "ada-tree.h"
#include "gigi.h"
+#include "adadecode.h"
+
+#include "dwarf2.h"
+#include "dwarf2out.h"
/* We should avoid allocating more than ALLOCA_THRESHOLD bytes via alloca,
for fear of running out of stack space. If we need more, we use xmalloc
@@ -211,6 +215,11 @@ static tree gnat_stabilize_reference (tree, bool);
static tree gnat_stabilize_reference_1 (tree, bool);
static void set_expr_location_from_node (tree, Node_Id);
static int lvalue_required_p (Node_Id, tree, int);
+
+/* Hooks for debug info back-ends, only supported and used in a restricted set
+ of configurations. */
+static const char *extract_encoding (const char *) ATTRIBUTE_UNUSED;
+static const char *decode_name (const char *) ATTRIBUTE_UNUSED;
/* This is the main program of the back-end. It sets up all the table
structures and then generates code. */
@@ -282,6 +291,18 @@ gigi (Node_Id gnat_root, int max_gnat_node, int number_name,
TYPE_SIZE_UNIT (void_type_node) = size_zero_node;
}
+ /* If the GNU type extensions to DWARF are available, setup the hooks. */
+#if defined (DWARF2_DEBUGGING_INFO) && defined (DWARF2_GNU_TYPE_EXTENSIONS)
+ /* We condition the name demangling and the generation of type encoding
+ strings on -gdwarf+ and always set descriptive types on. */
+ if (use_gnu_debug_info_extensions)
+ {
+ dwarf2out_set_type_encoding_func (extract_encoding);
+ dwarf2out_set_demangle_name_func (decode_name);
+ }
+ dwarf2out_set_descriptive_type_func (get_parallel_type);
+#endif
+
/* Enable GNAT stack checking method if needed */
if (!Stack_Check_Probes_On_Target)
set_stack_check_libfunc (gen_rtx_SYMBOL_REF (Pmode, "_gnat_stack_check"));
@@ -6895,6 +6916,31 @@ set_expr_location_from_node (tree node, Node_Id gnat_node)
set_expr_location (node, locus);
}
+/* Return a colon-separated list of encodings contained in encoded Ada
+ name. */
+
+static const char *
+extract_encoding (const char *name)
+{
+ char *encoding = ggc_alloc (strlen (name));
+
+ get_encoding (name, encoding);
+
+ return encoding;
+}
+
+/* Extract the Ada name from an encoded name. */
+
+static const char *
+decode_name (const char *name)
+{
+ char *decoded = ggc_alloc (strlen (name) * 2 + 60);
+
+ __gnat_decode (name, decoded, 0);
+
+ return decoded;
+}
+
/* Post an error message. MSG is the error message, properly annotated.
NODE is the node at which to post the error and the node to use for the
"&" substitution. */