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