This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
This is a example to add the function that need skip. 2008-08-19 Hui Zhu <teawater@gmail.com> * i386-linux-tdep.c (i386_linux_process_record_temp_register): New function. (i386_linux_process_record_simple_function): New function. (i386_linux_process_record_memset): New function. (i386_linux_process_record_open): New function. (i386_linux_init_abi): Call set_gdbarch_process_record_open. --- i386-linux-tdep.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) --- a/i386-linux-tdep.c +++ b/i386-linux-tdep.c @@ -389,6 +389,83 @@ i386_linux_intx80_sysenter_record (struc return 0; } + +static int +i386_linux_process_record_temp_register (struct regcache *regcache) +{ + if (record_arch_list_add_reg (regcache, I386_EAX_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, I386_ECX_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, I386_EDX_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, I386_ESP_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, I386_EIP_REGNUM)) + return -1; + if (record_arch_list_add_reg (regcache, I386_EFLAGS_REGNUM)) + return -1; + + return 0; +} + +static int +i386_linux_process_record_simple_function (struct regcache *regcache) +{ + if (i386_linux_process_record_temp_register (regcache)) + return -1; + + if (record_arch_list_add_end ()) + return -1; + + return 0; +} + +static int +i386_linux_process_record_memset (struct regcache *regcache) +{ + ULONGEST tmpulongest; + struct gdbarch *gdbarch = get_regcache_arch (regcache); + enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); + gdb_byte buf[12]; + int tmpint; + + if (i386_linux_process_record_temp_register (regcache)) + return -1; + + regcache_raw_read_unsigned (regcache, I386_ESP_REGNUM, &tmpulongest); + tmpulongest += 4; + if (target_read_memory ((CORE_ADDR) tmpulongest, buf, 12)) + { + if (record_debug) + fprintf_unfiltered (gdb_stdlog, + "Process record: error reading " + "memory at addr = 0x%s " + "len = %d.\n", + phex_nz (tmpulongest, 4), 12); + return -1; + } + tmpulongest = extract_unsigned_integer (buf, 4, byte_order); + tmpint = (int) extract_unsigned_integer (buf + 8, 4, byte_order); + if (record_arch_list_add_mem ((CORE_ADDR)tmpulongest, tmpint)) + return -1; + + if (record_arch_list_add_end ()) + return -1; + + return 0; +} + +static void +i386_linux_process_record_open (struct gdbarch *gdbarch) +{ + record_skip_entry_create (gdbarch, "printf", + i386_linux_process_record_simple_function); + record_skip_entry_create (gdbarch, "memset", + i386_linux_process_record_memset); + record_skip_entry_create (gdbarch, "memcpy", + i386_linux_process_record_memset); +} /* The register sets used in GNU/Linux ELF core-dumps are identical to @@ -484,6 +561,7 @@ i386_linux_init_abi (struct gdbarch_info tdep->sc_num_regs = ARRAY_SIZE (i386_linux_sc_reg_offset); set_gdbarch_process_record (gdbarch, i386_process_record); + set_gdbarch_process_record_open (gdbarch, i386_linux_process_record_open); /* Initialize the i386_linux_record_tdep. */ /* These values are the size of the type that will be used in a system
Attachment:
5-skip-record-i386-linux.txt
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |