2000-04-14 H.J. Lu <hjl@gnu.org>
[deliverable/binutils-gdb.git] / gdb / gdbarch.sh
CommitLineData
104c1213
JM
1#!/usr/local/bin/bash
2
3# Architecture commands for GDB, the GNU debugger.
59233f88 4# Copyright 1998-2000 Free Software Foundation, Inc.
104c1213
JM
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, Boston, MA 02111-1307, USA.
21
59233f88
AC
22compare_new ()
23{
24 file=$1
25 if ! test -r ${file}
26 then
27 echo "${file} missing? cp new-${file} ${file}" 1>&2
28 elif diff -c ${file} new-${file}
29 then
30 echo "${file} unchanged" 1>&2
31 else
32 echo "${file} has changed? cp new-${file} ${file}" 1>&2
33 fi
34}
35
36
c0e8c252
AC
37# DEFAULT is a valid fallback definition of a MACRO when
38# multi-arch is not enabled.
39default_is_fallback_p ()
40{
41 [ "${default}" != "" -a "${invalid_p}" = "0" ]
42 # FIXME: cagney - not until after 5.0
43 false
44}
45
59233f88 46# Format of the input table
c0e8c252
AC
47read="class level macro returntype function formal actual attrib startup default invalid_p fmt print print_p description"
48
49do_read ()
50{
51 if eval read $read
52 then
53 test "${startup}" || startup=0
54 test "${fmt}" || fmt="%ld"
55 test "${print}" || print="(long) ${macro}"
56 #test "${default}" || default=0
57 :
58 else
59 false
60 fi
61}
62
104c1213 63
cff3e48b
JM
64# dump out/verify the doco
65for field in ${read}
66do
67 case ${field} in
68
69 class ) : ;;
c4093a6a 70
c0e8c252
AC
71 # # -> line disable
72 # f -> function
73 # hiding a function
74 # v -> variable
75 # hiding a variable
76 # i -> set from info
77 # hiding something from the ``struct info'' object
cff3e48b
JM
78
79 level ) : ;;
80
c0e8c252
AC
81 # See GDB_MULTI_ARCH description. Having GDB_MULTI_ARCH >=
82 # LEVEL is a predicate on checking that a given method is
83 # initialized (using INVALID_P).
cff3e48b
JM
84
85 macro ) : ;;
86
c0e8c252 87 # The name of the MACRO that this method is to be accessed by.
cff3e48b
JM
88
89 returntype ) : ;;
90
c0e8c252 91 # For functions, the return type; for variables, the data type
cff3e48b
JM
92
93 function ) : ;;
94
c0e8c252
AC
95 # For functions, the member function name; for variables, the
96 # variable name. Member function names are always prefixed with
97 # ``gdbarch_'' for name-space purity.
cff3e48b
JM
98
99 formal ) : ;;
100
c0e8c252
AC
101 # The formal argument list. It is assumed that the formal
102 # argument list includes the actual name of each list element.
103 # A function with no arguments shall have ``void'' as the
104 # formal argument list.
cff3e48b
JM
105
106 actual ) : ;;
107
c0e8c252
AC
108 # The list of actual arguments. The arguments specified shall
109 # match the FORMAL list given above. Functions with out
110 # arguments leave this blank.
cff3e48b
JM
111
112 attrib ) : ;;
113
c0e8c252
AC
114 # Any GCC attributes that should be attached to the function
115 # declaration. At present this field is unused.
cff3e48b 116
c0e8c252
AC
117 startup ) : ;;
118
119 # To help with the GDB startup a static gdbarch object is
120 # created. STARTUP is the value to insert into that static
121 # gdbarch object.
cff3e48b 122
c0e8c252
AC
123 # By default ``0'' is used.
124
125 default ) : ;;
cff3e48b 126
c0e8c252
AC
127 # Any initial value to assign to a new gdbarch object after it
128 # as been malloc()ed. Zero is used by default.
cff3e48b 129
c0e8c252
AC
130 # Specify a non-empty DEFAULT and a zero INVALID_P to create a
131 # fallback value or function for when multi-arch is disabled.
132 # Specify a zero DEFAULT function to make that fallback
133 # illegal to call.
cff3e48b 134
c4093a6a 135 invalid_p ) : ;;
cff3e48b 136
c0e8c252
AC
137 # A predicate equation that validates MEMBER. Non-zero is
138 # returned if the code creating the new architecture failed to
139 # initialize the MEMBER or initialized the member to something
140 # invalid. By default, a check that the value is no longer
141 # equal to DEFAULT ips performed. The equation ``0'' disables
142 # the invalid_p check.
cff3e48b
JM
143
144 fmt ) : ;;
145
c0e8c252
AC
146 # printf style format string that can be used to print out the
147 # MEMBER. Sometimes "%s" is useful. For functions, this is
148 # ignored and the function address is printed.
149
150 # By default ```%ld'' is used.
cff3e48b
JM
151
152 print ) : ;;
153
c0e8c252
AC
154 # An optional equation that casts MEMBER to a value suitable
155 # for formatting by FMT.
156
157 # By default ``(long)'' is used.
cff3e48b
JM
158
159 print_p ) : ;;
160
c0e8c252
AC
161 # An optional indicator for any predicte to wrap around the
162 # print member code.
163
164 # # -> Wrap print up in ``#ifdef MACRO''
165 # exp -> Wrap print up in ``if (${print_p}) ...
166 # ``'' -> No predicate
cff3e48b
JM
167
168 description ) : ;;
169
170 # Currently unused.
171
172 *) exit 1;;
173 esac
174done
175
176IFS=:
177
104c1213
JM
178function_list ()
179{
cff3e48b 180 # See below (DOCO) for description of each field
104c1213
JM
181 cat <<EOF |
182i:2:TARGET_ARCHITECTURE:const struct bfd_arch_info *:bfd_arch_info::::&bfd_default_arch_struct:::%s:TARGET_ARCHITECTURE->printable_name:TARGET_ARCHITECTURE != NULL
183#
184i:2:TARGET_BYTE_ORDER:int:byte_order::::BIG_ENDIAN
185#
c4093a6a 186v:1:TARGET_BFD_VMA_BIT:int:bfd_vma_bit::::8 * sizeof (void*):TARGET_ARCHITECTURE->bits_per_address:0
104c1213
JM
187v:1:TARGET_PTR_BIT:int:ptr_bit::::8 * sizeof (void*):0
188#v:1:TARGET_CHAR_BIT:int:char_bit::::8 * sizeof (char):0
189v:1:TARGET_SHORT_BIT:int:short_bit::::8 * sizeof (short):0
190v:1:TARGET_INT_BIT:int:int_bit::::8 * sizeof (int):0
191v:1:TARGET_LONG_BIT:int:long_bit::::8 * sizeof (long):0
192v:1:TARGET_LONG_LONG_BIT:int:long_long_bit::::8 * sizeof (LONGEST):0
193v:1:TARGET_FLOAT_BIT:int:float_bit::::8 * sizeof (float):0
194v:1:TARGET_DOUBLE_BIT:int:double_bit::::8 * sizeof (double):0
195v:1:TARGET_LONG_DOUBLE_BIT:int:long_double_bit::::8 * sizeof (long double):0
196#
197f:1:TARGET_READ_PC:CORE_ADDR:read_pc:int pid:pid::0:0
198f:1:TARGET_WRITE_PC:void:write_pc:CORE_ADDR val, int pid:val, pid::0:0
199f:1:TARGET_READ_FP:CORE_ADDR:read_fp:void:::0:0
200f:1:TARGET_WRITE_FP:void:write_fp:CORE_ADDR val:val::0:0
201f:1:TARGET_READ_SP:CORE_ADDR:read_sp:void:::0:0
202f:1:TARGET_WRITE_SP:void:write_sp:CORE_ADDR val:val::0:0
203#
204v:2:NUM_REGS:int:num_regs::::0:-1
205v:2:SP_REGNUM:int:sp_regnum::::0:-1
206v:2:FP_REGNUM:int:fp_regnum::::0:-1
207v:2:PC_REGNUM:int:pc_regnum::::0:-1
c0e8c252 208f:2:REGISTER_NAME:char *:register_name:int regnr:regnr:::legacy_register_name:0
104c1213
JM
209v:2:REGISTER_SIZE:int:register_size::::0:-1
210v:2:REGISTER_BYTES:int:register_bytes::::0:-1
211f:2:REGISTER_BYTE:int:register_byte:int reg_nr:reg_nr::0:0
212f:2:REGISTER_RAW_SIZE:int:register_raw_size:int reg_nr:reg_nr::0:0
213v:2:MAX_REGISTER_RAW_SIZE:int:max_register_raw_size::::0:-1
214f:2:REGISTER_VIRTUAL_SIZE:int:register_virtual_size:int reg_nr:reg_nr::0:0
215v:2:MAX_REGISTER_VIRTUAL_SIZE:int:max_register_virtual_size::::0:-1
216f:2:REGISTER_VIRTUAL_TYPE:struct type *:register_virtual_type:int reg_nr:reg_nr::0:0
217#
218v:1:USE_GENERIC_DUMMY_FRAMES:int:use_generic_dummy_frames::::0:-1
219v:2:CALL_DUMMY_LOCATION:int:call_dummy_location::::0:0
220f:2:CALL_DUMMY_ADDRESS:CORE_ADDR:call_dummy_address:void:::0:0:gdbarch->call_dummy_location == AT_ENTRY_POINT && gdbarch->call_dummy_address == 0:
221v:2:CALL_DUMMY_START_OFFSET:CORE_ADDR:call_dummy_start_offset::::0:-1::0x%08lx
222v:2:CALL_DUMMY_BREAKPOINT_OFFSET:CORE_ADDR:call_dummy_breakpoint_offset::::0:-1::0x%08lx
223v:1:CALL_DUMMY_BREAKPOINT_OFFSET_P:int:call_dummy_breakpoint_offset_p::::0:-1
224v:2:CALL_DUMMY_LENGTH:int:call_dummy_length::::0:-1::::CALL_DUMMY_LOCATION == BEFORE_TEXT_END || CALL_DUMMY_LOCATION == AFTER_TEXT_END
225f:2:PC_IN_CALL_DUMMY:int:pc_in_call_dummy:CORE_ADDR pc, CORE_ADDR sp, CORE_ADDR frame_address:pc, sp, frame_address::0:0
226v:1:CALL_DUMMY_P:int:call_dummy_p::::0:-1
c0e8c252
AC
227v:2:CALL_DUMMY_WORDS:LONGEST *:call_dummy_words::::0:legacy_call_dummy_words:0:0x%08lx
228v:2:SIZEOF_CALL_DUMMY_WORDS:int:sizeof_call_dummy_words::::0:legacy_sizeof_call_dummy_words:0:0x%08lx
104c1213
JM
229v:1:CALL_DUMMY_STACK_ADJUST_P:int:call_dummy_stack_adjust_p::::0:-1::0x%08lx
230v:2:CALL_DUMMY_STACK_ADJUST:int:call_dummy_stack_adjust::::0::gdbarch->call_dummy_stack_adjust_p && gdbarch->call_dummy_stack_adjust == 0:0x%08lx::CALL_DUMMY_STACK_ADJUST_P
231f:2:FIX_CALL_DUMMY:void:fix_call_dummy:char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs, struct value **args, struct type *type, int gcc_p:dummy, pc, fun, nargs, args, type, gcc_p::0:0
232#
233v:2:BELIEVE_PCC_PROMOTION:int:believe_pcc_promotion::::0:::::#
234v:2:BELIEVE_PCC_PROMOTION_TYPE:int:believe_pcc_promotion_type::::0:::::#
c0e8c252 235f:2:COERCE_FLOAT_TO_DOUBLE:int:coerce_float_to_double:struct type *formal, struct type *actual:formal, actual:::default_coerce_float_to_double:0
104c1213
JM
236f:1:GET_SAVED_REGISTER:void:get_saved_register:char *raw_buffer, int *optimized, CORE_ADDR *addrp, struct frame_info *frame, int regnum, enum lval_type *lval:raw_buffer, optimized, addrp, frame, regnum, lval::generic_get_saved_register:0
237#
c0e8c252
AC
238f:1:REGISTER_CONVERTIBLE:int:register_convertible:int nr:nr:::generic_register_convertible_not:0
239f:2:REGISTER_CONVERT_TO_VIRTUAL:void:register_convert_to_virtual:int regnum, struct type *type, char *from, char *to:regnum, type, from, to:::0:0
240f:2:REGISTER_CONVERT_TO_RAW:void:register_convert_to_raw:struct type *type, int regnum, char *from, char *to:type, regnum, from, to:::0:0
104c1213 241#
4478b372
JB
242f:2:POINTER_TO_ADDRESS:CORE_ADDR:pointer_to_address:struct type *type, char *buf:type, buf:::generic_pointer_to_address:0
243f:2:ADDRESS_TO_POINTER:void:address_to_pointer:struct type *type, char *buf, CORE_ADDR addr:type, buf, addr:::generic_address_to_pointer:0
244#
104c1213
JM
245f:2:EXTRACT_RETURN_VALUE:void:extract_return_value:struct type *type, char *regbuf, char *valbuf:type, regbuf, valbuf::0:0
246f:1:PUSH_ARGUMENTS:CORE_ADDR:push_arguments:int nargs, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr:nargs, args, sp, struct_return, struct_addr::0:0
c0e8c252
AC
247f:2:PUSH_DUMMY_FRAME:void:push_dummy_frame:void:-:::0
248f:1:PUSH_RETURN_ADDRESS:CORE_ADDR:push_return_address:CORE_ADDR pc, CORE_ADDR sp:pc, sp:::0
249f:2:POP_FRAME:void:pop_frame:void:-:::0
104c1213
JM
250#
251# I wish that these would just go away....
c0e8c252
AC
252f:2:D10V_MAKE_DADDR:CORE_ADDR:d10v_make_daddr:CORE_ADDR x:x:::0:0
253f:2:D10V_MAKE_IADDR:CORE_ADDR:d10v_make_iaddr:CORE_ADDR x:x:::0:0
254f:2:D10V_DADDR_P:int:d10v_daddr_p:CORE_ADDR x:x:::0
255f:2:D10V_IADDR_P:int:d10v_iaddr_p:CORE_ADDR x:x:::0
256f:2:D10V_CONVERT_DADDR_TO_RAW:CORE_ADDR:d10v_convert_daddr_to_raw:CORE_ADDR x:x:::0
257f:2:D10V_CONVERT_IADDR_TO_RAW:CORE_ADDR:d10v_convert_iaddr_to_raw:CORE_ADDR x:x:::0
104c1213 258#
c0e8c252
AC
259f:2:STORE_STRUCT_RETURN:void:store_struct_return:CORE_ADDR addr, CORE_ADDR sp:addr, sp:::0
260f:2:STORE_RETURN_VALUE:void:store_return_value:struct type *type, char *valbuf:type, valbuf:::0
261f:2:EXTRACT_STRUCT_VALUE_ADDRESS:CORE_ADDR:extract_struct_value_address:char *regbuf:regbuf:::0
262f:2:USE_STRUCT_CONVENTION:int:use_struct_convention:int gcc_p, struct type *value_type:gcc_p, value_type:::0
104c1213
JM
263#
264f:2:FRAME_INIT_SAVED_REGS:void:frame_init_saved_regs:struct frame_info *frame:frame::0:0
c0e8c252 265f:2:INIT_EXTRA_FRAME_INFO:void:init_extra_frame_info:int fromleaf, struct frame_info *frame:fromleaf, frame:::0
104c1213
JM
266#
267f:2:SKIP_PROLOGUE:CORE_ADDR:skip_prologue:CORE_ADDR ip:ip::0:0
268f:2:INNER_THAN:int:inner_than:CORE_ADDR lhs, CORE_ADDR rhs:lhs, rhs::0:0
c0e8c252 269f:2:BREAKPOINT_FROM_PC:unsigned char *:breakpoint_from_pc:CORE_ADDR *pcptr, int *lenptr:pcptr, lenptr:::legacy_breakpoint_from_pc:0
917317f4
JM
270f:2:MEMORY_INSERT_BREAKPOINT:int:memory_insert_breakpoint:CORE_ADDR addr, char *contents_cache:addr, contents_cache::0:default_memory_insert_breakpoint:0
271f:2:MEMORY_REMOVE_BREAKPOINT:int:memory_remove_breakpoint:CORE_ADDR addr, char *contents_cache:addr, contents_cache::0:default_memory_remove_breakpoint:0
104c1213
JM
272v:2:DECR_PC_AFTER_BREAK:CORE_ADDR:decr_pc_after_break::::0:-1
273v:2:FUNCTION_START_OFFSET:CORE_ADDR:function_start_offset::::0:-1
274#
c0e8c252 275f:2:REMOTE_TRANSLATE_XFER_ADDRESS:void:remote_translate_xfer_address:CORE_ADDR gdb_addr, int gdb_len, CORE_ADDR *rem_addr, int *rem_len:gdb_addr, gdb_len, rem_addr, rem_len:::generic_remote_translate_xfer_address:0
104c1213
JM
276#
277v:2:FRAME_ARGS_SKIP:CORE_ADDR:frame_args_skip::::0:-1
c0e8c252 278f:2:FRAMELESS_FUNCTION_INVOCATION:int:frameless_function_invocation:struct frame_info *fi:fi:::generic_frameless_function_invocation_not:0
104c1213
JM
279f:2:FRAME_CHAIN:CORE_ADDR:frame_chain:struct frame_info *frame:frame::0:0
280f:1:FRAME_CHAIN_VALID:int:frame_chain_valid:CORE_ADDR chain, struct frame_info *thisframe:chain, thisframe::0:0
281f:2:FRAME_SAVED_PC:CORE_ADDR:frame_saved_pc:struct frame_info *fi:fi::0:0
282f:2:FRAME_ARGS_ADDRESS:CORE_ADDR:frame_args_address:struct frame_info *fi:fi::0:0
283f:2:FRAME_LOCALS_ADDRESS:CORE_ADDR:frame_locals_address:struct frame_info *fi:fi::0:0
284f:2:SAVED_PC_AFTER_CALL:CORE_ADDR:saved_pc_after_call:struct frame_info *frame:frame::0:0
285f:2:FRAME_NUM_ARGS:int:frame_num_args:struct frame_info *frame:frame::0:0
286#
287EOF
288 grep -v '^#'
289}
290
291
292# dump it out
293if true
294then
295 exec > new-gdbarch
c0e8c252 296 function_list | while do_read # eval read $read
104c1213
JM
297 do
298 cat <<EOF
299${class} ${macro}(${actual})
300 ${returntype} ${function} ($formal)${attrib}
301 level=${level}
c0e8c252 302 startup=${startup}
104c1213 303 default=${default}
c4093a6a 304 invalid_p=${invalid_p}
104c1213
JM
305 fmt=${fmt}
306 print=${print}
307 print_p=${print_p}
308 description=${description}
309EOF
310 done
311 exec 1>&2
312fi
313
314copyright ()
315{
316cat <<EOF
59233f88
AC
317/* *INDENT-OFF* */ /* THIS FILE IS GENERATED */
318
104c1213
JM
319/* Dynamic architecture support for GDB, the GNU debugger.
320 Copyright 1998-1999, Free Software Foundation, Inc.
321
322 This file is part of GDB.
323
324 This program is free software; you can redistribute it and/or modify
325 it under the terms of the GNU General Public License as published by
326 the Free Software Foundation; either version 2 of the License, or
327 (at your option) any later version.
328
329 This program is distributed in the hope that it will be useful,
330 but WITHOUT ANY WARRANTY; without even the implied warranty of
331 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
332 GNU General Public License for more details.
333
334 You should have received a copy of the GNU General Public License
335 along with this program; if not, write to the Free Software
336 Foundation, Inc., 59 Temple Place - Suite 330,
337 Boston, MA 02111-1307, USA. */
338
104c1213
JM
339/* This file was created with the aid of \`\`gdbarch.sh''.
340
341 The bourn shell script \`\`gdbarch.sh'' creates the files
342 \`\`new-gdbarch.c'' and \`\`new-gdbarch.h and then compares them
343 against the existing \`\`gdbarch.[hc]''. Any differences found
344 being reported.
345
346 If editing this file, please also run gdbarch.sh and merge any
347 changes into that script. Conversely, when makeing sweeping changes
348 to this file, modifying gdbarch.sh and using its output may prove
349 easier. */
350
351EOF
352}
353
354#
355# The .h file
356#
357
358exec > new-gdbarch.h
359copyright
360cat <<EOF
361#ifndef GDBARCH_H
362#define GDBARCH_H
363
364struct frame_info;
365struct value;
366
367
368#ifndef GDB_MULTI_ARCH
369#define GDB_MULTI_ARCH 0
370#endif
371
372extern struct gdbarch *current_gdbarch;
373
374
375/* See gdb/doc/gdbint.texi for a discussion of the GDB_MULTI_ARCH
376 macro */
377
378
379/* If any of the following are defined, the target wasn't correctly
380 converted. */
381
382#if GDB_MULTI_ARCH
383#if defined (CALL_DUMMY)
384#error "CALL_DUMMY: replaced by CALL_DUMMY_WORDS/SIZEOF_CALL_DUMMY_WORDS"
385#endif
386#endif
387
388#if GDB_MULTI_ARCH
389#if defined (REGISTER_NAMES)
390#error "REGISTER_NAMES: replaced by REGISTER_NAME"
391#endif
392#endif
393
394#if GDB_MULTI_ARCH
395#if defined (EXTRA_FRAME_INFO)
396#error "EXTRA_FRAME_INFO: replaced by struct frame_extra_info"
397#endif
398#endif
399
400#if GDB_MULTI_ARCH
401#if defined (FRAME_FIND_SAVED_REGS)
402#error "FRAME_FIND_SAVED_REGS: replaced by FRAME_INIT_SAVED_REGS"
403#endif
404#endif
405EOF
406
407# function typedef's
408echo ""
409echo ""
410echo "/* The following are pre-initialized by GDBARCH. */"
c0e8c252 411function_list | while do_read # eval read $read
104c1213
JM
412do
413 case "${class}" in
414 "i" )
415 echo ""
416 echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);"
417 echo "/* set_gdbarch_${function}() - not applicable - pre-initialized. */"
418 echo "#if GDB_MULTI_ARCH"
419 echo "#if (GDB_MULTI_ARCH > 1) || !defined (${macro})"
420 echo "#define ${macro} (gdbarch_${function} (current_gdbarch))"
421 echo "#endif"
422 echo "#endif"
423 ;;
424 esac
425done
426
427# function typedef's
428echo ""
429echo ""
430echo "/* The following are initialized by the target dependant code. */"
c0e8c252 431function_list | while do_read # eval read $read
104c1213
JM
432do
433 case "${class}" in
434 "v" )
435 echo ""
436 echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);"
437 echo "extern void set_gdbarch_${function} (struct gdbarch *gdbarch, ${returntype} ${function});"
438 echo "#if GDB_MULTI_ARCH"
439 echo "#if (GDB_MULTI_ARCH > 1) || !defined (${macro})"
440 echo "#define ${macro} (gdbarch_${function} (current_gdbarch))"
441 echo "#endif"
442 echo "#endif"
443 ;;
444 "f" )
445 echo ""
446 echo "typedef ${returntype} (gdbarch_${function}_ftype) (${formal});"
447 if [ "${formal}" = "void" ]
448 then
449 echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);"
450 else
451 echo "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch, ${formal});"
452 fi
453 echo "extern void set_gdbarch_${function} (struct gdbarch *gdbarch, gdbarch_${function}_ftype *${function});"
c0e8c252
AC
454 if ! default_is_fallback_p
455 then
456 echo "#if GDB_MULTI_ARCH"
457 fi
104c1213
JM
458 echo "#if (GDB_MULTI_ARCH > 1) || !defined (${macro})"
459 if [ "${actual}" = "" ]
460 then
461 echo "#define ${macro}() (gdbarch_${function} (current_gdbarch))"
462 elif [ "${actual}" = "-" ]
463 then
464 echo "#define ${macro} (gdbarch_${function} (current_gdbarch))"
465 else
466 echo "#define ${macro}(${actual}) (gdbarch_${function} (current_gdbarch, ${actual}))"
467 fi
468 echo "#endif"
c0e8c252
AC
469 if ! default_is_fallback_p
470 then
471 echo "#endif"
472 fi
104c1213
JM
473 ;;
474 esac
475done
476
477# close it off
478cat <<EOF
479
480extern struct gdbarch_tdep *gdbarch_tdep (struct gdbarch *gdbarch);
481
482
483/* Mechanism for co-ordinating the selection of a specific
484 architecture.
485
486 GDB targets (*-tdep.c) can register an interest in a specific
487 architecture. Other GDB components can register a need to maintain
488 per-architecture data.
489
490 The mechanisms below ensures that there is only a loose connection
491 between the set-architecture command and the various GDB
492 components. Each component can independantly register their need
493 to maintain architecture specific data with gdbarch.
494
495 Pragmatics:
496
497 Previously, a single TARGET_ARCHITECTURE_HOOK was provided. It
498 didn't scale.
499
500 The more traditional mega-struct containing architecture specific
501 data for all the various GDB components was also considered. Since
502 GDB is built from a variable number of (fairly independant)
503 components it was determined that the global aproach was not
504 applicable. */
505
506
507/* Register a new architectural family with GDB.
508
509 Register support for the specified ARCHITECTURE with GDB. When
510 gdbarch determines that the specified architecture has been
511 selected, the corresponding INIT function is called.
512
513 --
514
515 The INIT function takes two parameters: INFO which contains the
516 information available to gdbarch about the (possibly new)
517 architecture; ARCHES which is a list of the previously created
518 \`\`struct gdbarch'' for this architecture.
519
520 The INIT function parameter INFO shall, as far as possible, be
521 pre-initialized with information obtained from INFO.ABFD or
522 previously selected architecture (if similar). INIT shall ensure
523 that the INFO.BYTE_ORDER is non-zero.
524
525 The INIT function shall return any of: NULL - indicating that it
526 doesn't reconize the selected architecture; an existing \`\`struct
527 gdbarch'' from the ARCHES list - indicating that the new
528 architecture is just a synonym for an earlier architecture (see
529 gdbarch_list_lookup_by_info()); a newly created \`\`struct gdbarch''
530 - that describes the selected architecture (see
531 gdbarch_alloc()). */
532
533struct gdbarch_list
534{
535 struct gdbarch *gdbarch;
536 struct gdbarch_list *next;
537};
538
539struct gdbarch_info
540{
541 /* Use default: bfd_arch_unknown (ZERO). */
542 enum bfd_architecture bfd_architecture;
543
544 /* Use default: NULL (ZERO). */
545 const struct bfd_arch_info *bfd_arch_info;
546
547 /* Use default: 0 (ZERO). */
548 int byte_order;
549
550 /* Use default: NULL (ZERO). */
551 bfd *abfd;
552
553 /* Use default: NULL (ZERO). */
554 struct gdbarch_tdep_info *tdep_info;
555};
556
557typedef struct gdbarch *(gdbarch_init_ftype) (struct gdbarch_info info, struct gdbarch_list *arches);
558
559extern void register_gdbarch_init (enum bfd_architecture architecture, gdbarch_init_ftype *);
560
561
562/* Helper function. Search the list of ARCHES for a GDBARCH that
563 matches the information provided by INFO. */
564
565extern struct gdbarch_list *gdbarch_list_lookup_by_info (struct gdbarch_list *arches, const struct gdbarch_info *info);
566
567
568/* Helper function. Create a preliminary \`\`struct gdbarch''. Perform
569 basic initialization using values obtained from the INFO andTDEP
570 parameters. set_gdbarch_*() functions are called to complete the
571 initialization of the object. */
572
573extern struct gdbarch *gdbarch_alloc (const struct gdbarch_info *info, struct gdbarch_tdep *tdep);
574
575
058f20d5
JB
576/* Helper function. Free a partially-constructed \`\`struct gdbarch''. */
577extern void gdbarch_free (struct gdbarch *);
578
579
104c1213
JM
580/* Helper function. Force an update of the current architecture. Used
581 by legacy targets that have added their own target specific
582 architecture manipulation commands.
583
584 The INFO parameter shall be fully initialized (\`\`memset (&INFO,
585 sizeof (info), 0)'' set relevant fields) before gdbarch_update() is
586 called. gdbarch_update() shall initialize any \`\`default'' fields
587 using information obtained from the previous architecture or
588 INFO.ABFD (if specified) before calling the corresponding
589 architectures INIT function. */
590
591extern int gdbarch_update (struct gdbarch_info info);
592
593
594
595/* Register per-architecture data-pointer.
596
597 Reserve space for a per-architecture data-pointer. An identifier
598 for the reserved data-pointer is returned. That identifer should
599 be saved in a local static.
600
601 When a new architecture is selected, INIT() is called. When a
602 previous architecture is re-selected, the per-architecture
603 data-pointer for that previous architecture is restored (INIT() is
604 not called).
605
606 INIT() shall return the initial value for the per-architecture
607 data-pointer for the current architecture.
608
609 Multiple registrarants for any architecture are allowed (and
610 strongly encouraged). */
611
612typedef void *(gdbarch_data_ftype) (void);
613extern struct gdbarch_data *register_gdbarch_data (gdbarch_data_ftype *init);
614
615/* Return the value of the per-architecture data-pointer for the
616 current architecture. */
617
618extern void *gdbarch_data (struct gdbarch_data*);
619
620
621
622/* Register per-architecture memory region.
623
624 Provide a memory-region swap mechanism. Per-architecture memory
625 region are created. These memory regions are swapped whenever the
626 architecture is changed. For a new architecture, the memory region
627 is initialized with zero (0) and the INIT function is called.
628
629 Memory regions are swapped / initialized in the order that they are
630 registered. NULL DATA and/or INIT values can be specified.
631
632 New code should use register_gdbarch_data(). */
633
634typedef void (gdbarch_swap_ftype) (void);
635extern void register_gdbarch_swap (void *data, unsigned long size, gdbarch_swap_ftype *init);
e514a9d6 636#define REGISTER_GDBARCH_SWAP(VAR) register_gdbarch_swap (&(VAR), sizeof ((VAR)), NULL)
104c1213
JM
637
638
639
640/* The target-system-dependant byte order is dynamic */
641
642/* TARGET_BYTE_ORDER_SELECTABLE_P determines if the target endianness
643 is selectable at runtime. The user can use the \`\`set endian''
644 command to change it. TARGET_BYTE_ORDER_AUTO is nonzero when
645 target_byte_order should be auto-detected (from the program image
646 say). */
647
648#if GDB_MULTI_ARCH
649/* Multi-arch GDB is always bi-endian. */
650#define TARGET_BYTE_ORDER_SELECTABLE_P 1
651#endif
652
653#ifndef TARGET_BYTE_ORDER_SELECTABLE_P
654/* compat - Catch old targets that define TARGET_BYTE_ORDER_SLECTABLE
655 when they should have defined TARGET_BYTE_ORDER_SELECTABLE_P 1 */
656#ifdef TARGET_BYTE_ORDER_SELECTABLE
657#define TARGET_BYTE_ORDER_SELECTABLE_P 1
658#else
659#define TARGET_BYTE_ORDER_SELECTABLE_P 0
660#endif
661#endif
662
663extern int target_byte_order;
664#ifdef TARGET_BYTE_ORDER_SELECTABLE
665/* compat - Catch old targets that define TARGET_BYTE_ORDER_SELECTABLE
666 and expect defs.h to re-define TARGET_BYTE_ORDER. */
667#undef TARGET_BYTE_ORDER
668#endif
669#ifndef TARGET_BYTE_ORDER
670#define TARGET_BYTE_ORDER (target_byte_order + 0)
671#endif
672
673extern int target_byte_order_auto;
674#ifndef TARGET_BYTE_ORDER_AUTO
675#define TARGET_BYTE_ORDER_AUTO (target_byte_order_auto + 0)
676#endif
677
678
679
680/* The target-system-dependant BFD architecture is dynamic */
681
682extern int target_architecture_auto;
683#ifndef TARGET_ARCHITECTURE_AUTO
684#define TARGET_ARCHITECTURE_AUTO (target_architecture_auto + 0)
685#endif
686
687extern const struct bfd_arch_info *target_architecture;
688#ifndef TARGET_ARCHITECTURE
689#define TARGET_ARCHITECTURE (target_architecture + 0)
690#endif
691
692/* Notify the target dependant backend of a change to the selected
693 architecture. A zero return status indicates that the target did
694 not like the change. */
695
696extern int (*target_architecture_hook) (const struct bfd_arch_info *);
697
698
699
700/* The target-system-dependant disassembler is semi-dynamic */
701
702#include "dis-asm.h" /* Get defs for disassemble_info */
703
704extern int dis_asm_read_memory (bfd_vma memaddr, bfd_byte *myaddr,
ff844c8d 705 unsigned int len, disassemble_info *info);
104c1213
JM
706
707extern void dis_asm_memory_error (int status, bfd_vma memaddr,
708 disassemble_info *info);
709
710extern void dis_asm_print_address (bfd_vma addr,
711 disassemble_info *info);
712
713extern int (*tm_print_insn) (bfd_vma, disassemble_info*);
714extern disassemble_info tm_print_insn_info;
715#ifndef TARGET_PRINT_INSN
716#define TARGET_PRINT_INSN(vma, info) (*tm_print_insn) (vma, info)
717#endif
718#ifndef TARGET_PRINT_INSN_INFO
719#define TARGET_PRINT_INSN_INFO (&tm_print_insn_info)
720#endif
721
722
723
724/* Explicit test for D10V architecture.
725 USE of these macro's is *STRONGLY* discouraged. */
726
727#define GDB_TARGET_IS_D10V (TARGET_ARCHITECTURE->arch == bfd_arch_d10v)
728#ifndef D10V_MAKE_DADDR
729#define D10V_MAKE_DADDR(X) (internal_error ("gdbarch: D10V_MAKE_DADDR"), 0)
730#endif
731#ifndef D10V_MAKE_IADDR
732#define D10V_MAKE_IADDR(X) (internal_error ("gdbarch: D10V_MAKE_IADDR"), 0)
733#endif
734
735
736/* Fallback definition of FRAMELESS_FUNCTION_INVOCATION */
737#ifndef FRAMELESS_FUNCTION_INVOCATION
738#define FRAMELESS_FUNCTION_INVOCATION(FI) (0)
739#endif
740
741
742/* Fallback definition of REGISTER_CONVERTIBLE etc */
743extern int generic_register_convertible_not (int reg_nr);
744#ifndef REGISTER_CONVERTIBLE
745#define REGISTER_CONVERTIBLE(x) (0)
746#endif
747#ifndef REGISTER_CONVERT_TO_VIRTUAL
748#define REGISTER_CONVERT_TO_VIRTUAL(x, y, z, a)
749#endif
750#ifndef REGISTER_CONVERT_TO_RAW
751#define REGISTER_CONVERT_TO_RAW(x, y, z, a)
752#endif
753
754
755/* Fallback definition for EXTRACT_STRUCT_VALUE_ADDRESS */
756#ifndef EXTRACT_STRUCT_VALUE_ADDRESS
757#define EXTRACT_STRUCT_VALUE_ADDRESS_P (0)
758#define EXTRACT_STRUCT_VALUE_ADDRESS(X) (internal_error ("gdbarch: EXTRACT_STRUCT_VALUE_ADDRESS"), 0)
759#else
760#ifndef EXTRACT_STRUCT_VALUE_ADDRESS_P
761#define EXTRACT_STRUCT_VALUE_ADDRESS_P (1)
762#endif
763#endif
764
765
766/* Fallback definition for REGISTER_NAME for systems still defining
767 REGISTER_NAMES. */
768#ifndef REGISTER_NAME
769extern char *gdb_register_names[];
770#define REGISTER_NAME(i) gdb_register_names[i]
771#endif
772
773
774/* Set the dynamic target-system-dependant parameters (architecture,
775 byte-order, ...) using information found in the BFD */
776
777extern void set_gdbarch_from_file (bfd *);
778
779
780/* Explicitly set the dynamic target-system-dependant parameters based
781 on bfd_architecture and machine. */
782
783extern void set_architecture_from_arch_mach (enum bfd_architecture, unsigned long);
784
785
e514a9d6
JM
786/* Initialize the current architecture to the "first" one we find on
787 our list. */
788
789extern void initialize_current_architecture (void);
790
104c1213
JM
791/* Helper function for targets that don't know how my arguments are
792 being passed */
793
794extern int frame_num_args_unknown (struct frame_info *fi);
795
796
797/* gdbarch trace variable */
798extern int gdbarch_debug;
799
800extern void gdbarch_dump (void);
801
802#endif
803EOF
804exec 1>&2
805#../move-if-change new-gdbarch.h gdbarch.h
59233f88 806compare_new gdbarch.h
104c1213
JM
807
808
809#
810# C file
811#
812
813exec > new-gdbarch.c
814copyright
815cat <<EOF
816
817#include "defs.h"
c0e8c252 818#include "gdbarch-utils.h"
104c1213
JM
819
820#if GDB_MULTI_ARCH
821#include "gdbcmd.h"
822#include "inferior.h" /* enum CALL_DUMMY_LOCATION et.al. */
823#else
824/* Just include everything in sight so that the every old definition
825 of macro is visible. */
826#include "gdb_string.h"
827#include <ctype.h>
828#include "symtab.h"
829#include "frame.h"
830#include "inferior.h"
831#include "breakpoint.h"
0596389c 832#include "gdb_wait.h"
104c1213
JM
833#include "gdbcore.h"
834#include "gdbcmd.h"
835#include "target.h"
836#include "gdbthread.h"
837#include "annotate.h"
838#include "symfile.h" /* for overlay functions */
839#endif
840#include "symcat.h"
841
842
843/* Static function declarations */
844
845static void verify_gdbarch (struct gdbarch *gdbarch);
846static void init_gdbarch_data (struct gdbarch *);
847static void init_gdbarch_swap (struct gdbarch *);
848static void swapout_gdbarch_swap (struct gdbarch *);
849static void swapin_gdbarch_swap (struct gdbarch *);
850
851/* Convenience macro for allocting typesafe memory. */
852
853#ifndef XMALLOC
854#define XMALLOC(TYPE) (TYPE*) xmalloc (sizeof (TYPE))
855#endif
856
857
858/* Non-zero if we want to trace architecture code. */
859
860#ifndef GDBARCH_DEBUG
861#define GDBARCH_DEBUG 0
862#endif
863int gdbarch_debug = GDBARCH_DEBUG;
864
865EOF
866
867# gdbarch open the gdbarch object
868echo ""
869echo "/* Maintain the struct gdbarch object */"
870echo ""
871echo "struct gdbarch"
872echo "{"
873echo " /* basic architectural information */"
c0e8c252 874function_list | while do_read # eval read $read
104c1213
JM
875do
876 case "${class}" in
877 "i" ) echo " ${returntype} ${function};" ;;
878 esac
879done
880echo ""
881echo " /* target specific vector. */"
882echo " struct gdbarch_tdep *tdep;"
883echo ""
884echo " /* per-architecture data-pointers */"
885echo " int nr_data;"
886echo " void **data;"
887echo ""
888echo " /* per-architecture swap-regions */"
889echo " struct gdbarch_swap *swap;"
890echo ""
891cat <<EOF
892 /* Multi-arch values.
893
894 When extending this structure you must:
895
896 Add the field below.
897
898 Declare set/get functions and define the corresponding
899 macro in gdbarch.h.
900
901 gdbarch_alloc(): If zero/NULL is not a suitable default,
902 initialize the new field.
903
904 verify_gdbarch(): Confirm that the target updated the field
905 correctly.
906
907 gdbarch_dump(): Add a fprintf_unfiltered call to so that the new
908 field is dumped out
909
c0e8c252 910 \`\`startup_gdbarch()'': Append an initial value to the static
104c1213
JM
911 variable (base values on the host's c-type system).
912
913 get_gdbarch(): Implement the set/get functions (probably using
914 the macro's as shortcuts).
915
916 */
917
918EOF
c0e8c252 919function_list | while do_read # eval read $read
104c1213
JM
920do
921 case "${class}" in
922 "v" ) echo " ${returntype} ${function};" ;;
923 "f" ) echo " gdbarch_${function}_ftype *${function}${attrib};" ;;
924 esac
925done
926echo "};"
927
928# A pre-initialized vector
929echo ""
930echo ""
931cat <<EOF
932/* The default architecture uses host values (for want of a better
933 choice). */
934EOF
935echo ""
936echo "extern const struct bfd_arch_info bfd_default_arch_struct;"
937echo ""
c0e8c252 938echo "struct gdbarch startup_gdbarch = {"
104c1213 939echo " /* basic architecture information */"
c0e8c252 940function_list | while do_read # eval read $read
104c1213
JM
941do
942 case "${class}" in
63ddd37d 943 "i" )
c0e8c252 944 echo " ${startup},"
63ddd37d 945 ;;
104c1213
JM
946 esac
947done
948cat <<EOF
949 /* target specific vector */
950 NULL,
951 /*per-architecture data-pointers and swap regions */
952 0, NULL, NULL,
953 /* Multi-arch values */
954EOF
c0e8c252 955function_list | while do_read # eval read $read
104c1213
JM
956do
957 case "${class}" in
63ddd37d 958 "f" | "v" )
c0e8c252 959 echo " ${startup},"
63ddd37d 960 ;;
104c1213
JM
961 esac
962done
963cat <<EOF
c0e8c252 964 /* startup_gdbarch() */
104c1213 965};
c0e8c252 966struct gdbarch *current_gdbarch = &startup_gdbarch;
104c1213
JM
967EOF
968
969# Create a new gdbarch struct
970echo ""
971echo ""
972cat <<EOF
973/* Create a new \`\`struct gdbarch'' based in information provided by
974 \`\`struct gdbarch_info''. */
975EOF
976echo ""
977cat <<EOF
978struct gdbarch *
979gdbarch_alloc (const struct gdbarch_info *info,
980 struct gdbarch_tdep *tdep)
981{
982 struct gdbarch *gdbarch = XMALLOC (struct gdbarch);
983 memset (gdbarch, 0, sizeof (*gdbarch));
984
985 gdbarch->tdep = tdep;
986EOF
987echo ""
c0e8c252 988function_list | while do_read # eval read $read
104c1213
JM
989do
990 case "${class}" in
991 "i" ) echo " gdbarch->${function} = info->${function};"
992 esac
993done
994echo ""
995echo " /* Force the explicit initialization of these. */"
c0e8c252 996function_list | while do_read # eval read $read
104c1213
JM
997do
998 case "${class}" in
999 "f" | "v" )
c0e8c252 1000 if [ "${default}" != "" -a "${default}" != "0" ]
104c1213 1001 then
c0e8c252 1002 echo " gdbarch->${function} = ${default};"
104c1213
JM
1003 fi
1004 ;;
1005 esac
1006done
1007cat <<EOF
1008 /* gdbarch_alloc() */
1009
1010 return gdbarch;
1011}
1012EOF
1013
058f20d5
JB
1014# Free a gdbarch struct.
1015echo ""
1016echo ""
1017cat <<EOF
1018/* Free a gdbarch struct. This should never happen in normal
1019 operation --- once you've created a gdbarch, you keep it around.
1020 However, if an architecture's init function encounters an error
1021 building the structure, it may need to clean up a partially
1022 constructed gdbarch. */
1023void
1024gdbarch_free (struct gdbarch *arch)
1025{
1026 /* At the moment, this is trivial. */
1027 free (arch);
1028}
1029EOF
1030
104c1213
JM
1031# verify a new architecture
1032echo ""
1033echo ""
1034echo "/* Ensure that all values in a GDBARCH are reasonable. */"
1035echo ""
1036cat <<EOF
1037static void
1038verify_gdbarch (struct gdbarch *gdbarch)
1039{
1040 /* Only perform sanity checks on a multi-arch target. */
1041 if (GDB_MULTI_ARCH <= 0)
1042 return;
1043 /* fundamental */
1044 if (gdbarch->byte_order == 0)
1045 internal_error ("verify_gdbarch: byte-order unset");
1046 if (gdbarch->bfd_arch_info == NULL)
1047 internal_error ("verify_gdbarch: bfd_arch_info unset");
1048 /* Check those that need to be defined for the given multi-arch level. */
1049EOF
c0e8c252 1050function_list | while do_read # eval read $read
104c1213
JM
1051do
1052 case "${class}" in
1053 "f" | "v" )
c0e8c252
AC
1054 if [ "${invalid_p}" = "0" ]
1055 then
1056 echo " /* Skip verify of ${function}, invalid_p == 0 */"
1057 elif [ "${invalid_p}" ]
104c1213 1058 then
c0e8c252
AC
1059 echo " if ((GDB_MULTI_ARCH >= ${level})"
1060 echo " && (${invalid_p}))"
1061 echo " internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");"
1062 elif [ "${default}" ]
104c1213 1063 then
c0e8c252
AC
1064 echo " if ((GDB_MULTI_ARCH >= ${level})"
1065 echo " && (gdbarch->${function} == ${default}))"
1066 echo " internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");"
104c1213
JM
1067 fi
1068 ;;
1069 esac
1070done
1071cat <<EOF
1072}
1073EOF
1074
1075# dump the structure
1076echo ""
1077echo ""
1078echo "/* Print out the details of the current architecture. */"
1079echo ""
1080cat <<EOF
1081void
1082gdbarch_dump (void)
1083{
1084EOF
c0e8c252 1085function_list | while do_read # eval read $read
104c1213
JM
1086do
1087 case "${class}" in
1088 "f" )
1089 echo " fprintf_unfiltered (gdb_stdlog,"
1090 echo " \"gdbarch_update: ${macro} = 0x%08lx\\n\","
1091 echo " (long) current_gdbarch->${function}"
1092 echo " /*${macro} ()*/);"
1093 ;;
1094 * )
104c1213
JM
1095 if [ "${print_p}" = "#" ]
1096 then
1097 echo "#ifdef ${macro}"
1098 echo " fprintf_unfiltered (gdb_stdlog,"
1099 echo " \"gdbarch_update: ${macro} = ${fmt}\\n\","
1100 echo " ${print});"
1101 echo "#endif"
1102 elif [ "${print_p}" ]
1103 then
1104 echo " if (${print_p})"
1105 echo " fprintf_unfiltered (gdb_stdlog,"
1106 echo " \"gdbarch_update: ${macro} = ${fmt}\\n\","
1107 echo " ${print});"
1108 else
1109 echo " fprintf_unfiltered (gdb_stdlog,"
1110 echo " \"gdbarch_update: ${macro} = ${fmt}\\n\","
1111 echo " ${print});"
1112 fi
1113 ;;
1114 esac
1115done
1116echo "}"
1117
1118
1119# GET/SET
1120echo ""
1121cat <<EOF
1122struct gdbarch_tdep *
1123gdbarch_tdep (struct gdbarch *gdbarch)
1124{
1125 if (gdbarch_debug >= 2)
104c1213
JM
1126 fprintf_unfiltered (gdb_stdlog, "gdbarch_tdep called\n");
1127 return gdbarch->tdep;
1128}
1129EOF
1130echo ""
c0e8c252 1131function_list | while do_read # eval read $read
104c1213
JM
1132do
1133 case "${class}" in
1134 "f" )
1135 echo ""
1136 echo "${returntype}"
1137 if [ "${formal}" = "void" ]
1138 then
1139 echo "gdbarch_${function} (struct gdbarch *gdbarch)"
1140 else
1141 echo "gdbarch_${function} (struct gdbarch *gdbarch, ${formal})"
1142 fi
1143 echo "{"
c0e8c252
AC
1144 if default_is_fallback_p && [ "${default}" != "0" ]
1145 then
1146 echo " if (GDB_MULTI_ARCH == 0)"
1147 if [ "${returntype}" = "void" ]
1148 then
1149 echo " {"
1150 echo " ${default} (${actual});"
1151 echo " return;"
1152 echo " }"
1153 else
1154 echo " return ${default} (${actual});"
1155 fi
1156 fi
104c1213
JM
1157 echo " if (gdbarch->${function} == 0)"
1158 echo " internal_error (\"gdbarch: gdbarch_${function} invalid\");"
1159 echo " if (gdbarch_debug >= 2)"
104c1213
JM
1160 echo " fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\n\");"
1161 test "${actual}" = "-" && actual=""
1162 if [ "${returntype}" = "void" ]
1163 then
1164 echo " gdbarch->${function} (${actual});"
1165 else
1166 echo " return gdbarch->${function} (${actual});"
1167 fi
1168 echo "}"
1169 echo ""
1170 echo "void"
1171 echo "set_gdbarch_${function} (struct gdbarch *gdbarch,"
cff3e48b 1172 echo " `echo ${function} | sed -e 's/./ /g'` gdbarch_${function}_ftype ${function})"
104c1213
JM
1173 echo "{"
1174 echo " gdbarch->${function} = ${function};"
1175 echo "}"
1176 ;;
1177 "v" )
1178 echo ""
1179 echo "${returntype}"
1180 echo "gdbarch_${function} (struct gdbarch *gdbarch)"
1181 echo "{"
c0e8c252
AC
1182 if [ "${invalid_p}" = "0" ]
1183 then
1184 echo " /* Skip verify of ${function}, invalid_p == 0 */"
1185 elif [ "${invalid_p}" ]
104c1213 1186 then
c4093a6a 1187 echo " if (${invalid_p})"
104c1213 1188 echo " internal_error (\"gdbarch: gdbarch_${function} invalid\");"
c0e8c252 1189 elif [ "${default}" ]
104c1213 1190 then
c0e8c252 1191 echo " if (gdbarch->${function} == ${default})"
104c1213
JM
1192 echo " internal_error (\"gdbarch: gdbarch_${function} invalid\");"
1193 fi
1194 echo " if (gdbarch_debug >= 2)"
104c1213
JM
1195 echo " fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\n\");"
1196 echo " return gdbarch->${function};"
1197 echo "}"
1198 echo ""
1199 echo "void"
1200 echo "set_gdbarch_${function} (struct gdbarch *gdbarch,"
cff3e48b 1201 echo " `echo ${function} | sed -e 's/./ /g'` ${returntype} ${function})"
104c1213
JM
1202 echo "{"
1203 echo " gdbarch->${function} = ${function};"
1204 echo "}"
1205 ;;
1206 "i" )
1207 echo ""
1208 echo "${returntype}"
1209 echo "gdbarch_${function} (struct gdbarch *gdbarch)"
1210 echo "{"
1211 echo " if (gdbarch_debug >= 2)"
104c1213
JM
1212 echo " fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\n\");"
1213 echo " return gdbarch->${function};"
1214 echo "}"
1215 ;;
1216 esac
1217done
1218
1219# All the trailing guff
1220cat <<EOF
1221
1222
1223/* Keep a registrary of per-architecture data-pointers required by GDB
1224 modules. */
1225
1226struct gdbarch_data
1227{
1228 int index;
1229};
1230
1231struct gdbarch_data_registration
1232{
1233 gdbarch_data_ftype *init;
1234 struct gdbarch_data *data;
1235 struct gdbarch_data_registration *next;
1236};
1237
1238struct gdbarch_data_registrary
1239{
1240 int nr;
1241 struct gdbarch_data_registration *registrations;
1242};
1243
1244struct gdbarch_data_registrary gdbarch_data_registrary =
1245{
1246 0, NULL,
1247};
1248
1249struct gdbarch_data *
1250register_gdbarch_data (gdbarch_data_ftype *init)
1251{
1252 struct gdbarch_data_registration **curr;
1253 for (curr = &gdbarch_data_registrary.registrations;
1254 (*curr) != NULL;
1255 curr = &(*curr)->next);
1256 (*curr) = XMALLOC (struct gdbarch_data_registration);
1257 (*curr)->next = NULL;
1258 (*curr)->init = init;
1259 (*curr)->data = XMALLOC (struct gdbarch_data);
1260 (*curr)->data->index = gdbarch_data_registrary.nr++;
1261 return (*curr)->data;
1262}
1263
1264
1265/* Walk through all the registered users initializing each in turn. */
1266
1267static void
1268init_gdbarch_data (struct gdbarch *gdbarch)
1269{
1270 struct gdbarch_data_registration *rego;
1271 gdbarch->nr_data = gdbarch_data_registrary.nr + 1;
1272 gdbarch->data = xmalloc (sizeof (void*) * gdbarch->nr_data);
1273 for (rego = gdbarch_data_registrary.registrations;
1274 rego != NULL;
1275 rego = rego->next)
1276 {
1277 if (rego->data->index < gdbarch->nr_data)
1278 gdbarch->data[rego->data->index] = rego->init ();
1279 }
1280}
1281
1282
1283/* Return the current value of the specified per-architecture
1284 data-pointer. */
1285
1286void *
1287gdbarch_data (data)
1288 struct gdbarch_data *data;
1289{
1290 if (data->index >= current_gdbarch->nr_data)
1291 internal_error ("gdbarch_data: request for non-existant data.");
1292 return current_gdbarch->data[data->index];
1293}
1294
1295
1296
1297/* Keep a registrary of swaped data required by GDB modules. */
1298
1299struct gdbarch_swap
1300{
1301 void *swap;
1302 struct gdbarch_swap_registration *source;
1303 struct gdbarch_swap *next;
1304};
1305
1306struct gdbarch_swap_registration
1307{
1308 void *data;
1309 unsigned long sizeof_data;
1310 gdbarch_swap_ftype *init;
1311 struct gdbarch_swap_registration *next;
1312};
1313
1314struct gdbarch_swap_registrary
1315{
1316 int nr;
1317 struct gdbarch_swap_registration *registrations;
1318};
1319
1320struct gdbarch_swap_registrary gdbarch_swap_registrary =
1321{
1322 0, NULL,
1323};
1324
1325void
1326register_gdbarch_swap (void *data,
1327 unsigned long sizeof_data,
1328 gdbarch_swap_ftype *init)
1329{
1330 struct gdbarch_swap_registration **rego;
1331 for (rego = &gdbarch_swap_registrary.registrations;
1332 (*rego) != NULL;
1333 rego = &(*rego)->next);
1334 (*rego) = XMALLOC (struct gdbarch_swap_registration);
1335 (*rego)->next = NULL;
1336 (*rego)->init = init;
1337 (*rego)->data = data;
1338 (*rego)->sizeof_data = sizeof_data;
1339}
1340
1341
1342static void
1343init_gdbarch_swap (struct gdbarch *gdbarch)
1344{
1345 struct gdbarch_swap_registration *rego;
1346 struct gdbarch_swap **curr = &gdbarch->swap;
1347 for (rego = gdbarch_swap_registrary.registrations;
1348 rego != NULL;
1349 rego = rego->next)
1350 {
1351 if (rego->data != NULL)
1352 {
1353 (*curr) = XMALLOC (struct gdbarch_swap);
1354 (*curr)->source = rego;
1355 (*curr)->swap = xmalloc (rego->sizeof_data);
1356 (*curr)->next = NULL;
1357 memset (rego->data, 0, rego->sizeof_data);
1358 curr = &(*curr)->next;
1359 }
1360 if (rego->init != NULL)
1361 rego->init ();
1362 }
1363}
1364
1365static void
1366swapout_gdbarch_swap (struct gdbarch *gdbarch)
1367{
1368 struct gdbarch_swap *curr;
1369 for (curr = gdbarch->swap;
1370 curr != NULL;
1371 curr = curr->next)
1372 memcpy (curr->swap, curr->source->data, curr->source->sizeof_data);
1373}
1374
1375static void
1376swapin_gdbarch_swap (struct gdbarch *gdbarch)
1377{
1378 struct gdbarch_swap *curr;
1379 for (curr = gdbarch->swap;
1380 curr != NULL;
1381 curr = curr->next)
1382 memcpy (curr->source->data, curr->swap, curr->source->sizeof_data);
1383}
1384
1385
1386/* Keep a registrary of the architectures known by GDB. */
1387
1388struct gdbarch_init_registration
1389{
1390 enum bfd_architecture bfd_architecture;
1391 gdbarch_init_ftype *init;
1392 struct gdbarch_list *arches;
1393 struct gdbarch_init_registration *next;
1394};
1395
1396static struct gdbarch_init_registration *gdbarch_init_registrary = NULL;
1397
1398void
1399register_gdbarch_init (enum bfd_architecture bfd_architecture,
1400 gdbarch_init_ftype *init)
1401{
1402 struct gdbarch_init_registration **curr;
1403 const struct bfd_arch_info *bfd_arch_info;
1404 /* Check that BFD reconizes this architecture */
1405 bfd_arch_info = bfd_lookup_arch (bfd_architecture, 0);
1406 if (bfd_arch_info == NULL)
1407 {
1408 internal_error ("gdbarch: Attempt to register unknown architecture (%d)", bfd_architecture);
1409 }
1410 /* Check that we haven't seen this architecture before */
1411 for (curr = &gdbarch_init_registrary;
1412 (*curr) != NULL;
1413 curr = &(*curr)->next)
1414 {
1415 if (bfd_architecture == (*curr)->bfd_architecture)
1416 internal_error ("gdbarch: Duplicate registraration of architecture (%s)",
1417 bfd_arch_info->printable_name);
1418 }
1419 /* log it */
1420 if (gdbarch_debug)
1421 fprintf_unfiltered (gdb_stdlog, "register_gdbarch_init (%s, 0x%08lx)\n",
1422 bfd_arch_info->printable_name,
1423 (long) init);
1424 /* Append it */
1425 (*curr) = XMALLOC (struct gdbarch_init_registration);
1426 (*curr)->bfd_architecture = bfd_architecture;
1427 (*curr)->init = init;
1428 (*curr)->arches = NULL;
1429 (*curr)->next = NULL;
1430}
1431
1432
1433
1434/* Look for an architecture using gdbarch_info. Base search on only
1435 BFD_ARCH_INFO and BYTE_ORDER. */
1436
1437struct gdbarch_list *
1438gdbarch_list_lookup_by_info (struct gdbarch_list *arches,
1439 const struct gdbarch_info *info)
1440{
1441 for (; arches != NULL; arches = arches->next)
1442 {
1443 if (info->bfd_arch_info != arches->gdbarch->bfd_arch_info)
1444 continue;
1445 if (info->byte_order != arches->gdbarch->byte_order)
1446 continue;
1447 return arches;
1448 }
1449 return NULL;
1450}
1451
1452
1453/* Update the current architecture. Return ZERO if the update request
1454 failed. */
1455
1456int
1457gdbarch_update (struct gdbarch_info info)
1458{
1459 struct gdbarch *new_gdbarch;
1460 struct gdbarch_list **list;
1461 struct gdbarch_init_registration *rego;
1462
1463 /* Fill in any missing bits. Most important is the bfd_architecture
1464 which is used to select the target architecture. */
1465 if (info.bfd_architecture == bfd_arch_unknown)
1466 {
1467 if (info.bfd_arch_info != NULL)
1468 info.bfd_architecture = info.bfd_arch_info->arch;
1469 else if (info.abfd != NULL)
1470 info.bfd_architecture = bfd_get_arch (info.abfd);
1471 /* FIXME - should query BFD for its default architecture. */
1472 else
1473 info.bfd_architecture = current_gdbarch->bfd_arch_info->arch;
1474 }
1475 if (info.bfd_arch_info == NULL)
1476 {
1477 if (target_architecture_auto && info.abfd != NULL)
1478 info.bfd_arch_info = bfd_get_arch_info (info.abfd);
1479 else
1480 info.bfd_arch_info = current_gdbarch->bfd_arch_info;
1481 }
1482 if (info.byte_order == 0)
1483 {
1484 if (target_byte_order_auto && info.abfd != NULL)
1485 info.byte_order = (bfd_big_endian (info.abfd) ? BIG_ENDIAN
1486 : bfd_little_endian (info.abfd) ? LITTLE_ENDIAN
1487 : 0);
1488 else
1489 info.byte_order = current_gdbarch->byte_order;
1490 /* FIXME - should query BFD for its default byte-order. */
1491 }
1492 /* A default for abfd? */
1493
1494 /* Find the target that knows about this architecture. */
1495 for (rego = gdbarch_init_registrary;
1496 rego != NULL && rego->bfd_architecture != info.bfd_architecture;
1497 rego = rego->next);
1498 if (rego == NULL)
1499 {
1500 if (gdbarch_debug)
1501 fprintf_unfiltered (gdb_stdlog, "gdbarch_update: No matching architecture\n");
1502 return 0;
1503 }
1504
1505 if (gdbarch_debug)
1506 {
1507 fprintf_unfiltered (gdb_stdlog,
1508 "gdbarch_update: info.bfd_architecture %d (%s)\n",
1509 info.bfd_architecture,
1510 bfd_lookup_arch (info.bfd_architecture, 0)->printable_name);
1511 fprintf_unfiltered (gdb_stdlog,
1512 "gdbarch_update: info.bfd_arch_info %s\n",
1513 (info.bfd_arch_info != NULL
1514 ? info.bfd_arch_info->printable_name
1515 : "(null)"));
1516 fprintf_unfiltered (gdb_stdlog,
1517 "gdbarch_update: info.byte_order %d (%s)\n",
1518 info.byte_order,
1519 (info.byte_order == BIG_ENDIAN ? "big"
1520 : info.byte_order == LITTLE_ENDIAN ? "little"
1521 : "default"));
1522 fprintf_unfiltered (gdb_stdlog,
1523 "gdbarch_update: info.abfd 0x%lx\n",
1524 (long) info.abfd);
1525 fprintf_unfiltered (gdb_stdlog,
1526 "gdbarch_update: info.tdep_info 0x%lx\n",
1527 (long) info.tdep_info);
1528 }
1529
1530 /* Ask the target for a replacement architecture. */
1531 new_gdbarch = rego->init (info, rego->arches);
1532
1533 /* Did the target like it? No. Reject the change. */
1534 if (new_gdbarch == NULL)
1535 {
1536 if (gdbarch_debug)
1537 fprintf_unfiltered (gdb_stdlog, "gdbarch_update: Target rejected architecture\n");
1538 return 0;
1539 }
1540
1541 /* Did the architecture change? No. Do nothing. */
1542 if (current_gdbarch == new_gdbarch)
1543 {
1544 if (gdbarch_debug)
1545 fprintf_unfiltered (gdb_stdlog, "gdbarch_update: Architecture 0x%08lx (%s) unchanged\n",
1546 (long) new_gdbarch,
1547 new_gdbarch->bfd_arch_info->printable_name);
1548 return 1;
1549 }
1550
1551 /* Swap all data belonging to the old target out */
1552 swapout_gdbarch_swap (current_gdbarch);
1553
1554 /* Is this a pre-existing architecture? Yes. Swap it in. */
1555 for (list = &rego->arches;
1556 (*list) != NULL;
1557 list = &(*list)->next)
1558 {
1559 if ((*list)->gdbarch == new_gdbarch)
1560 {
1561 if (gdbarch_debug)
1562 fprintf_unfiltered (gdb_stdlog, "gdbarch_update: Previous architecture 0x%08lx (%s) selected\n",
1563 (long) new_gdbarch,
1564 new_gdbarch->bfd_arch_info->printable_name);
1565 current_gdbarch = new_gdbarch;
1566 swapin_gdbarch_swap (new_gdbarch);
1567 return 1;
1568 }
1569 }
1570
1571 /* Append this new architecture to this targets list. */
1572 (*list) = XMALLOC (struct gdbarch_list);
1573 (*list)->next = NULL;
1574 (*list)->gdbarch = new_gdbarch;
1575
1576 /* Switch to this new architecture. Dump it out. */
1577 current_gdbarch = new_gdbarch;
1578 if (gdbarch_debug)
1579 {
1580 fprintf_unfiltered (gdb_stdlog,
1581 "gdbarch_update: New architecture 0x%08lx (%s) selected\n",
1582 (long) new_gdbarch,
1583 new_gdbarch->bfd_arch_info->printable_name);
1584 gdbarch_dump ();
1585 }
1586
1587 /* Check that the newly installed architecture is valid. */
1588 verify_gdbarch (new_gdbarch);
1589
1590 /* Initialize the per-architecture memory (swap) areas.
1591 CURRENT_GDBARCH must be update before these modules are
1592 called. */
1593 init_gdbarch_swap (new_gdbarch);
1594
1595 /* Initialize the per-architecture data-pointer of all parties that
1596 registered an interest in this architecture. CURRENT_GDBARCH
1597 must be updated before these modules are called. */
1598 init_gdbarch_data (new_gdbarch);
1599
1600 return 1;
1601}
1602
1603
1604
1605/* Functions to manipulate the endianness of the target. */
1606
1607#ifdef TARGET_BYTE_ORDER_SELECTABLE
1608/* compat - Catch old targets that expect a selectable byte-order to
1609 default to BIG_ENDIAN */
1610#ifndef TARGET_BYTE_ORDER_DEFAULT
1611#define TARGET_BYTE_ORDER_DEFAULT BIG_ENDIAN
1612#endif
1613#endif
1614#if !TARGET_BYTE_ORDER_SELECTABLE_P
1615#ifndef TARGET_BYTE_ORDER_DEFAULT
1616/* compat - Catch old non byte-order selectable targets that do not
1617 define TARGET_BYTE_ORDER_DEFAULT and instead expect
1618 TARGET_BYTE_ORDER to be used as the default. For targets that
1619 defined neither TARGET_BYTE_ORDER nor TARGET_BYTE_ORDER_DEFAULT the
1620 below will get a strange compiler warning. */
1621#define TARGET_BYTE_ORDER_DEFAULT TARGET_BYTE_ORDER
1622#endif
1623#endif
1624#ifndef TARGET_BYTE_ORDER_DEFAULT
1625#define TARGET_BYTE_ORDER_DEFAULT BIG_ENDIAN /* arbitrary */
1626#endif
1627int target_byte_order = TARGET_BYTE_ORDER_DEFAULT;
1628int target_byte_order_auto = 1;
1629
1630/* Chain containing the \"set endian\" commands. */
1631static struct cmd_list_element *endianlist = NULL;
1632
1633/* Called by \`\`show endian''. */
1634static void
1635show_endian (char *args, int from_tty)
1636{
1637 char *msg =
1638 (TARGET_BYTE_ORDER_AUTO
1639 ? "The target endianness is set automatically (currently %s endian)\n"
1640 : "The target is assumed to be %s endian\n");
1641 printf_unfiltered (msg, (TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little"));
1642}
1643
1644/* Called if the user enters \`\`set endian'' without an argument. */
1645static void
1646set_endian (char *args, int from_tty)
1647{
1648 printf_unfiltered ("\"set endian\" must be followed by \"auto\", \"big\" or \"little\".\n");
1649 show_endian (args, from_tty);
1650}
1651
1652/* Called by \`\`set endian big''. */
1653static void
1654set_endian_big (char *args, int from_tty)
1655{
1656 if (TARGET_BYTE_ORDER_SELECTABLE_P)
1657 {
1658 target_byte_order = BIG_ENDIAN;
1659 target_byte_order_auto = 0;
1660 if (GDB_MULTI_ARCH)
1661 {
1662 struct gdbarch_info info;
1663 memset (&info, 0, sizeof info);
1664 info.byte_order = BIG_ENDIAN;
1665 gdbarch_update (info);
1666 }
1667 }
1668 else
1669 {
1670 printf_unfiltered ("Byte order is not selectable.");
1671 show_endian (args, from_tty);
1672 }
1673}
1674
1675/* Called by \`\`set endian little''. */
1676static void
1677set_endian_little (char *args, int from_tty)
1678{
1679 if (TARGET_BYTE_ORDER_SELECTABLE_P)
1680 {
1681 target_byte_order = LITTLE_ENDIAN;
1682 target_byte_order_auto = 0;
1683 if (GDB_MULTI_ARCH)
1684 {
1685 struct gdbarch_info info;
1686 memset (&info, 0, sizeof info);
1687 info.byte_order = LITTLE_ENDIAN;
1688 gdbarch_update (info);
1689 }
1690 }
1691 else
1692 {
1693 printf_unfiltered ("Byte order is not selectable.");
1694 show_endian (args, from_tty);
1695 }
1696}
1697
1698/* Called by \`\`set endian auto''. */
1699static void
1700set_endian_auto (char *args, int from_tty)
1701{
1702 if (TARGET_BYTE_ORDER_SELECTABLE_P)
1703 {
1704 target_byte_order_auto = 1;
1705 }
1706 else
1707 {
1708 printf_unfiltered ("Byte order is not selectable.");
1709 show_endian (args, from_tty);
1710 }
1711}
1712
1713/* Set the endianness from a BFD. */
1714static void
1715set_endian_from_file (bfd *abfd)
1716{
1717 if (TARGET_BYTE_ORDER_SELECTABLE_P)
1718 {
1719 int want;
1720
1721 if (bfd_big_endian (abfd))
1722 want = BIG_ENDIAN;
1723 else
1724 want = LITTLE_ENDIAN;
1725 if (TARGET_BYTE_ORDER_AUTO)
1726 target_byte_order = want;
1727 else if (TARGET_BYTE_ORDER != want)
1728 warning ("%s endian file does not match %s endian target.",
1729 want == BIG_ENDIAN ? "big" : "little",
1730 TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little");
1731 }
1732 else
1733 {
1734 if (bfd_big_endian (abfd)
1735 ? TARGET_BYTE_ORDER != BIG_ENDIAN
1736 : TARGET_BYTE_ORDER == BIG_ENDIAN)
1737 warning ("%s endian file does not match %s endian target.",
1738 bfd_big_endian (abfd) ? "big" : "little",
1739 TARGET_BYTE_ORDER == BIG_ENDIAN ? "big" : "little");
1740 }
1741}
1742
1743
1744
1745/* Functions to manipulate the architecture of the target */
1746
1747enum set_arch { set_arch_auto, set_arch_manual };
1748
1749int target_architecture_auto = 1;
1750extern const struct bfd_arch_info bfd_default_arch_struct;
1751const struct bfd_arch_info *target_architecture = &bfd_default_arch_struct;
1752int (*target_architecture_hook) (const struct bfd_arch_info *ap);
1753
1754static void show_endian (char *, int);
1755static void set_endian (char *, int);
1756static void set_endian_big (char *, int);
1757static void set_endian_little (char *, int);
1758static void set_endian_auto (char *, int);
1759static void set_endian_from_file (bfd *);
1760static int arch_ok (const struct bfd_arch_info *arch);
1761static void set_arch (const struct bfd_arch_info *arch, enum set_arch type);
1762static void show_architecture (char *, int);
1763static void set_architecture (char *, int);
1764static void info_architecture (char *, int);
1765static void set_architecture_from_file (bfd *);
1766
1767/* Do the real work of changing the current architecture */
1768
1769static int
1770arch_ok (const struct bfd_arch_info *arch)
1771{
1772 /* Should be performing the more basic check that the binary is
1773 compatible with GDB. */
1774 /* Check with the target that the architecture is valid. */
1775 return (target_architecture_hook == NULL
1776 || target_architecture_hook (arch));
1777}
1778
1779static void
1780set_arch (const struct bfd_arch_info *arch,
1781 enum set_arch type)
1782{
1783 switch (type)
1784 {
1785 case set_arch_auto:
1786 if (!arch_ok (arch))
1787 warning ("Target may not support %s architecture",
1788 arch->printable_name);
1789 target_architecture = arch;
1790 break;
1791 case set_arch_manual:
1792 if (!arch_ok (arch))
1793 {
1794 printf_unfiltered ("Target does not support \`%s' architecture.\n",
1795 arch->printable_name);
1796 }
1797 else
1798 {
1799 target_architecture_auto = 0;
1800 target_architecture = arch;
1801 }
1802 break;
1803 }
1804 if (gdbarch_debug)
1805 gdbarch_dump ();
1806}
1807
1808/* Called if the user enters \`\`show architecture'' without an argument. */
1809static void
1810show_architecture (char *args, int from_tty)
1811{
1812 const char *arch;
1813 arch = TARGET_ARCHITECTURE->printable_name;
1814 if (target_architecture_auto)
1815 printf_filtered ("The target architecture is set automatically (currently %s)\n", arch);
1816 else
1817 printf_filtered ("The target architecture is assumed to be %s\n", arch);
1818}
1819
1820/* Called if the user enters \`\`set architecture'' with or without an
1821 argument. */
1822static void
1823set_architecture (char *args, int from_tty)
1824{
1825 if (args == NULL)
1826 {
1827 printf_unfiltered ("\"set architecture\" must be followed by \"auto\" or an architecture name.\n");
1828 }
1829 else if (strcmp (args, "auto") == 0)
1830 {
1831 target_architecture_auto = 1;
1832 }
1833 else if (GDB_MULTI_ARCH)
1834 {
1835 const struct bfd_arch_info *arch = bfd_scan_arch (args);
1836 if (arch == NULL)
1837 printf_unfiltered ("Architecture \`%s' not reconized.\n", args);
1838 else
1839 {
1840 struct gdbarch_info info;
1841 memset (&info, 0, sizeof info);
1842 info.bfd_arch_info = arch;
1843 if (gdbarch_update (info))
1844 target_architecture_auto = 0;
1845 else
1846 printf_unfiltered ("Architecture \`%s' not reconized.\n", args);
1847 }
1848 }
1849 else
1850 {
1851 const struct bfd_arch_info *arch = bfd_scan_arch (args);
1852 if (arch != NULL)
1853 set_arch (arch, set_arch_manual);
1854 else
1855 printf_unfiltered ("Architecture \`%s' not reconized.\n", args);
1856 }
1857}
1858
1859/* Called if the user enters \`\`info architecture'' without an argument. */
1860static void
1861info_architecture (char *args, int from_tty)
1862{
1863 enum bfd_architecture a;
1864 if (GDB_MULTI_ARCH)
1865 {
1866 if (gdbarch_init_registrary != NULL)
1867 {
1868 struct gdbarch_init_registration *rego;
1869 printf_filtered ("Available architectures are:\n");
1870 for (rego = gdbarch_init_registrary;
1871 rego != NULL;
1872 rego = rego->next)
1873 {
1874 const struct bfd_arch_info *ap;
1875 ap = bfd_lookup_arch (rego->bfd_architecture, 0);
1876 if (ap != NULL)
1877 {
1878 do
1879 {
1880 printf_filtered (" %s", ap->printable_name);
1881 ap = ap->next;
1882 }
1883 while (ap != NULL);
1884 printf_filtered ("\n");
1885 }
1886 }
1887 }
1888 else
1889 {
1890 printf_filtered ("There are no available architectures.\n");
1891 }
1892 return;
1893 }
1894 printf_filtered ("Available architectures are:\n");
1895 for (a = bfd_arch_obscure + 1; a < bfd_arch_last; a++)
1896 {
1897 const struct bfd_arch_info *ap = bfd_lookup_arch (a, 0);
1898 if (ap != NULL)
1899 {
1900 do
1901 {
1902 printf_filtered (" %s", ap->printable_name);
1903 ap = ap->next;
1904 }
1905 while (ap != NULL);
1906 printf_filtered ("\n");
1907 }
1908 }
1909}
1910
1911/* Set the architecture from arch/machine */
1912void
1913set_architecture_from_arch_mach (arch, mach)
1914 enum bfd_architecture arch;
1915 unsigned long mach;
1916{
1917 const struct bfd_arch_info *wanted = bfd_lookup_arch (arch, mach);
1918 if (wanted != NULL)
1919 set_arch (wanted, set_arch_manual);
1920 else
1921 internal_error ("gdbarch: hardwired architecture/machine not reconized");
1922}
1923
1924/* Set the architecture from a BFD */
1925static void
1926set_architecture_from_file (bfd *abfd)
1927{
1928 const struct bfd_arch_info *wanted = bfd_get_arch_info (abfd);
1929 if (target_architecture_auto)
1930 {
1931 set_arch (wanted, set_arch_auto);
1932 }
1933 else if (wanted != target_architecture)
1934 {
1935 warning ("%s architecture file may be incompatible with %s target.",
1936 wanted->printable_name,
1937 target_architecture->printable_name);
1938 }
1939}
1940
1941
1942/* Misc helper functions for targets. */
1943
1944int
1945frame_num_args_unknown (fi)
1946 struct frame_info *fi;
1947{
1948 return -1;
1949}
1950
1951
1952int
1953generic_register_convertible_not (num)
1954 int num;
1955{
1956 return 0;
1957}
1958
4478b372 1959
104c1213
JM
1960/* Disassembler */
1961
1962/* Pointer to the target-dependent disassembly function. */
1963int (*tm_print_insn) (bfd_vma, disassemble_info *);
1964disassemble_info tm_print_insn_info;
1965
1966
1967
1968/* Set the dynamic target-system-dependant parameters (architecture,
1969 byte-order) using information found in the BFD */
1970
1971void
1972set_gdbarch_from_file (abfd)
1973 bfd *abfd;
1974{
1975 if (GDB_MULTI_ARCH)
1976 {
1977 struct gdbarch_info info;
1978 memset (&info, 0, sizeof info);
1979 info.abfd = abfd;
1980 gdbarch_update (info);
1981 return;
1982 }
1983 set_architecture_from_file (abfd);
1984 set_endian_from_file (abfd);
1985}
1986
1987
1988#if defined (CALL_DUMMY)
1989/* FIXME - this should go away */
1990LONGEST call_dummy_words[] = CALL_DUMMY;
1991int sizeof_call_dummy_words = sizeof (call_dummy_words);
1992#endif
1993
1994
e514a9d6
JM
1995/* Initialize the current architecture. */
1996void
1997initialize_current_architecture ()
1998{
1999 if (GDB_MULTI_ARCH)
2000 {
2001 struct gdbarch_init_registration *rego;
2002 const struct bfd_arch_info *chosen = NULL;
2003 for (rego = gdbarch_init_registrary; rego != NULL; rego = rego->next)
2004 {
2005 const struct bfd_arch_info *ap
2006 = bfd_lookup_arch (rego->bfd_architecture, 0);
2007
2008 /* Choose the first architecture alphabetically. */
2009 if (chosen == NULL
2010 || strcmp (ap->printable_name, chosen->printable_name) < 0)
2011 chosen = ap;
2012 }
2013
2014 if (chosen != NULL)
2015 {
2016 struct gdbarch_info info;
2017 memset (&info, 0, sizeof info);
2018 info.bfd_arch_info = chosen;
2019 gdbarch_update (info);
2020 }
2021 }
2022}
2023
104c1213
JM
2024extern void _initialize_gdbarch (void);
2025void
2026_initialize_gdbarch ()
2027{
59233f88
AC
2028 struct cmd_list_element *c;
2029
104c1213
JM
2030 add_prefix_cmd ("endian", class_support, set_endian,
2031 "Set endianness of target.",
2032 &endianlist, "set endian ", 0, &setlist);
2033 add_cmd ("big", class_support, set_endian_big,
2034 "Set target as being big endian.", &endianlist);
2035 add_cmd ("little", class_support, set_endian_little,
2036 "Set target as being little endian.", &endianlist);
2037 add_cmd ("auto", class_support, set_endian_auto,
2038 "Select target endianness automatically.", &endianlist);
2039 add_cmd ("endian", class_support, show_endian,
2040 "Show endianness of target.", &showlist);
2041
2042 add_cmd ("architecture", class_support, set_architecture,
2043 "Set architecture of target.", &setlist);
2044 add_alias_cmd ("processor", "architecture", class_support, 1, &setlist);
2045 add_cmd ("architecture", class_support, show_architecture,
2046 "Show architecture of target.", &showlist);
2047 add_cmd ("architecture", class_support, info_architecture,
2048 "List supported target architectures", &infolist);
2049
2050 INIT_DISASSEMBLE_INFO_NO_ARCH (tm_print_insn_info, gdb_stdout, (fprintf_ftype)fprintf_filtered);
2051 tm_print_insn_info.flavour = bfd_target_unknown_flavour;
2052 tm_print_insn_info.read_memory_func = dis_asm_read_memory;
2053 tm_print_insn_info.memory_error_func = dis_asm_memory_error;
2054 tm_print_insn_info.print_address_func = dis_asm_print_address;
2055
59233f88 2056 add_show_from_set (add_set_cmd ("arch",
104c1213
JM
2057 class_maintenance,
2058 var_zinteger,
2059 (char *)&gdbarch_debug,
2060 "Set architecture debugging.\n\\
59233f88
AC
2061When non-zero, architecture debugging is enabled.", &setdebuglist),
2062 &showdebuglist);
2063 c = add_set_cmd ("archdebug",
2064 class_maintenance,
2065 var_zinteger,
2066 (char *)&gdbarch_debug,
2067 "Set architecture debugging.\n\\
2068When non-zero, architecture debugging is enabled.", &setlist);
2069
2070 deprecate_cmd (c, "set debug arch");
2071 deprecate_cmd (add_show_from_set (c, &showlist), "show debug arch");
104c1213
JM
2072}
2073EOF
2074
2075# close things off
2076exec 1>&2
2077#../move-if-change new-gdbarch.c gdbarch.c
59233f88 2078compare_new gdbarch.c
This page took 0.142167 seconds and 4 git commands to generate.