Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Pedro Alves <palves@redhat.com>
To: Luis Machado <lgustavo@codesourcery.com>, gdb-patches@sourceware.org
Cc: sandra@codesourcery.com
Subject: Re: [PATCH, v4] PR 20569, segv in follow_exec
Date: Tue, 25 Oct 2016 18:04:00 -0000	[thread overview]
Message-ID: <645baeb5-e813-d97d-fcd0-d0c7ea7bf5ba@redhat.com> (raw)
In-Reply-To: <1477415521-22010-1-git-send-email-lgustavo@codesourcery.com>

On 10/25/2016 06:12 PM, Luis Machado wrote:
> Adjusted a few more bits.
> 
> I ended up using the ugly explicit cast for an enum that is being used as a
> bitfield. I'm guessing we'll want to convert this to the macro-fied
> template-fied version that is more appropriate to C++?

Yup.  I actually have a patch for that in one of my C++ branches
somewhere.

> 
> If so then i can come up with a follow up patch that does the conversion. I
> didn't want to disrupt v4 with more unrelated changes.

Use 'int' in this patch like the rest of the functions that pass
around this enum, and remove the casts.  Then when the enum
is made a proper enum-flags with DEF_ENUM_FLAGS_TYPE, you won't
have to remove the casts then, and all functions that need adjustment
will get the same adjustment at the same time.  No need for a partial
transition.

> 

>  void
> -exec_file_locate_attach (int pid, int defer_bp_reset, int from_tty)
> +try_open_exec_file (const char *exec_file_host, struct inferior *inf,
> +		    enum symfile_add_flags flags, int from_tty)

Use int.

