Re: PATCH: operate-and-get-next

Elena Zannoni
2001-11-21T21:43:31Z

Tom, you appended the wrong patch... :-)

Can you resend?

Thanks
Elena

Tom Tromey writes:
> >>>>> "Elena" == Elena Zannoni <ezannoni@cygnus.com> writes:
>
> Elena> Ok, much claner. The only thing I wonder now about is, is it
> Elena> necessary to have operate_saved_history be checked in the
> Elena> gdb_rl_operate_and_get_next_completion () function. It looks
> Elena> like it would be always != -1 when that function is called,
> Elena> bacause of the way the hooks are installed. The hooks are not
> Elena> null while the var is not -1. It still needs to be a global,
> Elena> though.
>
> I agree. I've made this change.
>
> >> I guess I could try to put an `after_prompt_hook' into
> >> start_event_loop. This might work ok. What would you think of
> >> that? Or is there another approach you'd like me to try?
>
> Elena> I cannot think of another approach at the moment. But I agree
> Elena> that a different hook in start_event_loop could be used. The
> Elena> after_char_processing_hook seems a bit out of place there.
>
> I didn't do this. I couldn't think of a good name for the hook. Also
> I couldn't think of any coherent description of the semantics of such
> a hook. So my reasoning is that if we're going to have a hack we
> might as well have just a single hook with a comment explaining the
> hack.
>
> The very best fix, imho, would be to make rl_pre_input_hook work
> correctly with the async readline. I believe this requires some work
> in readline itself though. I don't have the time to do this, but I
> could submit a PR for it if you'd like.
>
> Is this patch ok?
>
> Tom
>
> Index: ChangeLog
> from Tom Tromey <tromey@redhat.com>
>
> * configure, config.in: Rebuilt.
> * configure.in: Check for realpath.
> * defs.h (gdb_realpath): Declare.
> * symtab.h (partial_symtab): Added fullname field.
> * source.c (openp): Use gdb_realpath.
> (forget_cached_source_info): Clear full name of each partial
> symtab.
> * utils.c (gdb_realpath): New function.
> * symtab.c (lookup_symtab): Removed.
> (lookup_symtab_1): Renamed to lookup_symtab.
> (lookup_symtab): Look for real path.
> (lookup_partial_symtab): Likewise.
>
> Index: config.in
> ===================================================================
> RCS file: /cvs/src/src/gdb/config.in,v
> retrieving revision 1.30
> diff -u -r1.30 config.in
> --- config.in 2001/08/27 22:39:55 1.30
> +++ config.in 2001/11/07 04:53:26
> @@ -220,6 +220,9 @@
> /* Define if you have the putenv function. */
> #undef HAVE_PUTENV
>
> +/* Define if you have the realpath function. */
> +#undef HAVE_REALPATH
> +
> /* Define if you have the sbrk function. */
> #undef HAVE_SBRK
>
> Index: configure
> ===================================================================
> RCS file: /cvs/src/src/gdb/configure,v
> retrieving revision 1.72
> diff -u -r1.72 configure
> --- configure 2001/11/05 23:54:49 1.72
> +++ configure 2001/11/07 04:53:31
> @@ -3582,7 +3582,7 @@
> fi
>
>
> -for ac_func in bcopy btowc bzero isascii poll sbrk setpgid setpgrp \
> +for ac_func in bcopy btowc bzero isascii poll realpath sbrk setpgid setpgrp \
> sigaction sigprocmask sigsetmask
> do
> echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
> Index: configure.in
> ===================================================================
> RCS file: /cvs/src/src/gdb/configure.in,v
> retrieving revision 1.74
> diff -u -r1.74 configure.in
> --- configure.in 2001/11/05 23:54:49 1.74
> +++ configure.in 2001/11/07 04:53:32
> @@ -131,7 +131,7 @@
>
> AC_C_CONST
>
> -AC_CHECK_FUNCS(bcopy btowc bzero isascii poll sbrk setpgid setpgrp \
> +AC_CHECK_FUNCS(bcopy btowc bzero isascii poll realpath sbrk setpgid setpgrp \
> sigaction sigprocmask sigsetmask)
> AC_FUNC_ALLOCA
> AC_FUNC_VFORK
> Index: defs.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/defs.h,v
> retrieving revision 1.64
> diff -u -r1.64 defs.h
> --- defs.h 2001/10/17 20:35:31 1.64
> +++ defs.h 2001/11/07 04:53:33
> @@ -579,6 +579,8 @@
> extern CORE_ADDR host_pointer_to_address (void *ptr);
> extern void *address_to_host_pointer (CORE_ADDR addr);
>
> +extern char *gdb_realpath (const char *);
> +
> /* From demangle.c */
>
> extern void set_demangling_style (char *);
> Index: source.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/source.c,v
> retrieving revision 1.20
> diff -u -r1.20 source.c
> --- source.c 2001/07/17 06:41:47 1.20
> +++ source.c 2001/11/07 04:53:35
> @@ -234,6 +234,7 @@
> {
> register struct symtab *s;
> register struct objfile *objfile;
> + struct partial_symtab *pst;
>
> for (objfile = object_files; objfile != NULL; objfile = objfile->next)
> {
> @@ -250,6 +251,15 @@
> s->fullname = NULL;
> }
> }
> +
> + ALL_OBJFILE_PSYMTABS (objfile, pst)
> + {
> + if (pst->fullname != NULL)
> + {
> + xfree (pst->fullname);
> + pst->fullname = NULL;
> + }
> + }
> }
> }
>
> @@ -603,15 +613,17 @@
> if (fd < 0)
> *filename_opened = NULL;
> else if (IS_ABSOLUTE_PATH (filename))
> - *filename_opened = savestring (filename, strlen (filename));
> + *filename_opened = gdb_realpath (filename);
> else
> {
> /* Beware the // my son, the Emacs barfs, the botch that catch... */
>
> - *filename_opened = concat (current_directory,
> + char *f = concat (current_directory,
> IS_DIR_SEPARATOR (current_directory[strlen (current_directory) - 1])
> ? "" : SLASH_STRING,
> filename, NULL);
> + *filename_opened = gdb_realpath (f);
> + xfree (f);
> }
> }
> /* OBSOLETE #ifdef MPW */
> Index: symtab.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/symtab.c,v
> retrieving revision 1.47
> diff -u -r1.47 symtab.c
> --- symtab.c 2001/11/05 23:27:31 1.47
> +++ symtab.c 2001/11/07 04:53:38
> @@ -141,14 +141,36 @@
> register struct symtab *s;
> register struct partial_symtab *ps;
> register struct objfile *objfile;
> + char *real_path = NULL;
>
> + if (IS_ABSOLUTE_PATH (name))
> + real_path = gdb_realpath (name);
> +
> got_symtab:
>
> /* First, search for an exact match */
>
> ALL_SYMTABS (objfile, s)
> + {
> if (FILENAME_CMP (name, s->filename) == 0)
> - return s;
> + {
> + xfree (real_path);
> + return s;
> + }
> + /* If the user gave us an absolute path, try to find the file in
> + this symtab and use its absolute path. */
> + if (real_path != NULL)
> + {
> + char *rp = symtab_to_filename (s);
> + if (FILENAME_CMP (real_path, rp) == 0)
> + {
> + xfree (real_path);
> + return s;
> + }
> + }
> + }
> +
> + xfree (real_path);
>
> /* Now, search for a matching tail (only if name doesn't have any dirs) */
>
> @@ -195,14 +217,34 @@
> {
> register struct partial_symtab *pst;
> register struct objfile *objfile;
> + char *real_path = NULL;
> +
> + if (IS_ABSOLUTE_PATH (name))
> + real_path = gdb_realpath (name);
>
> ALL_PSYMTABS (objfile, pst)
> {
> if (FILENAME_CMP (name, pst->filename) == 0)
> {
> + xfree (real_path);
> return (pst);
> }
> + /* If the user gave us an absolute path, try to find the file in
> + this symtab and use its absolute path. */
> + if (real_path != NULL)
> + {
> + if (pst->fullname == NULL)
> + source_full_path_of (pst->filename, &pst->fullname);
> + if (pst->fullname != NULL
> + && FILENAME_CMP (real_path, pst->fullname) == 0)
> + {
> + xfree (real_path);
> + return pst;
> + }
> + }
> }
> +
> + xfree (real_path);
>
> /* Now, search for a matching tail (only if name doesn't have any dirs) */
>
> Index: symtab.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/symtab.h,v
> retrieving revision 1.25
> diff -u -r1.25 symtab.h
> --- symtab.h 2001/10/12 23:51:29 1.25
> +++ symtab.h 2001/11/07 04:53:39
> @@ -967,6 +967,10 @@
>
> char *filename;
>
> + /* Full path of the source file. NULL if not known. */
> +
> + char *fullname;
> +
> /* Information about the object file from which symbols should be read. */
>
> struct objfile *objfile;
> Index: utils.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/utils.c,v
> retrieving revision 1.49
> diff -u -r1.49 utils.c
> --- utils.c 2001/11/02 21:46:52 1.49
> +++ utils.c 2001/11/07 04:53:41
> @@ -2534,3 +2534,15 @@
> }
> return addr;
> }
> +
> +char *
> +gdb_realpath (const char *filename)
> +{
> +#ifdef HAVE_REALPATH
> + char buf[PATH_MAX];
> + char *rp = realpath (filename, buf);
> + return xstrdup (rp ? rp : filename);
> +#else
> + return xstrdup (filename);
> +#endif
> +}
> Index: gdbtk/ChangeLog
> from Tom Tromey <tromey@redhat.com>
>
> * generic/gdbtk-cmds.h (full_lookup_symtab): Don't declare.
> * generic/gdbtk-cmds.c (gdb_find_file_command): Use
> lookup_symtab.
> (gdb_listfuncs): Likewise.
> (gdb_loadfile): Likewise.
> (full_lookup_symtab): Removed.
> * generic/gdbtk-bp.c (gdb_find_bp_at_line): Use lookup_symtab.
> (gdb_set_bp): Likewise.
>
> Index: gdbtk/generic/gdbtk-bp.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-bp.c,v
> retrieving revision 1.13
> diff -u -r1.13 gdbtk-bp.c
> --- gdbtk/generic/gdbtk-bp.c 2001/11/05 19:42:48 1.13
> +++ gdbtk/generic/gdbtk-bp.c 2001/11/07 04:53:44
> @@ -252,7 +252,7 @@
> return TCL_ERROR;
> }
>
> - s = full_lookup_symtab (Tcl_GetStringFromObj (objv[1], NULL));
> + s = lookup_symtab (Tcl_GetStringFromObj (objv[1], NULL));
> if (s == NULL)
> return TCL_ERROR;
>
> @@ -493,7 +493,7 @@
> return TCL_ERROR;
> }
>
> - sal.symtab = full_lookup_symtab (Tcl_GetStringFromObj (objv[1], NULL));
> + sal.symtab = lookup_symtab (Tcl_GetStringFromObj (objv[1], NULL));
> if (sal.symtab == NULL)
> return TCL_ERROR;
>
> Index: gdbtk/generic/gdbtk-cmds.c
> ===================================================================
> RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-cmds.c,v
> retrieving revision 1.43
> diff -u -r1.43 gdbtk-cmds.c
> --- gdbtk/generic/gdbtk-cmds.c 2001/11/05 19:42:48 1.43
> +++ gdbtk/generic/gdbtk-cmds.c 2001/11/07 04:53:46
> @@ -1102,7 +1102,7 @@
> }
>
> filename = Tcl_GetStringFromObj (objv[1], NULL);
> - st = full_lookup_symtab (filename);
> + st = lookup_symtab (filename);
>
> /* We should always get a symtab. */
> if (!st)
> @@ -1470,7 +1470,7 @@
> return TCL_ERROR;
> }
>
> - symtab = full_lookup_symtab (Tcl_GetStringFromObj (objv[1], NULL));
> + symtab = lookup_symtab (Tcl_GetStringFromObj (objv[1], NULL));
> if (!symtab)
> {
> gdbtk_set_result (interp, "No such file (%s)",
> @@ -2769,7 +2769,7 @@
> file = Tcl_GetStringFromObj (objv[2], NULL);
> Tcl_GetBooleanFromObj (interp, objv[3], &linenumbers);
>
> - symtab = full_lookup_symtab (file);
> + symtab = lookup_symtab (file);
> if (!symtab)
> {
> gdbtk_set_result (interp, "File not found in symtab");
> @@ -2995,68 +2995,6 @@
> {
> perror_with_name (args);
> return 1;
> -}
> -
> -/* The lookup_symtab() in symtab.c doesn't work correctly */
> -/* It will not work will full pathnames and if multiple */
> -/* source files have the same basename, it will return */
> -/* the first one instead of the correct one. */
> -/* symtab->fullname will be NULL if the file is not available. */
> -
> -struct symtab *
> -full_lookup_symtab (file)
> - char *file;
> -{
> - struct symtab *st;
> - struct objfile *objfile;
> - char *bfile, *fullname;
> - struct partial_symtab *pt;
> -
> - if (!file)
> - return NULL;
> -
> - /* first try a direct lookup */
> - st = lookup_symtab (file);
> - if (st)
> - {
> - if (!st->fullname)
> - symtab_to_filename (st);
> - return st;
> - }
> -
> - /* if the direct approach failed, try */
> - /* looking up the basename and checking */
> - /* all matches with the fullname */
> - bfile = basename (file);
> - ALL_SYMTABS (objfile, st)
> - {
> - if (!strcmp (bfile, basename (st->filename)))
> - {
> - if (!st->fullname)
> - fullname = symtab_to_filename (st);
> - else
> - fullname = st->fullname;
> -
> - if (!strcmp (file, fullname))
> - return st;
> - }
> - }
> -
> - /* still no luck? look at psymtabs */
> - ALL_PSYMTABS (objfile, pt)
> - {
> - if (!strcmp (bfile, basename (pt->filename)))
> - {
> - st = PSYMTAB_TO_SYMTAB (pt);
> - if (st)
> - {
> - fullname = symtab_to_filename (st);
> - if (!strcmp (file, fullname))
> - return st;
> - }
> - }
> - }
> - return NULL;
> }
>
> /* Look for the function that contains PC and return the source
> Index: gdbtk/generic/gdbtk-cmds.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-cmds.h,v
> retrieving revision 1.2
> diff -u -r1.2 gdbtk-cmds.h
> --- gdbtk/generic/gdbtk-cmds.h 2001/11/05 19:42:48 1.2
> +++ gdbtk/generic/gdbtk-cmds.h 2001/11/07 04:53:46
> @@ -38,10 +38,6 @@
> tcl. ALL tcl commands should be wrapped in this call. */
> extern int gdbtk_call_wrapper (ClientData, Tcl_Interp *, int, Tcl_Obj * CONST[]);
>
> -/* Like lookup_symtab but this deals with full pathnames and multiple
> - source files with the same basename. FIXME: why doesn't gdb use this? */
> -extern struct symtab *full_lookup_symtab (char *file);
> -
> /* Returns the source (demangled) name for a function at PC. Returns empty string
> if not found. Memory is owned by gdb. Do not free it. */
> extern char *pc_function_name (CORE_ADDR pc);