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