1 /* btalloc() provides a mechanism for allocating via permuted backtraces. */
2 void	*btalloc(size_t size, unsigned bits);
3 
4 #define	btalloc_n_proto(n)						\
5 void	*btalloc_##n(size_t size, unsigned bits);
6 btalloc_n_proto(0)
7 btalloc_n_proto(1)
8 
9 #define	btalloc_n_gen(n)						\
10 void *									\
11 btalloc_##n(size_t size, unsigned bits)					\
12 {									\
13 	void *p;							\
14 									\
15 	if (bits == 0)							\
16 		p = mallocx(size, 0);					\
17 	else {								\
18 		switch (bits & 0x1U) {					\
19 		case 0:							\
20 			p = (btalloc_0(size, bits >> 1));		\
21 			break;						\
22 		case 1:							\
23 			p = (btalloc_1(size, bits >> 1));		\
24 			break;						\
25 		default: not_reached();					\
26 		}							\
27 	}								\
28 	/* Intentionally sabotage tail call optimization. */		\
29 	assert_ptr_not_null(p, "Unexpected mallocx() failure");		\
30 	return (p);							\
31 }
32