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 #include "cxx_memory.h"
00043 #include "errors.h"
00044 #include <algorithm>
00045
00046 #include "ipc_dst_utils.h"
00047
00048 static const INT32 min_block_size = 256;
00049 static const INT32 DST_64_align = 8;
00050 static const INT32 DST_32_align = 4;
00051 static const INT32 DST_char_align = 1;
00052 static const INT32 DST_default_align = DST_64_align;
00053
00054
00055
00056
00057 DST_IDX DST_get_compile_unit(DST_TYPE dst_vptr)
00058 {
00059 DST_Type* dst = static_cast<DST_Type*>(dst_vptr);
00060 Is_True(dst != 0, ("DST pointer may not be void"));
00061 Is_True(DST_has_compile_unit(dst), ("No compile unit"));
00062 DST_IDX cu_idx = make_DST_IDX(0, dst->block_list[DST_file_scope_block]);
00063 Is_True(DST_INFO_tag(DST_get_info(dst, cu_idx)) == DW_TAG_compile_unit,
00064 ("Not a DST compile unit"));
00065 return cu_idx;
00066 }
00067
00068 DST_IDX DST_get_include_dirs(DST_TYPE dst_vptr)
00069 {
00070 DST_Type* dst = static_cast<DST_Type*>(dst_vptr);
00071 DST_BLOCK_IDX idx = dst->block_list[DST_include_dirs_block];
00072 if (idx != DST_INVALID_BLOCK_IDX &&
00073 !DST_block_is_empty(DST_get_block(dst_vptr, idx)))
00074 return make_DST_IDX(0, idx);
00075 else
00076 return DST_INVALID_IDX;
00077 }
00078
00079 DST_IDX DST_get_file_names(DST_TYPE dst_vptr)
00080 {
00081 DST_Type* dst = static_cast<DST_Type*>(dst_vptr);
00082 DST_BLOCK_IDX idx = dst->block_list[DST_file_names_block];
00083 if (idx != DST_INVALID_BLOCK_IDX &&
00084 !DST_block_is_empty(DST_get_block(dst_vptr, idx)))
00085 return make_DST_IDX(0, idx);
00086 else
00087 return DST_INVALID_IDX;
00088 }
00089
00090
00091
00092
00093 DST_TYPE DST_create(MEM_POOL* p, UINT32 num_block_headers) {
00094 Is_True(p != 0, ("IPC_DST::IPC_DST: invalid mempool pointer"));
00095 Is_True(num_block_headers > 0,
00096 ("IPC_DST::IPC_DST: invalid initial number of block headers"));
00097
00098
00099 DST_Type*dst = TYPE_MEM_POOL_ALLOC(DST_Type, p);
00100 dst->dst_blocks = TYPE_MEM_POOL_ALLOC_N(block_header, p, num_block_headers);
00101 dst->current_dst = 0;
00102
00103
00104
00105
00106
00107 dst->last_block_header = -1;
00108 dst->max_block_header = num_block_headers;
00109 dst->current_block_header = DST_INVALID_BLOCK_IDX;
00110
00111
00112 for (UINT32 i = 0; i < DST_noblock; ++i)
00113 dst->block_list[i] = DST_INVALID_BLOCK_IDX;
00114
00115 return dst;
00116 }
00117
00118 block_header* DST_set_current_block(DST_TYPE dst_vptr, DST_BLOCK_IDX idx)
00119 {
00120 DST_Type* dst = static_cast<DST_Type*>(dst_vptr);
00121 Is_True(dst != 0, ("DST pointer is void"));
00122 Is_True(idx >= 0 && idx <= dst->last_block_header,
00123 ("Block index %d is not in range 0 <= idx <= %d",
00124 idx, dst->last_block_header));
00125
00126 dst->current_block_header = idx;
00127 dst->current_dst = dst->dst_blocks + idx;
00128 return dst->current_dst;
00129 }
00130
00131
00132 DST_BLOCK_IDX
00133 DST_new_block(DST_TYPE dst_vptr, MEM_POOL* p,
00134 DST_BLOCK_KIND kind, INT32 blocksize) {
00135 DST_Type* dst = static_cast<DST_Type*>(dst_vptr);
00136 Is_True(dst != 0, ("DST pointer is void"));
00137 Is_True(kind >= DST_include_dirs_block && kind < DST_noblock,
00138 ("Invalid block kind"));
00139 Is_True(blocksize >= 0, ("Invalid block size"));
00140
00141
00142 ++dst->last_block_header;
00143 Is_True (dst->last_block_header >= 0 &&
00144 dst->last_block_header <= dst->max_block_header,
00145 ("last_block_header %ld should be in range 0 <= idx <= %ld",
00146 dst->last_block_header, dst->max_block_header));
00147
00148 if (dst->last_block_header == dst->max_block_header) {
00149 dst->dst_blocks = TYPE_MEM_POOL_REALLOC_N(block_header, p,
00150 dst->dst_blocks,
00151 dst->max_block_header,
00152 2 * dst->max_block_header);
00153 dst->max_block_header *= 2;
00154 }
00155
00156 block_header* block = DST_set_current_block(dst, dst->last_block_header);
00157
00158
00159 const INT32 capacity = std::max(blocksize, min_block_size);
00160 block->kind = kind;
00161 block->size = 0;
00162 block->allocsize = capacity;
00163 block->offset = TYPE_MEM_POOL_ALLOC_N(char, p, capacity);
00164
00165
00166 if (dst->block_list[kind] == DST_INVALID_BLOCK_IDX)
00167 dst->block_list[kind] = dst->current_block_header;
00168
00169 Is_True(block == &dst->dst_blocks[dst->current_block_header],
00170 ("Block index mismatch"));
00171 return dst->current_block_header;
00172 }
00173
00174
00175
00176 DST_IDX DST_allocate(DST_TYPE dst_vptr, MEM_POOL* p,
00177 INT32 size, INT32 align, DST_BLOCK_KIND kind)
00178 {
00179 DST_Type* dst = static_cast<DST_Type*>(dst_vptr);
00180 Is_True(dst != 0, ("Null DST pointer"));
00181 Is_True(kind >= DST_include_dirs_block && kind < DST_noblock,
00182 ("Invalid block kind"));
00183 Is_True(size > 0, ("Invalid allocation size"));
00184 Is_True(align > 0, ("Invalid alignment"));
00185 Is_True((dst->current_dst == 0 ||
00186 dst->current_dst == dst->dst_blocks + dst->current_block_header),
00187 ("DST current block does not match its index"));
00188 Is_True((dst->current_block_header == DST_INVALID_BLOCK_IDX) ==
00189 (dst->current_dst == 0),
00190 ("status of current_dst and current_block _header inconsistent"));
00191
00192 DST_BYTE_IDX offset;
00193
00194
00195 if (dst->current_block_header == DST_INVALID_BLOCK_IDX ||
00196 dst->current_dst->kind != kind) {
00197 DST_new_block(dst, p, kind, size);
00198 offset = 0;
00199 }
00200
00201 else {
00202
00203 INT32 align_mod = dst->current_dst->size % align;
00204 offset = dst->current_dst->size + (align_mod ? (align - align_mod) : 0);
00205
00206
00207 if (offset + size > dst->current_dst->allocsize) {
00208 DST_new_block(dst, p, kind, size);
00209 offset = 0;
00210 }
00211 }
00212
00213
00214 dst->current_dst->size = offset + size;
00215 Is_True(dst->current_dst->size <= dst->current_dst->allocsize,
00216 ("Allocation overruns the current block"));
00217
00218 return make_DST_IDX(offset, dst->current_block_header);
00219 }
00220
00221 DST_IDX DST_mk_string(DST_TYPE dst_vptr, MEM_POOL* p, const char* s)
00222 {
00223 DST_Type* dst = static_cast<DST_Type*>(dst_vptr);
00224 Is_True(s != 0, ("DST_mk_string: string pointer may not be null"));
00225 Is_True(dst != 0, ("DST_mk_string: DST pointer may not be null"));
00226 Is_True(dst->current_dst != 0, ("DST_mk_string: DST has no current block"));
00227
00228 size_t n = strlen(s);
00229 DST_IDX result = DST_allocate(dst, p, n + 1, DST_char_align,
00230 dst->current_dst->kind);
00231 memcpy(DST_IDX_to_ptr(dst, result), s, n + 1);
00232
00233 return result;
00234 }
00235
00236
00237
00238
00239 DST_IDX DST_mk_include_dir(DST_TYPE dst, MEM_POOL* p, const char* path,
00240 DST_IDX prev_idx)
00241 {
00242 Is_True((DST_IS_NULL(prev_idx)) ||
00243 (!DST_IS_NULL(DST_get_include_dirs(dst))),
00244 ("For first DST include dir, idx of prev node must be null"));
00245 Is_True((!DST_IS_NULL(prev_idx)) ||
00246 (DST_IS_NULL(DST_get_include_dirs(dst))),
00247 ("This is not the first DST include dir, but idx of prev is null"));
00248
00249 DST_IDX idx = DST_allocate(dst, p,
00250 sizeof(DST_INCLUDE_DIR), DST_default_align,
00251 DST_include_dirs_block);
00252 DST_INCLUDE_DIR* dir = DST_get_include_dir(dst, idx);
00253 DST_INCLUDE_DIR_path(dir) = DST_mk_string(dst, p, path);
00254 DST_INCLUDE_DIR_next(dir) = DST_INVALID_IDX;
00255
00256 if(!DST_IS_NULL(prev_idx)) {
00257 DST_INCLUDE_DIR* prev = DST_get_include_dir(dst, prev_idx);
00258 DST_INCLUDE_DIR_next(prev) = idx;
00259 }
00260
00261 return idx;
00262 }
00263
00264 DST_IDX DST_mk_filename(DST_TYPE dst, MEM_POOL* p, const char* name,
00265 UINT16 dir, UINT64 size, UINT64 modt,
00266 DST_IDX prev_idx)
00267 {
00268 Is_True((DST_IS_NULL(prev_idx)) ||
00269 (!DST_IS_NULL(DST_get_file_names(dst))),
00270 ("For first DST include dir, idx of prev node must be null"));
00271 Is_True((!DST_IS_NULL(prev_idx)) ||
00272 (DST_IS_NULL(DST_get_file_names(dst))),
00273 ("This is not the first DST include dir, but idx of prev is null"));
00274
00275 DST_IDX idx = DST_allocate(dst, p,
00276 sizeof(DST_FILE_NAME), DST_default_align,
00277 DST_file_names_block);
00278 DST_FILE_NAME* file = DST_get_file_name(dst, idx);
00279 DST_FILE_NAME_name(file) = DST_mk_string(dst, p, name);
00280 DST_FILE_NAME_dir(file) = dir;
00281 DST_FILE_NAME_size(file) = size;
00282 DST_FILE_NAME_modt(file) = modt;
00283 DST_FILE_NAME_next(file) = DST_INVALID_IDX;
00284
00285 if (!DST_IS_NULL(prev_idx)) {
00286 DST_FILE_NAME* prev = DST_get_file_name(dst, prev_idx);
00287 DST_FILE_NAME_next(prev) = idx;
00288 }
00289
00290 return idx;
00291 }
00292
00293 DST_IDX DST_copy_include_dir(DST_TYPE src, DST_TYPE dest,
00294 MEM_POOL* p,
00295 DST_IDX prev,
00296 DST_IDX old_index)
00297 {
00298 DST_INCLUDE_DIR* dir = DST_get_include_dir(src, old_index);
00299 return DST_mk_include_dir(dest, p,
00300 DST_IDX_to_string(src, DST_INCLUDE_DIR_path(dir)),
00301 prev);
00302 }
00303
00304 DST_IDX DST_copy_filename(DST_TYPE src, DST_TYPE dest,
00305 MEM_POOL* p,
00306 DST_IDX prev,
00307 DST_IDX old_index,
00308 UINT16 offset)
00309 {
00310 DST_FILE_NAME* f = DST_get_file_name(src, old_index);
00311 return DST_mk_filename(dest, p,
00312 DST_IDX_to_string(src, DST_FILE_NAME_name(f)),
00313 DST_FILE_NAME_dir(f) + offset,
00314 DST_FILE_NAME_size(f),
00315 DST_FILE_NAME_modt(f),
00316 prev);
00317 }
00318
00319
00320 void DST_init_info(DST_TYPE dst, DST_IDX info_idx,
00321 DST_DW_tag tag, DST_flag flag,
00322 DST_ATTR_IDX attr,
00323 DST_INFO_IDX prev_info_idx)
00324 {
00325 DST_INFO* const info = DST_get_info(dst, info_idx);
00326 DST_INFO_tag(info) = tag;
00327 DST_INFO_flag(info) = flag;
00328 DST_INFO_sibling(info) = DST_INVALID_IDX;
00329 DST_INFO_attributes(info) = attr;
00330 DST_INFO_dieptr(info) = NULL;
00331 if (!DST_IS_NULL(prev_info_idx)) {
00332 DST_INFO* const prev_info = DST_get_info(dst, prev_info_idx);
00333 DST_INFO_sibling(prev_info) = info_idx;
00334 }
00335 }
00336
00337 DST_IDX DST_mk_compile_unit(DST_TYPE dst,
00338 MEM_POOL* p,
00339 DST_IDX prev,
00340 const char* name,
00341 const char* comp_dir,
00342 const char* comp_info,
00343 DST_language language,
00344 DST_identifier_case id_case)
00345 {
00346 Is_True(name != 0 && comp_info != 0, ("Strings may not be null pointers"));
00347
00348
00349 Is_True((DST_IS_NULL(prev) && !DST_has_compile_unit(dst)) ||
00350 (!DST_IS_NULL(prev) && DST_has_compile_unit(dst)),
00351 ("Must create first compile unit once and only once"));
00352
00353
00354 if (DST_IS_NULL(prev))
00355 DST_new_block(dst, p, DST_file_scope_block, sizeof(DST_INFO));
00356
00357 DST_IDX info_idx = DST_allocate(dst, p, sizeof(DST_INFO),
00358 DST_default_align, DST_file_scope_block);
00359 DST_IDX attr_idx = DST_allocate(dst, p, sizeof(DST_COMPILE_UNIT),
00360 DST_default_align, DST_file_scope_block);
00361 DST_COMPILE_UNIT* cu =
00362 static_cast<DST_COMPILE_UNIT*>(DST_IDX_to_ptr(dst, attr_idx));
00363
00364 DST_COMPILE_UNIT_name(cu) = DST_mk_string(dst, p, name);
00365 DST_COMPILE_UNIT_comp_dir(cu) =
00366 comp_dir ? DST_mk_string(dst, p, comp_dir) : DST_INVALID_IDX;
00367 DST_COMPILE_UNIT_producer(cu) = DST_mk_string(dst, p, comp_info);
00368 DST_COMPILE_UNIT_language(cu) = language;
00369 DST_COMPILE_UNIT_identifier_case(cu) = id_case;
00370 DST_COMPILE_UNIT_first_child(cu) = DST_INVALID_IDX;
00371 DST_COMPILE_UNIT_last_child(cu) = DST_INVALID_IDX;
00372
00373 DST_init_info(dst, info_idx,
00374 DW_TAG_compile_unit, DST_no_flag,
00375 attr_idx, prev);
00376 return info_idx;
00377 }
00378
00379 DST_IDX DST_copy_compile_unit(DST_TYPE src, DST_TYPE dest,
00380 MEM_POOL* p,
00381 DST_IDX prev,
00382 DST_IDX old_idx)
00383 {
00384 DST_INFO* cu_info = DST_get_info(src, old_idx);
00385 DST_COMPILE_UNIT* cu = DST_get_compile_unit_attr(src, cu_info);
00386
00387 DST_IDX name_idx = DST_COMPILE_UNIT_name(cu);
00388 DST_IDX comp_dir_idx = DST_COMPILE_UNIT_comp_dir(cu);
00389 DST_IDX producer_idx = DST_COMPILE_UNIT_producer(cu);
00390
00391 Is_True(!DST_IS_NULL(name_idx),
00392 ("Compile unit name is invalid"));
00393 char* comp_dir = (!DST_IS_NULL(comp_dir_idx)) ?
00394 DST_IDX_to_string(src, comp_dir_idx) :
00395 0;
00396
00397 Is_True(!DST_IS_NULL(producer_idx),
00398 ("Compile unit compile line is invalid"));
00399
00400 return DST_mk_compile_unit(dest, p, prev,
00401 DST_IDX_to_string(src, name_idx),
00402 comp_dir,
00403 DST_IDX_to_string(src, producer_idx),
00404 DST_COMPILE_UNIT_language(cu),
00405 DST_COMPILE_UNIT_identifier_case(cu));
00406 }
00407
00408 DST_IDX DST_mk_subpr_decl(DST_TYPE dst,
00409 MEM_POOL* p,
00410 DST_IDX cu_idx,
00411 DST_IDX prev,
00412 USRCPOS decl,
00413 const char* name,
00414 const char* mangled_name,
00415 DST_inline inlin,
00416 DST_virtuality virtuality,
00417 DST_vtable_elem_location loc,
00418 DST_flag flag)
00419 {
00420 DST_INFO* cu_info = DST_get_info(dst, cu_idx);
00421 DST_COMPILE_UNIT* cu = DST_get_compile_unit_attr(dst, cu_info);
00422
00423 Is_True(name != 0, ("Subprogram declaration name may not be null pointer"));
00424
00425
00426 Is_True((DST_IS_NULL(prev) ==
00427 DST_IS_NULL(DST_COMPILE_UNIT_first_child(cu))),
00428 ("Every subprogram except the first must have a previous node"));
00429 Is_True(DST_IS_declaration(flag), ("Not a declaration"));
00430
00431 DST_IDX info_idx = DST_allocate(dst, p,
00432 sizeof(DST_INFO), DST_default_align,
00433 DST_file_scope_block);
00434 DST_IDX attr_idx = DST_allocate(dst, p,
00435 sizeof(DST_SUBPROGRAM), DST_default_align,
00436 DST_file_scope_block);
00437 DST_SUBPROGRAM* attr =
00438 static_cast<DST_SUBPROGRAM*>(DST_IDX_to_ptr(dst, attr_idx));
00439
00440 DST_SUBPROGRAM_decl_decl(attr) = decl;
00441 DST_SUBPROGRAM_decl_name(attr) = DST_mk_string(dst, p, name);
00442 DST_SUBPROGRAM_decl_linkage_name(attr) =
00443 mangled_name != 0 ? DST_mk_string(dst, p, mangled_name) : DST_INVALID_IDX;
00444 DST_SUBPROGRAM_decl_type(attr) = DST_INVALID_IDX;
00445 DST_SUBPROGRAM_decl_origin(attr) = DST_INVALID_IDX;
00446 DST_SUBPROGRAM_decl_inline(attr) = inlin;
00447 DST_SUBPROGRAM_decl_virtuality(attr) = virtuality;
00448 DST_SUBPROGRAM_decl_vtable_elem_location(attr) = loc;
00449 DST_SUBPROGRAM_decl_first_child(attr) = DST_INVALID_IDX;
00450 DST_SUBPROGRAM_decl_last_child(attr) = DST_INVALID_IDX;
00451
00452 DST_init_info(dst, info_idx, DW_TAG_subprogram, flag, attr_idx, prev);
00453 DST_COMPILE_UNIT_last_child(cu) = info_idx;
00454 if (DST_IS_NULL(prev))
00455 DST_COMPILE_UNIT_first_child(cu) = info_idx;
00456
00457 return info_idx;
00458 }
00459
00460 DST_IDX DST_mk_subpr_def(DST_TYPE dst,
00461 MEM_POOL* p,
00462 DST_IDX cu_idx,
00463 DST_IDX prev,
00464 USRCPOS decl,
00465 const char* name,
00466 const char* mangled_name,
00467 const char* pubname,
00468 DST_ASSOC_INFO st,
00469 DST_inline inlin,
00470 DST_virtuality virtuality,
00471 DST_vtable_elem_location loc,
00472 DST_flag flag)
00473 {
00474 DST_INFO* cu_info = DST_get_info(dst, cu_idx);
00475 DST_COMPILE_UNIT* cu = DST_get_compile_unit_attr(dst, cu_info);
00476
00477 Is_True(name != 0, ("Subprogram definition name may not be null pointer"));
00478
00479
00480 Is_True((DST_IS_NULL(prev)) ==
00481 (DST_IS_NULL(DST_COMPILE_UNIT_first_child(cu))),
00482 ("Every subprogram except the first must have a previous node"));
00483 Is_True(!DST_IS_declaration(flag) && !DST_IS_memdef(flag),
00484 ("Not a definition"));
00485
00486 DST_IDX info_idx = DST_allocate(dst, p,
00487 sizeof(DST_INFO), DST_default_align,
00488 DST_file_scope_block);
00489 DST_IDX attr_idx = DST_allocate(dst, p,
00490 sizeof(DST_SUBPROGRAM), DST_default_align,
00491 DST_file_scope_block);
00492 DST_SUBPROGRAM* attr =
00493 static_cast<DST_SUBPROGRAM*>(DST_IDX_to_ptr(dst, attr_idx));
00494
00495 DST_SUBPROGRAM_def_decl(attr) = decl;
00496 DST_SUBPROGRAM_def_name(attr) = DST_mk_string(dst, p, name);
00497 DST_SUBPROGRAM_def_linkage_name(attr) =
00498 mangled_name != 0 ? DST_mk_string(dst, p, mangled_name) : DST_INVALID_IDX;
00499 DST_SUBPROGRAM_def_pubname(attr) =
00500 pubname != 0 ? DST_mk_string(dst, p, pubname) : DST_INVALID_IDX;
00501 DST_SUBPROGRAM_def_type(attr) = DST_INVALID_IDX;
00502 DST_SUBPROGRAM_def_st(attr) = st;
00503 DST_SUBPROGRAM_decl_inline(attr) = inlin;
00504 DST_SUBPROGRAM_def_virtuality(attr) = virtuality;
00505 DST_SUBPROGRAM_def_vtable_elem_location(attr) = loc,
00506 DST_SUBPROGRAM_def_specification(attr) = DST_INVALID_IDX;
00507 DST_SUBPROGRAM_def_first_child(attr) = DST_INVALID_IDX;
00508 DST_SUBPROGRAM_def_last_child(attr) = DST_INVALID_IDX;
00509 DST_SUBPROGRAM_def_clone_origin(attr) = DST_INVALID_IDX;
00510
00511 DST_init_info(dst, info_idx, DW_TAG_subprogram, flag, attr_idx, prev);
00512 DST_COMPILE_UNIT_last_child(cu) = info_idx;
00513 if (DST_IS_NULL(prev))
00514 DST_COMPILE_UNIT_first_child(cu) = info_idx;
00515
00516 return info_idx;
00517 }
00518
00519 DST_IDX DST_mk_memdef(DST_TYPE dst,
00520 MEM_POOL* p,
00521 DST_IDX cu_idx,
00522 DST_IDX prev,
00523 USRCPOS decl,
00524 DST_ASSOC_INFO st,
00525 DST_flag flag)
00526 {
00527 DST_INFO* cu_info = DST_get_info(dst, cu_idx);
00528 DST_COMPILE_UNIT* cu = DST_get_compile_unit_attr(dst, cu_info);
00529
00530 Is_True( DST_IS_NULL(prev) ==
00531 DST_IS_NULL(DST_COMPILE_UNIT_first_child(cu)),
00532 ("Every subprogram except the first must have a previous node"));
00533 Is_True(DST_IS_memdef(flag), ("Not a memdef"));
00534
00535 DST_IDX info_idx = DST_allocate(dst, p,
00536 sizeof(DST_INFO), DST_default_align,
00537 DST_file_scope_block);
00538 DST_IDX attr_idx = DST_allocate(dst, p,
00539 sizeof(DST_SUBPROGRAM), DST_default_align,
00540 DST_file_scope_block);
00541 DST_SUBPROGRAM* attr =
00542 static_cast<DST_SUBPROGRAM*>(DST_IDX_to_ptr(dst, attr_idx));
00543
00544 DST_SUBPROGRAM_memdef_decl(attr) = decl;
00545 DST_SUBPROGRAM_memdef_spec(attr) = DST_INVALID_IDX;
00546 DST_SUBPROGRAM_memdef_st(attr) = st;
00547 DST_SUBPROGRAM_def_first_child(attr) = DST_INVALID_IDX;
00548 DST_SUBPROGRAM_def_last_child(attr) = DST_INVALID_IDX;
00549
00550 DST_init_info(dst, info_idx, DW_TAG_subprogram, flag, attr_idx, prev);
00551 DST_COMPILE_UNIT_last_child(cu) = info_idx;
00552 if (DST_IS_NULL(prev))
00553 DST_COMPILE_UNIT_first_child(cu) = info_idx;
00554
00555 return info_idx;
00556 }
00557
00558 DST_IDX DST_copy_subprogram(DST_TYPE src, DST_TYPE dest,
00559 MEM_POOL* p,
00560 DST_IDX cu, DST_IDX prev,
00561 DST_IDX old_idx)
00562 {
00563 DST_INFO* info = DST_get_info(src, old_idx);
00564 DST_SUBPROGRAM* sub = DST_get_subprogram_attr(src, info);
00565 DST_flag flag = DST_INFO_flag(info);
00566
00567 if (DST_IS_memdef(flag)) {
00568 return DST_mk_memdef(dest, p, cu, prev,
00569 DST_SUBPROGRAM_memdef_decl(sub),
00570 DST_SUBPROGRAM_memdef_st(sub),
00571 flag);
00572 }
00573 else if (DST_IS_declaration(flag)) {
00574 DST_IDX name_idx = DST_SUBPROGRAM_decl_name(sub);
00575 DST_IDX linkage_name_idx = DST_SUBPROGRAM_decl_linkage_name(sub);
00576 Is_True(!DST_IS_NULL(name_idx),
00577 ("Subprogram declaration has no name"));
00578 const char* name = DST_IDX_to_string(src, name_idx);
00579 const char* linkage_name = !DST_IS_NULL(linkage_name_idx) ?
00580 DST_IDX_to_string(src, linkage_name_idx) :
00581 0;
00582
00583 return DST_mk_subpr_decl(dest, p, cu, prev,
00584 DST_SUBPROGRAM_decl_decl(sub),
00585 name,
00586 linkage_name,
00587 DST_SUBPROGRAM_decl_inline(sub),
00588 DST_SUBPROGRAM_decl_virtuality(sub),
00589 DST_SUBPROGRAM_decl_vtable_elem_location(sub),
00590 flag);
00591 }
00592 else {
00593 DST_IDX name_idx = DST_SUBPROGRAM_def_name(sub);
00594 DST_IDX linkage_name_idx = DST_SUBPROGRAM_def_linkage_name(sub);
00595 DST_IDX pubname_idx = DST_SUBPROGRAM_def_pubname(sub);
00596 if (DST_IS_NULL(name_idx))
00597 DevWarn ("Subprogram definition has no name");
00598 const char* name = (!DST_IS_NULL(name_idx)) ?
00599 DST_IDX_to_string(src, name_idx) : "";
00600 const char* linkage_name = (!DST_IS_NULL(linkage_name_idx)) ?
00601 DST_IDX_to_string(src, linkage_name_idx) :
00602 0;
00603 const char* pubname = (!DST_IS_NULL(pubname_idx)) ?
00604 DST_IDX_to_string(src, pubname_idx) :
00605 0;
00606
00607
00608 return DST_mk_subpr_def(dest, p, cu, prev,
00609 DST_SUBPROGRAM_def_decl(sub),
00610 name,
00611 linkage_name,
00612 pubname,
00613 DST_SUBPROGRAM_def_st(sub),
00614 DST_SUBPROGRAM_def_inline(sub),
00615 DST_SUBPROGRAM_def_virtuality(sub),
00616 DST_SUBPROGRAM_def_vtable_elem_location(sub),
00617 flag);
00618 }
00619 }
00620
00621
00622
00623