1 /*
2  * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
3  * Copyright (c) 1991-1994 by Xerox Corporation.  All rights reserved.
4  * Copyright 1996 Silicon Graphics.  All rights reserved.
5  *
6  * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
7  * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
8  *
9  * Permission is hereby granted to use or copy this program
10  * for any purpose,  provided the above notices are retained on all copies.
11  * Permission to modify the code and to distribute modified code is granted,
12  * provided the above notices are retained, and a notice that the code was
13  * modified is included with the above copyright notice.
14  */
15 /*
16  * Some simple primitives for allocation with explicit type information.
17  * Facilities for dynamic type inference may be added later.
18  * Should be used only for extremely performance critical applications,
19  * or if conservative collector leakage is otherwise a problem (unlikely).
20  * Note that this is implemented completely separately from the rest
21  * of the collector, and is not linked in unless referenced.
22  * This does not currently support GC_DEBUG in any interesting way.
23  */
24 /* Boehm, May 19, 1994 2:13 pm PDT */
25 
26 #ifndef _GC_TYPED_H
27 # define _GC_TYPED_H
28 # ifndef _GC_H
29 #   include "gc.h"
30 # endif
31 
32 #ifdef __cplusplus
33   extern "C" {
34 #endif
35 typedef GC_word * GC_bitmap;
36 	/* The least significant bit of the first word is one if	*/
37 	/* the first word in the object may be a pointer.		*/
38 
39 # define GC_WORDSZ (8*sizeof(GC_word))
40 # define GC_get_bit(bm, index) \
41 		(((bm)[index/GC_WORDSZ] >> (index%GC_WORDSZ)) & 1)
42 # define GC_set_bit(bm, index) \
43 		(bm)[index/GC_WORDSZ] |= ((GC_word)1 << (index%GC_WORDSZ))
44 # define GC_WORD_OFFSET(t, f) (offsetof(t,f)/sizeof(GC_word))
45 # define GC_WORD_LEN(t) (sizeof(t)/ sizeof(GC_word))
46 # define GC_BITMAP_SIZE(t) ((GC_WORD_LEN(t) + GC_WORDSZ-1)/GC_WORDSZ)
47 
48 typedef GC_word GC_descr;
49 
50 GC_API GC_descr GC_make_descriptor GC_PROTO((GC_bitmap bm, size_t len));
51 		/* Return a type descriptor for the object whose layout	*/
52 		/* is described by the argument.			*/
53 		/* The least significant bit of the first word is one	*/
54 		/* if the first word in the object may be a pointer.	*/
55 		/* The second argument specifies the number of		*/
56 		/* meaningful bits in the bitmap.  The actual object 	*/
57 		/* may be larger (but not smaller).  Any additional	*/
58 		/* words in the object are assumed not to contain 	*/
59 		/* pointers.						*/
60 		/* Returns a conservative approximation in the		*/
61 		/* (unlikely) case of insufficient memory to build	*/
62 		/* the descriptor.  Calls to GC_make_descriptor		*/
63 		/* may consume some amount of a finite resource.  This	*/
64 		/* is intended to be called once per type, not once	*/
65 		/* per allocation.					*/
66 
67 /* It is possible to generate a descriptor for a C type T with	*/
68 /* word aligned pointer fields f1, f2, ... as follows:			*/
69 /*									*/
70 /* GC_descr T_descr;                                                    */
71 /* GC_word T_bitmap[GC_BITMAP_SIZE(T)] = {0};				*/
72 /* GC_set_bit(T_bitmap, GC_WORD_OFFSET(T,f1));				*/
73 /* GC_set_bit(T_bitmap, GC_WORD_OFFSET(T,f2));				*/
74 /* ...									*/
75 /* T_descr = GC_make_descriptor(T_bitmap, GC_WORD_LEN(T));		*/
76 
77 GC_API GC_PTR GC_malloc_explicitly_typed
78 			GC_PROTO((size_t size_in_bytes, GC_descr d));
79 		/* Allocate an object whose layout is described by d.	*/
80 		/* The resulting object MAY NOT BE PASSED TO REALLOC.	*/
81 		/* The returned object is cleared.			*/
82 
83 GC_API GC_PTR GC_malloc_explicitly_typed_ignore_off_page
84                         GC_PROTO((size_t size_in_bytes, GC_descr d));
85 
86 GC_API GC_PTR GC_calloc_explicitly_typed
87 			GC_PROTO((size_t nelements,
88   				  size_t element_size_in_bytes,
89   				  GC_descr d));
90   	/* Allocate an array of nelements elements, each of the	*/
91   	/* given size, and with the given descriptor.		*/
92   	/* The elemnt size must be a multiple of the byte	*/
93   	/* alignment required for pointers.  E.g. on a 32-bit	*/
94   	/* machine with 16-bit aligned pointers, size_in_bytes	*/
95   	/* must be a multiple of 2.				*/
96 	/* Returned object is cleared.				*/
97 
98 #ifdef GC_DEBUG
99 #   define GC_MALLOC_EXPLICITLY_TYPED(bytes, d) GC_MALLOC(bytes)
100 #   define GC_CALLOC_EXPLICITLY_TYPED(n, bytes, d) GC_MALLOC(n*bytes)
101 #else
102 #  define GC_MALLOC_EXPLICITLY_TYPED(bytes, d) \
103 	GC_malloc_explicitly_typed(bytes, d)
104 #  define GC_CALLOC_EXPLICITLY_TYPED(n, bytes, d) \
105 	GC_calloc_explicitly_typed(n, bytes, d)
106 #endif /* !GC_DEBUG */
107 
108 #ifdef __cplusplus
109   } /* matches extern "C" */
110 #endif
111 
112 #endif /* _GC_TYPED_H */
113 
114