da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# This file defines probes for local features that vmalloc requires.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Such probes are interpreted by the "iffe" language interpreter.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Results are stored in the FEATURE directory. Some of the
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# {lib,hdr,sys,typ} tests may also be done in the AST features/lib;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# repeating them here allows for single standalone and AST sources.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinref -D_def_map_ast=1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinlib atexit,getpagesize,mallinfo,mallopt,memalign,mstats
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinlib onexit,pvalloc,strdup,valloc,vmalloc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinlib _malloc,__malloc,__libc_malloc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinhdr alloca,malloc,stat,stdlib,unistd
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinmem mallinfo.arena,mstats.bytes_total malloc.h
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinsys stat
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintyp ssize_t
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintst mem_sbrk note{ brk()/sbrk() work as expected }end execute{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #include <sys/types.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #include <unistd.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #undef uchar
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #define uchar unsigned char
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int main()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { uchar *brk0, *brk1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* allocate a big chunk */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(brk0 = (uchar*)sbrk(0)) || brk0 == (uchar*)(-1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin brk0 += 256*1024;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(brk(brk0) != 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((brk1 = (uchar*)sbrk(0)) != brk0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* now return half of it */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin brk1 -= 128*1024;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(brk(brk1) != 0 )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((brk0 = (uchar*)sbrk(0)) != brk1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}end
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintst map_malloc note{ map malloc to _ast_malloc }end noexecute{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #if __CYGWIN__
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int main() { return 1; }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static int user = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin _BEGIN_EXTERNS_
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #if _lib_strdup
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern char* strdup _ARG_((const char*));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #define LOCAL() strdup("s")
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void* calloc _ARG_((unsigned int, unsigned int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #define LOCAL() calloc(1,1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #if __CYGWIN__
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #define extern __declspec(dllexport)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #define HT double
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static HT heap[1024 * 4];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static HT* hp = &heap[1];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static HT* op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #define MALLOC(n) if(user)return&heap[0];op=hp;hp+=(n+sizeof(HT)-1)/sizeof(HT);return(void*)op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #define INTERCEPTED(p) (((char*)(p))==((char*)&heap[0]))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #if _STD_
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void free(void* p) { }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void _free(void* p) { }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void __free(void* p) { }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void __libc_free(void* p) { }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void* malloc(unsigned int n) { MALLOC(n); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void* _malloc(unsigned int n) { MALLOC(n); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void* __malloc(unsigned int n) { MALLOC(n); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void* __libc_malloc(unsigned int n) { MALLOC(n); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void free(p) char* p; { }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void _free(p) char* p; { }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void __free(p) char* p; { }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void __libc_free(p) char* p; { }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void* malloc(n) unsigned int n; { MALLOC(n); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void* _malloc(n) unsigned int n; { MALLOC(n); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void* __malloc(n) unsigned int n; { MALLOC(n); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin extern void* __libc_malloc(n) unsigned int n; { MALLOC(n); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin _END_EXTERNS_
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int main() { user = 1; return !INTERCEPTED(LOCAL()); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}end
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintst map_malloc note{ map malloc to _ast_malloc -- wimp-o mach? }end noexecute{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #if _map_malloc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int main() { return 0; }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin _BEGIN_EXTERNS_
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #if _STD_
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin void* calloc(unsigned n, unsigned m) { exit(1); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin void* calloc(n, m) unsigned n, m; { exit(1); }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin _END_EXTERNS_
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int main() { return 0; }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}end
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinlib alloca note{ alloca exists }end link{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #if _hdr_alloca
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #include <alloca.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin main()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { alloca(10);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}end
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintst mal_alloca note{ alloca is based on malloc() }end execute{
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz #if __CYGWIN__
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz int main() { return 1; }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz #else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #if _hdr_alloca
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #include <alloca.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #if _STD_
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin void* malloc(unsigned int size)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin void* malloc(size) unsigned int size;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { exit(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int main()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { alloca(10);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz #endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}end
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintst stk_down note{ stack grows downward }end execute{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static growdown()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { static char* addr = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char array[4];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!addr)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { addr = &array[0];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return growdown();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(addr < &array[0])
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else return 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int main() { return growdown() ? 0 : 1; }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}end
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #include "FEATURE/mmap"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #if _BLD_INSTRUMENT || cray || _UWIN && _BLD_ast
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #undef _map_malloc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #define _std_malloc 1 /* defer to standard malloc */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #if _mmap_anon
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #define _mem_mmap_anon 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #if _mmap_devzero
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #define _mem_mmap_zero 1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin #endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}end