This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

AIX 64bit support


Hi All,

Below patches adds the support for 64-bit gdb for ppc64 running on
AIX, plus some bug fixes which are caused
by the way gcc and xlc generated binary are read. Please consider the
patches if its fine.

gdb:


        * configure.tgt (powerpc64-*-aix*): Match powerpc64 running aix.

        * configure.host (powerpc64-*-aix*): Likewise.

        * aix-thread.c (ptrace64aix): Added BFD64 for 64 bit support.
        (ptrace32): Likewise.
        (pdc_read_regs): Likewise.
        (pdc_write_regs): Likewise.
        (aix_thread_resume): Likewise.
        (fetch_regs_kernel_thread): Likewise.
        (store_regs_kernel_thread): Likewise.

        * inf-ptrace.c (inf_ptrace_follow_fork): Added BFD64 for 64 bit support.
        (inf_ptrace_me): Likewise.
        (inf_ptrace_post_startup_inferior): Likewise.
        (inf_ptrace_attach): Likewise.
        (inf_ptrace_post_attach): Likewise.
        (inf_ptrace_detach): Likewise.
        (inf_ptrace_kill): Likewise.
        (inf_ptrace_resume): Likewise.
        (inf_ptrace_wait): Likewise.
        (inf_ptrace_xfer_partial): Likewise.
        (inf_ptrace_fetch_register): Likewise.
        (inf_ptrace_store_register): Likewise.

        * rs6000-nat.c (global): Check for __ld_info64 if compiling 64-bit gdb.
        (rs6000_ptrace32): Added BFD64 for 64 bit support.
        (rs6000_ptrace64): Likewise.

        * xcoffread.c (read_xcoff_symtab): Make fcn_start_addr large
enough to hold 64-bit address.
        Skip reading symbols starting with @FIX.
        Read correct auxilliary entry if the entries are more than one
in cases like xlc generated binary.
        Read the filename from CSECT entry,if we break at CSECT entry
other than first entry  we need to get
        the filename instead of _start_.

        * config/rs6000/nm-rs6000.h: When analysing core check if ptid is not 1.

        * symtab.c (find_pc_sect_line): Read correct line table
entries, xlc compiler generates extra entry.

--- ./gdb/configure.tgt_orig	2012-07-25 15:59:30.934837815 +0530
+++ ./gdb/configure.tgt	2012-07-31 14:16:36.761045509 +0530
@@ -406,7 +406,7 @@
 	gdb_target_obs="rs6000-tdep.o ppc-sysv-tdep.o ppcobsd-tdep.o \
 			corelow.o solib.o solib-svr4.o"
 	;;
-powerpc-*-aix* | rs6000-*-*)
+powerpc-*-aix* | rs6000-*-* | powerpc64-*-aix*)
 	# Target: PowerPC running AIX
 	gdb_target_obs="rs6000-tdep.o rs6000-aix-tdep.o xcoffread.o \
 			ppc-sysv-tdep.o solib.o solib-svr4.o"
--- ./gdb/configure.host_orig	2012-07-31 13:27:34.729045416 +0530
+++ ./gdb/configure.host	2012-07-31 13:28:55.717046154 +0530
@@ -123,7 +123,7 @@
 			gdb_host=nbsd ;;
 mips64*-*-openbsd*)	gdb_host=obsd64 ;;

-powerpc-*-aix* | rs6000-*-*)
+powerpc-*-aix* | powerpc64-*-aix* | rs6000-*-*)
 			gdb_host=aix ;;
 powerpc-*-linux*)	gdb_host=linux ;;
 powerpc-*-netbsd* | powerpc-*-knetbsd*-gnu)
--- ./gdb/aix-thread.c_orig	2012-08-07 17:11:21.270057686 +0530
+++ ./gdb/aix-thread.c	2012-08-07 17:11:17.998084929 +0530
@@ -239,23 +239,42 @@
 }

 /* Call ptracex (REQ, ID, ADDR, DATA, BUF).  Return success.  */
+/* For 64-bit gdb Call ptrace64 to trace 32-bit and 64-bit debugee */

 static int
+#ifdef BFD64
+ptrace64aix (int req, long long id, long long addr, int data, int *buf)
+{
+  errno = 0;
+  return ptrace_check (req, id, ptrace64 (req, id, addr, data, buf));
+}
+#else
 ptrace64aix (int req, int id, long long addr, int data, int *buf)
 {
   errno = 0;
   return ptrace_check (req, id, ptracex (req, id, addr, data, buf));
 }
+#endif

 /* Call ptrace (REQ, ID, ADDR, DATA, BUF).  Return success.  */
+/* For 64-bit gdb Call ptrace64 to trace 32-bit and 64-bit debugee */

 static int
+#ifdef BFD64
+ptrace32 (int req, long long id, long long addr, int data, int *buf)
+{
+  errno = 0;
+  return ptrace_check (req, id,
+                      ptrace64 (req, id, addr, data, buf));
+}
+#else
 ptrace32 (int req, int id, int *addr, int data, int *buf)
 {
   errno = 0;
   return ptrace_check (req, id,
 		       ptrace (req, id, (int *) addr, data, buf));
 }
+#endif

 /* If *PIDP is a composite process/thread id, convert it to a
    process id.  */
