diff options
Diffstat (limited to 'gdb/gdbarch.h')
-rw-r--r-- | gdb/gdbarch.h | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index 0bd1d5662d..ba4fe62ae9 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -51,6 +51,8 @@ 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; @@ -688,6 +690,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); @@ -696,6 +708,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); |