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 = ¤t_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 = ®o->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