@@ -346,14 +365,23 @@
     {
       if (arch64)
 	{
+          #ifdef BFD64
+          if (!ptrace64aix (PTT_READ_GPRS, tid,
+                            (long long) gprs64, 0, NULL))
+          #else
 	  if (!ptrace64aix (PTT_READ_GPRS, tid,
 			    (unsigned long) gprs64, 0, NULL))
+          #endif
 	    memset (gprs64, 0, sizeof (gprs64));
 	  memcpy (context->gpr, gprs64, sizeof(gprs64));
 	}
       else
 	{
+          #ifdef BFD64
+          if (!ptrace32 (PTT_READ_GPRS, tid, (long long) gprs32, 0, NULL))
+          #else
 	  if (!ptrace32 (PTT_READ_GPRS, tid, gprs32, 0, NULL))
+          #endif
 	    memset (gprs32, 0, sizeof (gprs32));
 	  memcpy (context->gpr, gprs32, sizeof(gprs32));
 	}
@@ -362,7 +390,11 @@
   /* Floating-point registers.  */
   if (flags & PTHDB_FLAG_FPRS)
     {
+      #ifdef BFD64
+      if (!ptrace32 (PTT_READ_FPRS, tid, (long long) fprs, 0 , NULL))
+      #else
       if (!ptrace32 (PTT_READ_FPRS, tid, (void *) fprs, 0, NULL))
+      #endif
 	memset (fprs, 0, sizeof (fprs));
       memcpy (context->fpr, fprs, sizeof(fprs));
     }
@@ -372,14 +404,23 @@
     {
       if (arch64)
 	{
+          #ifdef BFD64
+          if (!ptrace64aix (PTT_READ_SPRS, tid,
+                            (long long) &sprs64, 0, NULL))
+          #else
 	  if (!ptrace64aix (PTT_READ_SPRS, tid,
 			    (unsigned long) &sprs64, 0, NULL))
+          #endif
 	    memset (&sprs64, 0, sizeof (sprs64));
       	  memcpy (&context->msr, &sprs64, sizeof(sprs64));
 	}
       else
 	{
+          #ifdef BFD64
+          if (!ptrace32 (PTT_READ_SPRS, tid, (long long) &sprs32, 0, NULL))
+          #else
 	  if (!ptrace32 (PTT_READ_SPRS, tid, (int *) &sprs32, 0, NULL))
+          #endif
 	    memset (&sprs32, 0, sizeof (sprs32));
       	  memcpy (&context->msr, &sprs32, sizeof(sprs32));
 	}
@@ -411,16 +452,29 @@
   if (flags & PTHDB_FLAG_GPRS)
     {
       if (arch64)
+        #ifdef BFD64
+        ptrace64aix (PTT_WRITE_GPRS, tid,
+                     (long long) context->gpr, 0, NULL);
+        #else
 	ptrace64aix (PTT_WRITE_GPRS, tid,
 		     (unsigned long) context->gpr, 0, NULL);
+        #endif
       else
+        #ifdef BFD64
+        ptrace32 (PTT_WRITE_GPRS, tid, (long long) context->gpr, 0, NULL);
+        #else
 	ptrace32 (PTT_WRITE_GPRS, tid, (int *) context->gpr, 0, NULL);
+        #endif
     }

  /* Floating-point registers.  */
   if (flags & PTHDB_FLAG_FPRS)
     {
+      #ifdef BFD64
+      ptrace32 (PTT_WRITE_FPRS, tid, (long long) context->fpr, 0, NULL);
+      #else
       ptrace32 (PTT_WRITE_FPRS, tid, (int *) context->fpr, 0, NULL);
+      #endif
     }

   /* Special-purpose registers.  */
@@ -428,12 +482,21 @@
     {
       if (arch64)
 	{
+          #ifdef BFD64
+          ptrace64aix (PTT_WRITE_SPRS, tid,
+                       (long long) &context->msr, 0, NULL);
+          #else
 	  ptrace64aix (PTT_WRITE_SPRS, tid,
 		       (unsigned long) &context->msr, 0, NULL);
+          #endif
 	}
       else
 	{
+          #ifdef BFD64
+          ptrace32 (PTT_WRITE_SPRS, tid, (long long) &context->msr, 0, NULL);
+          #else
 	  ptrace32 (PTT_WRITE_SPRS, tid, (void *) &context->msr, 0, NULL);
+          #endif
 	}
     }
   return 0;
@@ -998,11 +1061,21 @@
       tid[1] = 0;

       if (arch64)
+        #ifdef BFD64
+        ptrace64aix (PTT_CONTINUE, tid[0], (long long) 1,
+                     target_signal_to_host (sig), (void *) tid);
+        #else
 	ptrace64aix (PTT_CONTINUE, tid[0], 1,
 		     target_signal_to_host (sig), (void *) tid);
+        #endif
       else
+        #ifdef BFD64
+        ptrace32 (PTT_CONTINUE, tid[0], (long long) 1,
+                  target_signal_to_host (sig), (void *) tid);
+        #else
 	ptrace32 (PTT_CONTINUE, tid[0], (int *) 1,
 		  target_signal_to_host (sig), (void *) tid);
+        #endif
     }
 }

@@ -1231,14 +1304,24 @@
     {
       if (arch64)
 	{
+          #ifdef BFD64
+          if (!ptrace64aix (PTT_READ_GPRS, tid,
+                           (long long) gprs64, 0, NULL))
+          #else
 	  if (!ptrace64aix (PTT_READ_GPRS, tid,
 			    (unsigned long) gprs64, 0, NULL))
+          #endif
 	    memset (gprs64, 0, sizeof (gprs64));
 	  supply_gprs64 (regcache, gprs64);
 	}
       else
 	{
+          #ifdef BFD64
+          if (!ptrace32 (PTT_READ_GPRS, tid,
+                         (long long) gprs32, 0, NULL))
+          #else
 	  if (!ptrace32 (PTT_READ_GPRS, tid, gprs32, 0, NULL))
+          #endif
 	    memset (gprs32, 0, sizeof (gprs32));
 	  for (i = 0; i < ppc_num_gprs; i++)
 	    supply_reg32 (regcache, tdep->ppc_gp0_regnum + i, gprs32[i]);
@@ -1252,7 +1335,12 @@
           || (regno >= tdep->ppc_fp0_regnum
               && regno < tdep->ppc_fp0_regnum + ppc_num_fprs)))
     {
+      #ifdef BFD64
+      if (!ptrace32 (PTT_READ_FPRS, tid,
+                     (long long) fprs, 0, NULL))
+      #else
       if (!ptrace32 (PTT_READ_FPRS, tid, (void *) fprs, 0, NULL))
+      #endif
 	memset (fprs, 0, sizeof (fprs));
       supply_fprs (regcache, fprs);
     }
