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
00056 #ifdef USE_PCH
00057 #include "common_com_pch.h"
00058 #endif
00059 #pragma hdrstop
00060 #include "wn.h"
00061
00103
00104 WN_MAP_TAB *Current_Map_Tab = NULL;
00105
00106 #define INIT_MAP_SIZE 20
00107
00108 static WN_MAP_ID WN_MAP_get_map_id(
00109 WN_MAP_TAB *maptab,
00110 OPERATOR_MAPCAT category,
00111 WN *wn);
00112
00113 static void WN_MAP_realloc_array(
00114 WN_MAP_TAB *maptab,
00115 OPERATOR_MAPCAT category,
00116 WN_MAP wn_map,
00117 WN_MAP_ID id,
00118 INT32 elemsz);
00119
00120
00121 #define WN_MAP_check_kind(maptab, wn_map, kind) \
00122 ((maptab)->_kind[(wn_map)] == (kind))
00123
00124
00125
00126
00127
00128
00129
00130
00131 WN_MAP_TAB *
00132 WN_MAP_TAB_Create(MEM_POOL *pool)
00133 {
00134 INT32 i, category;
00135 WN_MAP_TAB *maptab = TYPE_MEM_POOL_ALLOC(WN_MAP_TAB, pool);
00136
00137 maptab->_free_list_pool = pool;
00138
00139
00140 for (i = 0; i < WN_MAP_RESERVED; i++) {
00141 maptab->_is_used[i] = TRUE;
00142 maptab->_dont_copy[i] = FALSE;
00143
00144 for (category = 0; category < WN_MAP_CATEGORIES; category++) {
00145 maptab->_map_size[category][i] = 0;
00146 maptab->_mapping[category][i] = NULL;
00147 }
00148 maptab->_pool[i] = pool;
00149 }
00150
00151
00152 maptab->_kind[WN_MAP_DEPGRAPH] = WN_MAP_KIND_VOIDP;
00153 maptab->_kind[WN_MAP_PREFETCH] = WN_MAP_KIND_VOIDP;
00154 maptab->_kind[WN_MAP_FEEDBACK] = WN_MAP_KIND_INT32;
00155 maptab->_kind[WN_MAP_AC_INTERNAL] = WN_MAP_KIND_VOIDP;
00156 maptab->_kind[WN_MAP_ALIAS_CLASS] = WN_MAP_KIND_INT32;
00157
00158
00159 for (i = WN_MAP_RESERVED; i < WN_MAP_MAX; i++) {
00160 maptab->_is_used[i] = FALSE;
00161 maptab->_dont_copy[i] = FALSE;
00162 }
00163
00164
00165 for (i = 0; i < WN_MAP_CATEGORIES; i++) {
00166 maptab->_last_map_id[i] = -1;
00167 maptab->_free_list_count[i] = 0;
00168 maptab->_free_list_size[i] = 0;
00169 }
00170
00171
00172 Current_Map_Tab = maptab;
00173 return maptab;
00174 }
00175
00176
00177
00178
00179
00180
00181 void
00182 WN_MAP_TAB_Delete(WN_MAP_TAB *maptab)
00183 {
00184 INT32 i, category;
00185
00186
00187 for (i = 0; i < WN_MAP_MAX; i++) {
00188 if (maptab->_is_used[i]) {
00189 IPA_WN_MAP_Delete(maptab, i);
00190 }
00191 }
00192
00193
00194 for (category = 0; category < WN_MAP_CATEGORIES; category++) {
00195 if (maptab->_free_list_size[category] > 0) {
00196 MEM_POOL_FREE(maptab->_free_list_pool, maptab->_free_list[category]);
00197 }
00198 }
00199
00200
00201 MEM_POOL_FREE(maptab->_free_list_pool, maptab);
00202 }
00203
00204
00205
00206
00207
00208
00209
00210 WN_MAP
00211 WN_MAP_Do_Create(WN_MAP_TAB *maptab, MEM_POOL *pool, WN_MAP_KIND kind)
00212 {
00213 WN_MAP_ID wn_map;
00214 INT32 category;
00215
00216
00217 for (wn_map = WN_MAP_RESERVED; wn_map < WN_MAP_MAX; wn_map++) {
00218 if (!maptab->_is_used[wn_map]) break;
00219 }
00220 FmtAssert(wn_map != WN_MAP_MAX,("WN_MAP_Do_Create, ran out of maps"));
00221
00222 maptab->_is_used[wn_map] = TRUE;
00223 maptab->_dont_copy[wn_map] = FALSE;
00224
00225
00226 for (category = 0; category < WN_MAP_CATEGORIES; category++) {
00227 maptab->_map_size[category][wn_map] = 0;
00228 maptab->_mapping[category][wn_map] = NULL;
00229 }
00230
00231 maptab->_pool[wn_map] = pool;
00232 maptab->_kind[wn_map] = kind;
00233 return wn_map;
00234 }
00235
00236
00237
00238
00239
00240
00241
00242
00243 void
00244 IPA_WN_MAP_Delete(WN_MAP_TAB *maptab, WN_MAP wn_map)
00245 {
00246 INT32 category;
00247
00248 if (maptab == 0)
00249 return;
00250
00251 Is_True(0 <= wn_map && wn_map < WN_MAP_MAX,
00252 ("IPA_WN_MAP_Delete: invalid map index %d", wn_map));
00253
00254 for (category = 0; category < WN_MAP_CATEGORIES; category++) {
00255 if (maptab->_map_size[category][wn_map] != 0) {
00256 if (maptab->_pool[wn_map] == Malloc_Mem_Pool) {
00257 MEM_POOL_FREE(Malloc_Mem_Pool, maptab->_mapping[category][wn_map]);
00258 }
00259 maptab->_map_size[category][wn_map] = 0;
00260 maptab->_mapping[category][wn_map] = NULL;
00261 }
00262 }
00263 maptab->_is_used[wn_map] = FALSE;
00264 }
00265
00266 WN_MAP_ID
00267 IPA_WN_MAP_Status(WN_MAP_TAB *maptab)
00268 {
00269 WN_MAP_ID wn_map;
00270
00271
00272 for (wn_map = WN_MAP_RESERVED; wn_map < WN_MAP_MAX; wn_map++)
00273 if (!maptab->_is_used[wn_map])
00274 return wn_map;
00275 Is_True(0,("WN_MAP_Status, all maps used"));
00276 return (WN_MAP_ID)(-1);
00277 }
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288 WN_MAP_ID
00289 WN_MAP_get_map_id (WN_MAP_TAB *maptab, OPERATOR_MAPCAT category, WN *wn)
00290 {
00291
00292 if (WN_map_id(wn) != -1) {
00293 return WN_map_id(wn);
00294 }
00295
00296
00297 if (maptab->_free_list_count[category] > 0) {
00298 INT32 i;
00299 WN_MAP_ID id =
00300 maptab->_free_list[category][--maptab->_free_list_count[category]];
00301 WN_set_map_id(wn, id);
00302
00303 for (i = 0; i < WN_MAP_MAX; i++) {
00304 if (maptab->_is_used[i] && (id < maptab->_map_size[category][i])) {
00305 switch (maptab->_kind[i]) {
00306 case WN_MAP_KIND_VOIDP:
00307 maptab->_mapping[category][i][id] = NULL;
00308 break;
00309 case WN_MAP_KIND_INT32:
00310 ((INT32*)maptab->_mapping[category][i])[id] = 0;
00311 break;
00312 case WN_MAP_KIND_INT64:
00313 ((INT64*)maptab->_mapping[category][i])[id] = 0;
00314 break;
00315 default:
00316 Is_True(FALSE, ("WN_MAP_do_set: unknown map kind"));
00317 }
00318 }
00319 }
00320 return id;
00321 }
00322
00323
00324 WN_set_map_id(wn, ++maptab->_last_map_id[category]);
00325 return WN_map_id(wn);
00326 }
00327
00328
00329 void
00330 WN_MAP_realloc_array (WN_MAP_TAB *maptab, OPERATOR_MAPCAT category,
00331 WN_MAP wn_map, WN_MAP_ID id, INT32 elemsz)
00332 {
00333 INT32 old_size = maptab->_map_size[category][wn_map];
00334 INT32 new_size;
00335 if (old_size == 0) {
00336 new_size = INIT_MAP_SIZE;
00337 } else {
00338 new_size = old_size * 2;
00339 }
00340 while (id >= new_size) {
00341 new_size *= 2;
00342 }
00343
00344 maptab->_map_size[category][wn_map] = new_size;
00345 maptab->_mapping[category][wn_map] = (void **)
00346 MEM_POOL_Realloc(maptab->_pool[wn_map],
00347 maptab->_mapping[category][wn_map],
00348 old_size * elemsz,
00349 new_size * elemsz);
00350
00351
00352 if (!(maptab->_pool[wn_map]->bz)) {
00353 INTPS address = ((INTPS) maptab->_mapping[category][wn_map]) + (old_size * elemsz);
00354 BZERO((void *) address, (new_size - old_size) * elemsz);
00355 }
00356 }
00357
00358
00359 void
00360 IPA_WN_MAP_Set(WN_MAP_TAB *maptab, WN_MAP wn_map, WN *wn, void *thing)
00361 {
00362 OPERATOR_MAPCAT category;
00363 WN_MAP_ID id;
00364
00365 Is_True(wn != NULL,("WN_MAP_Set: wn is NULL"));
00366 category = OPCODE_mapcat(WN_opcode(wn));
00367 Is_True(maptab->_is_used[wn_map], ("WN_MAP_Set: wn_map is not valid"));
00368 Is_True(WN_MAP_check_kind(maptab, wn_map, WN_MAP_KIND_VOIDP),
00369 ("WN_MAP_Set: not a VOID* map"));
00370
00371 id = WN_MAP_get_map_id(maptab, category, wn);
00372 if (id >= maptab->_map_size[category][wn_map]) {
00373 WN_MAP_realloc_array(maptab, category, wn_map, id, sizeof(void*));
00374 }
00375 maptab->_mapping[category][wn_map][id] = thing;
00376 }
00377
00378
00379 void
00380 IPA_WN_MAP32_Set(WN_MAP_TAB *maptab, WN_MAP wn_map, WN *wn, INT32 thing)
00381 {
00382 OPERATOR_MAPCAT category = OPCODE_mapcat(WN_opcode(wn));
00383 WN_MAP_ID id;
00384
00385 Is_True(maptab->_is_used[wn_map], ("WN_MAP32_Set: wn_map is not valid"));
00386 Is_True(WN_MAP_check_kind(maptab, wn_map, WN_MAP_KIND_INT32),
00387 ("WN_MAP32_Set: not an INT32 map"));
00388
00389 id = WN_MAP_get_map_id(maptab, category, wn);
00390 if (id >= maptab->_map_size[category][wn_map]) {
00391 WN_MAP_realloc_array(maptab, category, wn_map, id, sizeof(INT32));
00392 }
00393 ((INT32*)maptab->_mapping[category][wn_map])[id] = thing;
00394 }
00395
00396
00397 void
00398 IPA_WN_MAP64_Set(WN_MAP_TAB *maptab, WN_MAP wn_map, WN *wn, INT64 thing)
00399 {
00400 OPERATOR_MAPCAT category = OPCODE_mapcat(WN_opcode(wn));
00401 WN_MAP_ID id;
00402
00403 Is_True(maptab->_is_used[wn_map], ("WN_MAP64_Set: wn_map is not valid"));
00404 Is_True(WN_MAP_check_kind(maptab, wn_map, WN_MAP_KIND_INT64),
00405 ("WN_MAP64_Set: not an INT64 map"));
00406
00407 id = WN_MAP_get_map_id(maptab, category, wn);
00408 if (id >= maptab->_map_size[category][wn_map]) {
00409 WN_MAP_realloc_array(maptab, category, wn_map, id, sizeof(INT64));
00410 }
00411 ((INT64*)maptab->_mapping[category][wn_map])[id] = thing;
00412 }
00413
00414
00415
00416
00417
00418
00419
00420 void *
00421 IPA_WN_MAP_Get(WN_MAP_TAB *maptab, WN_MAP wn_map, const WN *wn)
00422 {
00423 WN_MAP_ID id = WN_map_id(wn);
00424 OPERATOR_MAPCAT category;
00425
00426 if (id == -1) return NULL;
00427 Is_True(maptab->_is_used[wn_map], ("WN_MAP_Get: wn_map is not valid"));
00428 Is_True(WN_MAP_check_kind(maptab, wn_map, WN_MAP_KIND_VOIDP),
00429 ("WN_MAP_Get: not a VOID* map"));
00430
00431 category = OPCODE_mapcat(WN_opcode(wn));
00432 if (id >= maptab->_map_size[category][wn_map]) return NULL;
00433 return maptab->_mapping[category][wn_map][id];
00434 }
00435
00436
00437 INT32
00438 IPA_WN_MAP32_Get(WN_MAP_TAB *maptab, WN_MAP wn_map, const WN *wn)
00439 {
00440 WN_MAP_ID id = WN_map_id(wn);
00441 OPERATOR_MAPCAT category;
00442
00443 Is_True(maptab->_is_used[wn_map], ("WN_MAP32_Get: wn_map is not valid"));
00444 Is_True(WN_MAP_check_kind(maptab, wn_map, WN_MAP_KIND_INT32),
00445 ("WN_MAP32_Get: not an INT32 map"));
00446
00447 if (id == -1) return 0;
00448 category = OPCODE_mapcat(WN_opcode(wn));
00449 if (id >= maptab->_map_size[category][wn_map]) return 0;
00450 return ((INT32*)maptab->_mapping[category][wn_map])[id];
00451 }
00452
00453
00454 INT64
00455 IPA_WN_MAP64_Get(WN_MAP_TAB *maptab, WN_MAP wn_map, const WN *wn)
00456 {
00457 WN_MAP_ID id = WN_map_id(wn);
00458 OPERATOR_MAPCAT category;
00459
00460 Is_True(maptab->_is_used[wn_map], ("WN_MAP64_Get: wn_map is not valid"));
00461 Is_True(WN_MAP_check_kind(maptab, wn_map, WN_MAP_KIND_INT64),
00462 ("WN_MAP64_Get: not an INT64 map"));
00463
00464 if (id == -1) return 0;
00465 category = OPCODE_mapcat(WN_opcode(wn));
00466 if (id >= maptab->_map_size[category][wn_map]) return 0;
00467 return ((INT64*)maptab->_mapping[category][wn_map])[id];
00468 }
00469
00470
00471
00472
00473
00474
00475
00476
00477 void
00478 WN_MAP_Add_Free_List(WN_MAP_TAB *maptab, WN *wn)
00479 {
00480 OPERATOR_MAPCAT category = OPCODE_mapcat(WN_opcode(wn));
00481 INT32 count, size;
00482
00483 if (WN_map_id(wn) == -1) return;
00484
00485 count = maptab->_free_list_count[category];
00486 size = maptab->_free_list_size[category];
00487
00488
00489 if (count >= size) {
00490 if (size == 0) {
00491 INT32 elements = 50;
00492 maptab->_free_list[category] =
00493 TYPE_MEM_POOL_ALLOC_N(WN_MAP_ID, maptab->_free_list_pool, elements);
00494 maptab->_free_list_size[category] = elements;
00495 } else {
00496 INT32 elements = MAX(2 * size, size + 50);
00497 maptab->_free_list[category] =
00498 TYPE_MEM_POOL_REALLOC_N(WN_MAP_ID, maptab->_free_list_pool,
00499 maptab->_free_list[category], size, elements);
00500 maptab->_free_list_size[category] = elements;
00501 }
00502 }
00503
00504 maptab->_free_list[category][count] = WN_map_id(wn);
00505 maptab->_free_list_count[category] = count + 1;
00506 }
00507
00508
00509
00510
00511
00512
00513 void
00514 WN_MAP_Set_ID (WN_MAP_TAB *maptab, WN *wn)
00515 {
00516 OPERATOR_MAPCAT category = OPCODE_mapcat(WN_opcode(wn));
00517 (void)WN_MAP_get_map_id (maptab, category, wn);
00518 }
00519
00520