1 /* 2 * Copyright 2008-2009 Katholieke Universiteit Leuven 3 * 4 * Use of this software is governed by the MIT license 5 * 6 * Written by Sven Verdoolaege, K.U.Leuven, Departement 7 * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium 8 */ 9 10 #ifndef ISL_CTX_H 11 #define ISL_CTX_H 12 13 #include <stdio.h> 14 #include <stdlib.h> 15 16 #include <isl/arg.h> 17 18 #ifndef __isl_give 19 #define __isl_give 20 #endif 21 #ifndef __isl_take 22 #define __isl_take 23 #endif 24 #ifndef __isl_keep 25 #define __isl_keep 26 #endif 27 #ifndef __isl_null 28 #define __isl_null 29 #endif 30 #ifndef __isl_export 31 #define __isl_export 32 #endif 33 #ifndef __isl_overload 34 #define __isl_overload 35 #endif 36 #ifndef __isl_constructor 37 #define __isl_constructor 38 #endif 39 #ifndef __isl_subclass 40 #define __isl_subclass(super) 41 #endif 42 43 #if defined(__cplusplus) 44 extern "C" { 45 #endif 46 47 /* Nearly all isa functions require a struct isl_ctx allocated using 48 * isl_ctx_alloc. This ctx contains (or will contain) options that 49 * control the behavior of the library and some caches. 50 * 51 * An object allocated within a given ctx should never be used inside 52 * another ctx. Functions for moving objects from one ctx to another 53 * will be added as the need arises. 54 * 55 * A given context should only be used inside a single thread. 56 * A global context for synchronization between different threads 57 * as well as functions for moving a context to a different thread 58 * will be added as the need arises. 59 * 60 * If anything goes wrong (out of memory, failed assertion), then 61 * the library will currently simply abort. This will be made 62 * configurable in the future. 63 * Users of the library should expect functions that return 64 * a pointer to a structure, to return NULL, indicating failure. 65 * Any function accepting a pointer to a structure will treat 66 * a NULL argument as a failure, resulting in the function freeing 67 * the remaining structures (if any) and returning NULL itself 68 * (in case of pointer return type). 69 * The only exception is the isl_ctx argument, which should never be NULL. 70 */ 71 struct isl_stats { 72 long gbr_solved_lps; 73 }; 74 enum isl_error { 75 isl_error_none = 0, 76 isl_error_abort, 77 isl_error_alloc, 78 isl_error_unknown, 79 isl_error_internal, 80 isl_error_invalid, 81 isl_error_quota, 82 isl_error_unsupported 83 }; 84 typedef enum { 85 isl_stat_error = -1, 86 isl_stat_ok = 0 87 } isl_stat; 88 typedef enum { 89 isl_bool_error = -1, 90 isl_bool_false = 0, 91 isl_bool_true = 1 92 } isl_bool; 93 isl_bool isl_bool_not(isl_bool b); 94 struct isl_ctx; 95 typedef struct isl_ctx isl_ctx; 96 97 /* Some helper macros */ 98 99 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) 100 #define ISL_DEPRECATED __attribute__((__deprecated__)) 101 #else 102 #define ISL_DEPRECATED 103 #endif 104 105 #define ISL_FL_INIT(l, f) (l) = (f) /* Specific flags location. */ 106 #define ISL_FL_SET(l, f) ((l) |= (f)) 107 #define ISL_FL_CLR(l, f) ((l) &= ~(f)) 108 #define ISL_FL_ISSET(l, f) (!!((l) & (f))) 109 110 #define ISL_F_INIT(p, f) ISL_FL_INIT((p)->flags, f) /* Structure element flags. */ 111 #define ISL_F_SET(p, f) ISL_FL_SET((p)->flags, f) 112 #define ISL_F_CLR(p, f) ISL_FL_CLR((p)->flags, f) 113 #define ISL_F_ISSET(p, f) ISL_FL_ISSET((p)->flags, f) 114 115 void *isl_malloc_or_die(isl_ctx *ctx, size_t size); 116 void *isl_calloc_or_die(isl_ctx *ctx, size_t nmemb, size_t size); 117 void *isl_realloc_or_die(isl_ctx *ctx, void *ptr, size_t size); 118 119 #define isl_alloc(ctx,type,size) ((type *)isl_malloc_or_die(ctx, size)) 120 #define isl_calloc(ctx,type,size) ((type *)isl_calloc_or_die(ctx,\ 121 1, size)) 122 #define isl_realloc(ctx,ptr,type,size) ((type *)isl_realloc_or_die(ctx,\ 123 ptr, size)) 124 #define isl_alloc_type(ctx,type) isl_alloc(ctx,type,sizeof(type)) 125 #define isl_calloc_type(ctx,type) isl_calloc(ctx,type,sizeof(type)) 126 #define isl_realloc_type(ctx,ptr,type) isl_realloc(ctx,ptr,type,sizeof(type)) 127 #define isl_alloc_array(ctx,type,n) isl_alloc(ctx,type,(n)*sizeof(type)) 128 #define isl_calloc_array(ctx,type,n) ((type *)isl_calloc_or_die(ctx,\ 129 n, sizeof(type))) 130 #define isl_realloc_array(ctx,ptr,type,n) \ 131 isl_realloc(ctx,ptr,type,(n)*sizeof(type)) 132 133 #define isl_die(ctx,errno,msg,code) \ 134 do { \ 135 isl_handle_error(ctx, errno, msg, __FILE__, __LINE__); \ 136 code; \ 137 } while (0) 138 139 void isl_handle_error(isl_ctx *ctx, enum isl_error error, const char *msg, 140 const char *file, int line); 141 142 #define isl_assert4(ctx,test,code,errno) \ 143 do { \ 144 if (test) \ 145 break; \ 146 isl_die(ctx, errno, "Assertion \"" #test "\" failed", code); \ 147 } while (0) 148 #define isl_assert(ctx,test,code) \ 149 isl_assert4(ctx,test,code,isl_error_unknown) 150 151 #define isl_min(a,b) ((a < b) ? (a) : (b)) 152 153 /* struct isl_ctx functions */ 154 155 struct isl_options *isl_ctx_options(isl_ctx *ctx); 156 157 isl_ctx *isl_ctx_alloc_with_options(struct isl_args *args, 158 __isl_take void *opt); 159 isl_ctx *isl_ctx_alloc(void); 160 void *isl_ctx_peek_options(isl_ctx *ctx, struct isl_args *args); 161 int isl_ctx_parse_options(isl_ctx *ctx, int argc, char **argv, unsigned flags); 162 void isl_ctx_ref(struct isl_ctx *ctx); 163 void isl_ctx_deref(struct isl_ctx *ctx); 164 void isl_ctx_free(isl_ctx *ctx); 165 166 void isl_ctx_abort(isl_ctx *ctx); 167 void isl_ctx_resume(isl_ctx *ctx); 168 int isl_ctx_aborted(isl_ctx *ctx); 169 170 void isl_ctx_set_max_operations(isl_ctx *ctx, unsigned long max_operations); 171 unsigned long isl_ctx_get_max_operations(isl_ctx *ctx); 172 void isl_ctx_reset_operations(isl_ctx *ctx); 173 174 #define ISL_ARG_CTX_DECL(prefix,st,args) \ 175 st *isl_ctx_peek_ ## prefix(isl_ctx *ctx); 176 177 #define ISL_ARG_CTX_DEF(prefix,st,args) \ 178 st *isl_ctx_peek_ ## prefix(isl_ctx *ctx) \ 179 { \ 180 return (st *)isl_ctx_peek_options(ctx, &(args)); \ 181 } 182 183 #define ISL_CTX_GET_INT_DEF(prefix,st,args,field) \ 184 int prefix ## _get_ ## field(isl_ctx *ctx) \ 185 { \ 186 st *options; \ 187 options = isl_ctx_peek_ ## prefix(ctx); \ 188 if (!options) \ 189 isl_die(ctx, isl_error_invalid, \ 190 "isl_ctx does not reference " #prefix, \ 191 return -1); \ 192 return options->field; \ 193 } 194 195 #define ISL_CTX_SET_INT_DEF(prefix,st,args,field) \ 196 isl_stat prefix ## _set_ ## field(isl_ctx *ctx, int val) \ 197 { \ 198 st *options; \ 199 options = isl_ctx_peek_ ## prefix(ctx); \ 200 if (!options) \ 201 isl_die(ctx, isl_error_invalid, \ 202 "isl_ctx does not reference " #prefix, \ 203 return isl_stat_error); \ 204 options->field = val; \ 205 return isl_stat_ok; \ 206 } 207 208 #define ISL_CTX_GET_STR_DEF(prefix,st,args,field) \ 209 const char *prefix ## _get_ ## field(isl_ctx *ctx) \ 210 { \ 211 st *options; \ 212 options = isl_ctx_peek_ ## prefix(ctx); \ 213 if (!options) \ 214 isl_die(ctx, isl_error_invalid, \ 215 "isl_ctx does not reference " #prefix, \ 216 return NULL); \ 217 return options->field; \ 218 } 219 220 #define ISL_CTX_SET_STR_DEF(prefix,st,args,field) \ 221 isl_stat prefix ## _set_ ## field(isl_ctx *ctx, const char *val) \ 222 { \ 223 st *options; \ 224 options = isl_ctx_peek_ ## prefix(ctx); \ 225 if (!options) \ 226 isl_die(ctx, isl_error_invalid, \ 227 "isl_ctx does not reference " #prefix, \ 228 return isl_stat_error); \ 229 if (!val) \ 230 return isl_stat_error; \ 231 free(options->field); \ 232 options->field = strdup(val); \ 233 if (!options->field) \ 234 return isl_stat_error; \ 235 return isl_stat_ok; \ 236 } 237 238 #define ISL_CTX_GET_BOOL_DEF(prefix,st,args,field) \ 239 ISL_CTX_GET_INT_DEF(prefix,st,args,field) 240 241 #define ISL_CTX_SET_BOOL_DEF(prefix,st,args,field) \ 242 ISL_CTX_SET_INT_DEF(prefix,st,args,field) 243 244 #define ISL_CTX_GET_CHOICE_DEF(prefix,st,args,field) \ 245 ISL_CTX_GET_INT_DEF(prefix,st,args,field) 246 247 #define ISL_CTX_SET_CHOICE_DEF(prefix,st,args,field) \ 248 ISL_CTX_SET_INT_DEF(prefix,st,args,field) 249 250 enum isl_error isl_ctx_last_error(isl_ctx *ctx); 251 const char *isl_ctx_last_error_msg(isl_ctx *ctx); 252 const char *isl_ctx_last_error_file(isl_ctx *ctx); 253 int isl_ctx_last_error_line(isl_ctx *ctx); 254 void isl_ctx_reset_error(isl_ctx *ctx); 255 void isl_ctx_set_error(isl_ctx *ctx, enum isl_error error); 256 257 #if defined(__cplusplus) 258 } 259 #endif 260 261 #endif 262