* AIX 64bit support
@ 2012-08-09 8:23 swamy sangamesh
2012-08-09 9:01 ` Abid, Hafiz
2012-08-23 20:23 ` Tom Tromey
0 siblings, 2 replies; 6+ messages in thread
From: swamy sangamesh @ 2012-08-09 8:23 UTC (permalink / raw)
To: gdb-patches
[-- Attachment #1: Type: text/plain, Size: 34677 bytes --]
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 #2: gdb_ChangeLog --]
[-- Type: application/octet-stream, Size: 1755 bytes --]
* 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.
[-- Attachment #3: 64bitsupport_aix_gdb --]
[-- Type: application/octet-stream, Size: 25794 bytes --]
--- ./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;
[-- Attachment #4: bfd_ChangeLog --]
[-- Type: application/octet-stream, Size: 619 bytes --]
* 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.
[-- Attachment #5: 64bitsupport_aix_bfd --]
[-- Type: application/octet-stream, Size: 6348 bytes --]
--- ./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 */
^ permalink raw reply [flat|nested] 6+ messages in thread* RE: AIX 64bit support
2012-08-09 8:23 AIX 64bit support swamy sangamesh
@ 2012-08-09 9:01 ` Abid, Hafiz
2012-08-21 11:33 ` swamy sangamesh
2012-08-23 20:23 ` Tom Tromey
1 sibling, 1 reply; 6+ messages in thread
From: Abid, Hafiz @ 2012-08-09 9:01 UTC (permalink / raw)
To: swamy sangamesh, gdb-patches
Hi Sangamesh,
I dont know this code much but a few things that caught my eye. Comments inline.
> -----Original Message-----
> From: gdb-patches-owner@sourceware.org [mailto:gdb-patches-
> owner@sourceware.org] On Behalf Of swamy sangamesh
> Sent: Thursday, August 09, 2012 9:23 AM
> To: gdb-patches@sourceware.org
> Subject: 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
If you introduce new functions which has the #ifdef checks and then call those functions from here then code will be a lot cleaner in my opinion. Then all these #ifdef checks will only be in one place.
> 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] == '.'))
Now that you have changed the if condition, please also update the comments before it.
> 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
Regards,
Abid
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: AIX 64bit support
2012-08-09 9:01 ` Abid, Hafiz
@ 2012-08-21 11:33 ` swamy sangamesh
2012-08-21 15:40 ` Joel Brobecker
2012-08-23 20:13 ` Tom Tromey
0 siblings, 2 replies; 6+ messages in thread
From: swamy sangamesh @ 2012-08-21 11:33 UTC (permalink / raw)
To: Abid, Hafiz; +Cc: gdb-patches
Hi Abid,
Thanks for the review and comments and sorry for the delay in reply.
Let me know if we can do #ifdef check in a macro and call the marco as
mentioned below would be feasible to reduce the many #ifdef checks ?
macro for ptrace64aix
#define ptrace_check_64aix(req, tid, addr, data, buff) \
#ifdef BFD64 \
if (!ptrace64aix (req, (long long) tid, \
(long long) addr, data, buff)) \
#else \
if (!ptrace64aix (req, tid, \
(unsigned long) addr, data, buff)) \
#endif \
macro call
ptrace_check_64aix(PTT_READ_GPRS, tid, gprs64, 0 , NULL);
etc...
macro for ptrace32 call
#define ptrace_check_32aix(req, tid, addr, data, buff) \
#ifdef BFD64 \
if (!ptrace32 (req, (long long) tid, (long long) addr, data, buff)) \
#else \
if (!ptrace32 (req, tid, addr, 0, NULL)) \
#endif \
macro call
ptrace_check_32aix(PTT_READ_FPRS, tid, (int *) fprs, 0, NULL)
etc ....
I will add comment for the other changes
On Thu, Aug 9, 2012 at 2:31 PM, Abid, Hafiz <Hafiz_Abid@mentor.com> wrote:
> Hi Sangamesh,
> I dont know this code much but a few things that caught my eye. Comments inline.
>
>
>> -----Original Message-----
>> From: gdb-patches-owner@sourceware.org [mailto:gdb-patches-
>> owner@sourceware.org] On Behalf Of swamy sangamesh
>> Sent: Thursday, August 09, 2012 9:23 AM
>> To: gdb-patches@sourceware.org
>> Subject: 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
> If you introduce new functions which has the #ifdef checks and then call those functions from here then code will be a lot cleaner in my opinion. Then all these #ifdef checks will only be in one place.
>
>> 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] == '.'))
> Now that you have changed the if condition, please also update the comments before it.
>
>> 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
>
> Regards,
> Abid
--
Thanks & Regards,
Sangamesh
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: AIX 64bit support
2012-08-21 11:33 ` swamy sangamesh
@ 2012-08-21 15:40 ` Joel Brobecker
2012-08-23 20:13 ` Tom Tromey
1 sibling, 0 replies; 6+ messages in thread
From: Joel Brobecker @ 2012-08-21 15:40 UTC (permalink / raw)
To: swamy sangamesh; +Cc: Abid, Hafiz, gdb-patches
> Let me know if we can do #ifdef check in a macro and call the marco as
> mentioned below would be feasible to reduce the many #ifdef checks ?
>
>
> macro for ptrace64aix
>
> #define ptrace_check_64aix(req, tid, addr, data, buff) \
> #ifdef BFD64 \
> if (!ptrace64aix (req, (long long) tid, \
> (long long) addr, data, buff)) \
> #else \
> if (!ptrace64aix (req, tid, \
> (unsigned long) addr, data, buff)) \
> #endif \
Can you please instead make those functions instead? It will make
the code much easier to understand, IMO.
--
Joel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: AIX 64bit support
2012-08-21 11:33 ` swamy sangamesh
2012-08-21 15:40 ` Joel Brobecker
@ 2012-08-23 20:13 ` Tom Tromey
1 sibling, 0 replies; 6+ messages in thread
From: Tom Tromey @ 2012-08-23 20:13 UTC (permalink / raw)
To: swamy sangamesh; +Cc: Abid, Hafiz, gdb-patches
>>>>> ">" == swamy sangamesh <swamy.sangamesh@gmail.com> writes:
>> Let me know if we can do #ifdef check in a macro and call the marco as
>> mentioned below would be feasible to reduce the many #ifdef checks ?
It isn't valid C. You can't use #if inside #define.
However, there are other options, like a function.
Tom
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: AIX 64bit support
2012-08-09 8:23 AIX 64bit support swamy sangamesh
2012-08-09 9:01 ` Abid, Hafiz
@ 2012-08-23 20:23 ` Tom Tromey
1 sibling, 0 replies; 6+ messages in thread
From: Tom Tromey @ 2012-08-23 20:23 UTC (permalink / raw)
To: swamy sangamesh; +Cc: gdb-patches
>>>>> ">" == swamy sangamesh <swamy.sangamesh@gmail.com> writes:
>> 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.
Thanks for writing this.
First, you will need to file copyright assignment paperwork with the FSF
before we can accept this patch. Contact me off-list and I can get you
started on the process.
>> --- ./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
[...]
>> static int
>> +#ifdef BFD64
>> +ptrace64aix (int req, long long id, long long addr, int data, int *buf)
I tend to doubt that BFD64 is the correct check here.
I think you can use --enable-64-bit-bfd even on a 32-bit machine.
However in that situation you would not want to use ptrace64 --
presumably it wouldn't even exist.
Perhaps checking directly for ptrace64 in configure is best.
I agree with the other commenters about the desirability of a wrapper
function, rather than repeated #ifdefs all over.
>> --- ./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
There are many changes here, but I think this code is shared by many
ports. So, your changes have to take that into consideration. A
wrapper function may be the way to go.
>> --- ./gdb/xcoffread.c_orig 2012-08-07 17:36:42.378057756 +0530
>> +++ ./gdb/xcoffread.c 2012-08-07 17:36:48.702060320 +0530
I don't know anything about xcoffread. Could you say how you tested
this? Did you test it on a 32-bit host as well?
>> --- ./gdb/symtab.c_orig 2012-08-07 17:52:15.181060405 +0530
>> +++ ./gdb/symtab.c 2012-08-07 17:53:04.653058722 +0530
There is a change here, but this is generic code, and I think shouldn't
have an xlc-specific change. The problem has to be approached some
other way, preferably in the debuginfo reader.
The BFD changes should go to the binutils list.
Tom
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2012-08-23 20:23 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-08-09 8:23 AIX 64bit support swamy sangamesh
2012-08-09 9:01 ` Abid, Hafiz
2012-08-21 11:33 ` swamy sangamesh
2012-08-21 15:40 ` Joel Brobecker
2012-08-23 20:13 ` Tom Tromey
2012-08-23 20:23 ` Tom Tromey
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox