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