* acinclude.m4: Include config/stdint.m4.
[deliverable/binutils-gdb.git] / gdb / arch-utils.c
CommitLineData
c0e8c252 1/* Dynamic architecture support for GDB, the GNU debugger.
f4f9705a 2
6aba47ca 3 Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
22a44745 4 Free Software Foundation, Inc.
c0e8c252
AC
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
197e01b6
EZ
20 Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 Boston, MA 02110-1301, USA. */
c0e8c252
AC
22
23#include "defs.h"
24
fb6ecb0f 25#include "arch-utils.h"
192cb3d4 26#include "buildsym.h"
c0e8c252
AC
27#include "gdbcmd.h"
28#include "inferior.h" /* enum CALL_DUMMY_LOCATION et.al. */
5f8a3188 29#include "gdb_string.h"
fbec36e2 30#include "regcache.h"
39d4ef09 31#include "gdb_assert.h"
4182591f 32#include "sim-regno.h"
750eb019 33#include "gdbcore.h"
bf922ad9 34#include "osabi.h"
424163ea 35#include "target-descriptions.h"
bf922ad9 36
1ba607ad
AC
37#include "version.h"
38
f0d4cc9e
AC
39#include "floatformat.h"
40
1fd35568
JB
41int
42always_use_struct_convention (int gcc_p, struct type *value_type)
43{
44 return 1;
45}
46
750eb019
AC
47enum return_value_convention
48legacy_return_value (struct gdbarch *gdbarch, struct type *valtype,
b60c417a
AC
49 struct regcache *regcache, gdb_byte *readbuf,
50 const gdb_byte *writebuf)
750eb019
AC
51{
52 /* NOTE: cagney/2004-06-13: The gcc_p parameter to
53 USE_STRUCT_CONVENTION isn't used. */
54 int struct_return = ((TYPE_CODE (valtype) == TYPE_CODE_STRUCT
55 || TYPE_CODE (valtype) == TYPE_CODE_UNION
56 || TYPE_CODE (valtype) == TYPE_CODE_ARRAY)
57 && DEPRECATED_USE_STRUCT_CONVENTION (0, valtype));
58
59 if (writebuf != NULL)
60 {
61 gdb_assert (!struct_return);
62 /* NOTE: cagney/2004-06-13: See stack.c:return_command. Old
63 architectures don't expect STORE_RETURN_VALUE to handle small
64 structures. Should not be called with such types. */
65 gdb_assert (TYPE_CODE (valtype) != TYPE_CODE_STRUCT
66 && TYPE_CODE (valtype) != TYPE_CODE_UNION);
67 STORE_RETURN_VALUE (valtype, regcache, writebuf);
68 }
69
70 if (readbuf != NULL)
71 {
72 gdb_assert (!struct_return);
73 EXTRACT_RETURN_VALUE (valtype, regcache, readbuf);
74 }
75
76 if (struct_return)
77 return RETURN_VALUE_STRUCT_CONVENTION;
78 else
79 return RETURN_VALUE_REGISTER_CONVENTION;
80}
1fd35568 81
4182591f
AC
82int
83legacy_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
bdcd319a
CV
98CORE_ADDR
99generic_skip_trampoline_code (CORE_ADDR pc)
100{
101 return 0;
102}
103
dea0c52f 104CORE_ADDR
4c8c40e6 105generic_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
dea0c52f
MK
106{
107 return 0;
108}
109
d50355b6
MS
110int
111generic_in_solib_return_trampoline (CORE_ADDR pc, char *name)
112{
113 return 0;
114}
115
c12260ac
CV
116int
117generic_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR pc)
118{
119 return 0;
120}
121
c0e8c252 122void
f6684c31
AC
123generic_remote_translate_xfer_address (struct gdbarch *gdbarch,
124 struct regcache *regcache,
125 CORE_ADDR gdb_addr, int gdb_len,
c0e8c252
AC
126 CORE_ADDR * rem_addr, int *rem_len)
127{
128 *rem_addr = gdb_addr;
129 *rem_len = gdb_len;
130}
131
3339cf8b
AC
132/* Helper functions for INNER_THAN */
133
134int
fba45db2 135core_addr_lessthan (CORE_ADDR lhs, CORE_ADDR rhs)
3339cf8b
AC
136{
137 return (lhs < rhs);
138}
139
140int
fba45db2 141core_addr_greaterthan (CORE_ADDR lhs, CORE_ADDR rhs)
3339cf8b
AC
142{
143 return (lhs > rhs);
144}
145
193e3b1a
AC
146/* Misc helper functions for targets. */
147
f517ea4e 148CORE_ADDR
875e1767 149core_addr_identity (CORE_ADDR addr)
f517ea4e
PS
150{
151 return addr;
152}
153
e2d0e7eb
AC
154CORE_ADDR
155convert_from_func_ptr_addr_identity (struct gdbarch *gdbarch, CORE_ADDR addr,
156 struct target_ops *targ)
157{
158 return addr;
159}
160
88c72b7d
AC
161int
162no_op_reg_to_regnum (int reg)
163{
164 return reg;
165}
166
a2cf933a
EZ
167void
168default_elf_make_msymbol_special (asymbol *sym, struct minimal_symbol *msym)
169{
170 return;
171}
172
173void
174default_coff_make_msymbol_special (int val, struct minimal_symbol *msym)
175{
176 return;
177}
178
01fb7433
AC
179int
180cannot_register_not (int regnum)
181{
182 return 0;
183}
39d4ef09
AC
184
185/* Legacy version of target_virtual_frame_pointer(). Assumes that
0ba6dca9
AC
186 there is an DEPRECATED_FP_REGNUM and that it is the same, cooked or
187 raw. */
39d4ef09
AC
188
189void
190legacy_virtual_frame_pointer (CORE_ADDR pc,
191 int *frame_regnum,
192 LONGEST *frame_offset)
193{
20bcf01c
AC
194 /* FIXME: cagney/2002-09-13: This code is used when identifying the
195 frame pointer of the current PC. It is assuming that a single
196 register and an offset can determine this. I think it should
197 instead generate a byte code expression as that would work better
198 with things like Dwarf2's CFI. */
0ba6dca9
AC
199 if (DEPRECATED_FP_REGNUM >= 0 && DEPRECATED_FP_REGNUM < NUM_REGS)
200 *frame_regnum = DEPRECATED_FP_REGNUM;
20bcf01c
AC
201 else if (SP_REGNUM >= 0 && SP_REGNUM < NUM_REGS)
202 *frame_regnum = SP_REGNUM;
203 else
204 /* Should this be an internal error? I guess so, it is reflecting
205 an architectural limitation in the current design. */
edefbb7c 206 internal_error (__FILE__, __LINE__, _("No virtual frame pointer available"));
39d4ef09
AC
207 *frame_offset = 0;
208}
46cd78fb 209
b2e75d78
AC
210/* Assume the world is sane, every register's virtual and real size
211 is identical. */
46cd78fb
AC
212
213int
b2e75d78 214generic_register_size (int regnum)
46cd78fb
AC
215{
216 gdb_assert (regnum >= 0 && regnum < NUM_REGS + NUM_PSEUDO_REGS);
7b9ee6a8 217 return TYPE_LENGTH (register_type (current_gdbarch, regnum));
ce29138a
MS
218}
219
a7e3c2ad
AC
220/* Assume all registers are adjacent. */
221
222int
223generic_register_byte (int regnum)
224{
225 int byte;
226 int i;
227 gdb_assert (regnum >= 0 && regnum < NUM_REGS + NUM_PSEUDO_REGS);
228 byte = 0;
229 for (i = 0; i < regnum; i++)
230 {
0aa7e1aa 231 byte += generic_register_size (i);
a7e3c2ad
AC
232 }
233 return byte;
234}
235
d7bd68ca 236\f
13d01224 237int
a1f4a1b6 238generic_convert_register_p (int regnum, struct type *type)
13d01224 239{
9730f241 240 return 0;
13d01224
AC
241}
242
192cb3d4
MK
243int
244default_stabs_argument_has_addr (struct gdbarch *gdbarch, struct type *type)
245{
192cb3d4
MK
246 return 0;
247}
248
3ca64954
RC
249int
250generic_instruction_nullified (struct gdbarch *gdbarch,
251 struct regcache *regcache)
252{
253 return 0;
254}
255
123dc839
DJ
256int
257default_remote_register_number (struct gdbarch *gdbarch,
258 int regno)
259{
260 return regno;
261}
262
01fb7433 263\f
b4a20239
AC
264/* Functions to manipulate the endianness of the target. */
265
7a107747 266static int target_byte_order_user = BFD_ENDIAN_UNKNOWN;
b4a20239 267
53904c9e
AC
268static const char endian_big[] = "big";
269static const char endian_little[] = "little";
270static const char endian_auto[] = "auto";
271static const char *endian_enum[] =
b4a20239
AC
272{
273 endian_big,
274 endian_little,
275 endian_auto,
276 NULL,
277};
53904c9e 278static const char *set_endian_string;
b4a20239 279
b6d373df
DJ
280enum bfd_endian
281selected_byte_order (void)
282{
283 if (target_byte_order_user != BFD_ENDIAN_UNKNOWN)
284 return TARGET_BYTE_ORDER;
285 else
286 return BFD_ENDIAN_UNKNOWN;
287}
288
b4a20239
AC
289/* Called by ``show endian''. */
290
291static void
7ab04401
AC
292show_endian (struct ui_file *file, int from_tty, struct cmd_list_element *c,
293 const char *value)
b4a20239 294{
7b6b9e83 295 if (target_byte_order_user == BFD_ENDIAN_UNKNOWN)
edefbb7c 296 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
7ab04401
AC
297 fprintf_unfiltered (file, _("The target endianness is set automatically "
298 "(currently big endian)\n"));
edefbb7c 299 else
7ab04401 300 fprintf_unfiltered (file, _("The target endianness is set automatically "
edefbb7c 301 "(currently little endian)\n"));
b4a20239 302 else
edefbb7c 303 if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG)
7ab04401
AC
304 fprintf_unfiltered (file,
305 _("The target is assumed to be big endian\n"));
306 else
307 fprintf_unfiltered (file,
308 _("The target is assumed to be little endian\n"));
b4a20239
AC
309}
310
311static void
312set_endian (char *ignore_args, int from_tty, struct cmd_list_element *c)
313{
7a107747
DJ
314 struct gdbarch_info info;
315
316 gdbarch_info_init (&info);
317
3fd3d7d2 318 if (set_endian_string == endian_auto)
b4a20239 319 {
7a107747
DJ
320 target_byte_order_user = BFD_ENDIAN_UNKNOWN;
321 if (! gdbarch_update_p (info))
322 internal_error (__FILE__, __LINE__,
323 _("set_endian: architecture update failed"));
b4a20239
AC
324 }
325 else if (set_endian_string == endian_little)
326 {
d90cf509
AC
327 info.byte_order = BFD_ENDIAN_LITTLE;
328 if (! gdbarch_update_p (info))
edefbb7c 329 printf_unfiltered (_("Little endian target not supported by GDB\n"));
7a107747
DJ
330 else
331 target_byte_order_user = BFD_ENDIAN_LITTLE;
b4a20239
AC
332 }
333 else if (set_endian_string == endian_big)
334 {
d90cf509
AC
335 info.byte_order = BFD_ENDIAN_BIG;
336 if (! gdbarch_update_p (info))
edefbb7c 337 printf_unfiltered (_("Big endian target not supported by GDB\n"));
7a107747
DJ
338 else
339 target_byte_order_user = BFD_ENDIAN_BIG;
b4a20239
AC
340 }
341 else
8e65ff28 342 internal_error (__FILE__, __LINE__,
edefbb7c 343 _("set_endian: bad value"));
7a107747 344
7ab04401 345 show_endian (gdb_stdout, from_tty, NULL, NULL);
b4a20239
AC
346}
347
23181151
DJ
348/* Given SELECTED, a currently selected BFD architecture, and
349 FROM_TARGET, a BFD architecture reported by the target description,
350 return what architecture to use. Either may be NULL; if both are
351 specified, we use the more specific. If the two are obviously
352 incompatible, warn the user. */
353
354static const struct bfd_arch_info *
355choose_architecture_for_target (const struct bfd_arch_info *selected,
356 const struct bfd_arch_info *from_target)
357{
358 const struct bfd_arch_info *compat1, *compat2;
359
360 if (selected == NULL)
361 return from_target;
362
363 if (from_target == NULL)
364 return selected;
365
366 /* struct bfd_arch_info objects are singletons: that is, there's
367 supposed to be exactly one instance for a given machine. So you
368 can tell whether two are equivalent by comparing pointers. */
369 if (from_target == selected)
370 return selected;
371
372 /* BFD's 'A->compatible (A, B)' functions return zero if A and B are
373 incompatible. But if they are compatible, it returns the 'more
374 featureful' of the two arches. That is, if A can run code
375 written for B, but B can't run code written for A, then it'll
376 return A.
377
378 Some targets (e.g. MIPS as of 2006-12-04) don't fully
379 implement this, instead always returning NULL or the first
380 argument. We detect that case by checking both directions. */
381
382 compat1 = selected->compatible (selected, from_target);
383 compat2 = from_target->compatible (from_target, selected);
384
385 if (compat1 == NULL && compat2 == NULL)
386 {
387 warning (_("Selected architecture %s is not compatible "
388 "with reported target architecture %s"),
389 selected->printable_name, from_target->printable_name);
390 return selected;
391 }
392
393 if (compat1 == NULL)
394 return compat2;
395 if (compat2 == NULL)
396 return compat1;
397 if (compat1 == compat2)
398 return compat1;
399
400 /* If the two didn't match, but one of them was a default architecture,
401 assume the more specific one is correct. This handles the case
402 where an executable or target description just says "mips", but
403 the other knows which MIPS variant. */
404 if (compat1->the_default)
405 return compat2;
406 if (compat2->the_default)
407 return compat1;
408
409 /* We have no idea which one is better. This is a bug, but not
410 a critical problem; warn the user. */
411 warning (_("Selected architecture %s is ambiguous with "
412 "reported target architecture %s"),
413 selected->printable_name, from_target->printable_name);
414 return selected;
415}
416
b4a20239
AC
417/* Functions to manipulate the architecture of the target */
418
419enum set_arch { set_arch_auto, set_arch_manual };
420
7a107747 421static const struct bfd_arch_info *target_architecture_user;
b4a20239 422
a8cf2722
AC
423static const char *set_architecture_string;
424
425const char *
426selected_architecture_name (void)
427{
7a107747 428 if (target_architecture_user == NULL)
a8cf2722
AC
429 return NULL;
430 else
431 return set_architecture_string;
432}
b4a20239 433
b4a20239
AC
434/* Called if the user enters ``show architecture'' without an
435 argument. */
436
437static void
7ab04401
AC
438show_architecture (struct ui_file *file, int from_tty,
439 struct cmd_list_element *c, const char *value)
b4a20239
AC
440{
441 const char *arch;
442 arch = TARGET_ARCHITECTURE->printable_name;
7a107747 443 if (target_architecture_user == NULL)
7ab04401
AC
444 fprintf_filtered (file, _("\
445The target architecture is set automatically (currently %s)\n"), arch);
b4a20239 446 else
7ab04401
AC
447 fprintf_filtered (file, _("\
448The target architecture is assumed to be %s\n"), arch);
b4a20239
AC
449}
450
451
452/* Called if the user enters ``set architecture'' with or without an
453 argument. */
454
455static void
456set_architecture (char *ignore_args, int from_tty, struct cmd_list_element *c)
457{
7a107747
DJ
458 struct gdbarch_info info;
459
460 gdbarch_info_init (&info);
461
b4a20239
AC
462 if (strcmp (set_architecture_string, "auto") == 0)
463 {
7a107747
DJ
464 target_architecture_user = NULL;
465 if (!gdbarch_update_p (info))
466 internal_error (__FILE__, __LINE__,
467 _("could not select an architecture automatically"));
b4a20239 468 }
d90cf509 469 else
b4a20239 470 {
b4a20239
AC
471 info.bfd_arch_info = bfd_scan_arch (set_architecture_string);
472 if (info.bfd_arch_info == NULL)
8e65ff28 473 internal_error (__FILE__, __LINE__,
edefbb7c 474 _("set_architecture: bfd_scan_arch failed"));
16f33e29 475 if (gdbarch_update_p (info))
7a107747 476 target_architecture_user = info.bfd_arch_info;
b4a20239 477 else
edefbb7c 478 printf_unfiltered (_("Architecture `%s' not recognized.\n"),
b4a20239
AC
479 set_architecture_string);
480 }
7ab04401 481 show_architecture (gdb_stdout, from_tty, NULL, NULL);
b4a20239
AC
482}
483
ebdba546
AC
484/* Try to select a global architecture that matches "info". Return
485 non-zero if the attempt succeds. */
486int
487gdbarch_update_p (struct gdbarch_info info)
488{
489 struct gdbarch *new_gdbarch = gdbarch_find_by_info (info);
490
491 /* If there no architecture by that name, reject the request. */
492 if (new_gdbarch == NULL)
493 {
494 if (gdbarch_debug)
495 fprintf_unfiltered (gdb_stdlog, "gdbarch_update_p: "
496 "Architecture not found\n");
497 return 0;
498 }
499
500 /* If it is the same old architecture, accept the request (but don't
501 swap anything). */
502 if (new_gdbarch == current_gdbarch)
503 {
504 if (gdbarch_debug)
505 fprintf_unfiltered (gdb_stdlog, "gdbarch_update_p: "
506 "Architecture 0x%08lx (%s) unchanged\n",
507 (long) new_gdbarch,
508 gdbarch_bfd_arch_info (new_gdbarch)->printable_name);
509 return 1;
510 }
511
512 /* It's a new architecture, swap it in. */
513 if (gdbarch_debug)
514 fprintf_unfiltered (gdb_stdlog, "gdbarch_update_p: "
515 "New architecture 0x%08lx (%s) selected\n",
516 (long) new_gdbarch,
517 gdbarch_bfd_arch_info (new_gdbarch)->printable_name);
518 deprecated_current_gdbarch_select_hack (new_gdbarch);
519
520 return 1;
521}
522
2b026650
MK
523/* Return the architecture for ABFD. If no suitable architecture
524 could be find, return NULL. */
525
526struct gdbarch *
527gdbarch_from_bfd (bfd *abfd)
b4a20239 528{
2b026650
MK
529 struct gdbarch *old_gdbarch = current_gdbarch;
530 struct gdbarch *new_gdbarch;
d90cf509 531 struct gdbarch_info info;
2b026650 532
7a107747
DJ
533 /* If we call gdbarch_find_by_info without filling in info.abfd,
534 then it will use the global exec_bfd. That's fine if we don't
535 have one of those either. And that's the only time we should
536 reach here with a NULL ABFD argument - when we are discarding
537 the executable. */
538 gdb_assert (abfd != NULL || exec_bfd == NULL);
539
d90cf509
AC
540 gdbarch_info_init (&info);
541 info.abfd = abfd;
b60eb90d 542 return gdbarch_find_by_info (info);
2b026650
MK
543}
544
545/* Set the dynamic target-system-dependent parameters (architecture,
546 byte-order) using information found in the BFD */
547
548void
549set_gdbarch_from_file (bfd *abfd)
550{
551 struct gdbarch *gdbarch;
552
553 gdbarch = gdbarch_from_bfd (abfd);
554 if (gdbarch == NULL)
8a3fe4f8 555 error (_("Architecture of file not recognized."));
b60eb90d 556 deprecated_current_gdbarch_select_hack (gdbarch);
b4a20239
AC
557}
558
559/* Initialize the current architecture. Update the ``set
560 architecture'' command so that it specifies a list of valid
561 architectures. */
562
1ba607ad
AC
563#ifdef DEFAULT_BFD_ARCH
564extern const bfd_arch_info_type DEFAULT_BFD_ARCH;
565static const bfd_arch_info_type *default_bfd_arch = &DEFAULT_BFD_ARCH;
566#else
4b9b3959 567static const bfd_arch_info_type *default_bfd_arch;
1ba607ad
AC
568#endif
569
570#ifdef DEFAULT_BFD_VEC
571extern const bfd_target DEFAULT_BFD_VEC;
572static const bfd_target *default_bfd_vec = &DEFAULT_BFD_VEC;
573#else
574static const bfd_target *default_bfd_vec;
575#endif
576
7a107747
DJ
577static int default_byte_order = BFD_ENDIAN_UNKNOWN;
578
b4a20239
AC
579void
580initialize_current_architecture (void)
581{
582 const char **arches = gdbarch_printable_names ();
b4a20239 583
1ba607ad
AC
584 /* determine a default architecture and byte order. */
585 struct gdbarch_info info;
fb6ecb0f 586 gdbarch_info_init (&info);
1ba607ad
AC
587
588 /* Find a default architecture. */
7a107747 589 if (default_bfd_arch == NULL)
b4a20239 590 {
1ba607ad
AC
591 /* Choose the architecture by taking the first one
592 alphabetically. */
593 const char *chosen = arches[0];
b4a20239 594 const char **arch;
b4a20239
AC
595 for (arch = arches; *arch != NULL; arch++)
596 {
b4a20239
AC
597 if (strcmp (*arch, chosen) < 0)
598 chosen = *arch;
599 }
600 if (chosen == NULL)
8e65ff28 601 internal_error (__FILE__, __LINE__,
edefbb7c 602 _("initialize_current_architecture: No arch"));
7a107747
DJ
603 default_bfd_arch = bfd_scan_arch (chosen);
604 if (default_bfd_arch == NULL)
8e65ff28 605 internal_error (__FILE__, __LINE__,
edefbb7c 606 _("initialize_current_architecture: Arch not found"));
1ba607ad
AC
607 }
608
7a107747
DJ
609 info.bfd_arch_info = default_bfd_arch;
610
afe64c1a 611 /* Take several guesses at a byte order. */
7a107747 612 if (default_byte_order == BFD_ENDIAN_UNKNOWN
1ba607ad
AC
613 && default_bfd_vec != NULL)
614 {
615 /* Extract BFD's default vector's byte order. */
616 switch (default_bfd_vec->byteorder)
617 {
618 case BFD_ENDIAN_BIG:
7a107747 619 default_byte_order = BFD_ENDIAN_BIG;
1ba607ad
AC
620 break;
621 case BFD_ENDIAN_LITTLE:
7a107747 622 default_byte_order = BFD_ENDIAN_LITTLE;
1ba607ad
AC
623 break;
624 default:
625 break;
626 }
627 }
7a107747 628 if (default_byte_order == BFD_ENDIAN_UNKNOWN)
1ba607ad
AC
629 {
630 /* look for ``*el-*'' in the target name. */
631 const char *chp;
632 chp = strchr (target_name, '-');
633 if (chp != NULL
634 && chp - 2 >= target_name
635 && strncmp (chp - 2, "el", 2) == 0)
7a107747 636 default_byte_order = BFD_ENDIAN_LITTLE;
1ba607ad 637 }
7a107747 638 if (default_byte_order == BFD_ENDIAN_UNKNOWN)
1ba607ad
AC
639 {
640 /* Wire it to big-endian!!! */
7a107747 641 default_byte_order = BFD_ENDIAN_BIG;
1ba607ad
AC
642 }
643
7a107747
DJ
644 info.byte_order = default_byte_order;
645
d90cf509
AC
646 if (! gdbarch_update_p (info))
647 internal_error (__FILE__, __LINE__,
edefbb7c
AC
648 _("initialize_current_architecture: Selection of "
649 "initial architecture failed"));
b4a20239 650
1ba607ad
AC
651 /* Create the ``set architecture'' command appending ``auto'' to the
652 list of architectures. */
b4a20239
AC
653 {
654 struct cmd_list_element *c;
655 /* Append ``auto''. */
656 int nr;
657 for (nr = 0; arches[nr] != NULL; nr++);
658 arches = xrealloc (arches, sizeof (char*) * (nr + 2));
659 arches[nr + 0] = "auto";
660 arches[nr + 1] = NULL;
7ab04401
AC
661 add_setshow_enum_cmd ("architecture", class_support,
662 arches, &set_architecture_string, _("\
663Set architecture of target."), _("\
664Show architecture of target."), NULL,
665 set_architecture, show_architecture,
666 &setlist, &showlist);
b4a20239 667 add_alias_cmd ("processor", "architecture", class_support, 1, &setlist);
b4a20239
AC
668 }
669}
670
671
fb6ecb0f
AC
672/* Initialize a gdbarch info to values that will be automatically
673 overridden. Note: Originally, this ``struct info'' was initialized
ce2826aa 674 using memset(0). Unfortunately, that ran into problems, namely
fb6ecb0f
AC
675 BFD_ENDIAN_BIG is zero. An explicit initialization function that
676 can explicitly set each field to a well defined value is used. */
677
678void
679gdbarch_info_init (struct gdbarch_info *info)
680{
681 memset (info, 0, sizeof (struct gdbarch_info));
428721aa 682 info->byte_order = BFD_ENDIAN_UNKNOWN;
4be87837 683 info->osabi = GDB_OSABI_UNINITIALIZED;
fb6ecb0f
AC
684}
685
100bcc3f 686/* Similar to init, but this time fill in the blanks. Information is
7a107747
DJ
687 obtained from the global "set ..." options and explicitly
688 initialized INFO fields. */
bf922ad9
AC
689
690void
7a107747 691gdbarch_info_fill (struct gdbarch_info *info)
bf922ad9 692{
7a107747
DJ
693 /* Check for the current file. */
694 if (info->abfd == NULL)
695 info->abfd = exec_bfd;
696
424163ea
DJ
697 /* Check for the current target description. */
698 if (info->target_desc == NULL)
699 info->target_desc = target_current_description ();
700
bf922ad9
AC
701 /* "(gdb) set architecture ...". */
702 if (info->bfd_arch_info == NULL
7a107747
DJ
703 && target_architecture_user)
704 info->bfd_arch_info = target_architecture_user;
424163ea 705 /* From the file. */
bf922ad9
AC
706 if (info->bfd_arch_info == NULL
707 && info->abfd != NULL
708 && bfd_get_arch (info->abfd) != bfd_arch_unknown
709 && bfd_get_arch (info->abfd) != bfd_arch_obscure)
710 info->bfd_arch_info = bfd_get_arch_info (info->abfd);
23181151
DJ
711 /* From the target. */
712 if (info->target_desc != NULL)
713 info->bfd_arch_info = choose_architecture_for_target
714 (info->bfd_arch_info, tdesc_architecture (info->target_desc));
7a107747
DJ
715 /* From the default. */
716 if (info->bfd_arch_info == NULL)
717 info->bfd_arch_info = default_bfd_arch;
bf922ad9
AC
718
719 /* "(gdb) set byte-order ...". */
720 if (info->byte_order == BFD_ENDIAN_UNKNOWN
7a107747
DJ
721 && target_byte_order_user != BFD_ENDIAN_UNKNOWN)
722 info->byte_order = target_byte_order_user;
bf922ad9
AC
723 /* From the INFO struct. */
724 if (info->byte_order == BFD_ENDIAN_UNKNOWN
725 && info->abfd != NULL)
726 info->byte_order = (bfd_big_endian (info->abfd) ? BFD_ENDIAN_BIG
7a107747
DJ
727 : bfd_little_endian (info->abfd) ? BFD_ENDIAN_LITTLE
728 : BFD_ENDIAN_UNKNOWN);
729 /* From the default. */
730 if (info->byte_order == BFD_ENDIAN_UNKNOWN)
731 info->byte_order = default_byte_order;
bf922ad9
AC
732
733 /* "(gdb) set osabi ...". Handled by gdbarch_lookup_osabi. */
734 if (info->osabi == GDB_OSABI_UNINITIALIZED)
735 info->osabi = gdbarch_lookup_osabi (info->abfd);
bf922ad9
AC
736
737 /* Must have at least filled in the architecture. */
738 gdb_assert (info->bfd_arch_info != NULL);
739}
740
c0e8c252
AC
741/* */
742
a78f21af 743extern initialize_file_ftype _initialize_gdbarch_utils; /* -Wmissing-prototypes */
c0e8c252
AC
744
745void
b4a20239 746_initialize_gdbarch_utils (void)
c0e8c252 747{
b4a20239 748 struct cmd_list_element *c;
7ab04401
AC
749 add_setshow_enum_cmd ("endian", class_support,
750 endian_enum, &set_endian_string, _("\
751Set endianness of target."), _("\
752Show endianness of target."), NULL,
753 set_endian, show_endian,
754 &setlist, &showlist);
c0e8c252 755}
This page took 0.460964 seconds and 4 git commands to generate.