@@ -1263,8 +1351,13 @@
     {
       if (arch64)
 	{
+          #ifdef BFD64
+          if (!ptrace64aix (PTT_READ_SPRS, tid,
+                            (long long ) &sprs64, 0, NULL))
+          #else
 	  if (!ptrace64aix (PTT_READ_SPRS, tid,
 			    (unsigned long) &sprs64, 0, NULL))
+          #endif
 	    memset (&sprs64, 0, sizeof (sprs64));
 	  supply_sprs64 (regcache, sprs64.pt_iar, sprs64.pt_msr,
 			 sprs64.pt_cr, sprs64.pt_lr, sprs64.pt_ctr,
@@ -1274,7 +1367,12 @@
 	{
 	  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);

+          #ifdef BFD64
+	  if (!ptrace32 (PTT_READ_SPRS, tid, (long long ) &sprs32,
+                         0, NULL))
+          #else
 	  if (!ptrace32 (PTT_READ_SPRS, tid, (int *) &sprs32, 0, NULL))
+          #endif
 	    memset (&sprs32, 0, sizeof (sprs32));
 	  supply_sprs32 (regcache, sprs32.pt_iar, sprs32.pt_msr, sprs32.pt_cr,
 			 sprs32.pt_lr, sprs32.pt_ctr, sprs32.pt_xer,
@@ -1561,16 +1659,32 @@
       if (arch64)
 	{
 	  /* Pre-fetch: some regs may not be in the cache.  */
+          #ifdef BFD64
+          ptrace64aix (PTT_READ_GPRS, tid, (long long) gprs64, 0, NULL);
+          #else
 	  ptrace64aix (PTT_READ_GPRS, tid, (unsigned long) gprs64, 0, NULL);
+          #endif
 	  fill_gprs64 (regcache, gprs64);
+	  #ifdef BFD64
+          ptrace64aix (PTT_WRITE_GPRS, tid, (long long) gprs64, 0, NULL);
+          #else
 	  ptrace64aix (PTT_WRITE_GPRS, tid, (unsigned long) gprs64, 0, NULL);
+          #endif
 	}
       else
 	{
 	  /* Pre-fetch: some regs may not be in the cache.  */
+	  #ifdef BFD64
+	  ptrace32 (PTT_READ_GPRS, tid, (long long) gprs32, 0, NULL);
+          #else
 	  ptrace32 (PTT_READ_GPRS, tid, gprs32, 0, NULL);
+          #endif
 	  fill_gprs32 (regcache, gprs32);
+          #ifdef BFD64
+          ptrace32 (PTT_WRITE_GPRS, tid, (long long) gprs32, 0, NULL);
+          #else
 	  ptrace32 (PTT_WRITE_GPRS, tid, gprs32, 0, NULL);
+          #endif
 	}
     }

@@ -1582,9 +1696,17 @@
               && regno < tdep->ppc_fp0_regnum + ppc_num_fprs)))
     {
       /* Pre-fetch: some regs may not be in the cache.  */
+      #ifdef BFD64
+      ptrace32 (PTT_READ_FPRS, tid, (long long) fprs, 0, NULL);
+      #else
       ptrace32 (PTT_READ_FPRS, tid, (void *) fprs, 0, NULL);
+      #endif
       fill_fprs (regcache, fprs);
+      #ifdef BFD64
+      ptrace32 (PTT_WRITE_FPRS, tid, (long long) fprs, 0, NULL);
+      #else
       ptrace32 (PTT_WRITE_FPRS, tid, (void *) fprs, 0, NULL);
+      #endif
     }

   /* Special-purpose registers.  */
@@ -1594,13 +1716,23 @@
       if (arch64)
 	{
 	  /* Pre-fetch: some registers won't be in the cache.  */
+          #ifdef BFD64
+	  ptrace64aix (PTT_READ_SPRS, tid,
+                      (long long) &sprs64, 0, NULL);
+          #else
 	  ptrace64aix (PTT_READ_SPRS, tid,
 		       (unsigned long) &sprs64, 0, NULL);
+          #endif
 	  fill_sprs64 (regcache, &sprs64.pt_iar, &sprs64.pt_msr,
 		       &sprs64.pt_cr, &sprs64.pt_lr, &sprs64.pt_ctr,
 		       &sprs64.pt_xer, &sprs64.pt_fpscr);
+          #ifdef BFD64
+	  ptrace64aix (PTT_WRITE_SPRS, tid,
+                       (long long ) &sprs64, 0, NULL);
+          #else
 	  ptrace64aix (PTT_WRITE_SPRS, tid,
 		       (unsigned long) &sprs64, 0, NULL);
+          #endif
 	}
       else
 	{
@@ -1616,7 +1748,12 @@
 	  gdb_assert (sizeof (sprs32.pt_iar) == 4);

 	  /* Pre-fetch: some registers won't be in the cache.  */
+          #ifdef BFD64
+	  ptrace32 (PTT_READ_SPRS, tid,
+                    (long long) &sprs32, 0, NULL);
+          #else
 	  ptrace32 (PTT_READ_SPRS, tid, (int *) &sprs32, 0, NULL);
+          #endif

 	  fill_sprs32 (regcache, &tmp_iar, &tmp_msr, &tmp_cr, &tmp_lr,
 		       &tmp_ctr, &tmp_xer, &tmp_fpscr);
@@ -1635,7 +1772,11 @@
 	      regcache_raw_collect (regcache, tdep->ppc_mq_regnum,
 				    &sprs32.pt_mq);

+          #ifdef BFD64
+ 	  ptrace32 (PTT_WRITE_SPRS, tid, (long long) &sprs32, 0, NULL);
+          #else
 	  ptrace32 (PTT_WRITE_SPRS, tid, (int *) &sprs32, 0, NULL);
+          #endif
 	}
     }
 }
