29 #include "coff/internal.h" 30 #include "coff/i386.h" 112 for (i = 0; i < nargs; i++)
139 struct value *arg,
int regno)
146 memset (buf, 0,
sizeof buf);
164 struct value **stack_args = XALLOCAVEC (
struct value *, nargs);
165 int num_stack_args = 0;
166 int num_elements = 0;
175 struct value **args1 = XALLOCAVEC (
struct value *, nargs);
177 memcpy (args1, args, nargs *
sizeof (
struct value *));
186 for (i = 0; i < nargs; i++)
218 num_elements += ((len + 7) / 8);
219 stack_args[num_stack_args++] = args[i];
225 sp -= num_elements * 8;
229 for (i = 0; i < num_stack_args; i++)
247 int nargs,
struct value **args,
305 if (len == 4 || len == 8 || len == 16)
311 if (len == 1 || len == 2 || len == 4 || len == 8)
429 && pc < cache->image_base + cache->
end_rva);
475 if (op >= 0x40 && op <= 0x4f)
487 if (op >= 0x58 && op <= 0x5f)
526 npc = pc + 2 + (
signed char) rel8;
604 return (op1 & 0xf8) == 0xe0;
651 struct external_pex64_runtime_function d;
667 struct external_pex64_unwind_info ex_ui;
672 unsigned char codes_count;
673 unsigned char frame_reg;
678 (
gdb_byte *) &ex_ui, sizeof (ex_ui)) != 0)
684 "amd64_windows_frame_decodes_insn: " 685 "%s: ver: %02x, plgsz: %02x, cnt: %02x, frame: %02x\n",
687 ex_ui.Version_Flags, ex_ui.SizeOfPrologue,
688 ex_ui.CountOfCodes, ex_ui.FrameRegisterOffset);
691 if (PEX64_UWI_VERSION (ex_ui.Version_Flags) != 1
692 && PEX64_UWI_VERSION (ex_ui.Version_Flags) != 2)
697 && !(cache->
pc >= start && cache->
pc < start + ex_ui.SizeOfPrologue))
712 codes_count = ex_ui.CountOfCodes;
713 frame_reg = PEX64_UWI_FRAMEREG (ex_ui.FrameRegisterOffset);
736 insns, codes_count * 2) != 0)
739 end_insns = &insns[codes_count * 2];
743 if (PEX64_UWI_VERSION (ex_ui.Version_Flags) == 2)
745 for (; p < end_insns; p += 2)
746 if (PEX64_UNWCODE_CODE (p[1]) != 6)
750 for (; p < end_insns; p += 2)
758 if (cache->
pc >= start + p[0] || cache->
pc < start)
762 (
gdb_stdlog,
" op #%u: off=0x%02x, insn=0x%02x\n",
763 (
unsigned) (p - insns), p[0], p[1]);
772 switch (PEX64_UNWCODE_CODE (p[1]))
774 case UWOP_PUSH_NONVOL:
780 case UWOP_ALLOC_LARGE:
781 if (PEX64_UNWCODE_INFO (p[1]) == 0)
784 else if (PEX64_UNWCODE_INFO (p[1]) == 1)
789 case UWOP_ALLOC_SMALL:
790 cur_sp += 8 + 8 * PEX64_UNWCODE_INFO (p[1]);
794 - PEX64_UWI_FRAMEOFF (ex_ui.FrameRegisterOffset) * 16;
796 case UWOP_SAVE_NONVOL:
801 case UWOP_SAVE_NONVOL_FAR:
806 case UWOP_SAVE_XMM128:
811 case UWOP_SAVE_XMM128_FAR:
816 case UWOP_PUSH_MACHFRAME:
817 if (PEX64_UNWCODE_INFO (p[1]) == 0)
823 else if (PEX64_UNWCODE_INFO (p[1]) == 1)
845 switch (PEX64_UNWCODE_CODE (p[1]))
847 case UWOP_PUSH_NONVOL:
848 case UWOP_ALLOC_SMALL:
850 case UWOP_PUSH_MACHFRAME:
852 case UWOP_ALLOC_LARGE:
853 if (PEX64_UNWCODE_INFO (p[1]) == 0)
855 else if (PEX64_UNWCODE_INFO (p[1]) == 1)
860 case UWOP_SAVE_NONVOL:
861 case UWOP_SAVE_XMM128:
864 case UWOP_SAVE_NONVOL_FAR:
865 case UWOP_SAVE_XMM128_FAR:
872 if (PEX64_UWI_FLAGS (ex_ui.Version_Flags) != UNW_FLAG_CHAININFO)
880 struct external_pex64_runtime_function d;
888 +
sizeof (ex_ui) + ((codes_count + 1) & ~1) * 2;
906 "amd64_windows_frame_decodes_insn (next in chain):" 907 " unwind_data=%s, start_rva=%s, end_rva=%s\n",
942 IMAGE_DATA_DIRECTORY *dir;
944 unsigned long lo, hi;
954 dir = &pe->pe_opthdr.DataDirectory[PE_EXCEPTION_TABLE];
956 base = pe->pe_opthdr.ImageBase
968 hi = dir->Size /
sizeof (
struct external_pex64_runtime_function);
972 unsigned long mid = lo + (hi - lo) / 2;
973 struct external_pex64_runtime_function d;
984 else if (pc >= base + ea)
986 else if (pc >= base + sa && pc < base + ea)
1002 "amd64_windows_find_unwind_data: image_base=%s, unwind_data=%s\n",
1025 *this_cache = cache;
1039 if (unwind_info == 0)
1056 static struct value *
1058 void **this_cache,
int regnum)
1067 "amd64_windows_frame_prev_register %s for sp=%s\n",
1134 CORE_ADDR image_base, start_rva, end_rva;
1135 struct external_pex64_unwind_info ex_ui;
1139 &image_base, &start_rva, &end_rva) == 0)
1141 if (unwind_info == 0)
1147 (
gdb_byte *) &ex_ui,
sizeof (ex_ui)) == 0
1148 && PEX64_UWI_VERSION (ex_ui.Version_Flags) == 1)
1149 return std::max (pc, image_base + start_rva + ex_ui.SizeOfPrologue);
1160 if (post_prologue_pc != 0)
1161 return std::max (pc, post_prologue_pc);
static CORE_ADDR amd64_windows_skip_prologue(struct gdbarch *gdbarch, CORE_ADDR pc)
static void amd64_windows_frame_this_id(struct frame_info *this_frame, void **this_cache, struct frame_id *this_id)
void set_gdbarch_skip_main_prologue(struct gdbarch *gdbarch, gdbarch_skip_main_prologue_ftype skip_main_prologue)
struct frame_id frame_id_build(CORE_ADDR stack_addr, CORE_ADDR code_addr)
struct value * value_addr(struct value *arg1)
static struct value * amd64_windows_frame_prev_register(struct frame_info *this_frame, void **this_cache, int regnum)
#define SECT_OFF_TEXT(objfile)
CORE_ADDR get_frame_pc(struct frame_info *frame)
#define MSYMBOL_LINKAGE_NAME(symbol)
#define X86_XSTATE_SSE_MASK
struct value * value_from_contents_and_address(struct type *type, const gdb_byte *valaddr, CORE_ADDR address)
void amd64_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch, const target_desc *default_tdesc)
struct value * frame_unwind_got_memory(struct frame_info *frame, int regnum, CORE_ADDR addr)
void set_gdbarch_skip_trampoline_code(struct gdbarch *gdbarch, gdbarch_skip_trampoline_code_ftype skip_trampoline_code)
static CORE_ADDR amd64_windows_adjust_args_passed_by_pointer(struct value **args, int nargs, CORE_ADDR sp)
void * memset(T *s, int c, size_t n)=delete
CORE_ADDR prev_reg_addr[16]
static CORE_ADDR amd64_skip_main_prologue(struct gdbarch *gdbarch, CORE_ADDR pc)
CORE_ADDR skip_prologue_using_sal(struct gdbarch *gdbarch, CORE_ADDR func_addr)
static const struct frame_unwind amd64_windows_frame_unwind
static int amd64_windows_passed_by_pointer(struct type *type)
void frame_unwind_append_unwinder(struct gdbarch *gdbarch, const struct frame_unwind *unwinder)
#define FRAME_OBSTACK_ZALLOC(TYPE)
const char * paddress(struct gdbarch *gdbarch, CORE_ADDR addr)
struct value * frame_unwind_got_constant(struct frame_info *frame, int regnum, ULONGEST val)
const gdb_byte * value_contents(struct value *value)
enum register_status regcache_raw_read_part(struct regcache *regcache, int regnum, int offset, int len, gdb_byte *buf)
static CORE_ADDR amd64_windows_skip_trampoline_code(struct frame_info *frame, CORE_ADDR pc)
static int amd64_windows_dummy_call_integer_regs[]
static int pc_in_range(CORE_ADDR pc, const struct amd64_windows_frame_cache *cache)
objfile(bfd *, const char *, objfile_flags)
static void amd64_windows_store_arg_in_reg(struct regcache *regcache, struct value *arg, int regno)
static ULONGEST extract_unsigned_integer(const gdb_byte *addr, int len, enum bfd_endian byte_order)
static int amd64_windows_frame_decode_epilogue(struct frame_info *this_frame, struct amd64_windows_frame_cache *cache)
void fprintf_unfiltered(struct ui_file *stream, const char *format,...)
enum bfd_endian gdbarch_byte_order(struct gdbarch *gdbarch)
#define ANOFFSET(secoff, whichone)
void set_gdbarch_auto_wide_charset(struct gdbarch *gdbarch, gdbarch_auto_wide_charset_ftype auto_wide_charset)
int find_pc_partial_function(CORE_ADDR pc, const char **name, CORE_ADDR *address, CORE_ADDR *endaddr)
int default_frame_sniffer(const struct frame_unwind *self, struct frame_info *this_frame, void **this_prologue_cache)
static int amd64_windows_passed_by_integer_register(struct type *type)
const char * gdbarch_register_name(struct gdbarch *gdbarch, int regnr)
static int startswith(const char *string, const char *pattern)
static CORE_ADDR amd64_windows_push_arguments(struct regcache *regcache, int nargs, struct value **args, CORE_ADDR sp, int struct_return)
static enum amd64_regnum amd64_windows_w2gdb_regnum[]
void read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
struct obj_section * find_pc_section(CORE_ADDR pc)
static const char * amd64_windows_auto_wide_charset(void)
void gdbarch_register_osabi(enum bfd_architecture arch, unsigned long machine, enum gdb_osabi osabi, void(*init_osabi)(struct gdbarch_info, struct gdbarch *))
static struct amd64_windows_frame_cache * amd64_windows_frame_cache(struct frame_info *this_frame, void **this_cache)
static int amd64_windows_passed_by_xmm_register(struct type *type)
void regcache_raw_write_part(struct regcache *regcache, int regnum, int offset, int len, const gdb_byte *buf)
struct bound_minimal_symbol lookup_minimal_symbol_by_pc(CORE_ADDR pc)
#define TYPE_CODE(thistype)
struct value * frame_unwind_got_register(struct frame_info *frame, int regnum, int new_regnum)
void windows_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
int target_read_memory(CORE_ADDR memaddr, gdb_byte *myaddr, ssize_t len)
struct minimal_symbol * minsym
static void amd64_windows_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
void get_frame_register(struct frame_info *frame, int regnum, gdb_byte *buf)
static LONGEST extract_signed_integer(const gdb_byte *addr, int len, enum bfd_endian byte_order)
static enum return_value_convention amd64_windows_return_value(struct gdbarch *gdbarch, struct value *function, struct type *type, struct regcache *regcache, gdb_byte *readbuf, const gdb_byte *writebuf)
void _initialize_amd64_windows_tdep(void)
unsigned long long ULONGEST
enum unwind_stop_reason default_frame_unwind_stop_reason(struct frame_info *this_frame, void **this_cache)
struct type * value_type(const struct value *value)
void set_gdbarch_long_bit(struct gdbarch *gdbarch, int long_bit)
void set_gdbarch_return_value(struct gdbarch *gdbarch, gdbarch_return_value_ftype return_value)
static CORE_ADDR amd64_windows_push_dummy_call(struct gdbarch *gdbarch, struct value *function, struct regcache *regcache, CORE_ADDR bp_addr, int nargs, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr)
static void amd64_windows_frame_decode_insns(struct frame_info *this_frame, struct amd64_windows_frame_cache *cache, CORE_ADDR unwind_info)
CORE_ADDR prev_xmm_addr[16]
#define TYPE_LENGTH(thistype)
enum register_status regcache_raw_read_unsigned(struct regcache *regcache, int regnum, ULONGEST *val)
void set_gdbarch_push_dummy_call(struct gdbarch *gdbarch, gdbarch_push_dummy_call_ftype push_dummy_call)
ULONGEST read_memory_unsigned_integer(CORE_ADDR memaddr, int len, enum bfd_endian byte_order)
struct section_offsets * section_offsets
void write_memory(CORE_ADDR memaddr, const bfd_byte *myaddr, ssize_t len)
void set_gdbarch_skip_prologue(struct gdbarch *gdbarch, gdbarch_skip_prologue_ftype skip_prologue)
static int amd64_windows_find_unwind_info(struct gdbarch *gdbarch, CORE_ADDR pc, CORE_ADDR *unwind_info, CORE_ADDR *image_base, CORE_ADDR *start_rva, CORE_ADDR *end_rva)
const struct target_desc * amd64_target_description(uint64_t xcr0)
enum bfd_endian byte_order
struct gdbarch * get_frame_arch(struct frame_info *this_frame)
void regcache_cooked_write(struct regcache *regcache, int regnum, const gdb_byte *buf)
static void store_unsigned_integer(gdb_byte *addr, int len, enum bfd_endian byte_order, ULONGEST val)