xref: /titanic_51/usr/src/lib/libast/common/features/vmalloc (revision 34f9b3eef6fdadbda0a846aa4d68691ac40eace5)
1da2e3ebdSchin#
2da2e3ebdSchin# This file defines probes for local features that vmalloc requires.
3da2e3ebdSchin# Such probes are interpreted by the "iffe" language interpreter.
4da2e3ebdSchin# Results are stored in the FEATURE directory. Some of the
5da2e3ebdSchin# {lib,hdr,sys,typ} tests may also be done in the AST features/lib;
6da2e3ebdSchin# repeating them here allows for single standalone and AST sources.
7da2e3ebdSchin#
8da2e3ebdSchin
9da2e3ebdSchinref	-D_def_map_ast=1
10da2e3ebdSchin
11da2e3ebdSchinlib	atexit,getpagesize,mallinfo,mallopt,memalign,mstats
12da2e3ebdSchinlib	onexit,pvalloc,strdup,valloc,vmalloc
13da2e3ebdSchinlib	_malloc,__malloc,__libc_malloc
14da2e3ebdSchinhdr	alloca,malloc,stat,stdlib,unistd
15da2e3ebdSchinmem	mallinfo.arena,mstats.bytes_total malloc.h
16da2e3ebdSchinsys	stat
17da2e3ebdSchintyp	ssize_t
18da2e3ebdSchin
19da2e3ebdSchintst	mem_sbrk note{ brk()/sbrk() work as expected }end execute{
20da2e3ebdSchin	#include        <sys/types.h>
21da2e3ebdSchin	#include        <unistd.h>
22da2e3ebdSchin	#undef	uchar
23da2e3ebdSchin	#define	uchar	unsigned char
24da2e3ebdSchin	int main()
25da2e3ebdSchin	{	uchar	*brk0, *brk1;
26da2e3ebdSchin
27da2e3ebdSchin		/* allocate a big chunk */
28da2e3ebdSchin		if(!(brk0 = (uchar*)sbrk(0)) || brk0 == (uchar*)(-1))
29da2e3ebdSchin			return 1;
30da2e3ebdSchin		brk0 += 256*1024;
31da2e3ebdSchin		if(brk(brk0) != 0)
32da2e3ebdSchin			return 1;
33da2e3ebdSchin		if((brk1 = (uchar*)sbrk(0)) != brk0)
34da2e3ebdSchin			return 1;
35da2e3ebdSchin
36da2e3ebdSchin		/* now return half of it */
37da2e3ebdSchin		brk1 -= 128*1024;
38da2e3ebdSchin		if(brk(brk1) != 0 )
39da2e3ebdSchin			return 1;
40da2e3ebdSchin		if((brk0 = (uchar*)sbrk(0)) != brk1)
41da2e3ebdSchin			return 1;
42da2e3ebdSchin
43da2e3ebdSchin		return 0;
44da2e3ebdSchin	}
45da2e3ebdSchin}end
46da2e3ebdSchin
47da2e3ebdSchintst	map_malloc note{ map malloc to _ast_malloc }end noexecute{
48da2e3ebdSchin	#if __CYGWIN__
49da2e3ebdSchin	int main() { return 1; }
50da2e3ebdSchin	#else
51da2e3ebdSchin	static int user = 0;
52da2e3ebdSchin	_BEGIN_EXTERNS_
53da2e3ebdSchin	#if _lib_strdup
54da2e3ebdSchin	extern char* strdup _ARG_((const char*));
55da2e3ebdSchin	#define LOCAL()	strdup("s")
56da2e3ebdSchin	#else
57da2e3ebdSchin	extern void* calloc _ARG_((unsigned int, unsigned int));
58da2e3ebdSchin	#define LOCAL()	calloc(1,1)
59da2e3ebdSchin	#endif
60da2e3ebdSchin	#if __CYGWIN__
61da2e3ebdSchin	#define extern __declspec(dllexport)
62da2e3ebdSchin	#endif
63da2e3ebdSchin	#define HT double
64da2e3ebdSchin	static HT heap[1024 * 4];
65da2e3ebdSchin	static HT* hp = &heap[1];
66da2e3ebdSchin	static HT* op;
67da2e3ebdSchin	#define MALLOC(n) if(user)return&heap[0];op=hp;hp+=(n+sizeof(HT)-1)/sizeof(HT);return(void*)op;
68da2e3ebdSchin	#define INTERCEPTED(p) (((char*)(p))==((char*)&heap[0]))
69da2e3ebdSchin	#if _STD_
70da2e3ebdSchin	extern void free(void* p) { }
71da2e3ebdSchin	extern void _free(void* p) { }
72da2e3ebdSchin	extern void __free(void* p) { }
73da2e3ebdSchin	extern void __libc_free(void* p) { }
74da2e3ebdSchin	extern void* malloc(unsigned int n) { MALLOC(n); }
75da2e3ebdSchin	extern void* _malloc(unsigned int n) { MALLOC(n); }
76da2e3ebdSchin	extern void* __malloc(unsigned int n) { MALLOC(n); }
77da2e3ebdSchin	extern void* __libc_malloc(unsigned int n) { MALLOC(n); }
78da2e3ebdSchin	#else
79da2e3ebdSchin	extern void free(p) char* p; { }
80da2e3ebdSchin	extern void _free(p) char* p; { }
81da2e3ebdSchin	extern void __free(p) char* p; { }
82da2e3ebdSchin	extern void __libc_free(p) char* p; { }
83da2e3ebdSchin	extern void* malloc(n) unsigned int n; { MALLOC(n); }
84da2e3ebdSchin	extern void* _malloc(n) unsigned int n; { MALLOC(n); }
85da2e3ebdSchin	extern void* __malloc(n) unsigned int n; { MALLOC(n); }
86da2e3ebdSchin	extern void* __libc_malloc(n) unsigned int n; { MALLOC(n); }
87da2e3ebdSchin	#endif
88da2e3ebdSchin	_END_EXTERNS_
89da2e3ebdSchin	int main() { user = 1; return !INTERCEPTED(LOCAL()); }
90da2e3ebdSchin	#endif
91da2e3ebdSchin}end
92da2e3ebdSchin
93da2e3ebdSchintst	map_malloc note{ map malloc to _ast_malloc -- wimp-o mach? }end noexecute{
94da2e3ebdSchin	#if _map_malloc
95da2e3ebdSchin	int main() { return 0; }
96da2e3ebdSchin	#else
97da2e3ebdSchin	_BEGIN_EXTERNS_
98da2e3ebdSchin	#if _STD_
99da2e3ebdSchin	void* calloc(unsigned n, unsigned m) { exit(1); }
100da2e3ebdSchin	#else
101da2e3ebdSchin	void* calloc(n, m) unsigned n, m; { exit(1); }
102da2e3ebdSchin	#endif
103da2e3ebdSchin	_END_EXTERNS_
104da2e3ebdSchin	int main() { return 0; }
105da2e3ebdSchin	#endif
106da2e3ebdSchin}end
107da2e3ebdSchin
108da2e3ebdSchinlib	alloca note{ alloca exists }end link{
109da2e3ebdSchin	#if _hdr_alloca
110da2e3ebdSchin	#include	<alloca.h>
111da2e3ebdSchin	#endif
112da2e3ebdSchin	int
113da2e3ebdSchin	main()
114da2e3ebdSchin	{	alloca(10);
115da2e3ebdSchin	}
116da2e3ebdSchin}end
117da2e3ebdSchin
118da2e3ebdSchintst	mal_alloca note{ alloca is based on malloc() }end execute{
119*34f9b3eeSRoland Mainz	#if __CYGWIN__
120*34f9b3eeSRoland Mainz	int main() { return 1; }
121*34f9b3eeSRoland Mainz	#else
122da2e3ebdSchin	#if _hdr_alloca
123da2e3ebdSchin	#include	<alloca.h>
124da2e3ebdSchin	#endif
125da2e3ebdSchin	#if _STD_
126da2e3ebdSchin	void* malloc(unsigned int size)
127da2e3ebdSchin	#else
128da2e3ebdSchin	void* malloc(size) unsigned int size;
129da2e3ebdSchin	#endif
130da2e3ebdSchin	{	exit(0);
131da2e3ebdSchin		return 0;
132da2e3ebdSchin	}
133da2e3ebdSchin	int main()
134da2e3ebdSchin	{	alloca(10);
135da2e3ebdSchin		return 1;
136da2e3ebdSchin	}
137*34f9b3eeSRoland Mainz	#endif
138da2e3ebdSchin}end
139da2e3ebdSchin
140da2e3ebdSchintst	stk_down note{ stack grows downward }end execute{
141da2e3ebdSchin	static growdown()
142da2e3ebdSchin	{	static char*	addr = 0;
143da2e3ebdSchin		char		array[4];
144da2e3ebdSchin		if(!addr)
145da2e3ebdSchin		{	addr = &array[0];
146da2e3ebdSchin			return growdown();
147da2e3ebdSchin		}
148da2e3ebdSchin		else if(addr < &array[0])
149da2e3ebdSchin			return 0;
150da2e3ebdSchin		else	return 1;
151da2e3ebdSchin	}
152da2e3ebdSchin	int main() { return growdown() ? 0 : 1; }
153da2e3ebdSchin}end
154da2e3ebdSchin
155da2e3ebdSchincat{
156da2e3ebdSchin	#include "FEATURE/mmap"
157da2e3ebdSchin	#if _BLD_INSTRUMENT || cray || _UWIN && _BLD_ast
158da2e3ebdSchin	#undef	_map_malloc
159da2e3ebdSchin	#define _std_malloc	1	/* defer to standard malloc */
160da2e3ebdSchin	#endif
161da2e3ebdSchin	#if _mmap_anon
162da2e3ebdSchin	#define _mem_mmap_anon	1
163da2e3ebdSchin	#endif
164da2e3ebdSchin	#if _mmap_devzero
165da2e3ebdSchin	#define _mem_mmap_zero	1
166da2e3ebdSchin	#endif
167da2e3ebdSchin}end
168