00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #ifndef STACK_ALLOC_H
00036 #define STACK_ALLOC_H
00037
00038 #ifdef USE_ALLOCA
00039 #ifdef WIN32
00040 #include <malloc.h>
00041 #else
00042 #include <alloca.h>
00043 #endif
00044 #endif
00045
00092 #ifdef ENABLE_VALGRIND
00093
00094 #include <valgrind/memcheck.h>
00095
00096 #define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1))
00097
00098 #define PUSH(stack, size, type) (VALGRIND_MAKE_NOACCESS(stack, 1000),ALIGN((stack),sizeof(type)),VALGRIND_MAKE_WRITABLE(stack, ((size)*sizeof(type))),(stack)+=((size)*sizeof(type)),(type*)((stack)-((size)*sizeof(type))))
00099
00100 #define PUSHS(stack, type) (VALGRIND_MAKE_NOACCESS(stack, 1000),ALIGN((stack),sizeof(long)),VALGRIND_MAKE_WRITABLE(stack, (sizeof(type))),(stack)+=(sizeof(type)),(type*)((stack)-(sizeof(type))))
00101
00102 #else
00103
00104 #define ALIGN(stack, size) ((stack) += ((size) - (long)(stack)) & ((size) - 1))
00105
00106 #define PUSH(stack, size, type) (ALIGN((stack),sizeof(type)),(stack)+=((size)*sizeof(type)),(type*)((stack)-((size)*sizeof(type))))
00107
00108 #define PUSHS(stack, type) (ALIGN((stack),sizeof(long)),(stack)+=(sizeof(type)),(type*)((stack)-(sizeof(type))))
00109
00110 #endif
00111
00112 #if defined(VAR_ARRAYS)
00113 #define VARDECL(var)
00114 #define ALLOC(var, size, type) type var[size]
00115 #elif defined(USE_ALLOCA)
00116 #define VARDECL(var) var
00117 #define ALLOC(var, size, type) var = alloca(sizeof(type)*size)
00118 #else
00119 #define VARDECL(var) var
00120 #define ALLOC(var, size, type) var = PUSH(stack, size, type)
00121 #endif
00122
00123
00124 #endif