--- ./gdb/inf-ptrace.c_orig	2012-07-25 21:07:04.273078850 +0530
+++ ./gdb/inf-ptrace.c	2012-08-02 00:35:56.425443341 +0530
@@ -49,8 +49,13 @@

   pid = ptid_get_pid (inferior_ptid);

+  #ifdef BFD64
+  if (ptrace64 (PT_GET_PROCESS_STATE, (long long) pid,
+                (long long) &pe, sizeof pe) == -1)
+  #else
   if (ptrace (PT_GET_PROCESS_STATE, pid,
 	       (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
+  #endif
     perror_with_name (("ptrace"));

   gdb_assert (pe.pe_report_event == PTRACE_FORK);
@@ -74,7 +79,13 @@
 	 it.  */
       remove_breakpoints ();

+      #ifdef BFD64
+      if (ptrace64 (PT_DETACH, (long long) pid,
+                    (long long) 1, 0) == -1)
+      #else
       if (ptrace (PT_DETACH, pid, (PTRACE_TYPE_ARG3)1, 0) == -1)
+      #endif
+
 	perror_with_name (("ptrace"));

       /* Switch inferior_ptid out of the parent's way.  */
@@ -90,7 +101,12 @@
       /* Breakpoints have already been detached from the child by
 	 infrun.c.  */

+      #ifdef BFD64
+      if (ptrace64 (PT_DETACH, (long long) fpid,
+                  (long long) 1, 0) == -1)
+      #else
       if (ptrace (PT_DETACH, fpid, (PTRACE_TYPE_ARG3)1, 0) == -1)
+      #endif
 	perror_with_name (("ptrace"));
     }

@@ -106,7 +122,11 @@
 inf_ptrace_me (void)
 {
   /* "Trace me, Dr. Memory!"  */
+  #ifdef BFD64
+  ptrace64 (PT_TRACE_ME, (long long) 0, (long long) 0, 0, 0);
+  #else
   ptrace (PT_TRACE_ME, 0, (PTRACE_TYPE_ARG3)0, 0);
+  #endif
 }

 /* Start a new inferior Unix child process.  EXEC_FILE is the file to
@@ -159,8 +179,13 @@
   /* Set the initial event mask.  */
   memset (&pe, 0, sizeof pe);
   pe.pe_set_event |= PTRACE_FORK;
+  #ifdef BFD64
+  if (ptrace64 (PT_SET_EVENT_MASK, (long long) ptid_get_pid (pid),
+                (long long) &pe, sizeof pe, 0) == -1)
+  #else
   if (ptrace (PT_SET_EVENT_MASK, ptid_get_pid (pid),
 	      (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
+  #endif
     perror_with_name (("ptrace"));
 }

@@ -229,7 +254,11 @@

 #ifdef PT_ATTACH
   errno = 0;
+  #ifdef BFD64
+  ptrace64 (PT_ATTACH, (long long) pid, (long long) 0, 0, 0);
+  #else
   ptrace (PT_ATTACH, pid, (PTRACE_TYPE_ARG3)0, 0);
+  #endif
   if (errno != 0)
     perror_with_name (("ptrace"));
 #else
@@ -259,8 +288,13 @@
   /* Set the initial event mask.  */
   memset (&pe, 0, sizeof pe);
   pe.pe_set_event |= PTRACE_FORK;
+  #ifdef BFD64
+  if (ptrace64 (PT_SET_EVENT_MASK, (long long) pid,
+                (long long) &pe, sizeof pe, 0) == -1)
+  #else
   if (ptrace (PT_SET_EVENT_MASK, pid,
 	      (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
+  #endif
     perror_with_name (("ptrace"));
 }

@@ -293,7 +327,11 @@
      previously attached to the inferior.  It *might* work if we
      started the process ourselves.  */
   errno = 0;
+  #ifdef BFD64
+  ptrace64 (PT_DETACH, (long long) pid, (long long) 1, sig, 0);
+  #else
   ptrace (PT_DETACH, pid, (PTRACE_TYPE_ARG3)1, sig);
+  #endif
   if (errno != 0)
     perror_with_name (("ptrace"));
 #else
@@ -318,7 +356,11 @@
   if (pid == 0)
     return;

+  #ifdef BFD64
+  ptrace64 (PT_KILL, (long long) pid, (long long) 0, 0, 0);
+  #else
   ptrace (PT_KILL, pid, (PTRACE_TYPE_ARG3)0, 0);
+  #endif
   waitpid (pid, &status, 0);

   target_mourn_inferior ();
@@ -372,7 +414,12 @@
      where it was.  If GDB wanted it to start some other way, we have
      already written a new program counter value to the child.  */
   errno = 0;
+  #ifdef BFD64
+  ptrace64 (request, (long long) pid, (long long) 1,
+            target_signal_to_host (signal), 0);
+  #else
   ptrace (request, pid, (PTRACE_TYPE_ARG3)1, target_signal_to_host (signal));
+  #endif
   if (errno != 0)
     perror_with_name (("ptrace"));
 }
@@ -425,8 +472,13 @@
       ptrace_state_t pe;
       pid_t fpid;

+      #ifdef BFD64
+      if (ptrace64 (PT_GET_PROCESS_STATE, (long long) pid,
+                    (long long) &pe, sizeof pe, 0) == -1)
+      #else
       if (ptrace (PT_GET_PROCESS_STATE, pid,
 		  (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
+      #endif
 	perror_with_name (("ptrace"));

       switch (pe.pe_report_event)
@@ -440,8 +492,13 @@
 	  if (fpid == -1)
 	    perror_with_name (("waitpid"));

+          #ifdef BFD64
+	  if (ptrace64 (PT_GET_PROCESS_STATE, (long long) fpid,
+                        (long long) &pe, sizeof pe, 0) == -1)
+          #else
 	  if (ptrace (PT_GET_PROCESS_STATE, fpid,
 		      (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1)
+          #endif
 	    perror_with_name (("ptrace"));

 	  gdb_assert (pe.pe_report_event == PTRACE_FORK);
@@ -495,7 +552,11 @@
 	piod.piod_len = len;

 	errno = 0;
+        #ifdef BFD64
+        if (ptrace64 (PT_IO, (long long) pid, (long long) &piod, 0, 0) == 0)
+        #else
 	if (ptrace (PT_IO, pid, (caddr_t)&piod, 0) == 0)
+        #endif
 	  /* Return the actual number of bytes read or written.  */
 	  return piod.piod_len;
 	/* If the PT_IO request is somehow not supported, fallback on
@@ -536,9 +597,14 @@
 		|| (offset + partial_len
 		    < rounded_offset + sizeof (PTRACE_TYPE_RET)))
 	      /* Need part of initial word -- fetch it.  */
+              #ifdef BFD64
+	      buffer.word = ptrace64 (PT_READ_I, (long long) pid,
+                                      (long long) rounded_offset, 0, 0);
+              #else
 	      buffer.word = ptrace (PT_READ_I, pid,
 				    (PTRACE_TYPE_ARG3)(uintptr_t)
 				    rounded_offset, 0);
+              #endif

 	    /* Copy data to be written over corresponding part of
 	       buffer.  */
@@ -546,17 +612,28 @@
 		    writebuf, partial_len);

 	    errno = 0;
+            #ifdef BFD64
+            ptrace64 (PT_WRITE_D, (long long) pid,
+                      (long long) rounded_offset, buffer.word, 0);
+            #else
 	    ptrace (PT_WRITE_D, pid,
 		    (PTRACE_TYPE_ARG3)(uintptr_t)rounded_offset,
 		    buffer.word);
+            #endif
 	    if (errno)
 	      {
 		/* Using the appropriate one (I or D) is necessary for
 		   Gould NP1, at least.  */
 		errno = 0;
+                #ifdef BFD64
+                ptrace64 (PT_WRITE_I, (long long) pid,
+                          (long long) rounded_offset,
+                          buffer.word, 0);
+                #else
 		ptrace (PT_WRITE_I, pid,
 			(PTRACE_TYPE_ARG3)(uintptr_t)rounded_offset,
 			buffer.word);
+                #endif
 		if (errno)
 		  return 0;
 	      }
@@ -565,9 +642,15 @@
 	if (readbuf)
 	  {
 	    errno = 0;
+            #ifdef BFD64
+            buffer.word = ptrace64 (PT_READ_I, (long long) pid,
+                                    (long long) rounded_offset,
+                                    0, 0);
+            #else
 	    buffer.word = ptrace (PT_READ_I, pid,
 				  (PTRACE_TYPE_ARG3)(uintptr_t)rounded_offset,
 				  0);
+            #endif
 	    if (errno)
 	      return 0;
 	    /* Copy appropriate bytes out of the buffer.  */
@@ -687,7 +770,11 @@
   for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
     {
       errno = 0;
+      #ifdef BFD64
+      buf[i] = ptrace64 (PT_READ_U, (long long) pid, (long long) addr, 0, 0);
+      #else
       buf[i] = ptrace (PT_READ_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, 0);
+      #endif
       if (errno != 0)
 	error (_("Couldn't read register %s (#%d): %s."),
 	       gdbarch_register_name (gdbarch, regnum),
@@ -746,7 +833,11 @@
   for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
     {
       errno = 0;
+      #ifdef BFD64
+      ptrace64 (PT_WRITE_U, (long long) pid, (long long) addr, buf[i], 0);
+      #else
       ptrace (PT_WRITE_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, buf[i]);
+      #endif
       if (errno != 0)
 	error (_("Couldn't write register %s (#%d): %s."),
 	       gdbarch_register_name (gdbarch, regnum),
--- ./gdb/rs6000-nat.c_orig	2012-07-25 21:07:40.838080241 +0530
+++ ./gdb/rs6000-nat.c	2012-07-27 11:27:27.560170366 +0530
@@ -66,7 +66,7 @@
 /* In 32-bit compilation mode (which is the only mode from which ptrace()
    works on 4.3), __ld_info32 is #defined as equivalent to ld_info.  */

-#ifdef __ld_info32
+#if defined (__ld_info32) || defined (__ld_info64)
 # define ARCH3264
 #endif

@@ -181,7 +181,11 @@
 static int
 rs6000_ptrace32 (int req, int id, int *addr, int data, int *buf)
 {
+  #ifdef BFD64
+  int ret = ptrace64 (req, (long long) id, (long long) addr, data, buf);
+  #else
   int ret = ptrace (req, id, (int *)addr, data, buf);
+  #endif
 #if 0
   printf ("rs6000_ptrace32 (%d, %d, 0x%x, %08x, 0x%x) = 0x%x\n",
 	  req, id, (unsigned int)addr, data, (unsigned int)buf, ret);
@@ -195,7 +199,11 @@
 rs6000_ptrace64 (int req, int id, long long addr, int data, void *buf)
 {
 #ifdef ARCH3264
+  #ifdef BFD64
+  int ret = ptrace64 (req, (long long) id, addr, data, (int *)buf);
+  #else
   int ret = ptracex (req, id, addr, data, buf);
+  #endif
 #else
   int ret = 0;
 #endif
--- ./gdb/xcoffread.c_orig	2012-08-07 17:36:42.378057756 +0530
+++ ./gdb/xcoffread.c	2012-08-07 17:36:48.702060320 +0530
@@ -956,7 +956,7 @@
   unsigned int max_symnum;
   int just_started = 1;
   int depth = 0;
-  int fcn_start_addr = 0;
+  file_ptr fcn_start_addr = 0;

   struct coff_symbol fcn_stab_saved = { 0 };

@@ -1061,7 +1061,7 @@
       }

       /* if symbol name starts with ".$" or "$", ignore it.  */
-      if (cs->c_name[0] == '$'
+      if (cs->c_name[0] == '$' || (!strncmp(cs->c_name, "@FIX", 4))
 	  || (cs->c_name[1] == '$' && cs->c_name[0] == '.'))
 	continue;

@@ -1081,8 +1081,7 @@
 	  /* Done with all files, everything from here on is globals.  */
 	}

-      if ((cs->c_sclass == C_EXT || cs->c_sclass == C_HIDEXT)
-	  && cs->c_naux == 1)
+      if (cs->c_sclass == C_EXT || cs->c_sclass == C_HIDEXT)
 	{
 	  /* Dealing with a symbol with a csect entry.  */

@@ -1093,8 +1092,16 @@
 #define	CSECT_SCLAS(PP) (CSECT(PP).x_smclas)

 	  /* Convert the auxent to something we can access.  */
-	  bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
-				0, cs->c_naux, &main_aux);
+          /* xcoff can have more than 1 auxent */
+          if (cs->c_naux > 1)
+              bfd_coff_swap_aux_in (abfd,
+                                    raw_auxptr + ((coff_data
(abfd)->local_symesz) * (cs->c_naux - 1)),
+                                    cs->c_type, cs->c_sclass,
cs->c_naux - 1, cs->c_naux, &main_aux);
+          else if (cs->c_naux == 1)
+	      bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
+				    0, cs->c_naux, &main_aux);
+          else
+              ;

 	  switch (CSECT_SMTYP (&main_aux))
 	    {
@@ -1123,43 +1130,44 @@
 		         approach does not work!  GCC (and I think xlc) seem
 		         to put all the code in the unnamed program csect.  */

-		      if (last_csect_name)
-			{
-			  complete_symtab (filestring, file_start_addr);
-			  cur_src_end_addr = file_end_addr;
-			  end_symtab (file_end_addr, objfile,
-				      SECT_OFF_TEXT (objfile));
-			  end_stabs ();
-			  start_stabs ();
-			  /* Give all csects for this source file the same
-			     name.  */
-			  start_symtab (filestring, NULL, (CORE_ADDR) 0);
-			  record_debugformat (debugfmt);
-			}
-
-		      /* If this is the very first csect seen,
-		         basically `__start'.  */
-		      if (just_started)
-			{
-			  first_object_file_end
-			    = cs->c_value + CSECT_LEN (&main_aux);
-			  just_started = 0;
-			}
-
-		      file_start_addr =
-			cs->c_value + ANOFFSET (objfile->section_offsets,
-						SECT_OFF_TEXT (objfile));
-		      file_end_addr = file_start_addr + CSECT_LEN (&main_aux);
-
-		      if (cs->c_name && (cs->c_name[0] == '.'
-					 || cs->c_name[0] == '@'))
-			{
-			  last_csect_name = cs->c_name;
-			  last_csect_val = cs->c_value;
-			  last_csect_sec = secnum_to_section (cs->c_secnum,
-							      objfile);
-			}
-		    }
+                       if (just_started)
+                       {
+                          first_object_file_end
+                            = cs->c_value + CSECT_LEN (&main_aux);
+                          just_started = 0;
+                       }
+
+                       file_start_addr =
+                         cs->c_value + ANOFFSET (objfile->section_offsets,
+                                               SECT_OFF_TEXT (objfile));
+                       file_end_addr = file_start_addr + CSECT_LEN (&main_aux);
+
+                       if (cs->c_name && (cs->c_name[0] == '.'
+                                         || cs->c_name[0] == '@'))
+                       {
+                          last_csect_name = cs->c_name;
+                          last_csect_val = cs->c_value;
+                          last_csect_sec = secnum_to_section (cs->c_secnum,
+                                                              objfile);
+                       }
+                       if (last_csect_name)
+                       {
+                          filestring = pst->filename;
+                          complete_symtab (filestring, file_start_addr);
+                          cur_src_end_addr = file_end_addr;
+                          end_symtab (file_end_addr, objfile,
+                                      SECT_OFF_TEXT (objfile));
+                          end_stabs ();
+                          start_stabs ();
+                          /* Give all csects for this source file the same
+                             name.  */
+                          start_symtab (filestring, (char *)NULL,
(CORE_ADDR) 0);
+                          record_debugformat (debugfmt);
+                       }
+                      /* If this is the very first csect seen,
+                         basically `__start'.  */
+                    }
+
 		    continue;

 		    /* All other symbols are put into the minimal symbol
--- ./gdb/config/rs6000/nm-rs6000.h_orig	2012-08-07 17:48:46.181058139 +0530
+++ ./gdb/config/rs6000/nm-rs6000.h	2012-08-07 17:47:18.749096013 +0530
@@ -30,7 +30,7 @@
    and figure out where the shared libraries have got to.  */

 #define	SOLIB_ADD(a, b, c, d)	\
-  if (PIDGET (inferior_ptid))	\
+  if (PIDGET (inferior_ptid) != 1)	\
     /* Attach to process.  */  \
     xcoff_relocate_symtab (PIDGET (inferior_ptid)); \
   else		\
--- ./gdb/symtab.c_orig	2012-08-07 17:52:15.181060405 +0530
+++ ./gdb/symtab.c	2012-08-07 17:53:04.653058722 +0530
@@ -2072,6 +2072,9 @@
 	{
 	  /* Leave prev pointing to the linetable entry for the last line
 	     that started at or before PC.  */
+          if ((item->pc > pc) && !i) /* for xlc one less entry for
line table */
+              prev = item;            /* point item as prev */
+
 	  if (item->pc > pc)
 	    break;


bfd:

        * configure (powerpc64-*-aix[5-9].*): Match powerpc64 running
aix for core file support

        * rs6000-core.c: Check for __ld_info64 if compiling 64-bit gdb.
        Added BFD64 check if we are using old core file format for 32-bit gdb.
        Set sizeof CORE_COMMONSZ appropriately in case of either new
or old core file format.
        (read_hdr): Added BFD64 check for 64-bit support.
        (rs6000coff_core_p): Likewise.
        (rs6000coff_core_file_matches_executable_p): Likewise.
        (rs6000coff_core_file_failing_command): Likewise.
        (rs6000coff_core_file_failing_command): Likewise.


--- ./bfd/configure_orig	2011-11-11 12:01:31.188995290 +0530
+++ ./bfd/configure	2012-07-25 16:07:39.010735665 +0530
@@ -13973,7 +13973,7 @@
   rs6000-*-lynx*)
   	COREFILE=lynx-core.lo
 	;;
-  rs6000-*-aix[5-9].* | powerpc-*-aix[5-9].*)
+  rs6000-*-aix[5-9].* | powerpc-*-aix[5-9].* | powerpc64-*-aix[5-9].*)
         COREFILE=rs6000-core.lo
 	COREFLAG="$COREFLAG -DAIX_5_CORE -DAIX_CORE_DUMPX_CORE"
 	;;
@@ -14011,6 +14011,7 @@
   rs6000-*-*)		COREFILE=rs6000-core.lo ;;
   powerpc-*-aix4*)	COREFILE=rs6000-core.lo ;;
   powerpc-*-aix*)	COREFILE=rs6000-core.lo ;;
+  powerpc64-*-aix)	COREFILE=rs6000-core.lo ;;
   powerpc-*-beos*)	;;
   powerpc-*-freebsd* | powerpc-*-kfreebsd*-gnu)
 		        COREFILE='' ;;
--- ./bfd/rs6000-core.c_orig	2011-11-10 19:02:59.093607185 +0530
+++ ./bfd/rs6000-core.c	2012-07-27 12:32:11.960181190 +0530
@@ -94,7 +94,7 @@
 /* Union of 32-bit and 64-bit versions of ld_info.  */

 typedef union {
-#ifdef __ld_info32
+#if defined (__ld_info32) || defined (__ld_info64)
   struct __ld_info32 l32;
   struct __ld_info64 l64;
 #else
@@ -111,8 +111,10 @@
 #else
   struct core_dump new_dump;		/* for simpler coding */
 #endif
+#ifndef BFD64                   /* use old only if gdb is 32-bit */
   struct core_dump old;		/* old AIX 4.2- core dump, still used on
 				   4.3+ with appropriate SMIT config */
+#endif
 } CoreHdr;

 /* Union of old and new vm_info structures.  */
@@ -124,14 +126,20 @@
 #else
   struct vm_info new_dump;
 #endif
+#ifndef BFD64
   struct vm_info old;
+#endif
 } VmInfo;
 #endif

 /* Return whether CoreHdr C is in new or old format.  */

 #ifdef AIX_CORE_DUMPX_CORE
-# define CORE_NEW(c)	(!(c).old.c_entries)
+ #ifndef BFD64
+   # define CORE_NEW(c)	(!(c).old.c_entries)
+ #else
+   # define CORE_NEW(c)   (!(c).new_dump.c_entries)
+ #endif
 #else
 # define CORE_NEW(c)	0
 #endif
@@ -260,8 +268,13 @@

 /* Size of the leading portion that old and new core dump structures have in
    common.  */
-#define CORE_COMMONSZ	((int) &((struct core_dump *) 0)->c_entries \
-			 + sizeof (((struct core_dump *) 0)->c_entries))
+#ifdef AIX_CORE_DUMPX_CORE
+#define CORE_COMMONSZ  ((long) &((struct core_dumpx *) 0)->c_entries \
+                        + sizeof (((struct core_dumpx *) 0)->c_entries))
+#else
+#define CORE_COMMONSZ   ((int) &((struct core_dump *) 0)->c_entries \
+                       + sizeof (((struct core_dump *) 0)->c_entries)
+#endif

 /* Define prototypes for certain functions, to avoid a compiler warning
    saying that they are missing.  */
@@ -292,8 +305,10 @@
   /* Read the trailing portion of the structure.  */
   if (CORE_NEW (*core))
     size = sizeof (core->new_dump);
+  #ifndef BFD64
   else
     size = sizeof (core->old);
+  #endif
   size -= CORE_COMMONSZ;
   return bfd_bread ((char *) core + CORE_COMMONSZ, size, abfd) == size;
 }
@@ -358,6 +373,7 @@
       c_stackend = CNEW_STACKORG (core.new_dump) + c_size;
       c_lsize = CNEW_LSIZE (core.new_dump);
       c_loader = CNEW_LOADER (core.new_dump);
+  #ifndef BFD64
       proc64 = CNEW_PROC64 (core.new_dump);
     }
   else
@@ -368,6 +384,7 @@
       c_stackend = COLD_STACKEND;
       c_lsize = 0x7ffffff;
       c_loader = (file_ptr) (ptr_to_uint) COLD_LOADER (core.old);
+   #endif
       proc64 = 0;
     }

@@ -381,11 +398,13 @@
       c_regsize = sizeof (CNEW_MSTSAVE (core.new_dump));
       c_regptr = &CNEW_MSTSAVE (core.new_dump);
     }
+  #ifndef BFD64
   else
     {
       c_regsize = sizeof (COLD_MSTSAVE (core.old));
       c_regptr = &COLD_MSTSAVE (core.old);
     }
+  #endif
   c_regoff = (char *) c_regptr - (char *) &core;

   if (bfd_stat (abfd, &statbuf) < 0)
@@ -435,7 +454,11 @@
     }

   /* Sanity check on the c_tab field.  */
+  #ifndef BFD64
   if (!CORE_NEW (core) && (c_loader < (file_ptr) sizeof core.old ||
+  #else
+  if (!CORE_NEW (core) && (c_loader < (file_ptr) sizeof core.new_dump ||
+  #endif
 			   c_loader >= statbuf.st_size ||
 			   c_loader >= c_stack))
     {
@@ -449,7 +472,11 @@
 			   bfd_get_filename (abfd));

   /* Allocate core file header.  */
+  #ifndef BFD64
   size = CORE_NEW (core) ? sizeof (core.new_dump) : sizeof (core.old);
+  #else
+  size =  sizeof (core.new_dump);
+  #endif
   tmpptr = (char *) bfd_zalloc (abfd, (bfd_size_type) size);
   if (!tmpptr)
     return NULL;
@@ -542,6 +569,7 @@
 	c_vmregions = core.new_dump.c_vmregions;
 	c_vmm = (file_ptr) core.new_dump.c_vmm;
       }
+    #ifndef BFD64
     else
       {
 	c_datasize = core.old.c_datasize;
@@ -549,6 +577,7 @@
 	c_vmregions = core.old.c_vmregions;
 	c_vmm = (file_ptr) (ptr_to_uint) core.old.c_vmm;
       }
+    #endif

     /* .data section from executable.  */
     if (c_datasize)
@@ -615,7 +644,11 @@
 	    file_ptr vminfo_offset;
 	    bfd_vma vminfo_addr;

+            #ifndef BFD64
 	    size = CORE_NEW (core) ? sizeof (vminfo.new_dump) : sizeof (vminfo.old);
+            #else
+            size = sizeof (vminfo.new_dump);
+            #endif
 	    if (bfd_bread (&vminfo, size, abfd) != size)
 	      goto fail;

@@ -625,12 +658,14 @@
 		vminfo_size = vminfo.new_dump.vminfo_size;
 		vminfo_offset = vminfo.new_dump.vminfo_offset;
 	      }
