xref: /openbsd-src/gnu/usr.bin/binutils/gdb/gdbarch.sh (revision 11efff7f3ac2b3cfeff0c0cddc14294d9b3aca4f)
1b725ae77Skettenis#!/bin/sh -u
2b725ae77Skettenis
3b725ae77Skettenis# Architecture commands for GDB, the GNU debugger.
4b725ae77Skettenis#
5b725ae77Skettenis# Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software
6b725ae77Skettenis# Foundation, Inc.
7b725ae77Skettenis#
8b725ae77Skettenis#
9b725ae77Skettenis# This file is part of GDB.
10b725ae77Skettenis#
11b725ae77Skettenis# This program is free software; you can redistribute it and/or modify
12b725ae77Skettenis# it under the terms of the GNU General Public License as published by
13b725ae77Skettenis# the Free Software Foundation; either version 2 of the License, or
14b725ae77Skettenis# (at your option) any later version.
15b725ae77Skettenis#
16b725ae77Skettenis# This program is distributed in the hope that it will be useful,
17b725ae77Skettenis# but WITHOUT ANY WARRANTY; without even the implied warranty of
18b725ae77Skettenis# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19b725ae77Skettenis# GNU General Public License for more details.
20b725ae77Skettenis#
21b725ae77Skettenis# You should have received a copy of the GNU General Public License
22b725ae77Skettenis# along with this program; if not, write to the Free Software
23b725ae77Skettenis# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24b725ae77Skettenis
25b725ae77Skettenis# Make certain that the script is running in an internationalized
26b725ae77Skettenis# environment.
27b725ae77SkettenisLANG=c ; export LANG
28b725ae77SkettenisLC_ALL=c ; export LC_ALL
29b725ae77Skettenis
30b725ae77Skettenis
31b725ae77Sketteniscompare_new ()
32b725ae77Skettenis{
33b725ae77Skettenis    file=$1
34b725ae77Skettenis    if test ! -r ${file}
35b725ae77Skettenis    then
36b725ae77Skettenis	echo "${file} missing? cp new-${file} ${file}" 1>&2
37b725ae77Skettenis    elif diff -u ${file} new-${file}
38b725ae77Skettenis    then
39b725ae77Skettenis	echo "${file} unchanged" 1>&2
40b725ae77Skettenis    else
41b725ae77Skettenis	echo "${file} has changed? cp new-${file} ${file}" 1>&2
42b725ae77Skettenis    fi
43b725ae77Skettenis}
44b725ae77Skettenis
45b725ae77Skettenis
46b725ae77Skettenis# Format of the input table
47*11efff7fSkettenisread="class macro returntype function formal actual staticdefault predefault postdefault invalid_p print garbage_at_eol"
48b725ae77Skettenis
49b725ae77Skettenisdo_read ()
50b725ae77Skettenis{
51b725ae77Skettenis    comment=""
52b725ae77Skettenis    class=""
53b725ae77Skettenis    while read line
54b725ae77Skettenis    do
55b725ae77Skettenis	if test "${line}" = ""
56b725ae77Skettenis	then
57b725ae77Skettenis	    continue
58b725ae77Skettenis	elif test "${line}" = "#" -a "${comment}" = ""
59b725ae77Skettenis	then
60b725ae77Skettenis	    continue
61b725ae77Skettenis	elif expr "${line}" : "#" > /dev/null
62b725ae77Skettenis	then
63b725ae77Skettenis	    comment="${comment}
64b725ae77Skettenis${line}"
65b725ae77Skettenis	else
66b725ae77Skettenis
67b725ae77Skettenis	    # The semantics of IFS varies between different SH's.  Some
68b725ae77Skettenis	    # treat ``::' as three fields while some treat it as just too.
69b725ae77Skettenis	    # Work around this by eliminating ``::'' ....
70b725ae77Skettenis	    line="`echo "${line}" | sed -e 's/::/: :/g' -e 's/::/: :/g'`"
71b725ae77Skettenis
72b725ae77Skettenis	    OFS="${IFS}" ; IFS="[:]"
73b725ae77Skettenis	    eval read ${read} <<EOF
74b725ae77Skettenis${line}
75b725ae77SkettenisEOF
76b725ae77Skettenis	    IFS="${OFS}"
77b725ae77Skettenis
78*11efff7fSkettenis	    if test -n "${garbage_at_eol}"
79*11efff7fSkettenis	    then
80*11efff7fSkettenis		echo "Garbage at end-of-line in ${line}" 1>&2
81*11efff7fSkettenis		kill $$
82*11efff7fSkettenis		exit 1
83*11efff7fSkettenis	    fi
84*11efff7fSkettenis
85b725ae77Skettenis	    # .... and then going back through each field and strip out those
86b725ae77Skettenis	    # that ended up with just that space character.
87b725ae77Skettenis	    for r in ${read}
88b725ae77Skettenis	    do
89b725ae77Skettenis		if eval test \"\${${r}}\" = \"\ \"
90b725ae77Skettenis		then
91b725ae77Skettenis		    eval ${r}=""
92b725ae77Skettenis		fi
93b725ae77Skettenis	    done
94b725ae77Skettenis
95*11efff7fSkettenis	    FUNCTION=`echo ${function} | tr '[a-z]' '[A-Z]'`
96*11efff7fSkettenis	    if test "x${macro}" = "x="
97*11efff7fSkettenis	    then
98*11efff7fSkettenis	        # Provide a UCASE version of function (for when there isn't MACRO)
99*11efff7fSkettenis		macro="${FUNCTION}"
100*11efff7fSkettenis	    elif test "${macro}" = "${FUNCTION}"
101*11efff7fSkettenis	    then
102*11efff7fSkettenis		echo "${function}: Specify = for macro field" 1>&2
103*11efff7fSkettenis		kill $$
104*11efff7fSkettenis		exit 1
105*11efff7fSkettenis	    fi
106*11efff7fSkettenis
107*11efff7fSkettenis	    # Check that macro definition wasn't supplied for multi-arch
108*11efff7fSkettenis	    case "${class}" in
109*11efff7fSkettenis		[mM] )
110*11efff7fSkettenis                    if test "${macro}" != ""
111*11efff7fSkettenis		    then
112*11efff7fSkettenis			echo "Error: Function ${function} multi-arch yet macro ${macro} supplied" 1>&2
113*11efff7fSkettenis			kill $$
114*11efff7fSkettenis			exit 1
115*11efff7fSkettenis		    fi
116b725ae77Skettenis	    esac
117b725ae77Skettenis
118b725ae77Skettenis	    case "${class}" in
119b725ae77Skettenis		m ) staticdefault="${predefault}" ;;
120b725ae77Skettenis		M ) staticdefault="0" ;;
121b725ae77Skettenis		* ) test "${staticdefault}" || staticdefault=0 ;;
122b725ae77Skettenis	    esac
123b725ae77Skettenis
124b725ae77Skettenis	    case "${class}" in
125b725ae77Skettenis	    F | V | M )
126b725ae77Skettenis		case "${invalid_p}" in
127b725ae77Skettenis		"" )
128b725ae77Skettenis		    if test -n "${predefault}"
129b725ae77Skettenis		    then
130b725ae77Skettenis			#invalid_p="gdbarch->${function} == ${predefault}"
131b725ae77Skettenis			predicate="gdbarch->${function} != ${predefault}"
132b725ae77Skettenis		    elif class_is_variable_p
133b725ae77Skettenis		    then
134b725ae77Skettenis			predicate="gdbarch->${function} != 0"
135b725ae77Skettenis		    elif class_is_function_p
136b725ae77Skettenis		    then
137b725ae77Skettenis			predicate="gdbarch->${function} != NULL"
138b725ae77Skettenis		    fi
139b725ae77Skettenis		    ;;
140b725ae77Skettenis		* )
141b725ae77Skettenis		    echo "Predicate function ${function} with invalid_p." 1>&2
142b725ae77Skettenis		    kill $$
143b725ae77Skettenis		    exit 1
144b725ae77Skettenis		    ;;
145b725ae77Skettenis		esac
146b725ae77Skettenis	    esac
147b725ae77Skettenis
148b725ae77Skettenis	    # PREDEFAULT is a valid fallback definition of MEMBER when
149b725ae77Skettenis	    # multi-arch is not enabled.  This ensures that the
150b725ae77Skettenis	    # default value, when multi-arch is the same as the
151b725ae77Skettenis	    # default value when not multi-arch.  POSTDEFAULT is
152b725ae77Skettenis	    # always a valid definition of MEMBER as this again
153b725ae77Skettenis	    # ensures consistency.
154b725ae77Skettenis
155b725ae77Skettenis	    if [ -n "${postdefault}" ]
156b725ae77Skettenis	    then
157b725ae77Skettenis		fallbackdefault="${postdefault}"
158b725ae77Skettenis	    elif [ -n "${predefault}" ]
159b725ae77Skettenis	    then
160b725ae77Skettenis		fallbackdefault="${predefault}"
161b725ae77Skettenis	    else
162b725ae77Skettenis		fallbackdefault="0"
163b725ae77Skettenis	    fi
164b725ae77Skettenis
165b725ae77Skettenis	    #NOT YET: See gdbarch.log for basic verification of
166b725ae77Skettenis	    # database
167b725ae77Skettenis
168b725ae77Skettenis	    break
169b725ae77Skettenis	fi
170b725ae77Skettenis    done
171b725ae77Skettenis    if [ -n "${class}" ]
172b725ae77Skettenis    then
173b725ae77Skettenis	true
174b725ae77Skettenis    else
175b725ae77Skettenis	false
176b725ae77Skettenis    fi
177b725ae77Skettenis}
178b725ae77Skettenis
179b725ae77Skettenis
180b725ae77Skettenisfallback_default_p ()
181b725ae77Skettenis{
182b725ae77Skettenis    [ -n "${postdefault}" -a "x${invalid_p}" != "x0" ] \
183b725ae77Skettenis	|| [ -n "${predefault}" -a "x${invalid_p}" = "x0" ]
184b725ae77Skettenis}
185b725ae77Skettenis
186b725ae77Skettenisclass_is_variable_p ()
187b725ae77Skettenis{
188b725ae77Skettenis    case "${class}" in
189b725ae77Skettenis	*v* | *V* ) true ;;
190b725ae77Skettenis	* ) false ;;
191b725ae77Skettenis    esac
192b725ae77Skettenis}
193b725ae77Skettenis
194b725ae77Skettenisclass_is_function_p ()
195b725ae77Skettenis{
196b725ae77Skettenis    case "${class}" in
197b725ae77Skettenis	*f* | *F* | *m* | *M* ) true ;;
198b725ae77Skettenis	* ) false ;;
199b725ae77Skettenis    esac
200b725ae77Skettenis}
201b725ae77Skettenis
202b725ae77Skettenisclass_is_multiarch_p ()
203b725ae77Skettenis{
204b725ae77Skettenis    case "${class}" in
205b725ae77Skettenis	*m* | *M* ) true ;;
206b725ae77Skettenis	* ) false ;;
207b725ae77Skettenis    esac
208b725ae77Skettenis}
209b725ae77Skettenis
210b725ae77Skettenisclass_is_predicate_p ()
211b725ae77Skettenis{
212b725ae77Skettenis    case "${class}" in
213b725ae77Skettenis	*F* | *V* | *M* ) true ;;
214b725ae77Skettenis	* ) false ;;
215b725ae77Skettenis    esac
216b725ae77Skettenis}
217b725ae77Skettenis
218b725ae77Skettenisclass_is_info_p ()
219b725ae77Skettenis{
220b725ae77Skettenis    case "${class}" in
221b725ae77Skettenis	*i* ) true ;;
222b725ae77Skettenis	* ) false ;;
223b725ae77Skettenis    esac
224b725ae77Skettenis}
225b725ae77Skettenis
226b725ae77Skettenis
227b725ae77Skettenis# dump out/verify the doco
228b725ae77Skettenisfor field in ${read}
229b725ae77Skettenisdo
230b725ae77Skettenis  case ${field} in
231b725ae77Skettenis
232b725ae77Skettenis    class ) : ;;
233b725ae77Skettenis
234b725ae77Skettenis	# # -> line disable
235b725ae77Skettenis	# f -> function
236b725ae77Skettenis	#   hiding a function
237b725ae77Skettenis	# F -> function + predicate
238b725ae77Skettenis	#   hiding a function + predicate to test function validity
239b725ae77Skettenis	# v -> variable
240b725ae77Skettenis	#   hiding a variable
241b725ae77Skettenis	# V -> variable + predicate
242b725ae77Skettenis	#   hiding a variable + predicate to test variables validity
243b725ae77Skettenis	# i -> set from info
244b725ae77Skettenis	#   hiding something from the ``struct info'' object
245b725ae77Skettenis	# m -> multi-arch function
246b725ae77Skettenis	#   hiding a multi-arch function (parameterised with the architecture)
247b725ae77Skettenis        # M -> multi-arch function + predicate
248b725ae77Skettenis	#   hiding a multi-arch function + predicate to test function validity
249b725ae77Skettenis
250b725ae77Skettenis    macro ) : ;;
251b725ae77Skettenis
252*11efff7fSkettenis	# The name of the legacy C macro by which this method can be
253*11efff7fSkettenis	# accessed.  If empty, no macro is defined.  If "=", a macro
254*11efff7fSkettenis	# formed from the upper-case function name is used.
255b725ae77Skettenis
256b725ae77Skettenis    returntype ) : ;;
257b725ae77Skettenis
258b725ae77Skettenis	# For functions, the return type; for variables, the data type
259b725ae77Skettenis
260b725ae77Skettenis    function ) : ;;
261b725ae77Skettenis
262b725ae77Skettenis	# For functions, the member function name; for variables, the
263b725ae77Skettenis	# variable name.  Member function names are always prefixed with
264b725ae77Skettenis	# ``gdbarch_'' for name-space purity.
265b725ae77Skettenis
266b725ae77Skettenis    formal ) : ;;
267b725ae77Skettenis
268b725ae77Skettenis	# The formal argument list.  It is assumed that the formal
269b725ae77Skettenis	# argument list includes the actual name of each list element.
270b725ae77Skettenis	# A function with no arguments shall have ``void'' as the
271b725ae77Skettenis	# formal argument list.
272b725ae77Skettenis
273b725ae77Skettenis    actual ) : ;;
274b725ae77Skettenis
275b725ae77Skettenis	# The list of actual arguments.  The arguments specified shall
276b725ae77Skettenis	# match the FORMAL list given above.  Functions with out
277b725ae77Skettenis	# arguments leave this blank.
278b725ae77Skettenis
279b725ae77Skettenis    staticdefault ) : ;;
280b725ae77Skettenis
281b725ae77Skettenis	# To help with the GDB startup a static gdbarch object is
282b725ae77Skettenis	# created.  STATICDEFAULT is the value to insert into that
283b725ae77Skettenis	# static gdbarch object.  Since this a static object only
284b725ae77Skettenis	# simple expressions can be used.
285b725ae77Skettenis
286b725ae77Skettenis	# If STATICDEFAULT is empty, zero is used.
287b725ae77Skettenis
288b725ae77Skettenis    predefault ) : ;;
289b725ae77Skettenis
290b725ae77Skettenis	# An initial value to assign to MEMBER of the freshly
291b725ae77Skettenis	# malloc()ed gdbarch object.  After initialization, the
292b725ae77Skettenis	# freshly malloc()ed object is passed to the target
293b725ae77Skettenis	# architecture code for further updates.
294b725ae77Skettenis
295b725ae77Skettenis	# If PREDEFAULT is empty, zero is used.
296b725ae77Skettenis
297b725ae77Skettenis	# A non-empty PREDEFAULT, an empty POSTDEFAULT and a zero
298b725ae77Skettenis	# INVALID_P are specified, PREDEFAULT will be used as the
299b725ae77Skettenis	# default for the non- multi-arch target.
300b725ae77Skettenis
301b725ae77Skettenis	# A zero PREDEFAULT function will force the fallback to call
302b725ae77Skettenis	# internal_error().
303b725ae77Skettenis
304b725ae77Skettenis	# Variable declarations can refer to ``gdbarch'' which will
305b725ae77Skettenis	# contain the current architecture.  Care should be taken.
306b725ae77Skettenis
307b725ae77Skettenis    postdefault ) : ;;
308b725ae77Skettenis
309b725ae77Skettenis	# A value to assign to MEMBER of the new gdbarch object should
310b725ae77Skettenis	# the target architecture code fail to change the PREDEFAULT
311b725ae77Skettenis	# value.
312b725ae77Skettenis
313b725ae77Skettenis	# If POSTDEFAULT is empty, no post update is performed.
314b725ae77Skettenis
315b725ae77Skettenis	# If both INVALID_P and POSTDEFAULT are non-empty then
316b725ae77Skettenis	# INVALID_P will be used to determine if MEMBER should be
317b725ae77Skettenis	# changed to POSTDEFAULT.
318b725ae77Skettenis
319b725ae77Skettenis	# If a non-empty POSTDEFAULT and a zero INVALID_P are
320b725ae77Skettenis	# specified, POSTDEFAULT will be used as the default for the
321b725ae77Skettenis	# non- multi-arch target (regardless of the value of
322b725ae77Skettenis	# PREDEFAULT).
323b725ae77Skettenis
324b725ae77Skettenis	# You cannot specify both a zero INVALID_P and a POSTDEFAULT.
325b725ae77Skettenis
326b725ae77Skettenis	# Variable declarations can refer to ``current_gdbarch'' which
327b725ae77Skettenis	# will contain the current architecture.  Care should be
328b725ae77Skettenis	# taken.
329b725ae77Skettenis
330b725ae77Skettenis    invalid_p ) : ;;
331b725ae77Skettenis
332b725ae77Skettenis	# A predicate equation that validates MEMBER.  Non-zero is
333b725ae77Skettenis	# returned if the code creating the new architecture failed to
334b725ae77Skettenis	# initialize MEMBER or the initialized the member is invalid.
335b725ae77Skettenis	# If POSTDEFAULT is non-empty then MEMBER will be updated to
336b725ae77Skettenis	# that value.  If POSTDEFAULT is empty then internal_error()
337b725ae77Skettenis	# is called.
338b725ae77Skettenis
339b725ae77Skettenis	# If INVALID_P is empty, a check that MEMBER is no longer
340b725ae77Skettenis	# equal to PREDEFAULT is used.
341b725ae77Skettenis
342b725ae77Skettenis	# The expression ``0'' disables the INVALID_P check making
343b725ae77Skettenis	# PREDEFAULT a legitimate value.
344b725ae77Skettenis
345b725ae77Skettenis	# See also PREDEFAULT and POSTDEFAULT.
346b725ae77Skettenis
347b725ae77Skettenis    print ) : ;;
348b725ae77Skettenis
349*11efff7fSkettenis	# An optional expression that convers MEMBER to a value
350*11efff7fSkettenis	# suitable for formatting using %s.
351b725ae77Skettenis
352*11efff7fSkettenis	# If PRINT is empty, paddr_nz (for CORE_ADDR) or paddr_d
353*11efff7fSkettenis	# (anything else) is used.
354b725ae77Skettenis
355*11efff7fSkettenis    garbage_at_eol ) : ;;
356b725ae77Skettenis
357*11efff7fSkettenis	# Catches stray fields.
358b725ae77Skettenis
359b725ae77Skettenis    *)
360b725ae77Skettenis	echo "Bad field ${field}"
361b725ae77Skettenis	exit 1;;
362b725ae77Skettenis  esac
363b725ae77Skettenisdone
364b725ae77Skettenis
365b725ae77Skettenis
366b725ae77Skettenisfunction_list ()
367b725ae77Skettenis{
368b725ae77Skettenis  # See below (DOCO) for description of each field
369b725ae77Skettenis  cat <<EOF
370*11efff7fSkettenisi:TARGET_ARCHITECTURE:const struct bfd_arch_info *:bfd_arch_info:::&bfd_default_arch_struct::::TARGET_ARCHITECTURE->printable_name
371b725ae77Skettenis#
372*11efff7fSkettenisi:TARGET_BYTE_ORDER:int:byte_order:::BFD_ENDIAN_BIG
373b725ae77Skettenis#
374*11efff7fSkettenisi:TARGET_OSABI:enum gdb_osabi:osabi:::GDB_OSABI_UNKNOWN
375b725ae77Skettenis# Number of bits in a char or unsigned char for the target machine.
376b725ae77Skettenis# Just like CHAR_BIT in <limits.h> but describes the target machine.
377*11efff7fSkettenis# v:TARGET_CHAR_BIT:int:char_bit::::8 * sizeof (char):8::0:
378b725ae77Skettenis#
379b725ae77Skettenis# Number of bits in a short or unsigned short for the target machine.
380*11efff7fSkettenisv:TARGET_SHORT_BIT:int:short_bit:::8 * sizeof (short):2*TARGET_CHAR_BIT::0
381b725ae77Skettenis# Number of bits in an int or unsigned int for the target machine.
382*11efff7fSkettenisv:TARGET_INT_BIT:int:int_bit:::8 * sizeof (int):4*TARGET_CHAR_BIT::0
383b725ae77Skettenis# Number of bits in a long or unsigned long for the target machine.
384*11efff7fSkettenisv:TARGET_LONG_BIT:int:long_bit:::8 * sizeof (long):4*TARGET_CHAR_BIT::0
385b725ae77Skettenis# Number of bits in a long long or unsigned long long for the target
386b725ae77Skettenis# machine.
387*11efff7fSkettenisv:TARGET_LONG_LONG_BIT:int:long_long_bit:::8 * sizeof (LONGEST):2*TARGET_LONG_BIT::0
388*11efff7fSkettenis
389*11efff7fSkettenis# The ABI default bit-size and format for "float", "double", and "long
390*11efff7fSkettenis# double".  These bit/format pairs should eventually be combined into
391*11efff7fSkettenis# a single object.  For the moment, just initialize them as a pair.
392*11efff7fSkettenis
393*11efff7fSkettenisv:TARGET_FLOAT_BIT:int:float_bit:::8 * sizeof (float):4*TARGET_CHAR_BIT::0
394*11efff7fSkettenisv:TARGET_FLOAT_FORMAT:const struct floatformat *:float_format:::::default_float_format (current_gdbarch)::pformat (current_gdbarch->float_format)
395*11efff7fSkettenisv:TARGET_DOUBLE_BIT:int:double_bit:::8 * sizeof (double):8*TARGET_CHAR_BIT::0
396*11efff7fSkettenisv:TARGET_DOUBLE_FORMAT:const struct floatformat *:double_format:::::default_double_format (current_gdbarch)::pformat (current_gdbarch->double_format)
397*11efff7fSkettenisv:TARGET_LONG_DOUBLE_BIT:int:long_double_bit:::8 * sizeof (long double):8*TARGET_CHAR_BIT::0
398*11efff7fSkettenisv:TARGET_LONG_DOUBLE_FORMAT:const struct floatformat *:long_double_format:::::default_double_format (current_gdbarch)::pformat (current_gdbarch->long_double_format)
399*11efff7fSkettenis
400b725ae77Skettenis# For most targets, a pointer on the target and its representation as an
401b725ae77Skettenis# address in GDB have the same size and "look the same".  For such a
402b725ae77Skettenis# target, you need only set TARGET_PTR_BIT / ptr_bit and TARGET_ADDR_BIT
403b725ae77Skettenis# / addr_bit will be set from it.
404b725ae77Skettenis#
405b725ae77Skettenis# If TARGET_PTR_BIT and TARGET_ADDR_BIT are different, you'll probably
406b725ae77Skettenis# also need to set POINTER_TO_ADDRESS and ADDRESS_TO_POINTER as well.
407b725ae77Skettenis#
408b725ae77Skettenis# ptr_bit is the size of a pointer on the target
409*11efff7fSkettenisv:TARGET_PTR_BIT:int:ptr_bit:::8 * sizeof (void*):TARGET_INT_BIT::0
410b725ae77Skettenis# addr_bit is the size of a target address as represented in gdb
411*11efff7fSkettenisv:TARGET_ADDR_BIT:int:addr_bit:::8 * sizeof (void*):0:TARGET_PTR_BIT:
412b725ae77Skettenis# Number of bits in a BFD_VMA for the target object file format.
413*11efff7fSkettenisv:TARGET_BFD_VMA_BIT:int:bfd_vma_bit:::8 * sizeof (void*):TARGET_ARCHITECTURE->bits_per_address::0
414b725ae77Skettenis#
415b725ae77Skettenis# One if \`char' acts like \`signed char', zero if \`unsigned char'.
416*11efff7fSkettenisv:TARGET_CHAR_SIGNED:int:char_signed:::1:-1:1
417b725ae77Skettenis#
418*11efff7fSkettenisF:TARGET_READ_PC:CORE_ADDR:read_pc:ptid_t ptid:ptid
419*11efff7fSkettenisf:TARGET_WRITE_PC:void:write_pc:CORE_ADDR val, ptid_t ptid:val, ptid:0:generic_target_write_pc::0
420b725ae77Skettenis# UNWIND_SP is a direct replacement for TARGET_READ_SP.
421*11efff7fSkettenisF:TARGET_READ_SP:CORE_ADDR:read_sp:void
422b725ae77Skettenis# Function for getting target's idea of a frame pointer.  FIXME: GDB's
423b725ae77Skettenis# whole scheme for dealing with "frames" and "frame pointers" needs a
424b725ae77Skettenis# serious shakedown.
425*11efff7fSkettenisf:TARGET_VIRTUAL_FRAME_POINTER:void:virtual_frame_pointer:CORE_ADDR pc, int *frame_regnum, LONGEST *frame_offset:pc, frame_regnum, frame_offset:0:legacy_virtual_frame_pointer::0
426b725ae77Skettenis#
427*11efff7fSkettenisM::void:pseudo_register_read:struct regcache *regcache, int cookednum, void *buf:regcache, cookednum, buf
428*11efff7fSkettenisM::void:pseudo_register_write:struct regcache *regcache, int cookednum, const void *buf:regcache, cookednum, buf
429b725ae77Skettenis#
430*11efff7fSkettenisv:=:int:num_regs:::0:-1
431b725ae77Skettenis# This macro gives the number of pseudo-registers that live in the
432b725ae77Skettenis# register namespace but do not get fetched or stored on the target.
433b725ae77Skettenis# These pseudo-registers may be aliases for other registers,
434b725ae77Skettenis# combinations of other registers, or they may be computed by GDB.
435*11efff7fSkettenisv:=:int:num_pseudo_regs:::0:0::0
436b725ae77Skettenis
437b725ae77Skettenis# GDB's standard (or well known) register numbers.  These can map onto
438b725ae77Skettenis# a real register or a pseudo (computed) register or not be defined at
439b725ae77Skettenis# all (-1).
440b725ae77Skettenis# SP_REGNUM will hopefully be replaced by UNWIND_SP.
441*11efff7fSkettenisv:=:int:sp_regnum:::-1:-1::0
442*11efff7fSkettenisv:=:int:pc_regnum:::-1:-1::0
443*11efff7fSkettenisv:=:int:ps_regnum:::-1:-1::0
444*11efff7fSkettenisv:=:int:fp0_regnum:::0:-1::0
445b725ae77Skettenis# Convert stab register number (from \`r\' declaration) to a gdb REGNUM.
446*11efff7fSkettenisf:=:int:stab_reg_to_regnum:int stab_regnr:stab_regnr::no_op_reg_to_regnum::0
447b725ae77Skettenis# Provide a default mapping from a ecoff register number to a gdb REGNUM.
448*11efff7fSkettenisf:=:int:ecoff_reg_to_regnum:int ecoff_regnr:ecoff_regnr::no_op_reg_to_regnum::0
449b725ae77Skettenis# Provide a default mapping from a DWARF register number to a gdb REGNUM.
450*11efff7fSkettenisf:=:int:dwarf_reg_to_regnum:int dwarf_regnr:dwarf_regnr::no_op_reg_to_regnum::0
451b725ae77Skettenis# Convert from an sdb register number to an internal gdb register number.
452*11efff7fSkettenisf:=:int:sdb_reg_to_regnum:int sdb_regnr:sdb_regnr::no_op_reg_to_regnum::0
453*11efff7fSkettenisf:=:int:dwarf2_reg_to_regnum:int dwarf2_regnr:dwarf2_regnr::no_op_reg_to_regnum::0
454*11efff7fSkettenisf:=:const char *:register_name:int regnr:regnr
455b725ae77Skettenis
456b725ae77Skettenis# REGISTER_TYPE is a direct replacement for DEPRECATED_REGISTER_VIRTUAL_TYPE.
457*11efff7fSkettenisM::struct type *:register_type:int reg_nr:reg_nr
458b725ae77Skettenis# If the value returned by DEPRECATED_REGISTER_BYTE agrees with the
459b725ae77Skettenis# register offsets computed using just REGISTER_TYPE, this can be
460b725ae77Skettenis# deleted.  See: maint print registers.  NOTE: cagney/2002-05-02: This
461b725ae77Skettenis# function with predicate has a valid (callable) initial value.  As a
462b725ae77Skettenis# consequence, even when the predicate is false, the corresponding
463b725ae77Skettenis# function works.  This simplifies the migration process - old code,
464b725ae77Skettenis# calling DEPRECATED_REGISTER_BYTE, doesn't need to be modified.
465*11efff7fSkettenisF:=:int:deprecated_register_byte:int reg_nr:reg_nr:generic_register_byte:generic_register_byte
466b725ae77Skettenis
467b725ae77Skettenis# See gdbint.texinfo, and PUSH_DUMMY_CALL.
468*11efff7fSkettenisM::struct frame_id:unwind_dummy_id:struct frame_info *info:info
469b725ae77Skettenis# Implement UNWIND_DUMMY_ID and PUSH_DUMMY_CALL, then delete
470b725ae77Skettenis# DEPRECATED_FP_REGNUM.
471*11efff7fSkettenisv:=:int:deprecated_fp_regnum:::-1:-1::0
472b725ae77Skettenis
473b725ae77Skettenis# See gdbint.texinfo.  See infcall.c.  New, all singing all dancing,
474b725ae77Skettenis# replacement for DEPRECATED_PUSH_ARGUMENTS.
475*11efff7fSkettenisM::CORE_ADDR:push_dummy_call:struct value *function, struct regcache *regcache, CORE_ADDR bp_addr, int nargs, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr:function, regcache, bp_addr, nargs, args, sp, struct_return, struct_addr
476b725ae77Skettenis# PUSH_DUMMY_CALL is a direct replacement for DEPRECATED_PUSH_ARGUMENTS.
477*11efff7fSkettenisF:=:CORE_ADDR:deprecated_push_arguments:int nargs, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr:nargs, args, sp, struct_return, struct_addr
478b725ae77Skettenis# DEPRECATED_REGISTER_SIZE can be deleted.
479*11efff7fSkettenisv:=:int:deprecated_register_size
480*11efff7fSkettenisv:=:int:call_dummy_location::::AT_ENTRY_POINT::0
481*11efff7fSkettenisM::CORE_ADDR:push_dummy_code:CORE_ADDR sp, CORE_ADDR funaddr, int using_gcc, struct value **args, int nargs, struct type *value_type, CORE_ADDR *real_pc, CORE_ADDR *bp_addr:sp, funaddr, using_gcc, args, nargs, value_type, real_pc, bp_addr
482b725ae77Skettenis
483*11efff7fSkettenism::void:print_registers_info:struct ui_file *file, struct frame_info *frame, int regnum, int all:file, frame, regnum, all::default_print_registers_info::0
484*11efff7fSkettenisM::void:print_float_info:struct ui_file *file, struct frame_info *frame, const char *args:file, frame, args
485*11efff7fSkettenisM::void:print_vector_info:struct ui_file *file, struct frame_info *frame, const char *args:file, frame, args
486b725ae77Skettenis# MAP a GDB RAW register number onto a simulator register number.  See
487b725ae77Skettenis# also include/...-sim.h.
488*11efff7fSkettenisf:=:int:register_sim_regno:int reg_nr:reg_nr::legacy_register_sim_regno::0
489*11efff7fSkettenisF:=:int:register_bytes_ok:long nr_bytes:nr_bytes
490*11efff7fSkettenisf:=:int:cannot_fetch_register:int regnum:regnum::cannot_register_not::0
491*11efff7fSkettenisf:=:int:cannot_store_register:int regnum:regnum::cannot_register_not::0
492b725ae77Skettenis# setjmp/longjmp support.
493*11efff7fSkettenisF:=:int:get_longjmp_target:CORE_ADDR *pc:pc
494b725ae77Skettenis#
495*11efff7fSkettenisv:=:int:believe_pcc_promotion:::::::
496b725ae77Skettenis#
497*11efff7fSkettenisf:=:int:convert_register_p:int regnum, struct type *type:regnum, type:0:generic_convert_register_p::0
498*11efff7fSkettenisf:=:void:register_to_value:struct frame_info *frame, int regnum, struct type *type, void *buf:frame, regnum, type, buf:0
499*11efff7fSkettenisf:=:void:value_to_register:struct frame_info *frame, int regnum, struct type *type, const void *buf:frame, regnum, type, buf:0
500b725ae77Skettenis#
501*11efff7fSkettenisf:=:CORE_ADDR:pointer_to_address:struct type *type, const void *buf:type, buf::unsigned_pointer_to_address::0
502*11efff7fSkettenisf:=:void:address_to_pointer:struct type *type, void *buf, CORE_ADDR addr:type, buf, addr::unsigned_address_to_pointer::0
503*11efff7fSkettenisF:=:CORE_ADDR:integer_to_address:struct type *type, void *buf:type, buf
504b725ae77Skettenis#
505b725ae77Skettenis# NOTE: cagney/2003-03-24: Replaced by PUSH_ARGUMENTS.
506*11efff7fSkettenisF:=:void:deprecated_store_struct_return:CORE_ADDR addr, CORE_ADDR sp:addr, sp
507b725ae77Skettenis
508b725ae77Skettenis# It has been suggested that this, well actually its predecessor,
509b725ae77Skettenis# should take the type/value of the function to be called and not the
510b725ae77Skettenis# return type.  This is left as an exercise for the reader.
511b725ae77Skettenis
512*11efff7fSkettenis# NOTE: cagney/2004-06-13: The function stack.c:return_command uses
513*11efff7fSkettenis# the predicate with default hack to avoid calling STORE_RETURN_VALUE
514*11efff7fSkettenis# (via legacy_return_value), when a small struct is involved.
515b725ae77Skettenis
516*11efff7fSkettenisM::enum return_value_convention:return_value:struct type *valtype, struct regcache *regcache, void *readbuf, const void *writebuf:valtype, regcache, readbuf, writebuf::legacy_return_value
517b725ae77Skettenis
518*11efff7fSkettenis# The deprecated methods EXTRACT_RETURN_VALUE, STORE_RETURN_VALUE,
519*11efff7fSkettenis# DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS and
520*11efff7fSkettenis# DEPRECATED_USE_STRUCT_CONVENTION have all been folded into
521*11efff7fSkettenis# RETURN_VALUE.
522*11efff7fSkettenis
523*11efff7fSkettenisf:=:void:extract_return_value:struct type *type, struct regcache *regcache, void *valbuf:type, regcache, valbuf::legacy_extract_return_value::0
524*11efff7fSkettenisf:=:void:store_return_value:struct type *type, struct regcache *regcache, const void *valbuf:type, regcache, valbuf::legacy_store_return_value::0
525*11efff7fSkettenisf:=:void:deprecated_extract_return_value:struct type *type, char *regbuf, char *valbuf:type, regbuf, valbuf
526*11efff7fSkettenisf:=:void:deprecated_store_return_value:struct type *type, char *valbuf:type, valbuf
527*11efff7fSkettenisf:=:int:deprecated_use_struct_convention:int gcc_p, struct type *value_type:gcc_p, value_type::generic_use_struct_convention::0
528b725ae77Skettenis
529b725ae77Skettenis# As of 2004-01-17 only the 32-bit SPARC ABI has been identified as an
530b725ae77Skettenis# ABI suitable for the implementation of a robust extract
531b725ae77Skettenis# struct-convention return-value address method (the sparc saves the
532b725ae77Skettenis# address in the callers frame).  All the other cases so far examined,
533b725ae77Skettenis# the DEPRECATED_EXTRACT_STRUCT_VALUE implementation has been
534b725ae77Skettenis# erreneous - the code was incorrectly assuming that the return-value
535b725ae77Skettenis# address, stored in a register, was preserved across the entire
536b725ae77Skettenis# function call.
537b725ae77Skettenis
538b725ae77Skettenis# For the moment retain DEPRECATED_EXTRACT_STRUCT_VALUE as a marker of
539b725ae77Skettenis# the ABIs that are still to be analyzed - perhaps this should simply
540b725ae77Skettenis# be deleted.  The commented out extract_returned_value_address method
541b725ae77Skettenis# is provided as a starting point for the 32-bit SPARC.  It, or
542b725ae77Skettenis# something like it, along with changes to both infcmd.c and stack.c
543b725ae77Skettenis# will be needed for that case to work.  NB: It is passed the callers
544b725ae77Skettenis# frame since it is only after the callee has returned that this
545b725ae77Skettenis# function is used.
546b725ae77Skettenis
547*11efff7fSkettenis#M::CORE_ADDR:extract_returned_value_address:struct frame_info *caller_frame:caller_frame
548*11efff7fSkettenisF:=:CORE_ADDR:deprecated_extract_struct_value_address:struct regcache *regcache:regcache
549b725ae77Skettenis
550b725ae77Skettenis#
551*11efff7fSkettenisf:=:CORE_ADDR:skip_prologue:CORE_ADDR ip:ip:0:0
552*11efff7fSkettenisf:=:int:inner_than:CORE_ADDR lhs, CORE_ADDR rhs:lhs, rhs:0:0
553*11efff7fSkettenisf:=:const unsigned char *:breakpoint_from_pc:CORE_ADDR *pcptr, int *lenptr:pcptr, lenptr::0:
554*11efff7fSkettenisM::CORE_ADDR:adjust_breakpoint_address:CORE_ADDR bpaddr:bpaddr
555*11efff7fSkettenisf:=:int:memory_insert_breakpoint:CORE_ADDR addr, char *contents_cache:addr, contents_cache:0:default_memory_insert_breakpoint::0
556*11efff7fSkettenisf:=:int:memory_remove_breakpoint:CORE_ADDR addr, char *contents_cache:addr, contents_cache:0:default_memory_remove_breakpoint::0
557*11efff7fSkettenisv:=:CORE_ADDR:decr_pc_after_break:::0:::0
558*11efff7fSkettenis
559*11efff7fSkettenis# A function can be addressed by either it's "pointer" (possibly a
560*11efff7fSkettenis# descriptor address) or "entry point" (first executable instruction).
561*11efff7fSkettenis# The method "convert_from_func_ptr_addr" converting the former to the
562*11efff7fSkettenis# latter.  DEPRECATED_FUNCTION_START_OFFSET is being used to implement
563*11efff7fSkettenis# a simplified subset of that functionality - the function's address
564*11efff7fSkettenis# corresponds to the "function pointer" and the function's start
565*11efff7fSkettenis# corresponds to the "function entry point" - and hence is redundant.
566*11efff7fSkettenis
567*11efff7fSkettenisv:=:CORE_ADDR:deprecated_function_start_offset:::0:::0
568*11efff7fSkettenis
569*11efff7fSkettenism::void:remote_translate_xfer_address:struct regcache *regcache, CORE_ADDR gdb_addr, int gdb_len, CORE_ADDR *rem_addr, int *rem_len:regcache, gdb_addr, gdb_len, rem_addr, rem_len::generic_remote_translate_xfer_address::0
570b725ae77Skettenis#
571*11efff7fSkettenisv:=:CORE_ADDR:frame_args_skip:::0:::0
572*11efff7fSkettenisM::CORE_ADDR:unwind_pc:struct frame_info *next_frame:next_frame
573*11efff7fSkettenisM::CORE_ADDR:unwind_sp:struct frame_info *next_frame:next_frame
574b725ae77Skettenis# DEPRECATED_FRAME_LOCALS_ADDRESS as been replaced by the per-frame
575b725ae77Skettenis# frame-base.  Enable frame-base before frame-unwind.
576*11efff7fSkettenisF:=:CORE_ADDR:deprecated_saved_pc_after_call:struct frame_info *frame:frame
577*11efff7fSkettenisF:=:int:frame_num_args:struct frame_info *frame:frame
578b725ae77Skettenis#
579b725ae77Skettenis# DEPRECATED_STACK_ALIGN has been replaced by an initial aligning call
580b725ae77Skettenis# to frame_align and the requirement that methods such as
581b725ae77Skettenis# push_dummy_call and frame_red_zone_size maintain correct stack/frame
582b725ae77Skettenis# alignment.
583*11efff7fSkettenisF:=:CORE_ADDR:deprecated_stack_align:CORE_ADDR sp:sp
584*11efff7fSkettenisM::CORE_ADDR:frame_align:CORE_ADDR address:address
585b725ae77Skettenis# DEPRECATED_REG_STRUCT_HAS_ADDR has been replaced by
586b725ae77Skettenis# stabs_argument_has_addr.
587*11efff7fSkettenisF:=:int:deprecated_reg_struct_has_addr:int gcc_p, struct type *type:gcc_p, type
588*11efff7fSkettenism::int:stabs_argument_has_addr:struct type *type:type::default_stabs_argument_has_addr::0
589*11efff7fSkettenisv:=:int:frame_red_zone_size
590b725ae77Skettenis#
591*11efff7fSkettenism::CORE_ADDR:convert_from_func_ptr_addr:CORE_ADDR addr, struct target_ops *targ:addr, targ::convert_from_func_ptr_addr_identity::0
592b725ae77Skettenis# On some machines there are bits in addresses which are not really
593b725ae77Skettenis# part of the address, but are used by the kernel, the hardware, etc.
594b725ae77Skettenis# for special purposes.  ADDR_BITS_REMOVE takes out any such bits so
595b725ae77Skettenis# we get a "real" address such as one would find in a symbol table.
596b725ae77Skettenis# This is used only for addresses of instructions, and even then I'm
597b725ae77Skettenis# not sure it's used in all contexts.  It exists to deal with there
598b725ae77Skettenis# being a few stray bits in the PC which would mislead us, not as some
599b725ae77Skettenis# sort of generic thing to handle alignment or segmentation (it's
600b725ae77Skettenis# possible it should be in TARGET_READ_PC instead).
601*11efff7fSkettenisf:=:CORE_ADDR:addr_bits_remove:CORE_ADDR addr:addr::core_addr_identity::0
602b725ae77Skettenis# It is not at all clear why SMASH_TEXT_ADDRESS is not folded into
603b725ae77Skettenis# ADDR_BITS_REMOVE.
604*11efff7fSkettenisf:=:CORE_ADDR:smash_text_address:CORE_ADDR addr:addr::core_addr_identity::0
605b725ae77Skettenis# FIXME/cagney/2001-01-18: This should be split in two.  A target method that indicates if
606b725ae77Skettenis# the target needs software single step.  An ISA method to implement it.
607b725ae77Skettenis#
608b725ae77Skettenis# FIXME/cagney/2001-01-18: This should be replaced with something that inserts breakpoints
609b725ae77Skettenis# using the breakpoint system instead of blatting memory directly (as with rs6000).
610b725ae77Skettenis#
611b725ae77Skettenis# FIXME/cagney/2001-01-18: The logic is backwards.  It should be asking if the target can
612b725ae77Skettenis# single step.  If not, then implement single step using breakpoints.
613*11efff7fSkettenisF:=:void:software_single_step:enum target_signal sig, int insert_breakpoints_p:sig, insert_breakpoints_p
614b725ae77Skettenis# FIXME: cagney/2003-08-28: Need to find a better way of selecting the
615*11efff7fSkettenis# disassembler.  Perhaps objdump can handle it?
616*11efff7fSkettenisf:TARGET_PRINT_INSN:int:print_insn:bfd_vma vma, struct disassemble_info *info:vma, info::0:
617*11efff7fSkettenisf:=:CORE_ADDR:skip_trampoline_code:CORE_ADDR pc:pc::generic_skip_trampoline_code::0
618b725ae77Skettenis
619b725ae77Skettenis
620b725ae77Skettenis# If IN_SOLIB_DYNSYM_RESOLVE_CODE returns true, and SKIP_SOLIB_RESOLVER
621b725ae77Skettenis# evaluates non-zero, this is the address where the debugger will place
622b725ae77Skettenis# a step-resume breakpoint to get us past the dynamic linker.
623*11efff7fSkettenism::CORE_ADDR:skip_solib_resolver:CORE_ADDR pc:pc::generic_skip_solib_resolver::0
624b725ae77Skettenis# For SVR4 shared libraries, each call goes through a small piece of
625b725ae77Skettenis# trampoline code in the ".plt" section.  IN_SOLIB_CALL_TRAMPOLINE evaluates
626b725ae77Skettenis# to nonzero if we are currently stopped in one of these.
627*11efff7fSkettenisf:=:int:in_solib_call_trampoline:CORE_ADDR pc, char *name:pc, name::generic_in_solib_call_trampoline::0
628b725ae77Skettenis
629b725ae77Skettenis# Some systems also have trampoline code for returning from shared libs.
630*11efff7fSkettenisf:=:int:in_solib_return_trampoline:CORE_ADDR pc, char *name:pc, name::generic_in_solib_return_trampoline::0
631b725ae77Skettenis
632b725ae77Skettenis# A target might have problems with watchpoints as soon as the stack
633b725ae77Skettenis# frame of the current function has been destroyed.  This mostly happens
634b725ae77Skettenis# as the first action in a funtion's epilogue.  in_function_epilogue_p()
635b725ae77Skettenis# is defined to return a non-zero value if either the given addr is one
636b725ae77Skettenis# instruction after the stack destroying instruction up to the trailing
637b725ae77Skettenis# return instruction or if we can figure out that the stack frame has
638b725ae77Skettenis# already been invalidated regardless of the value of addr.  Targets
639b725ae77Skettenis# which don't suffer from that problem could just let this functionality
640b725ae77Skettenis# untouched.
641*11efff7fSkettenism::int:in_function_epilogue_p:CORE_ADDR addr:addr:0:generic_in_function_epilogue_p::0
642b725ae77Skettenis# Given a vector of command-line arguments, return a newly allocated
643b725ae77Skettenis# string which, when passed to the create_inferior function, will be
644b725ae77Skettenis# parsed (on Unix systems, by the shell) to yield the same vector.
645b725ae77Skettenis# This function should call error() if the argument vector is not
646b725ae77Skettenis# representable for this target or if this target does not support
647b725ae77Skettenis# command-line arguments.
648b725ae77Skettenis# ARGC is the number of elements in the vector.
649b725ae77Skettenis# ARGV is an array of strings, one per argument.
650*11efff7fSkettenism::char *:construct_inferior_arguments:int argc, char **argv:argc, argv::construct_inferior_arguments::0
651*11efff7fSkettenisf:=:void:elf_make_msymbol_special:asymbol *sym, struct minimal_symbol *msym:sym, msym::default_elf_make_msymbol_special::0
652*11efff7fSkettenisf:=:void:coff_make_msymbol_special:int val, struct minimal_symbol *msym:val, msym::default_coff_make_msymbol_special::0
653*11efff7fSkettenisv:=:const char *:name_of_malloc:::"malloc":"malloc"::0:NAME_OF_MALLOC
654*11efff7fSkettenisv:=:int:cannot_step_breakpoint:::0:0::0
655*11efff7fSkettenisv:=:int:have_nonsteppable_watchpoint:::0:0::0
656*11efff7fSkettenisF:=:int:address_class_type_flags:int byte_size, int dwarf2_addr_class:byte_size, dwarf2_addr_class
657*11efff7fSkettenisM::const char *:address_class_type_flags_to_name:int type_flags:type_flags
658*11efff7fSkettenisM::int:address_class_name_to_type_flags:const char *name, int *type_flags_ptr:name, type_flags_ptr
659b725ae77Skettenis# Is a register in a group
660*11efff7fSkettenism::int:register_reggroup_p:int regnum, struct reggroup *reggroup:regnum, reggroup::default_register_reggroup_p::0
661b725ae77Skettenis# Fetch the pointer to the ith function argument.
662*11efff7fSkettenisF:=:CORE_ADDR:fetch_pointer_argument:struct frame_info *frame, int argi, struct type *type:frame, argi, type
663b725ae77Skettenis
664b725ae77Skettenis# Return the appropriate register set for a core file section with
665b725ae77Skettenis# name SECT_NAME and size SECT_SIZE.
666*11efff7fSkettenisM::const struct regset *:regset_from_core_section:const char *sect_name, size_t sect_size:sect_name, sect_size
667b725ae77SkettenisEOF
668b725ae77Skettenis}
669b725ae77Skettenis
670b725ae77Skettenis#
671b725ae77Skettenis# The .log file
672b725ae77Skettenis#
673b725ae77Skettenisexec > new-gdbarch.log
674b725ae77Skettenisfunction_list | while do_read
675b725ae77Skettenisdo
676b725ae77Skettenis    cat <<EOF
677*11efff7fSkettenis${class} ${returntype} ${function} ($formal)
678b725ae77SkettenisEOF
679b725ae77Skettenis    for r in ${read}
680b725ae77Skettenis    do
681b725ae77Skettenis	eval echo \"\ \ \ \ ${r}=\${${r}}\"
682b725ae77Skettenis    done
683b725ae77Skettenis    if class_is_predicate_p && fallback_default_p
684b725ae77Skettenis    then
685*11efff7fSkettenis	echo "Error: predicate function ${function} can not have a non- multi-arch default" 1>&2
686b725ae77Skettenis	kill $$
687b725ae77Skettenis	exit 1
688b725ae77Skettenis    fi
689b725ae77Skettenis    if [ "x${invalid_p}" = "x0" -a -n "${postdefault}" ]
690b725ae77Skettenis    then
691b725ae77Skettenis	echo "Error: postdefault is useless when invalid_p=0" 1>&2
692b725ae77Skettenis	kill $$
693b725ae77Skettenis	exit 1
694b725ae77Skettenis    fi
695b725ae77Skettenis    if class_is_multiarch_p
696b725ae77Skettenis    then
697b725ae77Skettenis	if class_is_predicate_p ; then :
698b725ae77Skettenis	elif test "x${predefault}" = "x"
699b725ae77Skettenis	then
700*11efff7fSkettenis	    echo "Error: pure multi-arch function ${function} must have a predefault" 1>&2
701b725ae77Skettenis	    kill $$
702b725ae77Skettenis	    exit 1
703b725ae77Skettenis	fi
704b725ae77Skettenis    fi
705b725ae77Skettenis    echo ""
706b725ae77Skettenisdone
707b725ae77Skettenis
708b725ae77Skettenisexec 1>&2
709b725ae77Sketteniscompare_new gdbarch.log
710b725ae77Skettenis
711b725ae77Skettenis
712b725ae77Sketteniscopyright ()
713b725ae77Skettenis{
714b725ae77Sketteniscat <<EOF
715b725ae77Skettenis/* *INDENT-OFF* */ /* THIS FILE IS GENERATED */
716b725ae77Skettenis
717b725ae77Skettenis/* Dynamic architecture support for GDB, the GNU debugger.
718b725ae77Skettenis
719b725ae77Skettenis   Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free
720b725ae77Skettenis   Software Foundation, Inc.
721b725ae77Skettenis
722b725ae77Skettenis   This file is part of GDB.
723b725ae77Skettenis
724b725ae77Skettenis   This program is free software; you can redistribute it and/or modify
725b725ae77Skettenis   it under the terms of the GNU General Public License as published by
726b725ae77Skettenis   the Free Software Foundation; either version 2 of the License, or
727b725ae77Skettenis   (at your option) any later version.
728b725ae77Skettenis
729b725ae77Skettenis   This program is distributed in the hope that it will be useful,
730b725ae77Skettenis   but WITHOUT ANY WARRANTY; without even the implied warranty of
731b725ae77Skettenis   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
732b725ae77Skettenis   GNU General Public License for more details.
733b725ae77Skettenis
734b725ae77Skettenis   You should have received a copy of the GNU General Public License
735b725ae77Skettenis   along with this program; if not, write to the Free Software
736b725ae77Skettenis   Foundation, Inc., 59 Temple Place - Suite 330,
737b725ae77Skettenis   Boston, MA 02111-1307, USA.  */
738b725ae77Skettenis
739b725ae77Skettenis/* This file was created with the aid of \`\`gdbarch.sh''.
740b725ae77Skettenis
741b725ae77Skettenis   The Bourne shell script \`\`gdbarch.sh'' creates the files
742b725ae77Skettenis   \`\`new-gdbarch.c'' and \`\`new-gdbarch.h and then compares them
743b725ae77Skettenis   against the existing \`\`gdbarch.[hc]''.  Any differences found
744b725ae77Skettenis   being reported.
745b725ae77Skettenis
746b725ae77Skettenis   If editing this file, please also run gdbarch.sh and merge any
747b725ae77Skettenis   changes into that script. Conversely, when making sweeping changes
748b725ae77Skettenis   to this file, modifying gdbarch.sh and using its output may prove
749b725ae77Skettenis   easier. */
750b725ae77Skettenis
751b725ae77SkettenisEOF
752b725ae77Skettenis}
753b725ae77Skettenis
754b725ae77Skettenis#
755b725ae77Skettenis# The .h file
756b725ae77Skettenis#
757b725ae77Skettenis
758b725ae77Skettenisexec > new-gdbarch.h
759b725ae77Sketteniscopyright
760b725ae77Sketteniscat <<EOF
761b725ae77Skettenis#ifndef GDBARCH_H
762b725ae77Skettenis#define GDBARCH_H
763b725ae77Skettenis
764b725ae77Skettenisstruct floatformat;
765b725ae77Skettenisstruct ui_file;
766b725ae77Skettenisstruct frame_info;
767b725ae77Skettenisstruct value;
768b725ae77Skettenisstruct objfile;
769b725ae77Skettenisstruct minimal_symbol;
770b725ae77Skettenisstruct regcache;
771b725ae77Skettenisstruct reggroup;
772b725ae77Skettenisstruct regset;
773b725ae77Skettenisstruct disassemble_info;
774b725ae77Skettenisstruct target_ops;
775*11efff7fSkettenisstruct obstack;
776b725ae77Skettenis
777b725ae77Skettenisextern struct gdbarch *current_gdbarch;
778b725ae77SkettenisEOF
779b725ae77Skettenis
780b725ae77Skettenis# function typedef's
781b725ae77Skettenisprintf "\n"
782b725ae77Skettenisprintf "\n"
783b725ae77Skettenisprintf "/* The following are pre-initialized by GDBARCH. */\n"
784b725ae77Skettenisfunction_list | while do_read
785b725ae77Skettenisdo
786b725ae77Skettenis    if class_is_info_p
787b725ae77Skettenis    then
788b725ae77Skettenis	printf "\n"
789b725ae77Skettenis	printf "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);\n"
790b725ae77Skettenis	printf "/* set_gdbarch_${function}() - not applicable - pre-initialized. */\n"
791*11efff7fSkettenis	if test -n "${macro}"
792*11efff7fSkettenis	then
793*11efff7fSkettenis	    printf "#if !defined (GDB_TM_FILE) && defined (${macro})\n"
794b725ae77Skettenis	    printf "#error \"Non multi-arch definition of ${macro}\"\n"
795b725ae77Skettenis	    printf "#endif\n"
796b725ae77Skettenis	    printf "#if !defined (${macro})\n"
797b725ae77Skettenis	    printf "#define ${macro} (gdbarch_${function} (current_gdbarch))\n"
798b725ae77Skettenis	    printf "#endif\n"
799b725ae77Skettenis	fi
800*11efff7fSkettenis    fi
801b725ae77Skettenisdone
802b725ae77Skettenis
803b725ae77Skettenis# function typedef's
804b725ae77Skettenisprintf "\n"
805b725ae77Skettenisprintf "\n"
806b725ae77Skettenisprintf "/* The following are initialized by the target dependent code. */\n"
807b725ae77Skettenisfunction_list | while do_read
808b725ae77Skettenisdo
809b725ae77Skettenis    if [ -n "${comment}" ]
810b725ae77Skettenis    then
811b725ae77Skettenis	echo "${comment}" | sed \
812b725ae77Skettenis	    -e '2 s,#,/*,' \
813b725ae77Skettenis	    -e '3,$ s,#,  ,' \
814b725ae77Skettenis	    -e '$ s,$, */,'
815b725ae77Skettenis    fi
816*11efff7fSkettenis
817b725ae77Skettenis    if class_is_predicate_p
818b725ae77Skettenis    then
819*11efff7fSkettenis	if test -n "${macro}"
820b725ae77Skettenis	then
821b725ae77Skettenis	    printf "\n"
822b725ae77Skettenis	    printf "#if defined (${macro})\n"
823b725ae77Skettenis	    printf "/* Legacy for systems yet to multi-arch ${macro} */\n"
824b725ae77Skettenis	    printf "#if !defined (${macro}_P)\n"
825b725ae77Skettenis	    printf "#define ${macro}_P() (1)\n"
826b725ae77Skettenis	    printf "#endif\n"
827b725ae77Skettenis	    printf "#endif\n"
828*11efff7fSkettenis	fi
829b725ae77Skettenis	printf "\n"
830b725ae77Skettenis	printf "extern int gdbarch_${function}_p (struct gdbarch *gdbarch);\n"
831*11efff7fSkettenis	if test -n "${macro}"
832*11efff7fSkettenis	then
833*11efff7fSkettenis	    printf "#if !defined (GDB_TM_FILE) && defined (${macro}_P)\n"
834b725ae77Skettenis	    printf "#error \"Non multi-arch definition of ${macro}\"\n"
835b725ae77Skettenis	    printf "#endif\n"
836*11efff7fSkettenis	    printf "#if !defined (${macro}_P)\n"
837b725ae77Skettenis	    printf "#define ${macro}_P() (gdbarch_${function}_p (current_gdbarch))\n"
838b725ae77Skettenis	    printf "#endif\n"
839b725ae77Skettenis	fi
840b725ae77Skettenis    fi
841b725ae77Skettenis    if class_is_variable_p
842b725ae77Skettenis    then
843b725ae77Skettenis	printf "\n"
844b725ae77Skettenis	printf "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);\n"
845b725ae77Skettenis	printf "extern void set_gdbarch_${function} (struct gdbarch *gdbarch, ${returntype} ${function});\n"
846*11efff7fSkettenis	if test -n "${macro}"
847*11efff7fSkettenis	then
848*11efff7fSkettenis	    printf "#if !defined (GDB_TM_FILE) && defined (${macro})\n"
849b725ae77Skettenis	    printf "#error \"Non multi-arch definition of ${macro}\"\n"
850b725ae77Skettenis	    printf "#endif\n"
851b725ae77Skettenis	    printf "#if !defined (${macro})\n"
852b725ae77Skettenis	    printf "#define ${macro} (gdbarch_${function} (current_gdbarch))\n"
853b725ae77Skettenis	    printf "#endif\n"
854b725ae77Skettenis	fi
855*11efff7fSkettenis    fi
856b725ae77Skettenis    if class_is_function_p
857b725ae77Skettenis    then
858b725ae77Skettenis	printf "\n"
859b725ae77Skettenis	if [ "x${formal}" = "xvoid" ] && class_is_multiarch_p
860b725ae77Skettenis	then
861b725ae77Skettenis	    printf "typedef ${returntype} (gdbarch_${function}_ftype) (struct gdbarch *gdbarch);\n"
862b725ae77Skettenis	elif class_is_multiarch_p
863b725ae77Skettenis	then
864b725ae77Skettenis	    printf "typedef ${returntype} (gdbarch_${function}_ftype) (struct gdbarch *gdbarch, ${formal});\n"
865b725ae77Skettenis	else
866b725ae77Skettenis	    printf "typedef ${returntype} (gdbarch_${function}_ftype) (${formal});\n"
867b725ae77Skettenis	fi
868b725ae77Skettenis	if [ "x${formal}" = "xvoid" ]
869b725ae77Skettenis	then
870b725ae77Skettenis	  printf "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);\n"
871b725ae77Skettenis	else
872b725ae77Skettenis	  printf "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch, ${formal});\n"
873b725ae77Skettenis	fi
874b725ae77Skettenis	printf "extern void set_gdbarch_${function} (struct gdbarch *gdbarch, gdbarch_${function}_ftype *${function});\n"
875*11efff7fSkettenis	if test -n "${macro}"
876*11efff7fSkettenis	then
877*11efff7fSkettenis	    printf "#if !defined (GDB_TM_FILE) && defined (${macro})\n"
878b725ae77Skettenis	    printf "#error \"Non multi-arch definition of ${macro}\"\n"
879b725ae77Skettenis	    printf "#endif\n"
880b725ae77Skettenis	    if [ "x${actual}" = "x" ]
881b725ae77Skettenis	    then
882b725ae77Skettenis		d="#define ${macro}() (gdbarch_${function} (current_gdbarch))"
883b725ae77Skettenis	    elif [ "x${actual}" = "x-" ]
884b725ae77Skettenis	    then
885b725ae77Skettenis		d="#define ${macro} (gdbarch_${function} (current_gdbarch))"
886b725ae77Skettenis	    else
887b725ae77Skettenis		d="#define ${macro}(${actual}) (gdbarch_${function} (current_gdbarch, ${actual}))"
888b725ae77Skettenis	    fi
889b725ae77Skettenis	    printf "#if !defined (${macro})\n"
890b725ae77Skettenis	    if [ "x${actual}" = "x" ]
891b725ae77Skettenis	    then
892b725ae77Skettenis		printf "#define ${macro}() (gdbarch_${function} (current_gdbarch))\n"
893b725ae77Skettenis	    elif [ "x${actual}" = "x-" ]
894b725ae77Skettenis	    then
895b725ae77Skettenis		printf "#define ${macro} (gdbarch_${function} (current_gdbarch))\n"
896b725ae77Skettenis	    else
897b725ae77Skettenis		printf "#define ${macro}(${actual}) (gdbarch_${function} (current_gdbarch, ${actual}))\n"
898b725ae77Skettenis	    fi
899b725ae77Skettenis	    printf "#endif\n"
900b725ae77Skettenis	fi
901b725ae77Skettenis    fi
902b725ae77Skettenisdone
903b725ae77Skettenis
904b725ae77Skettenis# close it off
905b725ae77Sketteniscat <<EOF
906b725ae77Skettenis
907b725ae77Skettenisextern struct gdbarch_tdep *gdbarch_tdep (struct gdbarch *gdbarch);
908b725ae77Skettenis
909b725ae77Skettenis
910b725ae77Skettenis/* Mechanism for co-ordinating the selection of a specific
911b725ae77Skettenis   architecture.
912b725ae77Skettenis
913b725ae77Skettenis   GDB targets (*-tdep.c) can register an interest in a specific
914b725ae77Skettenis   architecture.  Other GDB components can register a need to maintain
915b725ae77Skettenis   per-architecture data.
916b725ae77Skettenis
917b725ae77Skettenis   The mechanisms below ensures that there is only a loose connection
918b725ae77Skettenis   between the set-architecture command and the various GDB
919b725ae77Skettenis   components.  Each component can independently register their need
920b725ae77Skettenis   to maintain architecture specific data with gdbarch.
921b725ae77Skettenis
922b725ae77Skettenis   Pragmatics:
923b725ae77Skettenis
924b725ae77Skettenis   Previously, a single TARGET_ARCHITECTURE_HOOK was provided.  It
925b725ae77Skettenis   didn't scale.
926b725ae77Skettenis
927b725ae77Skettenis   The more traditional mega-struct containing architecture specific
928b725ae77Skettenis   data for all the various GDB components was also considered.  Since
929b725ae77Skettenis   GDB is built from a variable number of (fairly independent)
930b725ae77Skettenis   components it was determined that the global aproach was not
931b725ae77Skettenis   applicable. */
932b725ae77Skettenis
933b725ae77Skettenis
934b725ae77Skettenis/* Register a new architectural family with GDB.
935b725ae77Skettenis
936b725ae77Skettenis   Register support for the specified ARCHITECTURE with GDB.  When
937b725ae77Skettenis   gdbarch determines that the specified architecture has been
938b725ae77Skettenis   selected, the corresponding INIT function is called.
939b725ae77Skettenis
940b725ae77Skettenis   --
941b725ae77Skettenis
942b725ae77Skettenis   The INIT function takes two parameters: INFO which contains the
943b725ae77Skettenis   information available to gdbarch about the (possibly new)
944b725ae77Skettenis   architecture; ARCHES which is a list of the previously created
945b725ae77Skettenis   \`\`struct gdbarch'' for this architecture.
946b725ae77Skettenis
947b725ae77Skettenis   The INFO parameter is, as far as possible, be pre-initialized with
948b725ae77Skettenis   information obtained from INFO.ABFD or the previously selected
949b725ae77Skettenis   architecture.
950b725ae77Skettenis
951b725ae77Skettenis   The ARCHES parameter is a linked list (sorted most recently used)
952b725ae77Skettenis   of all the previously created architures for this architecture
953b725ae77Skettenis   family.  The (possibly NULL) ARCHES->gdbarch can used to access
954b725ae77Skettenis   values from the previously selected architecture for this
955b725ae77Skettenis   architecture family.  The global \`\`current_gdbarch'' shall not be
956b725ae77Skettenis   used.
957b725ae77Skettenis
958b725ae77Skettenis   The INIT function shall return any of: NULL - indicating that it
959b725ae77Skettenis   doesn't recognize the selected architecture; an existing \`\`struct
960b725ae77Skettenis   gdbarch'' from the ARCHES list - indicating that the new
961b725ae77Skettenis   architecture is just a synonym for an earlier architecture (see
962b725ae77Skettenis   gdbarch_list_lookup_by_info()); a newly created \`\`struct gdbarch''
963b725ae77Skettenis   - that describes the selected architecture (see gdbarch_alloc()).
964b725ae77Skettenis
965b725ae77Skettenis   The DUMP_TDEP function shall print out all target specific values.
966b725ae77Skettenis   Care should be taken to ensure that the function works in both the
967b725ae77Skettenis   multi-arch and non- multi-arch cases. */
968b725ae77Skettenis
969b725ae77Skettenisstruct gdbarch_list
970b725ae77Skettenis{
971b725ae77Skettenis  struct gdbarch *gdbarch;
972b725ae77Skettenis  struct gdbarch_list *next;
973b725ae77Skettenis};
974b725ae77Skettenis
975b725ae77Skettenisstruct gdbarch_info
976b725ae77Skettenis{
977b725ae77Skettenis  /* Use default: NULL (ZERO). */
978b725ae77Skettenis  const struct bfd_arch_info *bfd_arch_info;
979b725ae77Skettenis
980b725ae77Skettenis  /* Use default: BFD_ENDIAN_UNKNOWN (NB: is not ZERO).  */
981b725ae77Skettenis  int byte_order;
982b725ae77Skettenis
983b725ae77Skettenis  /* Use default: NULL (ZERO). */
984b725ae77Skettenis  bfd *abfd;
985b725ae77Skettenis
986b725ae77Skettenis  /* Use default: NULL (ZERO). */
987b725ae77Skettenis  struct gdbarch_tdep_info *tdep_info;
988b725ae77Skettenis
989b725ae77Skettenis  /* Use default: GDB_OSABI_UNINITIALIZED (-1).  */
990b725ae77Skettenis  enum gdb_osabi osabi;
991b725ae77Skettenis};
992b725ae77Skettenis
993b725ae77Skettenistypedef struct gdbarch *(gdbarch_init_ftype) (struct gdbarch_info info, struct gdbarch_list *arches);
994b725ae77Skettenistypedef void (gdbarch_dump_tdep_ftype) (struct gdbarch *gdbarch, struct ui_file *file);
995b725ae77Skettenis
996b725ae77Skettenis/* DEPRECATED - use gdbarch_register() */
997b725ae77Skettenisextern void register_gdbarch_init (enum bfd_architecture architecture, gdbarch_init_ftype *);
998b725ae77Skettenis
999b725ae77Skettenisextern void gdbarch_register (enum bfd_architecture architecture,
1000b725ae77Skettenis                              gdbarch_init_ftype *,
1001b725ae77Skettenis                              gdbarch_dump_tdep_ftype *);
1002b725ae77Skettenis
1003b725ae77Skettenis
1004b725ae77Skettenis/* Return a freshly allocated, NULL terminated, array of the valid
1005b725ae77Skettenis   architecture names.  Since architectures are registered during the
1006b725ae77Skettenis   _initialize phase this function only returns useful information
1007b725ae77Skettenis   once initialization has been completed. */
1008b725ae77Skettenis
1009b725ae77Skettenisextern const char **gdbarch_printable_names (void);
1010b725ae77Skettenis
1011b725ae77Skettenis
1012b725ae77Skettenis/* Helper function.  Search the list of ARCHES for a GDBARCH that
1013b725ae77Skettenis   matches the information provided by INFO. */
1014b725ae77Skettenis
1015b725ae77Skettenisextern struct gdbarch_list *gdbarch_list_lookup_by_info (struct gdbarch_list *arches,  const struct gdbarch_info *info);
1016b725ae77Skettenis
1017b725ae77Skettenis
1018b725ae77Skettenis/* Helper function.  Create a preliminary \`\`struct gdbarch''.  Perform
1019b725ae77Skettenis   basic initialization using values obtained from the INFO andTDEP
1020b725ae77Skettenis   parameters.  set_gdbarch_*() functions are called to complete the
1021b725ae77Skettenis   initialization of the object. */
1022b725ae77Skettenis
1023b725ae77Skettenisextern struct gdbarch *gdbarch_alloc (const struct gdbarch_info *info, struct gdbarch_tdep *tdep);
1024b725ae77Skettenis
1025b725ae77Skettenis
1026b725ae77Skettenis/* Helper function.  Free a partially-constructed \`\`struct gdbarch''.
1027b725ae77Skettenis   It is assumed that the caller freeds the \`\`struct
1028b725ae77Skettenis   gdbarch_tdep''. */
1029b725ae77Skettenis
1030b725ae77Skettenisextern void gdbarch_free (struct gdbarch *);
1031b725ae77Skettenis
1032b725ae77Skettenis
1033b725ae77Skettenis/* Helper function.  Allocate memory from the \`\`struct gdbarch''
1034b725ae77Skettenis   obstack.  The memory is freed when the corresponding architecture
1035b725ae77Skettenis   is also freed.  */
1036b725ae77Skettenis
1037b725ae77Skettenisextern void *gdbarch_obstack_zalloc (struct gdbarch *gdbarch, long size);
1038b725ae77Skettenis#define GDBARCH_OBSTACK_CALLOC(GDBARCH, NR, TYPE) ((TYPE *) gdbarch_obstack_zalloc ((GDBARCH), (NR) * sizeof (TYPE)))
1039b725ae77Skettenis#define GDBARCH_OBSTACK_ZALLOC(GDBARCH, TYPE) ((TYPE *) gdbarch_obstack_zalloc ((GDBARCH), sizeof (TYPE)))
1040b725ae77Skettenis
1041b725ae77Skettenis
1042b725ae77Skettenis/* Helper function. Force an update of the current architecture.
1043b725ae77Skettenis
1044b725ae77Skettenis   The actual architecture selected is determined by INFO, \`\`(gdb) set
1045b725ae77Skettenis   architecture'' et.al., the existing architecture and BFD's default
1046b725ae77Skettenis   architecture.  INFO should be initialized to zero and then selected
1047b725ae77Skettenis   fields should be updated.
1048b725ae77Skettenis
1049b725ae77Skettenis   Returns non-zero if the update succeeds */
1050b725ae77Skettenis
1051b725ae77Skettenisextern int gdbarch_update_p (struct gdbarch_info info);
1052b725ae77Skettenis
1053b725ae77Skettenis
1054b725ae77Skettenis/* Helper function.  Find an architecture matching info.
1055b725ae77Skettenis
1056b725ae77Skettenis   INFO should be initialized using gdbarch_info_init, relevant fields
1057b725ae77Skettenis   set, and then finished using gdbarch_info_fill.
1058b725ae77Skettenis
1059b725ae77Skettenis   Returns the corresponding architecture, or NULL if no matching
1060b725ae77Skettenis   architecture was found.  "current_gdbarch" is not updated.  */
1061b725ae77Skettenis
1062b725ae77Skettenisextern struct gdbarch *gdbarch_find_by_info (struct gdbarch_info info);
1063b725ae77Skettenis
1064b725ae77Skettenis
1065b725ae77Skettenis/* Helper function.  Set the global "current_gdbarch" to "gdbarch".
1066b725ae77Skettenis
1067b725ae77Skettenis   FIXME: kettenis/20031124: Of the functions that follow, only
1068b725ae77Skettenis   gdbarch_from_bfd is supposed to survive.  The others will
1069b725ae77Skettenis   dissappear since in the future GDB will (hopefully) be truly
1070b725ae77Skettenis   multi-arch.  However, for now we're still stuck with the concept of
1071b725ae77Skettenis   a single active architecture.  */
1072b725ae77Skettenis
1073b725ae77Skettenisextern void deprecated_current_gdbarch_select_hack (struct gdbarch *gdbarch);
1074b725ae77Skettenis
1075b725ae77Skettenis
1076b725ae77Skettenis/* Register per-architecture data-pointer.
1077b725ae77Skettenis
1078b725ae77Skettenis   Reserve space for a per-architecture data-pointer.  An identifier
1079b725ae77Skettenis   for the reserved data-pointer is returned.  That identifer should
1080b725ae77Skettenis   be saved in a local static variable.
1081b725ae77Skettenis
1082b725ae77Skettenis   Memory for the per-architecture data shall be allocated using
1083b725ae77Skettenis   gdbarch_obstack_zalloc.  That memory will be deleted when the
1084b725ae77Skettenis   corresponding architecture object is deleted.
1085b725ae77Skettenis
1086b725ae77Skettenis   When a previously created architecture is re-selected, the
1087b725ae77Skettenis   per-architecture data-pointer for that previous architecture is
1088b725ae77Skettenis   restored.  INIT() is not re-called.
1089b725ae77Skettenis
1090b725ae77Skettenis   Multiple registrarants for any architecture are allowed (and
1091b725ae77Skettenis   strongly encouraged).  */
1092b725ae77Skettenis
1093b725ae77Skettenisstruct gdbarch_data;
1094b725ae77Skettenis
1095*11efff7fSkettenistypedef void *(gdbarch_data_pre_init_ftype) (struct obstack *obstack);
1096*11efff7fSkettenisextern struct gdbarch_data *gdbarch_data_register_pre_init (gdbarch_data_pre_init_ftype *init);
1097*11efff7fSkettenistypedef void *(gdbarch_data_post_init_ftype) (struct gdbarch *gdbarch);
1098*11efff7fSkettenisextern struct gdbarch_data *gdbarch_data_register_post_init (gdbarch_data_post_init_ftype *init);
1099*11efff7fSkettenisextern void deprecated_set_gdbarch_data (struct gdbarch *gdbarch,
1100b725ae77Skettenis                                         struct gdbarch_data *data,
1101b725ae77Skettenis			                 void *pointer);
1102b725ae77Skettenis
1103b725ae77Skettenisextern void *gdbarch_data (struct gdbarch *gdbarch, struct gdbarch_data *);
1104b725ae77Skettenis
1105b725ae77Skettenis
1106b725ae77Skettenis
1107b725ae77Skettenis/* Register per-architecture memory region.
1108b725ae77Skettenis
1109b725ae77Skettenis   Provide a memory-region swap mechanism.  Per-architecture memory
1110b725ae77Skettenis   region are created.  These memory regions are swapped whenever the
1111b725ae77Skettenis   architecture is changed.  For a new architecture, the memory region
1112b725ae77Skettenis   is initialized with zero (0) and the INIT function is called.
1113b725ae77Skettenis
1114b725ae77Skettenis   Memory regions are swapped / initialized in the order that they are
1115b725ae77Skettenis   registered.  NULL DATA and/or INIT values can be specified.
1116b725ae77Skettenis
1117*11efff7fSkettenis   New code should use gdbarch_data_register_*(). */
1118b725ae77Skettenis
1119b725ae77Skettenistypedef void (gdbarch_swap_ftype) (void);
1120b725ae77Skettenisextern void deprecated_register_gdbarch_swap (void *data, unsigned long size, gdbarch_swap_ftype *init);
1121b725ae77Skettenis#define DEPRECATED_REGISTER_GDBARCH_SWAP(VAR) deprecated_register_gdbarch_swap (&(VAR), sizeof ((VAR)), NULL)
1122b725ae77Skettenis
1123b725ae77Skettenis
1124b725ae77Skettenis
1125b725ae77Skettenis/* Set the dynamic target-system-dependent parameters (architecture,
1126b725ae77Skettenis   byte-order, ...) using information found in the BFD */
1127b725ae77Skettenis
1128b725ae77Skettenisextern void set_gdbarch_from_file (bfd *);
1129b725ae77Skettenis
1130b725ae77Skettenis
1131b725ae77Skettenis/* Initialize the current architecture to the "first" one we find on
1132b725ae77Skettenis   our list.  */
1133b725ae77Skettenis
1134b725ae77Skettenisextern void initialize_current_architecture (void);
1135b725ae77Skettenis
1136b725ae77Skettenis/* gdbarch trace variable */
1137b725ae77Skettenisextern int gdbarch_debug;
1138b725ae77Skettenis
1139b725ae77Skettenisextern void gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file);
1140b725ae77Skettenis
1141b725ae77Skettenis#endif
1142b725ae77SkettenisEOF
1143b725ae77Skettenisexec 1>&2
1144b725ae77Skettenis#../move-if-change new-gdbarch.h gdbarch.h
1145b725ae77Sketteniscompare_new gdbarch.h
1146b725ae77Skettenis
1147b725ae77Skettenis
1148b725ae77Skettenis#
1149b725ae77Skettenis# C file
1150b725ae77Skettenis#
1151b725ae77Skettenis
1152b725ae77Skettenisexec > new-gdbarch.c
1153b725ae77Sketteniscopyright
1154b725ae77Sketteniscat <<EOF
1155b725ae77Skettenis
1156b725ae77Skettenis#include "defs.h"
1157b725ae77Skettenis#include "arch-utils.h"
1158b725ae77Skettenis
1159b725ae77Skettenis#include "gdbcmd.h"
1160b725ae77Skettenis#include "inferior.h" /* enum CALL_DUMMY_LOCATION et.al. */
1161b725ae77Skettenis#include "symcat.h"
1162b725ae77Skettenis
1163b725ae77Skettenis#include "floatformat.h"
1164b725ae77Skettenis
1165b725ae77Skettenis#include "gdb_assert.h"
1166b725ae77Skettenis#include "gdb_string.h"
1167b725ae77Skettenis#include "gdb-events.h"
1168b725ae77Skettenis#include "reggroups.h"
1169b725ae77Skettenis#include "osabi.h"
1170b725ae77Skettenis#include "gdb_obstack.h"
1171b725ae77Skettenis
1172b725ae77Skettenis/* Static function declarations */
1173b725ae77Skettenis
1174b725ae77Skettenisstatic void alloc_gdbarch_data (struct gdbarch *);
1175b725ae77Skettenis
1176b725ae77Skettenis/* Non-zero if we want to trace architecture code.  */
1177b725ae77Skettenis
1178b725ae77Skettenis#ifndef GDBARCH_DEBUG
1179b725ae77Skettenis#define GDBARCH_DEBUG 0
1180b725ae77Skettenis#endif
1181b725ae77Skettenisint gdbarch_debug = GDBARCH_DEBUG;
1182b725ae77Skettenis
1183*11efff7fSkettenisstatic const char *
1184*11efff7fSkettenispformat (const struct floatformat *format)
1185*11efff7fSkettenis{
1186*11efff7fSkettenis  if (format == NULL)
1187*11efff7fSkettenis    return "(null)";
1188*11efff7fSkettenis  else
1189*11efff7fSkettenis    return  format->name;
1190*11efff7fSkettenis}
1191*11efff7fSkettenis
1192b725ae77SkettenisEOF
1193b725ae77Skettenis
1194b725ae77Skettenis# gdbarch open the gdbarch object
1195b725ae77Skettenisprintf "\n"
1196b725ae77Skettenisprintf "/* Maintain the struct gdbarch object */\n"
1197b725ae77Skettenisprintf "\n"
1198b725ae77Skettenisprintf "struct gdbarch\n"
1199b725ae77Skettenisprintf "{\n"
1200b725ae77Skettenisprintf "  /* Has this architecture been fully initialized?  */\n"
1201b725ae77Skettenisprintf "  int initialized_p;\n"
1202b725ae77Skettenisprintf "\n"
1203b725ae77Skettenisprintf "  /* An obstack bound to the lifetime of the architecture.  */\n"
1204b725ae77Skettenisprintf "  struct obstack *obstack;\n"
1205b725ae77Skettenisprintf "\n"
1206b725ae77Skettenisprintf "  /* basic architectural information */\n"
1207b725ae77Skettenisfunction_list | while do_read
1208b725ae77Skettenisdo
1209b725ae77Skettenis    if class_is_info_p
1210b725ae77Skettenis    then
1211b725ae77Skettenis	printf "  ${returntype} ${function};\n"
1212b725ae77Skettenis    fi
1213b725ae77Skettenisdone
1214b725ae77Skettenisprintf "\n"
1215b725ae77Skettenisprintf "  /* target specific vector. */\n"
1216b725ae77Skettenisprintf "  struct gdbarch_tdep *tdep;\n"
1217b725ae77Skettenisprintf "  gdbarch_dump_tdep_ftype *dump_tdep;\n"
1218b725ae77Skettenisprintf "\n"
1219b725ae77Skettenisprintf "  /* per-architecture data-pointers */\n"
1220b725ae77Skettenisprintf "  unsigned nr_data;\n"
1221b725ae77Skettenisprintf "  void **data;\n"
1222b725ae77Skettenisprintf "\n"
1223b725ae77Skettenisprintf "  /* per-architecture swap-regions */\n"
1224b725ae77Skettenisprintf "  struct gdbarch_swap *swap;\n"
1225b725ae77Skettenisprintf "\n"
1226b725ae77Sketteniscat <<EOF
1227b725ae77Skettenis  /* Multi-arch values.
1228b725ae77Skettenis
1229b725ae77Skettenis     When extending this structure you must:
1230b725ae77Skettenis
1231b725ae77Skettenis     Add the field below.
1232b725ae77Skettenis
1233b725ae77Skettenis     Declare set/get functions and define the corresponding
1234b725ae77Skettenis     macro in gdbarch.h.
1235b725ae77Skettenis
1236b725ae77Skettenis     gdbarch_alloc(): If zero/NULL is not a suitable default,
1237b725ae77Skettenis     initialize the new field.
1238b725ae77Skettenis
1239b725ae77Skettenis     verify_gdbarch(): Confirm that the target updated the field
1240b725ae77Skettenis     correctly.
1241b725ae77Skettenis
1242b725ae77Skettenis     gdbarch_dump(): Add a fprintf_unfiltered call so that the new
1243b725ae77Skettenis     field is dumped out
1244b725ae77Skettenis
1245b725ae77Skettenis     \`\`startup_gdbarch()'': Append an initial value to the static
1246b725ae77Skettenis     variable (base values on the host's c-type system).
1247b725ae77Skettenis
1248b725ae77Skettenis     get_gdbarch(): Implement the set/get functions (probably using
1249b725ae77Skettenis     the macro's as shortcuts).
1250b725ae77Skettenis
1251b725ae77Skettenis     */
1252b725ae77Skettenis
1253b725ae77SkettenisEOF
1254b725ae77Skettenisfunction_list | while do_read
1255b725ae77Skettenisdo
1256b725ae77Skettenis    if class_is_variable_p
1257b725ae77Skettenis    then
1258b725ae77Skettenis	printf "  ${returntype} ${function};\n"
1259b725ae77Skettenis    elif class_is_function_p
1260b725ae77Skettenis    then
1261*11efff7fSkettenis	printf "  gdbarch_${function}_ftype *${function};\n"
1262b725ae77Skettenis    fi
1263b725ae77Skettenisdone
1264b725ae77Skettenisprintf "};\n"
1265b725ae77Skettenis
1266b725ae77Skettenis# A pre-initialized vector
1267b725ae77Skettenisprintf "\n"
1268b725ae77Skettenisprintf "\n"
1269b725ae77Sketteniscat <<EOF
1270b725ae77Skettenis/* The default architecture uses host values (for want of a better
1271b725ae77Skettenis   choice). */
1272b725ae77SkettenisEOF
1273b725ae77Skettenisprintf "\n"
1274b725ae77Skettenisprintf "extern const struct bfd_arch_info bfd_default_arch_struct;\n"
1275b725ae77Skettenisprintf "\n"
1276b725ae77Skettenisprintf "struct gdbarch startup_gdbarch =\n"
1277b725ae77Skettenisprintf "{\n"
1278b725ae77Skettenisprintf "  1, /* Always initialized.  */\n"
1279b725ae77Skettenisprintf "  NULL, /* The obstack.  */\n"
1280b725ae77Skettenisprintf "  /* basic architecture information */\n"
1281b725ae77Skettenisfunction_list | while do_read
1282b725ae77Skettenisdo
1283b725ae77Skettenis    if class_is_info_p
1284b725ae77Skettenis    then
1285b725ae77Skettenis	printf "  ${staticdefault},  /* ${function} */\n"
1286b725ae77Skettenis    fi
1287b725ae77Skettenisdone
1288b725ae77Sketteniscat <<EOF
1289b725ae77Skettenis  /* target specific vector and its dump routine */
1290b725ae77Skettenis  NULL, NULL,
1291b725ae77Skettenis  /*per-architecture data-pointers and swap regions */
1292b725ae77Skettenis  0, NULL, NULL,
1293b725ae77Skettenis  /* Multi-arch values */
1294b725ae77SkettenisEOF
1295b725ae77Skettenisfunction_list | while do_read
1296b725ae77Skettenisdo
1297b725ae77Skettenis    if class_is_function_p || class_is_variable_p
1298b725ae77Skettenis    then
1299b725ae77Skettenis	printf "  ${staticdefault},  /* ${function} */\n"
1300b725ae77Skettenis    fi
1301b725ae77Skettenisdone
1302b725ae77Sketteniscat <<EOF
1303b725ae77Skettenis  /* startup_gdbarch() */
1304b725ae77Skettenis};
1305b725ae77Skettenis
1306b725ae77Skettenisstruct gdbarch *current_gdbarch = &startup_gdbarch;
1307b725ae77SkettenisEOF
1308b725ae77Skettenis
1309b725ae77Skettenis# Create a new gdbarch struct
1310b725ae77Sketteniscat <<EOF
1311b725ae77Skettenis
1312b725ae77Skettenis/* Create a new \`\`struct gdbarch'' based on information provided by
1313b725ae77Skettenis   \`\`struct gdbarch_info''. */
1314b725ae77SkettenisEOF
1315b725ae77Skettenisprintf "\n"
1316b725ae77Sketteniscat <<EOF
1317b725ae77Skettenisstruct gdbarch *
1318b725ae77Skettenisgdbarch_alloc (const struct gdbarch_info *info,
1319b725ae77Skettenis               struct gdbarch_tdep *tdep)
1320b725ae77Skettenis{
1321b725ae77Skettenis  /* NOTE: The new architecture variable is named \`\`current_gdbarch''
1322b725ae77Skettenis     so that macros such as TARGET_DOUBLE_BIT, when expanded, refer to
1323b725ae77Skettenis     the current local architecture and not the previous global
1324b725ae77Skettenis     architecture.  This ensures that the new architectures initial
1325b725ae77Skettenis     values are not influenced by the previous architecture.  Once
1326b725ae77Skettenis     everything is parameterised with gdbarch, this will go away.  */
1327b725ae77Skettenis  struct gdbarch *current_gdbarch;
1328b725ae77Skettenis
1329b725ae77Skettenis  /* Create an obstack for allocating all the per-architecture memory,
1330b725ae77Skettenis     then use that to allocate the architecture vector.  */
1331b725ae77Skettenis  struct obstack *obstack = XMALLOC (struct obstack);
1332b725ae77Skettenis  obstack_init (obstack);
1333b725ae77Skettenis  current_gdbarch = obstack_alloc (obstack, sizeof (*current_gdbarch));
1334b725ae77Skettenis  memset (current_gdbarch, 0, sizeof (*current_gdbarch));
1335b725ae77Skettenis  current_gdbarch->obstack = obstack;
1336b725ae77Skettenis
1337b725ae77Skettenis  alloc_gdbarch_data (current_gdbarch);
1338b725ae77Skettenis
1339b725ae77Skettenis  current_gdbarch->tdep = tdep;
1340b725ae77SkettenisEOF
1341b725ae77Skettenisprintf "\n"
1342b725ae77Skettenisfunction_list | while do_read
1343b725ae77Skettenisdo
1344b725ae77Skettenis    if class_is_info_p
1345b725ae77Skettenis    then
1346b725ae77Skettenis	printf "  current_gdbarch->${function} = info->${function};\n"
1347b725ae77Skettenis    fi
1348b725ae77Skettenisdone
1349b725ae77Skettenisprintf "\n"
1350b725ae77Skettenisprintf "  /* Force the explicit initialization of these. */\n"
1351b725ae77Skettenisfunction_list | while do_read
1352b725ae77Skettenisdo
1353b725ae77Skettenis    if class_is_function_p || class_is_variable_p
1354b725ae77Skettenis    then
1355b725ae77Skettenis	if [ -n "${predefault}" -a "x${predefault}" != "x0" ]
1356b725ae77Skettenis	then
1357b725ae77Skettenis	  printf "  current_gdbarch->${function} = ${predefault};\n"
1358b725ae77Skettenis	fi
1359b725ae77Skettenis    fi
1360b725ae77Skettenisdone
1361b725ae77Sketteniscat <<EOF
1362b725ae77Skettenis  /* gdbarch_alloc() */
1363b725ae77Skettenis
1364b725ae77Skettenis  return current_gdbarch;
1365b725ae77Skettenis}
1366b725ae77SkettenisEOF
1367b725ae77Skettenis
1368b725ae77Skettenis# Free a gdbarch struct.
1369b725ae77Skettenisprintf "\n"
1370b725ae77Skettenisprintf "\n"
1371b725ae77Sketteniscat <<EOF
1372b725ae77Skettenis/* Allocate extra space using the per-architecture obstack.  */
1373b725ae77Skettenis
1374b725ae77Skettenisvoid *
1375b725ae77Skettenisgdbarch_obstack_zalloc (struct gdbarch *arch, long size)
1376b725ae77Skettenis{
1377b725ae77Skettenis  void *data = obstack_alloc (arch->obstack, size);
1378b725ae77Skettenis  memset (data, 0, size);
1379b725ae77Skettenis  return data;
1380b725ae77Skettenis}
1381b725ae77Skettenis
1382b725ae77Skettenis
1383b725ae77Skettenis/* Free a gdbarch struct.  This should never happen in normal
1384b725ae77Skettenis   operation --- once you've created a gdbarch, you keep it around.
1385b725ae77Skettenis   However, if an architecture's init function encounters an error
1386b725ae77Skettenis   building the structure, it may need to clean up a partially
1387b725ae77Skettenis   constructed gdbarch.  */
1388b725ae77Skettenis
1389b725ae77Skettenisvoid
1390b725ae77Skettenisgdbarch_free (struct gdbarch *arch)
1391b725ae77Skettenis{
1392b725ae77Skettenis  struct obstack *obstack;
1393b725ae77Skettenis  gdb_assert (arch != NULL);
1394b725ae77Skettenis  gdb_assert (!arch->initialized_p);
1395b725ae77Skettenis  obstack = arch->obstack;
1396b725ae77Skettenis  obstack_free (obstack, 0); /* Includes the ARCH.  */
1397b725ae77Skettenis  xfree (obstack);
1398b725ae77Skettenis}
1399b725ae77SkettenisEOF
1400b725ae77Skettenis
1401b725ae77Skettenis# verify a new architecture
1402b725ae77Sketteniscat <<EOF
1403b725ae77Skettenis
1404b725ae77Skettenis
1405b725ae77Skettenis/* Ensure that all values in a GDBARCH are reasonable.  */
1406b725ae77Skettenis
1407b725ae77Skettenis/* NOTE/WARNING: The parameter is called \`\`current_gdbarch'' so that it
1408b725ae77Skettenis   just happens to match the global variable \`\`current_gdbarch''.  That
1409b725ae77Skettenis   way macros refering to that variable get the local and not the global
1410b725ae77Skettenis   version - ulgh.  Once everything is parameterised with gdbarch, this
1411b725ae77Skettenis   will go away. */
1412b725ae77Skettenis
1413b725ae77Skettenisstatic void
1414b725ae77Skettenisverify_gdbarch (struct gdbarch *current_gdbarch)
1415b725ae77Skettenis{
1416b725ae77Skettenis  struct ui_file *log;
1417b725ae77Skettenis  struct cleanup *cleanups;
1418b725ae77Skettenis  long dummy;
1419b725ae77Skettenis  char *buf;
1420b725ae77Skettenis  log = mem_fileopen ();
1421b725ae77Skettenis  cleanups = make_cleanup_ui_file_delete (log);
1422b725ae77Skettenis  /* fundamental */
1423b725ae77Skettenis  if (current_gdbarch->byte_order == BFD_ENDIAN_UNKNOWN)
1424b725ae77Skettenis    fprintf_unfiltered (log, "\n\tbyte-order");
1425b725ae77Skettenis  if (current_gdbarch->bfd_arch_info == NULL)
1426b725ae77Skettenis    fprintf_unfiltered (log, "\n\tbfd_arch_info");
1427b725ae77Skettenis  /* Check those that need to be defined for the given multi-arch level. */
1428b725ae77SkettenisEOF
1429b725ae77Skettenisfunction_list | while do_read
1430b725ae77Skettenisdo
1431b725ae77Skettenis    if class_is_function_p || class_is_variable_p
1432b725ae77Skettenis    then
1433b725ae77Skettenis	if [ "x${invalid_p}" = "x0" ]
1434b725ae77Skettenis	then
1435b725ae77Skettenis	    printf "  /* Skip verify of ${function}, invalid_p == 0 */\n"
1436b725ae77Skettenis	elif class_is_predicate_p
1437b725ae77Skettenis	then
1438b725ae77Skettenis	    printf "  /* Skip verify of ${function}, has predicate */\n"
1439b725ae77Skettenis	# FIXME: See do_read for potential simplification
1440b725ae77Skettenis 	elif [ -n "${invalid_p}" -a -n "${postdefault}" ]
1441b725ae77Skettenis	then
1442b725ae77Skettenis	    printf "  if (${invalid_p})\n"
1443b725ae77Skettenis	    printf "    current_gdbarch->${function} = ${postdefault};\n"
1444b725ae77Skettenis	elif [ -n "${predefault}" -a -n "${postdefault}" ]
1445b725ae77Skettenis	then
1446b725ae77Skettenis	    printf "  if (current_gdbarch->${function} == ${predefault})\n"
1447b725ae77Skettenis	    printf "    current_gdbarch->${function} = ${postdefault};\n"
1448b725ae77Skettenis	elif [ -n "${postdefault}" ]
1449b725ae77Skettenis	then
1450b725ae77Skettenis	    printf "  if (current_gdbarch->${function} == 0)\n"
1451b725ae77Skettenis	    printf "    current_gdbarch->${function} = ${postdefault};\n"
1452b725ae77Skettenis	elif [ -n "${invalid_p}" ]
1453b725ae77Skettenis	then
1454*11efff7fSkettenis	    printf "  if (${invalid_p})\n"
1455b725ae77Skettenis	    printf "    fprintf_unfiltered (log, \"\\\\n\\\\t${function}\");\n"
1456b725ae77Skettenis	elif [ -n "${predefault}" ]
1457b725ae77Skettenis	then
1458*11efff7fSkettenis	    printf "  if (current_gdbarch->${function} == ${predefault})\n"
1459b725ae77Skettenis	    printf "    fprintf_unfiltered (log, \"\\\\n\\\\t${function}\");\n"
1460b725ae77Skettenis	fi
1461b725ae77Skettenis    fi
1462b725ae77Skettenisdone
1463b725ae77Sketteniscat <<EOF
1464b725ae77Skettenis  buf = ui_file_xstrdup (log, &dummy);
1465b725ae77Skettenis  make_cleanup (xfree, buf);
1466b725ae77Skettenis  if (strlen (buf) > 0)
1467b725ae77Skettenis    internal_error (__FILE__, __LINE__,
1468b725ae77Skettenis                    "verify_gdbarch: the following are invalid ...%s",
1469b725ae77Skettenis                    buf);
1470b725ae77Skettenis  do_cleanups (cleanups);
1471b725ae77Skettenis}
1472b725ae77SkettenisEOF
1473b725ae77Skettenis
1474b725ae77Skettenis# dump the structure
1475b725ae77Skettenisprintf "\n"
1476b725ae77Skettenisprintf "\n"
1477b725ae77Sketteniscat <<EOF
1478b725ae77Skettenis/* Print out the details of the current architecture. */
1479b725ae77Skettenis
1480b725ae77Skettenis/* NOTE/WARNING: The parameter is called \`\`current_gdbarch'' so that it
1481b725ae77Skettenis   just happens to match the global variable \`\`current_gdbarch''.  That
1482b725ae77Skettenis   way macros refering to that variable get the local and not the global
1483b725ae77Skettenis   version - ulgh.  Once everything is parameterised with gdbarch, this
1484b725ae77Skettenis   will go away. */
1485b725ae77Skettenis
1486b725ae77Skettenisvoid
1487b725ae77Skettenisgdbarch_dump (struct gdbarch *current_gdbarch, struct ui_file *file)
1488b725ae77Skettenis{
1489*11efff7fSkettenis  const char *gdb_xm_file = "<not-defined>";
1490*11efff7fSkettenis  const char *gdb_nm_file = "<not-defined>";
1491*11efff7fSkettenis  const char *gdb_tm_file = "<not-defined>";
1492*11efff7fSkettenis#if defined (GDB_XM_FILE)
1493*11efff7fSkettenis  gdb_xm_file = GDB_XM_FILE;
1494*11efff7fSkettenis#endif
1495b725ae77Skettenis  fprintf_unfiltered (file,
1496*11efff7fSkettenis                      "gdbarch_dump: GDB_XM_FILE = %s\\n",
1497*11efff7fSkettenis                      gdb_xm_file);
1498*11efff7fSkettenis#if defined (GDB_NM_FILE)
1499*11efff7fSkettenis  gdb_nm_file = GDB_NM_FILE;
1500*11efff7fSkettenis#endif
1501*11efff7fSkettenis  fprintf_unfiltered (file,
1502*11efff7fSkettenis                      "gdbarch_dump: GDB_NM_FILE = %s\\n",
1503*11efff7fSkettenis                      gdb_nm_file);
1504*11efff7fSkettenis#if defined (GDB_TM_FILE)
1505*11efff7fSkettenis  gdb_tm_file = GDB_TM_FILE;
1506*11efff7fSkettenis#endif
1507*11efff7fSkettenis  fprintf_unfiltered (file,
1508*11efff7fSkettenis                      "gdbarch_dump: GDB_TM_FILE = %s\\n",
1509*11efff7fSkettenis                      gdb_tm_file);
1510b725ae77SkettenisEOF
1511*11efff7fSkettenisfunction_list | sort -t: -k 4 | while do_read
1512b725ae77Skettenisdo
1513b725ae77Skettenis    # First the predicate
1514b725ae77Skettenis    if class_is_predicate_p
1515b725ae77Skettenis    then
1516*11efff7fSkettenis	if test -n "${macro}"
1517b725ae77Skettenis	then
1518b725ae77Skettenis	    printf "#ifdef ${macro}_P\n"
1519b725ae77Skettenis	    printf "  fprintf_unfiltered (file,\n"
1520b725ae77Skettenis	    printf "                      \"gdbarch_dump: %%s # %%s\\\\n\",\n"
1521b725ae77Skettenis	    printf "                      \"${macro}_P()\",\n"
1522b725ae77Skettenis	    printf "                      XSTRING (${macro}_P ()));\n"
1523b725ae77Skettenis	    printf "#endif\n"
1524b725ae77Skettenis	fi
1525b725ae77Skettenis	printf "  fprintf_unfiltered (file,\n"
1526*11efff7fSkettenis	printf "                      \"gdbarch_dump: gdbarch_${function}_p() = %%d\\\\n\",\n"
1527*11efff7fSkettenis	printf "                      gdbarch_${function}_p (current_gdbarch));\n"
1528b725ae77Skettenis    fi
1529b725ae77Skettenis    # Print the macro definition.
1530*11efff7fSkettenis    if test -n "${macro}"
1531*11efff7fSkettenis    then
1532b725ae77Skettenis	printf "#ifdef ${macro}\n"
1533b725ae77Skettenis	if class_is_function_p
1534b725ae77Skettenis	then
1535b725ae77Skettenis	    printf "  fprintf_unfiltered (file,\n"
1536b725ae77Skettenis	    printf "                      \"gdbarch_dump: %%s # %%s\\\\n\",\n"
1537b725ae77Skettenis	    printf "                      \"${macro}(${actual})\",\n"
1538b725ae77Skettenis	    printf "                      XSTRING (${macro} (${actual})));\n"
1539b725ae77Skettenis	else
1540b725ae77Skettenis	    printf "  fprintf_unfiltered (file,\n"
1541b725ae77Skettenis	    printf "                      \"gdbarch_dump: ${macro} # %%s\\\\n\",\n"
1542b725ae77Skettenis	    printf "                      XSTRING (${macro}));\n"
1543b725ae77Skettenis	fi
1544*11efff7fSkettenis	printf "#endif\n"
1545*11efff7fSkettenis    fi
1546*11efff7fSkettenis    # Print the corresponding value.
1547*11efff7fSkettenis    if class_is_function_p
1548b725ae77Skettenis    then
1549b725ae77Skettenis	printf "  fprintf_unfiltered (file,\n"
1550*11efff7fSkettenis	printf "                      \"gdbarch_dump: ${function} = <0x%%lx>\\\\n\",\n"
1551*11efff7fSkettenis	printf "                      (long) current_gdbarch->${function});\n"
1552b725ae77Skettenis    else
1553*11efff7fSkettenis	# It is a variable
1554*11efff7fSkettenis	case "${print}:${returntype}" in
1555*11efff7fSkettenis	    :CORE_ADDR )
1556*11efff7fSkettenis		fmt="0x%s"
1557*11efff7fSkettenis		print="paddr_nz (current_gdbarch->${function})"
1558*11efff7fSkettenis		;;
1559*11efff7fSkettenis	    :* )
1560*11efff7fSkettenis	        fmt="%s"
1561*11efff7fSkettenis		print="paddr_d (current_gdbarch->${function})"
1562*11efff7fSkettenis		;;
1563*11efff7fSkettenis	    * )
1564*11efff7fSkettenis	        fmt="%s"
1565*11efff7fSkettenis		;;
1566*11efff7fSkettenis        esac
1567b725ae77Skettenis	printf "  fprintf_unfiltered (file,\n"
1568*11efff7fSkettenis	printf "                      \"gdbarch_dump: ${function} = %s\\\\n\",\n" "${fmt}"
1569b725ae77Skettenis	printf "                      ${print});\n"
1570b725ae77Skettenis    fi
1571b725ae77Skettenisdone
1572b725ae77Sketteniscat <<EOF
1573b725ae77Skettenis  if (current_gdbarch->dump_tdep != NULL)
1574b725ae77Skettenis    current_gdbarch->dump_tdep (current_gdbarch, file);
1575b725ae77Skettenis}
1576b725ae77SkettenisEOF
1577b725ae77Skettenis
1578b725ae77Skettenis
1579b725ae77Skettenis# GET/SET
1580b725ae77Skettenisprintf "\n"
1581b725ae77Sketteniscat <<EOF
1582b725ae77Skettenisstruct gdbarch_tdep *
1583b725ae77Skettenisgdbarch_tdep (struct gdbarch *gdbarch)
1584b725ae77Skettenis{
1585b725ae77Skettenis  if (gdbarch_debug >= 2)
1586b725ae77Skettenis    fprintf_unfiltered (gdb_stdlog, "gdbarch_tdep called\\n");
1587b725ae77Skettenis  return gdbarch->tdep;
1588b725ae77Skettenis}
1589b725ae77SkettenisEOF
1590b725ae77Skettenisprintf "\n"
1591b725ae77Skettenisfunction_list | while do_read
1592b725ae77Skettenisdo
1593b725ae77Skettenis    if class_is_predicate_p
1594b725ae77Skettenis    then
1595b725ae77Skettenis	printf "\n"
1596b725ae77Skettenis	printf "int\n"
1597b725ae77Skettenis	printf "gdbarch_${function}_p (struct gdbarch *gdbarch)\n"
1598b725ae77Skettenis	printf "{\n"
1599b725ae77Skettenis        printf "  gdb_assert (gdbarch != NULL);\n"
1600b725ae77Skettenis	printf "  return ${predicate};\n"
1601b725ae77Skettenis	printf "}\n"
1602b725ae77Skettenis    fi
1603b725ae77Skettenis    if class_is_function_p
1604b725ae77Skettenis    then
1605b725ae77Skettenis	printf "\n"
1606b725ae77Skettenis	printf "${returntype}\n"
1607b725ae77Skettenis	if [ "x${formal}" = "xvoid" ]
1608b725ae77Skettenis	then
1609b725ae77Skettenis	  printf "gdbarch_${function} (struct gdbarch *gdbarch)\n"
1610b725ae77Skettenis	else
1611b725ae77Skettenis	  printf "gdbarch_${function} (struct gdbarch *gdbarch, ${formal})\n"
1612b725ae77Skettenis	fi
1613b725ae77Skettenis	printf "{\n"
1614b725ae77Skettenis        printf "  gdb_assert (gdbarch != NULL);\n"
1615b725ae77Skettenis	printf "  gdb_assert (gdbarch->${function} != NULL);\n"
1616b725ae77Skettenis	if class_is_predicate_p && test -n "${predefault}"
1617b725ae77Skettenis	then
1618b725ae77Skettenis	    # Allow a call to a function with a predicate.
1619b725ae77Skettenis	    printf "  /* Do not check predicate: ${predicate}, allow call.  */\n"
1620b725ae77Skettenis	fi
1621b725ae77Skettenis	printf "  if (gdbarch_debug >= 2)\n"
1622b725ae77Skettenis	printf "    fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\\\\n\");\n"
1623b725ae77Skettenis	if [ "x${actual}" = "x-" -o "x${actual}" = "x" ]
1624b725ae77Skettenis	then
1625b725ae77Skettenis	    if class_is_multiarch_p
1626b725ae77Skettenis	    then
1627b725ae77Skettenis		params="gdbarch"
1628b725ae77Skettenis	    else
1629b725ae77Skettenis		params=""
1630b725ae77Skettenis	    fi
1631b725ae77Skettenis	else
1632b725ae77Skettenis	    if class_is_multiarch_p
1633b725ae77Skettenis	    then
1634b725ae77Skettenis		params="gdbarch, ${actual}"
1635b725ae77Skettenis	    else
1636b725ae77Skettenis		params="${actual}"
1637b725ae77Skettenis	    fi
1638b725ae77Skettenis        fi
1639b725ae77Skettenis       	if [ "x${returntype}" = "xvoid" ]
1640b725ae77Skettenis	then
1641b725ae77Skettenis	  printf "  gdbarch->${function} (${params});\n"
1642b725ae77Skettenis	else
1643b725ae77Skettenis	  printf "  return gdbarch->${function} (${params});\n"
1644b725ae77Skettenis	fi
1645b725ae77Skettenis	printf "}\n"
1646b725ae77Skettenis	printf "\n"
1647b725ae77Skettenis	printf "void\n"
1648b725ae77Skettenis	printf "set_gdbarch_${function} (struct gdbarch *gdbarch,\n"
1649b725ae77Skettenis        printf "            `echo ${function} | sed -e 's/./ /g'`  gdbarch_${function}_ftype ${function})\n"
1650b725ae77Skettenis	printf "{\n"
1651b725ae77Skettenis	printf "  gdbarch->${function} = ${function};\n"
1652b725ae77Skettenis	printf "}\n"
1653b725ae77Skettenis    elif class_is_variable_p
1654b725ae77Skettenis    then
1655b725ae77Skettenis	printf "\n"
1656b725ae77Skettenis	printf "${returntype}\n"
1657b725ae77Skettenis	printf "gdbarch_${function} (struct gdbarch *gdbarch)\n"
1658b725ae77Skettenis	printf "{\n"
1659b725ae77Skettenis        printf "  gdb_assert (gdbarch != NULL);\n"
1660b725ae77Skettenis	if [ "x${invalid_p}" = "x0" ]
1661b725ae77Skettenis	then
1662b725ae77Skettenis	    printf "  /* Skip verify of ${function}, invalid_p == 0 */\n"
1663b725ae77Skettenis	elif [ -n "${invalid_p}" ]
1664b725ae77Skettenis	then
1665b725ae77Skettenis	    printf "  /* Check variable is valid.  */\n"
1666b725ae77Skettenis	    printf "  gdb_assert (!(${invalid_p}));\n"
1667b725ae77Skettenis	elif [ -n "${predefault}" ]
1668b725ae77Skettenis	then
1669b725ae77Skettenis	    printf "  /* Check variable changed from pre-default.  */\n"
1670b725ae77Skettenis	    printf "  gdb_assert (gdbarch->${function} != ${predefault});\n"
1671b725ae77Skettenis	fi
1672b725ae77Skettenis	printf "  if (gdbarch_debug >= 2)\n"
1673b725ae77Skettenis	printf "    fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\\\\n\");\n"
1674b725ae77Skettenis	printf "  return gdbarch->${function};\n"
1675b725ae77Skettenis	printf "}\n"
1676b725ae77Skettenis	printf "\n"
1677b725ae77Skettenis	printf "void\n"
1678b725ae77Skettenis	printf "set_gdbarch_${function} (struct gdbarch *gdbarch,\n"
1679b725ae77Skettenis        printf "            `echo ${function} | sed -e 's/./ /g'`  ${returntype} ${function})\n"
1680b725ae77Skettenis	printf "{\n"
1681b725ae77Skettenis	printf "  gdbarch->${function} = ${function};\n"
1682b725ae77Skettenis	printf "}\n"
1683b725ae77Skettenis    elif class_is_info_p
1684b725ae77Skettenis    then
1685b725ae77Skettenis	printf "\n"
1686b725ae77Skettenis	printf "${returntype}\n"
1687b725ae77Skettenis	printf "gdbarch_${function} (struct gdbarch *gdbarch)\n"
1688b725ae77Skettenis	printf "{\n"
1689b725ae77Skettenis        printf "  gdb_assert (gdbarch != NULL);\n"
1690b725ae77Skettenis	printf "  if (gdbarch_debug >= 2)\n"
1691b725ae77Skettenis	printf "    fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\\\\n\");\n"
1692b725ae77Skettenis	printf "  return gdbarch->${function};\n"
1693b725ae77Skettenis	printf "}\n"
1694b725ae77Skettenis    fi
1695b725ae77Skettenisdone
1696b725ae77Skettenis
1697b725ae77Skettenis# All the trailing guff
1698b725ae77Sketteniscat <<EOF
1699b725ae77Skettenis
1700b725ae77Skettenis
1701b725ae77Skettenis/* Keep a registry of per-architecture data-pointers required by GDB
1702b725ae77Skettenis   modules. */
1703b725ae77Skettenis
1704b725ae77Skettenisstruct gdbarch_data
1705b725ae77Skettenis{
1706b725ae77Skettenis  unsigned index;
1707b725ae77Skettenis  int init_p;
1708*11efff7fSkettenis  gdbarch_data_pre_init_ftype *pre_init;
1709*11efff7fSkettenis  gdbarch_data_post_init_ftype *post_init;
1710b725ae77Skettenis};
1711b725ae77Skettenis
1712b725ae77Skettenisstruct gdbarch_data_registration
1713b725ae77Skettenis{
1714b725ae77Skettenis  struct gdbarch_data *data;
1715b725ae77Skettenis  struct gdbarch_data_registration *next;
1716b725ae77Skettenis};
1717b725ae77Skettenis
1718b725ae77Skettenisstruct gdbarch_data_registry
1719b725ae77Skettenis{
1720b725ae77Skettenis  unsigned nr;
1721b725ae77Skettenis  struct gdbarch_data_registration *registrations;
1722b725ae77Skettenis};
1723b725ae77Skettenis
1724b725ae77Skettenisstruct gdbarch_data_registry gdbarch_data_registry =
1725b725ae77Skettenis{
1726b725ae77Skettenis  0, NULL,
1727b725ae77Skettenis};
1728b725ae77Skettenis
1729*11efff7fSkettenisstatic struct gdbarch_data *
1730*11efff7fSkettenisgdbarch_data_register (gdbarch_data_pre_init_ftype *pre_init,
1731*11efff7fSkettenis		       gdbarch_data_post_init_ftype *post_init)
1732b725ae77Skettenis{
1733b725ae77Skettenis  struct gdbarch_data_registration **curr;
1734b725ae77Skettenis  /* Append the new registraration.  */
1735b725ae77Skettenis  for (curr = &gdbarch_data_registry.registrations;
1736b725ae77Skettenis       (*curr) != NULL;
1737b725ae77Skettenis       curr = &(*curr)->next);
1738b725ae77Skettenis  (*curr) = XMALLOC (struct gdbarch_data_registration);
1739b725ae77Skettenis  (*curr)->next = NULL;
1740b725ae77Skettenis  (*curr)->data = XMALLOC (struct gdbarch_data);
1741b725ae77Skettenis  (*curr)->data->index = gdbarch_data_registry.nr++;
1742*11efff7fSkettenis  (*curr)->data->pre_init = pre_init;
1743*11efff7fSkettenis  (*curr)->data->post_init = post_init;
1744b725ae77Skettenis  (*curr)->data->init_p = 1;
1745b725ae77Skettenis  return (*curr)->data;
1746b725ae77Skettenis}
1747b725ae77Skettenis
1748*11efff7fSkettenisstruct gdbarch_data *
1749*11efff7fSkettenisgdbarch_data_register_pre_init (gdbarch_data_pre_init_ftype *pre_init)
1750*11efff7fSkettenis{
1751*11efff7fSkettenis  return gdbarch_data_register (pre_init, NULL);
1752*11efff7fSkettenis}
1753*11efff7fSkettenis
1754*11efff7fSkettenisstruct gdbarch_data *
1755*11efff7fSkettenisgdbarch_data_register_post_init (gdbarch_data_post_init_ftype *post_init)
1756*11efff7fSkettenis{
1757*11efff7fSkettenis  return gdbarch_data_register (NULL, post_init);
1758*11efff7fSkettenis}
1759b725ae77Skettenis
1760b725ae77Skettenis/* Create/delete the gdbarch data vector. */
1761b725ae77Skettenis
1762b725ae77Skettenisstatic void
1763b725ae77Skettenisalloc_gdbarch_data (struct gdbarch *gdbarch)
1764b725ae77Skettenis{
1765b725ae77Skettenis  gdb_assert (gdbarch->data == NULL);
1766b725ae77Skettenis  gdbarch->nr_data = gdbarch_data_registry.nr;
1767b725ae77Skettenis  gdbarch->data = GDBARCH_OBSTACK_CALLOC (gdbarch, gdbarch->nr_data, void *);
1768b725ae77Skettenis}
1769b725ae77Skettenis
1770b725ae77Skettenis/* Initialize the current value of the specified per-architecture
1771b725ae77Skettenis   data-pointer. */
1772b725ae77Skettenis
1773b725ae77Skettenisvoid
1774*11efff7fSkettenisdeprecated_set_gdbarch_data (struct gdbarch *gdbarch,
1775b725ae77Skettenis			     struct gdbarch_data *data,
1776b725ae77Skettenis			     void *pointer)
1777b725ae77Skettenis{
1778b725ae77Skettenis  gdb_assert (data->index < gdbarch->nr_data);
1779b725ae77Skettenis  gdb_assert (gdbarch->data[data->index] == NULL);
1780*11efff7fSkettenis  gdb_assert (data->pre_init == NULL);
1781b725ae77Skettenis  gdbarch->data[data->index] = pointer;
1782b725ae77Skettenis}
1783b725ae77Skettenis
1784b725ae77Skettenis/* Return the current value of the specified per-architecture
1785b725ae77Skettenis   data-pointer. */
1786b725ae77Skettenis
1787b725ae77Skettenisvoid *
1788b725ae77Skettenisgdbarch_data (struct gdbarch *gdbarch, struct gdbarch_data *data)
1789b725ae77Skettenis{
1790b725ae77Skettenis  gdb_assert (data->index < gdbarch->nr_data);
1791*11efff7fSkettenis  if (gdbarch->data[data->index] == NULL)
1792b725ae77Skettenis    {
1793*11efff7fSkettenis      /* The data-pointer isn't initialized, call init() to get a
1794*11efff7fSkettenis	 value.  */
1795*11efff7fSkettenis      if (data->pre_init != NULL)
1796*11efff7fSkettenis	/* Mid architecture creation: pass just the obstack, and not
1797*11efff7fSkettenis	   the entire architecture, as that way it isn't possible for
1798*11efff7fSkettenis	   pre-init code to refer to undefined architecture
1799*11efff7fSkettenis	   fields.  */
1800*11efff7fSkettenis	gdbarch->data[data->index] = data->pre_init (gdbarch->obstack);
1801*11efff7fSkettenis      else if (gdbarch->initialized_p
1802*11efff7fSkettenis	       && data->post_init != NULL)
1803*11efff7fSkettenis	/* Post architecture creation: pass the entire architecture
1804*11efff7fSkettenis	   (as all fields are valid), but be careful to also detect
1805*11efff7fSkettenis	   recursive references.  */
1806*11efff7fSkettenis	{
1807b725ae77Skettenis	  gdb_assert (data->init_p);
1808b725ae77Skettenis	  data->init_p = 0;
1809*11efff7fSkettenis	  gdbarch->data[data->index] = data->post_init (gdbarch);
1810b725ae77Skettenis	  data->init_p = 1;
1811*11efff7fSkettenis	}
1812*11efff7fSkettenis      else
1813*11efff7fSkettenis	/* The architecture initialization hasn't completed - punt -
1814*11efff7fSkettenis	 hope that the caller knows what they are doing.  Once
1815*11efff7fSkettenis	 deprecated_set_gdbarch_data has been initialized, this can be
1816*11efff7fSkettenis	 changed to an internal error.  */
1817*11efff7fSkettenis	return NULL;
1818b725ae77Skettenis      gdb_assert (gdbarch->data[data->index] != NULL);
1819b725ae77Skettenis    }
1820b725ae77Skettenis  return gdbarch->data[data->index];
1821b725ae77Skettenis}
1822b725ae77Skettenis
1823b725ae77Skettenis
1824b725ae77Skettenis
1825b725ae77Skettenis/* Keep a registry of swapped data required by GDB modules. */
1826b725ae77Skettenis
1827b725ae77Skettenisstruct gdbarch_swap
1828b725ae77Skettenis{
1829b725ae77Skettenis  void *swap;
1830b725ae77Skettenis  struct gdbarch_swap_registration *source;
1831b725ae77Skettenis  struct gdbarch_swap *next;
1832b725ae77Skettenis};
1833b725ae77Skettenis
1834b725ae77Skettenisstruct gdbarch_swap_registration
1835b725ae77Skettenis{
1836b725ae77Skettenis  void *data;
1837b725ae77Skettenis  unsigned long sizeof_data;
1838b725ae77Skettenis  gdbarch_swap_ftype *init;
1839b725ae77Skettenis  struct gdbarch_swap_registration *next;
1840b725ae77Skettenis};
1841b725ae77Skettenis
1842b725ae77Skettenisstruct gdbarch_swap_registry
1843b725ae77Skettenis{
1844b725ae77Skettenis  int nr;
1845b725ae77Skettenis  struct gdbarch_swap_registration *registrations;
1846b725ae77Skettenis};
1847b725ae77Skettenis
1848b725ae77Skettenisstruct gdbarch_swap_registry gdbarch_swap_registry = 
1849b725ae77Skettenis{
1850b725ae77Skettenis  0, NULL,
1851b725ae77Skettenis};
1852b725ae77Skettenis
1853b725ae77Skettenisvoid
1854b725ae77Skettenisdeprecated_register_gdbarch_swap (void *data,
1855b725ae77Skettenis		                  unsigned long sizeof_data,
1856b725ae77Skettenis		                  gdbarch_swap_ftype *init)
1857b725ae77Skettenis{
1858b725ae77Skettenis  struct gdbarch_swap_registration **rego;
1859b725ae77Skettenis  for (rego = &gdbarch_swap_registry.registrations;
1860b725ae77Skettenis       (*rego) != NULL;
1861b725ae77Skettenis       rego = &(*rego)->next);
1862b725ae77Skettenis  (*rego) = XMALLOC (struct gdbarch_swap_registration);
1863b725ae77Skettenis  (*rego)->next = NULL;
1864b725ae77Skettenis  (*rego)->init = init;
1865b725ae77Skettenis  (*rego)->data = data;
1866b725ae77Skettenis  (*rego)->sizeof_data = sizeof_data;
1867b725ae77Skettenis}
1868b725ae77Skettenis
1869b725ae77Skettenisstatic void
1870b725ae77Sketteniscurrent_gdbarch_swap_init_hack (void)
1871b725ae77Skettenis{
1872b725ae77Skettenis  struct gdbarch_swap_registration *rego;
1873b725ae77Skettenis  struct gdbarch_swap **curr = &current_gdbarch->swap;
1874b725ae77Skettenis  for (rego = gdbarch_swap_registry.registrations;
1875b725ae77Skettenis       rego != NULL;
1876b725ae77Skettenis       rego = rego->next)
1877b725ae77Skettenis    {
1878b725ae77Skettenis      if (rego->data != NULL)
1879b725ae77Skettenis	{
1880b725ae77Skettenis	  (*curr) = GDBARCH_OBSTACK_ZALLOC (current_gdbarch,
1881b725ae77Skettenis					    struct gdbarch_swap);
1882b725ae77Skettenis	  (*curr)->source = rego;
1883b725ae77Skettenis	  (*curr)->swap = gdbarch_obstack_zalloc (current_gdbarch,
1884b725ae77Skettenis						  rego->sizeof_data);
1885b725ae77Skettenis	  (*curr)->next = NULL;
1886b725ae77Skettenis	  curr = &(*curr)->next;
1887b725ae77Skettenis	}
1888b725ae77Skettenis      if (rego->init != NULL)
1889b725ae77Skettenis	rego->init ();
1890b725ae77Skettenis    }
1891b725ae77Skettenis}
1892b725ae77Skettenis
1893b725ae77Skettenisstatic struct gdbarch *
1894b725ae77Sketteniscurrent_gdbarch_swap_out_hack (void)
1895b725ae77Skettenis{
1896b725ae77Skettenis  struct gdbarch *old_gdbarch = current_gdbarch;
1897b725ae77Skettenis  struct gdbarch_swap *curr;
1898b725ae77Skettenis
1899b725ae77Skettenis  gdb_assert (old_gdbarch != NULL);
1900b725ae77Skettenis  for (curr = old_gdbarch->swap;
1901b725ae77Skettenis       curr != NULL;
1902b725ae77Skettenis       curr = curr->next)
1903b725ae77Skettenis    {
1904b725ae77Skettenis      memcpy (curr->swap, curr->source->data, curr->source->sizeof_data);
1905b725ae77Skettenis      memset (curr->source->data, 0, curr->source->sizeof_data);
1906b725ae77Skettenis    }
1907b725ae77Skettenis  current_gdbarch = NULL;
1908b725ae77Skettenis  return old_gdbarch;
1909b725ae77Skettenis}
1910b725ae77Skettenis
1911b725ae77Skettenisstatic void
1912b725ae77Sketteniscurrent_gdbarch_swap_in_hack (struct gdbarch *new_gdbarch)
1913b725ae77Skettenis{
1914b725ae77Skettenis  struct gdbarch_swap *curr;
1915b725ae77Skettenis
1916b725ae77Skettenis  gdb_assert (current_gdbarch == NULL);
1917b725ae77Skettenis  for (curr = new_gdbarch->swap;
1918b725ae77Skettenis       curr != NULL;
1919b725ae77Skettenis       curr = curr->next)
1920b725ae77Skettenis    memcpy (curr->source->data, curr->swap, curr->source->sizeof_data);
1921b725ae77Skettenis  current_gdbarch = new_gdbarch;
1922b725ae77Skettenis}
1923b725ae77Skettenis
1924b725ae77Skettenis
1925b725ae77Skettenis/* Keep a registry of the architectures known by GDB. */
1926b725ae77Skettenis
1927b725ae77Skettenisstruct gdbarch_registration
1928b725ae77Skettenis{
1929b725ae77Skettenis  enum bfd_architecture bfd_architecture;
1930b725ae77Skettenis  gdbarch_init_ftype *init;
1931b725ae77Skettenis  gdbarch_dump_tdep_ftype *dump_tdep;
1932b725ae77Skettenis  struct gdbarch_list *arches;
1933b725ae77Skettenis  struct gdbarch_registration *next;
1934b725ae77Skettenis};
1935b725ae77Skettenis
1936b725ae77Skettenisstatic struct gdbarch_registration *gdbarch_registry = NULL;
1937b725ae77Skettenis
1938b725ae77Skettenisstatic void
1939b725ae77Skettenisappend_name (const char ***buf, int *nr, const char *name)
1940b725ae77Skettenis{
1941b725ae77Skettenis  *buf = xrealloc (*buf, sizeof (char**) * (*nr + 1));
1942b725ae77Skettenis  (*buf)[*nr] = name;
1943b725ae77Skettenis  *nr += 1;
1944b725ae77Skettenis}
1945b725ae77Skettenis
1946b725ae77Skettenisconst char **
1947b725ae77Skettenisgdbarch_printable_names (void)
1948b725ae77Skettenis{
1949b725ae77Skettenis  /* Accumulate a list of names based on the registed list of
1950b725ae77Skettenis     architectures. */
1951b725ae77Skettenis  enum bfd_architecture a;
1952b725ae77Skettenis  int nr_arches = 0;
1953b725ae77Skettenis  const char **arches = NULL;
1954b725ae77Skettenis  struct gdbarch_registration *rego;
1955b725ae77Skettenis  for (rego = gdbarch_registry;
1956b725ae77Skettenis       rego != NULL;
1957b725ae77Skettenis       rego = rego->next)
1958b725ae77Skettenis    {
1959b725ae77Skettenis      const struct bfd_arch_info *ap;
1960b725ae77Skettenis      ap = bfd_lookup_arch (rego->bfd_architecture, 0);
1961b725ae77Skettenis      if (ap == NULL)
1962b725ae77Skettenis        internal_error (__FILE__, __LINE__,
1963b725ae77Skettenis                        "gdbarch_architecture_names: multi-arch unknown");
1964b725ae77Skettenis      do
1965b725ae77Skettenis        {
1966b725ae77Skettenis          append_name (&arches, &nr_arches, ap->printable_name);
1967b725ae77Skettenis          ap = ap->next;
1968b725ae77Skettenis        }
1969b725ae77Skettenis      while (ap != NULL);
1970b725ae77Skettenis    }
1971b725ae77Skettenis  append_name (&arches, &nr_arches, NULL);
1972b725ae77Skettenis  return arches;
1973b725ae77Skettenis}
1974b725ae77Skettenis
1975b725ae77Skettenis
1976b725ae77Skettenisvoid
1977b725ae77Skettenisgdbarch_register (enum bfd_architecture bfd_architecture,
1978b725ae77Skettenis                  gdbarch_init_ftype *init,
1979b725ae77Skettenis		  gdbarch_dump_tdep_ftype *dump_tdep)
1980b725ae77Skettenis{
1981b725ae77Skettenis  struct gdbarch_registration **curr;
1982b725ae77Skettenis  const struct bfd_arch_info *bfd_arch_info;
1983b725ae77Skettenis  /* Check that BFD recognizes this architecture */
1984b725ae77Skettenis  bfd_arch_info = bfd_lookup_arch (bfd_architecture, 0);
1985b725ae77Skettenis  if (bfd_arch_info == NULL)
1986b725ae77Skettenis    {
1987b725ae77Skettenis      internal_error (__FILE__, __LINE__,
1988b725ae77Skettenis                      "gdbarch: Attempt to register unknown architecture (%d)",
1989b725ae77Skettenis                      bfd_architecture);
1990b725ae77Skettenis    }
1991b725ae77Skettenis  /* Check that we haven't seen this architecture before */
1992b725ae77Skettenis  for (curr = &gdbarch_registry;
1993b725ae77Skettenis       (*curr) != NULL;
1994b725ae77Skettenis       curr = &(*curr)->next)
1995b725ae77Skettenis    {
1996b725ae77Skettenis      if (bfd_architecture == (*curr)->bfd_architecture)
1997b725ae77Skettenis	internal_error (__FILE__, __LINE__,
1998b725ae77Skettenis                        "gdbarch: Duplicate registraration of architecture (%s)",
1999b725ae77Skettenis	                bfd_arch_info->printable_name);
2000b725ae77Skettenis    }
2001b725ae77Skettenis  /* log it */
2002b725ae77Skettenis  if (gdbarch_debug)
2003b725ae77Skettenis    fprintf_unfiltered (gdb_stdlog, "register_gdbarch_init (%s, 0x%08lx)\n",
2004b725ae77Skettenis			bfd_arch_info->printable_name,
2005b725ae77Skettenis			(long) init);
2006b725ae77Skettenis  /* Append it */
2007b725ae77Skettenis  (*curr) = XMALLOC (struct gdbarch_registration);
2008b725ae77Skettenis  (*curr)->bfd_architecture = bfd_architecture;
2009b725ae77Skettenis  (*curr)->init = init;
2010b725ae77Skettenis  (*curr)->dump_tdep = dump_tdep;
2011b725ae77Skettenis  (*curr)->arches = NULL;
2012b725ae77Skettenis  (*curr)->next = NULL;
2013b725ae77Skettenis}
2014b725ae77Skettenis
2015b725ae77Skettenisvoid
2016b725ae77Skettenisregister_gdbarch_init (enum bfd_architecture bfd_architecture,
2017b725ae77Skettenis		       gdbarch_init_ftype *init)
2018b725ae77Skettenis{
2019b725ae77Skettenis  gdbarch_register (bfd_architecture, init, NULL);
2020b725ae77Skettenis}
2021b725ae77Skettenis
2022b725ae77Skettenis
2023b725ae77Skettenis/* Look for an architecture using gdbarch_info.  Base search on only
2024b725ae77Skettenis   BFD_ARCH_INFO and BYTE_ORDER. */
2025b725ae77Skettenis
2026b725ae77Skettenisstruct gdbarch_list *
2027b725ae77Skettenisgdbarch_list_lookup_by_info (struct gdbarch_list *arches,
2028b725ae77Skettenis                             const struct gdbarch_info *info)
2029b725ae77Skettenis{
2030b725ae77Skettenis  for (; arches != NULL; arches = arches->next)
2031b725ae77Skettenis    {
2032b725ae77Skettenis      if (info->bfd_arch_info != arches->gdbarch->bfd_arch_info)
2033b725ae77Skettenis	continue;
2034b725ae77Skettenis      if (info->byte_order != arches->gdbarch->byte_order)
2035b725ae77Skettenis	continue;
2036b725ae77Skettenis      if (info->osabi != arches->gdbarch->osabi)
2037b725ae77Skettenis	continue;
2038b725ae77Skettenis      return arches;
2039b725ae77Skettenis    }
2040b725ae77Skettenis  return NULL;
2041b725ae77Skettenis}
2042b725ae77Skettenis
2043b725ae77Skettenis
2044b725ae77Skettenis/* Find an architecture that matches the specified INFO.  Create a new
2045b725ae77Skettenis   architecture if needed.  Return that new architecture.  Assumes
2046b725ae77Skettenis   that there is no current architecture.  */
2047b725ae77Skettenis
2048b725ae77Skettenisstatic struct gdbarch *
2049b725ae77Skettenisfind_arch_by_info (struct gdbarch *old_gdbarch, struct gdbarch_info info)
2050b725ae77Skettenis{
2051b725ae77Skettenis  struct gdbarch *new_gdbarch;
2052b725ae77Skettenis  struct gdbarch_registration *rego;
2053b725ae77Skettenis
2054b725ae77Skettenis  /* The existing architecture has been swapped out - all this code
2055b725ae77Skettenis     works from a clean slate.  */
2056b725ae77Skettenis  gdb_assert (current_gdbarch == NULL);
2057b725ae77Skettenis
2058b725ae77Skettenis  /* Fill in missing parts of the INFO struct using a number of
2059b725ae77Skettenis     sources: "set ..."; INFOabfd supplied; and the existing
2060b725ae77Skettenis     architecture.  */
2061b725ae77Skettenis  gdbarch_info_fill (old_gdbarch, &info);
2062b725ae77Skettenis
2063b725ae77Skettenis  /* Must have found some sort of architecture. */
2064b725ae77Skettenis  gdb_assert (info.bfd_arch_info != NULL);
2065b725ae77Skettenis
2066b725ae77Skettenis  if (gdbarch_debug)
2067b725ae77Skettenis    {
2068b725ae77Skettenis      fprintf_unfiltered (gdb_stdlog,
2069b725ae77Skettenis			  "find_arch_by_info: info.bfd_arch_info %s\n",
2070b725ae77Skettenis			  (info.bfd_arch_info != NULL
2071b725ae77Skettenis			   ? info.bfd_arch_info->printable_name
2072b725ae77Skettenis			   : "(null)"));
2073b725ae77Skettenis      fprintf_unfiltered (gdb_stdlog,
2074b725ae77Skettenis			  "find_arch_by_info: info.byte_order %d (%s)\n",
2075b725ae77Skettenis			  info.byte_order,
2076b725ae77Skettenis			  (info.byte_order == BFD_ENDIAN_BIG ? "big"
2077b725ae77Skettenis			   : info.byte_order == BFD_ENDIAN_LITTLE ? "little"
2078b725ae77Skettenis			   : "default"));
2079b725ae77Skettenis      fprintf_unfiltered (gdb_stdlog,
2080b725ae77Skettenis			  "find_arch_by_info: info.osabi %d (%s)\n",
2081b725ae77Skettenis			  info.osabi, gdbarch_osabi_name (info.osabi));
2082b725ae77Skettenis      fprintf_unfiltered (gdb_stdlog,
2083b725ae77Skettenis			  "find_arch_by_info: info.abfd 0x%lx\n",
2084b725ae77Skettenis			  (long) info.abfd);
2085b725ae77Skettenis      fprintf_unfiltered (gdb_stdlog,
2086b725ae77Skettenis			  "find_arch_by_info: info.tdep_info 0x%lx\n",
2087b725ae77Skettenis			  (long) info.tdep_info);
2088b725ae77Skettenis    }
2089b725ae77Skettenis
2090b725ae77Skettenis  /* Find the tdep code that knows about this architecture.  */
2091b725ae77Skettenis  for (rego = gdbarch_registry;
2092b725ae77Skettenis       rego != NULL;
2093b725ae77Skettenis       rego = rego->next)
2094b725ae77Skettenis    if (rego->bfd_architecture == info.bfd_arch_info->arch)
2095b725ae77Skettenis      break;
2096b725ae77Skettenis  if (rego == NULL)
2097b725ae77Skettenis    {
2098b725ae77Skettenis      if (gdbarch_debug)
2099b725ae77Skettenis	fprintf_unfiltered (gdb_stdlog, "find_arch_by_info: "
2100b725ae77Skettenis			    "No matching architecture\n");
2101b725ae77Skettenis      return 0;
2102b725ae77Skettenis    }
2103b725ae77Skettenis
2104b725ae77Skettenis  /* Ask the tdep code for an architecture that matches "info".  */
2105b725ae77Skettenis  new_gdbarch = rego->init (info, rego->arches);
2106b725ae77Skettenis
2107b725ae77Skettenis  /* Did the tdep code like it?  No.  Reject the change and revert to
2108b725ae77Skettenis     the old architecture.  */
2109b725ae77Skettenis  if (new_gdbarch == NULL)
2110b725ae77Skettenis    {
2111b725ae77Skettenis      if (gdbarch_debug)
2112b725ae77Skettenis	fprintf_unfiltered (gdb_stdlog, "find_arch_by_info: "
2113b725ae77Skettenis			    "Target rejected architecture\n");
2114b725ae77Skettenis      return NULL;
2115b725ae77Skettenis    }
2116b725ae77Skettenis
2117b725ae77Skettenis  /* Is this a pre-existing architecture (as determined by already
2118b725ae77Skettenis     being initialized)?  Move it to the front of the architecture
2119b725ae77Skettenis     list (keeping the list sorted Most Recently Used).  */
2120b725ae77Skettenis  if (new_gdbarch->initialized_p)
2121b725ae77Skettenis    {
2122b725ae77Skettenis      struct gdbarch_list **list;
2123b725ae77Skettenis      struct gdbarch_list *this;
2124b725ae77Skettenis      if (gdbarch_debug)
2125b725ae77Skettenis	fprintf_unfiltered (gdb_stdlog, "find_arch_by_info: "
2126b725ae77Skettenis			    "Previous architecture 0x%08lx (%s) selected\n",
2127b725ae77Skettenis			    (long) new_gdbarch,
2128b725ae77Skettenis			    new_gdbarch->bfd_arch_info->printable_name);
2129b725ae77Skettenis      /* Find the existing arch in the list.  */
2130b725ae77Skettenis      for (list = &rego->arches;
2131b725ae77Skettenis	   (*list) != NULL && (*list)->gdbarch != new_gdbarch;
2132b725ae77Skettenis	   list = &(*list)->next);
2133b725ae77Skettenis      /* It had better be in the list of architectures.  */
2134b725ae77Skettenis      gdb_assert ((*list) != NULL && (*list)->gdbarch == new_gdbarch);
2135b725ae77Skettenis      /* Unlink THIS.  */
2136b725ae77Skettenis      this = (*list);
2137b725ae77Skettenis      (*list) = this->next;
2138b725ae77Skettenis      /* Insert THIS at the front.  */
2139b725ae77Skettenis      this->next = rego->arches;
2140b725ae77Skettenis      rego->arches = this;
2141b725ae77Skettenis      /* Return it.  */
2142b725ae77Skettenis      return new_gdbarch;
2143b725ae77Skettenis    }
2144b725ae77Skettenis
2145b725ae77Skettenis  /* It's a new architecture.  */
2146b725ae77Skettenis  if (gdbarch_debug)
2147b725ae77Skettenis    fprintf_unfiltered (gdb_stdlog, "find_arch_by_info: "
2148b725ae77Skettenis			"New architecture 0x%08lx (%s) selected\n",
2149b725ae77Skettenis			(long) new_gdbarch,
2150b725ae77Skettenis			new_gdbarch->bfd_arch_info->printable_name);
2151b725ae77Skettenis  
2152b725ae77Skettenis  /* Insert the new architecture into the front of the architecture
2153b725ae77Skettenis     list (keep the list sorted Most Recently Used).  */
2154b725ae77Skettenis  {
2155b725ae77Skettenis    struct gdbarch_list *this = XMALLOC (struct gdbarch_list);
2156b725ae77Skettenis    this->next = rego->arches;
2157b725ae77Skettenis    this->gdbarch = new_gdbarch;
2158b725ae77Skettenis    rego->arches = this;
2159b725ae77Skettenis  }    
2160b725ae77Skettenis
2161b725ae77Skettenis  /* Check that the newly installed architecture is valid.  Plug in
2162b725ae77Skettenis     any post init values.  */
2163b725ae77Skettenis  new_gdbarch->dump_tdep = rego->dump_tdep;
2164b725ae77Skettenis  verify_gdbarch (new_gdbarch);
2165b725ae77Skettenis  new_gdbarch->initialized_p = 1;
2166b725ae77Skettenis
2167b725ae77Skettenis  /* Initialize any per-architecture swap areas.  This phase requires
2168b725ae77Skettenis     a valid global CURRENT_GDBARCH.  Set it momentarially, and then
2169b725ae77Skettenis     swap the entire architecture out.  */
2170b725ae77Skettenis  current_gdbarch = new_gdbarch;
2171b725ae77Skettenis  current_gdbarch_swap_init_hack ();
2172b725ae77Skettenis  current_gdbarch_swap_out_hack ();
2173b725ae77Skettenis
2174b725ae77Skettenis  if (gdbarch_debug)
2175b725ae77Skettenis    gdbarch_dump (new_gdbarch, gdb_stdlog);
2176b725ae77Skettenis
2177b725ae77Skettenis  return new_gdbarch;
2178b725ae77Skettenis}
2179b725ae77Skettenis
2180b725ae77Skettenisstruct gdbarch *
2181b725ae77Skettenisgdbarch_find_by_info (struct gdbarch_info info)
2182b725ae77Skettenis{
2183b725ae77Skettenis  /* Save the previously selected architecture, setting the global to
2184b725ae77Skettenis     NULL.  This stops things like gdbarch->init() trying to use the
2185b725ae77Skettenis     previous architecture's configuration.  The previous architecture
2186b725ae77Skettenis     may not even be of the same architecture family.  The most recent
2187b725ae77Skettenis     architecture of the same family is found at the head of the
2188b725ae77Skettenis     rego->arches list.  */
2189b725ae77Skettenis  struct gdbarch *old_gdbarch = current_gdbarch_swap_out_hack ();
2190b725ae77Skettenis
2191b725ae77Skettenis  /* Find the specified architecture.  */
2192b725ae77Skettenis  struct gdbarch *new_gdbarch = find_arch_by_info (old_gdbarch, info);
2193b725ae77Skettenis
2194b725ae77Skettenis  /* Restore the existing architecture.  */
2195b725ae77Skettenis  gdb_assert (current_gdbarch == NULL);
2196b725ae77Skettenis  current_gdbarch_swap_in_hack (old_gdbarch);
2197b725ae77Skettenis
2198b725ae77Skettenis  return new_gdbarch;
2199b725ae77Skettenis}
2200b725ae77Skettenis
2201b725ae77Skettenis/* Make the specified architecture current, swapping the existing one
2202b725ae77Skettenis   out.  */
2203b725ae77Skettenis
2204b725ae77Skettenisvoid
2205b725ae77Skettenisdeprecated_current_gdbarch_select_hack (struct gdbarch *new_gdbarch)
2206b725ae77Skettenis{
2207b725ae77Skettenis  gdb_assert (new_gdbarch != NULL);
2208b725ae77Skettenis  gdb_assert (current_gdbarch != NULL);
2209b725ae77Skettenis  gdb_assert (new_gdbarch->initialized_p);
2210b725ae77Skettenis  current_gdbarch_swap_out_hack ();
2211b725ae77Skettenis  current_gdbarch_swap_in_hack (new_gdbarch);
2212b725ae77Skettenis  architecture_changed_event ();
2213b725ae77Skettenis}
2214b725ae77Skettenis
2215b725ae77Skettenisextern void _initialize_gdbarch (void);
2216b725ae77Skettenis
2217b725ae77Skettenisvoid
2218b725ae77Skettenis_initialize_gdbarch (void)
2219b725ae77Skettenis{
2220b725ae77Skettenis  struct cmd_list_element *c;
2221b725ae77Skettenis
2222*11efff7fSkettenis  deprecated_add_show_from_set
2223*11efff7fSkettenis    (add_set_cmd ("arch",
2224b725ae77Skettenis	          class_maintenance,
2225b725ae77Skettenis		  var_zinteger,
2226b725ae77Skettenis		  (char *)&gdbarch_debug,
2227b725ae77Skettenis		  "Set architecture debugging.\\n\\
2228b725ae77SkettenisWhen non-zero, architecture debugging is enabled.", &setdebuglist),
2229b725ae77Skettenis     &showdebuglist);
2230b725ae77Skettenis  c = add_set_cmd ("archdebug",
2231b725ae77Skettenis		   class_maintenance,
2232b725ae77Skettenis		   var_zinteger,
2233b725ae77Skettenis		   (char *)&gdbarch_debug,
2234b725ae77Skettenis		   "Set architecture debugging.\\n\\
2235b725ae77SkettenisWhen non-zero, architecture debugging is enabled.", &setlist);
2236b725ae77Skettenis
2237b725ae77Skettenis  deprecate_cmd (c, "set debug arch");
2238*11efff7fSkettenis  deprecate_cmd (deprecated_add_show_from_set (c, &showlist), "show debug arch");
2239b725ae77Skettenis}
2240b725ae77SkettenisEOF
2241b725ae77Skettenis
2242b725ae77Skettenis# close things off
2243b725ae77Skettenisexec 1>&2
2244b725ae77Skettenis#../move-if-change new-gdbarch.c gdbarch.c
2245b725ae77Sketteniscompare_new gdbarch.c
2246