aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog11
-rw-r--r--gdb/exec.c33
-rw-r--r--gdb/top.c57
3 files changed, 84 insertions, 17 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 93d00be..1f9c61d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,14 @@
+Fri Oct 7 12:17:17 1994 Ian Lance Taylor <ian@sanguine.cygnus.com>
+
+ * top.c (target_byte_order_auto): New static variable.
+ (set_endian): Mention that ``auto'' is permitted.
+ (set_endian_auto): New static function.
+ (show_endian): Change message based on target_byte_order_auto.
+ (set_endian_from_file): New function.
+ (init_main): Add command ``auto'' to endianlist.
+ * exec.c (exec_file_command): Call set_endian_from_file.
+ * defs.h (set_endian_from_file): Declare.
+
Thu Oct 6 18:10:41 1994 J.T. Conklin (jtc@phishhead.cygnus.com)
* nlm/i386.c (flush_i_cache): New function, does nothing.
diff --git a/gdb/exec.c b/gdb/exec.c
index f439212..4450771 100644
--- a/gdb/exec.c
+++ b/gdb/exec.c
@@ -1,5 +1,5 @@
/* Work with executable files, for GDB.
- Copyright 1988, 1989, 1991, 1992 Free Software Foundation, Inc.
+ Copyright 1988, 1989, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
This file is part of GDB.
@@ -184,7 +184,7 @@ exec_file_command (args, from_tty)
text_start = ~(CORE_ADDR)0;
text_end = (CORE_ADDR)0;
for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++)
- if (bfd_get_section_flags (p->bfd, p->sec_ptr)
+ if (bfd_get_section_flags (p->bfd, p->the_bfd_section)
& (SEC_CODE | SEC_READONLY))
{
if (text_start > p->addr)
@@ -197,6 +197,8 @@ exec_file_command (args, from_tty)
validate_files ();
+ set_endian_from_file (exec_bfd);
+
push_target (&exec_ops);
/* Tell display code (if any) about the changed file name. */
@@ -242,7 +244,7 @@ add_to_section_table (abfd, asect, table_pp_char)
if (0 == bfd_section_size (abfd, asect))
return;
(*table_pp)->bfd = abfd;
- (*table_pp)->sec_ptr = asect;
+ (*table_pp)->the_bfd_section = asect;
(*table_pp)->addr = bfd_section_vma (abfd, asect);
(*table_pp)->endaddr = (*table_pp)->addr + bfd_section_size (abfd, asect);
(*table_pp)++;
@@ -314,8 +316,8 @@ xfer_memory (memaddr, myaddr, len, write, target)
if (p->endaddr >= memend)
{
/* Entire transfer is within this section. */
- res = xfer_fn (p->bfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
- return (res != false)? len: 0;
+ res = xfer_fn (p->bfd, p->the_bfd_section, myaddr, memaddr - p->addr, len);
+ return (res != 0) ? len : 0;
}
else if (p->endaddr <= memaddr)
{
@@ -326,8 +328,8 @@ xfer_memory (memaddr, myaddr, len, write, target)
{
/* This section overlaps the transfer. Just do half. */
len = p->endaddr - memaddr;
- res = xfer_fn (p->bfd, p->sec_ptr, myaddr, memaddr - p->addr, len);
- return (res != false)? len: 0;
+ res = xfer_fn (p->bfd, p->the_bfd_section, myaddr, memaddr - p->addr, len);
+ return (res != 0) ? len : 0;
}
else if (p->addr < nextsectaddr)
nextsectaddr = p->addr;
@@ -364,9 +366,12 @@ print_section_info (t, abfd)
printf_filtered ("\t`%s', ", bfd_get_filename(abfd));
wrap_here (" ");
printf_filtered ("file type %s.\n", bfd_get_target(abfd));
- printf_filtered ("\tEntry point: ");
- print_address_numeric (bfd_get_start_address (exec_bfd), gdb_stdout);
- printf_filtered ("\n");
+ if (abfd == exec_bfd)
+ {
+ printf_filtered ("\tEntry point: ");
+ print_address_numeric (bfd_get_start_address (abfd), 1, gdb_stdout);
+ printf_filtered ("\n");
+ }
for (p = t->to_sections; p < t->to_sections_end; p++)
{
/* FIXME-32x64 need a print_address_numeric with field width */
@@ -374,8 +379,8 @@ print_section_info (t, abfd)
printf_filtered (" - %s", local_hex_string_custom ((unsigned long) p->endaddr, "08l"));
if (info_verbose)
printf_filtered (" @ %s",
- local_hex_string_custom ((unsigned long) p->sec_ptr->filepos, "08l"));
- printf_filtered (" is %s", bfd_section_name (p->bfd, p->sec_ptr));
+ local_hex_string_custom ((unsigned long) p->the_bfd_section->filepos, "08l"));
+ printf_filtered (" is %s", bfd_section_name (p->bfd, p->the_bfd_section));
if (p->bfd != abfd)
{
printf_filtered (" in %s", bfd_get_filename (p->bfd));
@@ -414,8 +419,8 @@ set_section_command (args, from_tty)
secaddr = parse_and_eval_address (args);
for (p = exec_ops.to_sections; p < exec_ops.to_sections_end; p++) {
- if (!strncmp (secname, bfd_section_name (exec_bfd, p->sec_ptr), seclen)
- && bfd_section_name (exec_bfd, p->sec_ptr)[seclen] == '\0') {
+ if (!strncmp (secname, bfd_section_name (exec_bfd, p->the_bfd_section), seclen)
+ && bfd_section_name (exec_bfd, p->the_bfd_section)[seclen] == '\0') {
offset = secaddr - p->addr;
p->addr += offset;
p->endaddr += offset;
diff --git a/gdb/top.c b/gdb/top.c
index 113c8bb..8744c48 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -100,6 +100,8 @@ static void set_endian_big PARAMS ((char *, int));
static void set_endian_little PARAMS ((char *, int));
+static void set_endian_auto PARAMS ((char *, int));
+
static void show_endian PARAMS ((char *, int));
#endif
@@ -2654,13 +2656,15 @@ echo_command (text, from_tty)
int target_byte_order = TARGET_BYTE_ORDER_DEFAULT;
+static int target_byte_order_auto = 1;
+
/* Called if the user enters ``set endian'' without an argument. */
static void
set_endian (args, from_tty)
char *args;
int from_tty;
{
- printf_unfiltered ("\"set endian\" must be followed by \"big\" or \"little\".\n");
+ printf_unfiltered ("\"set endian\" must be followed by \"auto\", \"big\" or \"little\".\n");
show_endian (args, from_tty);
}
@@ -2671,6 +2675,7 @@ set_endian_big (args, from_tty)
int from_tty;
{
target_byte_order = BIG_ENDIAN;
+ target_byte_order_auto = 0;
}
/* Called by ``set endian little''. */
@@ -2680,6 +2685,16 @@ set_endian_little (args, from_tty)
int from_tty;
{
target_byte_order = LITTLE_ENDIAN;
+ target_byte_order_auto = 0;
+}
+
+/* Called by ``set endian auto''. */
+static void
+set_endian_auto (args, from_tty)
+ char *args;
+ int from_tty;
+{
+ target_byte_order_auto = 1;
}
/* Called by ``show endian''. */
@@ -2688,11 +2703,45 @@ show_endian (args, from_tty)
char *args;
int from_tty;
{
- printf_unfiltered ("The target is assumed to be %s endian.\n",
- TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little");
+ const char *msg =
+ (target_byte_order_auto
+ ? "The target endianness is set automatically (currently %s endian)\n"
+ : "The target is assumed to be %s endian\n");
+ printf_unfiltered (msg, TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little");
}
#endif /* defined (TARGET_BYTE_ORDER_SELECTABLE) */
+
+/* Set the endianness from a BFD. */
+void
+set_endian_from_file (abfd)
+ bfd *abfd;
+{
+#ifdef TARGET_BYTE_ORDER_SELECTABLE
+ int want;
+
+ if (abfd->xvec->byteorder_big_p)
+ want = BIG_ENDIAN;
+ else
+ want = LITTLE_ENDIAN;
+ if (target_byte_order_auto)
+ target_byte_order = want;
+ else if (target_byte_order != want)
+ warning ("%s endian file does not match %s endian target.",
+ want == BIG_ENDIAN ? "big" : "little",
+ TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little");
+
+#else /* ! defined (TARGET_BYTE_ORDER_SELECTABLE) */
+
+ if (abfd->xvec->byteorder_big_p
+ ? TARGET_BYTE_ORDER != BIG_ENDIAN
+ : TARGET_BYTE_ORDER == BIG_ENDIAN)
+ warning ("%s endian file does not match %s endian target.",
+ want == BIG_ENDIAN ? "big" : "little",
+ TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little");
+
+#endif /* ! defined (TARGET_BYTE_ORDER_SELECTABLE) */
+}
/* Functions to manipulate command line editing control variables. */
@@ -2925,6 +2974,8 @@ init_main ()
"Set target as being big endian.", &endianlist);
add_cmd ("little", class_support, set_endian_little,
"Set target as being little endian.", &endianlist);
+ add_cmd ("auto", class_support, set_endian_auto,
+ "Select target endianness automatically.", &endianlist);
add_cmd ("endian", class_support, show_endian,
"Show endianness of target.", &showlist);