Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Jim Blandy <jimb@redhat.com>
To: gdb-patches@sources.redhat.com
Cc: Kris Warkentin <kewarken@qnx.com>, Daniel Jacobowitz <drow@mvista.com>
Subject: RFA: osabi: correct test for compatible handlers
Date: Tue, 21 Oct 2003 22:23:00 -0000	[thread overview]
Message-ID: <vt2n0buw7r5.fsf@zenia.home> (raw)


I think I've found the answer to the question Kris and Daniel were
discussing back in June:

http://sources.redhat.com/ml/gdb/2003-06/msg00323.html

The following patch would, I believe, fix Kris's problem, but the
comments also explain why the patch he proposed isn't the right fix.

The effect of the patch is to change the existing test:
        
  arch_info->compatible (arch_info, handler->arch_info) == handler->arch_info

to:

  arch_info == handler->arch_info
  || arch_info->compatible (arch_info, handler->arch_info) == arch_info

but it's wrapped up and commented in a way that makes it clearer why
that is correct.


2003-10-21  Jim Blandy  <jimb@redhat.com>

	* osabi.c (gdbarch_init_osabi): A handler is okay if it's for an
	architecture the current arch can run code for --- but not if it's
	a superset.
	(can_run_code_for): New function.

Index: gdb/osabi.c
===================================================================
RCS file: /cvs/src/src/gdb/osabi.c,v
retrieving revision 1.17
diff -c -r1.17 osabi.c
*** gdb/osabi.c	24 Aug 2003 11:47:18 -0000	1.17
--- gdb/osabi.c	21 Oct 2003 22:15:18 -0000
***************
*** 283,293 ****
      return match;
  }
  
  void
  gdbarch_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
  {
    const struct bfd_arch_info *arch_info = gdbarch_bfd_arch_info (gdbarch);
-   const struct bfd_arch_info *compatible;
    struct gdb_osabi_handler *handler;
  
    if (info.osabi == GDB_OSABI_UNKNOWN)
--- 283,311 ----
      return match;
  }
  
+ 
+ /* Return non-zero if architecture A can run code written for
+    architecture B.  */
+ static int
+ can_run_code_for (const struct bfd_arch_info *a, const struct bfd_arch_info *b)
+ {
+   /* BFD's 'A->compatible (A, B)' functions return zero if A and B are
+      incompatible.  But if they are compatible, it returns the 'more
+      featureful' of the two arches.  That is, if A can run code
+      written for B, but B can't run code written for A, then it'll
+      return A.
+ 
+      struct bfd_arch_info objects are atoms: that is, there's supposed
+      to be exactly one instance for a given machine.  So you can tell
+      whether two are equivalent by comparing pointers.  */
+   return (a == b || a->compatible (a, b) == a);
+ }
+ 
+ 
  void
  gdbarch_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
  {
    const struct bfd_arch_info *arch_info = gdbarch_bfd_arch_info (gdbarch);
    struct gdb_osabi_handler *handler;
  
    if (info.osabi == GDB_OSABI_UNKNOWN)
***************
*** 303,318 ****
        if (handler->osabi != info.osabi)
  	continue;
  
!       /* Check whether the machine type and architecture of the
!          handler are compatible with the desired machine type and
!          architecture.
  
! 	 NOTE: kettenis/20021027: There may be more than one machine
  	 type that is compatible with the desired machine type.  Right
  	 now we simply return the first match, which is fine for now.
  	 However, we might want to do something smarter in the future.  */
!       compatible = arch_info->compatible (arch_info, handler->arch_info);
!       if (compatible == handler->arch_info)
  	{
  	  (*handler->init_osabi) (info, gdbarch);
  	  return;
--- 321,339 ----
        if (handler->osabi != info.osabi)
  	continue;
  
!       /* If the architecture described by ARCH_INFO can run code for
!          the architcture we registered the handler for, then the
!          handler is applicable.  Note, though, that if the handler is
!          for an architecture that is a superset of ARCH_INFO, we can't
!          use that --- it would be perfectly correct for it to install
!          gdbarch methods that refer to registers / instructions /
!          other facilities ARCH_INFO doesn't have.
  
!          NOTE: kettenis/20021027: There may be more than one machine
  	 type that is compatible with the desired machine type.  Right
  	 now we simply return the first match, which is fine for now.
  	 However, we might want to do something smarter in the future.  */
!       if (can_run_code_for (arch_info, handler->arch_info))
  	{
  	  (*handler->init_osabi) (info, gdbarch);
  	  return;


             reply	other threads:[~2003-10-21 22:23 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-10-21 22:23 Jim Blandy [this message]
2003-10-22 19:09 ` Andrew Cagney
     [not found]   ` <vt23cdlvy21 dot fsf at zenia dot home>
     [not found]     ` <3F970598 dot 9020908 at redhat dot com>
2003-10-22 19:11   ` Daniel Jacobowitz
2003-10-22 19:33     ` Andrew Cagney
2003-10-22 20:04   ` Jim Blandy
2003-10-22 22:32     ` Andrew Cagney
2003-10-22 23:16       ` Jim Blandy
2003-10-22 23:28         ` David Carlton
2003-10-23 15:39           ` Mark Kettenis
2003-10-23 21:20             ` Jim Blandy
2003-10-23  1:29         ` Andrew Cagney

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=vt2n0buw7r5.fsf@zenia.home \
    --to=jimb@redhat.com \
    --cc=drow@mvista.com \
    --cc=gdb-patches@sources.redhat.com \
    --cc=kewarken@qnx.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