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