+            #ifndef BFD64
 	    else
 	      {
 		vminfo_addr = (bfd_vma) (long) vminfo.old.vminfo_addr;
 		vminfo_size = vminfo.old.vminfo_size;
 		vminfo_offset = vminfo.old.vminfo_offset;
 	      }
+             #endif

 	    if (vminfo_offset)
 	      if (!make_bfd_asection (abfd, ".vmdata",
@@ -670,8 +705,10 @@

   if (CORE_NEW (core))
     c_loader = CNEW_LOADER (core.new_dump);
+  #ifndef BFD64
   else
     c_loader = (file_ptr) (ptr_to_uint) COLD_LOADER (core.old);
+  #endif

   if (CORE_NEW (core) && CNEW_PROC64 (core.new_dump))
     size = (int) ((LdInfo *) 0)->l64.ldinfo_filename;
@@ -734,8 +771,12 @@
 rs6000coff_core_file_failing_command (bfd *abfd)
 {
   CoreHdr *core = core_hdr (abfd);
+  #ifndef BFD64
   char *com = CORE_NEW (*core) ?
     CNEW_COMM (core->new_dump) : COLD_COMM (core->old);
+  #else
+  char *com = CNEW_COMM (core->new_dump);
+  #endif

   if (*com)
     return com;
@@ -747,7 +788,11 @@
 rs6000coff_core_file_failing_signal (bfd *abfd)
 {
   CoreHdr *core = core_hdr (abfd);
+  #ifndef BFD64
   return CORE_NEW (*core) ? core->new_dump.c_signo : core->old.c_signo;
+  #else
+  return  core->new_dump.c_signo;
+  #endif
 }

 #endif /* AIX_CORE */

--
Thanks & Regards,
Sangamesh

Attachment: gdb_ChangeLog
Description: Binary data

Attachment: 64bitsupport_aix_gdb
Description: Binary data

Attachment: bfd_ChangeLog
Description: Binary data

Attachment: 64bitsupport_aix_bfd
Description: Binary data


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]