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