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