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 	void *p;							\
13 									\
14 	if (bits == 0) {						\
15 		p = mallocx(size, 0);					\
16 	} else {							\
17 		switch (bits & 0x1U) {					\
18 		case 0:							\
19 			p = (btalloc_0(size, bits >> 1));		\
20 			break;						\
21 		case 1:							\
22 			p = (btalloc_1(size, bits >> 1));		\
23 			break;						\
24 		default: not_reached();					\
25 		}							\
26 	}								\
27 	/* Intentionally sabotage tail call optimization. */		\
28 	assert_ptr_not_null(p, "Unexpected mallocx() failure");		\
29 	return p;							\
30 }
31