>  {
> -  char *exec_file, *full_exec_path = NULL;
>    struct cleanup *old_chain;
>    struct gdb_exception prev_err = exception_none;
>  
> -  /* Do nothing if we already have an executable filename.  */
> -  exec_file = (char *) get_exec_file (0);
> -  if (exec_file != NULL)
> -    return;
> -
> -  /* Try to determine a filename from the process itself.  */
> -  exec_file = target_pid_to_exec_file (pid);
> -  if (exec_file == NULL)
> -    {
> -      warning (_("No executable has been specified and target does not "
> -		 "support\n"
> -		 "determining executable automatically.  "
> -		 "Try using the \"file\" command."));
> -      return;
> -    }
> -
> -  /* If gdb_sysroot is not empty and the discovered filename
> -     is absolute then prefix the filename with gdb_sysroot.  */
> -  if (*gdb_sysroot != '\0' && IS_ABSOLUTE_PATH (exec_file))
> -    {
> -      full_exec_path = exec_file_find (exec_file, NULL);
> -      if (full_exec_path == NULL)
> -	return;
> -    }
> -  else
> -    {
> -      /* It's possible we don't have a full path, but rather just a
> -	 filename.  Some targets, such as HP-UX, don't provide the
> -	 full path, sigh.
> -
> -	 Attempt to qualify the filename against the source path.
> -	 (If that fails, we'll just fall back on the original
> -	 filename.  Not much more we can do...)  */
> -      if (!source_full_path_of (exec_file, &full_exec_path))
> -	full_exec_path = xstrdup (exec_file);
> -    }
> -
> -  old_chain = make_cleanup (xfree, full_exec_path);
> -  make_cleanup (free_current_contents, &prev_err.message);
> +  old_chain = make_cleanup (free_current_contents, &prev_err.message);
>  
>    /* exec_file_attach and symbol_file_add_main may throw an error if the file
>       cannot be opened either locally or remotely.
> @@ -217,7 +160,9 @@ exec_file_locate_attach (int pid, int defer_bp_reset, int from_tty)
>       errors/exceptions in the following code.  */
>    TRY
>      {
> -      exec_file_attach (full_exec_path, from_tty);
> +      /* We must do this step even if exec_file_host is NULL, so that
> +	 exec_file_attach will clear state.  */
> +      exec_file_attach (exec_file_host, from_tty);
>      }
>    CATCH (err, RETURN_MASK_ERROR)
>      {
> @@ -232,20 +177,64 @@ exec_file_locate_attach (int pid, int defer_bp_reset, int from_tty)
>      }
>    END_CATCH
>  
> -  TRY
> +  if (exec_file_host != NULL)
>      {
> -      if (defer_bp_reset)
> -	current_inferior ()->symfile_flags |= SYMFILE_DEFER_BP_RESET;
> -      symbol_file_add_main (full_exec_path, from_tty);
> +      /* SYMFILE_DEFER_BP_RESET is used as the proper displacement for PIE
> +	 (Position Independent Executable) main symbol file will get applied by
> +	 solib_create_inferior_hook below.  breakpoint_re_set would fail to insert
> +	 the breakpoints with the zero displacement.  */
> +      TRY

I don't understand how it makes sense to this comment _here_.
Move this to where the flag is first passed down.  Note how there's
no "solib_create_inferior_hook below" at all here.  This function
just passes down the "flags" argument unmodified.

> +	{
> +	  symbol_file_add_main_1 (exec_file_host, from_tty, flags);
> +
> +	  if ((inf->symfile_flags & SYMFILE_NO_READ) == 0)
> +	    set_initial_language ();

This is already done by symbol_file_add_main_1..

> +	}
> +      CATCH (err, RETURN_MASK_ERROR)
> +	{
> +	  if (!exception_print_same (prev_err, err))
> +	    warning ("%s", err.message);
> +	}
> +      END_CATCH
> +
> +      inf->symfile_flags &= ~SYMFILE_DEFER_BP_RESET;

Before the patch, inf->symfile_flags is enabled/disabled
around the body of the code.  But now you pass down
SYMFILE_DEFER_BP_RESET in 'flags'.  I think we should
be able to remove this?

>      }
> -  CATCH (err, RETURN_MASK_ERROR)
> +
> +  do_cleanups (old_chain);
> +}
> +
> +/* See gdbcore.h.  */
> +
> +void
> +exec_file_locate_attach (int pid, int defer_bp_reset, int from_tty)
> +{
> +  char *exec_file_target, *exec_file_host;
> +  struct cleanup *old_chain;
> +  symfile_add_flags flags = SYMFILE_MAINLINE;

Use int for now.  Start with 0.  try_open_exec_file
always adds the SYMFILE_MAINLINE for you.

> +
> +  /* Do nothing if we already have an executable filename.  */
> +  if (get_exec_file (0) != NULL)
> +    return;
> +
> +  /* Try to determine a filename from the process itself.  */
> +  exec_file_target = target_pid_to_exec_file (pid);
> +  if (exec_file_target == NULL)
>      {
> -      if (!exception_print_same (prev_err, err))
> -	warning ("%s", err.message);
> +      warning (_("No executable has been specified and target does not "
> +		 "support\n"
> +		 "determining executable automatically.  "
> +		 "Try using the \"file\" command."));
> +      return;
>      }
> -  END_CATCH
> -  current_inferior ()->symfile_flags &= ~SYMFILE_DEFER_BP_RESET;
>  
> +  exec_file_host = exec_file_find (exec_file_target, NULL);
> +  old_chain = make_cleanup (xfree, exec_file_host);
> +
> +  if (defer_bp_reset)
> +    flags = (enum symfile_add_flags) (flags | SYMFILE_DEFER_BP_RESET);

Now with int, you can write:

    flags |= SYMFILE_DEFER_BP_RESET;

>    gdb_assert (current_program_space == inf->pspace);
>  
> -  /* That a.out is now the one to use.  */
> -  exec_file_attach (execd_pathname, 0);
> +  /* Attempt to open the exec file.  */
> +  try_open_exec_file (exec_file_host, inf, (enum symfile_add_flags) 0, 0);

Hmm, doesn't thi lose the SYMFILE_DEFER_BP_RESET described ...

>  
> -  /* SYMFILE_DEFER_BP_RESET is used as the proper displacement for PIE
> -     (Position Independent Executable) main symbol file will get applied by
> -     solib_create_inferior_hook below.  breakpoint_re_set would fail to insert
> -     the breakpoints with the zero displacement.  */
> -
> -  symbol_file_add (execd_pathname,
> -		   (inf->symfile_flags
> -		    | SYMFILE_MAINLINE | SYMFILE_DEFER_BP_RESET),
> -		   NULL, 0);

... here, in the code that you're replacing?

Seems to be that you should leave the comment here, and do:

  /* SYMFILE_DEFER_BP_RESET is used as the proper displacement for PIE
     (Position Independent Executable) main symbol file will get applied by
     solib_create_inferior_hook below.  breakpoint_re_set would fail to insert
     the breakpoints with the zero displacement.  */
  try_open_exec_file (exec_file_host, inf, SYMFILE_DEFER_BP_RESET, 0);

Here is where it makes sense to talk about the solib_create_inferior_hook
call below, because there's actually such a call below.

> -
> -  if ((inf->symfile_flags & SYMFILE_NO_READ) == 0)
> -    set_initial_language ();
> +  do_cleanups (old_chain);
>  
>    /* If the target can specify a description, read it.  Must do this
>       after flipping to the new executable (because the target supplied

BTW, symbol_file_add_main_1 doesn't actually add "flags" to
its add_flags local, so it seems like we're actually losing 
the passed down SYMFILE_DEFER_BP_RESET?  Or is there some confusion
regarding symfile_add_flags vs objfile flags here?  Oh looks
like there is...

I think I'll go dig up my enum-flags patch, and that will I think
help clear this up a lot.

Thanks,
Pedro Alves


  reply	other threads:[~2016-10-25 18:04 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-25 17:12 Luis Machado
2016-10-25 18:04 ` Pedro Alves [this message]
2016-10-25 18:16   ` Luis Machado
2016-10-25 18:20     ` Pedro Alves
2016-10-25 18:31       ` Luis Machado
2016-10-25 19:41         ` Luis Machado
2016-10-25 19:46           ` Pedro Alves
2016-10-25 19:50             ` Luis Machado
2016-10-25 23:40               ` [PATCH v5 1/2] Make symfile_add_flags and objfile->flags strongly typed Pedro Alves
2016-10-25 23:40               ` [PATCH v5 2/2] PR 20569, segv in follow_exec Pedro Alves
2016-10-26 14:28                 ` Luis Machado
2016-10-26 16:05                   ` Luis Machado
2016-10-27 14:09                     ` Pedro Alves

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=645baeb5-e813-d97d-fcd0-d0c7ea7bf5ba@redhat.com \
    --to=palves@redhat.com \
    --cc=gdb-patches@sourceware.org \
    --cc=lgustavo@codesourcery.com \
    --cc=sandra@codesourcery.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