Module Name:    src
Committed By:   hannken
Date:           Tue Jul 16 07:26:41 UTC 2019

Modified Files:
        src/external/cddl/osnet/dist/tools/ctf/cvt: fixup_tdescs.c

Log Message:
Add fixup operation to remove private mutex types for x86.

For GENERIC the number of types goes down from 47351 to 33981.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 \
    src/external/cddl/osnet/dist/tools/ctf/cvt/fixup_tdescs.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/cddl/osnet/dist/tools/ctf/cvt/fixup_tdescs.c
diff -u src/external/cddl/osnet/dist/tools/ctf/cvt/fixup_tdescs.c:1.3 src/external/cddl/osnet/dist/tools/ctf/cvt/fixup_tdescs.c:1.4
--- src/external/cddl/osnet/dist/tools/ctf/cvt/fixup_tdescs.c:1.3	Wed Feb 24 21:53:26 2010
+++ src/external/cddl/osnet/dist/tools/ctf/cvt/fixup_tdescs.c	Tue Jul 16 07:26:41 2019
@@ -276,8 +276,57 @@ fix_small_cpu_struct(tdata_t *td, size_t
 	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
 }

Reply via email to