* RFA: fix PR 9164
@ 2009-01-03 21:20 Tom Tromey
2009-01-04 3:29 ` Daniel Jacobowitz
2009-01-05 17:29 ` Pedro Alves
0 siblings, 2 replies; 10+ messages in thread
From: Tom Tromey @ 2009-01-03 21:20 UTC (permalink / raw)
To: gdb-patches
This patch fixes PR 9164.
The bug is that the result of sizeof has signed type, not unsigned.
The C and C++ standards require an unsigned type here.
This fix defers the choice of type to the language, using the existing
language-arch machinery. I fixed the C language family, including
ObjC, but I left the other languages unchanged. I think the language
maintainers will have to make a change here, if one is needed or
desired. (FWIW I don't think Java needs a change, since I don't think
it is possible to invoke sizeof when Java is the selected language.)
Built and regtested on x86-64 (compile farm).
New test case included.
Please review.
thanks,
Tom
2009-01-03 Tom Tromey <tromey@redhat.com>
PR gdb/9164:
* p-lang.c (pascal_language_arch_info): Initialize
lai->size_type_default.
* objc-exp.y (exp): Call language_size_type.
* m2-lang.c (m2_language_arch_info): Initialize
lai->size_type_default.
* language.h (language_size_type): Declare.
(struct language_arch_info) <size_type_symbol, size_type_default>:
New fields.
* language.c (unknown_language_arch_info): Initialize
lai->size_type_default.
(language_size_type): New function.
* jv-lang.c (java_language_arch_info): Initialize
lai->size_type_default.
* f-lang.c (f_language_arch_info): Initialize
lai->size_type_default.
* eval.c (evaluate_subexp_for_sizeof): Call language_size_type.
* c-lang.c (find_size_type): New function.
(c_language_arch_info): Call it.
(cplus_language_arch_info): Likewise.
* c-exp.y (exp): Use language_size_type.
* ada-lang.c (ada_language_arch_info): Initialize
lai->size_type_default.
2009-01-03 Tom Tromey <tromey@redhat.com>
* gdb.base/sizeof.exp (check_sizeof): Verify that sizeof returns
unsigned type.
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index bcbd709..8571eda 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -11000,6 +11000,8 @@ ada_language_arch_info (struct gdbarch *gdbarch,
lai->bool_type_symbol = "boolean";
lai->bool_type_default = builtin->builtin_bool;
+
+ lai->size_type_default = builtin->builtin_int;
}
\f
/* Language vector */
diff --git a/gdb/c-exp.y b/gdb/c-exp.y
index 0db8c0b..212d7b5 100644
--- a/gdb/c-exp.y
+++ b/gdb/c-exp.y
@@ -558,7 +558,8 @@ exp : VARIABLE
exp : SIZEOF '(' type ')' %prec UNARY
{ write_exp_elt_opcode (OP_LONG);
- write_exp_elt_type (parse_type->builtin_int);
+ write_exp_elt_type (language_size_type (parse_language,
+ parse_gdbarch));
CHECK_TYPEDEF ($3);
write_exp_elt_longcst ((LONGEST) TYPE_LENGTH ($3));
write_exp_elt_opcode (OP_LONG); }
diff --git a/gdb/c-lang.c b/gdb/c-lang.c
index dc7b059..f3020f6 100644
--- a/gdb/c-lang.c
+++ b/gdb/c-lang.c
@@ -223,6 +223,25 @@ const struct op_print c_op_print_tab[] =
{NULL, 0, 0, 0}
};
\f
+/* A helper function to compute the default size type for C-like
+ languages. */
+static void
+find_size_type (const struct builtin_type *builtin,
+ struct language_arch_info *lai)
+{
+ lai->size_type_symbol = "size_t";
+
+ /* For the default, pick an unsigned integral type the same width as
+ a data pointer, if possible. If none match, use unsigned int. */
+ if (TYPE_LENGTH (builtin->builtin_unsigned_long)
+ == TYPE_LENGTH (builtin->builtin_data_ptr))
+ lai->size_type_default = builtin->builtin_unsigned_long;
+ else if (TYPE_LENGTH (builtin->builtin_unsigned_long_long))
+ lai->size_type_default = builtin->builtin_unsigned_long_long;
+ else
+ lai->size_type_default = builtin->builtin_unsigned_int;
+}
+
enum c_primitive_types {
c_primitive_type_int,
c_primitive_type_long,
@@ -278,6 +297,8 @@ c_language_arch_info (struct gdbarch *gdbarch,
lai->primitive_type_vector [c_primitive_type_declong] = builtin->builtin_declong;
lai->bool_type_default = builtin->builtin_int;
+
+ find_size_type (builtin, lai);
}
const struct language_defn c_language_defn =
@@ -396,6 +417,8 @@ cplus_language_arch_info (struct gdbarch *gdbarch,
lai->bool_type_symbol = "bool";
lai->bool_type_default = builtin->builtin_bool;
+
+ find_size_type (builtin, lai);
}
const struct language_defn cplus_language_defn =
diff --git a/gdb/eval.c b/gdb/eval.c
index ccb6b74..026795b 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -2652,8 +2652,8 @@ evaluate_subexp_with_coercion (struct expression *exp,
static struct value *
evaluate_subexp_for_sizeof (struct expression *exp, int *pos)
{
- /* FIXME: This should be size_t. */
- struct type *size_type = builtin_type (exp->gdbarch)->builtin_int;
+ struct type *size_type = language_size_type (exp->language_defn,
+ exp->gdbarch);
enum exp_opcode op;
int pc;
struct type *type;
diff --git a/gdb/f-lang.c b/gdb/f-lang.c
index 4d4d4d7..bf4dac5 100644
--- a/gdb/f-lang.c
+++ b/gdb/f-lang.c
@@ -302,6 +302,8 @@ f_language_arch_info (struct gdbarch *gdbarch,
lai->bool_type_symbol = "logical";
lai->bool_type_default = builtin->builtin_logical_s2;
+
+ lai->size_type_default = builtin_type (gdbarch)->builtin_int;
}
/* This is declared in c-lang.h but it is silly to import that file for what
diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c
index 0470eef..4f75f7b 100644
--- a/gdb/jv-lang.c
+++ b/gdb/jv-lang.c
@@ -1083,6 +1083,8 @@ java_language_arch_info (struct gdbarch *gdbarch,
lai->bool_type_symbol = "boolean";
lai->bool_type_default = java_boolean_type;
+
+ lai->size_type_default = builtin_type (gdbarch)->builtin_int;
}
const struct exp_descriptor exp_descriptor_java =
diff --git a/gdb/language.c b/gdb/language.c
index 46e238d..c6eec0a 100644
--- a/gdb/language.c
+++ b/gdb/language.c
@@ -1127,6 +1127,7 @@ unknown_language_arch_info (struct gdbarch *gdbarch,
{
lai->string_char_type = builtin_type (gdbarch)->builtin_char;
lai->bool_type_default = builtin_type (gdbarch)->builtin_int;
+ lai->size_type_default = builtin_type (gdbarch)->builtin_int;
lai->primitive_type_vector = GDBARCH_OBSTACK_CALLOC (gdbarch, 1,
struct type *);
}
@@ -1303,6 +1304,33 @@ language_bool_type (const struct language_defn *la,
return ld->arch_info[la->la_language].bool_type_default;
}
+/* Return the size type for the given language and architecture. The
+ size type is the type used to represent the size of an object, for
+ instance the result of the C `sizeof' operator. */
+
+struct type *
+language_size_type (const struct language_defn *la,
+ struct gdbarch *gdbarch)
+{
+ struct language_gdbarch *ld = gdbarch_data (gdbarch,
+ language_gdbarch_data);
+
+ if (ld->arch_info[la->la_language].size_type_symbol)
+ {
+ struct symbol *sym;
+ sym = lookup_symbol (ld->arch_info[la->la_language].size_type_symbol,
+ NULL, VAR_DOMAIN, NULL);
+ if (sym)
+ {
+ struct type *type = SYMBOL_TYPE (sym);
+ if (type && TYPE_CODE (type) == TYPE_CODE_INT)
+ return type;
+ }
+ }
+
+ return ld->arch_info[la->la_language].size_type_default;
+}
+
struct type *
language_lookup_primitive_type_by_name (const struct language_defn *la,
struct gdbarch *gdbarch,
diff --git a/gdb/language.h b/gdb/language.h
index c92c57c..f09c029 100644
--- a/gdb/language.h
+++ b/gdb/language.h
@@ -134,6 +134,11 @@ struct language_arch_info
const char *bool_type_symbol;
/* Otherwise, this is the default boolean builtin type. */
struct type *bool_type_default;
+
+ /* Symbol name of type to use as size type, if defined. */
+ const char *size_type_symbol;
+ /* Otherwise, this is the default builtin size type. */
+ struct type *size_type_default;
};
/* Structure tying together assorted information about a language. */
@@ -331,6 +336,9 @@ struct type *language_bool_type (const struct language_defn *l,
struct type *language_string_char_type (const struct language_defn *l,
struct gdbarch *gdbarch);
+struct type *language_size_type (const struct language_defn *l,
+ struct gdbarch *gdbarch);
+
struct type *language_lookup_primitive_type_by_name (const struct language_defn *l,
struct gdbarch *gdbarch,
const char *name);
diff --git a/gdb/m2-lang.c b/gdb/m2-lang.c
index e09b64b..fa6fcaf 100644
--- a/gdb/m2-lang.c
+++ b/gdb/m2-lang.c
@@ -349,6 +349,8 @@ m2_language_arch_info (struct gdbarch *gdbarch,
lai->bool_type_symbol = "BOOLEAN";
lai->bool_type_default = builtin->builtin_bool;
+
+ lai->size_type_default = builtin->builtin_int;
}
const struct exp_descriptor exp_descriptor_modula2 =
diff --git a/gdb/objc-exp.y b/gdb/objc-exp.y
index 1527a04..aa4f738 100644
--- a/gdb/objc-exp.y
+++ b/gdb/objc-exp.y
@@ -577,7 +577,8 @@ exp : SELECTOR
exp : SIZEOF '(' type ')' %prec UNARY
{ write_exp_elt_opcode (OP_LONG);
- write_exp_elt_type (parse_type->builtin_int);
+ write_exp_elt_type (language_size_type (parse_language,
+ parse_gdbarch));
CHECK_TYPEDEF ($3);
write_exp_elt_longcst ((LONGEST) TYPE_LENGTH ($3));
write_exp_elt_opcode (OP_LONG); }
diff --git a/gdb/p-lang.c b/gdb/p-lang.c
index cd4285d..bd82c48 100644
--- a/gdb/p-lang.c
+++ b/gdb/p-lang.c
@@ -397,6 +397,8 @@ pascal_language_arch_info (struct gdbarch *gdbarch,
lai->bool_type_symbol = "boolean";
lai->bool_type_default = builtin->builtin_bool;
+
+ lai->size_type_default = builtin->builtin_int;
}
const struct language_defn pascal_language_defn =
diff --git a/gdb/testsuite/gdb.base/sizeof.exp b/gdb/testsuite/gdb.base/sizeof.exp
index c6432bf..421d3ea 100644
--- a/gdb/testsuite/gdb.base/sizeof.exp
+++ b/gdb/testsuite/gdb.base/sizeof.exp
@@ -118,6 +118,10 @@ check_sizeof "float" ${sizeof_float}
check_sizeof "double" ${sizeof_double}
check_sizeof "long double" ${sizeof_long_double}
+# Check that sizeof has unsigned type.
+gdb_test "print -sizeof(int)" \
+ "\\$\[0-9\]* = (\[0-9\]*)"
+
proc check_valueof { exp val } {
global gdb_prompt
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: RFA: fix PR 9164
2009-01-03 21:20 RFA: fix PR 9164 Tom Tromey
@ 2009-01-04 3:29 ` Daniel Jacobowitz
2009-01-04 18:10 ` Tom Tromey
2009-01-05 17:29 ` Pedro Alves
1 sibling, 1 reply; 10+ messages in thread
From: Daniel Jacobowitz @ 2009-01-04 3:29 UTC (permalink / raw)
To: Tom Tromey; +Cc: gdb-patches
On Sat, Jan 03, 2009 at 02:19:53PM -0700, Tom Tromey wrote:
> This patch fixes PR 9164.
>
> The bug is that the result of sizeof has signed type, not unsigned.
> The C and C++ standards require an unsigned type here.
>
> This fix defers the choice of type to the language, using the existing
> language-arch machinery. I fixed the C language family, including
> ObjC, but I left the other languages unchanged. I think the language
> maintainers will have to make a change here, if one is needed or
> desired. (FWIW I don't think Java needs a change, since I don't think
> it is possible to invoke sizeof when Java is the selected language.)
>
> Built and regtested on x86-64 (compile farm).
> New test case included.
Before adding all this, do you know of any language where the signed
behavior is correct?
--
Daniel Jacobowitz
CodeSourcery
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: RFA: fix PR 9164
2009-01-04 3:29 ` Daniel Jacobowitz
@ 2009-01-04 18:10 ` Tom Tromey
2009-01-05 4:23 ` Joel Brobecker
0 siblings, 1 reply; 10+ messages in thread
From: Tom Tromey @ 2009-01-04 18:10 UTC (permalink / raw)
To: gdb-patches
>>>>> "Daniel" == Daniel Jacobowitz <drow@false.org> writes:
Tom> This fix defers the choice of type to the language, using the existing
Tom> language-arch machinery. I fixed the C language family, including
Tom> ObjC, but I left the other languages unchanged. I think the language
Tom> maintainers will have to make a change here, if one is needed or
Tom> desired. (FWIW I don't think Java needs a change, since I don't think
Tom> it is possible to invoke sizeof when Java is the selected language.)
Daniel> Before adding all this, do you know of any language where the signed
Daniel> behavior is correct?
Nope. I don't know that a signed type is incorrect, either. I really
know nothing about the other languages here, so I chose to preserve
the current behavior.
Even if all languages want an unsigned type, I still think something
like this patch is the way to go, because for C languages you
generally want the inferior's "size_t".
That is, this is the way to go assuming that we continue to have
language-dependent expressions. If it weren't for UNOP_SIZEOF, I
probably would have made this a C-specific patch. Another idea would
be to add an evaluate_subexp_c, and have it handle UNOP_SIZEOF.
Tom
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: RFA: fix PR 9164
2009-01-04 18:10 ` Tom Tromey
@ 2009-01-05 4:23 ` Joel Brobecker
2009-01-05 4:51 ` Tom Tromey
2009-01-05 9:23 ` Mark Kettenis
0 siblings, 2 replies; 10+ messages in thread
From: Joel Brobecker @ 2009-01-05 4:23 UTC (permalink / raw)
To: Tom Tromey; +Cc: gdb-patches
> Tom> This fix defers the choice of type to the language, using the existing
> Tom> language-arch machinery. I fixed the C language family, including
> Tom> ObjC, but I left the other languages unchanged. I think the language
> Tom> maintainers will have to make a change here, if one is needed or
> Tom> desired. (FWIW I don't think Java needs a change, since I don't think
> Tom> it is possible to invoke sizeof when Java is the selected language.)
>
> Daniel> Before adding all this, do you know of any language where the signed
> Daniel> behavior is correct?
>
> Nope. I don't know that a signed type is incorrect, either. I really
> know nothing about the other languages here, so I chose to preserve
> the current behavior.
In Ada, the equivalent of the sizeof operator is the 'Size attribute.
This attribute is a function that returns the size in bits and its
type is a ``universal_integer''. universal_integer is not a type
you can use in declarations, but it allows any integer values, so
I think that it would be reasonable to make the 'size attribute
return a value of Integer type (thus signed). I checked the code,
and we actually use builtin_type_int32 (we used to use builtin_type_int
but this type is hard to get to, now, as you need access to the gdbarch).
--
Joel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: RFA: fix PR 9164
2009-01-05 4:23 ` Joel Brobecker
@ 2009-01-05 4:51 ` Tom Tromey
2009-01-05 9:23 ` Mark Kettenis
1 sibling, 0 replies; 10+ messages in thread
From: Tom Tromey @ 2009-01-05 4:51 UTC (permalink / raw)
To: Joel Brobecker; +Cc: gdb-patches
>>>>> "Joel" == Joel Brobecker <brobecker@adacore.com> writes:
Tom> Nope. I don't know that a signed type is incorrect, either. I really
Tom> know nothing about the other languages here, so I chose to preserve
Tom> the current behavior.
Joel> In Ada, the equivalent of the sizeof operator is the 'Size attribute.
FWIW -- I believe this change only affects languages that might
generate UNOP_SIZEOF in an expression. According to grep that means C
(the whole family plus ObjC), Fortran, Modula-2, and Pascal.
So, I think this change should not affect Ada.
Tom
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: RFA: fix PR 9164
2009-01-05 4:23 ` Joel Brobecker
2009-01-05 4:51 ` Tom Tromey
@ 2009-01-05 9:23 ` Mark Kettenis
2009-01-05 9:30 ` Joel Brobecker
1 sibling, 1 reply; 10+ messages in thread
From: Mark Kettenis @ 2009-01-05 9:23 UTC (permalink / raw)
To: brobecker; +Cc: tromey, gdb-patches
> Date: Mon, 5 Jan 2009 08:23:36 +0400
> From: Joel Brobecker <brobecker@adacore.com>
>
> > Tom> This fix defers the choice of type to the language, using the existing
> > Tom> language-arch machinery. I fixed the C language family, including
> > Tom> ObjC, but I left the other languages unchanged. I think the language
> > Tom> maintainers will have to make a change here, if one is needed or
> > Tom> desired. (FWIW I don't think Java needs a change, since I don't think
> > Tom> it is possible to invoke sizeof when Java is the selected language.)
> >
> > Daniel> Before adding all this, do you know of any language where the signed
> > Daniel> behavior is correct?
> >
> > Nope. I don't know that a signed type is incorrect, either. I really
> > know nothing about the other languages here, so I chose to preserve
> > the current behavior.
>
> In Ada, the equivalent of the sizeof operator is the 'Size attribute.
> This attribute is a function that returns the size in bits and its
> type is a ``universal_integer''. universal_integer is not a type
> you can use in declarations, but it allows any integer values, so
> I think that it would be reasonable to make the 'size attribute
> return a value of Integer type (thus signed). I checked the code,
> and we actually use builtin_type_int32 (we used to use builtin_type_int
> but this type is hard to get to, now, as you need access to the gdbarch).
Well, using built_type_int32 defenitely feels wrong for a type
representing sizes on a 64-bit system.
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: RFA: fix PR 9164
2009-01-05 9:23 ` Mark Kettenis
@ 2009-01-05 9:30 ` Joel Brobecker
0 siblings, 0 replies; 10+ messages in thread
From: Joel Brobecker @ 2009-01-05 9:30 UTC (permalink / raw)
To: Mark Kettenis; +Cc: tromey, gdb-patches
> Well, using built_type_int32 defenitely feels wrong for a type
> representing sizes on a 64-bit system.
We could extend it to a larger integer type, but this is only used
to return type sizes - the assumption is that we won't see many
objects whose size is bits does not fit in a 32bit integer.
--
Joel
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: RFA: fix PR 9164
2009-01-03 21:20 RFA: fix PR 9164 Tom Tromey
2009-01-04 3:29 ` Daniel Jacobowitz
@ 2009-01-05 17:29 ` Pedro Alves
2009-01-05 18:31 ` Tom Tromey
1 sibling, 1 reply; 10+ messages in thread
From: Pedro Alves @ 2009-01-05 17:29 UTC (permalink / raw)
To: gdb-patches, Tom Tromey
On Saturday 03 January 2009 21:19:53, Tom Tromey wrote:
> +static void
> +find_size_type (const struct builtin_type *builtin,
> + struct language_arch_info *lai)
> +{
> + lai->size_type_symbol = "size_t";
> +
> + /* For the default, pick an unsigned integral type the same width as
> + a data pointer, if possible. If none match, use unsigned int. */
> + if (TYPE_LENGTH (builtin->builtin_unsigned_long)
> + == TYPE_LENGTH (builtin->builtin_data_ptr))
> + lai->size_type_default = builtin->builtin_unsigned_long;
> + else if (TYPE_LENGTH (builtin->builtin_unsigned_long_long))
> + lai->size_type_default = builtin->builtin_unsigned_long_long;
> + else
> + lai->size_type_default = builtin->builtin_unsigned_int;
> +}
I think that m32c will need a hook here. I think that in some modes, size_t will
be 16-bit, but pointer width 24-bits.
I wonder if the above shouldn't be a gdbarch method, that defaults to
what you wrote.
--
Pedro Alves
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: RFA: fix PR 9164
2009-01-05 17:29 ` Pedro Alves
@ 2009-01-05 18:31 ` Tom Tromey
2009-01-07 22:13 ` Pedro Alves
0 siblings, 1 reply; 10+ messages in thread
From: Tom Tromey @ 2009-01-05 18:31 UTC (permalink / raw)
To: Pedro Alves; +Cc: gdb-patches
>>>>> "Pedro" == Pedro Alves <pedro@codesourcery.com> writes:
Pedro> I think that m32c will need a hook here. I think that in some
Pedro> modes, size_t will be 16-bit, but pointer width 24-bits.
Pedro> I wonder if the above shouldn't be a gdbarch method, that defaults to
Pedro> what you wrote.
Yeah, I do see some gcc ports where size_t depends on the flags.
Not m32c, actually, but:
../arm/arm.h:597:#define SIZE_TYPE (TARGET_AAPCS_BASED ? "unsigned int" : "long unsigned int")
... all the other conditionally-defined ones seem to be decided by the
size of pointers.
I'll look into this more.
Tom
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: RFA: fix PR 9164
2009-01-05 18:31 ` Tom Tromey
@ 2009-01-07 22:13 ` Pedro Alves
0 siblings, 0 replies; 10+ messages in thread
From: Pedro Alves @ 2009-01-07 22:13 UTC (permalink / raw)
To: gdb-patches, Tom Tromey
On Monday 05 January 2009 18:29:41, Tom Tromey wrote:
> >>>>> "Pedro" == Pedro Alves <pedro@codesourcery.com> writes:
>
> Pedro> I think that m32c will need a hook here. I think that in some
> Pedro> modes, size_t will be 16-bit, but pointer width 24-bits.
>
> Pedro> I wonder if the above shouldn't be a gdbarch method, that defaults to
> Pedro> what you wrote.
>
> Yeah, I do see some gcc ports where size_t depends on the flags.
> Not m32c, actually, but:
Ah, you're only looking for SIZE_TYPE:
/* We can do QI, HI, and SI operations pretty much equally well, but
GCC expects us to have a "native" format, so we pick the one that
matches "int". Pointers are 16 bits for R8C/M16C (when TARGET_A16
is true) and 24 bits for M32CM/M32C (when TARGET_A24 is true), but
24-bit pointers are stored in 32-bit words. */
#define BITS_PER_UNIT 8
#define UNITS_PER_WORD 2
#define POINTER_SIZE (TARGET_A16 ? 16 : 32)
#define POINTERS_EXTEND_UNSIGNED 1
...
#define INT_TYPE_SIZE 16
So, SIZE_TYPE defaults to unsigned int --- 16-bit, but the pointer size
varies. This means that objects can only be 16-bit big, but they can
exist in a larger than 16-bit address space.
--
Pedro Alves
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2009-01-07 22:13 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-01-03 21:20 RFA: fix PR 9164 Tom Tromey
2009-01-04 3:29 ` Daniel Jacobowitz
2009-01-04 18:10 ` Tom Tromey
2009-01-05 4:23 ` Joel Brobecker
2009-01-05 4:51 ` Tom Tromey
2009-01-05 9:23 ` Mark Kettenis
2009-01-05 9:30 ` Joel Brobecker
2009-01-05 17:29 ` Pedro Alves
2009-01-05 18:31 ` Tom Tromey
2009-01-07 22:13 ` Pedro Alves
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox