This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
PATCH: Read Dwarf2 info from Pascal (second try)
- From: Waldek Hebisch <hebisch at math dot uni dot wroc dot pl>
- To: gdb-patches at sources dot redhat dot com
- Date: Mon, 23 May 2005 04:11:23 +0200 (CEST)
- Subject: PATCH: Read Dwarf2 info from Pascal (second try)
Original patch with comments:
http://sources.redhat.com/ml/gdb-patches/2005-05/msg00278.html
As I wrote, unpatched GDB is unable to read DWARF2 debug info from
most Pascal programs: it gets stuck trying to read info about sets.
Extra comment about `determine_prefix': if the compiler emits debug
info about namespaces returning NULL from `determine_prefix' is
likely to cause crash later (it caused crash for Pascal), so
`determine_prefix' should probably allow all languages using modules
(like Modula2 and Ada).
ChangeLog:
2005-05-22 Waldek Hebisch <hebisch@math.uni.wroc.pl>
* dwarf2read.c: Add Pascal support:
(read_set_type): New function.
(process_die): Use it.
(read_type_die): Use it.
(set_cu_language): For Pascal set language to `language_pascal'.
(determine_prefix): Allow namespaces for Pascal
--- src.orig/gdb/dwarf2read.c Mon May 23 03:13:51 2005
+++ src/gdb/dwarf2read.c Mon May 23 03:14:13 2005
@@ -920,6 +920,8 @@
static void read_enumeration_type (struct die_info *, struct dwarf2_cu *);
+static void read_set_type (struct die_info *, struct dwarf2_cu *);
+
static void process_enumeration_scope (struct die_info *, struct dwarf2_cu *);
static struct type *dwarf_base_type (int, int, struct dwarf2_cu *);
@@ -2657,6 +2659,9 @@
read_enumeration_type (die, cu);
process_enumeration_scope (die, cu);
break;
+ case DW_TAG_set_type:
+ read_set_type (die, cu);
+ break;
/* FIXME drow/2004-03-14: These initialize die->type, but do not create
a symbol or process any children. Therefore it doesn't do anything
@@ -4018,6 +4023,20 @@
return new_prefix;
}
+static void
+read_set_type (struct die_info * die, struct dwarf2_cu *cu)
+{
+ struct type *domain_type;
+
+ /* Return if we've already decoded this type. */
+ if (die->type)
+ return;
+
+ domain_type = die_type (die, cu);
+ die->type = create_set_type (NULL, domain_type);
+}
+
+
/* Given a pointer to a die which begins an enumeration, process all
the dies that define the members of the enumeration, and create the
symbol for the enumeration type.
@@ -6103,9 +6122,11 @@
case DW_LANG_Ada95:
cu->language = language_ada;
break;
+ case DW_LANG_Pascal83:
+ cu->language = language_pascal;
+ break;
case DW_LANG_Cobol74:
case DW_LANG_Cobol85:
- case DW_LANG_Pascal83:
case DW_LANG_Modula2:
default:
cu->language = language_minimal;
@@ -6894,6 +6915,7 @@
case DW_TAG_structure_type:
case DW_TAG_union_type:
case DW_TAG_enumeration_type:
+ case DW_TAG_set_type:
SYMBOL_CLASS (sym) = LOC_TYPEDEF;
SYMBOL_DOMAIN (sym) = STRUCT_DOMAIN;
@@ -7215,6 +7237,9 @@
case DW_TAG_enumeration_type:
read_enumeration_type (die, cu);
break;
+ case DW_TAG_set_type:
+ read_set_type (die, cu);
+ break;
case DW_TAG_subprogram:
case DW_TAG_subroutine_type:
read_subroutine_type (die, cu);
@@ -7272,7 +7297,8 @@
struct die_info *parent;
if (cu->language != language_cplus
- && cu->language != language_java)
+ && cu->language != language_java
+ && cu->language != language_pascal)
return NULL;
parent = die->parent;
--
Waldek Hebisch
hebisch@math.uni.wroc.pl