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:
hannken 2019-07-16 07:26:41 +00:00
parent fcc1d7b138
commit 9112aa41cd
1 changed files with 49 additions and 0 deletions

View File

@ -276,8 +276,57 @@ fix_small_cpu_struct(tdata_t *td, size_t ptrsize)
lml->ml_next = cpum; 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 void
cvt_fixups(tdata_t *td, size_t ptrsize) cvt_fixups(tdata_t *td, size_t ptrsize)
{ {
fix_small_cpu_struct(td, ptrsize); fix_small_cpu_struct(td, ptrsize);
#ifdef __NetBSD__
fix_kmutex_private(td, ptrsize);
#endif
} }