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