[Ada] Preliminary work in improving dwarf2 support
Arnaud Charlet
charlet@adacore.com
Wed Feb 15 10:06:00 GMT 2006
Tested on i686-linux, committed on trunk
Preparatory work to improve the DWARF information emitted by GNAT to
debug Ada code.
2006-02-13 Nicolas Setton <setton@adacore.com>
* adadecode.h, adadecode.c: (__gnat_decode): Improve support of types.
(get_encoding): New subprogram. Extracts the encodings from an encoded
Ada name.
-------------- next part --------------
Index: adadecode.h
===================================================================
--- adadecode.h (revision 110833)
+++ adadecode.h (working copy)
@@ -6,7 +6,7 @@
* *
* C Header File *
* *
- * Copyright (C) 2001-2003, Free Software Foundation, Inc. *
+ * Copyright (C) 2001-2006, Free Software Foundation, Inc. *
* *
* GNAT is free software; you can redistribute it and/or modify it under *
* terms of the GNU General Public License as published by the Free Soft- *
@@ -33,8 +33,8 @@
/* This function will return the Ada name from the encoded form.
The Ada coding is done in exp_dbug.ads and this is the inverse function.
see exp_dbug.ads for full encoding rules, a short description is added
- below. Right now only objects and routines are handled. There is no support
- for Ada types.
+ below. Objects and routines are fully handled; types are stripped of their
+ encodings.
CODED_NAME is the encoded entity name.
ADA_NAME is a pointer to a buffer, it will receive the Ada name. A safe
@@ -44,6 +44,10 @@
added at the end of the Ada name and surrounded by ( and ). */
extern void __gnat_decode (const char *, char *, int);
+/* This function will return the GNAT encodings, in a colon-separated list,
+ from the encoded form. The Ada encodings are described in exp_dbug.ads. */
+extern void get_encoding (const char *, char *);
+
/* ada_demangle is added for COMPATIBILITY ONLY. It has the name of the
function used in the binutils and GDB. Always consider using __gnat_decode
instead of ada_demangle. Caller must free the pointer returned. */
Index: adadecode.c
===================================================================
--- adadecode.c (revision 110833)
+++ adadecode.c (working copy)
@@ -6,7 +6,7 @@
* *
* C Implementation File *
* *
- * Copyright (C) 2001-2003, Free Software Foundation, Inc. *
+ * Copyright (C) 2001-2006, Free Software Foundation, Inc. *
* *
* GNAT is free software; you can redistribute it and/or modify it under *
* terms of the GNU General Public License as published by the Free Soft- *
@@ -98,8 +98,8 @@
/* This function will return the Ada name from the encoded form.
The Ada coding is done in exp_dbug.ads and this is the inverse function.
see exp_dbug.ads for full encoding rules, a short description is added
- below. Right now only objects and routines are handled. There is no support
- for Ada types.
+ below. Right now only objects and routines are handled. Ada types are
+ stripped of their encodings.
CODED_NAME is the encoded entity name.
@@ -159,6 +159,18 @@
else
strcpy (ada_name, coded_name);
+ /* Check for the first triple underscore in the name. This indicates
+ that the name represents a type with encodings; in this case, we
+ need to strip the encodings. */
+ {
+ char *encodings;
+
+ if ((encodings = (char *) strstr (ada_name, "___")) != NULL)
+ {
+ *encodings = '\0';
+ }
+ }
+
/* Check for task body. */
if (has_suffix (ada_name, "TKB"))
{
@@ -321,3 +333,43 @@
__gnat_decode (coded_name, ada_name, 0);
return xstrdup (ada_name);
}
+
+void
+get_encoding (const char *coded_name, char *encoding)
+{
+ char * dest_index = encoding;
+ const char *p;
+ int found = 0;
+ int count = 0;
+
+ /* The heuristics is the following: we assume that the first triple
+ underscore in an encoded name indicates the beginning of the
+ first encoding, and that subsequent triple underscores indicate
+ the next encodings. We assume that the encodings are always at the
+ end of encoded names. */
+
+ for (p = coded_name; *p != '\0'; p++)
+ {
+ if (*p != '_')
+ count = 0;
+ else
+ if (++count == 3)
+ {
+ count = 0;
+
+ if (found)
+ {
+ dest_index = dest_index - 2;
+ *dest_index++ = ':';
+ }
+
+ p++;
+ found = 1;
+ }
+
+ if (found)
+ *dest_index++ = *p;
+ }
+
+ *dest_index = '\0';
+}
More information about the Gcc-patches
mailing list