| Index: gdb/gdbarch.h
|
| diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h
|
| index 46c5afa3300880de6e5c8841ee0da2fe3ba894bb..a239aa45966fcfc5aa34f50dc25ae9ddff210bcc 100644
|
| --- a/gdb/gdbarch.h
|
| +++ b/gdb/gdbarch.h
|
| @@ -55,6 +55,7 @@ struct core_regset_section;
|
| struct syscall;
|
| struct agent_expr;
|
| struct axs_value;
|
| +struct stap_parse_info;
|
|
|
| /* The architecture associated with the connection to the target.
|
|
|
| @@ -68,6 +69,12 @@ struct axs_value;
|
| GDB, this global should be made target-specific. */
|
| extern struct gdbarch *target_gdbarch;
|
|
|
| +/* Callback type for the 'iterate_over_objfiles_in_search_order'
|
| + gdbarch method. */
|
| +
|
| +typedef int (iterate_over_objfiles_in_search_order_cb_ftype)
|
| + (struct objfile *objfile, void *cb_data);
|
| +
|
|
|
| /* The following are pre-initialized by GDBARCH. */
|
|
|
| @@ -433,8 +440,8 @@ typedef CORE_ADDR (gdbarch_integer_to_address_ftype) (struct gdbarch *gdbarch, s
|
| extern CORE_ADDR gdbarch_integer_to_address (struct gdbarch *gdbarch, struct type *type, const gdb_byte *buf);
|
| extern void set_gdbarch_integer_to_address (struct gdbarch *gdbarch, gdbarch_integer_to_address_ftype *integer_to_address);
|
|
|
| -/* Return the return-value convention that will be used by FUNCTYPE
|
| - to return a value of type VALTYPE. FUNCTYPE may be NULL in which
|
| +/* Return the return-value convention that will be used by FUNCTION
|
| + to return a value of type VALTYPE. FUNCTION may be NULL in which
|
| case the return convention is computed based only on VALTYPE.
|
|
|
| If READBUF is not NULL, extract the return value and save it in this buffer.
|
| @@ -446,10 +453,20 @@ extern void set_gdbarch_integer_to_address (struct gdbarch *gdbarch, gdbarch_int
|
|
|
| extern int gdbarch_return_value_p (struct gdbarch *gdbarch);
|
|
|
| -typedef enum return_value_convention (gdbarch_return_value_ftype) (struct gdbarch *gdbarch, struct type *functype, struct type *valtype, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf);
|
| -extern enum return_value_convention gdbarch_return_value (struct gdbarch *gdbarch, struct type *functype, struct type *valtype, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf);
|
| +typedef enum return_value_convention (gdbarch_return_value_ftype) (struct gdbarch *gdbarch, struct value *function, struct type *valtype, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf);
|
| +extern enum return_value_convention gdbarch_return_value (struct gdbarch *gdbarch, struct value *function, struct type *valtype, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf);
|
| extern void set_gdbarch_return_value (struct gdbarch *gdbarch, gdbarch_return_value_ftype *return_value);
|
|
|
| +/* Return true if the return value of function is stored in the first hidden
|
| + parameter. In theory, this feature should be language-dependent, specified
|
| + by language and its ABI, such as C++. Unfortunately, compiler may
|
| + implement it to a target-dependent feature. So that we need such hook here
|
| + to be aware of this in GDB. */
|
| +
|
| +typedef int (gdbarch_return_in_first_hidden_param_p_ftype) (struct gdbarch *gdbarch, struct type *type);
|
| +extern int gdbarch_return_in_first_hidden_param_p (struct gdbarch *gdbarch, struct type *type);
|
| +extern void set_gdbarch_return_in_first_hidden_param_p (struct gdbarch *gdbarch, gdbarch_return_in_first_hidden_param_p_ftype *return_in_first_hidden_param_p);
|
| +
|
| typedef CORE_ADDR (gdbarch_skip_prologue_ftype) (struct gdbarch *gdbarch, CORE_ADDR ip);
|
| extern CORE_ADDR gdbarch_skip_prologue (struct gdbarch *gdbarch, CORE_ADDR ip);
|
| extern void set_gdbarch_skip_prologue (struct gdbarch *gdbarch, gdbarch_skip_prologue_ftype *skip_prologue);
|
| @@ -631,8 +648,8 @@ extern void set_gdbarch_skip_solib_resolver (struct gdbarch *gdbarch, gdbarch_sk
|
|
|
| /* Some systems also have trampoline code for returning from shared libs. */
|
|
|
| -typedef int (gdbarch_in_solib_return_trampoline_ftype) (struct gdbarch *gdbarch, CORE_ADDR pc, char *name);
|
| -extern int gdbarch_in_solib_return_trampoline (struct gdbarch *gdbarch, CORE_ADDR pc, char *name);
|
| +typedef int (gdbarch_in_solib_return_trampoline_ftype) (struct gdbarch *gdbarch, CORE_ADDR pc, const char *name);
|
| +extern int gdbarch_in_solib_return_trampoline (struct gdbarch *gdbarch, CORE_ADDR pc, const char *name);
|
| extern void set_gdbarch_in_solib_return_trampoline (struct gdbarch *gdbarch, gdbarch_in_solib_return_trampoline_ftype *in_solib_return_trampoline);
|
|
|
| /* A target might have problems with watchpoints as soon as the stack
|
| @@ -709,6 +726,22 @@ extern void set_gdbarch_regset_from_core_section (struct gdbarch *gdbarch, gdbar
|
| 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);
|
|
|
| +/* Create core file notes */
|
| +
|
| +extern int gdbarch_make_corefile_notes_p (struct gdbarch *gdbarch);
|
| +
|
| +typedef char * (gdbarch_make_corefile_notes_ftype) (struct gdbarch *gdbarch, bfd *obfd, int *note_size);
|
| +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);
|
| +
|
| +/* Find core file memory regions */
|
| +
|
| +extern int gdbarch_find_memory_regions_p (struct gdbarch *gdbarch);
|
| +
|
| +typedef int (gdbarch_find_memory_regions_ftype) (struct gdbarch *gdbarch, find_memory_region_ftype func, void *data);
|
| +extern int gdbarch_find_memory_regions (struct gdbarch *gdbarch, find_memory_region_ftype func, void *data);
|
| +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. */
|
|
|
| @@ -754,7 +787,7 @@ typedef void (gdbarch_skip_permanent_breakpoint_ftype) (struct regcache *regcach
|
| 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);
|
|
|
| -/* The maximum length of an instruction on this architecture. */
|
| +/* The maximum length of an instruction on this architecture in bytes. */
|
|
|
| extern int gdbarch_max_insn_length_p (struct gdbarch *gdbarch);
|
|
|
| @@ -893,8 +926,8 @@ extern void set_gdbarch_core_read_description (struct gdbarch *gdbarch, gdbarch_
|
|
|
| extern int gdbarch_static_transform_name_p (struct gdbarch *gdbarch);
|
|
|
| -typedef char * (gdbarch_static_transform_name_ftype) (char *name);
|
| -extern char * gdbarch_static_transform_name (struct gdbarch *gdbarch, char *name);
|
| +typedef const char * (gdbarch_static_transform_name_ftype) (const char *name);
|
| +extern const char * gdbarch_static_transform_name (struct gdbarch *gdbarch, const char *name);
|
| extern void set_gdbarch_static_transform_name (struct gdbarch *gdbarch, gdbarch_static_transform_name_ftype *static_transform_name);
|
|
|
| /* Set if the address in N_SO or N_FUN stabs may be zero. */
|
| @@ -918,23 +951,23 @@ extern void set_gdbarch_process_record (struct gdbarch *gdbarch, gdbarch_process
|
|
|
| extern int gdbarch_process_record_signal_p (struct gdbarch *gdbarch);
|
|
|
| -typedef int (gdbarch_process_record_signal_ftype) (struct gdbarch *gdbarch, struct regcache *regcache, enum target_signal signal);
|
| -extern int gdbarch_process_record_signal (struct gdbarch *gdbarch, struct regcache *regcache, enum target_signal signal);
|
| +typedef int (gdbarch_process_record_signal_ftype) (struct gdbarch *gdbarch, struct regcache *regcache, enum gdb_signal signal);
|
| +extern int gdbarch_process_record_signal (struct gdbarch *gdbarch, struct regcache *regcache, enum gdb_signal signal);
|
| extern void set_gdbarch_process_record_signal (struct gdbarch *gdbarch, gdbarch_process_record_signal_ftype *process_record_signal);
|
|
|
| -/* Signal translation: translate inferior's signal (host's) number into
|
| - GDB's representation. */
|
| +/* Signal translation: translate inferior's signal (target's) number
|
| + into GDB'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 <signal.h> header, or similar
|
| + headers. This is mainly used when cross-debugging core files ---
|
| + "Live" targets hide the translation behind the target interface
|
| + (target_wait, target_resume, etc.). */
|
|
|
| -typedef enum target_signal (gdbarch_target_signal_from_host_ftype) (struct gdbarch *gdbarch, int signo);
|
| -extern enum target_signal gdbarch_target_signal_from_host (struct gdbarch *gdbarch, int signo);
|
| -extern void set_gdbarch_target_signal_from_host (struct gdbarch *gdbarch, gdbarch_target_signal_from_host_ftype *target_signal_from_host);
|
| +extern int gdbarch_gdb_signal_from_target_p (struct gdbarch *gdbarch);
|
|
|
| -/* Signal translation: translate GDB's signal number into inferior's host
|
| - signal number. */
|
| -
|
| -typedef int (gdbarch_target_signal_to_host_ftype) (struct gdbarch *gdbarch, enum target_signal ts);
|
| -extern int gdbarch_target_signal_to_host (struct gdbarch *gdbarch, enum target_signal ts);
|
| -extern void set_gdbarch_target_signal_to_host (struct gdbarch *gdbarch, gdbarch_target_signal_to_host_ftype *target_signal_to_host);
|
| +typedef enum gdb_signal (gdbarch_gdb_signal_from_target_ftype) (struct gdbarch *gdbarch, int signo);
|
| +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);
|
|
|
| /* Extra signal info inspection.
|
|
|
| @@ -963,6 +996,125 @@ 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);
|
|
|
| +/* SystemTap related fields and functions.
|
| + Prefix 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);
|
| +
|
| +/* Suffix 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);
|
| +
|
| +/* Prefix 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);
|
| +
|
| +/* Suffix 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);
|
| +
|
| +/* Prefix used to mark a register indirection on the architecture's assembly.
|
| + For example, on x86 the register indirection is written as:
|
| +
|
| + (%eax) ;; indirecting eax
|
| +
|
| + in this case, this prefix would be the charater `('.
|
| +
|
| + 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);
|
| +
|
| +/* Suffix used to mark a register indirection on the architecture's assembly.
|
| + For example, on x86 the register indirection is written as:
|
| +
|
| + (%eax) ;; indirecting eax
|
| +
|
| + in this case, this prefix would be the charater `)'.
|
| +
|
| + 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);
|
| +
|
| +/* Prefix 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,
|
| + inside GDB this same register has an `r' appended to its name, so the 10th
|
| + register would be represented as `r10' internally. */
|
| +
|
| +extern const char * gdbarch_stap_gdb_register_prefix (struct gdbarch *gdbarch);
|
| +extern void set_gdbarch_stap_gdb_register_prefix (struct gdbarch *gdbarch, const char * stap_gdb_register_prefix);
|
| +
|
| +/* Suffix used to name a register using GDB's nomenclature. */
|
| +
|
| +extern const char * gdbarch_stap_gdb_register_suffix (struct gdbarch *gdbarch);
|
| +extern void set_gdbarch_stap_gdb_register_suffix (struct gdbarch *gdbarch, const char * stap_gdb_register_suffix);
|
| +
|
| +/* Check if S is a single operand.
|
| +
|
| + Single operands can be:
|
| + - Literal integers, e.g. `$10' on x86
|
| + - Register access, e.g. `%eax' on x86
|
| + - Register indirection, e.g. `(%eax)' on x86
|
| + - Register displacement, e.g. `4(%eax)' on x86
|
| +
|
| + This function should check for these patterns on the string
|
| + and return 1 if some were found, or zero otherwise. Please try to match
|
| + as much info as you can from the string, i.e., if you have to match
|
| + something like `(%', do not match just the `('. */
|
| +
|
| +extern int gdbarch_stap_is_single_operand_p (struct gdbarch *gdbarch);
|
| +
|
| +typedef int (gdbarch_stap_is_single_operand_ftype) (struct gdbarch *gdbarch, const char *s);
|
| +extern int gdbarch_stap_is_single_operand (struct gdbarch *gdbarch, const char *s);
|
| +extern void set_gdbarch_stap_is_single_operand (struct gdbarch *gdbarch, gdbarch_stap_is_single_operand_ftype *stap_is_single_operand);
|
| +
|
| +/* Function used to handle a "special case" in the parser.
|
| +
|
| + A "special case" is considered to be an unknown token, i.e., a token
|
| + that the parser does not know how to parse. A good example of special
|
| + case would be ARM's register displacement syntax:
|
| +
|
| + [R0, #4] ;; displacing R0 by 4
|
| +
|
| + Since the parser assumes that a register displacement is of the form:
|
| +
|
| + <number> <indirection_prefix> <register_name> <indirection_suffix>
|
| +
|
| + it means that it will not be able to recognize and parse this odd syntax.
|
| + Therefore, we should add a special case function that will handle this token.
|
| +
|
| + This function should generate the proper expression form of the expression
|
| + using GDB's internal expression mechanism (e.g., `write_exp_elt_opcode'
|
| + and so on). It should also return 1 if the parsing was successful, or zero
|
| + if the token was not recognized as a special token (in this case, returning
|
| + zero means that the special parser is deferring the parsing to the generic
|
| + parser), and should advance the buffer pointer (p->arg). */
|
| +
|
| +extern int gdbarch_stap_parse_special_token_p (struct gdbarch *gdbarch);
|
| +
|
| +typedef int (gdbarch_stap_parse_special_token_ftype) (struct gdbarch *gdbarch, struct stap_parse_info *p);
|
| +extern int gdbarch_stap_parse_special_token (struct gdbarch *gdbarch, struct stap_parse_info *p);
|
| +extern void set_gdbarch_stap_parse_special_token (struct gdbarch *gdbarch, gdbarch_stap_parse_special_token_ftype *stap_parse_special_token);
|
| +
|
| /* 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
|
| @@ -1031,6 +1183,32 @@ typedef void (gdbarch_gen_return_address_ftype) (struct gdbarch *gdbarch, struct
|
| extern void gdbarch_gen_return_address (struct gdbarch *gdbarch, struct agent_expr *ax, struct axs_value *value, CORE_ADDR scope);
|
| extern void set_gdbarch_gen_return_address (struct gdbarch *gdbarch, gdbarch_gen_return_address_ftype *gen_return_address);
|
|
|
| +/* Implement the "info proc" command. */
|
| +
|
| +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);
|
| +extern void set_gdbarch_info_proc (struct gdbarch *gdbarch, gdbarch_info_proc_ftype *info_proc);
|
| +
|
| +/* Iterate over all objfiles in the order that makes the most sense
|
| + for the architecture to make global symbol searches.
|
| +
|
| + CB is a callback function where OBJFILE is the objfile to be searched,
|
| + and CB_DATA a pointer to user-defined data (the same data that is passed
|
| + when calling this gdbarch method). The iteration stops if this function
|
| + returns nonzero.
|
| +
|
| + CB_DATA is a pointer to some user-defined data to be passed to
|
| + the callback.
|
| +
|
| + If not NULL, CURRENT_OBJFILE corresponds to the objfile being
|
| + inspected when the symbol search was requested. */
|
| +
|
| +typedef void (gdbarch_iterate_over_objfiles_in_search_order_ftype) (struct gdbarch *gdbarch, iterate_over_objfiles_in_search_order_cb_ftype *cb, void *cb_data, struct objfile *current_objfile);
|
| +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);
|
| +
|
| /* Definition for an unknown syscall, used basically in error-cases. */
|
| #define UNKNOWN_SYSCALL (-1)
|
|
|
|
|