52using std::dynamic_pointer_cast;
59process_ctf_typedef(reader *rdr,
60 ctf_dict_t *ctf_dictionary,
64process_ctf_base_type(reader *rdr,
65 ctf_dict_t *ctf_dictionary,
69build_ir_node_for_variadic_parameter_type(reader &rdr,
73build_ir_node_for_void_type(reader& rdr,
77build_ir_node_for_void_pointer_type(reader& rdr,
81process_ctf_function_type(reader *rdr,
82 ctf_dict_t *ctf_dictionary,
86process_ctf_sou_members(reader *rdr,
87 ctf_dict_t *ctf_dictionary,
89 class_or_union_sptr sou);
92process_ctf_forward_type(reader *rdr,
93 ctf_dict_t *ctf_dictionary,
97process_ctf_struct_type(reader *rdr,
98 ctf_dict_t *ctf_dictionary,
101static union_decl_sptr
102process_ctf_union_type(reader *rdr,
103 ctf_dict_t *ctf_dictionary,
107process_ctf_array_type(reader *rdr,
108 ctf_dict_t *ctf_dictionary,
112process_ctf_qualified_type(reader *rdr,
113 ctf_dict_t *ctf_dictionary,
117process_ctf_pointer_type(reader *rdr,
118 ctf_dict_t *ctf_dictionary,
122process_ctf_enum_type(reader *rdr,
123 ctf_dict_t *ctf_dictionary,
127fill_ctf_section(
const Elf_Scn *elf_section, ctf_sect_t *ctf_section);
130lookup_symbol_in_ctf_archive(ctf_archive_t *ctfa, ctf_dict_t **ctf_dict,
131 const char *sym_name);
134dic_type_key(ctf_dict_t *dic, ctf_id_t ctf_type);
149 vector<type_base_sptr> types_to_canonicalize;
153 vector<type_base_sptr> additional_types_to_canonicalize;
157 vector<type_base_sptr> types;
160 std::set<ctf_id_t> unknown_types_set;
165 ctf_sect_t symtab_sect;
166 ctf_sect_t strtab_sect;
175 exported_decls_builder()
176 {
return corpus()->get_exported_decls_builder().get();}
190 add_type(ctf_dict_t *dic, ctf_id_t ctf_type, type_base_sptr type)
192 string key = dic_type_key(dic, ctf_type);
193 if (types_map.insert(std::make_pair(key, type)).second)
194 types_to_canonicalize.push_back(type);
203 {additional_types_to_canonicalize.push_back(t);}
209 add_unknown_type(ctf_id_t ctf_type)
211 unknown_types_set.insert(ctf_type);
220 lookup_type(ctf_dict_t *dic, ctf_id_t ctf_type)
222 type_base_sptr result;
223 std::string key = dic_type_key(dic, ctf_type);
225 auto search = types_map.find(key);
226 if (search != types_map.end())
227 result = search->second;
235 lookup_unknown_type(ctf_id_t ctf_type)
236 {
return unknown_types_set.find(ctf_type) != unknown_types_set.end(); }
240 canonicalize_all_types(
void)
242 for (
auto& t: additional_types_to_canonicalize)
243 types_to_canonicalize.push_back(t);
244 additional_types_to_canonicalize.clear();
247 corpus()->priv_->types_are_canonicalized(
true);
262 reader(
const string& elf_path,
266 ctfa(), ctf_sect(), symtab_sect(), strtab_sect()
286 types_to_canonicalize.clear();
311 initialize(
const string& elf_path,
332 cur_transl_unit()
const
366 find_ctfa_file(std::string& ctfa_file)
368 std::string ctfa_dirname;
374 ctfa_file = ctfa_dirname +
"/vmlinux.ctfa";
375 if (file_exists(ctfa_file))
399 corpus_sptr corp =
corpus();
408 GElf_Ehdr *ehdr, eh_mem;
409 if (!(ehdr = gelf_getehdr(
elf_handle(), &eh_mem)))
413 const char *symtab_name =
".dynsym";
414 const char *strtab_name =
".dynstr";
416 if (ehdr->e_type == ET_REL)
418 symtab_name =
".symtab";
419 strtab_name =
".strtab";
424 fill_ctf_section(ctf_scn, &ctf_sect);
426 const Elf_Scn* symtab_scn =
427 elf_helpers::find_section_by_name(
elf_handle(), symtab_name);
429 fill_ctf_section(symtab_scn, &symtab_sect);
431 const Elf_Scn* strtab_scn =
432 elf_helpers::find_section_by_name(
elf_handle(), strtab_name);
434 fill_ctf_section(strtab_scn, &strtab_sect);
436 if (ctf_scn && symtab_scn && strtab_scn)
438 else if (corp->get_origin() & corpus::LINUX_KERNEL_BINARY_ORIGIN)
443 (~STATUS_DEBUG_INFO_NOT_FOUND);
452 process_ctf_archive()
454 corpus_sptr corp =
corpus();
457 std::make_shared<translation_unit>(env(),
"", 64);
458 ir_translation_unit->set_language(translation_unit::LANG_C);
459 corp->add(ir_translation_unit);
460 cur_transl_unit(ir_translation_unit);
462 ctf_dict_t *ctf_dict =
nullptr, *initial_ctf_dict =
nullptr;
463 const auto symt =
symtab();
467 ctf_next_t *it =
nullptr;
470 initial_ctf_dict = ctf_archive_next(ctfa, &it,
474 if (!initial_ctf_dict)
476 std::cerr <<
"Could not find any dictionnary in the CTF archive\n";
477 ctf_next_destroy(it);
481 ctf_dict = initial_ctf_dict;
484 std::string sym_name = symbol->get_name();
485 ctf_id_t ctf_sym_type;
487 ctf_sym_type = lookup_symbol_in_ctf_archive(ctfa, &ctf_dict,
489 if (ctf_sym_type == CTF_ERR)
492 if (ctf_type_kind(ctf_dict, ctf_sym_type) != CTF_K_FUNCTION)
494 const char *var_name = sym_name.c_str();
495 type_base_sptr var_type = build_type(ctf_dict, ctf_sym_type);
501 var_declaration.reset(
new var_decl(var_name,
506 var_declaration->set_symbol(symbol);
508 ir_translation_unit->get_global_scope());
509 var_declaration->set_is_in_public_symbol_table(
true);
514 const char *func_name = sym_name.c_str();
515 ctf_id_t ctf_sym = ctf_sym_type;
516 type_base_sptr func_type = build_type(ctf_dict, ctf_sym);
526 func_declaration->set_symbol(symbol);
528 ir_translation_unit->get_global_scope());
529 func_declaration->set_is_in_public_symbol_table(
true);
532 if (ctf_dict != initial_ctf_dict)
534 ctf_dict_close(initial_ctf_dict);
535 initial_ctf_dict = ctf_dict;
538 ctf_dict_close(ctf_dict);
539 ctf_next_destroy(it);
552 process_ctf_type(ctf_dict_t *ctf_dictionary,
555 corpus_sptr corp =
corpus();
557 int type_kind = ctf_type_kind(ctf_dictionary, ctf_type);
558 type_base_sptr result;
560 if (lookup_unknown_type(ctf_type))
563 if ((result = lookup_type(ctf_dictionary, ctf_type)))
572 = process_ctf_base_type(
this, ctf_dictionary, ctf_type);
579 = process_ctf_typedef(
this, ctf_dictionary, ctf_type);
586 = process_ctf_pointer_type(
this, ctf_dictionary, ctf_type);
587 result = pointer_type;
594 type_base_sptr qualified_type
595 = process_ctf_qualified_type(
this, ctf_dictionary, ctf_type);
596 result = qualified_type;
602 = process_ctf_array_type(
this, ctf_dictionary, ctf_type);
609 = process_ctf_enum_type(
this, ctf_dictionary, ctf_type);
616 = process_ctf_function_type(
this, ctf_dictionary, ctf_type);
623 = process_ctf_struct_type(
this, ctf_dictionary, ctf_type);
628 result = process_ctf_forward_type(
this, ctf_dictionary, ctf_type);
633 = process_ctf_union_type(
this, ctf_dictionary, ctf_type);
645 fprintf(stderr,
"NOT PROCESSED TYPE %lu\n", ctf_type);
646 add_unknown_type(ctf_type);
664 build_type(ctf_dict_t *ctf_dictionary, ctf_id_t ctf_type)
666 type_base_sptr result = lookup_type(ctf_dictionary, ctf_type);
669 result = process_ctf_type(ctf_dictionary, ctf_type);
684 corpus_sptr corp =
corpus();
688 origin |= corpus::CTF_ORIGIN;
689 corp->set_origin(origin);
698 return corpus_sptr();
700 if (!(origin & corpus::LINUX_KERNEL_BINARY_ORIGIN)
704#ifdef WITH_DEBUG_SELF_COMPARISON
705 if (env().self_comparison_debug_is_on())
709 env().set_self_comparison_debug_input(g);
711 env().set_self_comparison_debug_input(
corpus());
720 if (corp->get_origin() & corpus::LINUX_KERNEL_BINARY_ORIGIN)
724 std::string ctfa_filename;
725 if (find_ctfa_file(ctfa_filename))
726 ctfa = ctf_arc_open(ctfa_filename.c_str(), &errp);
736 && symtab_sect.cts_data
737 && strtab_sect.cts_data)
738 ctfa = ctf_arc_bufopen(&ctf_sect, &symtab_sect,
739 &strtab_sect, &errp);
744 cerr <<
"CTF Reader: Reading CTF info in:" << t <<
"\n";
752 process_ctf_archive();
757 canonicalize_all_types();
758 corpus()->sort_functions();
759 corpus()->sort_variables();
760 corpus()->mark_non_reachable_types();
766 cerr <<
"CTF Reader: Building ABG-IR in:" << t <<
"\n";
780typedef shared_ptr<reader> reader_sptr;
791process_ctf_typedef(reader *rdr,
792 ctf_dict_t *ctf_dictionary,
795 corpus_sptr corp = rdr->corpus();
799 ctf_id_t ctf_utype = ctf_type_reference(ctf_dictionary, ctf_type);
800 if (ctf_utype == CTF_ERR)
803 const char *typedef_name = ctf_type_name_raw(ctf_dictionary, ctf_type);
804 if (corpus_sptr corp = rdr->should_reuse_type_from_corpus_group())
808 type_base_sptr utype = rdr->build_type(ctf_dictionary, ctf_utype);
813 result = dynamic_pointer_cast<typedef_decl>
814 (rdr->lookup_type(ctf_dictionary, ctf_type));
827 decl_base_sptr decl =
is_decl(utype);
829 decl->add_naming_typedef(result);
835 rdr->add_type(ctf_dictionary, ctf_type, result);
851process_ctf_base_type(reader *rdr,
852 ctf_dict_t *ctf_dictionary,
855 corpus_sptr corp = rdr->corpus();
859 ctf_id_t ctf_ref = ctf_type_reference(ctf_dictionary, ctf_type);
860 const char *type_name = ctf_type_name_raw(ctf_dictionary,
861 (ctf_ref != CTF_ERR) ? ctf_ref : ctf_type);
866 ctf_encoding_t type_encoding;
867 if (ctf_type_encoding(ctf_dictionary,
868 (ctf_ref != CTF_ERR) ? ctf_ref : ctf_type,
873 if (type_encoding.cte_bits == 0
874 && type_encoding.cte_format == CTF_INT_SIGNED)
877 decl_base_sptr type_declaration = build_ir_node_for_void_type(*rdr,
879 type_base_sptr void_type =
is_type(type_declaration);
884 if (corpus_sptr corp = rdr->should_reuse_type_from_corpus_group())
886 string normalized_type_name = type_name;
898 type_encoding.cte_bits,
908 rdr->add_type(ctf_dictionary, ctf_type, result);
922build_ir_node_for_variadic_parameter_type(reader &rdr,
931 return type_declaration;
967build_ir_node_for_void_pointer_type(reader& rdr,
986process_ctf_function_type(reader *rdr,
987 ctf_dict_t *ctf_dictionary,
990 corpus_sptr corp = rdr->corpus();
995 ctf_funcinfo_t funcinfo;
996 ctf_func_type_info(ctf_dictionary, ctf_type, &funcinfo);
997 int vararg_p = funcinfo.ctc_flags & CTF_FUNC_VARARG;
1000 ctf_id_t ctf_ret_type = funcinfo.ctc_return;
1001 type_base_sptr ret_type = rdr->build_type(ctf_dictionary, ctf_ret_type);
1006 int argc = funcinfo.ctc_argc;
1007 std::vector<ctf_id_t> argv(argc);
1008 if (
static_cast<ctf_id_t
>(ctf_func_type_args(ctf_dictionary, ctf_type,
1009 argc, argv.data())) == CTF_ERR)
1013 for (
int i = 0; i < argc; i++)
1015 ctf_id_t ctf_arg_type = argv[i];
1016 type_base_sptr arg_type = rdr->build_type(ctf_dictionary, ctf_arg_type);
1025 function_parms.push_back(parm);
1030 type_base_sptr arg_type =
1031 is_type(build_ir_node_for_variadic_parameter_type(*rdr, tunit));
1038 function_parms.push_back(parm);
1041 result = dynamic_pointer_cast<function_type>
1042 (rdr->lookup_type(ctf_dictionary, ctf_type));
1049 tunit->get_address_size(),
1054 tunit->bind_function_type_life_time(result);
1055 result->set_is_artificial(
true);
1058 rdr->add_type(ctf_dictionary, ctf_type, result);
1072process_ctf_sou_members(reader *rdr,
1073 ctf_dict_t *ctf_dictionary,
1075 class_or_union_sptr sou)
1077 corpus_sptr corp = rdr->corpus();
1079 ssize_t member_size;
1080 ctf_next_t *member_next = NULL;
1081 const char *member_name = NULL;
1082 ctf_id_t member_ctf_type;
1084 while ((member_size = ctf_member_next(ctf_dictionary, ctf_type,
1085 &member_next, &member_name,
1089 ctf_membinfo_t membinfo;
1091 if (
static_cast<ctf_id_t
>(ctf_member_info(ctf_dictionary,
1094 &membinfo)) == CTF_ERR)
1098 type_base_sptr member_type = rdr->build_type(ctf_dictionary,
1116 if (ctf_errno(ctf_dictionary) != ECTF_NEXT_END)
1117 fprintf(stderr,
"ERROR from ctf_member_next\n");
1128static type_base_sptr
1129process_ctf_forward_type(reader *rdr,
1130 ctf_dict_t *ctf_dictionary,
1134 decl_base_sptr result;
1135 std::string type_name = ctf_type_name_raw(ctf_dictionary,
1137 bool type_is_anonymous = (type_name ==
"");
1138 uint32_t kind = ctf_type_kind_forwarded (ctf_dictionary, ctf_type);
1140 if (kind == CTF_K_UNION)
1147 decl_base::VISIBILITY_DEFAULT,
1148 type_is_anonymous));
1149 union_fwd->set_is_declaration_only(
true);
1154 if (!type_is_anonymous)
1155 if (corpus_sptr corp = rdr->should_reuse_type_from_corpus_group())
1160 struct_fwd(
new class_decl(rdr->env(), type_name,
1164 decl_base::VISIBILITY_DEFAULT,
1165 type_is_anonymous));
1166 struct_fwd->set_is_declaration_only(
true);
1167 result = struct_fwd;
1174 rdr->add_type(ctf_dictionary, ctf_type,
is_type(result));
1188process_ctf_struct_type(reader *rdr,
1189 ctf_dict_t *ctf_dictionary,
1192 corpus_sptr corp = rdr->corpus();
1195 std::string struct_type_name = ctf_type_name_raw(ctf_dictionary,
1197 bool struct_type_is_anonymous = (struct_type_name ==
"");
1199 if (!struct_type_is_anonymous)
1200 if (corpus_sptr corp = rdr->should_reuse_type_from_corpus_group())
1207 ctf_type_size(ctf_dictionary, ctf_type) * 8,
1211 decl_base::VISIBILITY_DEFAULT,
1212 struct_type_is_anonymous));
1222 rdr->add_type(ctf_dictionary, ctf_type, result);
1227 process_ctf_sou_members(rdr, ctf_dictionary, ctf_type, result);
1240static union_decl_sptr
1241process_ctf_union_type(reader *rdr,
1242 ctf_dict_t *ctf_dictionary,
1245 corpus_sptr corp = rdr->corpus();
1247 union_decl_sptr result;
1248 std::string union_type_name = ctf_type_name_raw(ctf_dictionary,
1250 bool union_type_is_anonymous = (union_type_name ==
"");
1252 if (!union_type_is_anonymous)
1253 if (corpus_sptr corp = rdr->should_reuse_type_from_corpus_group())
1260 ctf_type_size(ctf_dictionary, ctf_type) * 8,
1262 decl_base::VISIBILITY_DEFAULT,
1263 union_type_is_anonymous));
1273 rdr->add_type(ctf_dictionary, ctf_type, result);
1278 process_ctf_sou_members(rdr, ctf_dictionary, ctf_type, result);
1296build_array_ctf_range(reader *rdr, ctf_dict_t *dic,
1297 ctf_id_t index, uint64_t nelems)
1299 bool is_non_finite =
false;
1300 corpus_sptr corp = rdr->corpus();
1306 type_base_sptr index_type = rdr->build_type(dic, index);
1311 upper_bound.
set_unsigned(nelems > 0 ? nelems - 1 : 0U);
1315 is_non_finite =
true;
1323 translation_unit::LANG_C));
1325 subrange->set_size_in_bits(rdr->cur_transl_unit()->get_address_size());
1330 subrange->is_non_finite(is_non_finite);
1332 rdr->add_type(subrange);
1346process_ctf_array_type(reader *rdr,
1347 ctf_dict_t *ctf_dictionary,
1350 corpus_sptr corp = rdr->corpus();
1353 ctf_arinfo_t ctf_ainfo;
1356 if (
static_cast<ctf_id_t
>(ctf_array_info(ctf_dictionary,
1358 &ctf_ainfo)) == CTF_ERR)
1361 ctf_id_t ctf_element_type = ctf_ainfo.ctr_contents;
1362 ctf_id_t ctf_index_type = ctf_ainfo.ctr_index;
1363 uint64_t nelems = ctf_ainfo.ctr_nelems;
1367 int type_array_kind = ctf_type_kind(ctf_dictionary, ctf_element_type);
1368 while (type_array_kind == CTF_K_ARRAY)
1370 if (
static_cast<ctf_id_t
>(ctf_array_info(ctf_dictionary,
1372 &ctf_ainfo)) == CTF_ERR)
1375 subrange = build_array_ctf_range(rdr, ctf_dictionary,
1376 ctf_ainfo.ctr_index,
1377 ctf_ainfo.ctr_nelems);
1378 subranges.push_back(subrange);
1379 ctf_element_type = ctf_ainfo.ctr_contents;
1380 type_array_kind = ctf_type_kind(ctf_dictionary, ctf_element_type);
1383 std::reverse(subranges.begin(), subranges.end());
1386 type_base_sptr element_type = rdr->build_type(ctf_dictionary,
1392 type_base_sptr index_type = rdr->build_type(ctf_dictionary,
1397 result = dynamic_pointer_cast<array_type_def>
1398 (rdr->lookup_type(ctf_dictionary, ctf_type));
1402 subrange = build_array_ctf_range(rdr, ctf_dictionary,
1403 ctf_index_type, nelems);
1404 subranges.push_back(subrange);
1412 rdr->add_type(ctf_dictionary, ctf_type, result);
1439static decl_base_sptr
1440maybe_strip_qualification(
const qualified_type_def_sptr t)
1445 decl_base_sptr result = t;
1446 type_base_sptr u = t->get_underlying_type();
1458 type_base_sptr element_type = array->get_element_type();
1463 quals |= t->get_cv_quals();
1466 qualified->set_cv_quals(quals);
1481static type_base_sptr
1482process_ctf_qualified_type(reader *rdr,
1483 ctf_dict_t *ctf_dictionary,
1486 corpus_sptr corp = rdr->corpus();
1488 type_base_sptr result;
1489 int type_kind = ctf_type_kind(ctf_dictionary, ctf_type);
1490 ctf_id_t ctf_utype = ctf_type_reference(ctf_dictionary, ctf_type);
1491 type_base_sptr utype = rdr->build_type(ctf_dictionary, ctf_utype);
1495 result = dynamic_pointer_cast<type_base>
1496 (rdr->lookup_type(ctf_dictionary, ctf_type));
1501 if (type_kind == CTF_K_CONST)
1502 qualifiers |= qualified_type_def::CV_CONST;
1503 else if (type_kind == CTF_K_VOLATILE)
1504 qualifiers |= qualified_type_def::CV_VOLATILE;
1505 else if (type_kind == CTF_K_RESTRICT)
1506 qualifiers |= qualified_type_def::CV_RESTRICT;
1526 rdr->add_type(ctf_dictionary, ctf_type, result);
1541process_ctf_pointer_type(reader *rdr,
1542 ctf_dict_t *ctf_dictionary,
1545 corpus_sptr corp = rdr->corpus();
1548 ctf_id_t ctf_target_type = ctf_type_reference(ctf_dictionary, ctf_type);
1549 if (ctf_target_type == CTF_ERR)
1552 type_base_sptr target_type = rdr->build_type(ctf_dictionary,
1557 result = dynamic_pointer_cast<pointer_type_def>
1558 (rdr->lookup_type(ctf_dictionary, ctf_type));
1562 if (rdr->env().is_void_type(target_type))
1563 result =
is_pointer_type(build_ir_node_for_void_pointer_type(*rdr, tunit));
1566 ctf_type_size(ctf_dictionary,
1568 ctf_type_align(ctf_dictionary,
1574 rdr->add_type(ctf_dictionary, ctf_type, result);
1589process_ctf_enum_type(reader *rdr,
1590 ctf_dict_t *ctf_dictionary,
1595 ctf_id_t ctf_ref = ctf_type_reference(ctf_dictionary, ctf_type);
1596 std::string enum_name = ctf_type_name_raw(ctf_dictionary,
1597 (ctf_ref != CTF_ERR)
1598 ? ctf_ref : ctf_type);
1600 if (!enum_name.empty())
1601 if (corpus_sptr corp = rdr->should_reuse_type_from_corpus_group())
1608 size_t utype_size_in_bits = ctf_type_size(ctf_dictionary,
1609 (ctf_ref != CTF_ERR)
1610 ? ctf_ref : ctf_type) * 8;
1611 string underlying_type_name =
1613 utype_size_in_bits);
1617 underlying_type_name,
1621 utype->set_is_anonymous(
true);
1622 utype->set_is_artificial(
true);
1627 rdr->add_type(utype);
1631 ctf_next_t *enum_next = NULL;
1635 while ((ename = ctf_enum_next(ctf_dictionary, ctf_type, &enum_next, &evalue)))
1638 if (ctf_errno(ctf_dictionary) != ECTF_NEXT_END)
1640 fprintf(stderr,
"ERROR from ctf_enum_next\n");
1645 utype, enms, enum_name.c_str()));
1649 rdr->add_type(ctf_dictionary, ctf_type, result);
1672lookup_symbol_in_ctf_archive(ctf_archive_t *ctfa, ctf_dict_t **ctf_dict,
1673 const char *sym_name)
1676 ctf_dict_t *dict = *ctf_dict;
1677 ctf_id_t ctf_type = ctf_lookup_by_symbol_name(dict, sym_name);
1679 if (ctf_type != CTF_ERR)
1684 ctf_type = ctf_lookup_variable(dict, sym_name);
1687 if (ctf_type == CTF_ERR)
1690 ctf_next_t *i =
nullptr;
1691 const char *arcname =
nullptr;
1693 while ((fp = ctf_archive_next(ctfa, &i, &arcname,
1695 &ctf_err)) !=
nullptr)
1697 if ((ctf_type = ctf_lookup_by_symbol_name (fp, sym_name)) == CTF_ERR)
1698 ctf_type = ctf_lookup_variable(fp, sym_name);
1700 if (ctf_type != CTF_ERR)
1703 ctf_next_destroy(i);
1716fill_ctf_section(
const Elf_Scn *elf_section, ctf_sect_t *ctf_section)
1718 GElf_Shdr section_header_mem, *section_header;
1719 Elf_Data *section_data;
1721 section_header = gelf_getshdr(
const_cast<Elf_Scn*
>(elf_section),
1722 §ion_header_mem);
1723 section_data = elf_getdata(
const_cast<Elf_Scn*
>(elf_section), 0);
1728 ctf_section->cts_name =
"";
1729 ctf_section->cts_data = (
char *) section_data->d_buf;
1730 ctf_section->cts_size = section_data->d_size;
1731 ctf_section->cts_entsize = section_header->sh_entsize;
1747elf_based_reader_sptr
1749 const vector<string>& debug_info_root_paths,
1753 reader_sptr result(
new reader(elf_path,
1754 debug_info_root_paths,
1756 result->options() = options;
1758#ifdef WITH_DEBUG_SELF_COMPARISON
1759 if (env.self_comparison_debug_is_on())
1760 env.set_self_comparison_debug_input(result->corpus());
1775elf_based_reader_sptr
1777 const vector<string>& debug_info_root_paths,
1781 return create_reader(elf_path, debug_info_root_paths, env, options);
1796 const std::string& elf_path,
1797 const vector<string>& debug_info_root_path)
1799 ctf::reader& r =
dynamic_cast<reader&
>(rdr);
1800 r.initialize(elf_path, debug_info_root_path);
1817dic_type_key(ctf_dict_t *dic, ctf_id_t ctf_type)
1819 std::stringstream key;
1821 if (ctf_type_isparent (dic, ctf_type))
1822 key << std::hex << ctf_type;
1824 key << std::hex << ctf_type <<
'-' << ctf_cuname(dic);