/* btalloc() provides a mechanism for allocating via permuted backtraces. */
void *btalloc(size_t size, unsigned bits);

#define btalloc_n_proto(n) void *btalloc_##n(size_t size, unsigned bits);
btalloc_n_proto(0) btalloc_n_proto(1)

#define btalloc_n_gen(n)                                                       \
	void *btalloc_##n(size_t size, unsigned bits) {                        \
		void *p;                                                       \
                                                                               \
		if (bits == 0) {                                               \
			p = mallocx(size, 0);                                  \
		} else {                                                       \
			switch (bits & 0x1U) {                                 \
			case 0:                                                \
				p = (btalloc_0(size, bits >> 1));              \
				break;                                         \
			case 1:                                                \
				p = (btalloc_1(size, bits >> 1));              \
				break;                                         \
			default:                                               \
				not_reached();                                 \
			}                                                      \
		}                                                              \
		/* Intentionally sabotage tail call optimization. */           \
		expect_ptr_not_null(p, "Unexpected mallocx() failure");        \
		return p;                                                      \
	}
