28 #include "coff/internal.h"
29 #include "coff/i386.h"
109 for (i = 0; i < nargs; i++)
136 struct value *arg,
int regno)
143 memset (buf, 0,
sizeof buf);
161 struct value **stack_args = alloca (nargs *
sizeof (
struct value *));
162 int num_stack_args = 0;
163 int num_elements = 0;
172 struct value **args1 = alloca (nargs *
sizeof (
struct value *));
174 memcpy (args1, args, nargs *
sizeof (
struct value *));
183 for (i = 0; i < nargs; i++)
189 if (reg_idx < ARRAY_SIZE (amd64_windows_dummy_call_integer_regs))
195 amd64_windows_dummy_call_integer_regs[reg_idx]);
207 amd64_windows_dummy_call_integer_regs[reg_idx]);
215 num_elements += ((len + 7) / 8);
216 stack_args[num_stack_args++] = args[i];
222 sp -= num_elements * 8;
226 for (i = 0; i < num_stack_args; i++)
242 (
struct gdbarch *gdbarch,
struct value *
function,
243 struct regcache *regcache,
CORE_ADDR bp_addr,
244 int nargs,
struct value **args,
259 const int arg_regnum = amd64_windows_dummy_call_integer_regs[0];
267 sp -= ARRAY_SIZE (amd64_windows_dummy_call_integer_regs) * 8;
288 struct type *
type,
struct regcache *regcache,
302 if (len == 4 || len == 8 || len == 16)
308 if (len == 1 || len == 2 || len == 4 || len == 8)
426 && pc < cache->image_base + cache->
end_rva);
472 if (op >= 0x40 && op <= 0x4f)
484 if (op >= 0x58 && op <= 0x5f)
489 cache->
prev_reg_addr[amd64_windows_w2gdb_regnum[reg]] = cur_sp;
522 npc = pc + 2 + (
signed char) rel8;
602 return (op1 & 0xf8) == 0xe0;
649 struct external_pex64_runtime_function d;
666 struct external_pex64_unwind_info ex_ui;
671 unsigned char codes_count;
672 unsigned char frame_reg;
673 unsigned char frame_off;
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);
721 int frreg = amd64_windows_w2gdb_regnum[frame_reg];
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:
776 reg = amd64_windows_w2gdb_regnum[PEX64_UNWCODE_INFO (p[1])];
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:
797 reg = amd64_windows_w2gdb_regnum[PEX64_UNWCODE_INFO (p[1])];
801 case UWOP_SAVE_NONVOL_FAR:
802 reg = amd64_windows_w2gdb_regnum[PEX64_UNWCODE_INFO (p[1])];
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",
1020 IMAGE_DATA_DIRECTORY *dir;
1024 unsigned long lo, hi;
1031 *this_cache = cache;
1045 if (unwind_info == 0)
1062 static struct value *
1064 void **this_cache,
int regnum)
1075 "amd64_windows_frame_prev_register %s for sp=%s\n",
1143 CORE_ADDR image_base, start_rva, end_rva;
1144 struct external_pex64_unwind_info ex_ui;
1148 &image_base, &start_rva, &end_rva) == 0)
1150 if (unwind_info == 0)
1156 (
gdb_byte *) &ex_ui,
sizeof (ex_ui)) == 0
1157 && PEX64_UWI_VERSION (ex_ui.Version_Flags) == 1)
1158 return max (pc, image_base + start_rva + ex_ui.SizeOfPrologue);
1169 if (post_prologue_pc != 0)
1170 return max (pc, post_prologue_pc);
1193 CORE_ADDR indirect_addr = pc + offset + 6;
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)
ULONGEST extract_unsigned_integer(const gdb_byte *, int, enum bfd_endian)
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)
struct value * value_from_contents_and_address(struct type *type, const gdb_byte *valaddr, CORE_ADDR address)
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)
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)
struct gdbarch_tdep * gdbarch_tdep(struct gdbarch *gdbarch)
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)
void store_unsigned_integer(gdb_byte *, int, enum bfd_endian, ULONGEST)
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[]
void initialize_file_ftype(void)
static int pc_in_range(CORE_ADDR pc, const struct amd64_windows_frame_cache *cache)
static void amd64_windows_store_arg_in_reg(struct regcache *regcache, struct value *arg, int regno)
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)
enum register_status regcache_raw_read_unsigned(struct regcache *regcache, int regnum, ULONGEST *val)
static CORE_ADDR amd64_windows_push_arguments(struct regcache *regcache, int nargs, struct value **args, CORE_ADDR sp, int struct_return)
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)
struct ui_file * gdb_stdlog
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 amd64_init_abi(struct gdbarch_info info, struct gdbarch *gdbarch)
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 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)
unsigned long long ULONGEST
enum unwind_stop_reason default_frame_unwind_stop_reason(struct frame_info *this_frame, void **this_cache)
initialize_file_ftype _initialize_amd64_windows_tdep
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)
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
LONGEST extract_signed_integer(const gdb_byte *, int, enum bfd_endian)
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)
enum bfd_endian byte_order
void gdbarch_register_osabi(enum bfd_architecture arch, unsigned long machine, enum gdb_osabi osabi, void(*init_osabi)(struct gdbarch_info, struct gdbarch *))
struct gdbarch * get_frame_arch(struct frame_info *this_frame)
void regcache_cooked_write(struct regcache *regcache, int regnum, const gdb_byte *buf)
const ULONGEST const LONGEST len