Add fixup operation to remove private mutex types for x86.
For GENERIC the number of types goes down from 47351 to 33981.
This commit is contained in:
parent
fcc1d7b138
commit
9112aa41cd
|
@ -276,8 +276,57 @@ fix_small_cpu_struct(tdata_t *td, size_t ptrsize)
|
|||
lml->ml_next = cpum;
|
||||
}
|
||||
|
||||
#ifdef __NetBSD__
|
||||
|
||||
/*
|
||||
* The kmutex structure comes in two flavours, with or without __MUTEX_PRIVATE
|
||||
* defined. Since many structures include kmutexes this causes massive amounts
|
||||
* of duplication on merge (~ 40% for a GENERIC kernel). Remove the private
|
||||
* fields if we see them.
|
||||
*/
|
||||
static void
|
||||
fix_kmutex_private(tdata_t *td, size_t ptrsize)
|
||||
{
|
||||
tdesc_t *desc;
|
||||
mlist_t *ml;
|
||||
|
||||
/*
|
||||
* X86 kmutex is either
|
||||
* union {
|
||||
* volatile uintptr_t mtxa_owner;
|
||||
* } u
|
||||
* or
|
||||
* union {
|
||||
* volatile uintptr_t mtxa_owner;
|
||||
* struct {
|
||||
* ...
|
||||
* } s;
|
||||
* } u
|
||||
* so we remove "struct s" if we find it.
|
||||
*/
|
||||
if ((desc = lookup_tdesc(td, "kmutex")) != NULL &&
|
||||
desc->t_type == STRUCT &&
|
||||
(ml = desc->t_members) != NULL &&
|
||||
streq(ml->ml_name, "u") &&
|
||||
(desc = ml->ml_type) != NULL &&
|
||||
desc->t_type == UNION &&
|
||||
(ml = desc->t_members) != NULL &&
|
||||
streq(ml->ml_name, "mtxa_owner") &&
|
||||
(ml = ml->ml_next) != NULL &&
|
||||
streq(ml->ml_name, "s") &&
|
||||
ml->ml_next == NULL) {
|
||||
/* Found, delete member "s". */
|
||||
desc->t_members->ml_next = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* __NetBSD__ */
|
||||
|
||||
void
|
||||
cvt_fixups(tdata_t *td, size_t ptrsize)
|
||||
{
|
||||
fix_small_cpu_struct(td, ptrsize);
|
||||
#ifdef __NetBSD__
|
||||
fix_kmutex_private(td, ptrsize);
|
||||
#endif
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue