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