mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-02-17 13:10:12 +08:00
Fix SWAP_8 and optimize it; print out the failing address if a signal is issued for non-gdb runs
This commit is contained in:
parent
65f1be0633
commit
22ddef466e
@ -1,3 +1,14 @@
|
||||
Thu Oct 26 10:42:28 1995 Michael Meissner <meissner@tiktok.cygnus.com>
|
||||
|
||||
* ppc-endian.c (SWAP_n): Add SET argument to allow use of SWAP
|
||||
macros for either assignment or return. Fix SWAP_8 to use a
|
||||
union, and two SWAP_4's. Delete SWAP_N, since nobody uses it now.
|
||||
(ENDIAN_N): Add SET argument to SWAP_n calls. Delete macro defs
|
||||
that hardwired swapping on/off, let optimizer delete dead code.
|
||||
|
||||
* main.c (main): Add printf that we caught a signal and print out
|
||||
the failing address.
|
||||
|
||||
Thu Oct 19 21:43:39 1995 Fred Fish <fnf@fishfood.amigalib.com>
|
||||
|
||||
* Makefile.in: Remove tabs from otherwise empty line.
|
||||
|
@ -38,6 +38,7 @@ printf_filtered(const char *msg, ...)
|
||||
va_list ap;
|
||||
va_start(ap, msg);
|
||||
vprintf(msg, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void
|
||||
@ -46,6 +47,7 @@ error (char *msg, ...)
|
||||
va_list ap;
|
||||
va_start(ap, msg);
|
||||
vprintf(msg, ap);
|
||||
va_end(ap);
|
||||
exit (1);
|
||||
}
|
||||
|
||||
@ -68,7 +70,7 @@ zfree(void *chunk)
|
||||
static void
|
||||
usage(void)
|
||||
{
|
||||
error ("Usage: psim [ -a -p -c -C -s -i -I -t ] <image> [ <image-args> ... ]\n");
|
||||
error ("Usage: psim [ -a -p -c -C -s -i -I -t -g ] <image> [ <image-args> ... ]\n");
|
||||
}
|
||||
|
||||
int
|
||||
@ -85,39 +87,41 @@ main(int argc, char **argv)
|
||||
|
||||
/* check for arguments -- note sim_calls.c also contains argument processing
|
||||
code for the simulator linked within gdb. */
|
||||
while ((letter = getopt (argc, argv, "acCiIpst")) != EOF)
|
||||
while ((letter = getopt (argc, argv, "acCiIpstg")) != EOF)
|
||||
{
|
||||
switch (letter) {
|
||||
case 'a':
|
||||
for (i = 0; i < nr_trace; i++)
|
||||
trace[i] = 1;
|
||||
ppc_trace[i] = 1;
|
||||
break;
|
||||
case 'p':
|
||||
trace[trace_cpu] = trace[trace_semantics] = 1;
|
||||
ppc_trace[trace_cpu] = ppc_trace[trace_semantics] = 1;
|
||||
break;
|
||||
case 'c':
|
||||
trace[trace_core] = 1;
|
||||
ppc_trace[trace_core] = 1;
|
||||
break;
|
||||
case 'C':
|
||||
trace[trace_console_device] = 1;
|
||||
ppc_trace[trace_console_device] = 1;
|
||||
break;
|
||||
case 's':
|
||||
trace[trace_create_stack] = 1;
|
||||
ppc_trace[trace_create_stack] = 1;
|
||||
break;
|
||||
case 'i':
|
||||
trace[trace_icu_device] = 1;
|
||||
ppc_trace[trace_icu_device] = 1;
|
||||
break;
|
||||
case 'I':
|
||||
print_info = 1;
|
||||
break;
|
||||
case 't':
|
||||
trace[trace_device_tree] = 1;
|
||||
ppc_trace[trace_device_tree] = 1;
|
||||
break;
|
||||
case 'g':
|
||||
ppc_trace[trace_gdb] = 1;
|
||||
break;
|
||||
default:
|
||||
usage();
|
||||
}
|
||||
}
|
||||
|
||||
if (optind >= argc)
|
||||
usage();
|
||||
name_of_file = argv[optind];
|
||||
@ -132,11 +136,12 @@ main(int argc, char **argv)
|
||||
putenv(arg_);
|
||||
|
||||
/* initialize it */
|
||||
psim_load(system);
|
||||
psim_init(system);
|
||||
psim_stack(system, &argv[optind], environ);
|
||||
|
||||
psim_run(system);
|
||||
|
||||
/* any final clean up */
|
||||
if (print_info)
|
||||
psim_print_info (system, 1);
|
||||
|
||||
@ -152,6 +157,9 @@ main(int argc, char **argv)
|
||||
case was_exited:
|
||||
return status.signal;
|
||||
case was_signalled:
|
||||
printf ("%s: Caught signal %d at address 0x%lx\n",
|
||||
name_of_file, (int)status.signal,
|
||||
(long)status.program_counter);
|
||||
return status.signal;
|
||||
default:
|
||||
error("unknown halt condition\n");
|
||||
|
@ -33,78 +33,41 @@
|
||||
#include "ppc-endian.h"
|
||||
#include "sim_callbacks.h"
|
||||
|
||||
|
||||
typedef union {
|
||||
unsigned_1 val_1[8];
|
||||
unsigned_2 val_2[4];
|
||||
unsigned_4 val_4[2];
|
||||
unsigned_8 val_8[1];
|
||||
} endian_map;
|
||||
|
||||
#define SWAP_N(RAW,BYTE_SIZE) \
|
||||
endian_map in; \
|
||||
endian_map out; \
|
||||
int byte_nr; \
|
||||
in.val_##BYTE_SIZE[0] = RAW; \
|
||||
for (byte_nr = 0; byte_nr < BYTE_SIZE; byte_nr++) { \
|
||||
out.val_1[BYTE_SIZE-1-byte_nr] = in.val_1[byte_nr]; \
|
||||
} \
|
||||
return out.val_##BYTE_SIZE[0]; \
|
||||
|
||||
#if (WITH_HOST_BYTE_ORDER == LITTLE_ENDIAN) && WITH_NTOH
|
||||
#define SWAP_2(RAW) return htons (RAW)
|
||||
#define SWAP_2(SET,RAW) SET htons (RAW)
|
||||
#endif
|
||||
|
||||
#ifndef SWAP_2
|
||||
#define SWAP_2(RAW) return (((RAW) >> 8) | ((RAW) << 8))
|
||||
#define SWAP_2(SET,RAW) SET (((RAW) >> 8) | ((RAW) << 8))
|
||||
#endif
|
||||
|
||||
#if !defined(SWAP_4) && (WITH_HOST_BYTE_ORDER == LITTLE_ENDIAN) && WITH_NTOH
|
||||
#define SWAP_4(RAW) return htonl (RAW)
|
||||
#define SWAP_4(SET,RAW) SET htonl (RAW)
|
||||
#endif
|
||||
|
||||
#ifndef SWAP_4
|
||||
#define SWAP_4(RAW) return (((RAW) << 24) | (((RAW) & 0xff00) << 8) | (((RAW) & 0xff0000) >> 8) | ((RAW) >> 24))
|
||||
#define SWAP_4(SET,RAW) SET (((RAW) << 24) | (((RAW) & 0xff00) << 8) | (((RAW) & 0xff0000) >> 8) | ((RAW) >> 24))
|
||||
#endif
|
||||
|
||||
#ifndef SWAP_8
|
||||
#define SWAP_8(RAW) SWAP_N(RAW,4)
|
||||
#endif
|
||||
|
||||
/* no need to swap */
|
||||
#if (WITH_HOST_BYTE_ORDER \
|
||||
&& WITH_TARGET_BYTE_ORDER \
|
||||
&& WITH_HOST_BYTE_ORDER == WITH_TARGET_BYTE_ORDER )
|
||||
#define ENDIAN_N(NAME,BYTE_SIZE) \
|
||||
unsigned_##BYTE_SIZE \
|
||||
endian_##NAME##_##BYTE_SIZE(unsigned_##BYTE_SIZE raw_in) \
|
||||
{ \
|
||||
return raw_in; \
|
||||
}
|
||||
#endif
|
||||
|
||||
/* always need to swap */
|
||||
#if (WITH_HOST_BYTE_ORDER \
|
||||
&& WITH_TARGET_BYTE_ORDER \
|
||||
&& WITH_HOST_BYTE_ORDER != WITH_TARGET_BYTE_ORDER )
|
||||
#define ENDIAN_N(NAME,BYTE_SIZE) \
|
||||
unsigned_##BYTE_SIZE \
|
||||
endian_##NAME##_##BYTE_SIZE(unsigned_##BYTE_SIZE raw_in) \
|
||||
{ \
|
||||
SWAP_##BYTE_SIZE(raw_in); \
|
||||
}
|
||||
#define SWAP_8(SET,RAW) \
|
||||
union { unsigned_8 dword; unsigned_4 words[2]; } in, out; \
|
||||
in.dword = RAW; \
|
||||
SWAP_4 (out.words[0] =, in.words[1]); \
|
||||
SWAP_4 (out.words[1] =, in.words[0]); \
|
||||
SET out.dword;
|
||||
#endif
|
||||
|
||||
#ifndef ENDIAN_N
|
||||
#define ENDIAN_N(NAME,BYTE_SIZE) \
|
||||
unsigned_##BYTE_SIZE \
|
||||
INLINE unsigned_##BYTE_SIZE \
|
||||
endian_##NAME##_##BYTE_SIZE(unsigned_##BYTE_SIZE raw_in) \
|
||||
{ \
|
||||
if (CURRENT_TARGET_BYTE_ORDER == CURRENT_HOST_BYTE_ORDER) { \
|
||||
return raw_in; \
|
||||
} \
|
||||
else { \
|
||||
SWAP_##BYTE_SIZE(raw_in); \
|
||||
SWAP_##BYTE_SIZE(return, raw_in); \
|
||||
} \
|
||||
}
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user