Re: [RFA] c++/11734 revisited

Tom Tromey
2010-12-09T21:45:07Z

>>>>> "Keith" == Keith Seitz <keiths@redhat.com> writes:

Keith> I originally proposed fixing this by switching to pre-expansion. Tom
Keith> reports that this really mucks up indexing. As a result, I have
Keith> rewritten this patch.

I think I must have been unclear.

The problem with using pre-expansion in the index code was that the
index didn't include all the same info as the psymtabs, so there was no
good way to avoid expanding too many CUs when asked to look up a common
type like "int".

I don't think this problem would affect psymtab.c. So, you could
probably still use pre-expansion if you think that is better.

And, true to form, I misremembered the many different attempts at fixing
this that I went through -- apparently in the tree we currently do use
pre-expansion for the index.

Sorry about all that.

Keith> It's such a nightmare, it would actually a primary reason to
Keith> rewrite linespec.c entirely. One of these days, I'll find the
Keith> time to do it.

That will be a happy day. For us anyway ;-)

Keith> 2010-12-08 Keith Seitz <keiths@redhat.com>
Keith> * linespec.c (decode_compound): Rename SAVED_ARG to
Keith> THE_REAL_SAVED_ARG.

The ChangeLog entry should mention the PR, so the commit will end up in
bugzilla.

Keith> + if (*saved_arg == '\'')
Keith> + {
Keith> + char *end = skip_quoted (saved_arg);
Keith> + memcpy (saved_arg, saved_arg + 1, end - saved_arg);
Keith> + memcpy (end - 2, end, strlen (saved_arg) + 1);

For overlapping copies you must use memmove.

Keith> +static const char *
Keith> +psymtab_search_name (const char *name)
Keith> +{
Keith> + switch (current_language->la_language)

I don't think psymtab.c should refer to current_language.

I guess the search language could be a parameter. I realize that at
some point we'll need to use current_language, and that symtab.c isn't
exactly clean in this regard. It doesn't seem too hard to avoid letting
the rot creep into this code, though.

I suspect this same bug is going to bite the index code, too, and we'll
have to export this function for use there too. I'll check that out
after your patch goes in.

Keith> + return xstrdup (name);

The return type of this function should be just "char *".
Otherwise you will need casts when freeing.

Keith> + cleanup = make_cleanup (xfree, (void *) search_name);

... like this one.

Keith> +if {[gdb_compile $srcfiles $binfile executable {debug c++}] != "" } {
Keith> + untested pr11734.exp
Keith> + return -1
Keith> +}

Keith> +if {[get_compiler_info $binfile "c++"]} {
Keith> + return -1
Keith> +}
Keith> +
Keith> +gdb_exit
Keith> +gdb_start
Keith> +gdb_reinitialize_dir $srcdir/$subdir
Keith> +gdb_load $binfile

I don't know if you can use prepare_for_testing here, but
if not you can at least use clean_restart.

Tom