Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Mihail Zenkov <mihail.zenkov@gmail.com>
To: tromey@redhat.com
Cc: Mihail Zenkov <mihail.zenkov@gmail.com>,
	Joel Brobecker  <brobecker@adacore.com>,
	gdb-patches@sourceware.org
Subject: Re: D language support
Date: Wed, 14 Apr 2010 22:22:00 -0000	[thread overview]
Message-ID: <20100415012124.91ce1769.mihai.zenkov@gmail.com> (raw)
In-Reply-To: <m3ljfzaxlk.fsf@fleche.redhat.com>

[-- Attachment #1: Type: text/plain, Size: 938 bytes --]

On Fri, 15 Jan 2010 14:04:39 -0700
Tom Tromey <tromey@redhat.com> wrote:

> >>>>> "Mihail" == Mihail Zenkov <mihail.zenkov@gmail.com> writes:
> 
> Mihail> +@node D
> Mihail> +@subsection D
> Mihail> +
> Mihail> +@cindex D
> Mihail> +@value{GDBN} can be used to debug programs written in D and compiled with
> Mihail> +GDC, LDC or DMD. Currently @value{GDBN} supports only one D specific
> Mihail> +features - dynamic arrays.
> 
> s/features/feature
> 
> Mihail> diff --git a/gdb/testsuite/gdb.base/default.exp b/gdb/testsuite/gdb.base/default.exp
> 
> It would be nice to have any kind of smoke test for the D support.
> 
> Tom

Sorry for too very long delay. I fix patch as you and Joel suggested, i hope it ready for inclusion. Also i write second patch for testsuite, it work good with GDC, but fail with DMD and LDC - probably it have some problem/particularity in DWARF implementation. I try do more test and write to their authors.

[-- Attachment #2: gdb-100414-d.patch --]
[-- Type: application/octet-stream, Size: 27045 bytes --]

gdb/ChangeLog:
	D language support.
	* Makefile.in (SFILES): Add d-lang.c d-valprint.c.
	(COMMON_OBS): Add d-lang.o d-valprint.o.
	(HFILES_NO_SRCDIR): Add d-lang.h.
	* c-lang.c (c_emit_char, exp_descriptor_c): Make public.
	* c-lang.h (c_emit_char, exp_descriptor_c): Add declaration.
	* d-lang.c: New file.
	* d-lang.h: New file.
	* d-valprint.c: New file.
	* defs.h (enum language): Add language_d.
	* doc/gdb.texinfo: Add mention about D language support.
	* dwarf2read.c (set_cu_language): Add DW_LANG_D.
	* language.c (binop_result_type, integral_type, character_type) 
	(string_type, boolean_type, structured_type): Add language_d.
	* symfile.c (init_filename_language_table): Add language_d.
	* symtab.c: Include d-lang.h.
	(symbol_init_language_specific, symbol_find_demangled_name)
	(symbol_natural_name, lookup_symbol_in_language)
	(symbol_demangled_name, symbol_matches_domain): Add language_d.
	* testsuite/gdb.base/default.exp: Fix "set language" test.
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index b507d3e..f34dcfa 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -654,6 +654,7 @@ SFILES = ada-exp.y ada-lang.c ada-typeprint.c ada-valprint.c ada-tasks.c \
 	charset.c cli-out.c coffread.c coff-pe-read.c \
 	complaints.c completer.c corefile.c \
 	cp-abi.c cp-support.c cp-namespace.c cp-valprint.c \
+	d-lang.c d-valprint.c \
 	cp-name-parser.y \
 	dbxread.c demangle.c dictionary.c disasm.c doublest.c dummy-frame.c \
 	dwarf2expr.c dwarf2loc.c dwarf2read.c dwarf2-frame.c \
@@ -721,7 +722,7 @@ cli-out.h gdb_expat.h breakpoint.h infcall.h obsd-tdep.h \
 exec.h m32r-tdep.h osabi.h gdbcore.h solib-som.h \
 i386bsd-nat.h xml-support.h xml-tdesc.h alphabsd-tdep.h gdb_obstack.h \
 ia64-tdep.h ada-lang.h varobj.h frv-tdep.h nto-tdep.h serial.h \
-c-lang.h frame.h event-loop.h block.h cli/cli-setshow.h	\
+c-lang.h d-lang.h frame.h event-loop.h block.h cli/cli-setshow.h	\
 cli/cli-decode.h cli/cli-cmds.h cli/cli-dump.h \
 cli/cli-script.h macrotab.h symtab.h version.h gnulib/wchar.in.h \
 gnulib/string.in.h gnulib/str-two-way.h gnulib/extra/link-warning.h \
@@ -826,7 +827,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \
 	dbxread.o coffread.o coff-pe-read.o \
 	dwarf2read.o mipsread.o stabsread.o corefile.o \
 	dwarf2expr.o dwarf2loc.o dwarf2-frame.o \
-	ada-lang.o c-lang.o f-lang.o objc-lang.o \
+	ada-lang.o c-lang.o d-lang.o f-lang.o objc-lang.o \
 	ada-tasks.o \
 	ui-out.o cli-out.o \
 	varobj.o vec.o wrapper.o \
@@ -836,7 +837,8 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \
 	sentinel-frame.o \
 	complaints.o typeprint.o \
 	ada-typeprint.o c-typeprint.o f-typeprint.o m2-typeprint.o \
-	ada-valprint.o c-valprint.o cp-valprint.o f-valprint.o m2-valprint.o \
+	ada-valprint.o c-valprint.o cp-valprint.o d-valprint.o f-valprint.o \
+	m2-valprint.o \
 	serial.o mdebugread.o top.o utils.o \
 	ui-file.o \
 	user-regs.o \
diff --git a/gdb/c-lang.c b/gdb/c-lang.c
index fefd675..d28594d 100644
--- a/gdb/c-lang.c
+++ b/gdb/c-lang.c
@@ -253,7 +253,7 @@ print_wchar (gdb_wint_t w, const gdb_byte *orig, int orig_len,
    string whose delimiter is QUOTER.  Note that that format for printing
    characters and strings is language specific. */
 
-static void
+void
 c_emit_char (int c, struct type *type, struct ui_file *stream, int quoter)
 {
   enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type));
@@ -1135,7 +1135,7 @@ c_language_arch_info (struct gdbarch *gdbarch,
   lai->bool_type_default = builtin->builtin_int;
 }
 
-static const struct exp_descriptor exp_descriptor_c = 
+const struct exp_descriptor exp_descriptor_c = 
 {
   print_subexp_standard,
   operator_length_standard,
diff --git a/gdb/c-lang.h b/gdb/c-lang.h
index 423cee0..404c212 100644
--- a/gdb/c-lang.h
+++ b/gdb/c-lang.h
@@ -87,6 +87,10 @@ extern void c_printstr (struct ui_file * stream, struct type *elttype,
 extern void c_language_arch_info (struct gdbarch *gdbarch,
 				  struct language_arch_info *lai);
 
+extern const struct exp_descriptor exp_descriptor_c;
+
+extern void c_emit_char (int c, struct type *type, struct ui_file *stream, int quoter);
+
 /* These are in c-typeprint.c: */
 
 extern void c_type_print_base (struct type *, struct ui_file *, int, int);
diff --git a/gdb/d-lang.c b/gdb/d-lang.c
new file mode 100644
index 0000000..317e6f9
--- /dev/null
+++ b/gdb/d-lang.c
@@ -0,0 +1,283 @@
+/* D language support routines for GDB, the GNU debugger.
+
+   Copyright (C) 2005, 2006, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "defs.h"
+#include "symtab.h"
+#include "language.h"
+#include "d-lang.h"
+#include "c-lang.h"
+#include "gdb_string.h"
+#include "parser-defs.h"
+#include "gdb_obstack.h"
+
+#include <ctype.h>
+
+
+static const char* mangled_str;
+/* Temporary obstack used for holding strings.  */
+static struct obstack tempbuf;
+
+/* Extract identifiers from MANGLED_STR and append it to TEMPBUF.
+   Return 1 on success or 0 on failure.  */
+static int
+extract_identifiers (void)
+{
+  long i = 0;
+
+  while (isdigit (*mangled_str))
+    {
+      i = strtol (mangled_str, NULL, 10);
+      mangled_str++;
+      if (i <= 0  && strlen (mangled_str) < i)
+        return 0;
+      obstack_grow (&tempbuf, mangled_str, i);
+      mangled_str += i;
+      obstack_grow_str (&tempbuf, ".");
+    }
+  if (*mangled_str == '\0' || i == 0)
+    return 0;
+  obstack_blank(&tempbuf, -1);
+  return 1;
+}
+
+/* Extract and demangle type from MANGLED_STR and append it to TEMPBUF.
+   Return 1 on success or 0 on failure.  */
+static int
+extract_type_info (void)
+{
+  if (*mangled_str == '\0')
+    return 0;
+  switch (*mangled_str++)
+    {
+      case 'A': /* dynamic array */
+      case 'G': /* static array */
+      case 'H': /* associative array */
+	if (!extract_type_info ())
+	  return 0;
+	obstack_grow_str (&tempbuf, "[]");
+	return 1;
+      case 'P': /* pointer */
+	if (!extract_type_info ())
+	  return 0;
+	obstack_grow_str (&tempbuf, "*");
+	return 1;
+      case 'R': /* reference */
+	if (!extract_type_info ())
+	  return 0;
+	obstack_grow_str (&tempbuf, "&");
+	return 1;
+      case 'Z': /* return value */
+	return extract_type_info ();
+      case 'J': /* out */
+	obstack_grow_str (&tempbuf, "out ");
+	return extract_type_info ();
+      case 'K': /* inout */
+	obstack_grow_str (&tempbuf, "inout ");
+	return extract_type_info ();
+      case 'E': /* enum */
+      case 'T': /* typedef */
+      case 'D': /* delegate */
+      case 'C': /* class */
+      case 'S': /* struct */
+	return extract_identifiers ();
+
+      /* basic types: */
+      case 'n': obstack_grow_str (&tempbuf, "none"); return 1;
+      case 'v': obstack_grow_str (&tempbuf, "void"); return 1;
+      case 'g': obstack_grow_str (&tempbuf, "byte"); return 1;
+      case 'h': obstack_grow_str (&tempbuf, "ubyte"); return 1;
+      case 's': obstack_grow_str (&tempbuf, "short"); return 1;
+      case 't': obstack_grow_str (&tempbuf, "ushort"); return 1;
+      case 'i': obstack_grow_str (&tempbuf, "int"); return 1;
+      case 'k': obstack_grow_str (&tempbuf, "uint"); return 1;
+      case 'l': obstack_grow_str (&tempbuf, "long"); return 1;
+      case 'm': obstack_grow_str (&tempbuf, "ulong"); return 1;
+      case 'f': obstack_grow_str (&tempbuf, "float"); return 1;
+      case 'd': obstack_grow_str (&tempbuf, "double"); return 1;
+      case 'e': obstack_grow_str (&tempbuf, "real"); return 1;
+
+      /* imaginary and complex: */
+      case 'o': obstack_grow_str (&tempbuf, "ifloat"); return 1;
+      case 'p': obstack_grow_str (&tempbuf, "idouble"); return 1;
+      case 'j': obstack_grow_str (&tempbuf, "ireal"); return 1;
+      case 'q': obstack_grow_str (&tempbuf, "cfloat"); return 1;
+      case 'r': obstack_grow_str (&tempbuf, "cdouble"); return 1;
+      case 'c': obstack_grow_str (&tempbuf, "creal"); return 1;
+
+      /* other types: */
+      case 'b': obstack_grow_str (&tempbuf, "bit"); return 1;
+      case 'a': obstack_grow_str (&tempbuf, "char"); return 1;
+      case 'u': obstack_grow_str (&tempbuf, "wchar"); return 1;
+      case 'w': obstack_grow_str (&tempbuf, "dchar"); return 1;
+
+      default:
+	obstack_grow_str (&tempbuf, "unknown");
+	return 1;
+    }
+}
+
+/* Implements the la_demangle language_defn routine for language D.  */
+char *
+d_demangle (const char* symbol, int options)
+{
+  char* out_str;
+  unsigned char is_func = 0;
+
+  mangled_str = symbol;
+
+  if (mangled_str == NULL)
+    return NULL;
+  else if (strcmp (mangled_str, "_Dmain") == 0)
+    return xstrdup ("D main");
+
+  obstack_init (&tempbuf);
+  
+  if (mangled_str[0] == '_' && mangled_str[1] == 'D')
+    {
+      mangled_str += 2;
+      is_func = 1;
+    } else if (strncmp (mangled_str, "__Class_", 8) == 0)
+      mangled_str += 8;
+    else if (strncmp (mangled_str, "__init_", 7) == 0)
+      mangled_str += 7;
+    else if (strncmp (mangled_str, "__vtbl_", 7) == 0)
+      mangled_str += 7;
+    else if (strncmp (mangled_str, "__modctor_", 10) == 0)
+      mangled_str += 10;
+    else if (strncmp (mangled_str, "__moddtor_", 10) == 0)
+      mangled_str += 10;
+    else if (strncmp (mangled_str, "__ModuleInfo_", 13) == 0)
+      mangled_str += 13;
+    else
+      {
+	obstack_free (&tempbuf, NULL);
+	return NULL;
+      }
+  
+  if (!extract_identifiers ())
+    {
+      obstack_free (&tempbuf, NULL);
+      return NULL;
+    }
+
+  obstack_grow_str (&tempbuf, "(");
+  if (is_func == 1 && *mangled_str == 'F')
+    {
+      mangled_str++;
+      while (*mangled_str != '\0' && *mangled_str != 'Z')
+	{
+	  if (is_func == 1)
+	    is_func++;
+	  else
+	    obstack_grow_str (&tempbuf, ", ");
+	  if (!extract_type_info ())
+	    {
+	      obstack_free (&tempbuf, NULL);
+	      return NULL;
+	   }
+	}
+     }
+  obstack_grow_str0 (&tempbuf, ")");
+
+  /* Doesn't display the return type, but wouldn't be too hard to do.  */
+
+  out_str = xstrdup (obstack_finish (&tempbuf));
+  obstack_free (&tempbuf, NULL);
+  return out_str;
+}
+
+/* Table mapping opcodes into strings for printing operators
+   and precedences of the operators.  */
+static const struct op_print d_op_print_tab[] =
+{
+  {",", BINOP_COMMA, PREC_COMMA, 0},
+  {"=", BINOP_ASSIGN, PREC_ASSIGN, 1},
+  {"||", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
+  {"&&", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
+  {"|", BINOP_BITWISE_IOR, PREC_BITWISE_IOR, 0},
+  {"^", BINOP_BITWISE_XOR, PREC_BITWISE_XOR, 0},
+  {"&", BINOP_BITWISE_AND, PREC_BITWISE_AND, 0},
+  {"==", BINOP_EQUAL, PREC_EQUAL, 0},
+  {"!=", BINOP_NOTEQUAL, PREC_EQUAL, 0},
+  {"<=", BINOP_LEQ, PREC_ORDER, 0},
+  {">=", BINOP_GEQ, PREC_ORDER, 0},
+  {">", BINOP_GTR, PREC_ORDER, 0},
+  {"<", BINOP_LESS, PREC_ORDER, 0},
+  {">>", BINOP_RSH, PREC_SHIFT, 0},
+  {"<<", BINOP_LSH, PREC_SHIFT, 0},
+  {"+", BINOP_ADD, PREC_ADD, 0},
+  {"-", BINOP_SUB, PREC_ADD, 0},
+  {"*", BINOP_MUL, PREC_MUL, 0},
+  {"/", BINOP_DIV, PREC_MUL, 0},
+  {"%", BINOP_REM, PREC_MUL, 0},
+  {"@", BINOP_REPEAT, PREC_REPEAT, 0},
+  {"-", UNOP_NEG, PREC_PREFIX, 0},
+  {"!", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
+  {"~", UNOP_COMPLEMENT, PREC_PREFIX, 0},
+  {"*", UNOP_IND, PREC_PREFIX, 0},
+  {"&", UNOP_ADDR, PREC_PREFIX, 0},
+  {"sizeof ", UNOP_SIZEOF, PREC_PREFIX, 0},
+  {"++", UNOP_PREINCREMENT, PREC_PREFIX, 0},
+  {"--", UNOP_PREDECREMENT, PREC_PREFIX, 0},
+  {NULL, 0, 0, 0}
+};
+
+static const struct language_defn d_language_defn =
+{
+  "d",
+  language_d,
+  range_check_off,
+  type_check_off,
+  case_sensitive_on,
+  array_row_major,
+  macro_expansion_c,
+  &exp_descriptor_c,
+  c_parse,
+  c_error,
+  null_post_parser,
+  c_printchar,			/* Print a character constant.  */
+  c_printstr,			/* Function to print string constant.  */
+  c_emit_char,			/* Print a single char.  */
+  c_print_type,			/* Print a type using appropriate syntax.  */
+  c_print_typedef,		/* Print a typedef using appropriate syntax.  */
+  d_val_print,			/* Print a value using appropriate syntax.  */
+  c_value_print,		/* Print a top-level value.  */
+  NULL,				/* Language specific skip_trampoline.  */
+  "this",
+  basic_lookup_symbol_nonlocal, 
+  basic_lookup_transparent_type,
+  d_demangle,			/* Language specific symbol demangler.  */
+  NULL,				/* Language specific class_name_from_physname.  */
+  d_op_print_tab,		/* Expression operators for printing.  */
+  1,				/* C-style arrays.  */
+  0,				/* String lower bound.  */
+  default_word_break_characters,
+  default_make_symbol_completion_list,
+  c_language_arch_info,
+  default_print_array_index,
+  default_pass_by_reference,
+  c_get_string,
+  LANG_MAGIC
+};
+
+void
+_initialize_d_language (void)
+{
+  add_language (&d_language_defn);
+}
diff --git a/gdb/d-lang.h b/gdb/d-lang.h
new file mode 100644
index 0000000..6af2c66
--- /dev/null
+++ b/gdb/d-lang.h
@@ -0,0 +1,31 @@
+/* D language support definitions for GDB, the GNU debugger.
+
+   Copyright (C) 2005, 2006, 2008, 2009, 2010 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#if !defined (D_LANG_H)
+#define D_LANG_H 1
+
+#include "symtab.h"
+
+extern char* d_demangle (const char* mangled, int options);
+
+extern int d_val_print (struct type *type, const gdb_byte *valaddr,
+			int embedded_offset, CORE_ADDR address,
+			struct ui_file *stream, int recurse,
+			const struct value_print_options *options);
+#endif /* !defined (D_LANG_H) */
diff --git a/gdb/d-valprint.c b/gdb/d-valprint.c
new file mode 100644
index 0000000..67b32b7
--- /dev/null
+++ b/gdb/d-valprint.c
@@ -0,0 +1,91 @@
+/* Support for printing D values for GDB, the GNU debugger.
+
+   Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "defs.h"
+#include "gdbtypes.h"
+#include "gdbcore.h"
+#include "d-lang.h"
+#include "c-lang.h"
+
+/* Assuming that TYPE is a TYPE_CODE_STRUCT, verify that TYPE is
+   a dynamic array, and then print its value to STREAM.  Return
+   the number of string characters printed, or -1 if TYPE is not
+   a dynamic array.  */
+static int
+dynamic_array_type (struct type *type, const gdb_byte *valaddr,
+		    int embedded_offset, CORE_ADDR address,
+		    struct ui_file *stream, int recurse,
+		    const struct value_print_options *options)
+{
+  if (TYPE_NFIELDS (type) == 2
+      && TYPE_CODE (TYPE_FIELD_TYPE (type, 0)) == TYPE_CODE_INT
+      && strcmp (TYPE_FIELD_NAME (type, 0), "length") == 0
+      && strcmp (TYPE_FIELD_NAME (type, 1), "ptr") == 0)
+    {
+      CORE_ADDR addr;
+      struct type *elttype;
+      struct type *true_type;
+      struct type *ptr_type;
+      struct type *range_type;
+      const gdb_byte *ptraddr;
+      struct value *val;
+      int length;
+
+      length = unpack_field_as_long (type, valaddr + embedded_offset, 0);
+
+      ptr_type = TYPE_FIELD_TYPE (type, 1);
+      elttype = check_typedef (TYPE_TARGET_TYPE (ptr_type));
+      addr = unpack_pointer (ptr_type,
+			     valaddr + TYPE_FIELD_BITPOS (type, 1) / 8
+			     + embedded_offset);
+      true_type = check_typedef (elttype);
+
+      true_type = lookup_array_range_type (true_type, 0, length - 1);
+      val = value_at (true_type, addr);
+      ptraddr = value_contents (val);
+
+      return d_val_print (true_type, ptraddr, 0, addr, stream, recurse + 1,
+			  options);
+    }
+  return -1;
+}
+
+/* Implements the la_val_print routine for language D.  */
+int
+d_val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset,
+             CORE_ADDR address, struct ui_file *stream, int recurse,
+             const struct value_print_options *options)
+{
+  int ret;
+
+  CHECK_TYPEDEF (type);
+  switch (TYPE_CODE (type))
+    {
+      case TYPE_CODE_STRUCT:
+        ret = dynamic_array_type (type, valaddr, embedded_offset, address,
+				  stream, recurse, options);
+	if (ret != -1)
+	   break;
+      default:
+	ret = c_val_print (type, valaddr, embedded_offset, address, stream,
+			   recurse, options);
+    }
+
+  return ret;
+}
diff --git a/gdb/defs.h b/gdb/defs.h
index e8a1dd4..d4a9b19 100644
--- a/gdb/defs.h
+++ b/gdb/defs.h
@@ -188,6 +188,7 @@ enum language
     language_auto,		/* Placeholder for automatic setting */
     language_c,			/* C */
     language_cplus,		/* C++ */
+    language_d,			/* D */
     language_objc,		/* Objective-C */
     language_java,		/* Java */
     language_fortran,		/* Fortran */
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 887547b..68ba6f3 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -214,6 +214,10 @@ You can use @value{GDBN} to debug programs written in C and C@t{++}.
 For more information, see @ref{Supported Languages,,Supported Languages}.
 For more information, see @ref{C,,C and C++}.
 
+@cindex D
+Support for D is partial.  For information on D, see
+@ref{D,,D}.
+
 @cindex Modula-2
 Support for Modula-2 is partial.  For information on Modula-2, see
 @ref{Modula-2,,Modula-2}.
@@ -10731,6 +10735,9 @@ C source file
 @itemx .c++
 C@t{++} source file
 
+@item .d
+D source file
+
 @item .m
 Objective-C source file
 
@@ -11008,7 +11015,7 @@ being set automatically by @value{GDBN}.
 @node Supported Languages
 @section Supported Languages
 
-@value{GDBN} supports C, C@t{++}, Objective-C, Fortran, Java, Pascal,
+@value{GDBN} supports C, C@t{++}, D, Objective-C, Fortran, Java, Pascal,
 assembly, Modula-2, and Ada.
 @c This is false ...
 Some @value{GDBN} features may be used in expressions regardless of the
@@ -11027,6 +11034,7 @@ language reference or tutorial.
 
 @menu
 * C::                           C and C@t{++}
+* D::                           D
 * Objective-C::                 Objective-C
 * Fortran::                     Fortran
 * Pascal::                      Pascal
@@ -11564,6 +11572,14 @@ In the PowerPC architecture, @value{GDBN} provides a set of pseudo-registers
 to inspect @code{_Decimal128} values stored in floating point registers.
 See @ref{PowerPC,,PowerPC} for more details.
 
+@node D
+@subsection D
+
+@cindex D
+@value{GDBN} can be used to debug programs written in D and compiled with
+GDC, LDC or DMD. Currently @value{GDBN} supports only one D specific
+feature - dynamic arrays.
+
 @node Objective-C
 @subsection Objective-C
 
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 724016f..fba3d58 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -7600,6 +7600,9 @@ set_cu_language (unsigned int lang, struct dwarf2_cu *cu)
     case DW_LANG_C_plus_plus:
       cu->language = language_cplus;
       break;
+    case DW_LANG_D:
+      cu->language = language_d;
+      break;
     case DW_LANG_Fortran77:
     case DW_LANG_Fortran90:
     case DW_LANG_Fortran95:
diff --git a/gdb/language.c b/gdb/language.c
index dcd70b0..aba8a9e 100644
--- a/gdb/language.c
+++ b/gdb/language.c
@@ -486,6 +486,7 @@ binop_result_type (struct value *v1, struct value *v2)
     {
     case language_c:
     case language_cplus:
+    case language_d:
     case language_objc:
       if (TYPE_CODE (t1) == TYPE_CODE_FLT)
 	return TYPE_CODE (t2) == TYPE_CODE_FLT && l2 > l1 ?
@@ -597,6 +598,7 @@ integral_type (struct type *type)
     {
     case language_c:
     case language_cplus:
+    case language_d:
     case language_objc:
       return (TYPE_CODE (type) != TYPE_CODE_INT) &&
 	(TYPE_CODE (type) != TYPE_CODE_ENUM) ? 0 : 1;
@@ -637,6 +639,7 @@ character_type (struct type *type)
 
     case language_c:
     case language_cplus:
+    case language_d:
     case language_objc:
       return (TYPE_CODE (type) == TYPE_CODE_INT) &&
 	TYPE_LENGTH (type) == sizeof (char)
@@ -659,6 +662,7 @@ string_type (struct type *type)
 
     case language_c:
     case language_cplus:
+    case language_d:
     case language_objc:
       /* C does not have distinct string type. */
       return (0);
@@ -678,6 +682,7 @@ boolean_type (struct type *type)
     {
     case language_c:
     case language_cplus:
+    case language_d:
     case language_objc:
       /* Might be more cleanly handled by having a
          TYPE_CODE_INT_NOT_BOOL for (the deleted) CHILL and such
@@ -717,6 +722,7 @@ structured_type (struct type *type)
     {
     case language_c:
     case language_cplus:
+    case language_d:
     case language_objc:
       return (TYPE_CODE (type) == TYPE_CODE_STRUCT) ||
 	(TYPE_CODE (type) == TYPE_CODE_UNION) ||
diff --git a/gdb/symfile.c b/gdb/symfile.c
index eda26cc..cf7b41a 100644
--- a/gdb/symfile.c
+++ b/gdb/symfile.c
@@ -2618,6 +2618,7 @@ init_filename_language_table (void)
       filename_language_table =
 	xmalloc (fl_table_size * sizeof (*filename_language_table));
       add_filename_language (".c", language_c);
+      add_filename_language (".d", language_d);
       add_filename_language (".C", language_cplus);
       add_filename_language (".cc", language_cplus);
       add_filename_language (".cp", language_cplus);
diff --git a/gdb/symtab.c b/gdb/symtab.c
index 29142da..c2cab96 100644
--- a/gdb/symtab.c
+++ b/gdb/symtab.c
@@ -39,6 +39,7 @@
 #include "source.h"
 #include "filenames.h"		/* for FILENAME_CMP */
 #include "objc-lang.h"
+#include "d-lang.h"
 #include "ada-lang.h"
 #include "p-lang.h"
 #include "addrmap.h"
@@ -346,6 +347,7 @@ symbol_init_language_specific (struct general_symbol_info *gsymbol,
 {
   gsymbol->language = language;
   if (gsymbol->language == language_cplus
+      || gsymbol->language == language_d
       || gsymbol->language == language_java
       || gsymbol->language == language_objc)
     {
@@ -449,6 +451,17 @@ symbol_find_demangled_name (struct general_symbol_info *gsymbol,
 	  return demangled;
 	}
     }
+  if (gsymbol->language == language_d
+      || gsymbol->language == language_auto)
+    {
+      demangled =
+	d_demangle(mangled, 0);
+      if (demangled != NULL)
+	{
+	  gsymbol->language = language_d;
+	  return demangled;
+	}
+    }
   return NULL;
 }
 
@@ -626,6 +639,7 @@ symbol_natural_name (const struct general_symbol_info *gsymbol)
   switch (gsymbol->language)
     {
     case language_cplus:
+    case language_d:
     case language_java:
     case language_objc:
       if (gsymbol->language_specific.cplus_specific.demangled_name != NULL)
@@ -651,6 +665,7 @@ symbol_demangled_name (const struct general_symbol_info *gsymbol)
   switch (gsymbol->language)
     {
     case language_cplus:
+    case language_d:
     case language_java:
     case language_objc:
       if (gsymbol->language_specific.cplus_specific.demangled_name != NULL)
@@ -940,7 +955,7 @@ lookup_symbol_in_language (const char *name, const struct block *block,
 
   modified_name = name;
 
-  /* If we are using C++ or Java, demangle the name before doing a lookup, so
+  /* If we are using C++, D, or Java, demangle the name before doing a lookup, so
      we can always binary search. */
   if (lang == language_cplus)
     {
@@ -972,6 +987,15 @@ lookup_symbol_in_language (const char *name, const struct block *block,
 	  make_cleanup (xfree, demangled_name);
 	}
     }
+  else if (lang == language_d)
+    {
+      demangled_name = d_demangle (name, 0);
+      if (demangled_name)
+	{
+	  modified_name = demangled_name;
+	  make_cleanup (xfree, demangled_name);
+	}
+    }
 
   if (case_sensitivity == case_sensitive_off)
     {
@@ -1412,6 +1436,7 @@ symbol_matches_domain (enum language symbol_language,
      A Java class declaration also defines a typedef for the class.
      Similarly, any Ada type declaration implicitly defines a typedef.  */
   if (symbol_language == language_cplus
+      || symbol_language == language_d
       || symbol_language == language_java
       || symbol_language == language_ada)
     {
diff --git a/gdb/testsuite/gdb.base/default.exp b/gdb/testsuite/gdb.base/default.exp
index 97d5407..2a13007 100644
--- a/gdb/testsuite/gdb.base/default.exp
+++ b/gdb/testsuite/gdb.base/default.exp
@@ -531,7 +531,7 @@ gdb_test "set history size" "Argument required .integer to set it to.*" "set his
 #test set history
 gdb_test "set history" "\"set history\" must be followed by the name of a history subcommand.(\[^\r\n\]*\[\r\n\])+List of set history subcommands:(\[^\r\n\]*\[\r\n\])+set history expansion -- Set history expansion on command input(\[^\r\n\]*\[\r\n\])+set history filename -- Set the filename in which to record the command history(\[^\r\n\]*\[\r\n\])+set history save -- Set saving of the history record on exit(\[^\r\n\]*\[\r\n\])+set history size -- Set the size of the command history(\[^\r\n\]*\[\r\n\])+Type \"help set history\" followed by set history subcommand name for full documentation.(\[^\r\n\]*\[\r\n\])+Command name abbreviations are allowed if unambiguous." "set history"
 #test set language
-gdb_test "set language" "Requires an argument. Valid arguments are auto, local, unknown, ada, c, c.., asm, minimal, fortran, objective-c, java, modula-2, pascal, scheme." "set language"
+gdb_test "set language" "Requires an argument. Valid arguments are auto, local, unknown, ada, c, c.., asm, minimal, d, fortran, objective-c, java, modula-2, pascal, scheme." "set language"
 #test set listsize
 gdb_test "set listsize" "Argument required .integer to set it to.*" "set listsize"
 #test set print "p" abbreviation

[-- Attachment #3: gdb-100414-d_testsuite.patch --]
[-- Type: application/octet-stream, Size: 12246 bytes --]

gdb/testsuite/ChangeLog:
	D language support.
	* configure.ac (AC_OUTPUT): Add gdb.d/Makefile.
	* Makefile.in (ALL_SUBDIRS): Add gdb.d.
	* lib/d.exp: New file.
	* gdb.d/darray.d: New file.
	* gdb.d/darray.exp: New file.
	* gdb.d/main.d: New file.
	* gdb.d/main.exp: New file.
	* gdb.d/Makefile.in: New file.
diff --git a/gdb/testsuite/Makefile.in b/gdb/testsuite/Makefile.in
index 8d8d704..d64f7c0 100644
--- a/gdb/testsuite/Makefile.in
+++ b/gdb/testsuite/Makefile.in
@@ -33,8 +33,8 @@ SHELL = @SHELL@
 EXEEXT = @EXEEXT@
 SUBDIRS = @subdirs@
 RPATH_ENVVAR = @RPATH_ENVVAR@
-ALL_SUBDIRS = gdb.ada gdb.arch gdb.asm gdb.base gdb.cp gdb.disasm \
-	gdb.dwarf2 \
+ALL_SUBDIRS = gdb.ada gdb.arch gdb.asm gdb.base gdb.cp gdb.d \
+	gdb.disasm gdb.dwarf2 \
 	gdb.fortran gdb.server gdb.java gdb.mi gdb.multi \
 	gdb.objc gdb.opt gdb.pascal gdb.python gdb.threads gdb.trace \
 	gdb.xml \
diff --git a/gdb/testsuite/configure.ac b/gdb/testsuite/configure.ac
index c8668e5..22e50e4 100644
--- a/gdb/testsuite/configure.ac
+++ b/gdb/testsuite/configure.ac
@@ -139,9 +139,9 @@ AC_CHECK_HEADERS(pthread.h)
 AC_EXEEXT
 
 AC_OUTPUT([Makefile \
-  gdb.ada/Makefile \
-  gdb.arch/Makefile gdb.asm/Makefile gdb.base/Makefile \
-  gdb.cp/Makefile gdb.disasm/Makefile gdb.dwarf2/Makefile \
+  gdb.ada/Makefile gdb.arch/Makefile gdb.asm/Makefile \
+  gdb.base/Makefile gdb.cp/Makefile gdb.d/Makefile \
+  gdb.disasm/Makefile gdb.dwarf2/Makefile \
   gdb.fortran/Makefile gdb.server/Makefile gdb.java/Makefile \
   gdb.mi/Makefile gdb.modula2/Makefile gdb.multi/Makefile \
   gdb.objc/Makefile gdb.opt/Makefile gdb.pascal/Makefile \
diff --git a/gdb/testsuite/gdb.d/Makefile.in b/gdb/testsuite/gdb.d/Makefile.in
new file mode 100644
index 0000000..16ed52b
--- /dev/null
+++ b/gdb/testsuite/gdb.d/Makefile.in
@@ -0,0 +1,14 @@
+VPATH = @srcdir@
+srcdir = @srcdir@
+
+EXECUTABLES = darray main 
+
+all info install-info dvi install uninstall installcheck check:
+	@echo "Nothing to be done for $@..."
+
+clean mostlyclean:
+	-rm -f *~ *.o *.ci
+	-rm -f core ${EXECUTABLES}
+
+distclean maintainer-clean realclean: clean
+	-rm -f Makefile config.status config.log
diff --git a/gdb/testsuite/gdb.d/darray.d b/gdb/testsuite/gdb.d/darray.d
new file mode 100644
index 0000000..4ecde29
--- /dev/null
+++ b/gdb/testsuite/gdb.d/darray.d
@@ -0,0 +1,38 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2010 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+   */
+
+void
+marker() {}
+
+int 
+main() 
+{
+  int[] a = [0, 1, 2];
+
+  char[] s;
+  s.length = 11;
+  s[] = "Test String";
+
+  char[][] s1 = ["Test 1", "Test 22", "Test 333"];
+
+  marker();
+  return 0;
+} 
+
+
+
diff --git a/gdb/testsuite/gdb.d/darray.exp b/gdb/testsuite/gdb.d/darray.exp
new file mode 100644
index 0000000..7194675
--- /dev/null
+++ b/gdb/testsuite/gdb.d/darray.exp
@@ -0,0 +1,46 @@
+# Copyright 2010 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+if $tracelevel then {
+    strace $tracelevel
+}
+
+load_lib "d.exp"
+
+set testfile "darray"
+set srcfile ${testfile}.d
+set binfile ${objdir}/${subdir}/${testfile}
+
+if {[gdb_compile_d "${srcdir}/${subdir}/${srcfile}" "${binfile}"] != "" } {
+  return -1
+}
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+gdb_test "break marker" \
+         "Breakpoint 1 at .*darray.d.*" \
+
+gdb_test "run" \
+         ".*marker.*" \
+         "going to marker"
+
+gdb_test "next" ".*return 0;"
+
+gdb_test "print a" ".*0, 1, 2.*"
+gdb_test "print s" ".*= \"Test String\""
+gdb_test "print s1" ".*= {\"Test 1\", \"Test 22\", \"Test 333\"}"
diff --git a/gdb/testsuite/gdb.d/main.d b/gdb/testsuite/gdb.d/main.d
new file mode 100644
index 0000000..346fd96
--- /dev/null
+++ b/gdb/testsuite/gdb.d/main.d
@@ -0,0 +1,63 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2010 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+   */
+
+int z;
+
+void
+foo()
+{
+  z = 22;
+}
+
+class CTest
+{
+  int x;
+  static int y;
+  this()
+  {
+    x = 11;
+    y = 3;
+  }
+}
+
+struct STest
+{
+  int x;
+  static int y;
+}
+
+int 
+main() 
+{
+  int i = 1;
+  int[3] a = [0, 1, 2];
+  char[11] s = "Test String";
+
+  foo();
+
+  CTest ct = new CTest;
+
+  STest st;
+  st.x = 2;
+  st.y = 4;
+
+  int *p = null; 
+  *p = 5;
+
+  return 0;
+} 
diff --git a/gdb/testsuite/gdb.d/main.exp b/gdb/testsuite/gdb.d/main.exp
new file mode 100644
index 0000000..1f38bd6
--- /dev/null
+++ b/gdb/testsuite/gdb.d/main.exp
@@ -0,0 +1,62 @@
+# Copyright 2010 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+if $tracelevel then {
+    strace $tracelevel
+}
+
+load_lib "d.exp"
+
+set testfile "main"
+set srcfile ${testfile}.d
+set binfile ${objdir}/${subdir}/${testfile}
+
+if {[gdb_compile_d "${srcdir}/${subdir}/${srcfile}" "${binfile}"] != "" } {
+  return -1
+}
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+gdb_test "break 'D main'" \
+         "Breakpoint 1 at .*main.d.*" \
+
+gdb_test "break foo" \
+         "Breakpoint 2 at .*main.d.*" \
+
+gdb_test "run" \
+         ".*int i = 1;" \
+         "going to 'D main'"
+
+gdb_test "continue" \
+         ".*z = 22;" \
+         "going to foo"
+
+gdb_test "backtrace" \
+	 "#0  foo .*main.d.*#1.*main.*main.d.*"
+
+gdb_test "continue" \
+         ".*p = 5;" \
+         "segmentation fault"
+
+gdb_test "print i" ".* = 1"
+gdb_test "print a" ".*0, 1, 2.*"
+gdb_test "print 'main.z'" ".* = 22"
+gdb_test "print ct" ".*x = 11.*"
+gdb_test "print 'main.CTest.y'" ".* = 3"
+gdb_test "print st" ".*x = 2.*"
+gdb_test "print 'main.STest.y'" ".* = 4"
diff --git a/gdb/testsuite/lib/d.exp b/gdb/testsuite/lib/d.exp
new file mode 100644
index 0000000..f067a93
--- /dev/null
+++ b/gdb/testsuite/lib/d.exp
@@ -0,0 +1,128 @@
+# Copyright 2010 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+load_lib libgloss.exp
+
+set d_init_done 0
+
+# This procedure looks for a suitable D compiler
+# First, environment variable GDC is checked
+# if present, GDC compiler is assumed to be the value of
+# that environment variable.
+# Second, environment variable DMD is checked
+# if present, DMD is assumed to be the value of
+# that environment variable.
+# Third, environment variable LDC is checked
+# if present, LDC is assumed to be the value of
+# that environment variable.
+# Fourth, gdc executable is searched using `which gdc`
+# Fifth, dmd executable is searched using `which dmd`
+# Lastly, ldc executable is searched using `which ldc`
+# Using environment variable allows to force
+# which compiler is used in testsuite.
+ 
+proc d_init {} {
+    global d_init_done
+    global d_compiler_is_gdc
+    global d_compiler_is_dmd
+    global d_compiler_is_ldc
+    global gdc_compiler
+    global dmd_compiler
+    global ldc_compiler
+    global env
+ 
+    if { $d_init_done == 1 } {
+	return
+    }
+
+    set d_compiler_is_gdc 0
+    set d_compiler_is_dmd 0
+    set d_compiler_is_ldc 0
+    set gdc_compiler [transform gdc]
+    set dmd_compiler [transform dmd]
+    set ldc_compiler [transform ldc]
+
+    if ![is_remote host] {
+	if { [info exists env(GDC)] } {
+	    set d_compiler_is_gdc 1
+	    set gdc_compiler $env(GDC)
+	    verbose -log "Assuming GDC ($gdc_compiler)"
+	} elseif { [info exists env(DMD)] } {
+	    set d_compiler_is_dmd 1
+	    set dmd_compiler $env(DMD)
+	    verbose -log "Assuming DMD ($dmd_compiler)"
+	} elseif { [info exists env(LDC)] } {
+	    set d_compiler_is_ldc 1
+	    set ldc_compiler $env(LDC)
+	    verbose -log "Assuming LDC ($ldc_compiler)"
+	} elseif { [which $gdc_compiler] != 0 } {
+	    set d_compiler_is_gdc 1
+	    verbose -log "GDC found"
+        } elseif { [which $dmd_compiler] != 0 } {
+	    set d_compiler_is_dmd 1
+	    verbose -log "DMD found"
+        } elseif { [which $ldc_compiler] != 0 } {
+	    set d_compiler_is_ldc 1
+	    verbose -log "LDC found"
+	}
+    }
+    set d_init_done 1
+}   
+
+proc gdc_compile {source dest} {
+    global gdc_compiler
+    set result [remote_exec host $gdc_compiler "-g3 -O0 $source -o $dest"]
+    return $result
+}
+
+proc dmd_compile {source dest} {
+    global dmd_compiler
+    set result [remote_exec host $dmd_compiler "-gc $source -of$dest"]
+    return $result
+}
+
+proc ldc_compile {source dest} {
+    global ldc_compiler
+    set result [remote_exec host $ldc_compiler "-O0 -g $source -of$dest"]
+    return $result
+}
+
+proc gdb_compile_d {source dest} {
+    global d_init_done
+    global d_compiler_is_gdc
+    global d_compiler_is_dmd
+    global d_compiler_is_ldc
+
+    if { $d_init_done == 0 } { 
+	d_init
+    }
+
+    if { $d_compiler_is_gdc == 1 } {
+        set result [gdc_compile $source $dest]
+    } elseif { $d_compiler_is_dmd == 1 } {
+        set result [dmd_compile $source $dest]
+    } elseif { $d_compiler_is_ldc == 1 } {
+        set result [ldc_compile $source $dest]
+    } else {
+	unsupported "No D compiler found"
+	return "No D compiler. Compilation failed."
+    }
+
+    if ![file exists $dest] {
+        unsupported "D compilation failed: $result"
+        return "D compilation failed."
+    }
+}
+

  reply	other threads:[~2010-04-14 22:22 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-12-23 23:57 Mihail Zenkov
2009-12-30 12:56 ` Joel Brobecker
2010-01-09  6:25   ` Mihail Zenkov
2010-01-09  6:29     ` Mihail Zenkov
2010-01-09 14:23       ` Joel Brobecker
2010-01-13  4:42         ` Mihail Zenkov
2010-01-15  5:10           ` Joel Brobecker
2010-01-15 21:02             ` Tom Tromey
2010-01-15 21:05           ` Tom Tromey
2010-04-14 22:22             ` Mihail Zenkov [this message]
2010-04-20 21:39               ` Tom Tromey
2010-04-21  0:01                 ` Mihail Zenkov
2010-04-21 15:57                   ` Joel Brobecker
2010-04-22  0:11                     ` Mihail Zenkov
2010-04-22  0:44                       ` Joel Brobecker
2010-04-22  1:53                         ` Mihail Zenkov
2010-04-23 18:11                           ` Tom Tromey
2010-04-24  0:06                             ` Mihail Zenkov
2010-04-27 16:05                               ` Joel Brobecker
2010-04-27 23:55                                 ` Mihail Zenkov
2010-04-28 15:17                                   ` Joel Brobecker
2010-04-28 17:11                                     ` Eli Zaretskii
2010-04-29  2:16                                     ` Mihail Zenkov
2010-04-28 17:10                                   ` Eli Zaretskii
2010-04-29  1:59                                     ` Mihail Zenkov
2010-04-29  3:10                                       ` Eli Zaretskii
2010-04-29 14:47                                       ` Joel Brobecker
2010-04-23 18:09                         ` Tom Tromey
2010-04-23 20:15                           ` Leandro Lucarella
2010-04-23 20:37                             ` Tom Tromey
2010-04-26 23:51                               ` Stan Shebs
2010-04-27  0:29                                 ` Joel Brobecker
2010-04-23 21:35               ` Robert Clipsham
2010-04-24  0:26                 ` Mihail Zenkov
2010-04-27 20:27                   ` Robert Clipsham
  -- strict thread matches above, loose matches on Subject: below --
2009-08-17 23:02 Mihail Zenkov
2009-08-18  4:18 ` Eli Zaretskii
2009-08-18 16:39 ` Tom Tromey
     [not found]   ` <20090818225844.GA9879@homero.springfield.home>
2009-08-19 18:36     ` Tom Tromey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100415012124.91ce1769.mihai.zenkov@gmail.com \
    --to=mihail.zenkov@gmail.com \
    --cc=brobecker@adacore.com \
    --cc=gdb-patches@sourceware.org \
    --cc=tromey@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox