X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=gdb%2Fgdbarch.h;h=c22fc7da1e8441251dcba863a2591dbdf888827c;hb=1994afbf19892c9e614a034fbf1a5233e9addce3;hp=5afb3db57cb0447466edf29842601dd6513a4fbc;hpb=6ecd47299a08f30181d8c3386c0271393b92a8d0;p=external%2Fbinutils.git diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index 5afb3db..c22fc7d 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -3,8 +3,7 @@ /* Dynamic architecture support for GDB, the GNU debugger. - Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, - 2007, 2008, 2009 Free Software Foundation, Inc. + Copyright (C) 1998-2014 Free Software Foundation, Inc. This file is part of GDB. @@ -36,9 +35,10 @@ #ifndef GDBARCH_H #define GDBARCH_H +#include "frame.h" + struct floatformat; struct ui_file; -struct frame_info; struct value; struct objfile; struct obj_section; @@ -51,12 +51,18 @@ struct target_ops; struct obstack; struct bp_target_info; struct target_desc; +struct objfile; +struct symbol; struct displaced_step_closure; struct core_regset_section; struct syscall; struct agent_expr; struct axs_value; struct stap_parse_info; +struct ravenscar_arch_ops; +struct elf_internal_linux_prpsinfo; +struct mem_range; +struct syscalls_info; /* The architecture associated with the inferior through the connection to the target. @@ -71,13 +77,7 @@ struct stap_parse_info; gdbarch. */ /* This is a convenience wrapper for 'current_inferior ()->gdbarch'. */ -#define target_gdbarch get_target_gdbarch () -extern struct gdbarch *get_target_gdbarch (void); - -/* The initial, default architecture. It uses host values (for want of a better - choice). */ -extern struct gdbarch startup_gdbarch; - +extern struct gdbarch *target_gdbarch (void); /* Callback type for the 'iterate_over_objfiles_in_search_order' gdbarch method. */ @@ -85,16 +85,20 @@ extern struct gdbarch startup_gdbarch; typedef int (iterate_over_objfiles_in_search_order_cb_ftype) (struct objfile *objfile, void *cb_data); +typedef void (iterate_over_regset_sections_cb) + (const char *sect_name, int size, const struct regset *regset, + const char *human_name, void *cb_data); + /* The following are pre-initialized by GDBARCH. */ extern const struct bfd_arch_info * gdbarch_bfd_arch_info (struct gdbarch *gdbarch); /* set_gdbarch_bfd_arch_info() - not applicable - pre-initialized. */ -extern int gdbarch_byte_order (struct gdbarch *gdbarch); +extern enum bfd_endian gdbarch_byte_order (struct gdbarch *gdbarch); /* set_gdbarch_byte_order() - not applicable - pre-initialized. */ -extern int gdbarch_byte_order_for_code (struct gdbarch *gdbarch); +extern enum bfd_endian gdbarch_byte_order_for_code (struct gdbarch *gdbarch); /* set_gdbarch_byte_order_for_code() - not applicable - pre-initialized. */ extern enum gdb_osabi gdbarch_osabi (struct gdbarch *gdbarch); @@ -342,8 +346,6 @@ typedef struct type * (gdbarch_register_type_ftype) (struct gdbarch *gdbarch, in extern struct type * gdbarch_register_type (struct gdbarch *gdbarch, int reg_nr); extern void set_gdbarch_register_type (struct gdbarch *gdbarch, gdbarch_register_type_ftype *register_type); -/* See gdbint.texinfo, and PUSH_DUMMY_CALL. */ - extern int gdbarch_dummy_id_p (struct gdbarch *gdbarch); typedef struct frame_id (gdbarch_dummy_id_ftype) (struct gdbarch *gdbarch, struct frame_info *this_frame); @@ -356,8 +358,6 @@ extern void set_gdbarch_dummy_id (struct gdbarch *gdbarch, gdbarch_dummy_id_ftyp extern int gdbarch_deprecated_fp_regnum (struct gdbarch *gdbarch); extern void set_gdbarch_deprecated_fp_regnum (struct gdbarch *gdbarch, int deprecated_fp_regnum); -/* See gdbint.texinfo. See infcall.c. */ - extern int gdbarch_push_dummy_call_p (struct gdbarch *gdbarch); typedef CORE_ADDR (gdbarch_push_dummy_call_ftype) (struct gdbarch *gdbarch, struct value *function, struct regcache *regcache, CORE_ADDR bp_addr, int nargs, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr); @@ -377,8 +377,6 @@ typedef void (gdbarch_print_registers_info_ftype) (struct gdbarch *gdbarch, stru extern void gdbarch_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file, struct frame_info *frame, int regnum, int all); extern void set_gdbarch_print_registers_info (struct gdbarch *gdbarch, gdbarch_print_registers_info_ftype *print_registers_info); -extern int gdbarch_print_float_info_p (struct gdbarch *gdbarch); - typedef void (gdbarch_print_float_info_ftype) (struct gdbarch *gdbarch, struct ui_file *file, struct frame_info *frame, const char *args); extern void gdbarch_print_float_info (struct gdbarch *gdbarch, struct ui_file *file, struct frame_info *frame, const char *args); extern void set_gdbarch_print_float_info (struct gdbarch *gdbarch, gdbarch_print_float_info_ftype *print_float_info); @@ -404,7 +402,10 @@ typedef int (gdbarch_cannot_store_register_ftype) (struct gdbarch *gdbarch, int extern int gdbarch_cannot_store_register (struct gdbarch *gdbarch, int regnum); extern void set_gdbarch_cannot_store_register (struct gdbarch *gdbarch, gdbarch_cannot_store_register_ftype *cannot_store_register); -/* setjmp/longjmp support. */ +/* Determine the address where a longjmp will land and save this address + in PC. Return nonzero on success. + + FRAME corresponds to the longjmp frame. */ extern int gdbarch_get_longjmp_target_p (struct gdbarch *gdbarch); @@ -428,12 +429,12 @@ extern void gdbarch_value_to_register (struct gdbarch *gdbarch, struct frame_inf extern void set_gdbarch_value_to_register (struct gdbarch *gdbarch, gdbarch_value_to_register_ftype *value_to_register); /* Construct a value representing the contents of register REGNUM in - frame FRAME, interpreted as type TYPE. The routine needs to + frame FRAME_ID, interpreted as type TYPE. The routine needs to allocate and return a struct value with all value attributes (but not the value contents) filled in. */ -typedef struct value * (gdbarch_value_from_register_ftype) (struct type *type, int regnum, struct frame_info *frame); -extern struct value * gdbarch_value_from_register (struct gdbarch *gdbarch, struct type *type, int regnum, struct frame_info *frame); +typedef struct value * (gdbarch_value_from_register_ftype) (struct gdbarch *gdbarch, struct type *type, int regnum, struct frame_id frame_id); +extern struct value * gdbarch_value_from_register (struct gdbarch *gdbarch, struct type *type, int regnum, struct frame_id frame_id); extern void set_gdbarch_value_from_register (struct gdbarch *gdbarch, gdbarch_value_from_register_ftype *value_from_register); typedef CORE_ADDR (gdbarch_pointer_to_address_ftype) (struct gdbarch *gdbarch, struct type *type, const gdb_byte *buf); @@ -487,6 +488,24 @@ typedef CORE_ADDR (gdbarch_skip_main_prologue_ftype) (struct gdbarch *gdbarch, C extern CORE_ADDR gdbarch_skip_main_prologue (struct gdbarch *gdbarch, CORE_ADDR ip); extern void set_gdbarch_skip_main_prologue (struct gdbarch *gdbarch, gdbarch_skip_main_prologue_ftype *skip_main_prologue); +/* On some platforms, a single function may provide multiple entry points, + e.g. one that is used for function-pointer calls and a different one + that is used for direct function calls. + In order to ensure that breakpoints set on the function will trigger + no matter via which entry point the function is entered, a platform + may provide the skip_entrypoint callback. It is called with IP set + to the main entry point of a function (as determined by the symbol table), + and should return the address of the innermost entry point, where the + actual breakpoint needs to be set. Note that skip_entrypoint is used + by GDB common code even when debugging optimized code, where skip_prologue + is not used. */ + +extern int gdbarch_skip_entrypoint_p (struct gdbarch *gdbarch); + +typedef CORE_ADDR (gdbarch_skip_entrypoint_ftype) (struct gdbarch *gdbarch, CORE_ADDR ip); +extern CORE_ADDR gdbarch_skip_entrypoint (struct gdbarch *gdbarch, CORE_ADDR ip); +extern void set_gdbarch_skip_entrypoint (struct gdbarch *gdbarch, gdbarch_skip_entrypoint_ftype *skip_entrypoint); + typedef int (gdbarch_inner_than_ftype) (CORE_ADDR lhs, CORE_ADDR rhs); extern int gdbarch_inner_than (struct gdbarch *gdbarch, CORE_ADDR lhs, CORE_ADDR rhs); extern void set_gdbarch_inner_than (struct gdbarch *gdbarch, gdbarch_inner_than_ftype *inner_than); @@ -601,13 +620,6 @@ typedef CORE_ADDR (gdbarch_addr_bits_remove_ftype) (struct gdbarch *gdbarch, COR extern CORE_ADDR gdbarch_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR addr); extern void set_gdbarch_addr_bits_remove (struct gdbarch *gdbarch, gdbarch_addr_bits_remove_ftype *addr_bits_remove); -/* It is not at all clear why gdbarch_smash_text_address is not folded into - gdbarch_addr_bits_remove. */ - -typedef CORE_ADDR (gdbarch_smash_text_address_ftype) (struct gdbarch *gdbarch, CORE_ADDR addr); -extern CORE_ADDR gdbarch_smash_text_address (struct gdbarch *gdbarch, CORE_ADDR addr); -extern void set_gdbarch_smash_text_address (struct gdbarch *gdbarch, gdbarch_smash_text_address_ftype *smash_text_address); - /* 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 implement it. @@ -676,6 +688,16 @@ typedef int (gdbarch_in_function_epilogue_p_ftype) (struct gdbarch *gdbarch, COR extern int gdbarch_in_function_epilogue_p (struct gdbarch *gdbarch, CORE_ADDR addr); extern void set_gdbarch_in_function_epilogue_p (struct gdbarch *gdbarch, gdbarch_in_function_epilogue_p_ftype *in_function_epilogue_p); +/* Process an ELF symbol in the minimal symbol table in a backend-specific + way. Normally this hook is supposed to do nothing, however if required, + then this hook can be used to apply tranformations to symbols that are + considered special in some way. For example the MIPS backend uses it + to interpret `st_other' information to mark compressed code symbols so + that they can be treated in the appropriate manner in the processing of + the main symbol table and DWARF-2 records. */ + +extern int gdbarch_elf_make_msymbol_special_p (struct gdbarch *gdbarch); + typedef void (gdbarch_elf_make_msymbol_special_ftype) (asymbol *sym, struct minimal_symbol *msym); extern void gdbarch_elf_make_msymbol_special (struct gdbarch *gdbarch, asymbol *sym, struct minimal_symbol *msym); extern void set_gdbarch_elf_make_msymbol_special (struct gdbarch *gdbarch, gdbarch_elf_make_msymbol_special_ftype *elf_make_msymbol_special); @@ -684,6 +706,45 @@ typedef void (gdbarch_coff_make_msymbol_special_ftype) (int val, struct minimal_ extern void gdbarch_coff_make_msymbol_special (struct gdbarch *gdbarch, int val, struct minimal_symbol *msym); extern void set_gdbarch_coff_make_msymbol_special (struct gdbarch *gdbarch, gdbarch_coff_make_msymbol_special_ftype *coff_make_msymbol_special); +/* Process a symbol in the main symbol table in a backend-specific way. + Normally this hook is supposed to do nothing, however if required, + then this hook can be used to apply tranformations to symbols that + are considered special in some way. This is currently used by the + MIPS backend to make sure compressed code symbols have the ISA bit + set. This in turn is needed for symbol values seen in GDB to match + the values used at the runtime by the program itself, for function + and label references. */ + +typedef void (gdbarch_make_symbol_special_ftype) (struct symbol *sym, struct objfile *objfile); +extern void gdbarch_make_symbol_special (struct gdbarch *gdbarch, struct symbol *sym, struct objfile *objfile); +extern void set_gdbarch_make_symbol_special (struct gdbarch *gdbarch, gdbarch_make_symbol_special_ftype *make_symbol_special); + +/* Adjust the address retrieved from a DWARF-2 record other than a line + entry in a backend-specific way. Normally this hook is supposed to + return the address passed unchanged, however if that is incorrect for + any reason, then this hook can be used to fix the address up in the + required manner. This is currently used by the MIPS backend to make + sure addresses in FDE, range records, etc. referring to compressed + code have the ISA bit set, matching line information and the symbol + table. */ + +typedef CORE_ADDR (gdbarch_adjust_dwarf2_addr_ftype) (CORE_ADDR pc); +extern CORE_ADDR gdbarch_adjust_dwarf2_addr (struct gdbarch *gdbarch, CORE_ADDR pc); +extern void set_gdbarch_adjust_dwarf2_addr (struct gdbarch *gdbarch, gdbarch_adjust_dwarf2_addr_ftype *adjust_dwarf2_addr); + +/* Adjust the address updated by a line entry in a backend-specific way. + Normally this hook is supposed to return the address passed unchanged, + however in the case of inconsistencies in these records, this hook can + be used to fix them up in the required manner. This is currently used + by the MIPS backend to make sure all line addresses in compressed code + are presented with the ISA bit set, which is not always the case. This + in turn ensures breakpoint addresses are correctly matched against the + stop PC. */ + +typedef CORE_ADDR (gdbarch_adjust_dwarf2_line_ftype) (CORE_ADDR addr, int rel); +extern CORE_ADDR gdbarch_adjust_dwarf2_line (struct gdbarch *gdbarch, CORE_ADDR addr, int rel); +extern void set_gdbarch_adjust_dwarf2_line (struct gdbarch *gdbarch, gdbarch_adjust_dwarf2_line_ftype *adjust_dwarf2_line); + extern int gdbarch_cannot_step_breakpoint (struct gdbarch *gdbarch); extern void set_gdbarch_cannot_step_breakpoint (struct gdbarch *gdbarch, int cannot_step_breakpoint); @@ -702,6 +763,10 @@ typedef const char * (gdbarch_address_class_type_flags_to_name_ftype) (struct gd extern const char * gdbarch_address_class_type_flags_to_name (struct gdbarch *gdbarch, int type_flags); extern void set_gdbarch_address_class_type_flags_to_name (struct gdbarch *gdbarch, gdbarch_address_class_type_flags_to_name_ftype *address_class_type_flags_to_name); +/* Return the appropriate type_flags for the supplied address class. + This function should return 1 if the address class was recognized and + type_flags was set, zero otherwise. */ + extern int gdbarch_address_class_name_to_type_flags_p (struct gdbarch *gdbarch); typedef int (gdbarch_address_class_name_to_type_flags_ftype) (struct gdbarch *gdbarch, const char *name, int *type_flags_ptr); @@ -722,19 +787,18 @@ typedef CORE_ADDR (gdbarch_fetch_pointer_argument_ftype) (struct frame_info *fra extern CORE_ADDR gdbarch_fetch_pointer_argument (struct gdbarch *gdbarch, struct frame_info *frame, int argi, struct type *type); extern void set_gdbarch_fetch_pointer_argument (struct gdbarch *gdbarch, gdbarch_fetch_pointer_argument_ftype *fetch_pointer_argument); -/* Return the appropriate register set for a core file section with - name SECT_NAME and size SECT_SIZE. */ - -extern int gdbarch_regset_from_core_section_p (struct gdbarch *gdbarch); +/* Iterate over all supported register notes in a core file. For each + supported register note section, the iterator must call CB and pass + CB_DATA unchanged. If REGCACHE is not NULL, the iterator can limit + the supported register note sections based on the current register + values. Otherwise it should enumerate all supported register note + sections. */ -typedef const struct regset * (gdbarch_regset_from_core_section_ftype) (struct gdbarch *gdbarch, const char *sect_name, size_t sect_size); -extern const struct regset * gdbarch_regset_from_core_section (struct gdbarch *gdbarch, const char *sect_name, size_t sect_size); -extern void set_gdbarch_regset_from_core_section (struct gdbarch *gdbarch, gdbarch_regset_from_core_section_ftype *regset_from_core_section); +extern int gdbarch_iterate_over_regset_sections_p (struct gdbarch *gdbarch); -/* Supported register notes in a core file. */ - -extern struct core_regset_section * gdbarch_core_regset_sections (struct gdbarch *gdbarch); -extern void set_gdbarch_core_regset_sections (struct gdbarch *gdbarch, struct core_regset_section * core_regset_sections); +typedef void (gdbarch_iterate_over_regset_sections_ftype) (struct gdbarch *gdbarch, iterate_over_regset_sections_cb *cb, void *cb_data, const struct regcache *regcache); +extern void gdbarch_iterate_over_regset_sections (struct gdbarch *gdbarch, iterate_over_regset_sections_cb *cb, void *cb_data, const struct regcache *regcache); +extern void set_gdbarch_iterate_over_regset_sections (struct gdbarch *gdbarch, gdbarch_iterate_over_regset_sections_ftype *iterate_over_regset_sections); /* Create core file notes */ @@ -744,6 +808,18 @@ typedef char * (gdbarch_make_corefile_notes_ftype) (struct gdbarch *gdbarch, bfd extern char * gdbarch_make_corefile_notes (struct gdbarch *gdbarch, bfd *obfd, int *note_size); extern void set_gdbarch_make_corefile_notes (struct gdbarch *gdbarch, gdbarch_make_corefile_notes_ftype *make_corefile_notes); +/* The elfcore writer hook to use to write Linux prpsinfo notes to core + files. Most Linux architectures use the same prpsinfo32 or + prpsinfo64 layouts, and so won't need to provide this hook, as we + call the Linux generic routines in bfd to write prpsinfo notes by + default. */ + +extern int gdbarch_elfcore_write_linux_prpsinfo_p (struct gdbarch *gdbarch); + +typedef char * (gdbarch_elfcore_write_linux_prpsinfo_ftype) (bfd *obfd, char *note_data, int *note_size, const struct elf_internal_linux_prpsinfo *info); +extern char * gdbarch_elfcore_write_linux_prpsinfo (struct gdbarch *gdbarch, bfd *obfd, char *note_data, int *note_size, const struct elf_internal_linux_prpsinfo *info); +extern void set_gdbarch_elfcore_write_linux_prpsinfo (struct gdbarch *gdbarch, gdbarch_elfcore_write_linux_prpsinfo_ftype *elfcore_write_linux_prpsinfo); + /* Find core file memory regions */ extern int gdbarch_find_memory_regions_p (struct gdbarch *gdbarch); @@ -753,14 +829,26 @@ extern int gdbarch_find_memory_regions (struct gdbarch *gdbarch, find_memory_reg extern void set_gdbarch_find_memory_regions (struct gdbarch *gdbarch, gdbarch_find_memory_regions_ftype *find_memory_regions); /* Read offset OFFSET of TARGET_OBJECT_LIBRARIES formatted shared libraries list from - core file into buffer READBUF with length LEN. */ + core file into buffer READBUF with length LEN. Return the number of bytes read + (zero indicates failure). + failed, otherwise, return the red length of READBUF. */ extern int gdbarch_core_xfer_shared_libraries_p (struct gdbarch *gdbarch); -typedef LONGEST (gdbarch_core_xfer_shared_libraries_ftype) (struct gdbarch *gdbarch, gdb_byte *readbuf, ULONGEST offset, LONGEST len); -extern LONGEST gdbarch_core_xfer_shared_libraries (struct gdbarch *gdbarch, gdb_byte *readbuf, ULONGEST offset, LONGEST len); +typedef ULONGEST (gdbarch_core_xfer_shared_libraries_ftype) (struct gdbarch *gdbarch, gdb_byte *readbuf, ULONGEST offset, ULONGEST len); +extern ULONGEST gdbarch_core_xfer_shared_libraries (struct gdbarch *gdbarch, gdb_byte *readbuf, ULONGEST offset, ULONGEST len); extern void set_gdbarch_core_xfer_shared_libraries (struct gdbarch *gdbarch, gdbarch_core_xfer_shared_libraries_ftype *core_xfer_shared_libraries); +/* Read offset OFFSET of TARGET_OBJECT_LIBRARIES_AIX formatted shared + libraries list from core file into buffer READBUF with length LEN. + Return the number of bytes read (zero indicates failure). */ + +extern int gdbarch_core_xfer_shared_libraries_aix_p (struct gdbarch *gdbarch); + +typedef ULONGEST (gdbarch_core_xfer_shared_libraries_aix_ftype) (struct gdbarch *gdbarch, gdb_byte *readbuf, ULONGEST offset, ULONGEST len); +extern ULONGEST gdbarch_core_xfer_shared_libraries_aix (struct gdbarch *gdbarch, gdb_byte *readbuf, ULONGEST offset, ULONGEST len); +extern void set_gdbarch_core_xfer_shared_libraries_aix (struct gdbarch *gdbarch, gdbarch_core_xfer_shared_libraries_aix_ftype *core_xfer_shared_libraries_aix); + /* How the core target converts a PTID from a core file to a string. */ extern int gdbarch_core_pid_to_str_p (struct gdbarch *gdbarch); @@ -791,8 +879,6 @@ extern void set_gdbarch_vbit_in_delta (struct gdbarch *gdbarch, int vbit_in_delt /* Advance PC to next instruction in order to skip a permanent breakpoint. */ -extern int gdbarch_skip_permanent_breakpoint_p (struct gdbarch *gdbarch); - typedef void (gdbarch_skip_permanent_breakpoint_ftype) (struct regcache *regcache); extern void gdbarch_skip_permanent_breakpoint (struct gdbarch *gdbarch, struct regcache *regcache); extern void set_gdbarch_skip_permanent_breakpoint (struct gdbarch *gdbarch, gdbarch_skip_permanent_breakpoint_ftype *skip_permanent_breakpoint); @@ -979,6 +1065,20 @@ typedef enum gdb_signal (gdbarch_gdb_signal_from_target_ftype) (struct gdbarch * extern enum gdb_signal gdbarch_gdb_signal_from_target (struct gdbarch *gdbarch, int signo); extern void set_gdbarch_gdb_signal_from_target (struct gdbarch *gdbarch, gdbarch_gdb_signal_from_target_ftype *gdb_signal_from_target); +/* Signal translation: translate the GDB's internal signal number into + the inferior's signal (target's) representation. The implementation + of this method must be host independent. IOW, don't rely on symbols + of the NAT_FILE header (the nm-*.h files), the host + header, or similar headers. + Return the target signal number if found, or -1 if the GDB internal + signal number is invalid. */ + +extern int gdbarch_gdb_signal_to_target_p (struct gdbarch *gdbarch); + +typedef int (gdbarch_gdb_signal_to_target_ftype) (struct gdbarch *gdbarch, enum gdb_signal signal); +extern int gdbarch_gdb_signal_to_target (struct gdbarch *gdbarch, enum gdb_signal signal); +extern void set_gdbarch_gdb_signal_to_target (struct gdbarch *gdbarch, gdbarch_gdb_signal_to_target_ftype *gdb_signal_to_target); + /* Extra signal info inspection. Return a type suitable to inspect extra signal information. */ @@ -1006,38 +1106,53 @@ typedef LONGEST (gdbarch_get_syscall_number_ftype) (struct gdbarch *gdbarch, pti extern LONGEST gdbarch_get_syscall_number (struct gdbarch *gdbarch, ptid_t ptid); extern void set_gdbarch_get_syscall_number (struct gdbarch *gdbarch, gdbarch_get_syscall_number_ftype *get_syscall_number); +/* The filename of the XML syscall for this architecture. */ + +extern const char * gdbarch_xml_syscall_file (struct gdbarch *gdbarch); +extern void set_gdbarch_xml_syscall_file (struct gdbarch *gdbarch, const char * xml_syscall_file); + +/* Information about system calls from this architecture */ + +extern struct syscalls_info * gdbarch_syscalls_info (struct gdbarch *gdbarch); +extern void set_gdbarch_syscalls_info (struct gdbarch *gdbarch, struct syscalls_info * syscalls_info); + /* SystemTap related fields and functions. - Prefix used to mark an integer constant on the architecture's assembly + A NULL-terminated array of prefixes used to mark an integer constant + on the architecture's assembly. For example, on x86 integer constants are written as: $10 ;; integer constant 10 in this case, this prefix would be the character `$'. */ -extern const char * gdbarch_stap_integer_prefix (struct gdbarch *gdbarch); -extern void set_gdbarch_stap_integer_prefix (struct gdbarch *gdbarch, const char * stap_integer_prefix); +extern const char *const * gdbarch_stap_integer_prefixes (struct gdbarch *gdbarch); +extern void set_gdbarch_stap_integer_prefixes (struct gdbarch *gdbarch, const char *const * stap_integer_prefixes); -/* Suffix used to mark an integer constant on the architecture's assembly. */ +/* A NULL-terminated array of suffixes used to mark an integer constant + on the architecture's assembly. */ -extern const char * gdbarch_stap_integer_suffix (struct gdbarch *gdbarch); -extern void set_gdbarch_stap_integer_suffix (struct gdbarch *gdbarch, const char * stap_integer_suffix); +extern const char *const * gdbarch_stap_integer_suffixes (struct gdbarch *gdbarch); +extern void set_gdbarch_stap_integer_suffixes (struct gdbarch *gdbarch, const char *const * stap_integer_suffixes); -/* Prefix used to mark a register name on the architecture's assembly. +/* A NULL-terminated array of prefixes used to mark a register name on + the architecture's assembly. For example, on x86 the register name is written as: %eax ;; register eax in this case, this prefix would be the character `%'. */ -extern const char * gdbarch_stap_register_prefix (struct gdbarch *gdbarch); -extern void set_gdbarch_stap_register_prefix (struct gdbarch *gdbarch, const char * stap_register_prefix); +extern const char *const * gdbarch_stap_register_prefixes (struct gdbarch *gdbarch); +extern void set_gdbarch_stap_register_prefixes (struct gdbarch *gdbarch, const char *const * stap_register_prefixes); -/* Suffix used to mark a register name on the architecture's assembly */ +/* A NULL-terminated array of suffixes used to mark a register name on + the architecture's assembly. */ -extern const char * gdbarch_stap_register_suffix (struct gdbarch *gdbarch); -extern void set_gdbarch_stap_register_suffix (struct gdbarch *gdbarch, const char * stap_register_suffix); +extern const char *const * gdbarch_stap_register_suffixes (struct gdbarch *gdbarch); +extern void set_gdbarch_stap_register_suffixes (struct gdbarch *gdbarch, const char *const * stap_register_suffixes); -/* Prefix used to mark a register indirection on the architecture's assembly. +/* A NULL-terminated array of prefixes used to mark a register + indirection on the architecture's assembly. For example, on x86 the register indirection is written as: (%eax) ;; indirecting eax @@ -1047,10 +1162,11 @@ extern void set_gdbarch_stap_register_suffix (struct gdbarch *gdbarch, const cha Please note that we use the indirection prefix also for register displacement, e.g., `4(%eax)' on x86. */ -extern const char * gdbarch_stap_register_indirection_prefix (struct gdbarch *gdbarch); -extern void set_gdbarch_stap_register_indirection_prefix (struct gdbarch *gdbarch, const char * stap_register_indirection_prefix); +extern const char *const * gdbarch_stap_register_indirection_prefixes (struct gdbarch *gdbarch); +extern void set_gdbarch_stap_register_indirection_prefixes (struct gdbarch *gdbarch, const char *const * stap_register_indirection_prefixes); -/* Suffix used to mark a register indirection on the architecture's assembly. +/* A NULL-terminated array of suffixes used to mark a register + indirection on the architecture's assembly. For example, on x86 the register indirection is written as: (%eax) ;; indirecting eax @@ -1060,10 +1176,10 @@ extern void set_gdbarch_stap_register_indirection_prefix (struct gdbarch *gdbarc Please note that we use the indirection suffix also for register displacement, e.g., `4(%eax)' on x86. */ -extern const char * gdbarch_stap_register_indirection_suffix (struct gdbarch *gdbarch); -extern void set_gdbarch_stap_register_indirection_suffix (struct gdbarch *gdbarch, const char * stap_register_indirection_suffix); +extern const char *const * gdbarch_stap_register_indirection_suffixes (struct gdbarch *gdbarch); +extern void set_gdbarch_stap_register_indirection_suffixes (struct gdbarch *gdbarch, const char *const * stap_register_indirection_suffixes); -/* Prefix used to name a register using GDB's nomenclature. +/* Prefix(es) used to name a register using GDB's nomenclature. For example, on PPC a register is represented by a number in the assembly language (e.g., `10' is the 10th general-purpose register). However, @@ -1197,10 +1313,20 @@ extern void set_gdbarch_gen_return_address (struct gdbarch *gdbarch, gdbarch_gen extern int gdbarch_info_proc_p (struct gdbarch *gdbarch); -typedef void (gdbarch_info_proc_ftype) (struct gdbarch *gdbarch, char *args, enum info_proc_what what); -extern void gdbarch_info_proc (struct gdbarch *gdbarch, char *args, enum info_proc_what what); +typedef void (gdbarch_info_proc_ftype) (struct gdbarch *gdbarch, const char *args, enum info_proc_what what); +extern void gdbarch_info_proc (struct gdbarch *gdbarch, const char *args, enum info_proc_what what); extern void set_gdbarch_info_proc (struct gdbarch *gdbarch, gdbarch_info_proc_ftype *info_proc); +/* Implement the "info proc" command for core files. Noe that there + are two "info_proc"-like methods on gdbarch -- one for core files, + one for live targets. */ + +extern int gdbarch_core_info_proc_p (struct gdbarch *gdbarch); + +typedef void (gdbarch_core_info_proc_ftype) (struct gdbarch *gdbarch, const char *args, enum info_proc_what what); +extern void gdbarch_core_info_proc (struct gdbarch *gdbarch, const char *args, enum info_proc_what what); +extern void set_gdbarch_core_info_proc (struct gdbarch *gdbarch, gdbarch_core_info_proc_ftype *core_info_proc); + /* Iterate over all objfiles in the order that makes the most sense for the architecture to make global symbol searches. @@ -1219,6 +1345,76 @@ typedef void (gdbarch_iterate_over_objfiles_in_search_order_ftype) (struct gdbar extern void gdbarch_iterate_over_objfiles_in_search_order (struct gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype *cb, void *cb_data, struct objfile *current_objfile); extern void set_gdbarch_iterate_over_objfiles_in_search_order (struct gdbarch *gdbarch, gdbarch_iterate_over_objfiles_in_search_order_ftype *iterate_over_objfiles_in_search_order); +/* Ravenscar arch-dependent ops. */ + +extern struct ravenscar_arch_ops * gdbarch_ravenscar_ops (struct gdbarch *gdbarch); +extern void set_gdbarch_ravenscar_ops (struct gdbarch *gdbarch, struct ravenscar_arch_ops * ravenscar_ops); + +/* Return non-zero if the instruction at ADDR is a call; zero otherwise. */ + +typedef int (gdbarch_insn_is_call_ftype) (struct gdbarch *gdbarch, CORE_ADDR addr); +extern int gdbarch_insn_is_call (struct gdbarch *gdbarch, CORE_ADDR addr); +extern void set_gdbarch_insn_is_call (struct gdbarch *gdbarch, gdbarch_insn_is_call_ftype *insn_is_call); + +/* Return non-zero if the instruction at ADDR is a return; zero otherwise. */ + +typedef int (gdbarch_insn_is_ret_ftype) (struct gdbarch *gdbarch, CORE_ADDR addr); +extern int gdbarch_insn_is_ret (struct gdbarch *gdbarch, CORE_ADDR addr); +extern void set_gdbarch_insn_is_ret (struct gdbarch *gdbarch, gdbarch_insn_is_ret_ftype *insn_is_ret); + +/* Return non-zero if the instruction at ADDR is a jump; zero otherwise. */ + +typedef int (gdbarch_insn_is_jump_ftype) (struct gdbarch *gdbarch, CORE_ADDR addr); +extern int gdbarch_insn_is_jump (struct gdbarch *gdbarch, CORE_ADDR addr); +extern void set_gdbarch_insn_is_jump (struct gdbarch *gdbarch, gdbarch_insn_is_jump_ftype *insn_is_jump); + +/* Read one auxv entry from *READPTR, not reading locations >= ENDPTR. + Return 0 if *READPTR is already at the end of the buffer. + Return -1 if there is insufficient buffer for a whole entry. + Return 1 if an entry was read into *TYPEP and *VALP. */ + +extern int gdbarch_auxv_parse_p (struct gdbarch *gdbarch); + +typedef int (gdbarch_auxv_parse_ftype) (struct gdbarch *gdbarch, gdb_byte **readptr, gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp); +extern int gdbarch_auxv_parse (struct gdbarch *gdbarch, gdb_byte **readptr, gdb_byte *endptr, CORE_ADDR *typep, CORE_ADDR *valp); +extern void set_gdbarch_auxv_parse (struct gdbarch *gdbarch, gdbarch_auxv_parse_ftype *auxv_parse); + +/* Find the address range of the current inferior's vsyscall/vDSO, and + write it to *RANGE. If the vsyscall's length can't be determined, a + range with zero length is returned. Returns true if the vsyscall is + found, false otherwise. */ + +typedef int (gdbarch_vsyscall_range_ftype) (struct gdbarch *gdbarch, struct mem_range *range); +extern int gdbarch_vsyscall_range (struct gdbarch *gdbarch, struct mem_range *range); +extern void set_gdbarch_vsyscall_range (struct gdbarch *gdbarch, gdbarch_vsyscall_range_ftype *vsyscall_range); + +/* Allocate SIZE bytes of PROT protected page aligned memory in inferior. + PROT has GDB_MMAP_PROT_* bitmask format. + Throw an error if it is not possible. Returned address is always valid. */ + +typedef CORE_ADDR (gdbarch_infcall_mmap_ftype) (CORE_ADDR size, unsigned prot); +extern CORE_ADDR gdbarch_infcall_mmap (struct gdbarch *gdbarch, CORE_ADDR size, unsigned prot); +extern void set_gdbarch_infcall_mmap (struct gdbarch *gdbarch, gdbarch_infcall_mmap_ftype *infcall_mmap); + +/* Return string (caller has to use xfree for it) with options for GCC + to produce code for this target, typically "-m64", "-m32" or "-m31". + These options are put before CU's DW_AT_producer compilation options so that + they can override it. Method may also return NULL. */ + +typedef char * (gdbarch_gcc_target_options_ftype) (struct gdbarch *gdbarch); +extern char * gdbarch_gcc_target_options (struct gdbarch *gdbarch); +extern void set_gdbarch_gcc_target_options (struct gdbarch *gdbarch, gdbarch_gcc_target_options_ftype *gcc_target_options); + +/* Return a regular expression that matches names used by this + architecture in GNU configury triplets. The result is statically + allocated and must not be freed. The default implementation simply + returns the BFD architecture name, which is correct in nearly every + case. */ + +typedef const char * (gdbarch_gnu_triplet_regexp_ftype) (struct gdbarch *gdbarch); +extern const char * gdbarch_gnu_triplet_regexp (struct gdbarch *gdbarch); +extern void set_gdbarch_gnu_triplet_regexp (struct gdbarch *gdbarch, gdbarch_gnu_triplet_regexp_ftype *gnu_triplet_regexp); + /* Definition for an unknown syscall, used basically in error-cases. */ #define UNKNOWN_SYSCALL (-1) @@ -1294,9 +1490,9 @@ struct gdbarch_info const struct bfd_arch_info *bfd_arch_info; /* Use default: BFD_ENDIAN_UNKNOWN (NB: is not ZERO). */ - int byte_order; + enum bfd_endian byte_order; - int byte_order_for_code; + enum bfd_endian byte_order_for_code; /* Use default: NULL (ZERO). */ bfd *abfd; @@ -1383,15 +1579,9 @@ extern int gdbarch_update_p (struct gdbarch_info info); extern struct gdbarch *gdbarch_find_by_info (struct gdbarch_info info); -/* Helper function. Set the global "target_gdbarch" to "gdbarch". - - FIXME: kettenis/20031124: Of the functions that follow, only - gdbarch_from_bfd is supposed to survive. The others will - dissappear since in the future GDB will (hopefully) be truly - multi-arch. However, for now we're still stuck with the concept of - a single active architecture. */ +/* Helper function. Set the target gdbarch to "gdbarch". */ -extern void deprecated_target_gdbarch_select_hack (struct gdbarch *gdbarch); +extern void set_target_gdbarch (struct gdbarch *gdbarch); /* Register per-architecture data-pointer.