bde89a8fa8e1560f4534e5c9cb1d915379836a10
[external/binutils.git] / gdb / arch-utils.c
1 /* Dynamic architecture support for GDB, the GNU debugger.
2
3    Copyright 1998, 1999, 2000, 2001, 2002 Free Software Foundation,
4    Inc.
5
6    This file is part of GDB.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 59 Temple Place - Suite 330,
21    Boston, MA 02111-1307, USA.  */
22
23 #include "defs.h"
24
25 #if GDB_MULTI_ARCH
26 #include "arch-utils.h"
27 #include "gdbcmd.h"
28 #include "inferior.h"           /* enum CALL_DUMMY_LOCATION et.al. */
29 #else
30 /* Just include everything in sight so that the every old definition
31    of macro is visible. */
32 #include "gdb_string.h"
33 #include "symtab.h"
34 #include "frame.h"
35 #include "inferior.h"
36 #include "breakpoint.h"
37 #include "gdb_wait.h"
38 #include "gdbcore.h"
39 #include "gdbcmd.h"
40 #include "target.h"
41 #include "annotate.h"
42 #endif
43 #include "regcache.h"
44 #include "gdb_assert.h"
45
46 #include "version.h"
47
48 #include "floatformat.h"
49
50 /* Use the program counter to determine the contents and size
51    of a breakpoint instruction.  If no target-dependent macro
52    BREAKPOINT_FROM_PC has been defined to implement this function,
53    assume that the breakpoint doesn't depend on the PC, and
54    use the values of the BIG_BREAKPOINT and LITTLE_BREAKPOINT macros.
55    Return a pointer to a string of bytes that encode a breakpoint
56    instruction, stores the length of the string to *lenptr,
57    and optionally adjust the pc to point to the correct memory location
58    for inserting the breakpoint.  */
59
60 const unsigned char *
61 legacy_breakpoint_from_pc (CORE_ADDR * pcptr, int *lenptr)
62 {
63   /* {BIG_,LITTLE_}BREAKPOINT is the sequence of bytes we insert for a
64      breakpoint.  On some machines, breakpoints are handled by the
65      target environment and we don't have to worry about them here.  */
66 #ifdef BIG_BREAKPOINT
67   if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
68     {
69       static unsigned char big_break_insn[] = BIG_BREAKPOINT;
70       *lenptr = sizeof (big_break_insn);
71       return big_break_insn;
72     }
73 #endif
74 #ifdef LITTLE_BREAKPOINT
75   if (TARGET_BYTE_ORDER != BFD_ENDIAN_BIG)
76     {
77       static unsigned char little_break_insn[] = LITTLE_BREAKPOINT;
78       *lenptr = sizeof (little_break_insn);
79       return little_break_insn;
80     }
81 #endif
82 #ifdef BREAKPOINT
83   {
84     static unsigned char break_insn[] = BREAKPOINT;
85     *lenptr = sizeof (break_insn);
86     return break_insn;
87   }
88 #endif
89   *lenptr = 0;
90   return NULL;
91 }
92
93 int
94 generic_frameless_function_invocation_not (struct frame_info *fi)
95 {
96   return 0;
97 }
98
99 int
100 generic_return_value_on_stack_not (struct type *type)
101 {
102   return 0;
103 }
104
105 CORE_ADDR
106 generic_skip_trampoline_code (CORE_ADDR pc)
107 {
108   return 0;
109 }
110
111 int
112 generic_in_solib_call_trampoline (CORE_ADDR pc, char *name)
113 {
114   return 0;
115 }
116
117 int
118 generic_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
119 {
120   return 0;
121 }
122
123 char *
124 legacy_register_name (int i)
125 {
126 #ifdef REGISTER_NAMES
127   static char *names[] = REGISTER_NAMES;
128   if (i < 0 || i >= (sizeof (names) / sizeof (*names)))
129     return NULL;
130   else
131     return names[i];
132 #else
133   internal_error (__FILE__, __LINE__,
134                   "legacy_register_name: called.");
135   return NULL;
136 #endif
137 }
138
139 #if defined (CALL_DUMMY)
140 LONGEST legacy_call_dummy_words[] = CALL_DUMMY;
141 #else
142 LONGEST legacy_call_dummy_words[1];
143 #endif
144 int legacy_sizeof_call_dummy_words = sizeof (legacy_call_dummy_words);
145
146 void
147 generic_remote_translate_xfer_address (CORE_ADDR gdb_addr, int gdb_len,
148                                        CORE_ADDR * rem_addr, int *rem_len)
149 {
150   *rem_addr = gdb_addr;
151   *rem_len = gdb_len;
152 }
153
154 int
155 generic_prologue_frameless_p (CORE_ADDR ip)
156 {
157   return ip == SKIP_PROLOGUE (ip);
158 }
159
160 /* New/multi-arched targets should use the correct gdbarch field
161    instead of using this global pointer. */
162 int
163 legacy_print_insn (bfd_vma vma, disassemble_info *info)
164 {
165   return (*tm_print_insn) (vma, info);
166 }
167
168 /* Helper functions for INNER_THAN */
169
170 int
171 core_addr_lessthan (CORE_ADDR lhs, CORE_ADDR rhs)
172 {
173   return (lhs < rhs);
174 }
175
176 int
177 core_addr_greaterthan (CORE_ADDR lhs, CORE_ADDR rhs)
178 {
179   return (lhs > rhs);
180 }
181
182
183 /* Helper functions for TARGET_{FLOAT,DOUBLE}_FORMAT */
184
185 const struct floatformat *
186 default_float_format (struct gdbarch *gdbarch)
187 {
188 #if GDB_MULTI_ARCH
189   int byte_order = gdbarch_byte_order (gdbarch);
190 #else
191   int byte_order = TARGET_BYTE_ORDER;
192 #endif
193   switch (byte_order)
194     {
195     case BFD_ENDIAN_BIG:
196       return &floatformat_ieee_single_big;
197     case BFD_ENDIAN_LITTLE:
198       return &floatformat_ieee_single_little;
199     default:
200       internal_error (__FILE__, __LINE__,
201                       "default_float_format: bad byte order");
202     }
203 }
204
205
206 const struct floatformat *
207 default_double_format (struct gdbarch *gdbarch)
208 {
209 #if GDB_MULTI_ARCH
210   int byte_order = gdbarch_byte_order (gdbarch);
211 #else
212   int byte_order = TARGET_BYTE_ORDER;
213 #endif
214   switch (byte_order)
215     {
216     case BFD_ENDIAN_BIG:
217       return &floatformat_ieee_double_big;
218     case BFD_ENDIAN_LITTLE:
219       return &floatformat_ieee_double_little;
220     default:
221       internal_error (__FILE__, __LINE__,
222                       "default_double_format: bad byte order");
223     }
224 }
225
226 void
227 default_print_float_info (void)
228 {
229 #ifdef FLOAT_INFO
230 #if GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL
231 #error "FLOAT_INFO defined in multi-arch"
232 #endif
233   FLOAT_INFO;
234 #else
235   printf_filtered ("No floating point info available for this processor.\n");
236 #endif
237 }
238
239 /* Misc helper functions for targets. */
240
241 int
242 frame_num_args_unknown (struct frame_info *fi)
243 {
244   return -1;
245 }
246
247
248 int
249 generic_register_convertible_not (int num)
250 {
251   return 0;
252 }
253   
254
255 /* Under some ABI's that specify the `struct convention' for returning
256    structures by value, by the time we've returned from the function,
257    the return value is sitting there in the caller's buffer, but GDB
258    has no way to find the address of that buffer.
259
260    On such architectures, use this function as your
261    extract_struct_value_address method.  When asked to a struct
262    returned by value in this fashion, GDB will print a nice error
263    message, instead of garbage.  */
264 CORE_ADDR
265 generic_cannot_extract_struct_value_address (char *dummy)
266 {
267   return 0;
268 }
269
270 int
271 default_register_sim_regno (int num)
272 {
273   return num;
274 }
275
276
277 CORE_ADDR
278 core_addr_identity (CORE_ADDR addr)
279 {
280   return addr;
281 }
282
283 int
284 no_op_reg_to_regnum (int reg)
285 {
286   return reg;
287 }
288
289 /* For use by frame_args_address and frame_locals_address.  */
290 CORE_ADDR
291 default_frame_address (struct frame_info *fi)
292 {
293   return fi->frame;
294 }
295
296 /* Default prepare_to_procced().  */
297 int
298 default_prepare_to_proceed (int select_it)
299 {
300   return 0;
301 }
302
303 /* Generic prepare_to_proceed().  This one should be suitable for most
304    targets that support threads. */
305 int
306 generic_prepare_to_proceed (int select_it)
307 {
308   ptid_t wait_ptid;
309   struct target_waitstatus wait_status;
310
311   /* Get the last target status returned by target_wait().  */
312   get_last_target_status (&wait_ptid, &wait_status);
313
314   /* Make sure we were stopped either at a breakpoint, or because
315      of a Ctrl-C.  */
316   if (wait_status.kind != TARGET_WAITKIND_STOPPED
317       || (wait_status.value.sig != TARGET_SIGNAL_TRAP &&
318           wait_status.value.sig != TARGET_SIGNAL_INT))
319     {
320       return 0;
321     }
322
323   if (!ptid_equal (wait_ptid, minus_one_ptid)
324       && !ptid_equal (inferior_ptid, wait_ptid))
325     {
326       /* Switched over from WAIT_PID.  */
327       CORE_ADDR wait_pc = read_pc_pid (wait_ptid);
328
329       if (wait_pc != read_pc ())
330         {
331           if (select_it)
332             {
333               /* Switch back to WAIT_PID thread.  */
334               inferior_ptid = wait_ptid;
335
336               /* FIXME: This stuff came from switch_to_thread() in
337                  thread.c (which should probably be a public function).  */
338               flush_cached_frames ();
339               registers_changed ();
340               stop_pc = wait_pc;
341               select_frame (get_current_frame ());
342             }
343           /* We return 1 to indicate that there is a breakpoint here,
344              so we need to step over it before continuing to avoid
345              hitting it straight away. */
346           if (breakpoint_here_p (wait_pc))
347             {
348               return 1;
349             }
350         }
351     }
352   return 0;
353   
354 }
355
356 void
357 init_frame_pc_noop (int fromleaf, struct frame_info *prev)
358 {
359   return;
360 }
361
362 void
363 init_frame_pc_default (int fromleaf, struct frame_info *prev)
364 {
365   if (fromleaf)
366     prev->pc = SAVED_PC_AFTER_CALL (prev->next);
367   else if (prev->next != NULL)
368     prev->pc = FRAME_SAVED_PC (prev->next);
369   else
370     prev->pc = read_pc ();
371 }
372
373 void
374 default_elf_make_msymbol_special (asymbol *sym, struct minimal_symbol *msym)
375 {
376   return;
377 }
378
379 void
380 default_coff_make_msymbol_special (int val, struct minimal_symbol *msym)
381 {
382   return;
383 }
384
385 int
386 cannot_register_not (int regnum)
387 {
388   return 0;
389 }
390
391 /* Legacy version of target_virtual_frame_pointer().  Assumes that
392    there is an FP_REGNUM and that it is the same, cooked or raw.  */
393
394 void
395 legacy_virtual_frame_pointer (CORE_ADDR pc,
396                               int *frame_regnum,
397                               LONGEST *frame_offset)
398 {
399   gdb_assert (FP_REGNUM >= 0);
400   *frame_regnum = FP_REGNUM;
401   *frame_offset = 0;
402 }
403
404 /* Assume the world is sane, every register's virtual and real size
405    is identical.  */
406
407 int
408 generic_register_size (int regnum)
409 {
410   gdb_assert (regnum >= 0 && regnum < NUM_REGS + NUM_PSEUDO_REGS);
411   return TYPE_LENGTH (REGISTER_VIRTUAL_TYPE (regnum));
412 }
413
414 #if !defined (IN_SIGTRAMP)
415 #if defined (SIGTRAMP_START)
416 #define IN_SIGTRAMP(pc, name) \
417        ((pc) >= SIGTRAMP_START(pc)   \
418         && (pc) < SIGTRAMP_END(pc) \
419         )
420 #else
421 #define IN_SIGTRAMP(pc, name) \
422        (name && STREQ ("_sigtramp", name))
423 #endif
424 #endif
425 \f
426 int
427 legacy_pc_in_sigtramp (CORE_ADDR pc, char *name)
428 {
429   return IN_SIGTRAMP(pc, name);
430 }
431
432 int
433 legacy_convert_register_p (int regnum)
434 {
435   return REGISTER_CONVERTIBLE (regnum);
436 }
437
438 void
439 legacy_register_to_value (int regnum, struct type *type,
440                           char *from, char *to)
441 {
442   REGISTER_CONVERT_TO_VIRTUAL (regnum, type, from, to);
443 }
444
445 void
446 legacy_value_to_register (struct type *type, int regnum,
447                           char *from, char *to)
448 {
449   REGISTER_CONVERT_TO_RAW (type, regnum, from, to);
450 }
451
452 \f
453 /* Functions to manipulate the endianness of the target.  */
454
455 /* ``target_byte_order'' is only used when non- multi-arch.
456    Multi-arch targets obtain the current byte order using the
457    TARGET_BYTE_ORDER gdbarch method.
458
459    The choice of initial value is entirely arbitrary.  During startup,
460    the function initialize_current_architecture() updates this value
461    based on default byte-order information extracted from BFD.  */
462 int target_byte_order = BFD_ENDIAN_BIG;
463 int target_byte_order_auto = 1;
464
465 static const char endian_big[] = "big";
466 static const char endian_little[] = "little";
467 static const char endian_auto[] = "auto";
468 static const char *endian_enum[] =
469 {
470   endian_big,
471   endian_little,
472   endian_auto,
473   NULL,
474 };
475 static const char *set_endian_string;
476
477 /* Called by ``show endian''.  */
478
479 static void
480 show_endian (char *args, int from_tty)
481 {
482   if (TARGET_BYTE_ORDER_AUTO)
483     printf_unfiltered ("The target endianness is set automatically (currently %s endian)\n",
484                        (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? "big" : "little"));
485   else
486     printf_unfiltered ("The target is assumed to be %s endian\n",
487                        (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? "big" : "little"));
488 }
489
490 static void
491 set_endian (char *ignore_args, int from_tty, struct cmd_list_element *c)
492 {
493   if (set_endian_string == endian_auto)
494     {
495       target_byte_order_auto = 1;
496     }
497   else if (set_endian_string == endian_little)
498     {
499       target_byte_order_auto = 0;
500       if (GDB_MULTI_ARCH)
501         {
502           struct gdbarch_info info;
503           gdbarch_info_init (&info);
504           info.byte_order = BFD_ENDIAN_LITTLE;
505           if (! gdbarch_update_p (info))
506             {
507               printf_unfiltered ("Little endian target not supported by GDB\n");
508             }
509         }
510       else
511         {
512           target_byte_order = BFD_ENDIAN_LITTLE;
513         }
514     }
515   else if (set_endian_string == endian_big)
516     {
517       target_byte_order_auto = 0;
518       if (GDB_MULTI_ARCH)
519         {
520           struct gdbarch_info info;
521           gdbarch_info_init (&info);
522           info.byte_order = BFD_ENDIAN_BIG;
523           if (! gdbarch_update_p (info))
524             {
525               printf_unfiltered ("Big endian target not supported by GDB\n");
526             }
527         }
528       else
529         {
530           target_byte_order = BFD_ENDIAN_BIG;
531         }
532     }
533   else
534     internal_error (__FILE__, __LINE__,
535                     "set_endian: bad value");
536   show_endian (NULL, from_tty);
537 }
538
539 /* Set the endianness from a BFD.  */
540
541 static void
542 set_endian_from_file (bfd *abfd)
543 {
544   int want;
545   if (GDB_MULTI_ARCH)
546     internal_error (__FILE__, __LINE__,
547                     "set_endian_from_file: not for multi-arch");
548   if (bfd_big_endian (abfd))
549     want = BFD_ENDIAN_BIG;
550   else
551     want = BFD_ENDIAN_LITTLE;
552   if (TARGET_BYTE_ORDER_AUTO)
553     target_byte_order = want;
554   else if (TARGET_BYTE_ORDER != want)
555     warning ("%s endian file does not match %s endian target.",
556              want == BFD_ENDIAN_BIG ? "big" : "little",
557              TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? "big" : "little");
558 }
559
560
561 /* Functions to manipulate the architecture of the target */
562
563 enum set_arch { set_arch_auto, set_arch_manual };
564
565 int target_architecture_auto = 1;
566
567 const char *set_architecture_string;
568
569 /* Old way of changing the current architecture. */
570
571 extern const struct bfd_arch_info bfd_default_arch_struct;
572 const struct bfd_arch_info *target_architecture = &bfd_default_arch_struct;
573 int (*target_architecture_hook) (const struct bfd_arch_info *ap);
574
575 static int
576 arch_ok (const struct bfd_arch_info *arch)
577 {
578   if (GDB_MULTI_ARCH)
579     internal_error (__FILE__, __LINE__,
580                     "arch_ok: not multi-arched");
581   /* Should be performing the more basic check that the binary is
582      compatible with GDB. */
583   /* Check with the target that the architecture is valid. */
584   return (target_architecture_hook == NULL
585           || target_architecture_hook (arch));
586 }
587
588 static void
589 set_arch (const struct bfd_arch_info *arch,
590           enum set_arch type)
591 {
592   if (GDB_MULTI_ARCH)
593     internal_error (__FILE__, __LINE__,
594                     "set_arch: not multi-arched");
595   switch (type)
596     {
597     case set_arch_auto:
598       if (!arch_ok (arch))
599         warning ("Target may not support %s architecture",
600                  arch->printable_name);
601       target_architecture = arch;
602       break;
603     case set_arch_manual:
604       if (!arch_ok (arch))
605         {
606           printf_unfiltered ("Target does not support `%s' architecture.\n",
607                              arch->printable_name);
608         }
609       else
610         {
611           target_architecture_auto = 0;
612           target_architecture = arch;
613         }
614       break;
615     }
616   if (gdbarch_debug)
617     gdbarch_dump (current_gdbarch, gdb_stdlog);
618 }
619
620 /* Set the architecture from arch/machine (deprecated) */
621
622 void
623 set_architecture_from_arch_mach (enum bfd_architecture arch,
624                                  unsigned long mach)
625 {
626   const struct bfd_arch_info *wanted = bfd_lookup_arch (arch, mach);
627   if (GDB_MULTI_ARCH)
628     internal_error (__FILE__, __LINE__,
629                     "set_architecture_from_arch_mach: not multi-arched");
630   if (wanted != NULL)
631     set_arch (wanted, set_arch_manual);
632   else
633     internal_error (__FILE__, __LINE__,
634                     "gdbarch: hardwired architecture/machine not recognized");
635 }
636
637 /* Set the architecture from a BFD (deprecated) */
638
639 static void
640 set_architecture_from_file (bfd *abfd)
641 {
642   const struct bfd_arch_info *wanted = bfd_get_arch_info (abfd);
643   if (GDB_MULTI_ARCH)
644     internal_error (__FILE__, __LINE__,
645                     "set_architecture_from_file: not multi-arched");
646   if (target_architecture_auto)
647     {
648       set_arch (wanted, set_arch_auto);
649     }
650   else if (wanted != target_architecture)
651     {
652       warning ("%s architecture file may be incompatible with %s target.",
653                wanted->printable_name,
654                target_architecture->printable_name);
655     }
656 }
657
658
659 /* Called if the user enters ``show architecture'' without an
660    argument. */
661
662 static void
663 show_architecture (char *args, int from_tty)
664 {
665   const char *arch;
666   arch = TARGET_ARCHITECTURE->printable_name;
667   if (target_architecture_auto)
668     printf_filtered ("The target architecture is set automatically (currently %s)\n", arch);
669   else
670     printf_filtered ("The target architecture is assumed to be %s\n", arch);
671 }
672
673
674 /* Called if the user enters ``set architecture'' with or without an
675    argument. */
676
677 static void
678 set_architecture (char *ignore_args, int from_tty, struct cmd_list_element *c)
679 {
680   if (strcmp (set_architecture_string, "auto") == 0)
681     {
682       target_architecture_auto = 1;
683     }
684   else if (GDB_MULTI_ARCH)
685     {
686       struct gdbarch_info info;
687       gdbarch_info_init (&info);
688       info.bfd_arch_info = bfd_scan_arch (set_architecture_string);
689       if (info.bfd_arch_info == NULL)
690         internal_error (__FILE__, __LINE__,
691                         "set_architecture: bfd_scan_arch failed");
692       if (gdbarch_update_p (info))
693         target_architecture_auto = 0;
694       else
695         printf_unfiltered ("Architecture `%s' not recognized.\n",
696                            set_architecture_string);
697     }
698   else
699     {
700       const struct bfd_arch_info *arch
701         = bfd_scan_arch (set_architecture_string);
702       if (arch == NULL)
703         internal_error (__FILE__, __LINE__,
704                         "set_architecture: bfd_scan_arch failed");
705       set_arch (arch, set_arch_manual);
706     }
707   show_architecture (NULL, from_tty);
708 }
709
710 /* Set the dynamic target-system-dependent parameters (architecture,
711    byte-order) using information found in the BFD */
712
713 void
714 set_gdbarch_from_file (bfd *abfd)
715 {
716   if (GDB_MULTI_ARCH)
717     {
718       struct gdbarch_info info;
719       gdbarch_info_init (&info);
720       info.abfd = abfd;
721       if (! gdbarch_update_p (info))
722         error ("Architecture of file not recognized.\n");
723     }
724   else
725     {
726       set_architecture_from_file (abfd);
727       set_endian_from_file (abfd);
728     }
729 }
730
731 /* Initialize the current architecture.  Update the ``set
732    architecture'' command so that it specifies a list of valid
733    architectures.  */
734
735 #ifdef DEFAULT_BFD_ARCH
736 extern const bfd_arch_info_type DEFAULT_BFD_ARCH;
737 static const bfd_arch_info_type *default_bfd_arch = &DEFAULT_BFD_ARCH;
738 #else
739 static const bfd_arch_info_type *default_bfd_arch;
740 #endif
741
742 #ifdef DEFAULT_BFD_VEC
743 extern const bfd_target DEFAULT_BFD_VEC;
744 static const bfd_target *default_bfd_vec = &DEFAULT_BFD_VEC;
745 #else
746 static const bfd_target *default_bfd_vec;
747 #endif
748
749 void
750 initialize_current_architecture (void)
751 {
752   const char **arches = gdbarch_printable_names ();
753
754   /* determine a default architecture and byte order. */
755   struct gdbarch_info info;
756   gdbarch_info_init (&info);
757   
758   /* Find a default architecture. */
759   if (info.bfd_arch_info == NULL
760       && default_bfd_arch != NULL)
761     info.bfd_arch_info = default_bfd_arch;
762   if (info.bfd_arch_info == NULL)
763     {
764       /* Choose the architecture by taking the first one
765          alphabetically. */
766       const char *chosen = arches[0];
767       const char **arch;
768       for (arch = arches; *arch != NULL; arch++)
769         {
770           if (strcmp (*arch, chosen) < 0)
771             chosen = *arch;
772         }
773       if (chosen == NULL)
774         internal_error (__FILE__, __LINE__,
775                         "initialize_current_architecture: No arch");
776       info.bfd_arch_info = bfd_scan_arch (chosen);
777       if (info.bfd_arch_info == NULL)
778         internal_error (__FILE__, __LINE__,
779                         "initialize_current_architecture: Arch not found");
780     }
781
782   /* Take several guesses at a byte order.  */
783   if (info.byte_order == BFD_ENDIAN_UNKNOWN
784       && default_bfd_vec != NULL)
785     {
786       /* Extract BFD's default vector's byte order. */
787       switch (default_bfd_vec->byteorder)
788         {
789         case BFD_ENDIAN_BIG:
790           info.byte_order = BFD_ENDIAN_BIG;
791           break;
792         case BFD_ENDIAN_LITTLE:
793           info.byte_order = BFD_ENDIAN_LITTLE;
794           break;
795         default:
796           break;
797         }
798     }
799   if (info.byte_order == BFD_ENDIAN_UNKNOWN)
800     {
801       /* look for ``*el-*'' in the target name. */
802       const char *chp;
803       chp = strchr (target_name, '-');
804       if (chp != NULL
805           && chp - 2 >= target_name
806           && strncmp (chp - 2, "el", 2) == 0)
807         info.byte_order = BFD_ENDIAN_LITTLE;
808     }
809   if (info.byte_order == BFD_ENDIAN_UNKNOWN)
810     {
811       /* Wire it to big-endian!!! */
812       info.byte_order = BFD_ENDIAN_BIG;
813     }
814
815   if (GDB_MULTI_ARCH)
816     {
817       if (! gdbarch_update_p (info))
818         {
819           internal_error (__FILE__, __LINE__,
820                           "initialize_current_architecture: Selection of initial architecture failed");
821         }
822     }
823   else
824     {
825       /* If the multi-arch logic comes up with a byte-order (from BFD)
826          use it for the non-multi-arch case.  */
827       if (info.byte_order != BFD_ENDIAN_UNKNOWN)
828         target_byte_order = info.byte_order;
829       initialize_non_multiarch ();
830     }
831
832   /* Create the ``set architecture'' command appending ``auto'' to the
833      list of architectures. */
834   {
835     struct cmd_list_element *c;
836     /* Append ``auto''. */
837     int nr;
838     for (nr = 0; arches[nr] != NULL; nr++);
839     arches = xrealloc (arches, sizeof (char*) * (nr + 2));
840     arches[nr + 0] = "auto";
841     arches[nr + 1] = NULL;
842     /* FIXME: add_set_enum_cmd() uses an array of ``char *'' instead
843        of ``const char *''.  We just happen to know that the casts are
844        safe. */
845     c = add_set_enum_cmd ("architecture", class_support,
846                           arches, &set_architecture_string,
847                           "Set architecture of target.",
848                           &setlist);
849     set_cmd_sfunc (c, set_architecture);
850     add_alias_cmd ("processor", "architecture", class_support, 1, &setlist);
851     /* Don't use set_from_show - need to print both auto/manual and
852        current setting. */
853     add_cmd ("architecture", class_support, show_architecture,
854              "Show the current target architecture", &showlist);
855   }
856 }
857
858
859 /* Initialize a gdbarch info to values that will be automatically
860    overridden.  Note: Originally, this ``struct info'' was initialized
861    using memset(0).  Unfortunatly, that ran into problems, namely
862    BFD_ENDIAN_BIG is zero.  An explicit initialization function that
863    can explicitly set each field to a well defined value is used.  */
864
865 void
866 gdbarch_info_init (struct gdbarch_info *info)
867 {
868   memset (info, 0, sizeof (struct gdbarch_info));
869   info->byte_order = BFD_ENDIAN_UNKNOWN;
870 }
871
872 /* */
873
874 extern initialize_file_ftype _initialize_gdbarch_utils;
875
876 void
877 _initialize_gdbarch_utils (void)
878 {
879   struct cmd_list_element *c;
880   c = add_set_enum_cmd ("endian", class_support,
881                         endian_enum, &set_endian_string,
882                         "Set endianness of target.",
883                         &setlist);
884   set_cmd_sfunc (c, set_endian);
885   /* Don't use set_from_show - need to print both auto/manual and
886      current setting. */
887   add_cmd ("endian", class_support, show_endian,
888            "Show the current byte-order", &showlist);
889 }