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]

Re: [PATCH 1/2] Include the fs_base and gs_base registers in amd64 target descriptions.


On 2017-07-12 15:02, Yao Qi wrote:
On Wed, Jul 12, 2017 at 1:16 PM, Phil Muldoon <pmuldoon@redhat.com> wrote:

Does anyone else see this?


I don't see the issue you posted here, but there are
some regressions shown in buildbot.
https://sourceware.org/ml/gdb-testers/2017-q3/msg00370.html

John, could you take a look?

I looked around, I don't know exactly what's wrong but I might have some pointers.

From what I understand, tdesc_use_registers adds the registers listed in the target description to a hash table, and then removes some of those same registers that are also specified by the architecture, so it's left with the registers for which we need to assign a number. The hash table hash the pointer itself, it does not look at what it points to.

I added some prints where we add and remove the registers from the htab. For rax, it looks good:

ADDING 0x237a510 rax
REMOVING 0x237a510 rax

We add and remov the same pointer. For fs_base, the pointers are different:

ADDING 0x237d840 fs_base
REMOVING 0x23a5d70 fs_base

It suggests that something is wrong here, I would expect those two pointers to be equal. I don't know enough about how the reg objects are created to know why it this happens.

Despite that, a segfault happens when we are calling htab_remove_elt with an element that does not exist in the hash table. This case should be handled correctly, since this function allows that:

707 /* This function deletes an element with the given value from hash
708 table (the hash is computed from the element). If there is no matching
709    element in the hash table, this function does nothing.  */
710
711 void
712 htab_remove_elt (htab_t htab, PTR element)

The problem seems to be in htab_remove_elt_with_hash:

727   slot = htab_find_slot_with_hash (htab, element, hash, NO_INSERT);
728   if (*slot == HTAB_EMPTY_ENTRY)
729     return;

htab_find_slot_with_hash can return NULL if you pass NO_INSERT and the element is non-existent. So it looks like it's missing a slot != NULL on line 728.

Hope that helps.

Simon


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]