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