* top.c (target_byte_order_auto): New static variable.
authorIan Lance Taylor <ian@airs.com>
Fri, 7 Oct 1994 16:20:21 +0000 (16:20 +0000)
committerIan Lance Taylor <ian@airs.com>
Fri, 7 Oct 1994 16:20:21 +0000 (16:20 +0000)
(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.

gdb/ChangeLog
gdb/exec.c
gdb/top.c

index 93d00beb433c9db09f4516e8ba40b9e12fd49d3f..1f9c61d0cfd9e08d7a9150da9d7cff6f60a1981d 100644 (file)
@@ -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.
index f43921208f6cf335a81014020946cb8160a66b8c..445077173a1c1a8f7b868dfe29d37ccb2b0fcd50 100644 (file)
@@ -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;
index 113c8bbb6a4ef13aab1b83935433e4d05265e3b6..8744c4848c05f5db51f2f68b12328ee6983c1975 100644 (file)
--- 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) */
+}
 \f
 /* 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);