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