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