Operating System ABI Variant Handling
OS的ABI主要影响target defination的两个部分:sniffers and handlers.
handler
defs.h
OS ABI framework 接口函数:
const
void
void
enum
void
Initializing a New Architecture
Registers and Memory
GDB 采用的target machine模型是十分简单的:GDB 假定一种机器包含一组寄存器和一块内存,每个寄存器有一定的大小.GDB把寄存器的一切封装到像 gdbarch_register_name 这样的一系列函数中,继而做到正确处理.GDB 支持各种endian的机器:big-endian, little-endian, bi-endian(request commnet).
Pointers Are Not Always Addresses
有些特殊的平台,同一个word,其用于code pointer和datapointe的时候有不同的解释,比如D10V,同样是0xC020,当用于数据地址的时候代表地址0xC020,但是用于代码地址的时候,需要转换一下,代表0x30080(详 见D10V或者GDBINT). 所以在GDB中,对于address和pointer是区分对待的.address代表字节地址,而pointer指向特定的数据类型:data or code or other...., pointer需要转换以下才是address,大部分平台是相等的值,部分平台需要移位等操作. 但是大部分平台上,这两者是等价的,以下函数用于转换pointer和address: (详见GDBINT)
CORE_ADDR
CORE_ADDR
CORE_ADDR
CORE_ADDR
CORE_ADDR
void
Address Classes
当不同种类的address可以而从调试信息中(如DWARF2)获取时, 应该定义以下宏来支持GDB认知这些区别,或者给GDB user提供类型信息.
int
int
祥见GDBINT.
Raw and Virtual Register Representations
注:这里描述的内容已经过时,请参考下一节.
一些体系结构在寄存器和内存中对一个值的表达方式是不同的.用GDB的术语来定义,在寄存器中的表达方式叫raw
在几乎所有的体系上,数据类型的virtual和raw representations 是一致的.但是有例外,如:
int REGISTER_CONVERTIBLE
int DEPRECATED_REGISTER_RAW_SIZE
int DEPRECATED_REGISTER_VIRTUAL_SIZE
struct type
void REGISTER_CONVERT_TO_VIRTUAL
void REGISTER_CONVERT_TO_RAW
Using Different Register and Memory Data Representations
Maintainer's note: GDB操作寄存器的方式正在变革中,详见
这里解决的问题和上一节一样:x86 80-bit 浮点寄存器,还有Alpha 可以把32 bit integer values 存到floating-point registers.
这种问题也可以定义如下的宏来解决:
int
void gdbarch_register_to_value
void gdbarch_value_to_register
void REGISTER_CONVERT_TO_TYPE
int gdbarch_char_signed (gdbarch)
int gdbarch_double_bit (gdbarch)
int gdbarch_float_bit (gdbarch)
int gdbarch_int_bit (gdbarch)
int gdbarch_long_bit (gdbarch)
int gdbarch_long_double_bit (gdbarch)
int gdbarch_long_long_bit (gdbarch)
int gdbarch_ptr_bit (gdbarch)
int gdbarch_short_bit (gdbarch)
int gdbarch_cannot_store_register (gdbarch, regnum)
int gdbarch_convert_register_p (gdbarch, regnum, struct type *type)
void gdbarch_value_to_register (gdbarch, frame, type, buf)
int gdbarch_sp_regnum (gdbarch)
register_reggroup_p (gdbarch, regnum, reggroup)
DEPRECATED_REGISTER_VIRTUAL_SIZE (reg)
DEPRECATED_REGISTER_VIRTUAL_TYPE (reg)
struct type *register_type (gdbarch, reg)
REGISTER_CONVERT_TO_VIRTUAL(reg, type, from, to)
const struct regset *regset_from_core_section (struct gdbarch * gdbarch, const char * sect_name, size_t sect_size)
void gdbarch_register_to_value(gdbarch, frame, regnum, type, fur)
int gdbarch_stab_reg_to_regnum (gdbarch, stab_regnr)
void gdbarch_store_return_value (gdbarch, type, regcache, valbuf)
gdbarch_ps_regnum (gdbarch
int gdbarch_sdb_reg_to_regnum (gdbarch, sdb_regnr)
Stack Frame:
SOFTWARE_SINGLE_STEP_P()
SOFTWARE_SINGLE_STEP(signal, insert_breakpoints_p)
DEPRECATED_FRAME_SAVED_PC(frame)
CORE_ADDR gdbarch_unwind_pc (next_frame)
CORE_ADDR gdbarch_unwind_sp (gdbarch, next_frame)
CORE_ADDR frame_align (gdbarch, address)
int gdbarch_frame_red_zone_size (gdbarch)
DEPRECATED_FRAME_CHAIN(frame)
DEPRECATED_FRAME_CHAIN_VALID(chain, thisframe)
DEPRECATED_FRAME_INIT_SAVED_REGS(frame)
int gdbarch_frame_num_args (gdbarch, frame)
void gdbarch_extract_return_value (gdbarch, type, regbuf, valbuf)
DEPRECATED_FP_REGNUM
DEPRECATED_FRAMELESS_FUNCTION_INVOCATION(fi)
FUNCTION_EPILOGUE_SIZE
DEPRECATED_FUNCTION_START_OFFSET
int gdbarch_inner_than (gdbarch, lhs, rhs)
gdbarch_get_longjmp_target
TARGET_READ_FP
CORE_ADDR gdbarch_read_pc (gdbarch, regcache)
gdbarch_write_pc (gdbarch, regcache, val)
DEPRECATED_USE_STRUCT_CONVENTION (gcc_p, type)
CORE_ADDR
int
int
int gdbarch_stabs_argument_has_addr (gdbarch, type)
CORE_ADDR gdbarch_skip_prologue (gdbarch, ip)
CORE_ADDR gdbarch_push_dummy_call (gdbarch, function, regcache, bp_addr, nargs, args, sp, struct_return, struct_addr)
CORE_ADDR gdbarch_push_dummy_code (gdbarch, sp, funaddr, using_gcc, args, nargs, value_type, real_pc, bp_addr, regcache)
DEPRECATED_REG_STRUCT_HAS_ADDR (gcc_p, type)
Address pointer:
int address_class_name_to_type_flags (gdbarch, name, type_flags_ptr)int address_class_name_to_type_flags_p (gdbarch)
int gdbarch_address_class_type_flags (gdbarch, byte_size, dwarf2_addr_class)int gdbarch_address_class_type_flags_p (gdbarch)const char *gdbarch_address_class_type_flags_to_name (gdbarch, type_flags)
int gdbarch_address_class_type_flags_to_name_p (gdbarch)
DEPRECATED_EXTRACT_STRUCT_VALUE_ADDRESS_P()
Compiler and BFD:
int
int gdbarch_dwarf2_reg_to_regnum (gdbarch, dwarf2_regnr)
int gdbarch_ecoff_reg_to_regnum (gdbarch, ecoff_regnr)
int gdbarch_dwarf_reg_to_regnum (gdbarch, dwarf_regnr)
GCC_COMPILED_FLAG_SYMBOL
GCC2_COMPILED_FLAG_SYMBOL
SOFUN_ADDRESS_MAYBE_MISSING
PROCESS_LINENUMBER_HOOK
VARIABLES_INSIDE_BLOCK (desc, gcc_p)
BreakPoint wathpoint
BREAKPOINT :定义breakpoint使用的指令,不能长于最短指令.如果采用trap则不必定义.如果才用非法指令或者其他值则必须定义TARGET_HAS_HARDWARE_WATCHPOINTSBIG_BREAKPOINT LITTLE_BREAKPOINT :类似BREAKPOINT, 但是用于 bi-endian targets.const gdb_byte * gdbarch_breakpoint_from_pc
gdbarch_memory_remove_breakpoint
I386_USE_GENERIC_WATCHPOINTS
DISABLE_UNSETTABLE_BREAK (addr)
CORE_ADDR gdbarch_decr_pc_after_break (gdbarch)
void gdbarch_skip_permanent_breakpoint (gdbarch, regcache)
User Interface
void gdbarch_print_float_info (gdbarch, file, frame, args)
void gdbarch_print_registers_info (gdbarch, frame, regnum, all)
int gdbarch_print_vector_info (gdbarch, file, frame, args)
int gdbarch_print_insn (gdbarch, vma, info)
frame_id gdbarch_unwind_dummy_id (gdbarch, frame)
Motorola M68K:
BPT_VECTOR
REMOTE_BPT_VECTOR:
const char *gdbarch_name_of_malloc (gdbarch)
Misc:
DEPRECATED_IBM6000_TARGET
SYMBOL_RELOADING_DEFAULT