mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:51:15 +08:00
Use macros to hide some of the ugly casting required in the previously
applied fix for pointers with the high bit set.
This commit is contained in:
parent
1cc27b5ed3
commit
e59622b438
@ -1,3 +1,8 @@
|
||||
Sat Dec 7 18:13:11 1991 Fred Fish (fnf at cygnus.com)
|
||||
|
||||
* gmalloc.c: Use macros to hide some of the ugly casting required
|
||||
in the previously applied fix for pointers with high bits set.
|
||||
|
||||
Sat Dec 7 16:49:35 1991 John Gilmore (gnu at cygnus.com)
|
||||
|
||||
* Makefile.in: Roll VERSION to 4.3.1.
|
||||
|
@ -270,6 +270,16 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
#define BLOCKSIZE (1 << BLOCKLOG)
|
||||
#define BLOCKIFY(SIZE) (((SIZE) + BLOCKSIZE - 1) / BLOCKSIZE)
|
||||
|
||||
/* The difference between two pointers is a signed int. On machines where
|
||||
the data addresses have the high bit set, we need to ensure that the
|
||||
difference becomes an unsigned int when we are using the address as an
|
||||
integral value. In addition, when using with the '%' operator, the
|
||||
sign of the result is machine dependent for negative values, so force
|
||||
it to be treated as an unsigned int. */
|
||||
|
||||
#define ADDR2UINT(addr) ((unsigned int) ((char *) (addr) - (char *) NULL))
|
||||
#define RESIDUAL(addr) ((unsigned int) (ADDR2UINT (addr) % BLOCKSIZE))
|
||||
|
||||
/* Determine the amount of memory spanned by the initial heap table
|
||||
(not an absolute limit). */
|
||||
#define HEAP (INT_BIT > 16 ? 4194304 : 65536)
|
||||
@ -558,8 +568,7 @@ DEFUN(__free, (ptr), PTR ptr)
|
||||
it is the first free fragment of this block. */
|
||||
prev = (struct list *) ptr;
|
||||
_heapinfo[block].busy.info.frag.nfree = 1;
|
||||
_heapinfo[block].busy.info.frag.first = (unsigned int)
|
||||
(((unsigned int)((char *) ptr - (char *) NULL)) % BLOCKSIZE >> type);
|
||||
_heapinfo[block].busy.info.frag.first = RESIDUAL (ptr) >> type;
|
||||
prev->next = _fraghead[type].next;
|
||||
prev->prev = &_fraghead[type];
|
||||
prev->prev->next = prev;
|
||||
@ -656,7 +665,7 @@ DEFUN(align, (size), size_t size)
|
||||
unsigned int adj;
|
||||
|
||||
result = (*__morecore)(size);
|
||||
adj = (unsigned int) ((unsigned int)((char *) result - (char *) NULL)) % BLOCKSIZE;
|
||||
adj = RESIDUAL (result);
|
||||
if (adj != 0)
|
||||
{
|
||||
adj = BLOCKSIZE - adj;
|
||||
@ -769,8 +778,8 @@ DEFUN(malloc, (size), size_t size)
|
||||
next->next->prev = next->prev;
|
||||
block = BLOCK(result);
|
||||
if (--_heapinfo[block].busy.info.frag.nfree != 0)
|
||||
_heapinfo[block].busy.info.frag.first = (unsigned int)
|
||||
(((unsigned int)((char *) next->next - (char *) NULL)) % BLOCKSIZE) >> log;
|
||||
_heapinfo[block].busy.info.frag.first =
|
||||
RESIDUAL (next->next) >> log;
|
||||
|
||||
/* Update the statistics. */
|
||||
++_chunks_used;
|
||||
|
Loading…
Reference in New Issue
Block a user