summaryrefslogtreecommitdiff
path: root/gdb/gdbarch.h
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/gdbarch.h')
-rw-r--r--gdb/gdbarch.h51
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);