diff options
-rw-r--r-- | gdb/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/exec.c | 33 | ||||
-rw-r--r-- | gdb/top.c | 57 |
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. @@ -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; @@ -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); |