X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fgdbarch.sh;h=326849a2ec745445e15c81e89bf06eda7ce806ad;hb=e17a4113357102b55cfa5b80557d590a46a43300;hp=af7aea437b8818c6c96d2aeb15e7da1de50605b7;hpb=383f836e2002b1bc1793238ed099ed7aa215fec3;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index af7aea437b..326849a2ec 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -3,7 +3,7 @@ # Architecture commands for GDB, the GNU debugger. # # Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, -# 2008 Free Software Foundation, Inc. +# 2008, 2009 Free Software Foundation, Inc. # # This file is part of GDB. # @@ -318,8 +318,8 @@ do # An optional expression that convers MEMBER to a value # suitable for formatting using %s. - # If PRINT is empty, paddr_nz (for CORE_ADDR) or paddr_d - # (anything else) is used. + # If PRINT is empty, core_addr_to_string_nz (for CORE_ADDR) + # or plongest (anything else) is used. garbage_at_eol ) : ;; @@ -339,10 +339,11 @@ function_list () i:const struct bfd_arch_info *:bfd_arch_info:::&bfd_default_arch_struct::::gdbarch_bfd_arch_info (gdbarch)->printable_name # i:int:byte_order:::BFD_ENDIAN_BIG +i:int:byte_order_for_code:::BFD_ENDIAN_BIG # i:enum gdb_osabi:osabi:::GDB_OSABI_UNKNOWN # -i:const struct target_desc *:target_desc:::::::paddr_d ((long) gdbarch->target_desc) +i:const struct target_desc *:target_desc:::::::host_address_to_string (gdbarch->target_desc) # The bit byte-order has to do just with numbering of bits in debugging symbols # and such. Conceptually, it's quite separate from byte/word byte order. @@ -465,8 +466,8 @@ f:void:value_to_register:struct frame_info *frame, int regnum, struct type *type # (but not the value contents) filled in. f:struct value *:value_from_register:struct type *type, int regnum, struct frame_info *frame:type, regnum, frame::default_value_from_register::0 # -f:CORE_ADDR:pointer_to_address:struct type *type, const gdb_byte *buf:type, buf::unsigned_pointer_to_address::0 -f:void:address_to_pointer:struct type *type, gdb_byte *buf, CORE_ADDR addr:type, buf, addr::unsigned_address_to_pointer::0 +m:CORE_ADDR:pointer_to_address:struct type *type, const gdb_byte *buf:type, buf::unsigned_pointer_to_address::0 +m:void:address_to_pointer:struct type *type, gdb_byte *buf, CORE_ADDR addr:type, buf, addr::unsigned_address_to_pointer::0 M:CORE_ADDR:integer_to_address:struct type *type, const gdb_byte *buf:type, buf # Return the return-value convention that will be used by FUNCTYPE @@ -528,10 +529,10 @@ m:CORE_ADDR:convert_from_func_ptr_addr:CORE_ADDR addr, struct target_ops *targ:a # being a few stray bits in the PC which would mislead us, not as some # sort of generic thing to handle alignment or segmentation (it's # possible it should be in TARGET_READ_PC instead). -f:CORE_ADDR:addr_bits_remove:CORE_ADDR addr:addr::core_addr_identity::0 +m:CORE_ADDR:addr_bits_remove:CORE_ADDR addr:addr::core_addr_identity::0 # It is not at all clear why gdbarch_smash_text_address is not folded into # gdbarch_addr_bits_remove. -f:CORE_ADDR:smash_text_address:CORE_ADDR addr:addr::core_addr_identity::0 +m:CORE_ADDR:smash_text_address:CORE_ADDR addr:addr::core_addr_identity::0 # FIXME/cagney/2001-01-18: This should be split in two. A target method that # indicates if the target needs software single step. An ISA method to @@ -562,7 +563,7 @@ f:CORE_ADDR:skip_trampoline_code:struct frame_info *frame, CORE_ADDR pc:frame, p # a step-resume breakpoint to get us past the dynamic linker. m:CORE_ADDR:skip_solib_resolver:CORE_ADDR pc:pc::generic_skip_solib_resolver::0 # Some systems also have trampoline code for returning from shared libs. -f:int:in_solib_return_trampoline:CORE_ADDR pc, char *name:pc, name::generic_in_solib_return_trampoline::0 +m:int:in_solib_return_trampoline:CORE_ADDR pc, char *name:pc, name::generic_in_solib_return_trampoline::0 # A target might have problems with watchpoints as soon as the stack # frame of the current function has been destroyed. This mostly happens @@ -574,18 +575,8 @@ f:int:in_solib_return_trampoline:CORE_ADDR pc, char *name:pc, name::generic_in_s # which don't suffer from that problem could just let this functionality # untouched. m:int:in_function_epilogue_p:CORE_ADDR addr:addr:0:generic_in_function_epilogue_p::0 -# Given a vector of command-line arguments, return a newly allocated -# string which, when passed to the create_inferior function, will be -# parsed (on Unix systems, by the shell) to yield the same vector. -# This function should call error() if the argument vector is not -# representable for this target or if this target does not support -# command-line arguments. -# ARGC is the number of elements in the vector. -# ARGV is an array of strings, one per argument. -m:char *:construct_inferior_arguments:int argc, char **argv:argc, argv::construct_inferior_arguments::0 f:void:elf_make_msymbol_special:asymbol *sym, struct minimal_symbol *msym:sym, msym::default_elf_make_msymbol_special::0 f:void:coff_make_msymbol_special:int val, struct minimal_symbol *msym:val, msym::default_coff_make_msymbol_special::0 -v:const char *:name_of_malloc:::"malloc":"malloc"::0:gdbarch->name_of_malloc v:int:cannot_step_breakpoint:::0:0::0 v:int:have_nonsteppable_watchpoint:::0:0::0 F:int:address_class_type_flags:int byte_size, int dwarf2_addr_class:byte_size, dwarf2_addr_class @@ -600,6 +591,13 @@ F:CORE_ADDR:fetch_pointer_argument:struct frame_info *frame, int argi, struct ty # name SECT_NAME and size SECT_SIZE. M:const struct regset *:regset_from_core_section:const char *sect_name, size_t sect_size:sect_name, sect_size +# When creating core dumps, some systems encode the PID in addition +# to the LWP id in core file register section names. In those cases, the +# "XXX" in ".reg/XXX" is encoded as [LWPID << 16 | PID]. This setting +# is set to true for such architectures; false if "XXX" represents an LWP +# or thread id with no special encoding. +v:int:core_reg_section_encodes_pid:::0:0::0 + # Supported register notes in a core file. v:struct core_regset_section *:core_regset_sections:const char *name, int len::::::host_address_to_string (gdbarch->core_regset_sections) @@ -607,6 +605,13 @@ v:struct core_regset_section *:core_regset_sections:const char *name, int len::: # core file into buffer READBUF with length LEN. M:LONGEST:core_xfer_shared_libraries:gdb_byte *readbuf, ULONGEST offset, LONGEST len:readbuf, offset, len +# How the core_stratum layer converts a PTID from a core file to a +# string. +M:char *:core_pid_to_str:ptid_t ptid:ptid + +# BFD target to use when generating a core file. +V:const char *:gcore_bfd_target:::0:0:::gdbarch->gcore_bfd_target + # If the elements of C++ vtables are in-place function descriptors rather # than normal function pointers (which may point to code or a descriptor), # set this to one. @@ -698,6 +703,12 @@ F:char *:static_transform_name:char *name:name # Set if the address in N_SO or N_FUN stabs may be zero. v:int:sofun_address_maybe_missing:::0:0::0 +# Parse the instruction at ADDR storing in the record execution log +# the registers REGCACHE and memory ranges that will be affected when +# the instruction executes, along with their current values. +# Return -1 if something goes wrong, 0 otherwise. +M:int:process_record:struct regcache *regcache, CORE_ADDR addr:regcache, addr + # Signal translation: translate inferior's signal (host's) number into # GDB's representation. m:enum target_signal:target_signal_from_host:int signo:signo::default_target_signal_from_host::0 @@ -705,8 +716,26 @@ m:enum target_signal:target_signal_from_host:int signo:signo::default_target_sig # signal number. m:int:target_signal_to_host:enum target_signal ts:ts::default_target_signal_to_host::0 +# Extra signal info inspection. +# +# Return a type suitable to inspect extra signal information. +M:struct type *:get_siginfo_type:void: + # Record architecture-specific information from the symbol table. M:void:record_special_symbol:struct objfile *objfile, asymbol *sym:objfile, sym + +# True if the list of shared libraries is one and only for all +# processes, as opposed to a list of shared libraries per inferior. +# This usually means that all processes, although may or may not share +# an address space, will see the same set of symbols at the same +# addresses. +v:int:has_global_solist:::0:0::0 + +# On some targets, even though each inferior has its own private +# address space, the debug interface takes care of making breakpoints +# visible to all address spaces automatically. For such cases, +# this property should be set to true. +v:int:has_global_breakpoints:::0:0::0 EOF } @@ -821,6 +850,18 @@ struct displaced_step_closure; struct core_regset_section; extern struct gdbarch *current_gdbarch; + +/* The architecture associated with the connection to the target. + + The architecture vector provides some information that is really + a property of the target: The layout of certain packets, for instance; + or the solib_ops vector. Etc. To differentiate architecture accesses + to per-target properties from per-thread/per-frame/per-objfile properties, + accesses to per-target properties should be made through target_gdbarch. + + Eventually, when support for multiple targets is implemented in + GDB, this global should be made target-specific. */ +extern struct gdbarch *target_gdbarch; EOF # function typedef's @@ -962,6 +1003,8 @@ struct gdbarch_info /* Use default: BFD_ENDIAN_UNKNOWN (NB: is not ZERO). */ int byte_order; + int byte_order_for_code; + /* Use default: NULL (ZERO). */ bfd *abfd; @@ -1134,6 +1177,7 @@ cat <\\\\n\",\n" - printf " (long) gdbarch->${function});\n" + printf " \"gdbarch_dump: ${function} = <%%s>\\\\n\",\n" + printf " host_address_to_string (gdbarch->${function}));\n" else # It is a variable case "${print}:${returntype}" in :CORE_ADDR ) - fmt="0x%s" - print="paddr_nz (gdbarch->${function})" + fmt="%s" + print="core_addr_to_string_nz (gdbarch->${function})" ;; :* ) fmt="%s" - print="paddr_d (gdbarch->${function})" + print="plongest (gdbarch->${function})" ;; * ) fmt="%s" @@ -1814,9 +1859,9 @@ gdbarch_register (enum bfd_architecture bfd_architecture, } /* log it */ if (gdbarch_debug) - fprintf_unfiltered (gdb_stdlog, "register_gdbarch_init (%s, 0x%08lx)\n", + fprintf_unfiltered (gdb_stdlog, "register_gdbarch_init (%s, %s)\n", bfd_arch_info->printable_name, - (long) init); + host_address_to_string (init)); /* Append it */ (*curr) = XMALLOC (struct gdbarch_registration); (*curr)->bfd_architecture = bfd_architecture; @@ -1895,11 +1940,11 @@ find_arch_by_info (struct gdbarch_info info) "find_arch_by_info: info.osabi %d (%s)\n", info.osabi, gdbarch_osabi_name (info.osabi)); fprintf_unfiltered (gdb_stdlog, - "find_arch_by_info: info.abfd 0x%lx\n", - (long) info.abfd); + "find_arch_by_info: info.abfd %s\n", + host_address_to_string (info.abfd)); fprintf_unfiltered (gdb_stdlog, - "find_arch_by_info: info.tdep_info 0x%lx\n", - (long) info.tdep_info); + "find_arch_by_info: info.tdep_info %s\n", + host_address_to_string (info.tdep_info)); } /* Find the tdep code that knows about this architecture. */ @@ -1938,8 +1983,8 @@ find_arch_by_info (struct gdbarch_info info) struct gdbarch_list *this; if (gdbarch_debug) fprintf_unfiltered (gdb_stdlog, "find_arch_by_info: " - "Previous architecture 0x%08lx (%s) selected\n", - (long) new_gdbarch, + "Previous architecture %s (%s) selected\n", + host_address_to_string (new_gdbarch), new_gdbarch->bfd_arch_info->printable_name); /* Find the existing arch in the list. */ for (list = ®o->arches; @@ -1960,8 +2005,8 @@ find_arch_by_info (struct gdbarch_info info) /* It's a new architecture. */ if (gdbarch_debug) fprintf_unfiltered (gdb_stdlog, "find_arch_by_info: " - "New architecture 0x%08lx (%s) selected\n", - (long) new_gdbarch, + "New architecture %s (%s) selected\n", + host_address_to_string (new_gdbarch), new_gdbarch->bfd_arch_info->printable_name); /* Insert the new architecture into the front of the architecture @@ -2018,8 +2063,9 @@ deprecated_current_gdbarch_select_hack (struct gdbarch *new_gdbarch) gdb_assert (current_gdbarch != NULL); gdb_assert (new_gdbarch->initialized_p); current_gdbarch = new_gdbarch; + target_gdbarch = new_gdbarch; observer_notify_architecture_changed (new_gdbarch); - reinit_frame_cache (); + registers_changed (); } extern void _initialize_gdbarch (void);