00001
00002
00003
00004
00005
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
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055 #ifdef USE_PCH
00056 #include "cg_pch.h"
00057 #endif // USE_PCH
00058 #pragma hdrstop
00059
00060 #include "defs.h"
00061 #include "errors.h"
00062 #include "mempool.h"
00063 #include "erglob.h"
00064 #include "tn.h"
00065 #include "tn_map.h"
00066
00067
00068 typedef struct {
00069 void *value;
00070 INT32 generation;
00071 } TN_MAP_INFO;
00072
00073 struct tn_map {
00074 INT32 current_gen;
00075 INT32 table_size;
00076 TN_MAP_INFO *table;
00077 struct tn_map *next;
00078 };
00079
00080 #define TN_MAP_current_gen(map) ((map)->current_gen)
00081 #define TN_MAP_table_size(map) ((map)->table_size)
00082 #define TN_MAP_table(map) ((map)->table)
00083 #define TN_MAP_next(map) ((map)->next)
00084 #define TN_MAP_value(map,tn) ((map)->table[TN_number(tn)].value)
00085 #define TN_MAP_generation(map,tn) ((map)->table[TN_number(tn)].generation)
00086
00087
00088 static TN_MAP Free_TN_MAPs;
00089
00090
00091 void
00092 TN_MAP_Init (void)
00093 {
00094 Free_TN_MAPs = NULL;
00095 }
00096
00097
00098 TN_MAP
00099 TN_MAP_Create (void)
00100 {
00101 TN_MAP new_map;
00102
00103 if (Free_TN_MAPs != NULL) {
00104
00105 new_map = Free_TN_MAPs;
00106 Free_TN_MAPs = TN_MAP_next(new_map);
00107 }
00108 else {
00109
00110 INT table_size = Last_TN + MAX ((Last_TN / 5), 100);
00111 new_map = TYPE_PU_ALLOC (struct tn_map);
00112 TN_MAP_current_gen(new_map) = 0;
00113 TN_MAP_table_size(new_map) = table_size;
00114 TN_MAP_table(new_map) = TYPE_PU_ALLOC_N (TN_MAP_INFO, table_size+1);
00115 }
00116
00117 TN_MAP_current_gen(new_map)++;
00118
00119 return new_map;
00120 }
00121
00122
00123 void
00124 TN_MAP_Set ( TN_MAP map, TN *tn, void *value)
00125 {
00126 if (TN_number(tn) > TN_MAP_table_size(map)) {
00127
00128 INT new_size = MAX (Last_TN + MAX ((Last_TN / 5), 100),
00129 2 * TN_MAP_table_size(map));
00130 TN_MAP_table(map) = TYPE_MEM_POOL_REALLOC_N (
00131 TN_MAP_INFO, &MEM_pu_pool, TN_MAP_table(map),
00132 TN_MAP_table_size(map)+1, new_size+1);
00133 TN_MAP_table_size(map) = new_size;
00134 }
00135 TN_MAP_value(map,tn) = value;
00136 TN_MAP_generation(map,tn) = TN_MAP_current_gen(map);
00137 }
00138
00139 void *
00140 TN_MAP_Get ( TN_MAP map, const TN *tn)
00141 {
00142 void *retval;
00143
00144 if (TN_number(tn) <= TN_MAP_table_size(map) &&
00145 TN_MAP_current_gen(map) == TN_MAP_generation(map,tn))
00146 {
00147 retval = TN_MAP_value(map,tn);
00148 }
00149 else {
00150 retval = NULL;
00151 }
00152 return retval;
00153 }
00154
00155 void
00156 TN_MAP_Delete (TN_MAP map)
00157 {
00158
00159 TN_MAP_next(map) = Free_TN_MAPs;
00160 Free_TN_MAPs = map;
00161 }
00162
00163
00164
00165
00166
00167 typedef struct hash_entry {
00168 TN *tn;
00169 void *value;
00170 struct hash_entry *next;
00171 } HASH_ENTRY;
00172
00173 typedef struct hash_entry32 {
00174 TN *tn;
00175 INT32 value;
00176 struct hash_entry32 *next;
00177 } HASH_ENTRY32;
00178
00179 typedef struct hash_entry64 {
00180 TN *tn;
00181 INT64 value;
00182 struct hash_entry64 *next;
00183 } HASH_ENTRY64;
00184
00185 #define HASH_ENTRY_tn(entry) ((entry)->tn)
00186 #define HASH_ENTRY_value(entry) ((entry)->value)
00187 #define HASH_ENTRY_next(entry) ((entry)->next)
00188
00189
00190
00191
00192 struct htn_map {
00193 MEM_POOL *map_pool;
00194 HASH_ENTRY *map_entry[TN_MAP_HASH];
00195 };
00196
00197 struct htn_map32 {
00198 MEM_POOL *map_pool;
00199 HASH_ENTRY32 *map_entry[TN_MAP_HASH];
00200 };
00201
00202 struct htn_map64 {
00203 MEM_POOL *map_pool;
00204 HASH_ENTRY64 *map_entry[TN_MAP_HASH];
00205 };
00206
00207 #ifdef TARG_IA64
00208
00209 typedef struct hash_entryf {
00210 TN *tn;
00211 float value;
00212 struct hash_entryf *next;
00213 } HASH_ENTRYf;
00214
00215 struct htn_mapf {
00216 MEM_POOL *map_pool;
00217 HASH_ENTRYf *map_entry[TN_MAP_HASH];
00218 };
00219 #endif
00220
00221 #define hTN_MAP_pool(map) ((map)->map_pool)
00222 #define hTN_MAP_entry(map, index) ((map)->map_entry[index])
00223
00224
00225
00226
00227 hTN_MAP
00228 hTN_MAP_Create(MEM_POOL *pool)
00229 {
00230 hTN_MAP new_map;
00231
00232 new_map = TYPE_MEM_POOL_ALLOC(struct htn_map, pool);
00233 BZERO(new_map, sizeof(struct htn_map));
00234 hTN_MAP_pool(new_map) = pool;
00235 return new_map;
00236 }
00237
00238 hTN_MAP32
00239 hTN_MAP32_Create(MEM_POOL *pool)
00240 {
00241 hTN_MAP32 new_map;
00242
00243 new_map = TYPE_MEM_POOL_ALLOC(struct htn_map32, pool);
00244 BZERO(new_map, sizeof(struct htn_map32));
00245 hTN_MAP_pool(new_map) = pool;
00246 return new_map;
00247 }
00248
00249 hTN_MAP64
00250 hTN_MAP64_Create(MEM_POOL *pool)
00251 {
00252 hTN_MAP64 new_map;
00253
00254 new_map = TYPE_MEM_POOL_ALLOC(struct htn_map64, pool);
00255 BZERO(new_map, sizeof(struct htn_map64));
00256 hTN_MAP_pool(new_map) = pool;
00257 return new_map;
00258 }
00259
00260
00261
00262
00263 void
00264 hTN_MAP_Set(hTN_MAP map, TN *tn, void *value)
00265 {
00266 INT index = TN_number(tn) & (TN_MAP_HASH - 1);
00267 HASH_ENTRY *map_entry = hTN_MAP_entry(map, index);
00268
00269 while (map_entry != NULL) {
00270 if (HASH_ENTRY_tn(map_entry) == tn) break;
00271 map_entry = HASH_ENTRY_next(map_entry);
00272 }
00273 if (map_entry == NULL) {
00274 map_entry = TYPE_MEM_POOL_ALLOC(HASH_ENTRY, hTN_MAP_pool(map));
00275 HASH_ENTRY_next(map_entry) = hTN_MAP_entry(map, index);
00276 hTN_MAP_entry(map, index) = map_entry;
00277 HASH_ENTRY_tn(map_entry) = tn;
00278 }
00279 HASH_ENTRY_value(map_entry) = value;
00280 }
00281
00282 void
00283 hTN_MAP32_Set(hTN_MAP32 map, TN *tn, INT32 value)
00284 {
00285 INT index = TN_number(tn) & (TN_MAP_HASH - 1);
00286 HASH_ENTRY32 *map_entry = hTN_MAP_entry(map, index);
00287
00288 while (map_entry != NULL) {
00289 if (HASH_ENTRY_tn(map_entry) == tn) break;
00290 map_entry = HASH_ENTRY_next(map_entry);
00291 }
00292 if (map_entry == NULL) {
00293 map_entry = TYPE_MEM_POOL_ALLOC(HASH_ENTRY32, hTN_MAP_pool(map));
00294 HASH_ENTRY_next(map_entry) = hTN_MAP_entry(map, index);
00295 hTN_MAP_entry(map, index) = map_entry;
00296 HASH_ENTRY_tn(map_entry) = tn;
00297 }
00298 HASH_ENTRY_value(map_entry) = value;
00299 }
00300
00301 void
00302 hTN_MAP64_Set(hTN_MAP64 map, TN *tn, INT64 value)
00303 {
00304 INT index = TN_number(tn) & (TN_MAP_HASH - 1);
00305 HASH_ENTRY64 *map_entry = hTN_MAP_entry(map, index);
00306
00307 while (map_entry != NULL) {
00308 if (HASH_ENTRY_tn(map_entry) == tn) break;
00309 map_entry = HASH_ENTRY_next(map_entry);
00310 }
00311 if (map_entry == NULL) {
00312 map_entry = TYPE_MEM_POOL_ALLOC(HASH_ENTRY64, hTN_MAP_pool(map));
00313 HASH_ENTRY_next(map_entry) = hTN_MAP_entry(map, index);
00314 hTN_MAP_entry(map, index) = map_entry;
00315 HASH_ENTRY_tn(map_entry) = tn;
00316 }
00317 HASH_ENTRY_value(map_entry) = value;
00318 }
00319
00320
00321
00322
00323 void *
00324 hTN_MAP_Get(hTN_MAP map, TN *tn)
00325 {
00326 INT index = TN_number(tn) & (TN_MAP_HASH - 1);
00327 HASH_ENTRY *map_entry = hTN_MAP_entry(map, index);
00328
00329 while (map_entry != NULL) {
00330 if (HASH_ENTRY_tn(map_entry) == tn)
00331 return HASH_ENTRY_value(map_entry);
00332 map_entry = HASH_ENTRY_next(map_entry);
00333 }
00334 return NULL;
00335 }
00336
00337 INT32
00338 hTN_MAP32_Get(hTN_MAP32 map, TN *tn)
00339 {
00340 INT index = TN_number(tn) & (TN_MAP_HASH - 1);
00341 HASH_ENTRY32 *map_entry = hTN_MAP_entry(map, index);
00342
00343 while (map_entry != NULL) {
00344 if (HASH_ENTRY_tn(map_entry) == tn)
00345 return HASH_ENTRY_value(map_entry);
00346 map_entry = HASH_ENTRY_next(map_entry);
00347 }
00348 return 0;
00349 }
00350
00351 INT64
00352 hTN_MAP64_Get(hTN_MAP64 map, TN *tn)
00353 {
00354 INT index = TN_number(tn) & (TN_MAP_HASH - 1);
00355 HASH_ENTRY64 *map_entry = hTN_MAP_entry(map, index);
00356
00357 while (map_entry != NULL) {
00358 if (HASH_ENTRY_tn(map_entry) == tn)
00359 return HASH_ENTRY_value(map_entry);
00360 map_entry = HASH_ENTRY_next(map_entry);
00361 }
00362 return 0;
00363 }
00364
00365
00366
00367
00368 void *
00369 hTN_MAP_Get_And_Set(hTN_MAP map, TN *tn, void *value)
00370 {
00371 INT index = TN_number(tn) & (TN_MAP_HASH - 1);
00372 HASH_ENTRY *map_entry = hTN_MAP_entry(map, index);
00373
00374 while (map_entry != NULL) {
00375 if (HASH_ENTRY_tn(map_entry) == tn) break;
00376 map_entry = HASH_ENTRY_next(map_entry);
00377 }
00378 void *answer = NULL;
00379 if (map_entry == NULL) {
00380 map_entry = TYPE_MEM_POOL_ALLOC(HASH_ENTRY, hTN_MAP_pool(map));
00381 HASH_ENTRY_next(map_entry) = hTN_MAP_entry(map, index);
00382 hTN_MAP_entry(map, index) = map_entry;
00383 HASH_ENTRY_tn(map_entry) = tn;
00384 } else
00385 answer = HASH_ENTRY_value(map_entry);
00386 HASH_ENTRY_value(map_entry) = value;
00387 return answer;
00388 }
00389
00390 INT32
00391 hTN_MAP32_Get_And_Set(hTN_MAP32 map, TN *tn, INT32 value)
00392 {
00393 INT index = TN_number(tn) & (TN_MAP_HASH - 1);
00394 HASH_ENTRY32 *map_entry = hTN_MAP_entry(map, index);
00395
00396 while (map_entry != NULL) {
00397 if (HASH_ENTRY_tn(map_entry) == tn) break;
00398 map_entry = HASH_ENTRY_next(map_entry);
00399 }
00400 INT32 answer = 0;
00401 if (map_entry == NULL) {
00402 map_entry = TYPE_MEM_POOL_ALLOC(HASH_ENTRY32, hTN_MAP_pool(map));
00403 HASH_ENTRY_next(map_entry) = hTN_MAP_entry(map, index);
00404 hTN_MAP_entry(map, index) = map_entry;
00405 HASH_ENTRY_tn(map_entry) = tn;
00406 } else
00407 answer = HASH_ENTRY_value(map_entry);
00408 HASH_ENTRY_value(map_entry) = value;
00409 return answer;
00410 }
00411
00412 INT64
00413 hTN_MAP64_Get_And_Set(hTN_MAP64 map, TN *tn, INT64 value)
00414 {
00415 INT index = TN_number(tn) & (TN_MAP_HASH - 1);
00416 HASH_ENTRY64 *map_entry = hTN_MAP_entry(map, index);
00417
00418 while (map_entry != NULL) {
00419 if (HASH_ENTRY_tn(map_entry) == tn) break;
00420 map_entry = HASH_ENTRY_next(map_entry);
00421 }
00422 INT64 answer = 0;
00423 if (map_entry == NULL) {
00424 map_entry = TYPE_MEM_POOL_ALLOC(HASH_ENTRY64, hTN_MAP_pool(map));
00425 HASH_ENTRY_next(map_entry) = hTN_MAP_entry(map, index);
00426 hTN_MAP_entry(map, index) = map_entry;
00427 HASH_ENTRY_tn(map_entry) = tn;
00428 } else
00429 answer = HASH_ENTRY_value(map_entry);
00430 HASH_ENTRY_value(map_entry) = value;
00431 return answer;
00432 }
00433
00434 #ifdef TARG_IA64
00435
00436 hTN_MAPf
00437 hTN_MAPf_Create(MEM_POOL *pool)
00438 {
00439 hTN_MAPf new_map;
00440
00441 new_map = TYPE_MEM_POOL_ALLOC(struct htn_mapf, pool);
00442 BZERO(new_map, sizeof(struct htn_mapf));
00443 hTN_MAP_pool(new_map) = pool;
00444 return new_map;
00445 }
00446
00447 void
00448 hTN_MAPf_Set(hTN_MAPf map, TN *tn, float value)
00449 {
00450 INT index = TN_number(tn) & (TN_MAP_HASH - 1);
00451 HASH_ENTRYf *map_entry = hTN_MAP_entry(map, index);
00452
00453 while (map_entry != NULL) {
00454 if (HASH_ENTRY_tn(map_entry) == tn) break;
00455 map_entry = HASH_ENTRY_next(map_entry);
00456 }
00457 if (map_entry == NULL) {
00458 map_entry = TYPE_MEM_POOL_ALLOC(HASH_ENTRYf, hTN_MAP_pool(map));
00459 HASH_ENTRY_next(map_entry) = hTN_MAP_entry(map, index);
00460 hTN_MAP_entry(map, index) = map_entry;
00461 HASH_ENTRY_tn(map_entry) = tn;
00462 }
00463 HASH_ENTRY_value(map_entry) = value;
00464 }
00465
00466 float
00467 hTN_MAPf_Get(hTN_MAPf map, TN *tn)
00468 {
00469 INT index = TN_number(tn) & (TN_MAP_HASH - 1);
00470 HASH_ENTRYf *map_entry = hTN_MAP_entry(map, index);
00471
00472 while (map_entry != NULL) {
00473 if (HASH_ENTRY_tn(map_entry) == tn)
00474 return HASH_ENTRY_value(map_entry);
00475 map_entry = HASH_ENTRY_next(map_entry);
00476 }
00477 return 0.0;
00478 }
00479 #endif
00480