mirror of
https://github.com/jart/cosmopolitan.git
synced 2025-06-28 07:18:30 +00:00
Make emacs not croak when editing dlmalloc
This commit is contained in:
parent
3c7ae0fc72
commit
fa1e8a3e65
21 changed files with 3019 additions and 2985 deletions
91
third_party/dlmalloc/indexing.inc
vendored
Normal file
91
third_party/dlmalloc/indexing.inc
vendored
Normal file
|
@ -0,0 +1,91 @@
|
|||
// clang-format off
|
||||
|
||||
/* ---------------------------- Indexing Bins ---------------------------- */
|
||||
|
||||
#define is_small(s) (((s) >> SMALLBIN_SHIFT) < NSMALLBINS)
|
||||
#define small_index(s) (bindex_t)((s) >> SMALLBIN_SHIFT)
|
||||
#define small_index2size(i) ((i) << SMALLBIN_SHIFT)
|
||||
#define MIN_SMALL_INDEX (small_index(MIN_CHUNK_SIZE))
|
||||
|
||||
/* addressing by index. See above about smallbin repositioning */
|
||||
#define smallbin_at(M, i) ((sbinptr)((char*)&((M)->smallbins[(i)<<1])))
|
||||
#define treebin_at(M,i) (&((M)->treebins[i]))
|
||||
|
||||
/* assign tree index for size S to variable I. Use x86 asm if possible */
|
||||
#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
|
||||
#define compute_tree_index(S, I)\
|
||||
{\
|
||||
unsigned int X = S >> TREEBIN_SHIFT;\
|
||||
if (X == 0)\
|
||||
I = 0;\
|
||||
else if (X > 0xFFFF)\
|
||||
I = NTREEBINS-1;\
|
||||
else {\
|
||||
unsigned int K = (unsigned) sizeof(X)*__CHAR_BIT__ - 1 - (unsigned) __builtin_clz(X); \
|
||||
I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
|
||||
}\
|
||||
}
|
||||
|
||||
#elif defined (__INTEL_COMPILER)
|
||||
#define compute_tree_index(S, I)\
|
||||
{\
|
||||
size_t X = S >> TREEBIN_SHIFT;\
|
||||
if (X == 0)\
|
||||
I = 0;\
|
||||
else if (X > 0xFFFF)\
|
||||
I = NTREEBINS-1;\
|
||||
else {\
|
||||
unsigned int K = _bit_scan_reverse (X); \
|
||||
I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
|
||||
}\
|
||||
}
|
||||
|
||||
#elif defined(_MSC_VER) && _MSC_VER>=1300
|
||||
#define compute_tree_index(S, I)\
|
||||
{\
|
||||
size_t X = S >> TREEBIN_SHIFT;\
|
||||
if (X == 0)\
|
||||
I = 0;\
|
||||
else if (X > 0xFFFF)\
|
||||
I = NTREEBINS-1;\
|
||||
else {\
|
||||
unsigned int K;\
|
||||
_BitScanReverse((DWORD *) &K, (DWORD) X);\
|
||||
I = (bindex_t)((K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1)));\
|
||||
}\
|
||||
}
|
||||
|
||||
#else /* GNUC */
|
||||
#define compute_tree_index(S, I)\
|
||||
{\
|
||||
size_t X = S >> TREEBIN_SHIFT;\
|
||||
if (X == 0)\
|
||||
I = 0;\
|
||||
else if (X > 0xFFFF)\
|
||||
I = NTREEBINS-1;\
|
||||
else {\
|
||||
unsigned int Y = (unsigned int)X;\
|
||||
unsigned int N = ((Y - 0x100) >> 16) & 8;\
|
||||
unsigned int K = (((Y <<= N) - 0x1000) >> 16) & 4;\
|
||||
N += K;\
|
||||
N += K = (((Y <<= K) - 0x4000) >> 16) & 2;\
|
||||
K = 14 - N + ((Y <<= K) >> 15);\
|
||||
I = (K << 1) + ((S >> (K + (TREEBIN_SHIFT-1)) & 1));\
|
||||
}\
|
||||
}
|
||||
#endif /* GNUC */
|
||||
|
||||
/* Bit representing maximum resolved size in a treebin at i */
|
||||
#define bit_for_tree_index(i) \
|
||||
(i == NTREEBINS-1)? (SIZE_T_BITSIZE-1) : (((i) >> 1) + TREEBIN_SHIFT - 2)
|
||||
|
||||
/* Shift placing maximum resolved bit in a treebin at i as sign bit */
|
||||
#define leftshift_for_tree_index(i) \
|
||||
((i == NTREEBINS-1)? 0 : \
|
||||
((SIZE_T_BITSIZE-SIZE_T_ONE) - (((i) >> 1) + TREEBIN_SHIFT - 2)))
|
||||
|
||||
/* The size of the smallest chunk held in bin with index i */
|
||||
#define minsize_for_tree_index(i) \
|
||||
((SIZE_T_ONE << (((i) >> 1) + TREEBIN_SHIFT)) | \
|
||||
(((size_t)((i) & SIZE_T_ONE)) << (((i) >> 1) + TREEBIN_SHIFT - 1)))
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue