diff options
author | Richard Henderson <rth@redhat.com> | 2015-11-03 09:46:11 +0100 |
---|---|---|
committer | Richard Henderson <rth@redhat.com> | 2015-11-03 09:46:11 +0100 |
commit | 4a2bd92e409721ec80e42e5a9ac58d71c5c0fa16 (patch) | |
tree | 115a3fc8abe1f1f18b081435c3306fbf40f7f574 | |
parent | 220c78adba4af0e05a68895464f4be7d6323dd55 (diff) | |
download | gdb-4a2bd92e409721ec80e42e5a9ac58d71c5c0fa16.zip gdb-4a2bd92e409721ec80e42e5a9ac58d71c5c0fa16.tar.gz gdb-4a2bd92e409721ec80e42e5a9ac58d71c5c0fa16.tar.bz2 |
Segment support for x86_64, part 1
* amd64-tdep.c (amd64_address_class_type_flags): New.
(amd64_address_class_type_flags_to_name): New.
(amd64_address_class_name_to_type_flags): New.
(amd64_init_abi): Register them.
-rw-r--r-- | gdb/amd64-tdep.c | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c index 6867a06..3f12796 100644 --- a/gdb/amd64-tdep.c +++ b/gdb/amd64-tdep.c @@ -2890,7 +2890,55 @@ const struct regset amd64_fpregset = NULL, amd64_supply_fpregset, amd64_collect_fpregset }; +/* Address classes. */ +static int +amd64_address_class_type_flags (int byte_size, int dwarf2_addr_class) +{ + switch (dwarf2_addr_class) + { + case 1: /* __seg_fs */ + return TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1; + case 2: /* __seg_gs */ + return TYPE_INSTANCE_FLAG_ADDRESS_CLASS_2; + default: + return 0; + } +} + +static const char * +amd64_address_class_type_flags_to_name (struct gdbarch *gdbarch, int type_flags) +{ + if (type_flags & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1) + return "__seg_fs"; + if (type_flags & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_2) + return "__seg_gs"; + return NULL; +} + +static int +amd64_address_class_name_to_type_flags (struct gdbarch *gdbarch, + const char *name, + int *type_flags_ptr) +{ + if (strcmp (name, "__seg_fs") == 0) + { + *type_flags_ptr = TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1; + return 1; + } + if (strcmp (name, "__seg_gs") == 0) + { + *type_flags_ptr = TYPE_INSTANCE_FLAG_ADDRESS_CLASS_2; + return 1; + } + return 0; +} + +/* ??? We ought to fill in address_to_pointer and pointer_to_address, + except that these hooks do not have access to the thread, or a + regcache for the thread. */ + + /* Figure out where the longjmp will land. Slurp the jmp_buf out of %rdi. We expect its value to be a pointer to the jmp_buf structure from which we extract the address that we will land at. This @@ -3093,6 +3141,14 @@ amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) set_gdbarch_insn_is_call (gdbarch, amd64_insn_is_call); set_gdbarch_insn_is_ret (gdbarch, amd64_insn_is_ret); set_gdbarch_insn_is_jump (gdbarch, amd64_insn_is_jump); + + /* Address handling. */ + set_gdbarch_address_class_type_flags + (gdbarch, amd64_address_class_type_flags); + set_gdbarch_address_class_type_flags_to_name + (gdbarch, amd64_address_class_type_flags_to_name); + set_gdbarch_address_class_name_to_type_flags + (gdbarch, amd64_address_class_name_to_type_flags); } |