20 #include <unordered_map>
24 #include "abg-internal.h"
26 ABG_BEGIN_EXPORT_DECLARATIONS
33 ABG_END_EXPORT_DECLARATIONS
69 using std::unordered_map;
70 using std::dynamic_pointer_cast;
71 using std::static_pointer_cast;
78 struct interned_string_pool::priv
98 {
return priv_->map.find(s) != priv_->map.end();}
109 unordered_map<string, string*>::const_iterator i =
111 if (i == priv_->map.end())
114 return i->second->c_str();
126 string*& result = priv_->map[str_value];
127 if (!result && !str_value.empty())
128 result =
new string(str_value);
135 for (pool_map_type::iterator i = priv_->map.begin();
136 i != priv_->map.end();
153 {
return r.operator==(l);}
156 operator!=(
const std::string& l,
const interned_string& r)
171 o << static_cast<std::string>(s);
187 {
return static_cast<std::string
>(s1) + s2;}
201 {
return s1 +
static_cast<std::string
>(s2);}
207 hash_as_canonical_type_or_constant(
const type_base *t);
210 has_generic_anonymous_internal_type_name(
const decl_base *d);
212 static interned_string
213 get_generic_anonymous_internal_type_name(
const decl_base *d);
216 get_internal_integral_type_name(
const type_base*);
219 update_qualified_name(decl_base * d);
222 update_qualified_name(decl_base_sptr d);
226 const type_base& right);
230 const type_base& right);
249 env.priv_->push_composite_type_comparison_operands(&left, &right);
270 env.priv_->pop_composite_type_comparison_operands(&left, &right);
334 return env.priv_->mark_dependant_types_compared_until(&r);
341 class expanded_location
353 expanded_location(
const string& path,
unsigned line,
unsigned column)
354 : path_(path), line_(line), column_(column)
360 return (path_ == l.path_
362 && column_ && l.column_);
366 operator<(
const expanded_location& l)
const
370 else if (path_ > l.path_)
375 else if (line_ > l.line_)
378 return column_ < l.column_;
395 if (!get_location_manager())
416 unsigned line = 0, column = 0;
417 expand(path, line, column);
419 std::ostringstream o;
420 o << path <<
":" << line <<
":" << column;
424 struct location_manager::priv
430 std::vector<expanded_location> locs;
433 location_manager::location_manager()
437 location_manager::~location_manager() =
default;
452 expanded_location l(file_path, line, col);
456 priv_->locs.push_back(l);
457 return location(priv_->locs.size(),
this);
474 unsigned& column)
const
478 expanded_location &l = priv_->locs[
location.value_ - 1];
491 struct type_maps::priv
504 mutable vector<type_base_wptr> sorted_types_;
507 type_maps::type_maps()
511 type_maps::~type_maps() =
default;
536 {
return priv_->basic_types_;}
543 {
return priv_->basic_types_;}
550 {
return priv_->class_types_;}
557 {
return priv_->class_types_;}
564 {
return priv_->union_types_;}
571 {
return priv_->union_types_;}
578 {
return priv_->enum_types_;}
585 {
return priv_->enum_types_;}
592 {
return priv_->typedef_types_;}
599 {
return priv_->typedef_types_;}
605 {
return priv_->qualified_types_;}
611 {
return priv_->qualified_types_;}
618 {
return priv_->pointer_types_;}
625 {
return priv_->pointer_types_;}
632 {
return priv_->reference_types_;}
639 {
return priv_->reference_types_;}
646 {
return priv_->array_types_;}
653 {
return priv_->array_types_;}
660 {
return priv_->subrange_types_;}
667 {
return priv_->subrange_types_;}
674 {
return priv_->function_types_;}
681 {
return priv_->function_types_;}
685 struct type_name_comp
700 if (l == 0 && r == 0)
705 return l_repr < r_repr;
719 operator()(
const type_base_sptr &l,
const type_base_sptr &r)
const
720 {
return operator()(l.get(), r.get());}
734 {
return operator()(type_base_sptr(l), type_base_sptr(r));}
737 #ifdef WITH_DEBUG_SELF_COMPARISON
753 notify_equality_failed(
const type_or_decl_base &l __attribute__((unused)),
754 const type_or_decl_base &r __attribute__((unused)))
771 notify_equality_failed(
const type_or_decl_base *l __attribute__((unused)),
772 const type_or_decl_base *r __attribute__((unused)))
775 #define ABG_RETURN_EQUAL(l, r) \
779 notify_equality_failed(l, r); \
785 #define ABG_RETURN_FALSE \
788 notify_equality_failed(l, r); \
792 #define ABG_RETURN(value) \
795 if (value == false) \
796 notify_equality_failed(l, r); \
802 #define ABG_RETURN_FALSE return false
803 #define ABG_RETURN(value) return (value)
804 #define ABG_RETURN_EQUAL(l, r) return ((l) == (r));
820 #if WITH_DEBUG_TYPE_CANONICALIZATION
840 if (env.priv_->use_canonical_type_comparison_)
844 ABG_RETURN_EQUAL(lc, rc);
850 ABG_RETURN_EQUAL(lc, rc);
869 bool result = l.priv_->comparison_started(l, r);
909 #define RETURN_TRUE_IF_COMPARISON_CYCLE_DETECTED(l, r) \
912 if (is_comparison_cycle_detected(l, r)) \
914 mark_dependant_types_compared_until(r); \
933 l.priv_->mark_as_being_compared(l, r);
968 l.priv_->unmark_as_being_compared(l, r);
1014 template<
typename T>
1017 bool propagate_canonical_type =
true)
1019 if (propagate_canonical_type && (value ==
true))
1020 maybe_propagate_canonical_type(l, r);
1033 && (
is_type(&r)->priv_->depends_on_recursive_type()
1034 || env.priv_->is_recursive_type(&r))
1035 &&
is_type(&r)->priv_->canonical_type_propagated()
1036 && !
is_type(&r)->priv_->propagated_canonical_type_confirmed()
1037 && !env.priv_->right_type_comp_operands_.empty())
1042 env.priv_->add_to_types_with_non_confirmed_propagated_ct(
is_type(&r));
1044 else if (value ==
true && env.priv_->right_type_comp_operands_.empty())
1053 env.priv_->confirm_ct_propagation(&r);
1055 else if (value ==
true)
1058 env.priv_->add_to_types_with_non_confirmed_propagated_ct(
is_type(&r));
1059 else if (value ==
false)
1066 env.priv_->cancel_all_non_confirmed_propagated_canonical_types();
1078 && env.priv_->right_type_comp_operands_.empty()
1079 && !env.priv_->types_with_non_confirmed_propagated_ct_.empty())
1084 env.priv_->confirm_ct_propagation();
1086 #ifdef WITH_DEBUG_SELF_COMPARISON
1087 if (value ==
false && env.priv_->right_type_comp_operands_.empty())
1089 for (
const auto i : env.priv_->types_with_non_confirmed_propagated_ct_)
1092 env.priv_->check_abixml_canonical_type_propagation_during_self_comp(t);
1100 #define CACHE_AND_RETURN_COMPARISON_RESULT(value) \
1103 bool res = return_comparison_result(l, r, value); \
1104 l.get_environment().priv_->cache_type_comparison_result(l, r, res); \
1112 #define CACHE_COMPARISON_RESULT_AND_RETURN(value) \
1115 l.get_environment().priv_->cache_type_comparison_result(l, r, value); \
1123 const vector<type_base_wptr>&
1126 if (priv_->sorted_types_.empty())
1128 istring_type_base_wptrs_map_type::const_iterator i;
1129 vector<type_base_wptr>::const_iterator j;
1132 for (j = i->second.begin(); j != i->second.end(); ++j)
1133 priv_->sorted_types_.push_back(*j);
1136 for (j = i->second.begin(); j != i->second.end(); ++j)
1137 priv_->sorted_types_.push_back(*j);
1140 for (j = i->second.begin(); j != i->second.end(); ++j)
1141 priv_->sorted_types_.push_back(*j);
1144 for (j = i->second.begin(); j != i->second.end(); ++j)
1145 priv_->sorted_types_.push_back(*j);
1148 for (j = i->second.begin(); j != i->second.end(); ++j)
1149 priv_->sorted_types_.push_back(*j);
1151 type_name_comp comp;
1152 sort(priv_->sorted_types_.begin(), priv_->sorted_types_.end(), comp);
1155 return priv_->sorted_types_;
1174 const std::string& path,
1176 : priv_(new
priv(env))
1178 priv_->path_ = path;
1179 priv_->address_size_ = address_size;
1201 if (!priv_->global_scope_)
1203 priv_->global_scope_.reset
1205 priv_->global_scope_->set_translation_unit
1208 return priv_->global_scope_;
1216 {
return priv_->types_;}
1223 {
return priv_->types_;}
1230 const vector<function_type_sptr>&
1232 {
return priv_->live_fn_types_;}
1239 {
return priv_->env_;}
1246 {
return priv_->language_;}
1253 {priv_->language_ = l;}
1266 {
return priv_->path_;}
1277 {priv_->path_ = a_path;}
1290 {
return priv_->comp_dir_path_;}
1301 {priv_->comp_dir_path_ = d;}
1310 if (priv_->abs_path_.empty())
1313 if (!priv_->path_.empty())
1315 if (!priv_->comp_dir_path_.empty())
1317 path = priv_->comp_dir_path_;
1320 path += priv_->path_;
1322 priv_->abs_path_ = path;
1325 return priv_->abs_path_;
1344 {
return priv_->corp;}
1360 {
return priv_->loc_mgr_;}
1368 {
return priv_->loc_mgr_;}
1377 if (!priv_->global_scope_)
1387 {
return priv_->address_size_;}
1394 {priv_->address_size_= a;}
1410 {
return priv_->is_constructed_;}
1426 {priv_->is_constructed_ = f;}
1465 const_cast<translation_unit*
>(
this)->priv_->live_fn_types_.push_back(ftype);
1496 translation_unit::~translation_unit()
1509 case translation_unit::LANG_UNKNOWN:
1510 return "LANG_UNKNOWN";
1511 case translation_unit::LANG_Cobol74:
1512 return "LANG_Cobol74";
1513 case translation_unit::LANG_Cobol85:
1514 return "LANG_Cobol85";
1515 case translation_unit::LANG_C89:
1517 case translation_unit::LANG_C99:
1519 case translation_unit::LANG_C11:
1521 case translation_unit::LANG_C:
1523 case translation_unit::LANG_C_plus_plus_11:
1524 return "LANG_C_plus_plus_11";
1525 case translation_unit::LANG_C_plus_plus_14:
1526 return "LANG_C_plus_plus_14";
1527 case translation_unit::LANG_C_plus_plus:
1528 return "LANG_C_plus_plus";
1529 case translation_unit::LANG_ObjC:
1531 case translation_unit::LANG_ObjC_plus_plus:
1532 return "LANG_ObjC_plus_plus";
1533 case translation_unit::LANG_Fortran77:
1534 return "LANG_Fortran77";
1535 case translation_unit::LANG_Fortran90:
1536 return "LANG_Fortran90";
1537 case translation_unit::LANG_Fortran95:
1538 return "LANG_Fortran95";
1539 case translation_unit::LANG_Ada83:
1540 return "LANG_Ada83";
1541 case translation_unit::LANG_Ada95:
1542 return "LANG_Ada95";
1543 case translation_unit::LANG_Pascal83:
1544 return "LANG_Pascal83";
1545 case translation_unit::LANG_Modula2:
1546 return "LANG_Modula2";
1547 case translation_unit::LANG_Java:
1549 case translation_unit::LANG_PLI:
1551 case translation_unit::LANG_UPC:
1553 case translation_unit::LANG_D:
1555 case translation_unit::LANG_Python:
1556 return "LANG_Python";
1557 case translation_unit::LANG_Go:
1559 case translation_unit::LANG_Mips_Assembler:
1560 return "LANG_Mips_Assembler";
1562 return "LANG_UNKNOWN";
1565 return "LANG_UNKNOWN";
1577 if (l ==
"LANG_Cobol74")
1578 return translation_unit::LANG_Cobol74;
1579 else if (l ==
"LANG_Cobol85")
1580 return translation_unit::LANG_Cobol85;
1581 else if (l ==
"LANG_C89")
1582 return translation_unit::LANG_C89;
1583 else if (l ==
"LANG_C99")
1584 return translation_unit::LANG_C99;
1585 else if (l ==
"LANG_C11")
1586 return translation_unit::LANG_C11;
1587 else if (l ==
"LANG_C")
1588 return translation_unit::LANG_C;
1589 else if (l ==
"LANG_C_plus_plus_11")
1590 return translation_unit::LANG_C_plus_plus_11;
1591 else if (l ==
"LANG_C_plus_plus_14")
1592 return translation_unit::LANG_C_plus_plus_14;
1593 else if (l ==
"LANG_C_plus_plus")
1594 return translation_unit::LANG_C_plus_plus;
1595 else if (l ==
"LANG_ObjC")
1596 return translation_unit::LANG_ObjC;
1597 else if (l ==
"LANG_ObjC_plus_plus")
1598 return translation_unit::LANG_ObjC_plus_plus;
1599 else if (l ==
"LANG_Fortran77")
1600 return translation_unit::LANG_Fortran77;
1601 else if (l ==
"LANG_Fortran90")
1602 return translation_unit::LANG_Fortran90;
1603 else if (l ==
"LANG_Fortran95")
1604 return translation_unit::LANG_Fortran95;
1605 else if (l ==
"LANG_Ada83")
1606 return translation_unit::LANG_Ada83;
1607 else if (l ==
"LANG_Ada95")
1608 return translation_unit::LANG_Ada95;
1609 else if (l ==
"LANG_Pascal83")
1610 return translation_unit::LANG_Pascal83;
1611 else if (l ==
"LANG_Modula2")
1612 return translation_unit::LANG_Modula2;
1613 else if (l ==
"LANG_Java")
1614 return translation_unit::LANG_Java;
1615 else if (l ==
"LANG_PLI")
1616 return translation_unit::LANG_PLI;
1617 else if (l ==
"LANG_UPC")
1618 return translation_unit::LANG_UPC;
1619 else if (l ==
"LANG_D")
1620 return translation_unit::LANG_D;
1621 else if (l ==
"LANG_Python")
1622 return translation_unit::LANG_Python;
1623 else if (l ==
"LANG_Go")
1624 return translation_unit::LANG_Go;
1625 else if (l ==
"LANG_Mips_Assembler")
1626 return translation_unit::LANG_Mips_Assembler;
1628 return translation_unit::LANG_UNKNOWN;
1639 return (l == translation_unit::LANG_C89
1640 || l == translation_unit::LANG_C99
1641 || l == translation_unit::LANG_C11
1642 || l == translation_unit::LANG_C);
1653 return (l == translation_unit::LANG_C_plus_plus_03
1654 || l == translation_unit::LANG_C_plus_plus_11
1655 || l == translation_unit::LANG_C_plus_plus_14
1656 || l == translation_unit::LANG_C_plus_plus);
1666 {
return l == translation_unit::LANG_Java;}
1676 return (l == translation_unit::LANG_Ada83
1677 || l == translation_unit::LANG_Ada95);
1690 if (l.get() == r.get())
1713 struct elf_symbol::priv
1753 bool is_in_ksymtab_;
1756 bool is_suppressed_;
1771 is_in_ksymtab_(false),
1774 is_suppressed_(false)
1777 priv(
const environment& e,
1785 const elf_symbol::version& ve,
1807 is_common_ = type_ == COMMON_TYPE;
1841 elf_symbol::elf_symbol(
const environment& e,
1917 elf_symbol_sptr sym(
new elf_symbol(e, i, s, n, t, b, d, c, ve, vi,
1919 sym->priv_->main_symbol_ = sym;
1959 {
return priv_->env_;}
1966 {
return priv_->index_;}
1973 {priv_->index_ = s;}
1980 {
return priv_->name_;}
1989 priv_->id_string_.clear();
1997 {
return priv_->type_;}
2011 {
return priv_->size_;}
2018 {priv_->size_ = size;}
2025 {
return priv_->binding_;}
2032 {priv_->binding_ = b;}
2039 {
return priv_->version_;}
2047 priv_->version_ = v;
2048 priv_->id_string_.clear();
2057 {priv_->visibility_ = v;}
2065 {
return priv_->visibility_;}
2073 {
return priv_->is_defined_;}
2081 {priv_->is_defined_ = d;}
2128 {
return priv_->is_in_ksymtab_;}
2143 {
return priv_->crc_;}
2150 {priv_->crc_ = crc;}
2157 {
return priv_->namespace_;}
2164 {priv_->namespace_ = ns;}
2173 {
return priv_->is_suppressed_;}
2212 {
return priv_->main_symbol_.lock();}
2219 {
return priv_->main_symbol_.lock();}
2233 {
return priv_->next_alias_.lock();}
2253 a = a->get_next_alias())
2276 a && !a->is_main_symbol();
2277 a = a->get_next_alias())
2279 if (a->get_next_alias()->is_main_symbol())
2287 last_alias->priv_->next_alias_ = alias;
2290 priv_->next_alias_ = alias;
2320 a = a->get_next_alias())
2321 if (a->get_name() == name)
2331 priv_->main_symbol_ = new_main;
2333 a = a->get_next_alias())
2334 a->priv_->main_symbol_ = new_main;
2344 {
return priv_->is_common_;}
2375 {
return priv_->next_common_instance_.lock();}
2390 ABG_ASSERT(!common->has_other_common_instances());
2399 c = c->get_next_common_instance())
2404 last_common_instance = c;
2409 last_common_instance->priv_->next_common_instance_ = common;
2412 priv_->next_common_instance_ = common;
2432 if (priv_->id_string_.empty())
2444 priv_->id_string_ = s;
2447 return priv_->id_string_;
2464 a = a->get_next_alias())
2465 if (a->get_name() == name)
2482 a && a.get() != a->get_main_symbol().get();
2483 a = a->get_next_alias())
2484 if (textually_equals(*
this, *a))
2501 bool include_symbol_itself)
const
2505 if (include_symbol_itself)
2508 vector<elf_symbol_sptr> aliases;
2509 compute_aliases_for_elf_symbol(*
this, syms, aliases);
2510 if (!aliases.empty() && include_symbol_itself)
2513 for (vector<elf_symbol_sptr>::const_iterator i = aliases.begin();
2517 if (i != aliases.begin())
2519 result += (*i)->get_id_string();
2534 vector<elf_symbol_sptr> aliases;
2535 if (include_symbol_itself)
2540 a = a->get_next_alias())
2541 aliases.push_back(a);
2544 for (vector<elf_symbol_sptr>::const_iterator i = aliases.begin();
2548 if (i != aliases.begin())
2550 result += (*i)->get_id_string();
2570 name.clear(), ver.clear();
2572 string::size_type i =
id.find(
'@');
2573 if (i == string::npos)
2579 name =
id.substr(0, i);
2585 string::size_type j =
id.find(
'@', i);
2586 if (j == string::npos)
2613 bool are_equal = textually_equals(*
this, other);
2634 a && !a->is_main_symbol();
2635 a = a->get_next_alias())
2659 return *lhs == *rhs;
2685 compute_aliases_for_elf_symbol(
const elf_symbol& sym,
2687 vector<elf_symbol_sptr>& aliases)
2691 for (; a && !a->is_main_symbol(); a = a->get_next_alias())
2692 aliases.push_back(a);
2694 for (string_elf_symbols_map_type::const_iterator i = symtab.begin();
2697 for (elf_symbols::const_iterator j = i->second.begin();
2698 j != i->second.end();
2703 s && !s->is_main_symbol();
2704 s = s->get_next_alias())
2705 aliases.push_back(s);
2708 s && !s->is_main_symbol();
2709 s = s->get_next_alias())
2711 aliases.push_back(*j);
2756 case elf_symbol::NOTYPE_TYPE:
2757 repr =
"unspecified symbol type";
2759 case elf_symbol::OBJECT_TYPE:
2760 repr =
"variable symbol type";
2762 case elf_symbol::FUNC_TYPE:
2763 repr =
"function symbol type";
2765 case elf_symbol::SECTION_TYPE:
2766 repr =
"section symbol type";
2768 case elf_symbol::FILE_TYPE:
2769 repr =
"file symbol type";
2771 case elf_symbol::COMMON_TYPE:
2772 repr =
"common data object symbol type";
2774 case elf_symbol::TLS_TYPE:
2775 repr =
"thread local data object symbol type";
2777 case elf_symbol::GNU_IFUNC_TYPE:
2778 repr =
"indirect function symbol type";
2782 std::ostringstream s;
2783 s <<
"unknown symbol type (" << (char)t <<
')';
2806 case elf_symbol::LOCAL_BINDING:
2807 repr =
"local binding";
2809 case elf_symbol::GLOBAL_BINDING:
2810 repr =
"global binding";
2812 case elf_symbol::WEAK_BINDING:
2813 repr =
"weak binding";
2815 case elf_symbol::GNU_UNIQUE_BINDING:
2816 repr =
"GNU unique binding";
2820 std::ostringstream s;
2821 s <<
"unknown binding (" << (
unsigned char) b <<
")";
2844 case elf_symbol::DEFAULT_VISIBILITY:
2845 repr =
"default visibility";
2847 case elf_symbol::PROTECTED_VISIBILITY:
2848 repr =
"protected visibility";
2850 case elf_symbol::HIDDEN_VISIBILITY:
2851 repr =
"hidden visibility";
2853 case elf_symbol::INTERNAL_VISIBILITY:
2854 repr =
"internal visibility";
2858 std::ostringstream s;
2859 s <<
"unknown visibility (" << (
unsigned char) v <<
")";
2881 t = elf_symbol::NOTYPE_TYPE;
2882 else if (s ==
"object-type")
2883 t = elf_symbol::OBJECT_TYPE;
2884 else if (s ==
"func-type")
2885 t = elf_symbol::FUNC_TYPE;
2886 else if (s ==
"section-type")
2887 t = elf_symbol::SECTION_TYPE;
2888 else if (s ==
"file-type")
2889 t = elf_symbol::FILE_TYPE;
2890 else if (s ==
"common-type")
2891 t = elf_symbol::COMMON_TYPE;
2892 else if (s ==
"tls-type")
2893 t = elf_symbol::TLS_TYPE;
2894 else if (s ==
"gnu-ifunc-type")
2895 t = elf_symbol::GNU_IFUNC_TYPE;
2913 if (s ==
"local-binding")
2914 b = elf_symbol::LOCAL_BINDING;
2915 else if (s ==
"global-binding")
2916 b = elf_symbol::GLOBAL_BINDING;
2917 else if (s ==
"weak-binding")
2918 b = elf_symbol::WEAK_BINDING;
2919 else if (s ==
"gnu-unique-binding")
2920 b = elf_symbol::GNU_UNIQUE_BINDING;
2938 if (s ==
"default-visibility")
2939 v = elf_symbol::DEFAULT_VISIBILITY;
2940 else if (s ==
"protected-visibility")
2941 v = elf_symbol::PROTECTED_VISIBILITY;
2942 else if (s ==
"hidden-visibility")
2943 v = elf_symbol::HIDDEN_VISIBILITY;
2944 else if (s ==
"internal-visibility")
2945 v = elf_symbol::INTERNAL_VISIBILITY;
2960 {
return t == elf_symbol::FUNC_TYPE;}
2970 {
return t == elf_symbol::OBJECT_TYPE;}
2974 struct elf_symbol::version::priv
2980 : is_default_(false)
2983 priv(
const string& v,
2990 elf_symbol::version::version()
2997 elf_symbol::version::version(
const string& v,
2999 : priv_(new priv(v, is_default))
3003 : priv_(new priv(v.str(), v.is_default()))
3007 elf_symbol::version::~version() =
default;
3012 elf_symbol::version::operator
const string&()
const
3013 {
return priv_->version_;}
3020 {
return priv_->version_;}
3027 {priv_->version_ = s;}
3034 {
return priv_->is_default_;}
3041 {priv_->is_default_ = f;}
3044 elf_symbol::version::is_empty()
const
3045 {
return str().empty();}
3054 {
return str() == o.
str();}
3083 struct dm_context_rel::priv
3086 size_t offset_in_bits_;
3089 priv(
bool is_static =
false)
3090 : is_laid_out_(!is_static),
3092 anonymous_data_member_()
3095 priv(
bool is_laid_out,
size_t offset_in_bits)
3096 : is_laid_out_(is_laid_out),
3097 offset_in_bits_(offset_in_bits),
3098 anonymous_data_member_()
3102 dm_context_rel::dm_context_rel()
3107 dm_context_rel::dm_context_rel(scope_decl* s,
3109 size_t offset_in_bits,
3112 : context_rel(s, a, is_static),
3113 priv_(new priv(is_laid_out, offset_in_bits))
3116 dm_context_rel::dm_context_rel(scope_decl* s)
3122 dm_context_rel::get_is_laid_out()
const
3123 {
return priv_->is_laid_out_;}
3126 dm_context_rel::set_is_laid_out(
bool f)
3127 {priv_->is_laid_out_ = f;}
3130 dm_context_rel::get_offset_in_bits()
const
3131 {
return priv_->offset_in_bits_;}
3134 dm_context_rel::set_offset_in_bits(
size_t o)
3135 {priv_->offset_in_bits_ = o;}
3138 dm_context_rel::operator==(
const dm_context_rel& o)
const
3140 if (!context_rel::operator==(o))
3143 return (priv_->is_laid_out_ == o.priv_->is_laid_out_
3144 && priv_->offset_in_bits_ == o.priv_->offset_in_bits_);
3148 dm_context_rel::operator!=(
const dm_context_rel& o)
const
3159 {
return priv_->anonymous_data_member_;}
3169 {priv_->anonymous_data_member_ = anon_dm;}
3171 dm_context_rel::~dm_context_rel()
3197 {
return priv_->canonical_types_;}
3210 is_ptr_ref_or_qual_type(
const type_base *t)
3227 compare_using_locations(
const decl_base *f,
3241 unsigned l1 = 0, l2 = 0, c1 = 0, c2 = 0;
3264 struct decl_topo_comp
3275 operator()(
const decl_base *f,
3286 if ((!f->get_corpus() && !s->get_corpus())
3287 || (f->get_corpus()->get_origin() == corpus::NATIVE_XML_ORIGIN
3288 && s->get_corpus()->get_origin() == corpus::NATIVE_XML_ORIGIN))
3289 return compare_using_locations(f, s);
3296 if (fl.get_value() && sl.get_value())
3297 return compare_using_locations(f, s);
3298 else if (!!fl != !!sl)
3305 if (f->get_is_anonymous()
3306 && s->get_is_anonymous()
3309 return f->get_name() < s->get_name();
3323 operator()(
const decl_base_sptr &f,
3324 const decl_base_sptr &s)
3325 {
return operator()(f.get(), s.get());}
3336 struct type_topo_comp
3344 has_artificial_or_natural_location(
const decl_base* d)
3353 has_artificial_or_natural_location(
const type_base* t)
3355 if (decl_base *d =
is_decl(t))
3356 return has_artificial_or_natural_location(d);
3368 operator()(
const type_base_sptr &f,
3369 const type_base_sptr &s)
3370 {
return operator()(f.get(), s.get());}
3380 operator()(
const type_base *f,
3385 if ((!f->get_corpus() && !s->get_corpus())
3386 || (f->get_corpus()->get_origin() == corpus::NATIVE_XML_ORIGIN
3387 && s->get_corpus()->get_origin() == corpus::NATIVE_XML_ORIGIN))
3390 bool f_is_ptr_ref_or_qual = is_ptr_ref_or_qual_type(f);
3391 bool s_is_ptr_ref_or_qual = is_ptr_ref_or_qual_type(s);
3393 if (f_is_ptr_ref_or_qual != s_is_ptr_ref_or_qual)
3394 return !f_is_ptr_ref_or_qual && s_is_ptr_ref_or_qual;
3396 if (f_is_ptr_ref_or_qual && s_is_ptr_ref_or_qual
3397 && !has_artificial_or_natural_location(f)
3398 && !has_artificial_or_natural_location(s))
3406 if (q->get_cv_quals() == qualified_type_def::CV_NONE)
3438 type_base *peeled_f =
3440 type_base *peeled_s =
3497 decl_topo_comp decl_comp;
3498 return decl_comp(fd, sd);
3509 vector<type_base_sptr>& result)
3512 result.push_back(t);
3514 type_topo_comp comp;
3515 std::stable_sort(result.begin(), result.end(), comp);
3522 const type_base_sptr&
3525 if (!priv_->void_type_)
3526 priv_->void_type_.reset(
new type_decl(*
this,
3529 return priv_->void_type_;
3537 const type_base_sptr&
3540 if (!priv_->variadic_marker_type_)
3541 priv_->variadic_marker_type_.
3544 return priv_->variadic_marker_type_;
3553 static string variadic_parameter_type_name =
"variadic parameter type";
3554 return variadic_parameter_type_name;
3564 {
return priv_->canonicalization_is_done_;}
3578 {priv_->canonicalization_is_done_ = f;}
3587 {
return priv_->do_on_the_fly_canonicalization_;}
3596 {priv_->do_on_the_fly_canonicalization_ = f;}
3620 {
return priv_->decl_only_class_equals_definition_;}
3645 {priv_->decl_only_class_equals_definition_ = f;}
3717 {
return const_cast<environment*
>(
this)->priv_->string_pool_.create_string(s);}
3724 {
return priv_->config_;}
3734 {
return priv_->analyze_exported_interfaces_only_.has_value();}
3747 {priv_->analyze_exported_interfaces_only_ = f;}
3760 {
return priv_->analyze_exported_interfaces_only_.value_or(
false);}
3762 #ifdef WITH_DEBUG_SELF_COMPARISON
3775 environment::set_self_comparison_debug_input(
const corpus_sptr& c)
3777 self_comparison_debug_is_on(
true);
3778 if (priv_->first_self_comparison_corpus_.expired())
3779 priv_->first_self_comparison_corpus_ = c;
3780 else if (priv_->second_self_comparison_corpus_.expired()
3781 && c.get() != corpus_sptr(priv_->first_self_comparison_corpus_).get())
3782 priv_->second_self_comparison_corpus_ = c;
3795 environment::get_self_comparison_debug_inputs(corpus_sptr& first_corpus,
3796 corpus_sptr& second_corpus)
3798 first_corpus = priv_->first_self_comparison_corpus_.lock();
3799 second_corpus = priv_->second_self_comparison_corpus_.lock();
3806 environment::self_comparison_debug_is_on(
bool f)
3807 {priv_->self_comparison_debug_on_ = f;}
3814 environment::self_comparison_debug_is_on()
const
3815 {
return priv_->self_comparison_debug_on_;}
3818 #ifdef WITH_DEBUG_TYPE_CANONICALIZATION
3825 environment::debug_type_canonicalization_is_on(
bool flag)
3826 {priv_->debug_type_canonicalization_ = flag;}
3834 environment::debug_type_canonicalization_is_on()
const
3835 {
return priv_->debug_type_canonicalization_;}
3843 environment::debug_die_canonicalization_is_on(
bool flag)
3844 {priv_->debug_die_canonicalization_ = flag;}
3852 environment::debug_die_canonicalization_is_on()
const
3853 {
return priv_->debug_die_canonicalization_;}
3869 vector<type_base_sptr>*
3896 if (!types ||index >= types->size())
3898 return (*types)[index].get();
3901 #ifdef WITH_DEBUG_SELF_COMPARISON
3911 const unordered_map<string, uintptr_t>&
3912 environment::get_type_id_canonical_type_map()
const
3913 {
return priv_->get_type_id_canonical_type_map();}
3924 unordered_map<string, uintptr_t>&
3925 environment::get_type_id_canonical_type_map()
3926 {
return priv_->get_type_id_canonical_type_map();}
3941 const unordered_map<uintptr_t, string>&
3942 environment::get_pointer_type_id_map()
const
3943 {
return priv_->get_pointer_type_id_map();}
3958 unordered_map<uintptr_t, string>&
3959 environment::get_pointer_type_id_map()
3960 {
return priv_->get_pointer_type_id_map();}
3978 environment::get_type_id_from_pointer(uintptr_t ptr)
const
3979 {
return priv_->get_type_id_from_pointer(ptr);}
3997 environment::get_type_id_from_type(
const type_base *t)
const
3998 {
return priv_->get_type_id_from_type(t);}
4015 environment::get_canonical_type_from_type_id(
const char* type_id)
const
4016 {
return priv_->get_canonical_type_from_type_id(type_id);}
4024 struct type_or_decl_base::priv
4042 void* type_or_decl_ptr_;
4043 bool hashing_started_;
4044 const environment& env_;
4045 translation_unit* translation_unit_;
4050 location artificial_location_;
4054 bool is_artificial_;
4062 priv(
const environment& e,
4066 type_or_decl_ptr_(),
4069 translation_unit_(),
4089 (
static_cast<unsigned>(l) |
static_cast<unsigned>(r));
4109 (
static_cast<unsigned>(l) &
static_cast<unsigned>(r));
4130 :priv_(new priv(e, k))
4146 {
return priv_->is_artificial_;}
4158 {priv_->is_artificial_ = f;}
4169 {
return priv_->kind();}
4189 {
return priv_->rtti_;}
4198 {
return priv_->rtti_;}
4210 priv_->type_or_decl_ptr_ = t;
4212 priv_->type_or_decl_ptr_ = d;
4235 {
return priv_->type_or_decl_ptr_;}
4242 {
return priv_->hashing_started_;}
4249 {priv_->hashing_started_ = b;}
4256 {
return priv_->env_;}
4274 {priv_->artificial_location_ = l;}
4292 {
return priv_->artificial_location_;}
4300 return (priv_->artificial_location_
4301 && priv_->artificial_location_.get_is_artificial());
4332 {priv_->translation_unit_ = tu;}
4341 {
return priv_->translation_unit_;}
4373 *dr =
dynamic_cast<const decl_base*
>(r);
4382 *tr =
dynamic_cast<const type_base*
>(r);
4427 struct decl_base::priv
4429 bool in_pub_sym_tab_;
4455 decl_base_sptr declaration_;
4457 decl_base* naked_definition_of_declaration_;
4458 bool is_declaration_only_;
4462 : in_pub_sym_tab_(false),
4463 is_anonymous_(true),
4465 visibility_(VISIBILITY_DEFAULT),
4466 naked_definition_of_declaration_(),
4467 is_declaration_only_(false)
4470 priv(interned_string name, interned_string linkage_name,
visibility vis)
4471 : in_pub_sym_tab_(false),
4474 qualified_name_(name),
4475 linkage_name_(linkage_name),
4477 naked_definition_of_declaration_(),
4478 is_declaration_only_(false)
4480 is_anonymous_ = name_.
empty();
4505 const string& linkage_name,
4508 priv_(new priv(e.intern(name), e.intern(linkage_name), vis))
4532 priv_(new priv(name, linkage_name, vis))
4559 {
return priv_->qualified_name_;}
4568 {priv_->qualified_name_.clear();}
4575 {priv_->qualified_name_ = n;}
4588 {
return priv_->temporary_qualified_name_;}
4602 {priv_->temporary_qualified_name_ = n;}
4609 {
return priv_->context_;}
4616 {
return priv_->context_;}
4620 {priv_->context_ = c;}
4651 {
return priv_->in_pub_sym_tab_;}
4659 {priv_->in_pub_sym_tab_ = f;}
4679 {
return priv_->location_;}
4721 priv_->location_ = l;
4731 priv_->is_anonymous_ = n.empty();
4742 {
return priv_->is_anonymous_;}
4752 {priv_->is_anonymous_ = f;}
4789 {
return priv_->naming_typedef_;}
4817 &&
is_type(
this)->get_naked_canonical_type() ==
nullptr);
4819 priv_->naming_typedef_ = t;
4826 update_qualified_name(
this);
4834 {
return priv_->linkage_name_;}
4843 priv_->linkage_name_ = env.
intern(m);
4851 {
return priv_->visibility_;}
4858 {priv_->visibility_ = v;}
4867 if (priv_->context_)
4868 return priv_->context_->get_scope();
4878 {
return priv_->qualified_parent_name_;}
4885 {
return priv_->name_;}
4920 bool qualified_name)
const
4924 && has_generic_anonymous_internal_type_name(
this))
4935 string name = get_generic_anonymous_internal_type_name(
this);
4963 {
return priv_->qualified_name_;}
4977 {
return priv_->scoped_name_;}
4983 const decl_base_sptr
4985 {
return priv_->declaration_;}
4994 if (d && d->get_is_declaration_only())
4995 priv_->declaration_ = d;
5003 const decl_base_sptr
5005 {
return priv_->definition_of_declaration_.lock();}
5021 {
return priv_->naked_definition_of_declaration_;}
5028 {
return priv_->is_declaration_only_;}
5038 bool update_types_lookup_map = !f && priv_->is_declaration_only_;
5040 priv_->is_declaration_only_ = f;
5042 if (update_types_lookup_map)
5045 scope_decl::declarations::iterator i;
5046 if (s->find_iterator_for_member(
this, i))
5056 return static_cast<change_kind>(
static_cast<unsigned>(l)
5057 |
static_cast<unsigned>(r));
5063 return static_cast<change_kind>(
static_cast<unsigned>(l)
5064 &
static_cast<unsigned>(r));
5111 bool member_types_or_functions =
5115 if (member_types_or_functions)
5124 la = r1->get_access_specifier();
5125 ra = r2->get_access_specifier();
5126 r1->set_access_specifier(no_access);
5127 r2->set_access_specifier(no_access);
5130 bool rels_are_different = *r1 != *r2;
5132 if (member_types_or_functions)
5135 r1->set_access_specifier(la);
5136 r2->set_access_specifier(ra);
5139 if (rels_are_different)
5160 get_decl_name_for_comparison(
const decl_base &d)
5162 if (has_generic_anonymous_internal_type_name(&d)
5168 r += get_generic_anonymous_internal_type_name(&d);
5204 if (!l_linkage_name.
empty() && !r_linkage_name.
empty())
5206 if (l_linkage_name != r_linkage_name)
5241 bool decls_are_same = (ln == rn);
5250 decls_are_same =
true;
5260 if (!decls_are_same)
5283 {
return equals(*
this, other, 0);}
5322 if (!priv_->context_)
5325 priv_->context_->set_scope(scope);
5343 case decl_base::VISIBILITY_NONE:
5346 case decl_base::VISIBILITY_DEFAULT:
5349 case decl_base::VISIBILITY_PROTECTED:
5352 case decl_base::VISIBILITY_HIDDEN:
5355 case decl_base::VISIBILITY_INTERNAL:
5375 case decl_base::BINDING_NONE:
5378 case decl_base::BINDING_LOCAL:
5381 case decl_base::BINDING_GLOBAL:
5384 case decl_base::BINDING_WEAK:
5407 if (l.get() == r.get())
5443 if (l.get() == r.get())
5529 {
return dynamic_pointer_cast<scope_decl>(d);}
5595 return c->get_access_specifier();
5625 c->set_access_specifier(a);
5655 return c->get_is_static();
5797 var_decl_sptr first = *klass->get_non_static_data_members().begin();
5818 if (!klass ||!data_member)
5821 for (class_or_union::data_members::const_iterator it =
5825 if (**it == *data_member)
6012 return class_or_union_sptr();
6021 const class_or_union_sptr
6026 if (cou->get_is_anonymous())
6029 return class_or_union_sptr();
6038 const class_or_union_sptr
6043 return class_or_union_sptr();
6052 const class_or_union_sptr
6067 return class_or_union_sptr();
6092 for (
auto anon_dm_m : cl->get_non_static_data_members())
6155 ctxt_rel->set_offset_in_bits(o);
6170 return ctxt_rel->get_offset_in_bits();
6260 const var_decl *containing_anonymous_data_member =
6263 uint64_t containing_anonymous_data_member_offset = 0;
6264 if (containing_anonymous_data_member)
6265 containing_anonymous_data_member_offset =
6268 return (ctxt_rel->get_offset_in_bits()
6270 containing_anonymous_data_member_offset);
6298 type_base_sptr t = v->get_type();
6301 return t->get_size_in_bits();
6315 ctxt_rel->set_is_laid_out(l);
6330 return ctxt_rel->get_is_laid_out();
6632 return ctxt->is_virtual();
6669 ctxt->is_virtual(is_virtual);
6684 (dynamic_pointer_cast<method_decl>(fn));
6722 if (!cl->get_canonical_type())
6728 type_base_sptr t = type;
6739 ty->get_size_in_bits(),
6740 ty->get_alignment_in_bits(),
6741 ty->get_location()));
6749 ty->get_size_in_bits(),
6750 ty->get_alignment_in_bits(),
6751 ty->get_location()));
6760 ty->get_location()));
6766 t.reset(
new array_type_def(p, ty->get_subranges(), ty->get_location()));
6771 for (function_decl::parameters::const_iterator i =
6772 ty->get_parameters().begin();
6773 i != ty->get_parameters().end();
6784 p->get_variadic_marker(),
6785 p->get_is_artificial()));
6786 parm.push_back(stripped);
6791 parm, ty->get_is_const(),
6792 ty->get_size_in_bits(),
6793 ty->get_alignment_in_bits()));
6798 for (function_decl::parameters::const_iterator i =
6799 ty->get_parameters().begin();
6800 i != ty->get_parameters().end();
6811 p->get_variadic_marker(),
6812 p->get_is_artificial()));
6813 parm.push_back(stripped);
6818 ty->get_size_in_bits(),
6819 ty->get_alignment_in_bits()));
6822 if (!t->get_translation_unit())
6823 t->set_translation_unit(type->get_translation_unit());
6828 return t->get_canonical_type() ? t->get_canonical_type() : t;
6851 decl_base_sptr result = t;
6852 type_base_sptr u = t->get_underlying_type();
6855 if ((t->get_cv_quals() & qualified_type_def::CV_CONST
6857 || (t->get_cv_quals() & qualified_type_def::CV_CONST
6859 || t->get_cv_quals() == qualified_type_def::CV_NONE)
6905 static qualified_type_def_sptr
6906 strip_redundant_quals_from_underyling_types(
const qualified_type_def_sptr& t,
6915 qualified_type_def_sptr underlying_qualified_type =
6923 currated_quals &= ~redundant_quals;
6924 t->set_cv_quals(currated_quals);
6928 redundant_quals |= currated_quals;
6930 qualified_type_def_sptr result = t;
6931 if (underlying_qualified_type)
6935 strip_redundant_quals_from_underyling_types(underlying_qualified_type,
6969 strip_redundant_quals_from_underyling_types(
const qualified_type_def_sptr& t)
6975 strip_redundant_quals_from_underyling_types(t, redundant_quals);
7002 return t->get_underlying_type();
7056 return t->get_pointed_to_type();
7112 return t->get_pointed_to_type();
7152 const type_base_sptr
7216 const type_base_sptr
7270 type_base_sptr type = t;
7293 type_base_sptr typ = type;
7355 bool peel_qual_type)
7394 bool peel_qual_type)
7432 vector<array_type_def::subrange_sptr> subranges;
7434 for (vector<array_type_def::subrange_sptr>::const_iterator i =
7435 array->get_subranges().begin();
7436 i != array->get_subranges().end();
7442 (*i)->get_lower_bound(),
7443 (*i)->get_upper_bound(),
7444 (*i)->get_underlying_type(),
7445 (*i)->get_location(),
7446 (*i)->get_language()));
7447 subrange->is_infinite((*i)->is_infinite());
7450 subranges.push_back(subrange);
7455 subranges, array->get_location()));
7478 (
new typedef_decl(t->get_name(), t->get_underlying_type(),
7479 t->get_location(), t->get_linkage_name(),
7480 t->get_visibility()));
7496 qualified_type_def_sptr
7502 qualified_type_def_sptr result
7504 t->get_cv_quals(), t->get_location()));
7516 static type_base_sptr
7517 clone_typedef_array_qualified_type(type_base_sptr type)
7523 type_base_sptr result;
7532 return type_base_sptr();
7555 type_base_sptr result = clone_typedef_array_qualified_type(t);
7558 type_base_sptr subtree;
7562 clone_typedef_array_qualified_type(type->get_underlying_type());
7566 type->set_underlying_type(subtree);
7572 clone_typedef_array_qualified_type(type->get_element_type());
7576 type->set_element_type(subtree);
7586 clone_typedef_array_qualified_type(t->get_underlying_type());
7593 t->set_underlying_type (s);
7602 clone_typedef_array_qualified_type(t->get_underlying_type());
7609 t->set_underlying_type(s);
7617 type_base_sptr e = t->get_element_type();
7621 clone_typedef_array_qualified_type(e);
7627 t->set_element_type(s);
7646 ::qualified_name_setter setter;
7654 update_qualified_name(decl_base_sptr d)
7655 {
return update_qualified_name(d.get());}
7675 {
return reinterpret_cast<size_t>(l);}
7677 struct scope_decl::priv
7722 {
return priv_->canonical_types_;}
7740 if (priv_->sorted_canonical_types_.empty())
7742 for (canonical_type_sptr_set_type::const_iterator e =
7746 priv_->sorted_canonical_types_.push_back(*e);
7748 type_topo_comp comp;
7749 std::stable_sort(priv_->sorted_canonical_types_.begin(),
7750 priv_->sorted_canonical_types_.end(),
7753 return priv_->sorted_canonical_types_;
7763 {
return priv_->members_;}
7772 {
return priv_->members_;}
7782 decl_topo_comp comp;
7783 if (priv_->sorted_members_.empty())
7788 priv_->sorted_members_.push_back(*i);
7790 std::stable_sort(priv_->sorted_members_.begin(),
7791 priv_->sorted_members_.end(),
7794 return priv_->sorted_members_;
7809 if (t->get_is_anonymous())
7827 if (t->get_is_anonymous())
7845 if (t->get_is_anonymous())
7856 {
return priv_->member_scopes_;}
7863 {
return priv_->member_scopes_;}
7889 member->set_scope(
this);
7890 priv_->members_.push_back(member);
7892 priv_->member_types_.push_back(
is_type(member));
7895 priv_->member_scopes_.push_back(m);
7897 update_qualified_name(member);
7904 member->set_translation_unit(tu);
7917 {
return priv_->member_types_;}
7932 return type_base_sptr();
7942 declarations::iterator before)
7948 priv_->member_types_.push_back(t);
7984 for (
auto i = priv_->member_types_.begin();
7985 i != priv_->member_types_.end();
7990 priv_->member_types_.erase(i);
8003 if (priv_->sorted_member_types_.empty())
8006 priv_->sorted_member_types_.push_back(t);
8008 type_topo_comp comp;
8009 std::stable_sort(priv_->sorted_member_types_.begin(),
8010 priv_->sorted_member_types_.end(),
8013 return priv_->sorted_member_types_;
8029 declarations::iterator before)
8033 member->set_scope(
this);
8034 priv_->members_.insert(before, member);
8037 priv_-> member_scopes_.push_back(m);
8039 update_qualified_name(member);
8046 member->set_translation_unit(tu);
8060 for (declarations::iterator i = priv_->members_.begin();
8061 i != priv_->members_.end();
8066 priv_->members_.erase(i);
8076 for (scopes::iterator i = priv_->member_scopes_.begin();
8077 i != priv_->member_scopes_.end();
8082 priv_->member_scopes_.erase(i);
8098 return hash_scope(
this);
8125 if (!l.decl_base::operator==(r))
8134 scope_decl::declarations::const_iterator i, j;
8176 return equals(*
this, *other, 0);
8191 if (l.get() == r.get())
8217 declarations::iterator& i)
8232 if ((*it).get() == decl)
8252 declarations::iterator& i)
8269 if (v.visit_begin(
this))
8272 for (scope_decl::declarations::const_iterator i =
8276 if (!(*i)->traverse(v))
8280 return v.visit_end(
this);
8283 scope_decl::~scope_decl()
8297 if (scope && decl && !decl->
get_scope())
8338 scope_decl::declarations::iterator before,
8341 if (scope && decl && !decl->
get_scope())
8360 scope_decl::declarations::iterator before,
8370 | ABSTRACT_DECL_BASE
8371 | ABSTRACT_SCOPE_DECL),
8374 translation_unit_(tu)
8376 runtime_type_instance(
this);
8395 return scope ?
dynamic_cast<global_scope*
> (scope) : 0;
8502 if (cv_quals & qualified_type_def::CV_RESTRICT)
8504 if (cv_quals & qualified_type_def::CV_CONST)
8510 if (cv_quals & qualified_type_def::CV_VOLATILE)
8562 {
return get_name(tod.get(), qualified);}
8580 string qualified_name;
8584 if (qualified_name.empty())
8585 qualified_name = name;
8587 qualified_name = qualified_name +
"::" + name;
8589 return qualified_name;
8624 location loc = decl->get_location();
8628 if (c->get_is_declaration_only() && c->get_definition_of_declaration())
8631 loc = c->get_location();
8689 has_generic_anonymous_internal_type_name(
const decl_base *d)
8706 static interned_string
8707 get_generic_anonymous_internal_type_name(
const decl_base *d)
8709 ABG_ASSERT(has_generic_anonymous_internal_type_name(d));
8711 const environment&env = d->get_environment();
8713 interned_string result;
8746 get_internal_integral_type_name(
const type_base* t)
8754 integral_type int_type;
8756 name = int_type.to_string(
true);
8794 r += get_generic_anonymous_internal_type_name(d);
8802 return env.
intern(get_internal_integral_type_name(t));
8841 bool qualified,
bool internal)
8844 string tn =
get_type_name(pointed_to_type, qualified,
internal);
8863 bool lvalue_reference,
8864 bool qualified,
bool internal)
8868 string name =
get_type_name(pointed_to_type, qualified,
internal);
8869 if (lvalue_reference)
8894 bool qualified,
bool internal)
8896 const environment& env = underlying_type->get_environment();
8899 string name =
get_type_name(underlying_type, qualified,
internal);
8901 if (quals_repr.empty() &&
internal)
8913 if (!quals_repr.empty())
8922 name = quals_repr +
" " + name;
8979 std::ostringstream o;
8984 type_base_sptr return_type =
8993 type_base_sptr type;
8994 for (function_type::parameters::const_iterator i =
9001 type = (*i)->get_type();
9008 return env.
intern(o.str());
9027 c->get_exported_decls_builder();
9028 if (b->fn_id_maps_to_several_fns(fn))
9084 std::ostringstream o;
9089 type_base_sptr return_type =
9096 o << return_type->get_cached_pretty_representation(
internal);
9105 o <<
" (" << class_type->get_qualified_name(
internal) <<
"::*)"
9108 type_base_sptr type;
9109 for (function_type::parameters::const_iterator i =
9116 type = (*i)->get_type();
9120 o << type->get_cached_pretty_representation(
internal);
9128 return env.
intern(o.str());
9294 std::ostringstream o;
9312 std::ostringstream o;
9367 const string& indent,
9370 bool qualified_names)
9373 string local_indent =
" ";
9378 if (!
internal && clazz->is_struct())
9384 repr = indent +
"union";
9402 for (class_or_union::data_members::const_iterator dm = dmems.begin();
9406 if (dm != dmems.begin())
9411 real_indent =
"\n" + indent + local_indent;
9418 real_indent, one_line,
internal, qualified_names);
9423 if (dm != dmems.begin())
9424 repr += real_indent;
9425 repr += (*dm)->get_pretty_representation(
internal,
9430 real_indent+ (*dm)->get_pretty_representation(
internal,
9439 repr += indent +
"}";
9462 const string& indent,
9465 bool qualified_names)
9469 internal, qualified_names);
9491 const string& indent,
9494 bool qualified_names)
9522 std::ostringstream o;
9537 o <<
" :" << std::endl;
9541 if (b->get_is_virtual())
9543 o << b->get_base_class()->get_qualified_name()
9553 <<
" // @: " << std::hex <<
is_type(c)
9559 type_base_sptr t = m->get_type();
9563 << m->get_pretty_representation(
false,
9567 if (t && t->get_canonical_type())
9568 o <<
" // uses canonical type '@"
9569 << std::hex << t->get_canonical_type().get() << std::dec;
9571 o <<
"'" << std::endl;
9576 o <<
" // virtual member functions\n\n";
9578 o <<
" " << f->get_pretty_representation(
false,
9580 <<
";" << std::endl;
9583 o <<
"};" << std::endl;
9589 string name = e->get_qualified_name();
9590 std::ostringstream o;
9591 o <<
"union " << name
9593 << e->get_underlying_type()->get_pretty_representation(
false,
9597 <<
" // size in bits: " << e->get_size_in_bits() <<
"\n"
9598 <<
" // is-declaration-only: " << e->get_is_declaration_only() <<
"\n"
9600 <<
" // translation unit: "
9601 << e->get_translation_unit()->get_absolute_path() <<
"\n"
9602 <<
" // @: " << std::hex <<
is_type(e)
9603 <<
", @canonical: " << e->get_canonical_type().get() << std::dec
9606 for (
const auto &enom : e->get_enumerators())
9607 o <<
" " << enom.get_name() <<
" = " << enom.get_value() <<
",\n";
9613 return artifact->get_pretty_representation(
true,
9712 return const_cast<type_base*
>(artifact);
9729 return const_cast<decl_base*
>(artifact);
9759 debug_comp_vec(
const vector<const type_base*>& vect, std::ostringstream& o)
9763 o <<
"|" << t->get_pretty_representation()
9764 <<
"@" << std::hex << t << std::dec;
9776 print_comp_stack(
const environment& env)
9778 std::ostringstream o;
9779 o <<
"left-operands: ";
9780 debug_comp_vec(env.priv_->left_type_comp_operands_, o);
9781 o <<
"\n" <<
"right-operands: ";
9782 debug_comp_vec(env.priv_->right_type_comp_operands_, o);
9795 std::cerr << print_comp_stack(env);
9796 std::cerr << std::endl;
9828 {
return dynamic_cast<const decl_base*
>(t);}
9846 {
return dynamic_pointer_cast<decl_base>(t);}
9862 const type_base_sptr type2)
9864 if (!type1 || !type2)
9900 const decl_base_sptr d2)
10038 const string& name)
10043 if (!containing_class_or_union)
10060 {
return (decl &&
dynamic_cast<template_decl*
>(decl->get_scope()));}
10070 return (decl && (dynamic_pointer_cast<type_tparameter>(decl)
10071 || dynamic_pointer_cast<non_type_tparameter>(decl)
10072 || dynamic_pointer_cast<template_tparameter>(decl)));
10102 {
return dynamic_pointer_cast<function_decl>(d);}
10125 {
return dynamic_pointer_cast<function_decl::parameter>(tod);}
10136 if (d && (d->
kind() & type_or_decl_base::ABSTRACT_DECL_BASE))
10138 if (!(d->
kind() & type_or_decl_base::ABSTRACT_TYPE_BASE))
10164 {
return dynamic_pointer_cast<decl_base>(d);}
10186 {
return dynamic_pointer_cast<decl_base>(t);}
10196 if (
dynamic_cast<const type_base*
>(&tod))
10209 if (t && (t->
kind() & type_or_decl_base::ABSTRACT_TYPE_BASE))
10223 {
return dynamic_pointer_cast<type_base>(tod);}
10255 if (!cou->get_naming_typedef())
10279 {
return dynamic_cast<const type_decl*
>(t);}
10287 {
return dynamic_pointer_cast<type_decl>(t);}
10337 {
return dynamic_pointer_cast<typedef_decl>(t);}
10409 {
return dynamic_pointer_cast<enum_type_decl>(d);}
10463 if (t->
kind() & type_or_decl_base::CLASS_TYPE)
10477 {
return dynamic_pointer_cast<class_decl>(d);}
10489 return klass->get_is_declaration_only();
10518 shared_ptr<class_or_union>
10520 {
return dynamic_pointer_cast<class_or_union>(t);}
10549 {
return dynamic_pointer_cast<union_decl>(t);}
10563 if (t->
kind() & type_or_decl_base::POINTER_TYPE)
10590 {
return dynamic_pointer_cast<pointer_type_def>(t);}
10620 {
return dynamic_pointer_cast<reference_type_def>(t);}
10678 qualified_type_def_sptr
10680 {
return dynamic_pointer_cast<qualified_type_def>(t);}
10690 {
return dynamic_pointer_cast<function_type>(t);}
10720 {
return dynamic_pointer_cast<method_type>(t);}
10758 class_or_union_sptr
10768 class_or_union_sptr
10800 decl_base_sptr decl;
10807 while (decl->get_is_declaration_only()
10808 && decl->get_definition_of_declaration())
10809 decl = decl->get_definition_of_declaration();
10876 decl_base_sptr d =
is_decl(t);
10901 {
return dynamic_pointer_cast<var_decl>(decl);}
10910 {
return dynamic_pointer_cast<namespace_decl>(d);}
10944 && dynamic_pointer_cast<function_decl>(decl)
10964 {
return dynamic_pointer_cast<array_type_def>(type);}
10972 qualified_type_def_sptr
10976 return qualified_type_def_sptr();
11031 array_type_def::subrange_type*
11046 {
return dynamic_pointer_cast<array_type_def::subrange_type>(type);}
11056 {
return decl && dynamic_pointer_cast<template_decl>(decl);}
11062 LOOKUP_ENTITY_TYPE,
11094 find_next_delim_in_cplus_type(
const string& fqn,
11098 int angle_count = 0;
11099 bool found =
false;
11101 for (; i < fqn.size(); ++i)
11105 else if (fqn[i] ==
'>')
11107 else if (i + 1 < fqn.size()
11110 && fqn[i+1] ==
':')
11127 list<string>& comps)
11129 string::size_type fqn_size = fqn.size(), comp_begin = 0, comp_end = fqn_size;
11132 if (!find_next_delim_in_cplus_type(fqn, comp_begin, comp_end))
11133 comp_end = fqn_size;
11135 string comp = fqn.substr(comp_begin, comp_end - comp_begin);
11136 comps.push_back(comp);
11138 comp_begin = comp_end + 2;
11139 if (comp_begin >= fqn_size)
11155 for (list<string>::const_iterator c = comps.begin();
11158 if (c == comps.begin())
11161 result +=
"::" + *c;
11176 template<
typename T>
11178 iterator_is_last(T& container,
11179 typename T::const_iterator i)
11181 typename T::const_iterator next = i;
11183 return (next == container.end());
11200 lookup_types_in_map(
const interned_string& type_name,
11203 istring_type_base_wptrs_map_type::const_iterator i = type_map.find(type_name);
11204 if (i != type_map.end())
11225 template <
class TypeKind>
11226 static shared_ptr<TypeKind>
11227 lookup_type_in_map(
const interned_string& type_name,
11230 istring_type_base_wptrs_map_type::const_iterator i = type_map.find(type_name);
11231 if (i != type_map.end())
11235 for (
auto j : i->second)
11237 type_base_sptr t(j);
11238 decl_base_sptr d =
is_decl(t);
11239 if (d && !d->get_is_declaration_only())
11240 return dynamic_pointer_cast<TypeKind>(type_base_sptr(j));
11245 return dynamic_pointer_cast<TypeKind>(type_base_sptr(i->second.back()));
11247 return shared_ptr<TypeKind>();
11264 return lookup_type_in_map<type_decl>(type_name,
11323 return lookup_type_in_map<class_decl>(type_name,
11341 return lookup_type_in_map<union_decl>(type_name,
11376 union_decl_sptr result = lookup_type_in_map<union_decl>(loc, m);
11409 return lookup_type_in_map<enum_type_decl>(type_name,
11448 return lookup_type_in_map<typedef_decl>(type_name,
11484 qualified_type_def_sptr
11489 return lookup_type_in_map<qualified_type_def>(type_name,
11508 qualified_type_def_sptr
11535 return lookup_type_in_map<pointer_type_def>(type_name,
11597 return lookup_type_in_map<reference_type_def>(type_name,
11616 bool lvalue_reference,
11641 return lookup_type_in_map<array_type_def>(type_name,
11661 return lookup_type_in_map<function_type>(type_name,
11707 const type_base_sptr
11711 type_base_sptr result;
11750 const type_base_sptr
11774 const type_base_sptr
11778 list<string> comps;
11791 const decl_base_sptr
11795 list<string> comps;
11811 template<
typename NodeKind>
11823 {
return node->get_name();}
11843 {
return node->get_name();}
11852 template<
typename NodeKind>
11853 static decl_base_sptr
11854 convert_node_to_decl(shared_ptr<NodeKind> node);
11867 template<
typename NodeKind>
11869 lookup_node_in_scope(
const list<string>& fqn,
11873 shared_ptr<NodeKind> node;
11874 bool it_is_last =
false;
11877 for (list<string>::const_iterator c = fqn.begin(); c != fqn.end(); ++c)
11880 it_is_last = iterator_is_last(fqn, c);
11881 for (scope_decl::declarations::const_iterator m =
11882 cur_scope->get_member_decls().begin();
11883 m != cur_scope->get_member_decls().end();
11889 scope = dynamic_pointer_cast<scope_decl>(*m);
11890 if (scope && scope->get_name() == *c)
11899 node = dynamic_pointer_cast<NodeKind>(*m);
11903 dynamic_pointer_cast<class_decl>(node))
11904 if (cl->get_is_declaration_only()
11905 && !cl->get_definition_of_declaration())
11907 resulting_decl = node;
11912 if (!new_scope && !resulting_decl)
11913 return decl_base_sptr();
11914 cur_scope = new_scope;
11917 return resulting_decl;
11938 const type_base_sptr
11941 {
return is_type(lookup_node_in_scope<type_base>(comps, scope));}
11965 static const type_base_sptr
11967 const vector<scope_decl*>& access_path,
11970 vector<scope_decl*> a = access_path;
11971 type_base_sptr result;
11976 first_scope = a.back();
11984 for (scope_decl::declarations::const_iterator i =
11988 if (
is_type(*i) && (*i)->get_name() == n)
11996 first_scope = a.back();
11997 interned_string scope_name, cur_scope_name = first_scope->
get_name();
11998 for (scope_decl::scopes::const_iterator i =
12003 scope_name = (*i)->get_name();
12004 if (scope_name == cur_scope_name)
12030 static const type_base_sptr
12032 const scope_decl* scope)
12035 return type_base_sptr();
12039 vector<scope_decl*> access_path;
12040 for (scope_decl* s = type_decl->get_scope(); s != 0; s = s->get_scope())
12042 access_path.push_back(s);
12068 const type_base_sptr
12083 const decl_base_sptr
12086 {
return is_var_decl(lookup_node_in_scope<var_decl>(comps, skope));}
12099 template<
typename NodeKind>
12101 lookup_node_in_translation_unit(
const list<string>& fqn,
12119 {
return is_type(lookup_node_in_translation_unit<type_base>(fqn, tu));}
12139 {
return is_class_type(lookup_node_in_translation_unit<class_decl>(fqn, tu));}
12152 lookup_basic_type_through_translation_units(
const interned_string& type_name,
12153 const corpus& abi_corpus)
12157 for (translation_units::const_iterator tu =
12177 static union_decl_sptr
12178 lookup_union_type_through_translation_units(
const interned_string& type_name,
12179 const corpus & abi_corpus)
12181 union_decl_sptr result;
12183 for (translation_units::const_iterator tu =
12184 abi_corpus.get_translation_units().begin();
12185 tu != abi_corpus.get_translation_units().end();
12204 lookup_enum_type_through_translation_units(
const interned_string& type_name,
12205 const corpus & abi_corpus)
12209 for (translation_units::const_iterator tu =
12210 abi_corpus.get_translation_units().begin();
12211 tu != abi_corpus.get_translation_units().end();
12228 lookup_typedef_type_through_translation_units(
const interned_string& type_name,
12229 const corpus & abi_corpus)
12233 for (translation_units::const_iterator tu =
12234 abi_corpus.get_translation_units().begin();
12235 tu != abi_corpus.get_translation_units().end();
12252 static qualified_type_def_sptr
12253 lookup_qualified_type_through_translation_units(
const interned_string& t_name,
12254 const corpus & abi_corpus)
12256 qualified_type_def_sptr result;
12258 for (translation_units::const_iterator tu =
12259 abi_corpus.get_translation_units().begin();
12260 tu != abi_corpus.get_translation_units().end();
12278 lookup_pointer_type_through_translation_units(
const interned_string& type_name,
12279 const corpus & abi_corpus)
12283 for (translation_units::const_iterator tu =
12284 abi_corpus.get_translation_units().begin();
12285 tu != abi_corpus.get_translation_units().end();
12303 lookup_reference_type_through_translation_units(
const interned_string& t_name,
12304 const corpus & abi_corpus)
12308 for (translation_units::const_iterator tu =
12309 abi_corpus.get_translation_units().begin();
12310 tu != abi_corpus.get_translation_units().end();
12328 lookup_array_type_through_translation_units(
const interned_string& type_name,
12329 const corpus & abi_corpus)
12333 for (translation_units::const_iterator tu =
12334 abi_corpus.get_translation_units().begin();
12335 tu != abi_corpus.get_translation_units().end();
12353 lookup_function_type_through_translation_units(
const interned_string& type_name,
12354 const corpus & abi_corpus)
12358 for (translation_units::const_iterator tu =
12359 abi_corpus.get_translation_units().begin();
12360 tu != abi_corpus.get_translation_units().end();
12378 const corpus& abi_corpus)
12380 type_base_sptr result;
12382 for (translation_units::const_iterator tu =
12403 const string& tu_path,
12406 string_tu_map_type::const_iterator i = corp.priv_->path_tu_map.find(tu_path);
12407 if (i == corp.priv_->path_tu_map.end())
12408 return type_base_sptr();
12437 for (translation_units::const_iterator i =
12483 result = lookup_type_in_map<type_decl>(qualified_name, m);
12485 result = lookup_basic_type_through_translation_units(qualified_name, corp);
12505 result = lookup_type_in_map<type_decl>(loc, m);
12596 class_decl_sptr result = lookup_type_in_map<class_decl>(qualified_name, m);
12614 return lookup_types_in_map(qualified_name, m);
12640 for (
auto type : *v)
12642 type_base_sptr t(type);
12644 if (c->get_is_declaration_only()
12645 && !c->get_definition_of_declaration())
12646 result.push_back(type);
12649 return !result.empty();
12665 return lookup_types_in_map(qualified_name, m);
12746 union_decl_sptr result = lookup_type_in_map<union_decl>(type_name, m);
12748 result = lookup_union_type_through_translation_units(type_name, corp);
12827 lookup_type_in_map<enum_type_decl>(qualified_name, m);
12829 result = lookup_enum_type_through_translation_units(qualified_name, corp);
12847 return lookup_types_in_map(qualified_name, m);
12952 lookup_type_in_map<typedef_decl>(qualified_name, m);
12954 result = lookup_typedef_type_through_translation_units(qualified_name,
13049 qualified_type_def_sptr
13064 qualified_type_def_sptr
13070 qualified_type_def_sptr result =
13071 lookup_type_in_map<qualified_type_def>(qualified_name, m);
13074 result = lookup_qualified_type_through_translation_units(qualified_name,
13116 lookup_type_in_map<pointer_type_def>(qualified_name, m);
13118 result = lookup_pointer_type_through_translation_units(qualified_name,
13166 lookup_type_in_map<reference_type_def>(qualified_name, m);
13168 result = lookup_reference_type_through_translation_units(qualified_name,
13215 lookup_type_in_map<array_type_def>(qualified_name, m);
13217 result = lookup_array_type_through_translation_units(qualified_name, corp);
13286 lookup_type_in_map<function_type>(qualified_name, m);
13288 result = lookup_function_type_through_translation_units(qualified_name,
13311 type_base_sptr result;
13344 type_base_sptr result;
13392 return type_base_sptr();
13409 template<
typename TypeKind>
13413 bool use_type_name_as_key =
true)
13417 if (use_type_name_as_key)
13419 else if (
location l = type->get_location())
13421 string str = l.expand();
13422 s = type->get_environment().intern(str);
13425 istring_type_base_wptrs_map_type::iterator i = types_map.find(s);
13426 bool result =
false;
13428 if (i == types_map.end())
13430 types_map[s].push_back(type);
13434 i->second.push_back(type);
13455 bool use_type_name_as_key)
13459 bool update_qname_map =
true;
13460 if (type->get_is_declaration_only())
13466 is_class_type(class_type->get_definition_of_declaration()))
13470 if (!update_qname_map)
13474 if (use_type_name_as_key)
13476 string qname = type->get_qualified_name();
13477 s = type->get_environment().intern(qname);
13479 else if (
location l = type->get_location())
13481 string str = l.expand();
13482 s = type->get_environment().intern(str);
13485 bool result =
false;
13486 istring_type_base_wptrs_map_type::iterator i = map.find(s);
13487 if (i == map.end())
13489 map[s].push_back(type);
13493 i->second.push_back(type);
13519 bool result =
false;
13521 istring_type_base_wptrs_map_type::iterator i = types_map.find(s);
13522 if (i == types_map.end())
13524 types_map[s].push_back(type);
13528 i->second.push_back(type);
13548 maybe_update_types_lookup_map<type_decl>
13549 (basic_type, tu->get_types().basic_types());
13551 if (
corpus *type_corpus = basic_type->get_corpus())
13553 maybe_update_types_lookup_map<type_decl>
13555 type_corpus->priv_->get_types().basic_types());
13557 maybe_update_types_lookup_map<type_decl>
13559 type_corpus->get_type_per_loc_map().basic_types(),
13564 maybe_update_types_lookup_map<type_decl>
13566 group->priv_->get_types().basic_types());
13568 maybe_update_types_lookup_map<type_decl>
13570 group->get_type_per_loc_map().basic_types(),
13593 (class_type, tu->get_types().class_types());
13595 if (
corpus *type_corpus = class_type->get_corpus())
13599 type_corpus->priv_->get_types().class_types());
13603 type_corpus->get_type_per_loc_map().class_types(),
13610 group->priv_->get_types().class_types());
13614 group->get_type_per_loc_map().class_types(),
13635 maybe_update_types_lookup_map<union_decl>
13636 (union_type, tu->get_types().union_types());
13638 if (
corpus *type_corpus = union_type->get_corpus())
13640 maybe_update_types_lookup_map<union_decl>
13642 type_corpus->priv_->get_types().union_types());
13644 maybe_update_types_lookup_map<union_decl>
13646 type_corpus->get_type_per_loc_map().union_types(),
13651 maybe_update_types_lookup_map<union_decl>
13653 group->priv_->get_types().union_types());
13655 maybe_update_types_lookup_map<union_decl>
13657 group->get_type_per_loc_map().union_types(),
13678 maybe_update_types_lookup_map<enum_type_decl>
13679 (enum_type, tu->get_types().enum_types());
13681 if (
corpus *type_corpus = enum_type->get_corpus())
13683 maybe_update_types_lookup_map<enum_type_decl>
13685 type_corpus->priv_->get_types().enum_types());
13687 maybe_update_types_lookup_map<enum_type_decl>
13689 type_corpus->get_type_per_loc_map().enum_types(),
13694 maybe_update_types_lookup_map<enum_type_decl>
13696 group->priv_->get_types().enum_types());
13698 maybe_update_types_lookup_map<enum_type_decl>
13700 group->get_type_per_loc_map().enum_types(),
13722 maybe_update_types_lookup_map<typedef_decl>
13723 (typedef_type, tu->get_types().typedef_types());
13725 if (
corpus *type_corpus = typedef_type->get_corpus())
13727 maybe_update_types_lookup_map<typedef_decl>
13729 type_corpus->priv_->get_types().typedef_types());
13731 maybe_update_types_lookup_map<typedef_decl>
13733 type_corpus->get_type_per_loc_map().typedef_types(),
13738 maybe_update_types_lookup_map<typedef_decl>
13740 group->priv_->get_types().typedef_types());
13742 maybe_update_types_lookup_map<typedef_decl>
13744 group->get_type_per_loc_map().typedef_types(),
13765 maybe_update_types_lookup_map<qualified_type_def>
13766 (qualified_type, tu->get_types().qualified_types());
13768 if (
corpus *type_corpus = qualified_type->get_corpus())
13770 maybe_update_types_lookup_map<qualified_type_def>
13772 type_corpus->priv_->get_types().qualified_types());
13776 maybe_update_types_lookup_map<qualified_type_def>
13778 group->priv_->get_types().qualified_types());
13798 maybe_update_types_lookup_map<pointer_type_def>
13799 (pointer_type, tu->get_types().pointer_types());
13801 if (
corpus *type_corpus = pointer_type->get_corpus())
13803 maybe_update_types_lookup_map<pointer_type_def>
13805 type_corpus->priv_->get_types().pointer_types());
13809 maybe_update_types_lookup_map<pointer_type_def>
13811 group->priv_->get_types().pointer_types());
13831 maybe_update_types_lookup_map<reference_type_def>
13832 (reference_type, tu->get_types().reference_types());
13834 if (
corpus *type_corpus = reference_type->get_corpus())
13836 maybe_update_types_lookup_map<reference_type_def>
13838 type_corpus->priv_->get_types().reference_types());
13842 maybe_update_types_lookup_map<reference_type_def>
13844 group->priv_->get_types().reference_types());
13864 maybe_update_types_lookup_map<array_type_def>
13865 (array_type, tu->get_types().array_types());
13867 if (
corpus *type_corpus = array_type->get_corpus())
13869 maybe_update_types_lookup_map<array_type_def>
13871 type_corpus->priv_->get_types().array_types());
13873 maybe_update_types_lookup_map<array_type_def>
13875 type_corpus->get_type_per_loc_map().array_types(),
13880 maybe_update_types_lookup_map<array_type_def>
13882 group->priv_->get_types().array_types());
13884 maybe_update_types_lookup_map<array_type_def>
13886 group->get_type_per_loc_map().array_types(),
13908 maybe_update_types_lookup_map<array_type_def::subrange_type>
13909 (subrange_type, tu->get_types().subrange_types());
13911 if (
corpus *type_corpus = subrange_type->get_corpus())
13913 maybe_update_types_lookup_map<array_type_def::subrange_type>
13915 type_corpus->priv_->get_types().subrange_types());
13917 maybe_update_types_lookup_map<array_type_def::subrange_type>
13919 type_corpus->get_type_per_loc_map().subrange_types(),
13922 if (
corpus *group = subrange_type->get_corpus())
13924 maybe_update_types_lookup_map<array_type_def::subrange_type>
13926 group->priv_->get_types().subrange_types());
13928 maybe_update_types_lookup_map<array_type_def::subrange_type>
13930 group->get_type_per_loc_map().subrange_types(),
13953 (fn_type, tu->get_types().function_types());
13955 if (
corpus *type_corpus = fn_type->get_corpus())
13959 type_corpus->priv_->get_types().function_types());
13961 if (
corpus *group = fn_type->get_corpus())
13965 group->priv_->get_types().function_types());
14052 type_base_sptr result;
14060 type_base_sptr underlying_type =
14063 if (underlying_type)
14066 qual->get_cv_quals(),
14067 qual->get_location()));
14072 type_base_sptr pointed_to_type =
14075 if (pointed_to_type)
14078 p->get_size_in_bits(),
14079 p->get_alignment_in_bits(),
14080 p->get_location()));
14085 type_base_sptr pointed_to_type =
14087 if (pointed_to_type)
14091 r->get_size_in_bits(),
14092 r->get_alignment_in_bits(),
14093 r->get_location()));
14107 tu.priv_->synthesized_types_.push_back(result);
14140 type_base_sptr result_return_type;
14145 if (!result_return_type)
14149 type_base_sptr parm_type;
14151 for (function_type::parameters::const_iterator i =
14156 type_base_sptr t = (*i)->get_type();
14163 (*i)->get_location(),
14164 (*i)->get_variadic_marker(),
14165 (*i)->get_is_artificial()));
14166 parms.push_back(parm);
14169 class_or_union_sptr class_type;
14181 result_fn_type.reset(
new method_type(result_return_type,
14193 tu.priv_->synthesized_types_.push_back(result_fn_type);
14197 return result_fn_type;
14208 if (mangled_name.empty())
14213 char * str = abi::__cxa_demangle(mangled_name.c_str(),
14214 NULL, &l, &status);
14215 string demangled_name = mangled_name;
14219 demangled_name = str;
14223 return demangled_name;
14248 global_scope::~global_scope()
14253 maybe_propagate_canonical_type(
const type_base& lhs_type,
14254 const type_base& rhs_type);
14273 types_defined_same_linux_kernel_corpus_public(
const type_base& t1,
14274 const type_base& t2)
14276 const corpus *t1_corpus = t1.get_corpus(), *t2_corpus = t2.get_corpus();
14277 string t1_file_path, t2_file_path;
14281 if (!(t1_corpus && t2_corpus
14282 && t1_corpus == t2_corpus
14283 && (t1_corpus->get_origin() & corpus::LINUX_KERNEL_BINARY_ORIGIN)
14288 class_or_union *c1 = 0, *c2 = 0;
14294 if ((c1 && c1->get_is_anonymous() && !c1->get_naming_typedef())
14295 || (c2 && c2->get_is_anonymous() && !c2->get_naming_typedef()))
14302 && c1->get_is_anonymous() && c1->get_naming_typedef()
14303 && c2->get_is_anonymous() && c2->get_naming_typedef())
14304 if (c1->get_naming_typedef()->get_name()
14305 != c2->get_naming_typedef()->get_name())
14311 if (e1->get_is_anonymous() || e2->get_is_anonymous())
14321 if (c1->get_is_declaration_only() != c2->get_is_declaration_only())
14323 if (c1->get_environment().decl_only_class_equals_definition())
14333 if (t1.get_size_in_bits() != t2.get_size_in_bits())
14342 l = c1->get_location();
14344 l =
dynamic_cast<const decl_base&
>(t1).
get_location();
14346 unsigned line = 0, col = 0;
14348 l.
expand(t1_file_path, line, col);
14350 l = c2->get_location();
14352 l =
dynamic_cast<const decl_base&
>(t2).
get_location();
14354 l.
expand(t2_file_path, line, col);
14357 if (t1_file_path.empty() || t2_file_path.empty())
14360 if (t1_file_path == t2_file_path)
14396 compare_types_during_canonicalization(
const type_base& canonical_type,
14397 const type_base& candidate_type)
14399 #ifdef WITH_DEBUG_TYPE_CANONICALIZATION
14400 const environment& env = canonical_type.get_environment();
14401 if (env.debug_type_canonicalization_is_on())
14403 bool canonical_equality =
false, structural_equality =
false;
14404 env.priv_->use_canonical_type_comparison_ =
false;
14405 structural_equality = canonical_type == candidate_type;
14406 env.priv_->use_canonical_type_comparison_ =
true;
14407 canonical_equality = canonical_type == candidate_type;
14408 if (canonical_equality != structural_equality)
14410 std::cerr <<
"structural & canonical equality different for type: "
14411 << canonical_type.get_pretty_representation(
true,
true)
14415 return structural_equality;
14418 return canonical_type == candidate_type;
14442 compare_canonical_type_against_candidate(
const type_base& canonical_type,
14443 const type_base& candidate_type)
14445 environment& env =
const_cast<environment&
>(canonical_type.get_environment());
14463 bool saved_decl_only_class_equals_definition =
14464 env.decl_only_class_equals_definition();
14465 env.do_on_the_fly_canonicalization(
true);
14468 env.decl_only_class_equals_definition(
false);
14469 env.priv_->allow_type_comparison_results_caching(
true);
14470 bool equal = (types_defined_same_linux_kernel_corpus_public(canonical_type,
14472 || compare_types_during_canonicalization(canonical_type,
14477 env.priv_->allow_type_comparison_results_caching(
false);
14478 env.do_on_the_fly_canonicalization(
false);
14479 env.decl_only_class_equals_definition
14480 (saved_decl_only_class_equals_definition);
14505 compare_canonical_type_against_candidate(
const type_base* canonical_type,
14506 const type_base* candidate_type)
14508 return compare_canonical_type_against_candidate(*canonical_type,
14533 compare_canonical_type_against_candidate(
const type_base_sptr& canonical_type,
14534 const type_base_sptr& candidate_type)
14536 return compare_canonical_type_against_candidate(canonical_type.get(),
14537 candidate_type.get());
14563 type_base::get_canonical_type_for(type_base_sptr t)
14568 environment& env =
const_cast<environment&
>(t->get_environment());
14572 return type_base_sptr();
14578 bool decl_only_class_equals_definition =
14591 if (decl_only_class_equals_definition)
14592 if (class_or_union)
14593 if (class_or_union->get_is_declaration_only())
14594 return type_base_sptr();
14597 if (t->get_canonical_type())
14598 return t->get_canonical_type();
14606 || !class_or_union->get_is_anonymous()
14607 || class_or_union->get_linkage_name().empty());
14619 string repr = t->get_cached_pretty_representation(
true);
14624 type_base_sptr canonical_type_present_in_corpus;
14626 env.get_canonical_types_map();
14628 type_base_sptr result;
14629 environment::canonical_types_map_type::iterator i = types.find(repr);
14630 if (i == types.end())
14632 vector<type_base_sptr> v;
14639 vector<type_base_sptr> &v = i->second;
14646 for (vector<type_base_sptr>::const_reverse_iterator it = v.rbegin();
14650 bool equal = compare_canonical_type_against_candidate(*it, t);
14657 #ifdef WITH_DEBUG_SELF_COMPARISON
14658 if (env.self_comparison_debug_is_on())
14662 corpus_sptr corp1, corp2;
14663 env.get_self_comparison_debug_inputs(corp1, corp2);
14664 if (corp1 && corp2 && t->get_corpus() == corp2.get())
14675 check_canonical_type_from_abixml_during_self_comp(t,
14681 uintptr_t should_have_canonical_type = 0;
14682 string type_id = env.get_type_id_from_type(t.get());
14683 if (type_id.empty())
14684 type_id =
"type-id-<not-found>";
14686 should_have_canonical_type =
14687 env.get_canonical_type_from_type_id(type_id.c_str());
14688 std::cerr <<
"error: wrong canonical type for '"
14697 <<
"'. Should have had canonical type: "
14699 << should_have_canonical_type
14705 uintptr_t ptr_val =
reinterpret_cast<uintptr_t
>(t.get());
14706 string type_id = env.get_type_id_from_pointer(ptr_val);
14707 if (type_id.empty())
14708 type_id =
"type-id-<not-found>";
14725 std::cerr <<
"error: wrong induced canonical type for '"
14727 <<
"' from second corpus"
14728 <<
", ptr: " << std::hex << t.get()
14729 <<
" type-id: " << type_id
14768 maybe_adjust_canonical_type(
const type_base_sptr& canonical,
14769 const type_base_sptr& type)
14773 || type->get_naked_canonical_type()
14775 || type.get() == canonical.get())
14782 if (canonical_class)
14786 for (class_decl::member_functions::const_iterator i =
14787 cl->get_member_functions().begin();
14788 i != cl->get_member_functions().end();
14790 if ((*i)->get_symbol())
14793 find_member_function((*i)->get_linkage_name()))
14796 if (s1 && !m->get_symbol())
14819 if (type->get_is_artificial() != canonical->get_is_artificial())
14820 canonical->set_is_artificial(
false);
14844 if (t->get_canonical_type())
14845 return t->get_canonical_type();
14847 type_base_sptr canonical = type_base::get_canonical_type_for(t);
14848 maybe_adjust_canonical_type(canonical, t);
14850 t->priv_->canonical_type = canonical;
14851 t->priv_->naked_canonical_type = canonical.get();
14865 ABG_ASSERT(!t->priv_->canonical_type_propagated()
14866 || t->priv_->propagated_canonical_type_confirmed());
14869 if (type_base_sptr d =
is_type(cl->get_earlier_declaration()))
14870 if ((canonical = d->get_canonical_type()))
14872 d->priv_->canonical_type = canonical;
14873 d->priv_->naked_canonical_type = canonical.get();
14890 if (type_base_sptr c =
is_type(scope)->get_canonical_type())
14904 #ifdef WITH_DEBUG_CT_PROPAGATION
14913 env.priv_->erase_type_with_cleared_propagated_canonical_type(t.get());
14917 t->on_canonical_type_set();
14928 priv_->definition_of_declaration_ = d;
14930 if (type_base_sptr canonical_type =
is_type(d)->get_canonical_type())
14931 t->priv_->canonical_type = canonical_type;
14933 priv_->naked_definition_of_declaration_ =
const_cast<decl_base*
>(d.get());
14943 priv_(new
priv(s, a))
14955 {
return priv_->canonical_type.lock();}
14971 {
return priv_->naked_canonical_type;}
14996 return priv_->internal_cached_repr_;
15005 return priv_->cached_repr_;
15043 {
return equals(*
this, other, 0);}
15060 {priv_->size_in_bits = s;}
15067 {
return priv_->size_in_bits;}
15074 {priv_->alignment_in_bits = a;}
15081 {
return priv_->alignment_in_bits;}
15097 v.visit_begin(
this);
15098 bool result = v.visit_end(
this);
15104 type_base::~type_base()
15123 static_cast<unsigned>(r));
15138 static_cast<unsigned>(r));
15195 parse_integral_type_modifier(
const string& word,
15198 if (word ==
"signed")
15200 else if (word ==
"unsigned")
15202 else if (word ==
"short")
15204 else if (word ==
"long")
15206 else if (word ==
"long long")
15224 parse_base_integral_type(
const string& type_name,
15227 if (type_name ==
"int")
15229 else if (type_name ==
"char")
15231 else if (type_name ==
"bool" || type_name ==
"_Bool")
15233 else if (type_name ==
"double")
15235 else if (type_name ==
"float")
15237 else if (type_name ==
"char16_t")
15239 else if (type_name ==
"char32_t")
15241 else if (type_name ==
"wchar_t")
15266 string input = type_name;
15267 string::size_type len = input.length();
15268 string::size_type cur_pos = 0, prev_pos = 0;
15269 string cur_word, prev_word;
15272 while (cur_pos < len)
15274 if (cur_pos < len && isspace(input[cur_pos]))
15277 while (cur_pos < len && isspace(input[cur_pos]));
15279 prev_pos = cur_pos;
15280 cur_pos = input.find(
' ', prev_pos);
15281 prev_word = cur_word;
15282 cur_word = input.substr(prev_pos, cur_pos - prev_pos);
15285 && cur_word ==
"long"
15286 && prev_word !=
"long")
15288 if (cur_pos < len && isspace(input[cur_pos]))
15291 while (cur_pos < len && isspace(input[cur_pos]));
15292 prev_pos = cur_pos;
15294 cur_pos = input.find(
' ', prev_pos);
15295 string saved_prev_word = prev_word;
15296 prev_word = cur_word;
15297 cur_word = input.substr(prev_pos, cur_pos - prev_pos);
15298 if (cur_word ==
"long")
15299 cur_word =
"long long";
15302 cur_pos = prev_pos;
15303 cur_word = prev_word;
15304 prev_word = saved_prev_word;
15308 if (!parse_integral_type_modifier(cur_word, modifiers))
15310 if (!parse_base_integral_type(cur_word, base))
15348 : base_(INT_BASE_TYPE),
15349 modifiers_(NO_MODIFIER)
15358 : base_(b), modifiers_(m)
15366 : base_(INT_BASE_TYPE),
15367 modifiers_(NO_MODIFIER)
15385 {
return modifiers_;}
15402 {
return base_ == other.base_ && modifiers_ == other.modifiers_;}
15420 result +=
"signed ";
15422 result +=
"unsigned ";
15433 result +=
"short ";
15437 result +=
"long long ";
15448 result +=
"double";
15452 result +=
"char16_t";
15454 result +=
"char32_t";
15456 result +=
"wchar_t";
15466 integral_type::operator string()
const
15467 {
return to_string();}
15490 const string& name,
15491 size_t size_in_bits,
15492 size_t alignment_in_bits,
15494 const string& linkage_name,
15499 | ABSTRACT_TYPE_BASE
15500 | ABSTRACT_DECL_BASE),
15501 decl_base(env, name, locus, linkage_name, vis),
15502 type_base(env, size_in_bits, alignment_in_bits)
15513 string integral_type_name = int_type;
15547 bool result =
false;
15578 return *
this == *other;
15606 return *
this == other;
15652 if (l.get() == r.get())
15680 bool internal)
const
15704 if (decl_base::priv_->internal_qualified_name_.
empty())
15705 decl_base::priv_->internal_qualified_name_ =
15706 env.
intern(get_internal_integral_type_name(
this));
15707 return decl_base::priv_->internal_qualified_name_;
15711 decl_base::priv_->temporary_internal_qualified_name_ =
15712 env.
intern(get_internal_integral_type_name(
this));
15713 return decl_base::priv_->temporary_internal_qualified_name_;
15739 bool qualified_name)
const
15743 return get_internal_integral_type_name(
this);
15745 if (qualified_name)
15763 v.visit_begin(
this);
15764 bool result = v.visit_end(
this);
15770 type_decl::~type_decl()
15790 const string& name,
15791 size_t size_in_bits,
15792 size_t alignment_in_bits,
15796 ABSTRACT_SCOPE_TYPE_DECL
15797 | ABSTRACT_TYPE_BASE
15798 | ABSTRACT_DECL_BASE),
15800 type_base(env, size_in_bits, alignment_in_bits),
15869 return *
this == *other;
15893 if (v.visit_begin(
this))
15896 for (scope_decl::declarations::const_iterator i =
15900 if (!(*i)->traverse(v))
15905 bool result = v.visit_end(
this);
15911 scope_type_decl::~scope_type_decl()
15927 const string& name,
15938 | ABSTRACT_DECL_BASE
15939 | ABSTRACT_SCOPE_DECL),
15965 bool qualified_name)
const
16007 if (!ns->is_empty_or_has_empty_sub_namespaces())
16028 if (v.visit_begin(
this))
16031 scope_decl::declarations::const_iterator i;
16037 dynamic_pointer_cast<ir_traversable_base>(*i);
16039 if (!t->traverse (v))
16044 return v.visit_end(
this);
16047 namespace_decl::~namespace_decl()
16056 class qualified_type_def::priv
16067 weak_ptr<type_base> underlying_type_;
16070 : cv_quals_(CV_NONE)
16075 : cv_quals_(quals),
16076 underlying_type_(t)
16128 qualified_type_def::qualified_type_def(type_base_sptr type,
16133 | ABSTRACT_TYPE_BASE
16134 | ABSTRACT_DECL_BASE),
16135 type_base(type->get_environment(), type->get_size_in_bits(),
16136 type->get_alignment_in_bits()),
16137 decl_base(type->get_environment(),
"", locus,
"",
16138 dynamic_pointer_cast<
decl_base>(type)->get_visibility()),
16139 priv_(new priv(quals, type))
16158 | ABSTRACT_TYPE_BASE
16159 | ABSTRACT_DECL_BASE),
16163 priv_(new priv(quals))
16186 s = ut->get_size_in_bits();
16215 bool result =
true;
16282 return *
this == *other;
16300 return *
this == *other;
16315 bool internal)
const
16343 priv_->temporary_internal_name_ =
16345 return priv_->temporary_internal_name_;
16361 if (priv_->internal_name_.empty())
16362 priv_->internal_name_ =
16365 return priv_->internal_name_;
16394 if (v.visit_begin(
this))
16401 bool result = v.visit_end(
this);
16406 qualified_type_def::~qualified_type_def()
16413 {
return priv_->cv_quals_;}
16418 {priv_->cv_quals_ = cv_quals;}
16432 {
return priv_->underlying_type_.lock();}
16441 priv_->underlying_type_ = t;
16451 scope_decl::declarations::iterator i;
16452 if (s->find_iterator_for_member(
this, i))
16467 operator==(
const qualified_type_def_sptr& l,
const qualified_type_def_sptr& r)
16469 if (l.get() == r.get())
16485 operator!=(
const qualified_type_def_sptr& l,
const qualified_type_def_sptr& r)
16493 (
static_cast<unsigned>(lhs) |
static_cast<unsigned>(rhs));
16517 (
static_cast<unsigned>(lhs) &
static_cast<unsigned>(rhs));
16539 case qualified_type_def::CV_NONE:
16542 case qualified_type_def::CV_CONST:
16545 case qualified_type_def::CV_VOLATILE:
16548 case qualified_type_def::CV_RESTRICT:
16562 struct pointer_type_def::priv
16569 priv(
const type_base_sptr& t)
16571 naked_pointed_to_type_(t.get())
16575 : naked_pointed_to_type_()
16600 pointer_type_def::pointer_type_def(
const type_base_sptr& pointed_to,
16601 size_t size_in_bits,
16602 size_t align_in_bits,
16606 | ABSTRACT_TYPE_BASE
16607 | ABSTRACT_DECL_BASE),
16608 type_base(pointed_to->get_environment(), size_in_bits, align_in_bits),
16609 decl_base(pointed_to->get_environment(),
"", locus,
""),
16610 priv_(new priv(pointed_to))
16616 const environment& env = pointed_to->get_environment();
16617 decl_base_sptr pto = dynamic_pointer_cast<decl_base>(pointed_to);
16618 string name = (pto ? pto->get_name() : string(
"void")) +
"*";
16636 pointer_type_def::pointer_type_def(
const environment& env,
size_t size_in_bits,
16637 size_t alignment_in_bits,
16641 | ABSTRACT_TYPE_BASE
16642 | ABSTRACT_DECL_BASE),
16643 type_base(env, size_in_bits, alignment_in_bits),
16648 string name = string(
"void") +
"*";
16659 priv_->pointed_to_type_ = t;
16660 priv_->naked_pointed_to_type_ = t.get();
16665 decl_base_sptr pto = dynamic_pointer_cast<decl_base>(t);
16666 string name = (pto ? pto->get_name() : string(
"void")) +
"*";
16748 return *
this == *o;
16769 const type_base_sptr
16771 {
return priv_->pointed_to_type_.lock();}
16778 {
return priv_->naked_pointed_to_type_;}
16816 if (priv_->internal_qualified_name_.empty())
16817 if (pointed_to_type)
16818 priv_->internal_qualified_name_ =
16822 return priv_->internal_qualified_name_;
16830 if (pointed_to_type)
16831 priv_->temp_internal_qualified_name_ =
16835 return priv_->temp_internal_qualified_name_;
16855 if (pointed_to_type)
16881 if (v.visit_begin(
this))
16889 bool result = v.visit_end(
this);
16894 pointer_type_def::~pointer_type_def()
16911 if (l.get() == r.get())
16961 reference_type_def::reference_type_def(
const type_base_sptr pointed_to,
16963 size_t size_in_bits,
16964 size_t align_in_bits,
16968 | ABSTRACT_TYPE_BASE
16969 | ABSTRACT_DECL_BASE),
16970 type_base(pointed_to->get_environment(), size_in_bits, align_in_bits),
16971 decl_base(pointed_to->get_environment(),
"", locus,
""),
16978 decl_base_sptr pto = dynamic_pointer_cast<decl_base>(pointed_to);
16983 name = string(pto->get_name()) +
"&";
16991 const environment& env = pointed_to->get_environment();
16996 pointed_to->get_environment()));
17019 reference_type_def::reference_type_def(
const environment& env,
bool lvalue,
17020 size_t size_in_bits,
17021 size_t alignment_in_bits,
17025 | ABSTRACT_TYPE_BASE
17026 | ABSTRACT_DECL_BASE),
17027 type_base(env, size_in_bits, alignment_in_bits),
17032 string name =
"void&";
17047 pointed_to_type_ = pointed_to_type;
17049 decl_base_sptr pto;
17051 {pto = dynamic_pointer_cast<decl_base>(pointed_to_type);}
17058 string name = string(pto->get_name()) +
"&";
17088 if (l.is_lvalue() != r.is_lvalue())
17096 bool result = (l.get_pointed_to_type() == r.get_pointed_to_type());
17135 return *
this == *other;
17150 return *
this == *other;
17154 reference_type_def::get_pointed_to_type()
const
17155 {
return pointed_to_type_.lock();}
17158 reference_type_def::is_lvalue()
const
17159 {
return is_lvalue_;}
17218 bool qualified_name)
const
17222 (get_pointed_to_type()),
17246 if (v.visit_begin(
this))
17249 if (type_base_sptr t = get_pointed_to_type())
17254 bool result = v.visit_end(
this);
17259 reference_type_def::~reference_type_def()
17276 if (l.get() == r.get())
17304 array_type_def::subrange_type::~subrange_type() =
default;
17313 : s_(UNSIGNED_SIGNEDNESS)
17322 : s_(UNSIGNED_SIGNEDNESS)
17331 : s_(SIGNED_SIGNEDNESS)
17339 enum array_type_def::subrange_type::bound_value::signedness
17355 {
return v_.signed_;
17363 {
return v_.unsigned_;}
17371 s_ = UNSIGNED_SIGNEDNESS;
17381 s_ = SIGNED_SIGNEDNESS;
17393 return s_ == v.s_ && v_.unsigned_ == v.v_.unsigned_;
17398 struct array_type_def::subrange_type::priv
17408 : upper_bound_(ub), language_(l), infinite_(false)
17411 priv(bound_value lb, bound_value ub,
17413 : lower_bound_(lb), upper_bound_(ub),
17414 language_(l), infinite_(false)
17417 priv(bound_value lb, bound_value ub,
const type_base_sptr &u,
17419 : lower_bound_(lb), upper_bound_(ub), underlying_type_(u),
17420 language_(l), infinite_(false)
17439 const string& name,
17442 const type_base_sptr& utype,
17447 upper_bound.get_unsigned_value()
17448 - lower_bound.get_unsigned_value(),
17451 priv_(new priv(lower_bound, upper_bound, utype, l))
17471 const string& name,
17478 upper_bound.get_unsigned_value()
17479 - lower_bound.get_unsigned_value(), 0),
17481 priv_(new priv(lower_bound, upper_bound, l))
17499 const string& name,
17504 type_base(env, upper_bound.get_unsigned_value(), 0),
17506 priv_(new priv(upper_bound, l))
17517 {
return priv_->underlying_type_.lock();}
17526 ABG_ASSERT(priv_->underlying_type_.expired());
17527 priv_->underlying_type_ = u;
17535 {
return priv_->upper_bound_.get_signed_value();}
17542 {
return priv_->lower_bound_.get_signed_value();}
17549 {priv_->upper_bound_ = ub;}
17556 {priv_->lower_bound_ = lb;}
17573 if (get_upper_bound() >= get_lower_bound())
17574 return get_upper_bound() - get_lower_bound() + 1;
17583 {
return priv_->infinite_;}
17591 {priv_->infinite_ = f;}
17598 {
return priv_->language_;}
17606 std::ostringstream o;
17610 type_base_sptr underlying_type = get_underlying_type();
17611 if (underlying_type)
17613 o <<
"range "<< get_lower_bound() <<
" .. " << get_upper_bound();
17618 o <<
"[" << get_length() <<
"]";
17633 for (vector<subrange_sptr>::const_iterator i = v.begin();
17636 r += (*i)->as_string();
17665 bool result =
true;
17709 return *
this == *other;
17777 repr +=
"<anonymous range>";
17779 repr +=
"<range " +
get_name() +
">";
17780 repr += as_string();
17798 if (v.visit_begin(
this))
17801 if (type_base_sptr u = get_underlying_type())
17806 bool result = v.visit_end(
this);
17813 struct array_type_def::priv
17820 priv(type_base_sptr t)
17825 : element_type_(t), subranges_(subs)
17845 array_type_def::array_type_def(
const type_base_sptr e_type,
17846 const std::vector<subrange_sptr>& subs,
17850 | ABSTRACT_TYPE_BASE
17851 | ABSTRACT_DECL_BASE),
17854 priv_(new priv(e_type))
17878 const std::vector<subrange_sptr>& subs,
17882 | ABSTRACT_TYPE_BASE
17883 | ABSTRACT_DECL_BASE),
17897 array_type_def::update_size()
17899 type_base_sptr e = priv_->element_type_.lock();
17902 size_t s = e->get_size_in_bits();
17906 s *= sub->get_length();
17914 array_type_def::get_subrange_representation()
const
17929 get_type_representation(
const array_type_def& a,
bool internal)
17931 type_base_sptr e_type = a.get_element_type();
17937 std::ostringstream o;
17939 << a.get_subrange_representation()
17941 << e_type ? e_type->get_pretty_representation(
internal):string(
"void");
17951 + a.get_subrange_representation();
17956 + a.get_subrange_representation();
17983 {
return get_type_representation(*
this,
internal);}
18007 std::vector<array_type_def::subrange_sptr > this_subs = l.
get_subranges();
18008 std::vector<array_type_def::subrange_sptr > other_subs = r.
get_subranges();
18010 bool result =
true;
18011 if (this_subs.size() != other_subs.size())
18020 std::vector<array_type_def::subrange_sptr >::const_iterator i,j;
18021 for (i = this_subs.begin(), j = other_subs.begin();
18022 i != this_subs.end() && j != other_subs.end();
18069 std::vector<array_type_def::subrange_sptr > this_subs = l->
get_subranges();
18070 std::vector<array_type_def::subrange_sptr > other_subs = r->
get_subranges();
18072 if (this_subs.size() != other_subs.size())
18075 std::vector<array_type_def::subrange_sptr >::const_iterator i,j;
18076 for (i = this_subs.begin(), j = other_subs.begin();
18077 i != this_subs.end() && j != other_subs.end();
18087 if (*first_element_type != *second_element_type)
18099 const std::vector<subrange_sptr>& subranges =
18102 if (subranges.empty())
18103 return translation_unit::LANG_C11;
18104 return subranges.front()->get_language();
18123 return *
this == *other;
18129 const type_base_sptr
18131 {
return priv_->element_type_.lock();}
18147 priv_->element_type_ = element_type;
18158 for (
const auto &sub : subs)
18159 priv_->subranges_.push_back(sub);
18171 if (priv_->subranges_.empty())
18174 for (std::vector<shared_ptr<subrange_type> >::const_iterator i =
18175 priv_->subranges_.begin();
18176 i != priv_->subranges_.end();
18178 if ((*i)->is_infinite())
18185 array_type_def::get_dimension_count()
const
18186 {
return priv_->subranges_.size();}
18220 if (priv_->internal_qualified_name_.empty())
18221 priv_->internal_qualified_name_ =
18222 env.
intern(get_type_representation(*
this,
true));
18223 return priv_->internal_qualified_name_;
18227 priv_->temp_internal_qualified_name_ =
18228 env.
intern(get_type_representation(*
this,
true));
18229 return priv_->temp_internal_qualified_name_;
18267 if (v.visit_begin(
this))
18275 bool result = v.visit_end(
this);
18281 array_type_def::get_location()
const
18285 const std::vector<array_type_def::subrange_sptr>&
18287 {
return priv_->subranges_;}
18289 array_type_def::~array_type_def()
18296 class enum_type_decl::priv
18298 type_base_sptr underlying_type_;
18306 priv(type_base_sptr underlying_type,
18308 : underlying_type_(underlying_type),
18326 enum_type_decl::enum_type_decl(
const string& name,
18328 type_base_sptr underlying_type,
18330 const string& linkage_name,
18334 | ABSTRACT_TYPE_BASE
18335 | ABSTRACT_DECL_BASE),
18336 type_base(underlying_type->get_environment(),
18337 underlying_type->get_size_in_bits(),
18338 underlying_type->get_alignment_in_bits()),
18339 decl_base(underlying_type->get_environment(),
18340 name, locus, linkage_name, vis),
18341 priv_(new priv(underlying_type, enums))
18347 e->set_enum_type(
this);
18353 {
return priv_->underlying_type_;}
18358 {
return priv_->enumerators_;}
18363 {
return priv_->enumerators_;}
18384 bool qualified_name)
const
18386 string r =
"enum ";
18412 if (v.visit_begin(
this))
18420 bool result = v.visit_end(
this);
18442 bool result =
false;
18452 enum_type_decl::enumerators::const_iterator i, j;
18485 if (!(l.decl_base::operator==(r) && l.type_base::operator==(r)))
18490 if (!l.decl_base::operator==(r))
18492 if (!l.type_base::operator==(r))
18539 enumerators_values_are_equal(
const enum_type_decl::enumerator &enr,
18540 const enum_type_decl::enumerator &enl)
18541 {
return enr.get_value() == enl.get_value();}
18564 is_enumerator_value_present_in_enum(
const enum_type_decl::enumerator &enr,
18565 const enum_type_decl &enom,
18566 vector<enum_type_decl::enumerator>& redundant_enrs)
18568 bool found =
false;
18569 for (
const auto &e : enom.get_enumerators())
18570 if (enumerators_values_are_equal(e, enr))
18574 redundant_enrs.push_back(e);
18592 is_enumerator_value_redundant(
const enum_type_decl::enumerator &enr,
18593 const enum_type_decl &enom)
18595 vector<enum_type_decl::enumerator> redundant_enrs;
18596 if (is_enumerator_value_present_in_enum(enr, enom, redundant_enrs))
18598 if (!redundant_enrs.empty())
18626 bool result =
true;
18642 if (!!def1 != !!def2)
18672 if (!(def1->decl_base::operator==(*def2)
18673 && def1->type_base::operator==(*def2)))
18678 if (!def1->decl_base::operator==(*def2))
18680 if (!def1->type_base::operator==(*def2))
18730 if (!is_enumerator_present_in_enum(e, *def2)
18731 && (!is_enumerator_value_redundant(e, *def2)
18732 || !is_enumerator_value_redundant(e, *def1)))
18745 if (!is_enumerator_present_in_enum(e, *def1)
18746 && (!is_enumerator_value_redundant(e, *def1)
18747 || !is_enumerator_value_redundant(e, *def2)))
18789 return *
this == *other;
18804 if (l.get() == r.get())
18806 decl_base_sptr o = r;
18823 class enum_type_decl::enumerator::priv
18827 string qualified_name_;
18830 friend class enum_type_decl::enumerator;
18838 priv(
const string& name,
18840 enum_type_decl* e = 0)
18852 enum_type_decl::enumerator::~enumerator() =
default;
18863 : priv_(new priv(name, value))
18870 : priv_(new priv(other.
get_name(),
18872 other.get_enum_type()))
18897 bool names_equal =
true;
18899 return names_equal && (get_value() == other.
get_value());
18918 {
return priv_->name_;}
18936 if (priv_->qualified_name_.empty())
18938 priv_->qualified_name_ =
18939 get_enum_type()->get_qualified_name(
internal)
18943 return priv_->qualified_name_;
18951 {priv_->name_ = n;}
18959 {
return priv_->value_;}
18966 {priv_->value_= v;}
18973 {
return priv_->enum_type_;}
18980 {priv_->enum_type_ = e;}
18986 struct typedef_decl::priv
18989 string internal_qualified_name_;
18990 string temp_internal_qualified_name_;
18992 priv(
const type_base_sptr& t)
18993 : underlying_type_(t)
19008 typedef_decl::typedef_decl(
const string& name,
19009 const type_base_sptr underlying_type,
19011 const string& linkage_name,
19015 | ABSTRACT_TYPE_BASE
19016 | ABSTRACT_DECL_BASE),
19021 name, locus, linkage_name, vis),
19022 priv_(new priv(underlying_type))
19038 typedef_decl::typedef_decl(
const string& name,
19041 const string& mangled_name,
19045 | ABSTRACT_TYPE_BASE
19046 | ABSTRACT_DECL_BASE),
19049 decl_base(env, name, locus, mangled_name, vis),
19050 priv_(new priv(nullptr))
19111 bool result =
true;
19115 if (!(l.decl_base::operator==(r)))
19162 return *
this == *other;
19184 bool qualified_name)
const
19187 string result =
"typedef ";
19188 if (qualified_name)
19201 {
return priv_->underlying_type_.lock();}
19209 priv_->underlying_type_ = t;
19230 if (v.visit_begin(
this))
19238 bool result = v.visit_end(
this);
19243 typedef_decl::~typedef_decl()
19249 struct var_decl::priv
19262 priv(type_base_sptr t,
19265 naked_type_(t.get()),
19276 naked_type_ = t.get();
19293 var_decl::var_decl(
const string& name,
19294 type_base_sptr type,
19296 const string& linkage_name,
19300 VAR_DECL | ABSTRACT_DECL_BASE),
19301 decl_base(type->get_environment(), name, locus, linkage_name, vis),
19302 priv_(new priv(type, bind))
19310 const type_base_sptr
19312 {
return priv_->type_.lock();}
19319 {priv_->set_type(t);}
19330 {
return priv_->naked_type_;}
19337 {
return priv_->binding_;}
19344 {priv_->binding_ = b;}
19360 priv_->symbol_ = sym;
19375 {
return priv_->symbol_;}
19444 bool result =
true;
19457 else if (s0 && s0 != s1)
19465 bool symbols_are_equal = (s0 && s1 && result);
19467 if (symbols_are_equal)
19476 bool decl_bases_different = !l.decl_base::operator==(r);
19477 const_cast<var_decl&
>(l).set_qualified_name(n1);
19478 const_cast<var_decl&
>(r).set_qualified_name(n2);
19480 if (decl_bases_different)
19490 if (!l.decl_base::operator==(r))
19539 bool result =
true;
19575 return equals(*
this, *other, 0);
19590 if (priv_->id_.empty())
19595 sym_str = s->get_id_string();
19600 priv_->id_ = env.
intern(repr);
19601 if (!sym_str.empty())
19602 priv_->id_ = env.
intern(priv_->id_ +
"{" + sym_str +
"}");
19614 return hash_var(
this);
19679 result =
"static ";
19683 bool member_of_anonymous_class =
false;
19686 member_of_anonymous_class =
true;
19691 if (member_of_anonymous_class || !qualified_name)
19696 type_base_sptr et = t->get_element_type();
19700 result += decl->get_qualified_name(
internal)
19701 +
" " + name + t->get_subrange_representation();
19714 "",
true,
internal);
19720 "",
true,
internal);
19723 && (member_of_anonymous_class || !qualified_name))
19739 && (member_of_anonymous_class || !qualified_name))
19793 if (v.visit_begin(
this))
19796 if (type_base_sptr t =
get_type())
19800 return v.visit_end(
this);
19803 var_decl::~var_decl()
19818 priv_->cached_name_.clear();
19819 priv_->internal_cached_name_.clear();
19839 function_type::function_type(type_base_sptr return_type,
19841 size_t size_in_bits,
19842 size_t alignment_in_bits)
19844 FUNCTION_TYPE | ABSTRACT_TYPE_BASE),
19845 type_base(return_type->get_environment(), size_in_bits, alignment_in_bits),
19846 priv_(new
priv(parms, return_type))
19850 for (parameters::size_type i = 0, j = 1;
19851 i < priv_->parms_.size();
19854 if (i == 0 && priv_->parms_[i]->get_is_artificial())
19861 priv_->parms_[i]->set_index(j);
19872 function_type::function_type(type_base_sptr return_type,
19873 size_t size_in_bits,
size_t alignment_in_bits)
19875 FUNCTION_TYPE | ABSTRACT_TYPE_BASE),
19876 type_base(return_type->get_environment(), size_in_bits, alignment_in_bits),
19877 priv_(new
priv(return_type))
19892 size_t size_in_bits,
19893 size_t alignment_in_bits)
19895 type_base(env, size_in_bits, alignment_in_bits),
19907 {
return priv_->return_type_.lock();}
19915 {priv_->return_type_ = t;}
19924 {
return priv_->parms_;}
19967 for (parameters::size_type i = 0, j = 1;
19968 i < priv_->parms_.size();
19971 if (i == 0 && priv_->parms_[i]->get_is_artificial())
19978 priv_->parms_[i]->set_index(j);
19989 parm->set_index(priv_->parms_.size());
19990 priv_->parms_.push_back(parm);
20004 return (!priv_->parms_.empty()
20005 && priv_->parms_.back()->get_variadic_marker());
20037 #define RETURN(value) CACHE_AND_RETURN_COMPARISON_RESULT(value)
20046 bool cached_result =
false;
20049 return cached_result;
20054 bool result =
true;
20056 if (!l.type_base::operator==(r))
20067 l_class = m->get_class_type().get();
20070 r_class = m->get_class_type().get();
20074 if (!!l_class != !!r_class)
20084 != r_class->get_qualified_name()))
20101 bool compare_result_types =
true;
20102 string l_rt_name = l_return_type_decl
20105 string r_rt_name = r_return_type_decl
20111 (r_class && (r_class->get_qualified_name() == r_rt_name)))
20112 compare_result_types =
false;
20114 if (compare_result_types)
20140 if (l_rt_name != r_rt_name)
20149 vector<shared_ptr<function_decl::parameter> >::const_iterator i,j;
20190 function_type::parameters::const_iterator
20196 bool is_method =
dynamic_cast<const method_type*
>(
this);
20212 function_type::parameters::const_iterator
20239 if (priv_->internal_cached_name_.empty())
20240 priv_->internal_cached_name_ =
20242 return priv_->internal_cached_name_;
20246 priv_->temp_internal_cached_name_ =
20249 return priv_->temp_internal_cached_name_;
20256 if (priv_->cached_name_.empty())
20257 priv_->cached_name_ =
20259 return priv_->cached_name_;
20263 priv_->cached_name_ =
20265 return priv_->cached_name_;
20326 if (v.visit_begin(
this))
20329 bool keep_going =
true;
20333 if (!t->traverse(v))
20334 keep_going =
false;
20341 if (type_base_sptr parm_type = (*i)->get_type())
20342 if (!parm_type->traverse(v))
20347 return v.visit_end(
this);
20350 function_type::~function_type()
20356 struct method_type::priv
20358 class_or_union_wptr class_type_;
20386 method_type::method_type (type_base_sptr return_type,
20387 class_or_union_sptr class_type,
20388 const std::vector<function_decl::parameter_sptr>& p,
20390 size_t size_in_bits,
20391 size_t alignment_in_bits)
20393 METHOD_TYPE | ABSTRACT_TYPE_BASE | FUNCTION_TYPE),
20394 type_base(class_type->get_environment(), size_in_bits, alignment_in_bits),
20395 function_type(return_type, p, size_in_bits, alignment_in_bits),
20426 method_type::method_type(type_base_sptr return_type,
20427 type_base_sptr class_type,
20428 const std::vector<function_decl::parameter_sptr>& p,
20430 size_t size_in_bits,
20431 size_t alignment_in_bits)
20433 METHOD_TYPE | ABSTRACT_TYPE_BASE | FUNCTION_TYPE),
20434 type_base(class_type->get_environment(), size_in_bits, alignment_in_bits),
20435 function_type(return_type, p, size_in_bits, alignment_in_bits),
20451 size_t size_in_bits,
20452 size_t alignment_in_bits)
20454 type_base(env, size_in_bits, alignment_in_bits),
20474 method_type::method_type(class_or_union_sptr class_type,
20476 size_t size_in_bits,
20477 size_t alignment_in_bits)
20479 METHOD_TYPE | ABSTRACT_TYPE_BASE | FUNCTION_TYPE),
20480 type_base(class_type->get_environment(), size_in_bits, alignment_in_bits),
20483 alignment_in_bits),
20494 class_or_union_sptr
20496 {
return class_or_union_sptr(priv_->class_type_);}
20509 priv_->class_type_ = t;
20537 {priv_->is_const = f;}
20544 {
return priv_->is_const;}
20554 struct function_decl::priv
20556 bool declared_inline_;
20564 : declared_inline_(false),
20570 bool declared_inline,
20572 : declared_inline_(declared_inline),
20575 naked_type_(t.get())
20579 bool declared_inline,
20582 : declared_inline_(declared_inline),
20585 naked_type_(t.get()),
20607 bool declared_inline,
20609 const string& mangled_name,
20613 FUNCTION_DECL | ABSTRACT_DECL_BASE),
20644 type_base_sptr fn_type,
20645 bool declared_inline,
20647 const string& linkage_name,
20651 FUNCTION_DECL | ABSTRACT_DECL_BASE),
20652 decl_base(fn_type->get_environment(), name, locus, linkage_name, vis),
20653 priv_(new priv(dynamic_pointer_cast<
function_type>(fn_type),
20680 string result = mem_fn ?
"method ":
"function ";
20685 result +=
"virtual ";
20687 decl_base_sptr type;
20699 result += type->get_qualified_name(
internal) +
" ";
20733 result += mem_fn->
get_type()->get_class_type()->get_qualified_name()
20745 if (mem_fn && i != end)
20751 for (; i != end; ++i)
20754 if (parm.get() != first_parm.get())
20756 if (parm->get_variadic_marker()
20761 type_base_sptr type = parm->get_type();
20772 result +=
" const";
20783 function_decl::parameters::const_iterator
20789 bool is_method =
dynamic_cast<const method_decl*
>(
this);
20802 const shared_ptr<function_type>
20804 {
return priv_->type_.lock();}
20819 {
return priv_->naked_type_;}
20824 priv_->type_ = fn_type;
20825 priv_->naked_type_ = fn_type.get();
20842 priv_->symbol_ = sym;
20857 {
return priv_->symbol_;}
20860 function_decl::is_declared_inline()
const
20861 {
return priv_->declared_inline_;}
20864 function_decl::get_binding()
const
20865 {
return priv_->binding_;}
20868 const shared_ptr<type_base>
20870 {
return get_type()->get_return_type();}
20873 const std::vector<shared_ptr<function_decl::parameter> >&
20875 {
return get_type()->get_parameters();}
20882 {
get_type()->append_parameter(parm);}
20890 for (std::vector<shared_ptr<parameter> >::const_iterator i = parms.begin();
20909 is_declared_inline(),
20929 is_declared_inline(),
20963 bool result =
true;
20967 if (t0 == t1 || *t0 == *t1)
20993 else if (s0 && s0 != s1)
21004 bool symbols_are_equal = (s0 && s1 && result);
21006 if (symbols_are_equal)
21018 bool decl_bases_different = !l.decl_base::operator==(r);
21025 if (decl_bases_different)
21035 if (!l.decl_base::operator==(r))
21045 if (l.is_declared_inline() != r.is_declared_inline()
21046 || l.get_binding() != r.get_binding())
21103 return equals(*
this, *o, 0);
21127 return hash_fn(*
this);
21142 if (priv_->id_.empty())
21147 if (s->has_aliases())
21154 priv_->id_ = env.
intern(s->get_id_string());
21198 if (v.visit_begin(
this))
21201 if (type_base_sptr t =
get_type())
21205 return v.visit_end(
this);
21227 if (l.get() == r.get())
21250 struct function_decl::parameter::priv
21254 bool variadic_marker_;
21261 priv(type_base_sptr type,
21263 bool variadic_marker)
21266 variadic_marker_(variadic_marker)
21270 function_decl::parameter::parameter(
const type_base_sptr type,
21272 const string& name,
21273 const location& loc,
21275 : type_or_decl_base(type->get_environment(),
21276 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
21277 decl_base(type->get_environment(), name, loc),
21278 priv_(new priv(type, index, is_variadic))
21280 runtime_type_instance(
this);
21283 function_decl::parameter::parameter(
const type_base_sptr type,
21285 const string& name,
21286 const location& loc,
21288 bool is_artificial)
21289 : type_or_decl_base(type->get_environment(),
21290 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
21291 decl_base(type->get_environment(), name, loc),
21292 priv_(new priv(type, index, is_variadic))
21294 runtime_type_instance(
this);
21295 set_is_artificial(is_artificial);
21298 function_decl::parameter::parameter(
const type_base_sptr type,
21299 const string& name,
21300 const location& loc,
21302 bool is_artificial)
21303 : type_or_decl_base(type->get_environment(),
21304 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
21305 decl_base(type->get_environment(), name, loc),
21306 priv_(new priv(type, 0, is_variadic))
21308 runtime_type_instance(
this);
21309 set_is_artificial(is_artificial);
21312 function_decl::parameter::parameter(
const type_base_sptr type,
21315 : type_or_decl_base(type->get_environment(),
21316 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
21317 decl_base(type->get_environment(),
"", location()),
21318 priv_(new priv(type, index, variad))
21320 runtime_type_instance(
this);
21323 function_decl::parameter::~parameter() =
default;
21325 const type_base_sptr
21326 function_decl::parameter::get_type()
const
21327 {
return priv_->type_.lock();}
21354 if (get_variadic_marker()
21374 std::ostringstream o;
21375 o <<
"parameter-" << get_index();
21377 return env.
intern(o.str());
21381 function_decl::parameter::get_index()
const
21382 {
return priv_->index_;}
21385 function_decl::parameter::set_index(
unsigned i)
21386 {priv_->index_ = i;}
21390 function_decl::parameter::get_variadic_marker()
const
21391 {
return priv_->variadic_marker_;}
21417 bool result =
true;
21419 if ((l.get_variadic_marker() != r.get_variadic_marker())
21420 || (l.get_index() != r.get_index())
21421 || (!!l.get_type() != !!r.get_type()))
21426 if (l.get_index() != r.get_index())
21428 if (l.get_variadic_marker() != r.get_variadic_marker()
21429 || !!l.get_type() != !!r.get_type())
21438 if (l_type != r_type)
21456 function_decl::parameter::operator==(
const parameter& o)
const
21457 {
return equals(*
this, o, 0);}
21466 return function_decl::parameter::operator==(*p);
21512 if (v.visit_begin(
this))
21515 if (type_base_sptr t =
get_type())
21519 return v.visit_end(
this);
21530 return hash_fn_parm(
this);
21570 type_repr =
"void";
21576 string result = type_repr;
21577 string parm_name = get_name_id();
21579 if (!parm_name.empty())
21580 result +=
" " + parm_name;
21613 class_or_union::class_or_union(
const environment& env,
const string& name,
21614 size_t size_in_bits,
size_t align_in_bits,
21621 | ABSTRACT_DECL_BASE
21622 | ABSTRACT_SCOPE_TYPE_DECL
21623 | ABSTRACT_SCOPE_DECL),
21624 decl_base(env, name, locus, name, vis),
21625 type_base(env, size_in_bits, align_in_bits),
21629 for (member_types::iterator i = mem_types.begin();
21630 i != mem_types.end();
21641 for (member_functions::iterator i = member_fns.begin();
21642 i != member_fns.end();
21644 if (!
has_scope(static_pointer_cast<decl_base>(*i)))
21663 class_or_union::class_or_union(
const environment& env,
const string& name,
21664 size_t size_in_bits,
size_t align_in_bits,
21668 | ABSTRACT_DECL_BASE
21669 | ABSTRACT_SCOPE_TYPE_DECL
21670 | ABSTRACT_SCOPE_DECL),
21671 decl_base(env, name, locus, name, vis),
21672 type_base(env, size_in_bits, align_in_bits),
21685 class_or_union::class_or_union(
const environment& env,
const string& name,
21686 bool is_declaration_only)
21689 | ABSTRACT_DECL_BASE
21690 | ABSTRACT_SCOPE_TYPE_DECL
21691 | ABSTRACT_SCOPE_DECL),
21717 if (v.visit_begin(
this))
21726 if (!(*i)->traverse(v))
21736 if (!(*i)->traverse(v))
21746 if (!(*i)->traverse(v))
21753 for (member_function_templates::const_iterator i =
21757 if (!(*i)->traverse(v))
21764 for (member_class_templates::const_iterator i =
21768 if (!(*i)->traverse(v))
21776 bool result = v.visit_end(
this);
21805 type_base_sptr t =
is_type(decl);
21835 for (class_or_union::data_members::const_iterator it =
21924 if (t->get_is_anonymous())
21942 if (t->get_is_anonymous())
21960 if (t->get_is_anonymous())
21985 bool is_laid_out,
bool is_static,
21986 size_t offset_in_bits)
21990 priv_->data_members_.push_back(v);
22001 bool is_already_in =
false;
22002 for (data_members::const_iterator i =
22003 priv_->non_static_data_members_.begin();
22004 i != priv_->non_static_data_members_.end();
22008 is_already_in =
true;
22011 if (!is_already_in)
22012 priv_->non_static_data_members_.push_back(v);
22028 {
return priv_->data_members_;}
22043 if ((*i)->get_name() == name)
22055 if (
var_decl_sptr data_member = type->find_data_member(name))
22056 return data_member;
22070 if (!v->get_name().empty())
22078 if ((*it)->get_pretty_representation(
false,
true)
22079 == v->get_pretty_representation(
false,
true))
22106 if (v->get_name().empty())
22119 {
return priv_->non_static_data_members_;}
22137 bool is_static,
bool is_ctor,
22138 bool is_dtor,
bool is_const)
22150 priv_->member_functions_.push_back(f);
22154 if (!f->get_linkage_name().empty())
22155 priv_->mem_fns_map_[f->get_linkage_name()] = f;
22164 {
return priv_->member_functions_;}
22185 string_mem_fn_sptr_map_type::const_iterator i =
22186 priv_->mem_fns_map_.find(linkage_name);
22187 if (i == priv_->mem_fns_map_.end())
22189 return i->second.get();
22200 string_mem_fn_sptr_map_type::const_iterator i =
22201 priv_->mem_fns_map_.find(linkage_name);
22202 if (i == priv_->mem_fns_map_.end())
22228 string_mem_fn_ptr_map_type::const_iterator i =
22229 priv_->signature_2_mem_fn_map_.find(s);
22230 if (i == priv_->signature_2_mem_fn_map_.end())
22238 const member_function_templates&
22240 {
return priv_->member_function_templates_;}
22245 const member_class_templates&
22247 {
return priv_->member_class_templates_;}
22258 priv_->member_function_templates_.push_back(m);
22273 priv_->member_class_templates_.push_back(m);
22283 && priv_->data_members_.empty()
22284 && priv_->member_functions_.empty()
22285 && priv_->member_function_templates_.empty()
22286 && priv_->member_class_templates_.empty());
22305 else if (method_decl_sptr f = dynamic_pointer_cast<method_decl>(d))
22311 else if (member_function_template_sptr f =
22312 dynamic_pointer_cast<member_function_template>(d))
22314 else if (member_class_template_sptr c =
22315 dynamic_pointer_cast<member_class_template>(d))
22364 return *
this == *o;
22405 if (l_is_decl_only || r_is_decl_only)
22415 if (!def1 || !def2)
22419 && l_is_decl_only && r_is_decl_only
22460 if (!!def1 != !!def2)
22468 if (!(l.decl_base::operator==(r)
22469 && l.type_base::operator==(r)))
22480 bool val = *def1 == *def2;
22489 if (!(l.decl_base::operator==(r) && l.type_base::operator==(r)))
22496 if (types_defined_same_linux_kernel_corpus_public(l, r))
22504 #define RETURN(value) \
22505 return return_comparison_result(l, r, value, \
22512 bool result =
true;
22526 for (class_or_union::data_members::const_iterator
22540 || (*d0)->get_type() == (*d1)->get_type())
22567 for (member_function_templates::const_iterator
22572 ++fn_tmpl_it0, ++fn_tmpl_it1)
22573 if (**fn_tmpl_it0 != **fn_tmpl_it1)
22598 for (member_class_templates::const_iterator
22603 ++cl_tmpl_it0, ++cl_tmpl_it1)
22604 if (**cl_tmpl_it0 != **cl_tmpl_it1)
22632 const method_decl_sptr& method)
22654 old_type->get_parameters(),
22655 old_type->get_is_const(),
22656 old_type->get_size_in_bits(),
22657 old_type->get_alignment_in_bits()));
22663 method->is_declared_inline(),
22667 method->get_binding()));
22668 new_method->set_symbol(method->
get_symbol());
22671 class_type->add_member_function(new_method,
22680 t->add_member_function(new_method,
22793 maybe_propagate_canonical_type(
const type_base& lhs_type,
22797 #if WITH_DEBUG_TYPE_CANONICALIZATION
22798 if (!env.priv_->use_canonical_type_comparison_)
22805 if (env.priv_->propagate_ct(lhs_type, rhs_type))
22816 struct class_decl::priv
22819 unordered_map<string, base_spec_sptr> bases_map_;
22825 : is_struct_(false)
22866 size_t size_in_bits,
size_t align_in_bits,
22867 bool is_struct,
const location& locus,
22874 | ABSTRACT_TYPE_BASE
22875 | ABSTRACT_DECL_BASE
22876 | ABSTRACT_SCOPE_TYPE_DECL
22877 | ABSTRACT_SCOPE_DECL),
22878 decl_base(env, name, locus, name, vis),
22879 type_base(env, size_in_bits, align_in_bits),
22881 locus, vis, mbr_types, data_mbrs, mbr_fns),
22882 priv_(new priv(is_struct, bases))
22917 size_t size_in_bits,
size_t align_in_bits,
22918 bool is_struct,
const location& locus,
22924 | ABSTRACT_TYPE_BASE
22925 | ABSTRACT_DECL_BASE
22926 | ABSTRACT_SCOPE_TYPE_DECL
22927 | ABSTRACT_SCOPE_DECL),
22936 is_anonymous ? string() : name,
22938 type_base(env, size_in_bits, align_in_bits),
22940 locus, vis, mbr_types, data_mbrs, mbr_fns),
22941 priv_(new priv(is_struct, bases))
22963 size_t size_in_bits,
size_t align_in_bits,
22964 bool is_struct,
const location& locus,
22968 | ABSTRACT_TYPE_BASE
22969 | ABSTRACT_DECL_BASE
22970 | ABSTRACT_SCOPE_TYPE_DECL
22971 | ABSTRACT_SCOPE_DECL),
22972 decl_base(env, name, locus, name, vis),
22973 type_base(env, size_in_bits, align_in_bits),
22976 priv_(new priv(is_struct))
23000 size_t size_in_bits,
size_t align_in_bits,
23001 bool is_struct,
const location& locus,
23005 | ABSTRACT_TYPE_BASE
23006 | ABSTRACT_DECL_BASE
23007 | ABSTRACT_SCOPE_TYPE_DECL
23008 | ABSTRACT_SCOPE_DECL),
23017 is_anonymous ? string() : name,
23019 type_base(env, size_in_bits, align_in_bits),
23022 priv_(new priv(is_struct))
23038 bool is_struct,
bool is_declaration_only)
23041 | ABSTRACT_TYPE_BASE
23042 | ABSTRACT_DECL_BASE
23043 | ABSTRACT_SCOPE_TYPE_DECL
23044 | ABSTRACT_SCOPE_DECL),
23048 priv_(new priv(is_struct))
23063 for (class_decl::virtual_mem_fn_map_type::iterator i =
23064 priv_->virtual_mem_fns_map_.begin();
23065 i != priv_->virtual_mem_fns_map_.end();
23067 sort_virtual_member_functions(i->second);
23075 {priv_->is_struct_ = f;}
23082 {
return priv_->is_struct_;}
23090 priv_->bases_.push_back(b);
23091 priv_->bases_map_[b->get_base_class()->get_qualified_name()] = b;
23099 {
return priv_->bases_;}
23110 unordered_map<string, base_spec_sptr>::iterator i =
23111 priv_->bases_map_.find(qualified_name);
23113 if (i != priv_->bases_map_.end())
23114 return i->second->get_base_class();
23125 {
return priv_->virtual_mem_fns_;}
23144 {
return priv_->virtual_mem_fns_map_;}
23149 {sort_virtual_member_functions(priv_->virtual_mem_fns_);}
23170 bool qualified_name)
const
23172 string cl =
"class ";
23181 if (
internal && !
get_name().empty())
23189 string result = cl;
23190 if (qualified_name)
23199 class_decl::insert_member_decl(decl_base_sptr d)
23201 if (method_decl_sptr f = dynamic_pointer_cast<method_decl>(d))
23216 struct class_decl::base_spec::priv
23219 long offset_in_bits_;
23223 long offset_in_bits,
23226 offset_in_bits_(offset_in_bits),
23227 is_virtual_(is_virtual)
23245 long offset_in_bits,
23248 ABSTRACT_DECL_BASE),
23250 base->get_linkage_name(), base->get_visibility()),
23252 priv_(new priv(base, offset_in_bits, is_virtual))
23264 {
return priv_->base_class_.lock();}
23271 {
return priv_->is_virtual_;}
23278 {
return priv_->offset_in_bits_;}
23308 if (v.visit_begin(
this))
23311 get_base_class()->traverse(v);
23315 return v.visit_end(
this);
23335 class_decl::base_spec::base_spec(
const type_base_sptr& base,
23337 long offset_in_bits,
23340 ABSTRACT_DECL_BASE),
23346 priv_(new priv(dynamic_pointer_cast<
class_decl>(base),
23353 class_decl::base_spec::~base_spec() =
default;
23379 if (!l.member_base::operator==(r))
23405 return equals(*
this, *o, 0);
23426 mem_fn_context_rel::~mem_fn_context_rel()
23446 method_decl::method_decl(
const string& name,
23448 bool declared_inline,
23450 const string& linkage_name,
23455 | ABSTRACT_DECL_BASE
23459 declared_inline, locus, linkage_name, vis, bind)
23483 method_decl::method_decl(
const string& name,
23485 bool declared_inline,
23487 const string& linkage_name,
23492 | ABSTRACT_DECL_BASE
23494 decl_base(type->get_environment(), name, locus, linkage_name, vis),
23497 declared_inline, locus, linkage_name, vis, bind)
23520 method_decl::method_decl(
const string& name,
23521 type_base_sptr type,
23522 bool declared_inline,
23524 const string& linkage_name,
23529 | ABSTRACT_DECL_BASE
23531 decl_base(type->get_environment(), name, locus, linkage_name, vis),
23534 declared_inline, locus, linkage_name, vis, bind)
23552 class_or_union_sptr cl = t->get_class_type();
23554 cl->priv_->mem_fns_map_[l] = m;
23558 method_decl::~method_decl()
23595 if (l.get() == r.get())
23648 {
return dynamic_pointer_cast<method_decl>(d);}
23652 struct virtual_member_function_less_than
23676 if (f_offset != s_offset)
return f_offset < s_offset;
23684 if ((!f_sym) != (!s_sym))
return !f_sym;
23685 if (f_sym && s_sym)
23687 fn = f_sym->get_id_string();
23688 sn = s_sym->get_id_string();
23689 if (fn != sn)
return fn < sn;
23695 if (fn != sn)
return fn < sn;
23701 if (fn != sn)
return fn < sn;
23705 string fn_filepath, sn_filepath;
23706 unsigned line = 0, column = 0;
23709 fn_loc.
expand(fn_filepath, line, column);
23711 sn_loc.expand(sn_filepath, line, column);
23712 return fn_filepath < sn_filepath;
23727 operator()(
const method_decl_sptr f,
23728 const method_decl_sptr s)
23729 {
return operator()(*f, *s);}
23738 virtual_member_function_less_than lt;
23739 std::stable_sort(mem_fns.begin(), mem_fns.end(), lt);
23768 size_t vtable_offset,
23769 bool is_static,
bool is_ctor,
23770 bool is_dtor,
bool is_const)
23773 is_dtor, is_const);
23781 sort_virtual_member_functions(klass->priv_->virtual_mem_fns_);
23800 class_decl::member_functions::const_iterator m;
23801 for (m = klass->priv_->virtual_mem_fns_.begin();
23802 m != klass->priv_->virtual_mem_fns_.end();
23804 if (m->get() == method.get())
23806 if (m == klass->priv_->virtual_mem_fns_.end())
23807 klass->priv_->virtual_mem_fns_.push_back(method);
23815 class_decl::virtual_mem_fn_map_type::iterator i =
23816 klass->priv_->virtual_mem_fns_map_.find(voffset);
23817 if (i == klass->priv_->virtual_mem_fns_map_.end())
23820 virtual_mem_fns_at_voffset.push_back(method);
23821 klass->priv_->virtual_mem_fns_map_[voffset] = virtual_mem_fns_at_voffset;
23825 for (m = i->second.begin() ; m != i->second.end(); ++m)
23826 if (m->get() == method.get())
23828 if (m == i->second.end())
23829 i->second.push_back(method);
23858 if ((*b)->get_is_virtual()
23859 || (*b)->get_base_class()->has_virtual_bases())
23888 ssize_t offset = -1;
23889 for (class_decl::virtual_mem_fn_map_type::const_iterator e =
23893 if (e->first > offset)
23906 return hash_class(
this);
23919 methods_equal_modulo_elf_symbol(
const method_decl_sptr& f,
23920 const method_decl_sptr& s)
23922 method_decl_sptr first = f, second = s;
23924 first->get_symbol();
23926 second->get_symbol();
23928 first->get_linkage_name();
23930 second->get_linkage_name();
23933 first->set_linkage_name(
"");
23935 second->set_linkage_name(
"");
23937 bool equal = *first == *second;
23939 first->set_symbol(saved_first_elf_symbol);
23940 first->set_linkage_name(saved_first_linkage_name);
23941 second->set_symbol(saved_second_elf_symbol);
23942 second->set_linkage_name(saved_second_linkage_name);
23963 method_matches_at_least_one_in_vector(
const method_decl_sptr& method,
23966 for (class_decl::member_functions::const_iterator i = fns.begin();
23975 if (methods_equal_modulo_elf_symbol(method, *i))
23991 maybe_cancel_propagated_canonical_type(
const class_or_union& t)
23993 const environment& env = t.get_environment();
23994 if (env.do_on_the_fly_canonicalization())
23995 if (
is_type(&t)->priv_->canonical_type_propagated())
23997 is_type(&t)->priv_->clear_propagated_canonical_type();
23998 env.priv_->remove_from_types_with_non_confirmed_propagated_ct(&t);
24031 bool result =
false;
24032 if (l.
get_environment().priv_->is_type_comparison_cached(l, r, result))
24044 bool result =
true;
24058 if (!had_canonical_type)
24059 maybe_cancel_propagated_canonical_type(r);
24065 #define RETURN(value) CACHE_AND_RETURN_COMPARISON_RESULT(value)
24077 for (class_decl::base_specs::const_iterator
24089 (*b1)->get_base_class().get()))
24135 for (class_decl::virtual_mem_fn_map_type::const_iterator first_v_fn_entry =
24138 ++first_v_fn_entry)
24140 unsigned voffset = first_v_fn_entry->first;
24142 first_v_fn_entry->second;
24144 const class_decl::virtual_mem_fn_map_type::const_iterator
24156 second_v_fn_entry->second;
24158 bool matches =
false;
24159 for (class_decl::member_functions::const_iterator i =
24160 first_vfns.begin();
24161 i != first_vfns.end();
24163 if (method_matches_at_least_one_in_vector(*i, second_vfns))
24253 return *
this == *o;
24297 if (l.get() == r.get())
24329 operator==(
const class_or_union_sptr& l,
const class_or_union_sptr& r)
24331 if (l.get() == r.get())
24348 operator!=(
const class_or_union_sptr& l,
const class_or_union_sptr& r)
24368 if (v.visit_begin(
this))
24377 if (!(*i)->traverse(v))
24388 if (!(*i)->traverse(v))
24398 if (!(*i)->traverse(v))
24408 if (!(*i)->traverse(v))
24415 for (member_function_templates::const_iterator i =
24419 if (!(*i)->traverse(v))
24426 for (member_class_templates::const_iterator i =
24430 if (!(*i)->traverse(v))
24438 bool result = v.visit_end(
this);
24447 context_rel::~context_rel()
24451 member_base::operator==(
const member_base& o)
const
24471 if (l.get() == r.get())
24476 return *l ==
static_cast<const decl_base&
>(*r);
24515 {
return dynamic_pointer_cast<class_decl::base_spec>(tod);}
24518 member_function_template::operator==(
const member_base& other)
const
24525 if (!(is_constructor() == o.is_constructor()
24526 && is_const() == o.is_const()
24527 && member_base::operator==(o)))
24534 return ftdecl->function_tdecl::operator==(*other_ftdecl);
24553 const member_function_template_sptr& r)
24555 if (l.get() == r.get())
24574 const member_function_template_sptr& r)
24591 if (v.visit_begin(
this))
24598 return v.visit_end(
this);
24614 if (!member_base::operator==(o))
24617 return as_class_tdecl()->class_tdecl::operator==(o);
24631 if (!decl_base::operator==(other))
24633 return as_class_tdecl()->class_tdecl::operator==(other);
24647 return *
this == *o;
24660 const member_class_template_sptr& r)
24662 if (l.get() == r.get())
24680 const member_class_template_sptr& r)
24697 if (v.visit_begin(
this))
24704 return v.visit_end(
this);
24724 case private_access:
24727 case protected_access:
24730 case public_access:
24754 c->set_is_static(s);
24764 for (class_decl::data_members::iterator i =
24765 cl->priv_->non_static_data_members_.begin();
24766 i != cl->priv_->non_static_data_members_.end();
24769 if ((*i)->get_name() == v->get_name())
24771 cl->priv_->non_static_data_members_.erase(i);
24777 bool is_already_in_non_static_data_members =
false;
24778 for (class_or_union::data_members::iterator i =
24779 cl->priv_->non_static_data_members_.begin();
24780 i != cl->priv_->non_static_data_members_.end();
24783 if ((*i)->get_name() == v->get_name())
24785 is_already_in_non_static_data_members =
true;
24789 if (!is_already_in_non_static_data_members)
24793 for (class_or_union::data_members::const_iterator i =
24794 cl->priv_->data_members_.begin();
24795 i != cl->priv_->data_members_.end();
24798 if ((*i)->get_name() == v->get_name())
24805 cl->priv_->non_static_data_members_.push_back(var);
24846 size_t size_in_bits,
const location& locus,
24851 | ABSTRACT_TYPE_BASE
24852 | ABSTRACT_DECL_BASE),
24853 decl_base(env, name, locus, name, vis),
24856 locus, vis, mbr_types, data_mbrs, member_fns)
24882 size_t size_in_bits,
const location& locus,
24888 | ABSTRACT_TYPE_BASE
24889 | ABSTRACT_DECL_BASE),
24898 is_anonymous ? string() : name,
24902 locus, vis, mbr_types, data_mbrs, member_fns)
24920 size_t size_in_bits,
const location& locus,
24924 | ABSTRACT_TYPE_BASE
24925 | ABSTRACT_DECL_BASE
24926 | ABSTRACT_SCOPE_TYPE_DECL
24927 | ABSTRACT_SCOPE_DECL),
24928 decl_base(env, name, locus, name, vis),
24951 size_t size_in_bits,
const location& locus,
24955 | ABSTRACT_TYPE_BASE
24956 | ABSTRACT_DECL_BASE
24957 | ABSTRACT_SCOPE_TYPE_DECL
24958 | ABSTRACT_SCOPE_DECL),
24967 is_anonymous ? string() : name,
24986 const string& name,
24987 bool is_declaration_only)
24990 | ABSTRACT_TYPE_BASE
24991 | ABSTRACT_DECL_BASE
24992 | ABSTRACT_SCOPE_TYPE_DECL
24993 | ABSTRACT_SCOPE_DECL),
25020 bool qualified_name)
const
25025 if (
internal && !
get_name().empty())
25026 repr = string(
"union ") +
25036 if (qualified_name)
25073 return *
this == *o;
25087 return *
this == *o;
25120 if (v.visit_begin(
this))
25129 if (!(*i)->traverse(v))
25139 if (!(*i)->traverse(v))
25149 if (!(*i)->traverse(v))
25156 for (member_function_templates::const_iterator i =
25160 if (!(*i)->traverse(v))
25167 for (member_class_templates::const_iterator i =
25171 if (!(*i)->traverse(v))
25179 bool result = v.visit_end(
this);
25218 bool result =
false;
25219 if (l.
get_environment().priv_->is_type_comparison_cached(l, r, result))
25240 const method_decl_sptr& f)
25255 const class_or_union_sptr t = union_type;
25270 if (l.get() == r.get())
25294 class template_decl::priv
25298 std::list<template_parameter_sptr> parms_;
25311 {priv_->parms_.push_back(p);}
25317 const std::list<template_parameter_sptr>&
25319 {
return priv_->parms_;}
25332 const string& name,
25357 return *
this == *other;
25370 list<shared_ptr<template_parameter> >::const_iterator t0, t1;
25396 class template_parameter::priv
25402 mutable bool hashing_started_;
25403 mutable bool comparison_started_;
25411 template_decl_(enclosing_template_decl),
25412 hashing_started_(),
25413 comparison_started_()
25417 template_parameter::template_parameter(
unsigned index,
25419 : priv_(new priv(index, enclosing_template))
25423 template_parameter::get_index()
const
25424 {
return priv_->index_;}
25427 template_parameter::get_enclosing_template_decl()
const
25428 {
return priv_->template_decl_.lock();}
25431 template_parameter::get_hashing_has_started()
const
25432 {
return priv_->hashing_started_;}
25435 template_parameter::set_hashing_has_started(
bool f)
const
25436 {priv_->hashing_started_ = f;}
25441 if (get_index() != o.get_index())
25444 if (priv_->comparison_started_)
25447 bool result =
false;
25452 priv_->comparison_started_ =
true;
25454 if (!!get_enclosing_template_decl() != !!o.get_enclosing_template_decl())
25456 else if (get_enclosing_template_decl()
25457 && (*get_enclosing_template_decl()
25458 != *o.get_enclosing_template_decl()))
25463 priv_->comparison_started_ =
false;
25483 class type_tparameter::priv
25498 type_tparameter::type_tparameter(
unsigned index,
25500 const string& name,
25504 | ABSTRACT_TYPE_BASE
25506 decl_base(enclosing_tdecl->get_environment(), name, locus),
25507 type_base(enclosing_tdecl->get_environment(), 0, 0),
25508 type_decl(enclosing_tdecl->get_environment(), name, 0, 0, locus),
25523 if (!type_decl::operator==(other))
25543 if (!type_decl::operator==(other))
25563 if (!decl_base::operator==(other))
25599 {
return *
this ==
static_cast<const type_base&
>(other);}
25601 type_tparameter::~type_tparameter()
25605 class non_type_tparameter::priv
25615 priv(type_base_sptr type)
25633 non_type_tparameter::non_type_tparameter(
unsigned index,
25635 const string& name,
25636 type_base_sptr type,
25639 decl_base(type->get_environment(), name, locus,
""),
25641 priv_(new priv(type))
25649 const type_base_sptr
25651 {
return priv_->type_.lock();}
25660 return hash_tparm(
this);
25666 if (!decl_base::operator==(other))
25673 return (template_parameter::operator==(o)
25692 non_type_tparameter::~non_type_tparameter()
25698 class template_tparameter::priv
25712 template_tparameter::template_tparameter(
unsigned index,
25714 const string& name,
25718 | ABSTRACT_TYPE_BASE
25720 decl_base(enclosing_tdecl->get_environment(), name, locus),
25721 type_base(enclosing_tdecl->get_environment(), 0, 0),
25722 type_decl(enclosing_tdecl->get_environment(), name,
25723 0, 0, locus, name, VISIBILITY_DEFAULT),
25725 template_decl(enclosing_tdecl->get_environment(), name, locus),
25743 return (type_tparameter::operator==(o)
25762 return (type_tparameter::operator==(o)
25776 return *
this ==
static_cast<const type_base&
>(other);
25795 template_tparameter::~template_tparameter()
25803 class type_composition::priv
25827 type_composition::type_composition(
unsigned index,
25831 ABSTRACT_DECL_BASE),
25842 const type_base_sptr
25844 {
return priv_->type_.lock();}
25851 {priv_->type_ = t;}
25860 return hash_type_composition(
this);
25863 type_composition::~type_composition()
25872 class function_tdecl::priv
25884 : pattern_(pattern), binding_(bind)
25911 | ABSTRACT_SCOPE_DECL),
25915 priv_(new priv(bind))
25939 | ABSTRACT_SCOPE_DECL),
25944 priv_(new priv(pattern, bind))
25955 priv_->pattern_ = p;
25965 {
return priv_->pattern_;}
25972 {
return priv_->binding_;}
25984 return *
this == *o;
25998 return *
this == *o;
26011 && template_decl::operator==(o)
26012 && scope_decl::operator==(o)
26036 if (!v.visit_begin(
this))
26043 return v.visit_end(
this);
26046 function_tdecl::~function_tdecl()
26054 class class_tdecl::priv
26065 : pattern_(pattern)
26084 | ABSTRACT_SCOPE_DECL),
26109 | ABSTRACT_SCOPE_DECL),
26114 priv_(new priv(pattern))
26125 priv_->pattern_ = p;
26135 {
return priv_->pattern_;}
26144 if (!(template_decl::operator==(o)
26145 && scope_decl::operator==(o)
26164 return *
this ==
static_cast<const decl_base&
>(o);
26172 {
return *
this ==
static_cast<const decl_base&
>(o);}
26188 if (v.visit_begin(
this))
26192 pattern->traverse(v);
26195 return v.visit_end(
this);
26198 class_tdecl::~class_tdecl()
26209 non_canonicalized_subtype_detector();
26212 non_canonicalized_subtype_detector(
type_base* type)
26214 has_non_canonical_type_()
26223 has_non_canonical_type()
const
26224 {
return has_non_canonical_type_;}
26229 visit_begin(function_decl* f)
26247 visit_begin(type_base* t)
26251 if (!t->get_canonical_type())
26255 has_non_canonical_type_ = t;
26270 visit_end(type_base* )
26272 if (has_non_canonical_type_)
26289 non_canonicalized_subtype_detector v(t.get());
26291 return v.has_non_canonical_type();
26307 const type_base_sptr t_v2)
26314 return (t1 != t2 && repr1 == repr2);
26325 env.priv_->extra_live_types_.push_back(t);
26361 string repr = v->get_pretty_representation(
true);
26362 std::hash<string> hash_string;
26363 h = hashing::combine_hashes(h, hash_string(repr));
26370 string repr = f->get_pretty_representation(
true);
26371 std::hash<string> hash_string;
26372 h = hashing::combine_hashes(h, hash_string(repr));
26377 type_base_sptr parm_type = p->get_type();
26379 std::hash<bool> hash_bool;
26380 std::hash<unsigned> hash_unsigned;
26382 h = hashing::combine_hashes(h, hash_unsigned(p->get_index()));
26383 h = hashing::combine_hashes(h, hash_bool(p->get_variadic_marker()));
26389 std::hash<size_t> hash_size;
26390 std::hash<bool> hash_bool;
26391 type_base_sptr type = bs->get_base_class();
26393 h = hashing::combine_hashes(h, hash_member(*bs));
26394 h = hashing::combine_hashes(h, hash_size(bs->get_offset_in_bits()));
26395 h = hashing::combine_hashes(h, hash_bool(bs->get_is_virtual()));
26402 result = d->get_hash();
26427 {
return hash_as_canonical_type_or_constant(t);}
26487 exemplar =
const_cast<type_base*
>(type);
26516 hash_as_canonical_type_or_constant(
const type_base *t)
26523 if (!canonical_type)
26541 if (canonical_type)
26542 return reinterpret_cast<size_t>(canonical_type);
26617 const type_base_sptr& second,
26618 bool indirect_type)
26650 bool indirect_type)
26652 if (!!first != !!second)
26664 if (
typeid(*first) !=
typeid(*second))
26680 if (ty1->is_lvalue() != ty2->is_lvalue())
26683 ty2->get_pointed_to_type(),
26690 if (!indirect_type)
26694 return ty1->get_name() == ty2->
get_name();
26700 if (!indirect_type)
26704 return (
get_name(ty1->get_underlying_type())
26712 && ty1->get_name() != ty2->
get_name())
26715 if (!indirect_type)
26718 || (ty1->get_non_static_data_members().size()
26722 for (class_or_union::data_members::const_iterator
26723 i = ty1->get_non_static_data_members().begin(),
26725 (i != ty1->get_non_static_data_members().end()
26732 dm2->get_type().get(),
26745 && ty1->get_name() != ty2->
get_name())
26748 if (!indirect_type)
26758 if (!indirect_type)
26761 || ty1->get_dimension_count() != ty2->get_dimension_count())
26795 if (ty1->get_parameters().size() != ty2->
get_parameters().size())
26798 for (function_type::parameters::const_iterator
26799 i = ty1->get_parameters().begin(),
26801 (i != ty1->get_parameters().end()
26831 const char* dm_name)
26853 unsigned parm_index)
26860 if (parms.size() <= parm_index)
26863 return parms[parm_index].get();
26878 std::ostringstream o;
26881 o <<
"unnamed-enum";
26885 o <<
"-underlying-type-" << size;
26905 return data_member;
26925 for (; d != e; ++d)
26941 struct ir_node_visitor::priv
26956 ir_node_visitor::~ir_node_visitor() =
default;
26965 {priv_->allow_visiting_already_visited_type_node = f;}
26974 {
return priv_->allow_visiting_already_visited_type_node;}
26994 size_t canonical_ptr_value =
reinterpret_cast<size_t>(canonical_type);
26995 priv_->visited_ir_nodes.insert(canonical_ptr_value);
27008 {priv_->visited_ir_nodes.clear();}
27028 size_t ptr_value =
reinterpret_cast<size_t>(canonical_type);
27029 pointer_set::iterator it = priv_->visited_ir_nodes.find(ptr_value);
27030 if (it == priv_->visited_ir_nodes.end())
27037 ir_node_visitor::visit_begin(
decl_base*)
27045 ir_node_visitor::visit_begin(scope_decl*)
27049 ir_node_visitor::visit_end(scope_decl*)
27053 ir_node_visitor::visit_begin(type_base*)
27057 ir_node_visitor::visit_end(type_base*)
27061 ir_node_visitor::visit_begin(scope_type_decl* t)
27062 {
return visit_begin(
static_cast<type_base*
>(t));}
27065 ir_node_visitor::visit_end(scope_type_decl* t)
27066 {
return visit_end(
static_cast<type_base*
>(t));}
27069 ir_node_visitor::visit_begin(type_decl* t)
27070 {
return visit_begin(
static_cast<type_base*
>(t));}
27073 ir_node_visitor::visit_end(type_decl* t)
27074 {
return visit_end(
static_cast<type_base*
>(t));}
27077 ir_node_visitor::visit_begin(namespace_decl* d)
27078 {
return visit_begin(
static_cast<decl_base*
>(d));}
27081 ir_node_visitor::visit_end(namespace_decl* d)
27082 {
return visit_end(
static_cast<decl_base*
>(d));}
27085 ir_node_visitor::visit_begin(qualified_type_def* t)
27086 {
return visit_begin(
static_cast<type_base*
>(t));}
27089 ir_node_visitor::visit_end(qualified_type_def* t)
27090 {
return visit_end(
static_cast<type_base*
>(t));}
27093 ir_node_visitor::visit_begin(pointer_type_def* t)
27094 {
return visit_begin(
static_cast<type_base*
>(t));}
27097 ir_node_visitor::visit_end(pointer_type_def* t)
27098 {
return visit_end(
static_cast<type_base*
>(t));}
27101 ir_node_visitor::visit_begin(reference_type_def* t)
27102 {
return visit_begin(
static_cast<type_base*
>(t));}
27105 ir_node_visitor::visit_end(reference_type_def* t)
27106 {
return visit_end(
static_cast<type_base*
>(t));}
27109 ir_node_visitor::visit_begin(array_type_def* t)
27110 {
return visit_begin(
static_cast<type_base*
>(t));}
27113 ir_node_visitor::visit_end(array_type_def* t)
27114 {
return visit_end(
static_cast<type_base*
>(t));}
27117 ir_node_visitor::visit_begin(array_type_def::subrange_type* t)
27118 {
return visit_begin(
static_cast<type_base*
>(t));}
27121 ir_node_visitor::visit_end(array_type_def::subrange_type* t)
27122 {
return visit_end(
static_cast<type_base*
>(t));}
27125 ir_node_visitor::visit_begin(enum_type_decl* t)
27126 {
return visit_begin(
static_cast<type_base*
>(t));}
27129 ir_node_visitor::visit_end(enum_type_decl* t)
27130 {
return visit_end(
static_cast<type_base*
>(t));}
27133 ir_node_visitor::visit_begin(typedef_decl* t)
27134 {
return visit_begin(
static_cast<type_base*
>(t));}
27137 ir_node_visitor::visit_end(typedef_decl* t)
27138 {
return visit_end(
static_cast<type_base*
>(t));}
27141 ir_node_visitor::visit_begin(function_type* t)
27142 {
return visit_begin(
static_cast<type_base*
>(t));}
27145 ir_node_visitor::visit_end(function_type* t)
27146 {
return visit_end(
static_cast<type_base*
>(t));}
27149 ir_node_visitor::visit_begin(var_decl* d)
27150 {
return visit_begin(
static_cast<decl_base*
>(d));}
27153 ir_node_visitor::visit_end(var_decl* d)
27154 {
return visit_end(
static_cast<decl_base*
>(d));}
27157 ir_node_visitor::visit_begin(function_decl* d)
27158 {
return visit_begin(
static_cast<decl_base*
>(d));}
27161 ir_node_visitor::visit_end(function_decl* d)
27162 {
return visit_end(
static_cast<decl_base*
>(d));}
27165 ir_node_visitor::visit_begin(function_decl::parameter* d)
27166 {
return visit_begin(
static_cast<decl_base*
>(d));}
27169 ir_node_visitor::visit_end(function_decl::parameter* d)
27170 {
return visit_end(
static_cast<decl_base*
>(d));}
27173 ir_node_visitor::visit_begin(function_tdecl* d)
27174 {
return visit_begin(
static_cast<decl_base*
>(d));}
27177 ir_node_visitor::visit_end(function_tdecl* d)
27178 {
return visit_end(
static_cast<decl_base*
>(d));}
27181 ir_node_visitor::visit_begin(class_tdecl* d)
27182 {
return visit_begin(
static_cast<decl_base*
>(d));}
27185 ir_node_visitor::visit_end(class_tdecl* d)
27186 {
return visit_end(
static_cast<decl_base*
>(d));}
27189 ir_node_visitor::visit_begin(class_or_union* t)
27190 {
return visit_begin(
static_cast<type_base*
>(t));}
27193 ir_node_visitor::visit_end(class_or_union* t)
27194 {
return visit_end(
static_cast<type_base*
>(t));}
27197 ir_node_visitor::visit_begin(class_decl* t)
27198 {
return visit_begin(
static_cast<type_base*
>(t));}
27201 ir_node_visitor::visit_end(class_decl* t)
27202 {
return visit_end(
static_cast<type_base*
>(t));}
27205 ir_node_visitor::visit_begin(union_decl* t)
27206 {
return visit_begin(
static_cast<type_base*
>(t));}
27209 ir_node_visitor::visit_end(union_decl* t)
27210 {
return visit_end(
static_cast<type_base*
>(t));}
27213 ir_node_visitor::visit_begin(class_decl::base_spec* d)
27214 {
return visit_begin(
static_cast<decl_base*
>(d));}
27217 ir_node_visitor::visit_end(class_decl::base_spec* d)
27218 {
return visit_end(
static_cast<decl_base*
>(d));}
27221 ir_node_visitor::visit_begin(member_function_template* d)
27222 {
return visit_begin(
static_cast<decl_base*
>(d));}
27225 ir_node_visitor::visit_end(member_function_template* d)
27226 {
return visit_end(
static_cast<decl_base*
>(d));}
27229 ir_node_visitor::visit_begin(member_class_template* d)
27230 {
return visit_begin(
static_cast<decl_base*
>(d));}
27233 ir_node_visitor::visit_end(member_class_template* d)
27234 {
return visit_end(
static_cast<decl_base*
>(d));}
27246 static __thread
size_t counter;
27248 std::ostringstream o;
27255 typedef unordered_map<
const function_decl*, string,
27256 function_decl::hash,
27275 static const string&
27279 fns_to_str_map_type::const_iterator i = m.find(fn);
27282 string s = get_next_string();
27303 fns_to_str(vector<function_decl*>::const_iterator begin,
27304 vector<function_decl*>::const_iterator end,
27308 vector<function_decl*>::const_iterator i;
27309 for (i = begin; i != end; ++i)
27310 o <<
"'" << fn_to_str(*i, m) <<
"' ";
27336 fns_to_str(vector<function_decl*>::const_iterator a_begin,
27337 vector<function_decl*>::const_iterator a_end,
27338 vector<function_decl*>::const_iterator b_begin,
27339 vector<function_decl*>::const_iterator b_end,
27343 fns_to_str(a_begin, a_end, m, o);
27345 fns_to_str(b_begin, b_end, m, o);
27369 fns_to_str(vector<function_decl*>::const_iterator a_begin,
27370 vector<function_decl*>::const_iterator a_end,
27371 vector<function_decl*>::const_iterator b_begin,
27372 vector<function_decl*>::const_iterator b_end,
27376 fns_to_str(a_begin, a_end, b_begin, b_end, m, o);
27398 std::string parent_qualified_name;
27407 if (!d->priv_->qualified_parent_name_.empty())
27412 d->priv_->qualified_name_ =
27413 env.
intern(d->priv_->qualified_parent_name_ +
"::" + d->
get_name());
27416 if (d->priv_->scoped_name_.empty())
27421 d->priv_->scoped_name_ =
27424 d->priv_->scoped_name_ =
27442 {
return do_update(d);}
27454 return do_update(d);
This header declares filters for the diff trees resulting from comparing ABI Corpora.
The private data and functions of the abigail::ir::corpus type.
#define ABG_RETURN_FALSE
A macro used to return the "false" boolean from DIE comparison routines.
#define ABG_RETURN(value)
A macro used to return from DIE comparison routines.
#define ABG_ASSERT(cond)
This is a wrapper around the 'assert' glibc call. It allows for its argument to have side effects,...
Declaration of types pertaining to the interned string pool used throughout Libabigail,...
This contains the private implementation of the suppression engine of libabigail.
#define CACHE_COMPARISON_RESULT_AND_RETURN(value)
Cache the result of a comparison between too artifacts (l & r) and return immediately.
#define RETURN_TRUE_IF_COMPARISON_CYCLE_DETECTED(l, r)
This macro is to be used while comparing composite types that might recursively refer to themselves....
Types of the main internal representation of libabigail.
Wrappers around regex types and functions.
This type abstracts the configuration information of the library.
bool has_string(const char *s) const
Test if the interned string pool already contains a string with a given value.
const char * get_string(const char *s) const
Get a pointer to the interned string which has a given value.
interned_string create_string(const std::string &)
Create an interned string with a given value.
interned_string_pool()
Default constructor.
~interned_string_pool()
Destructor.
The abstraction of an interned string.
bool empty() const
Test if the current instance of interned_string is empty.
This class is to hold the value of the bound of a subrange. The value can be either signed or unsigne...
void set_signed(int64_t v)
Setter of the bound value as signed.
void set_signedness(enum signedness s)
Setter of the signedness (unsigned VS signed) of the bound value.
enum signedness get_signedness() const
Getter of the signedness (unsigned VS signed) of the bound value.
int64_t get_signed_value() const
Getter of the bound value as a signed value.
bool operator==(const bound_value &) const
Equality operator of the bound value.
uint64_t get_unsigned_value()
Getter of the bound value as an unsigned value.
bound_value()
Default constructor of the array_type_def::subrange_type::bound_value class.
void set_unsigned(uint64_t v)
Setter of the bound value as unsigned.
Abstraction for an array range type, like in Ada, or just for an array dimension like in C or C++.
void set_lower_bound(int64_t lb)
Setter of the lower bound.
void set_upper_bound(int64_t ub)
Setter of the upper bound of the subrange type.
void set_underlying_type(const type_base_sptr &)
Setter of the underlying type of the subrange, that is, the type that defines the range.
string as_string() const
Return a string representation of the sub range.
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
bool is_infinite() const
Test if the length of the subrange type is infinite.
bool operator!=(const decl_base &o) const
Equality operator.
int64_t get_upper_bound() const
Getter of the upper bound of the subrange type.
type_base_sptr get_underlying_type() const
Getter of the underlying type of the subrange, that is, the type that defines the range.
virtual bool operator==(const decl_base &) const
Equality operator.
int64_t get_lower_bound() const
Getter of the lower bound of the subrange type.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Build a pretty representation for an array_type_def::subrange_type.
static string vector_as_string(const vector< subrange_sptr > &)
Return a string representation of a vector of subranges.
uint64_t get_length() const
Getter of the length of the subrange type.
translation_unit::language get_language() const
Getter of the language that generated this type.
The abstraction of an array type.
virtual void get_qualified_name(interned_string &qualified_name, bool internal=false) const
Build and return the qualified name of the current instance of the array_type_def.
const type_base_sptr get_element_type() const
Getter of the type of an array element.
virtual bool is_infinite() const
void set_element_type(const type_base_sptr &element_type)
Setter of the type of array element.
shared_ptr< subrange_type > subrange_sptr
Convenience typedef for a shared pointer on a function_decl::subrange.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
const std::vector< subrange_sptr > & get_subranges() const
Get the array's subranges.
virtual bool operator==(const decl_base &) const
Return true iff the two decls have the same name.
std::vector< subrange_sptr > subranges_type
Convenience typedef for a vector of subrange_sptr.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Get the pretty representation of the current instance of array_type_def.
translation_unit::language get_language() const
Get the language of the array.
virtual void append_subranges(const std::vector< subrange_sptr > &subs)
Append subranges from the vector.
Abstraction of a base specifier in a class declaration.
class_decl_sptr get_base_class() const
Get the base class referred to by the current base class specifier.
bool get_is_virtual() const
Getter of the "is-virtual" proprerty of the base class specifier.
long get_offset_in_bits() const
Getter of the offset of the base.
virtual bool traverse(ir_node_visitor &)
Traverses an instance of class_decl::base_spec, visiting all the sub-types and decls that it might co...
virtual bool operator==(const decl_base &) const
Comparison operator for class_decl::base_spec.
virtual size_t get_hash() const
Calculate the hash value for a class_decl::base_spec.
Abstracts a class declaration.
void is_struct(bool f)
Set the "is-struct" flag of the class.
bool has_virtual_member_functions() const
Test if the current instance of class_decl has virtual member functions.
const virtual_mem_fn_map_type & get_virtual_mem_fns_map() const
Get the map that associates a virtual table offset to the virtual member functions with that virtual ...
bool is_struct() const
Test if the class is a struct.
const base_specs & get_base_specifiers() const
Get the base specifiers for this class.
virtual ~class_decl()
Destructor of the class_decl type.
virtual void on_canonical_type_set()
This method is invoked automatically right after the current instance of class_decl has been canonica...
bool has_vtable() const
Test if the current instance has a vtable.
ssize_t get_biggest_vtable_offset() const
Get the highest vtable offset of all the virtual methods of the class.
bool has_virtual_bases() const
Test if the current instance of class_decl has at least one virtual base.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
shared_ptr< base_spec > base_spec_sptr
Convenience typedef.
void add_base_specifier(shared_ptr< base_spec > b)
Add a base specifier to this class.
const member_functions & get_virtual_mem_fns() const
Get the virtual member functions of this class.
void sort_virtual_mem_fns()
Sort the virtual member functions by their virtual index.
friend bool equals(const class_decl &, const class_decl &, change_kind *)
Compares two instances of class_decl.
virtual bool operator==(const decl_base &) const
Comparison operator for class_decl.
bool has_no_base_nor_member() const
Return true iff the class has no entity in its scope.
virtual size_t get_hash() const
Return the hash value for the current instance.
class_decl_sptr find_base_class(const string &) const
Find a base class of a given qualified name for the current class.
vector< base_spec_sptr > base_specs
Convenience typedef.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Getter of the pretty representation of the current instance of class_decl.
The base type of class_decl and union_decl.
virtual size_t get_num_anonymous_member_classes() const
Get the number of anonymous member classes contained in this class.
void add_member_function(method_decl_sptr f, access_specifier a, bool is_static, bool is_ctor, bool is_dtor, bool is_const)
Add a member function.
const var_decl_sptr find_anonymous_data_member(const var_decl_sptr &) const
Find an anonymous data member in the class.
const member_functions & get_member_functions() const
Get the member functions of this class_or_union.
virtual void remove_member_decl(decl_base_sptr)
Remove a given decl from the current class_or_union scope.
const member_function_templates & get_member_function_templates() const
Get the member function templates of this class.
virtual size_t get_size_in_bits() const
Getter of the size of the class_or_union type.
virtual size_t get_num_anonymous_member_unions() const
Get the number of anonymous member unions contained in this class.
void add_member_function_template(member_function_template_sptr)
Append a member function template to the class_or_union.
unordered_map< ssize_t, member_functions > virtual_mem_fn_map_type
Convenience typedef.
vector< method_decl_sptr > member_functions
Convenience typedef.
const data_members & get_data_members() const
Get the data members of this class_or_union.
void add_data_member(var_decl_sptr v, access_specifier a, bool is_laid_out, bool is_static, size_t offset_in_bits)
Add a data member to the current instance of class_or_union.
const method_decl * find_member_function_from_signature(const string &s) const
Find a method (member function) using its signature (pretty representation) as a key.
method_decl_sptr find_member_function_sptr(const string &mangled_name)
Find a method, using its linkage name as a key.
virtual void set_size_in_bits(size_t)
Setter of the size of the class_or_union type.
decl_base_sptr insert_member_decl(decl_base_sptr member)
Insert a data member to this class_or_union type.
virtual decl_base_sptr add_member_decl(const decl_base_sptr &)
Add a member declaration to the current instance of class_or_union. The member declaration can be eit...
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
void add_member_class_template(member_class_template_sptr m)
Append a member class template to the class_or_union.
const data_members & get_non_static_data_members() const
Get the non-static data memebers of this class_or_union.
const method_decl * find_member_function(const string &mangled_name) const
Find a method, using its linkage name as a key.
void maybe_fixup_members_of_anon_data_member(var_decl_sptr &anon_dm)
Fixup the members of the type of an anonymous data member.
vector< var_decl_sptr > data_members
Convenience typedef.
virtual ~class_or_union()
Destrcutor of the class_or_union type.
bool has_no_member() const
virtual bool operator==(const decl_base &) const
Equality operator.
friend void set_member_is_static(decl_base &d, bool s)
Sets the static-ness property of a class member.
virtual size_t get_alignment_in_bits() const
Getter of the alignment of the class_or_union type.
const member_class_templates & get_member_class_templates() const
Get the member class templates of this class.
virtual void set_alignment_in_bits(size_t)
Setter of the alignment of the class type.
vector< type_base_sptr > member_types
Convenience typedef.
virtual size_t get_num_anonymous_member_enums() const
Get the number of anonymous member enums contained in this class.
const var_decl_sptr find_data_member(const string &) const
Find a data member of a given name in the current class_or_union.
Abstract a class template.
shared_ptr< class_decl > get_pattern() const
Getter of the pattern of the template.
void set_pattern(class_decl_sptr p)
Setter of the pattern of the template.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
virtual bool operator==(const decl_base &) const
Return true iff both scopes have the same names and have the same member decls.
The abstraction of the relationship between an entity and its containing scope (its context)....
This is the abstraction of a set of translation units (themselves seen as bundles of unitary abi arte...
shared_ptr< exported_decls_builder > exported_decls_builder_sptr
Convenience typedef for shared_ptr<exported_decls_builder>.
const translation_units & get_translation_units() const
Return the list of translation units of the current corpus.
type_maps & get_types()
Get the maps that associate a name to a certain kind of type.
type_maps & get_type_per_loc_map()
Get the maps that associate a location string to a certain kind of type.
const corpus_group * get_group() const
Getter of the group this corpus is a member of.
const environment & get_environment() const
Getter of the enviroment of the corpus.
The base type of all declarations.
void set_definition_of_declaration(const decl_base_sptr &)
Set the definition of this declaration-only decl_base.
void set_is_declaration_only(bool f)
Set a flag saying if the enum_type_decl is a declaration-only enum_type_decl.
virtual bool operator!=(const decl_base &) const
Inequality operator.
scope_decl * get_scope() const
Return the type containing the current decl, if any.
void set_qualified_name(const interned_string &) const
Setter for the qualified name.
void set_is_in_public_symbol_table(bool)
Set the flag saying if this decl is from a symbol that is in a public symbols table,...
friend bool get_member_is_static(const decl_base &d)
Gets a flag saying if a class member is static or not.
const decl_base_sptr get_earlier_declaration() const
If this decl_base is a definition, get its earlier declaration.
virtual void set_linkage_name(const string &m)
Setter for the linkage name.
const decl_base * get_naked_definition_of_declaration() const
If this decl_base is declaration-only, get its definition, if any.
virtual void get_qualified_name(interned_string &qualified_name, bool internal=false) const
Compute the qualified name of the decl.
void clear_qualified_name()
Clear the qualified name of this decl.
void set_name(const string &n)
Setter for the name of the decl.
const location & get_location() const
Get the location of a given declaration.
typedef_decl_sptr get_naming_typedef() const
Getter for the naming typedef of the current decl.
const interned_string & get_name() const
Getter for the name of the current decl.
virtual void set_scope(scope_decl *)
Setter of the scope of the current decl.
const interned_string & peek_qualified_name() const
Getter for the qualified name.
const context_rel * get_context_rel() const
Getter for the context relationship.
friend void set_member_function_is_virtual(function_decl &, bool)
Set the virtual-ness of a member function.
bool get_is_anonymous() const
Test if the current declaration is anonymous.
friend decl_base_sptr add_decl_to_scope(decl_base_sptr decl, scope_decl *scpe)
Appends a declaration to a given scope, if the declaration doesn't already belong to one.
virtual const interned_string & get_scoped_name() const
Return the scoped name of the decl.
const decl_base_sptr get_definition_of_declaration() const
If this decl_base is declaration-only, get its definition, if any.
friend void set_member_access_specifier(decl_base &d, access_specifier a)
Sets the access specifier for a class member.
void set_naming_typedef(const typedef_decl_sptr &)
Set the naming typedef of the current instance of decl_base.
void set_location(const location &l)
Set the location for a given declaration.
void set_is_anonymous(bool)
Set the "is_anonymous" flag of the current declaration.
void set_visibility(visibility v)
Setter for the visibility of the decl.
void set_temporary_qualified_name(const interned_string &) const
Setter for the temporary qualified name of the current declaration.
visibility get_visibility() const
Getter for the visibility of the decl.
visibility
ELF visibility.
bool get_is_declaration_only() const
Test if a decl_base is a declaration-only decl.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
void set_earlier_declaration(const decl_base_sptr &)
set the earlier declaration of this decl_base definition.
const interned_string & get_linkage_name() const
Getter for the mangled name.
friend enum access_specifier get_member_access_specifier(const decl_base &d)
Gets the access specifier for a class member.
friend bool get_member_function_is_virtual(const function_decl &f)
Test if a given member function is virtual.
virtual ~decl_base()
Destructor of the decl_base type.
virtual bool operator==(const decl_base &) const
Return true iff the two decls have the same name.
const interned_string & get_qualified_parent_name() const
Return a copy of the qualified name of the parent of the current decl.
bool get_is_anonymous_or_has_anonymous_parent() const
bool get_has_anonymous_parent() const
Get the "has_anonymous_parent" flag of the current declaration.
bool get_is_in_public_symbol_table() const
Test if the decl is defined in a ELF symbol table as a public symbol.
friend bool equals(const decl_base &, const decl_base &, change_kind *)
Compares two instances of decl_base.
virtual size_t get_hash() const
Get the hash of a decl. If the hash hasn't been computed yet, compute it ans store its value; otherwi...
const interned_string & peek_temporary_qualified_name() const
Getter of the temporary qualified name of the current declaration.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Get the pretty representatin of the current declaration.
The abstraction for a data member context relationship. This relates a data member to its parent clas...
const var_decl * get_anonymous_data_member() const
Return a non-nil value if this data member context relationship has an anonymous data member....
void set_anonymous_data_member(var_decl *)
Set the containing anonymous data member of this data member context relationship....
The abstraction of the version of an ELF symbol.
version & operator=(const version &o)
Assign a version to the current one.
bool operator==(const version &o) const
Compares the current version against another one.
bool is_default() const
Getter for the 'is_default' property of the version.
const string & str() const
Getter for the version name.
bool operator!=(const version &o) const
Inequality operator.
Abstraction of an elf symbol.
const abg_compat::optional< std::string > & get_namespace() const
Getter of the 'namespace' property.
elf_symbol_sptr get_alias_which_equals(const elf_symbol &other) const
In the list of aliases of a given elf symbol, get the alias that equals this current symbol.
elf_symbol_sptr get_next_common_instance() const
Get the next common instance of the current common symbol.
type get_type() const
Getter for the type of the current instance of elf_symbol.
const elf_symbol_sptr get_main_symbol() const
Get the main symbol of an alias chain.
void set_is_in_ksymtab(bool is_in_ksymtab)
Setter of the 'is-in-ksymtab' property.
bool has_aliases() const
Check if the current elf_symbol has an alias.
void set_name(const string &n)
Setter for the name of the current intance of elf_symbol.
bool is_suppressed() const
Getter for the 'is-suppressed' property.
binding
The binding of a symbol.
int get_number_of_aliases() const
Get the number of aliases to this elf symbol.
string get_aliases_id_string(const string_elf_symbols_map_type &symtab, bool include_symbol_itself=true) const
Return a comma separated list of the id of the current symbol as well as the id string of its aliases...
void set_binding(binding b)
Setter for the binding of the current instance of elf_symbol.
void add_common_instance(const elf_symbol_sptr &)
Add a common instance to the current common elf symbol.
void add_alias(const elf_symbol_sptr &)
Add an alias to the current elf symbol.
void set_is_suppressed(bool is_suppressed)
Setter for the 'is-suppressed' property.
bool is_variable() const
Test if the current instance of elf_symbol is a variable symbol or not.
elf_symbol_sptr update_main_symbol(const std::string &)
Update the main symbol for a group of aliased symbols.
void set_size(size_t)
Setter of the size of the symbol.
const string & get_name() const
Getter for the name of the elf_symbol.
binding get_binding() const
Getter for the binding of the current instance of elf_symbol.
static bool get_name_and_version_from_id(const string &id, string &name, string &ver)
Given the ID of a symbol, get the name and the version of said symbol.
bool is_function() const
Test if the current instance of elf_symbol is a function symbol or not.
type
The type of a symbol.
void set_version(const version &v)
Setter for the version of the current instance of elf_symbol.
const abg_compat::optional< uint32_t > & get_crc() const
Getter of the 'crc' property.
void set_visibility(visibility v)
Setter of the visibility of the current instance of elf_symbol.
bool does_alias(const elf_symbol &) const
Test if the current symbol aliases another one.
bool is_main_symbol() const
Tests whether this symbol is the main symbol.
void set_crc(const abg_compat::optional< uint32_t > &crc)
Setter of the 'crc' property.
static elf_symbol_sptr create(const environment &e, size_t i, size_t s, const string &n, type t, binding b, bool d, bool c, const version &ve, visibility vi, bool is_in_ksymtab=false, const abg_compat::optional< uint32_t > &crc={}, const abg_compat::optional< std::string > &ns={}, bool is_suppressed=false)
Factory of instances of elf_symbol.
visibility
The visibility of the symbol.
version & get_version() const
Getter for the version of the current instanc of elf_symbol.
bool is_common_symbol() const
Return true if the symbol is a common one.
void set_index(size_t)
Setter for the index.
visibility get_visibility() const
Getter of the visibility of the current instance of elf_symbol.
bool has_other_common_instances() const
Return true if this common common symbol has other common instances.
size_t get_index() const
Getter for the index.
const string & get_id_string() const
Get a string that is representative of a given elf_symbol.
elf_symbol_sptr get_alias_from_name(const string &name) const
From the aliases of the current symbol, lookup one with a given name.
const environment & get_environment() const
Getter of the environment used by the current instance of elf_symbol.
void set_type(type t)
Setter for the type of the current instance of elf_symbol.
bool is_public() const
Test if the current instance of elf_symbol is public or not.
bool is_in_ksymtab() const
Getter of the 'is-in-ksymtab' property.
size_t get_size() const
Getter of the size of the symbol.
bool is_defined() const
Test if the current instance of elf_symbol is defined or not.
void set_namespace(const abg_compat::optional< std::string > &ns)
Setter of the 'namespace' property.
elf_symbol_sptr get_next_alias() const
Get the next alias of the current symbol.
bool operator==(const elf_symbol &) const
Test if two main symbols are textually equal, or, if they have aliases that are textually equal.
The abstraction of an enumerator.
enumerator()
Default constructor of the enum_type_decl::enumerator type.
bool operator!=(const enumerator &other) const
Inequality operator.
void set_name(const string &n)
Setter for the name of enum_type_decl::enumerator.
enum_type_decl * get_enum_type() const
Getter for the enum type that this enumerator is for.
const string & get_name() const
Getter for the name of the current instance of enum_type_decl::enumerator.
void set_enum_type(enum_type_decl *)
Setter for the enum type that this enumerator is for.
void set_value(int64_t v)
Setter for the value of enum_type_decl::enumerator.
const string & get_qualified_name(bool internal=false) const
Getter for the qualified name of the current instance of enum_type_decl::enumerator....
int64_t get_value() const
Getter for the value of enum_type_decl::enumerator.
bool operator==(const enumerator &other) const
Equality operator.
enumerator & operator=(const enumerator &)
Assignment operator of the enum_type_decl::enumerator type.
Abstracts a declaration for an enum type.
std::vector< enumerator > enumerators
Convenience typedef for a list of enumerator.
virtual ~enum_type_decl()
Destructor for the enum type declaration.
const enumerators & get_enumerators() const
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
type_base_sptr get_underlying_type() const
Return the underlying type of the enum.
virtual bool operator==(const decl_base &) const
Equality operator.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Get the pretty representation of the current instance of enum_type_decl.
This is an abstraction of the set of resources necessary to manage several aspects of the internal re...
bool decl_only_class_equals_definition() const
Getter of the "decl-only-class-equals-definition" flag.
std::unordered_map< string, std::vector< type_base_sptr > > canonical_types_map_type
A convenience typedef for a map of canonical types. The key is the pretty representation string of a ...
bool user_set_analyze_exported_interfaces_only() const
Getter for a property that says if the user actually did set the analyze_exported_interfaces_only() p...
const type_base_sptr & get_void_type() const
Get a type_decl that represents a "void" type for the current environment.
bool is_variadic_parameter_type(const type_base *) const
Test if a type is a variadic parameter type as defined in the current environment.
static string & get_variadic_parameter_type_name()
Getter of the name of the variadic parameter type.
const config & get_config() const
Getter of the general configuration object.
environment()
Default constructor of the environment type.
vector< type_base_sptr > * get_canonical_types(const char *name)
Get the vector of canonical types which have a given "string representation".
bool canonicalization_is_done() const
Test if the canonicalization of types created out of the current environment is done.
type_base * get_canonical_type(const char *name, unsigned index)
Get a given canonical type which has a given "string representation".
const type_base_sptr & get_variadic_parameter_type() const
Get a type_decl instance that represents a the type of a variadic function parameter.
bool is_void_type(const type_base_sptr &) const
Test if a given type is a void type as defined in the current environment.
virtual ~environment()
Destructor for the environment type.
interned_string intern(const string &) const
Do intern a string.
bool do_on_the_fly_canonicalization() const
Getter for the "on-the-fly-canonicalization" flag.
bool analyze_exported_interfaces_only() const
Getter for the property that controls if we are to restrict the analysis to the types that are only r...
canonical_types_map_type & get_canonical_types_map()
Getter the map of canonical types.
Abstraction of a function parameter.
virtual void get_qualified_name(interned_string &qualified_name, bool internal=false) const
Compute the qualified name of the parameter.
interned_string get_type_name() const
interned_string get_name_id() const
Get a name uniquely identifying the parameter in the function.
const string get_type_pretty_representation() const
virtual bool traverse(ir_node_visitor &v)
Traverse the diff sub-tree under the current instance function_decl.
virtual size_t get_hash() const
Get the hash of a decl. If the hash hasn't been computed yet, compute it ans store its value; otherwi...
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Compute and return a copy of the pretty representation of the current function parameter.
Abstraction for a function declaration.
shared_ptr< parameter > parameter_sptr
Convenience typedef for a shared pointer on a function_decl::parameter.
string get_pretty_representation_of_declarator(bool internal=false) const
Compute and return the pretty representation for the part of the function declaration that starts at ...
const function_type * get_naked_type() const
Fast getter of the type of the current instance of function_decl.
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
void append_parameters(std::vector< parameter_sptr > &parms)
Append a vector of parameters to the type of this function.
bool is_variadic() const
Return true iff the function takes a variable number of parameters.
parameters::const_iterator get_first_non_implicit_parm() const
Getter for the first non-implicit parameter of a function decl.
const function_type_sptr get_type() const
Return the type of the current instance of function_decl.
function_decl(const string &name, function_type_sptr function_type, bool declared_inline, const location &locus, const string &mangled_name, visibility vis, binding bind)
Constructor of the function_decl.
const type_base_sptr get_return_type() const
function_decl_sptr clone() const
Create a new instance of function_decl that is a clone of the current one.
const std::vector< parameter_sptr > & get_parameters() const
void append_parameter(parameter_sptr parm)
Append a parameter to the type of this function.
void set_symbol(const elf_symbol_sptr &sym)
This sets the underlying ELF symbol for the current function decl.
virtual ~function_decl()
Destructor of the function_decl type.
const elf_symbol_sptr & get_symbol() const
Gets the the underlying ELF symbol for the current variable, that was set using function_decl::set_sy...
virtual bool operator==(const decl_base &o) const
Comparison operator for function_decl.
std::vector< parameter_sptr > parameters
Convenience typedef for a vector of parameter_sptr.
virtual size_t get_hash() const
The virtual implementation of 'get_hash' for a function_decl.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Get the pretty representation of the current instance of function_decl.
interned_string get_id() const
Return an ID that tries to uniquely identify the function inside a program or a library.
Abstract a function template declaration.
binding get_binding() const
Get the binding of the function template.
void set_pattern(shared_ptr< function_decl > p)
Set a new pattern to the function template.
shared_ptr< function_decl > get_pattern() const
Get the pattern of the function template.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
virtual bool operator==(const decl_base &) const
Comparison operator for the function_tdecl type.
Abstraction of a function type.
shared_ptr< function_decl::parameter > parameter_sptr
Convenience typedef for a shared pointer on a function_decl::parameter.
virtual bool traverse(ir_node_visitor &)
Traverses an instance of function_type, visiting all the sub-types and decls that it might contain.
bool is_variadic() const
Test if the current instance of function_type is for a variadic function.
parameters::const_iterator get_first_parm() const
Get the first parameter of the function.
virtual void on_canonical_type_set()
This function is automatically invoked whenever an instance of this type is canonicalized.
virtual bool operator==(const type_base &) const
Equality operator for function_type.
void append_parameter(parameter_sptr parm)
Append a new parameter to the vector of parameters of the current instance of function_type.
void set_parameters(const parameters &p)
Setter for the parameters of the current instance of function_type.
const interned_string & get_cached_name(bool internal=false) const
Get the name of the current function_type.
const parameter_sptr get_parm_at_index_from_first_non_implicit_parm(size_t) const
Get the Ith parameter of the vector of parameters of the current instance of function_type.
type_base_sptr get_return_type() const
Getter for the return type of the current instance of function_type.
void set_return_type(type_base_sptr t)
Setter of the return type of the current instance of function_type.
parameters::const_iterator get_first_non_implicit_parm() const
Get the first parameter of the function.
const parameters & get_parameters() const
Getter for the set of parameters of the current intance of function_type.
std::vector< parameter_sptr > parameters
Convenience typedef for a vector of parameter_sptr.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Return a copy of the pretty representation of the current function_type.
This abstracts the global scope of a given translation unit.
The internal representation of an integral type.
void set_modifiers(modifiers_type)
Setter of the modifiers bitmap of the integral_type.
string to_string(bool internal=false) const
Return the string representation of the current instance of integral_type.
base_type get_base_type() const
Getter of the base type of the integral_type.
modifiers_type
The modifiers of the base types above. Several modifiers can be combined for a given base type....
@ LONG_LONG_MODIFIER
The "long long" modifier.
@ LONG_MODIFIER
The "long" modifier.
@ SIGNED_MODIFIER
The "signed" modifier.
@ UNSIGNED_MODIFIER
The "unsigned" modier.
@ SHORT_MODIFIER
The "short" modifier.
bool operator==(const integral_type &) const
Equality operator for the integral_type.
base_type
The possible base types of integral types. We might have forgotten many of these, so do not hesitate ...
@ WCHAR_T_BASE_TYPE
The "wchar_t" base type.
@ CHAR32_T_BASE_TYPE
The "char32_t" base type.
@ FLOAT_BASE_TYPE
The "float" base type.
@ BOOL_BASE_TYPE
The "bool" base type in C++ or "_Bool" in C11.
@ CHAR_BASE_TYPE
The "char" base type.
@ CHAR16_T_BASE_TYPE
The "char16_t base type.
@ INT_BASE_TYPE
The "int" base type.
@ DOUBLE_BASE_TYPE
The "double" base type.
modifiers_type get_modifiers() const
Getter of the modifiers bitmap of the integral_type.
integral_type()
Default constructor of the integral_type.
The base class for the visitor type hierarchy used for traversing a translation unit.
bool allow_visiting_already_visited_type_node() const
Get if the walker using this visitor is allowed to re-visit a type node that was previously visited o...
bool type_node_has_been_visited(type_base *) const
Test if a given type node has been marked as visited.
void forget_visited_type_nodes()
Un-mark all visited type nodes.
ir_node_visitor()
Default Constructor of the ir_node_visitor type.
void mark_type_node_as_visited(type_base *)
Mark a given type node as having been visited.
The entry point to manage locations.
location create_new_location(const std::string &fle, size_t lne, size_t col)
Insert the triplet representing a source locus into our internal vector of location triplet....
void expand_location(const location &location, std::string &path, unsigned &line, unsigned &column) const
Given an instance of location type, return the triplet {path,line,column} that represents the source ...
The source location of a token.
bool get_is_artificial() const
Test if the location is artificial.
unsigned get_value() const
Get the value of the location.
string expand(void) const
Expand the location into a string.
void expand(std::string &path, unsigned &line, unsigned &column) const
Expand the current location into a tripplet file path, line and column number.
Abstraction of a member function context relationship. This relates a member function to its parent c...
bool is_constructor() const
Getter for the 'is-constructor' property.
bool is_const() const
Getter for the 'is-const' property.
size_t vtable_offset() const
Getter for the vtable offset property.
bool is_destructor() const
Getter for the 'is-destructor' property.
The base class for member types, data members and member functions. Its purpose is mainly to carry th...
access_specifier get_access_specifier() const
Getter for the access specifier of this member.
bool get_is_static() const
Abstracts a member class template template.
virtual bool operator==(const member_base &o) const
Equality operator of the the member_class_template class.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
Abstract a member function template.
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
Abstraction of the declaration of a method.
friend void set_member_function_is_const(function_decl &, bool)
set the const-ness property of a member function.
virtual void set_linkage_name(const string &)
Set the linkage name of the method.
const method_type_sptr get_type() const
Abstracts the type of a class member function.
void set_class_type(const class_or_union_sptr &t)
Sets the class type of the current instance of method_type.
void set_is_const(bool)
Setter of the "is-const" property of method_type.
virtual ~method_type()
The destructor of method_type.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Return a copy of the pretty representation of the current method_type.
class_or_union_sptr get_class_type() const
Get the class type this method belongs to.
bool get_is_const() const
Getter of the "is-const" property of method_type.
The abstraction of a namespace declaration.
bool is_empty_or_has_empty_sub_namespaces() const
Test if the current namespace_decl is empty or contains empty namespaces itself.
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
namespace_decl(const environment &env, const string &name, const location &locus, visibility vis=VISIBILITY_DEFAULT)
Constructor.
virtual bool operator==(const decl_base &) const
Return true iff both namespaces and their members are equal.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Build and return a copy of the pretty representation of the namespace.
Abstracts non type template parameters.
const type_base_sptr get_type() const
Getter for the type of the template parameter.
virtual bool operator==(const decl_base &) const
Return true iff the two decls have the same name.
virtual size_t get_hash() const
Get the hash value of the current instance.
The abstraction of a pointer type.
void set_pointed_to_type(const type_base_sptr &)
Set the pointed-to type of the pointer.
virtual void get_qualified_name(interned_string &, bool internal=false) const
Build and return the qualified name of the current instance of pointer_type_def.
virtual void on_canonical_type_set()
This function is automatically invoked whenever an instance of this type is canonicalized.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
virtual bool operator==(const decl_base &) const
Return true iff both instances of pointer_type_def are equal.
const type_base_sptr get_pointed_to_type() const
Getter of the pointed-to type.
type_base * get_naked_pointed_to_type() const
Getter of a naked pointer to the pointed-to type.
The abstraction of a qualified type.
virtual void get_qualified_name(interned_string &qualified_name, bool internal=false) const
Implementation for the virtual qualified name builder for qualified_type_def.
void set_underlying_type(const type_base_sptr &)
Setter of the underlying type.
virtual size_t get_size_in_bits() const
Get the size of the qualified type def.
string get_cv_quals_string_prefix() const
Compute and return the string prefix or suffix representing the qualifiers hold by the current instan...
CV
Bit field values representing the cv qualifiers of the underlying type.
virtual void on_canonical_type_set()
This function is automatically invoked whenever an instance of this type is canonicalized.
void set_cv_quals(CV cv_quals)
Setter of the const/value qualifiers bit field.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
CV get_cv_quals() const
Getter of the const/volatile qualifier bit field.
type_base_sptr get_underlying_type() const
Getter of the underlying type.
virtual bool operator==(const decl_base &) const
Equality operator for qualified types.
string build_name(bool, bool internal=false) const
Build the name of the current instance of qualified type.
Abstracts a reference type.
virtual void get_qualified_name(interned_string &qualified_name, bool internal=false) const
Build and return the qualified name of the current instance of the reference_type_def.
virtual void on_canonical_type_set()
This function is automatically invoked whenever an instance of this type is canonicalized.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
void set_pointed_to_type(type_base_sptr &pointed_to_type)
Setter of the pointed_to type of the current reference type.
virtual bool operator==(const decl_base &) const
Equality operator of the reference_type_def type.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Get the pretty representation of the current instance of reference_type_def.
A declaration that introduces a scope.
virtual size_t get_num_anonymous_member_classes() const
Getter for the number of anonymous classes contained in this scope.
void remove_member_type(type_base_sptr t)
Remove a member type from the current class_or_union scope.
void insert_member_type(type_base_sptr t, declarations::iterator before)
Insert a member type.
void add_member_type(type_base_sptr t)
Add a member type to the current instance of class_or_union.
virtual size_t get_num_anonymous_member_unions() const
Getter for the number of anonymous unions contained in this scope.
scopes & get_member_scopes()
Getter for the scopes carried by the current scope.
std::vector< scope_decl_sptr > scopes
Convenience typedef for a vector of scope_decl_sptr.
bool is_empty() const
Test if the current scope is empty.
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
const type_base_sptrs_type & get_member_types() const
Get the member types of this scope_decl.
decl_base_sptr insert_member_decl(decl_base_sptr member, declarations::iterator before)
Insert a member decl to this scope, right before an element pointed to by a given iterator....
std::vector< decl_base_sptr > declarations
Convenience typedef for a vector of decl_base_sptr.
const type_base_sptrs_type & get_sorted_canonical_types() const
Return a vector of sorted canonical types of the current scope.
bool find_iterator_for_member(const decl_base *, declarations::iterator &)
Find a member of the current scope and return an iterator on it.
virtual void remove_member_decl(decl_base_sptr member)
Remove a declaration from the current scope.
virtual decl_base_sptr add_member_decl(const decl_base_sptr &member)
Add a member decl to this scope. Note that user code should not use this, but rather use add_decl_to_...
type_base_sptr find_member_type(const string &name) const
Find a member type of a given name, inside the current scope_decl.
const declarations & get_member_decls() const
Getter for the member declarations carried by the current scope_decl.
const canonical_type_sptr_set_type & get_canonical_types() const
@eturn the set of canonical types of the the current scope.
const type_base_sptrs_type & get_sorted_member_types() const
Get the sorted member types of this scope_decl.
friend decl_base_sptr add_decl_to_scope(decl_base_sptr decl, scope_decl *scope)
Appends a declaration to a given scope, if the declaration doesn't already belong to one.
virtual bool operator==(const decl_base &) const
Return true iff both scopes have the same names and have the same member decls.
const declarations & get_sorted_member_decls() const
Getter for the sorted member declarations carried by the current scope_decl.
virtual size_t get_num_anonymous_member_enums() const
Getter for the number of anonymous enums contained in this scope.
virtual size_t get_hash() const
Return the hash value for the current instance of scope_decl.
A type that introduces a scope.
virtual bool traverse(ir_node_visitor &)
Traverses an instance of scope_type_decl, visiting all the sub-types and decls that it might contain.
virtual bool operator==(const decl_base &) const
Equality operator between two scope_type_decl.
The base class of templates.
const std::list< template_parameter_sptr > & get_template_parameters() const
Get the list of template parameters of the current instance of template_decl.
virtual ~template_decl()
Destructor.
void add_template_parameter(const template_parameter_sptr p)
Add a new template parameter to the current instance of template_decl.
virtual bool operator==(const decl_base &o) const
Equality operator.
Base class for a template parameter. Client code should use the more specialized type_template_parame...
virtual ~template_parameter()
Destructor.
bool operator!=(const template_parameter &) const
Inequality operator.
Abstracts a template template parameter.
virtual bool operator==(const type_base &) const
Equality operator.
This is the abstraction of the set of relevant artefacts (types, variable declarations,...
void set_address_size(char)
Setter of the address size in this translation unit.
const std::string & get_absolute_path() const
Get the concatenation of the build directory and the relative path of the translation unit.
void set_is_constructed(bool)
Setter of the 'is_constructed" flag. It says if the translation unit is fully constructed or not.
bool operator==(const translation_unit &) const
Compare the current translation unit against another one.
const corpus * get_corpus() const
Get the corpus this translation unit is a member of.
char get_address_size() const
Getter of the address size in this translation unit.
const std::string & get_compilation_dir_path() const
Get the path of the directory that was 'current' when the translation unit was compiled.
void set_corpus(corpus *)
Set the corpus this translation unit is a member of.
void set_language(language l)
Setter of the language of the source code of the translation unit.
void bind_function_type_life_time(function_type_sptr) const
Ensure that the life time of a function type is bound to the life time of the current translation uni...
const scope_decl_sptr & get_global_scope() const
Getter of the the global scope of the translation unit.
bool is_empty() const
Tests whether if the current translation unit contains ABI artifacts or not.
bool is_constructed() const
Getter of the 'is_constructed" flag. It says if the translation unit is fully constructed or not.
const std::string & get_path() const
Get the path of the current translation unit.
void set_compilation_dir_path(const std::string &)
Set the path of the directory that was 'current' when the translation unit was compiled.
location_manager & get_loc_mgr()
Getter of the location manager for the current translation unit.
void set_path(const string &)
Set the path associated to the current instance of translation_unit.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse virtual function.
language
The language of the translation unit.
bool operator!=(const translation_unit &) const
Inequality operator.
const vector< function_type_sptr > & get_live_fn_types() const
Get the vector of function types that are used in the current translation unit.
const environment & get_environment() const
Getter of the environment of the current translation_unit.
const type_maps & get_types() const
Getter of the types of the current translation_unit.
language get_language() const
Getter of the language of the source code of the translation unit.
bool visiting() const
This should returns false before and after the node has been visiting. During the visiting of the nod...
An abstraction helper for type declarations.
const interned_string & get_cached_pretty_representation(bool internal=false) const
Get the pretty representation of the current type.
type_base * get_naked_canonical_type() const
Getter of the canonical type pointer.
virtual size_t get_size_in_bits() const
Getter for the size of the type.
virtual bool traverse(ir_node_visitor &)
Default implementation of traversal for types. This function does nothing. It must be implemented by ...
virtual void on_canonical_type_set()
This method is invoked automatically right after the current instance of class_decl has been canonica...
virtual void set_size_in_bits(size_t)
Setter for the size of the type.
virtual bool operator!=(const type_base &) const
Inequality operator.
virtual bool operator==(const type_base &) const
Return true iff both type declarations are equal.
virtual size_t get_alignment_in_bits() const
Getter for the alignment of the type.
virtual void set_alignment_in_bits(size_t)
Setter for the alignment of the type.
type_base_sptr get_canonical_type() const
Getter of the canonical type of the current instance of type_base.
This abstracts a composition of types based on template type parameters. The result of the compositio...
const type_base_sptr get_composed_type() const
Getter for the resulting composed type.
void set_composed_type(type_base_sptr t)
Setter for the resulting composed type.
virtual size_t get_hash() const
Get the hash value for the current instance.
A basic type declaration that introduces no scope.
virtual void get_qualified_name(interned_string &qualified_name, bool internal=false) const
Implementation for the virtual qualified name builder for type_decl.
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
virtual bool operator!=(const type_base &) const
Return true if both types equals.
virtual bool operator==(const type_base &) const
Return true if both types equals.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Get the pretty representation of the current instance of type_decl.
This is a type that aggregates maps of all the kinds of types that are supported by libabigail.
istring_type_base_wptrs_map_type & typedef_types()
Getter for the map that associates the name of a typedef to the vector of instances of typedef_decl_s...
istring_type_base_wptrs_map_type & function_types()
Getter for the map that associates the name of a function type to the vector of instances of function...
istring_type_base_wptrs_map_type & reference_types()
Getter for the map that associates the name of a reference type to the vector of instances of referen...
const istring_type_base_wptrs_map_type & class_types() const
Getter for the map that associates the name of a class type to the vector of instances of class_decl_...
istring_type_base_wptrs_map_type & union_types()
Getter for the map that associates the name of a union type to the vector of instances of union_decl_...
istring_type_base_wptrs_map_type & array_types()
Getter for the map that associates the name of an array type to the vector of instances of array_type...
istring_type_base_wptrs_map_type & enum_types()
Getter for the map that associates the name of an enum type to the vector of instances of enum_type_d...
bool empty() const
Test if the type_maps is empty.
istring_type_base_wptrs_map_type & qualified_types()
Getter for the map that associates the name of a qualified type to the vector of instances of qualifi...
const vector< type_base_wptr > & get_types_sorted_by_name() const
Getter of all types types sorted by their pretty representation.
istring_type_base_wptrs_map_type & pointer_types()
Getter for the map that associates the name of a pointer type to the vector of instances of pointer_t...
const istring_type_base_wptrs_map_type & basic_types() const
Getter for the map that associates the name of a basic type to the vector instances of type_decl_sptr...
const istring_type_base_wptrs_map_type & subrange_types() const
Getter for the map that associates the name of a subrange type to the vector of instances of array_ty...
The base class of both types and declarations.
void set_translation_unit(translation_unit *)
Set the translation_unit this ABI artifact belongs to.
bool get_is_artificial() const
Getter of the flag that says if the artefact is artificial.
virtual ~type_or_decl_base()
The destructor of the type_or_decl_base type.
location & get_artificial_location() const
Getter of the artificial location of the artifact.
bool has_artificial_location() const
Test if the current ABI artifact carries an artificial location.
friend type_base * is_type(const type_or_decl_base *)
Test whether a declaration is a type.
const corpus * get_corpus() const
Get the corpus this ABI artifact belongs to.
friend class_decl * is_class_type(const type_or_decl_base *)
Test whether a type is a class.
enum type_or_decl_kind kind() const
Getter for the "kind" property of type_or_decl_base type.
void set_is_artificial(bool)
Setter of the flag that says if the artefact is artificial.
virtual bool traverse(ir_node_visitor &)
Traverse the the ABI artifact.
const void * runtime_type_instance() const
Getter of the pointer to the runtime type sub-object of the current instance.
const void * type_or_decl_base_pointer() const
Getter of the pointer to either the type_base sub-object of the current instance if it's a type,...
bool hashing_started() const
Getter for the 'hashing_started' property.
void set_artificial_location(const location &)
Setter of the artificial location of the artificat.
type_or_decl_kind
This is a bitmap type which instance is meant to contain the runtime type of a given ABI artifact....
const environment & get_environment() const
Getter of the environment of the current ABI artifact.
friend pointer_type_def * is_pointer_type(type_or_decl_base *)
Test whether a type is a pointer_type_def.
friend decl_base * is_decl(const type_or_decl_base *d)
Test if an ABI artifact is a declaration.
const translation_unit * get_translation_unit() const
Get the translation_unit this ABI artifact belongs to.
Abstracts a type template parameter.
virtual bool operator==(const type_base &) const
Equality operator.
The abstraction of a typedef declaration.
void set_underlying_type(const type_base_sptr &)
Setter ofthe underlying type of the typedef.
virtual size_t get_size_in_bits() const
Return the size of the typedef.
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
type_base_sptr get_underlying_type() const
Getter of the underlying type of the typedef.
virtual bool operator==(const decl_base &) const
Equality operator.
virtual size_t get_alignment_in_bits() const
Return the alignment of the typedef.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Build a pretty representation for a typedef_decl.
Abstracts a union type declaration.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
virtual bool operator==(const decl_base &) const
Comparison operator for union_decl.
virtual ~union_decl()
Destructor of the union_decl type.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Getter of the pretty representation of the current instance of union_decl.
Abstracts a variable declaration.
binding get_binding() const
Getter of the binding of the variable.
void set_type(type_base_sptr &)
Setter of the type of the variable.
void set_binding(binding b)
Setter of the binding of the variable.
friend uint64_t get_data_member_offset(const var_decl_sptr m)
Get the offset of a data member.
var_decl_sptr clone() const
Create a new var_decl that is a clone of the current one.
virtual const interned_string & get_qualified_name(bool internal=false) const
Get the qualified name of a given variable or data member.
const type_base * get_naked_type() const
Getter of the type of the variable.
friend bool get_data_member_is_laid_out(const var_decl &m)
Test whether a data member is laid out.
const type_base_sptr get_type() const
Getter of the type of the variable.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
string get_anon_dm_reliable_name(bool qualified=true) const
Get a name that is valid even for an anonymous data member.
void set_symbol(const elf_symbol_sptr &sym)
Sets the underlying ELF symbol for the current variable.
const elf_symbol_sptr & get_symbol() const
Gets the the underlying ELF symbol for the current variable, that was set using var_decl::set_symbol(...
virtual bool operator==(const decl_base &) const
Comparison operator of var_decl.
virtual size_t get_hash() const
Return the hash value for the current instance.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Build and return the pretty representation of this variable.
interned_string get_id() const
Return an ID that tries to uniquely identify the variable inside a program or a library.
bool is_decl_only_class_with_size_change(const class_or_union &first, const class_or_union &second)
Test if two classes that are decl-only (have the decl-only flag and carry no data members) but are di...
shared_ptr< reference_type_def > reference_type_def_sptr
Convenience typedef for a shared pointer on a reference_type_def.
bool enum_has_non_name_change(const enum_type_decl &l, const enum_type_decl &r, change_kind *k)
Test if two enums differ, but not by a name change.
const type_base_wptrs_type * lookup_class_types(const string &qualified_name, const corpus &corp)
Look into a given corpus to find the class type*s* that have a given qualified name.
const type_base_sptr lookup_type_in_scope(const string &fqn, const scope_decl_sptr &skope)
Lookup a type in a scope.
bool is_non_canonicalized_type(const type_base *t)
Test if a given type is allowed to be non canonicalized.
bool get_member_function_is_dtor(const function_decl &f)
Test whether a member function is a destructor.
const type_base * peel_qualified_type(const type_base *type)
Return the leaf underlying type of a qualified type.
shared_ptr< method_type > method_type_sptr
Convenience typedef for shared pointer to method_type.
translation_unit * get_translation_unit(const shared_ptr< decl_base > decl)
Return the translation unit a declaration belongs to.
size_t hash_type(const type_base *t)
Hash an ABI artifact that is either a type.
var_decl_sptr get_last_data_member(const class_or_union &klass)
Get the last data member of a class type.
bool is_anonymous_or_typedef_named(const decl_base &d)
Test if a given decl is anonymous or has a naming typedef.
decl_base_sptr add_decl_to_scope(decl_base_sptr decl, const scope_decl_sptr &scope)
Appends a declaration to a given scope, if the declaration doesn't already belong to a scope.
function_decl_sptr is_function_decl(const type_or_decl_base_sptr &d)
Test whether a declaration is a function_decl.
class_decl_sptr is_class_type(const type_or_decl_base_sptr &d)
Test whether a type is a class.
bool get_member_is_static(const decl_base &d)
Gets a flag saying if a class member is static or not.
bool debug_equals(const type_or_decl_base *l, const type_or_decl_base *r)
Test if two ABI artifacts are equal.
decl_base * debug(const decl_base *artifact)
Emit a textual representation of an artifact to std error stream for debugging purposes.
shared_ptr< function_decl > function_decl_sptr
Convenience typedef for a shared pointer on a function_decl.
access_specifier
Access specifier for class members.
pointer_type_def_sptr lookup_pointer_type(const interned_string &qualified_name, const corpus &corp)
Look into a given corpus to find a pointer type which has a given qualified name.
class_decl_sptr lookup_class_type(const interned_string &qualified_name, const corpus &corp)
Look into a given corpus to find a class type which has a given qualified name.
interned_string get_type_name(const type_base &t, bool qualified, bool internal)
Get the name of a given type and return a copy of it.
void maybe_update_types_lookup_map(const function_type_sptr &fn_type)
Update the map that associates the fully qualified name of a function type with the type itself.
bool function_decls_alias(const function_decl &f1, const function_decl &f2)
Test if two function declarations are aliases.
shared_ptr< class_tdecl > class_tdecl_sptr
Convenience typedef for a shared pointer on a class_tdecl.
weak_ptr< function_type > function_type_wptr
Convenience typedef for a weak pointer on a function_type.
type_base_sptr lookup_class_or_typedef_type(const string &qualified_name, const corpus &corp)
Look into a corpus to find a class, union or typedef type which has a given qualified name.
void set_member_function_is_virtual(function_decl &f, bool is_virtual)
Set the virtual-ness of a member function.
ssize_t get_member_function_vtable_offset(const function_decl &f)
Get the vtable offset of a member function.
reference_type_def_sptr lookup_reference_type(const interned_string &qualified_name, const corpus &corp)
Look into a given corpus to find a reference type which has a given qualified name.
type_decl_sptr lookup_basic_type_per_location(const string &loc, const corpus &corp)
Lookup a type_decl type from a given corpus, by its location.
class_decl_sptr is_compatible_with_class_type(const decl_base_sptr &t)
Test if a type is a class. This function looks through typedefs.
bool is_declaration_only_class_or_union_type(const type_base *t)
Test wheter a type is a declaration-only class.
corpus::origin operator|=(corpus::origin &l, corpus::origin r)
Bitwise |= operator for the corpus::origin type.
vector< type_base_wptr > type_base_wptrs_type
A convenience typedef for a vector of type_base_wptr.
bool operator==(const union_decl_sptr &l, const union_decl_sptr &r)
Turn equality of shared_ptr of union_decl into a deep equality; that is, make it compare the pointed ...
void fixup_virtual_member_function(method_decl_sptr method)
When a virtual member function has seen its virtualness set by set_member_function_is_virtual(),...
void pop_composite_type_comparison_operands(const type_base &left, const type_base &right)
Pop a pair of operands from the stack of operands to the current type comparison.
bool equals_modulo_cv_qualifier(const array_type_def *l, const array_type_def *r)
Test if two variables are equals modulo CV qualifiers.
const type_base_wptrs_type * lookup_enum_types(const string &qualified_name, const corpus &corp)
Look into a given corpus to find the enum type*s* that have a given qualified name.
qualified_type_def_sptr clone_qualified_type(const qualified_type_def_sptr &t)
Clone a qualifiend type.
string get_class_or_union_flat_representation(const class_or_union_sptr &cou, const string &indent, bool one_line, bool internal, bool qualified_names)
Get the flat representation of an instance of class_or_union type.
bool is_type(const type_or_decl_base &tod)
Test whether a declaration is a type.
scope_decl * is_scope_decl(decl_base *d)
Test if a declaration is a scope_decl.
union_decl_sptr lookup_union_type(const string &type_name, const corpus &corp)
Look into a given corpus to find a union type which has a given qualified name.
bool is_anonymous_data_member(const decl_base &d)
Test if a decl is an anonymous data member.
bool is_anonymous_data_member(const var_decl &d)
Test if a var_decl is an anonymous data member.
string translation_unit_language_to_string(translation_unit::language l)
Converts a translation_unit::language enumerator into a string.
weak_ptr< type_base > type_base_wptr
Convenience typedef for a weak pointer on a type_base.
type_decl_sptr is_integral_type(const type_or_decl_base_sptr &t)
Test if a type is an integral type.
type_base_sptr peel_reference_type(const type_base_sptr &type)
Return the leaf pointed-to type node of a reference_type_def node.
bool has_scope(const decl_base &d)
Tests if a declaration has got a scope.
scope_decl * get_type_scope(const type_base_sptr &t)
Get the scope of a given type.
integral_type::modifiers_type operator~(integral_type::modifiers_type l)
Bitwise one's complement operator for integral_type::modifiers_type.
array_type_def::subrange_type * is_subrange_type(const type_or_decl_base *type)
Test if a type is an array_type_def::subrange_type.
shared_ptr< elf_symbol > elf_symbol_sptr
A convenience typedef for a shared pointer to elf_symbol.
typedef_decl_sptr lookup_typedef_type(const interned_string &qualified_name, const corpus &corp)
Look into a given corpus to find a typedef type which has a given qualified name.
type_base_sptr lookup_type_from_translation_unit(const string &type_name, const string &tu_path, const corpus &corp)
Lookup a type from a given translation unit present in a give corpus.
var_decl_sptr get_data_member(type_base *clazz, const char *member_name)
Get a given data member, referred to by its name, of a class type.
type_base * get_exemplar_type(const type_base *type)
For a given type, return its exemplar type.
location get_location(const decl_base_sptr &decl)
Get the location of a given declaration.
void remove_decl_from_scope(decl_base_sptr decl)
Remove a given decl from its scope.
type_base_sptr peel_qualified_or_typedef_type(const type_base_sptr &t)
Return the leaf underlying type of a qualified or typedef type.
bool odr_is_relevant(const type_or_decl_base &artifact)
By looking at the language of the TU a given ABI artifact belongs to, test if the ONE Definition Rule...
array_type_def_sptr clone_array(const array_type_def_sptr &array)
Clone an array type.
enum_type_decl_sptr lookup_enum_type_per_location(const string &loc, const corpus &corp)
Look up an enum_type_decl from a given corpus, by its location.
change_kind
A bitfield that gives callers of abigail::ir::equals() some insight about how different two internal ...
@ LOCAL_TYPE_CHANGE_KIND
This means that a given IR artifact has a local type change.
@ SUBTYPE_CHANGE_KIND
This means that a given IR artifact has changes in some of its sub-types, with respect to the other a...
@ LOCAL_NON_TYPE_CHANGE_KIND
This means that a given IR artifact has a local non-type change. That is a change that is carried by ...
var_decl_sptr find_last_data_member_matching_regexp(const class_or_union &t, const regex::regex_t_sptr ®ex)
Find the last data member of a class or union which name matches a regular expression.
const var_decl_sptr get_first_non_anonymous_data_member(const var_decl_sptr anon_dm)
Get the first non-anonymous data member of a given anonymous data member.
bool is_user_defined_type(const type_base *t)
Test if a type is user-defined.
bool operator==(const translation_unit_sptr &l, const translation_unit_sptr &r)
A deep comparison operator for pointers to translation units.
class_or_union_sptr anonymous_data_member_to_class_or_union(const var_decl_sptr &d)
Get the class_or_union type of a given anonymous data member.
weak_ptr< class_decl > class_decl_wptr
Convenience typedef for a weak pointer on a class_decl.
const interned_string & get_node_name(var_decl_sptr node)
Gets the name of a var_decl node.
vector< type_base_sptr > type_base_sptrs_type
Helper typedef for a vector of shared pointer to a type_base.
void debug_comp_stack(const environment &env)
Emit a trace of the two comparison operands stack on the standard error stream.
bool is_class_type(const type_or_decl_base &t)
Test whether a type is a class.
type_base_sptr synthesize_type_from_translation_unit(const type_base_sptr &type, translation_unit &tu)
In a translation unit, lookup a given type or synthesize it if it's a qualified type.
bool maybe_update_types_lookup_map< function_type >(const function_type_sptr &type, istring_type_base_wptrs_map_type &types_map, bool)
This is the specialization for type function_type of the function template:
shared_ptr< array_type_def > array_type_def_sptr
Convenience typedef for a shared pointer on a array_type_def.
method_type * is_method_type(type_or_decl_base *t)
Test whether a type is a method_type.
function_type_sptr lookup_or_synthesize_fn_type(const function_type_sptr &fn_t, const corpus &corpus)
Look into an ABI corpus for a function type.
pointer_type_def_sptr is_pointer_type(const type_or_decl_base_sptr &t)
Test whether a type is a pointer_type_def.
qualified_type_def_sptr lookup_qualified_type(const interned_string &qualified_name, const corpus &corp)
Look into a given corpus to find a qualified type which has a given qualified name.
bool is_global_scope(const shared_ptr< scope_decl >scope)
Tests whether if a given scope is the global scope.
type_base_sptr lookup_type(const type_base_sptr &t, const corpus &corp)
Look into a given corpus to find a type.
string get_pretty_representation(const type_or_decl_base *tod, bool internal)
Build and return a copy of the pretty representation of an ABI artifact that could be either a type o...
bool scope_anonymous_or_typedef_named(const decl_base &d)
Test if the scope of a given decl is anonymous or anonymous with a naming typedef.
class_decl::base_spec * is_class_base_spec(const type_or_decl_base *tod)
Test if an ABI artifact is a class base specifier.
const type_base * is_void_pointer_type(const type_base &type)
Test if a type is a pointer to void type.
type_base_sptr lookup_class_typedef_or_enum_type(const string &qualified_name, const corpus &corp)
Look into a corpus to find a class, typedef or enum type which has a given qualified name.
void mark_types_as_being_compared(T &l, T &r)
Mark a pair of types as being compared.
const type_base_sptr peel_qualified_type(const type_base_sptr &type)
Return the leaf underlying type of a qualified type.
array_type_def * is_array_type(const type_or_decl_base *type)
Test if a type is an array_type_def.
bool is_at_template_scope(const shared_ptr< decl_base > decl)
Tests whether a given decl is at template scope.
reference_type_def * is_reference_type(type_or_decl_base *t)
Test whether a type is a reference_type_def.
function_type_sptr lookup_function_type(const interned_string &qualified_name, const corpus &corp)
Look into a given corpus to find a function type which has a given qualified name.
const class_or_union_sptr data_member_has_anonymous_type(const var_decl &d)
Test if a data member has annonymous type or not.
type_decl * is_integral_type(const type_or_decl_base *t)
Test if a type is an integral type.
bool anonymous_data_member_exists_in_class(const var_decl &anon_dm, const class_or_union &clazz)
Test if a given anonymous data member exists in a class or union.
void set_member_function_is_dtor(function_decl &f, bool d)
Set the destructor-ness property of a member function.
const function_type * is_function_type(const type_or_decl_base *t)
Test whether a type is a function_type.
const type_base_sptr peel_array_type(const type_base_sptr &type)
Return the leaf element type of an array.
bool maybe_update_types_lookup_map< class_decl >(const class_decl_sptr &class_type, istring_type_base_wptrs_map_type &map, bool use_type_name_as_key)
This is the specialization for type class_decl of the function template:
bool types_have_similar_structure(const type_base_sptr &first, const type_base_sptr &second, bool indirect_type)
Test if two types have similar structures, even though they are (or can be) different.
shared_ptr< template_parameter > template_parameter_sptr
Convenience typedef for shared pointer to template parameter.
enum_type_decl_sptr look_through_decl_only_enum(enum_type_decl_sptr enom)
If an enum is a decl-only enum, get its definition. Otherwise, just return the initial enum.
class_or_union * is_class_or_union_type(const type_or_decl_base *t)
Test if a type is a class_or_union.
type_base_sptr look_through_decl_only(const type_base_sptr &t)
If a type is is decl-only, then get its definition. Otherwise, just return the initial type.
shared_ptr< class_decl > class_decl_sptr
Convenience typedef for a shared pointer on a class_decl.
type_base_sptr peel_typedef_pointer_or_reference_type(const type_base_sptr type)
Return the leaf underlying or pointed-to type node of a typedef_decl, pointer_type_def,...
void set_member_function_is_const(function_decl &f, bool is_const)
set the const-ness property of a member function.
string get_name(const type_or_decl_base_sptr &tod, bool qualified)
Build and return a copy of the name of an ABI artifact that is either a type of a decl.
bool is_anonymous_type(const type_base_sptr &t)
Test if a given type is anonymous.
decl_base_sptr strip_useless_const_qualification(const qualified_type_def_sptr t)
Strip qualification from a qualified type, when it makes sense.
bool string_to_elf_symbol_type(const string &s, elf_symbol::type &t)
Convert a string representing a symbol type into an elf_symbol::type.
namespace_decl_sptr is_namespace(const decl_base_sptr &d)
Tests if a declaration is a namespace declaration.
array_type_def_sptr is_array_of_qualified_element(const type_base_sptr &type)
Test if an array type is an array to a qualified element type.
const var_decl_sptr get_next_data_member(const class_or_union *klass, const var_decl_sptr &data_member)
In the context of a given class or union, this function returns the data member that is located after...
void set_member_function_is_ctor(function_decl &f, bool c)
Setter for the is_ctor property of the member function.
const type_decl * is_type_decl(const type_or_decl_base *t)
Test whether a type is a type_decl (a builtin type).
decl_base * is_decl_slow(const type_or_decl_base *t)
Test if an ABI artifact is a declaration.
decl_base_sptr look_through_decl_only(const decl_base &d)
If a decl is decl-only get its definition. Otherwise, just return nil.
function_type_sptr is_function_type(const type_or_decl_base_sptr &t)
Test whether a type is a function_type.
scope_decl_sptr is_scope_decl(const decl_base_sptr &d)
Test if a declaration is a scope_decl.
string get_name(const type_or_decl_base *tod, bool qualified)
Build and return a copy of the name of an ABI artifact that is either a type or a decl.
void set_member_access_specifier(decl_base &d, access_specifier a)
Sets the access specifier for a class member.
bool is_template_parameter(const shared_ptr< decl_base > decl)
Tests whether a decl is a template parameter.
typedef_decl_sptr is_typedef(const type_or_decl_base_sptr t)
Test whether a type is a typedef.
type_base_sptr is_type(const type_or_decl_base_sptr &tod)
Test whether a declaration is a type.
uint64_t get_var_size_in_bits(const var_decl_sptr &v)
Get the size of a given variable.
string get_debug_representation(const type_or_decl_base *artifact)
Get the textual representation of a type for debugging purposes.
shared_ptr< function_type > function_type_sptr
Convenience typedef for a shared pointer on a function_type.
shared_ptr< typedef_decl > typedef_decl_sptr
Convenience typedef for a shared pointer on a typedef_decl.
function_type_sptr synthesize_function_type_from_translation_unit(const function_type &fn_type, translation_unit &tu)
In a translation unit, lookup the sub-types that make up a given function type and if the sub-types a...
std::ostream & operator<<(std::ostream &o, elf_symbol::type t)
Serialize an instance of symbol_type and stream it to a given output stream.
type_base_sptr peel_pointer_type(const type_base_sptr &type)
Return the leaf pointed-to type node of a pointer_type_def node.
bool var_equals_modulo_types(const var_decl &l, const var_decl &r, change_kind *k)
Compares two instances of var_decl without taking their type into account.
type_base_sptr lookup_type_through_translation_units(const string &qn, const corpus &abi_corpus)
Lookup a type definition in all the translation units of a given ABI corpus.
void sort_types(const canonical_type_sptr_set_type &types, vector< type_base_sptr > &result)
Sort types in a hopefully stable manner.
type_base * peel_pointer_or_reference_type(const type_base *type, bool peel_qual_type)
Return the leaf underlying or pointed-to type node of a, pointer_type_def, reference_type_def or qual...
decl_base_sptr is_decl_slow(const type_or_decl_base_sptr &t)
Test if an ABI artifact is a declaration.
corpus::origin operator|(corpus::origin l, corpus::origin r)
Bitwise | operator for the corpus::origin type.
bool elf_symbol_is_function(elf_symbol::type t)
Test if the type of an ELF symbol denotes a function symbol.
bool is_cplus_plus_language(translation_unit::language l)
Test if a language enumerator designates the C++ language.
bool try_canonical_compare(const T *l, const T *r)
Compare two types by comparing their canonical types if present.
enum_type_decl_sptr is_compatible_with_enum_type(const decl_base_sptr &t)
Test if a type is an enum. This function looks through typedefs.
function_decl::parameter_sptr is_function_parameter(const type_or_decl_base_sptr tod)
Test whether an ABI artifact is a function_decl.
class_or_union_sptr look_through_decl_only_class(class_or_union_sptr klass)
If a class (or union) is a decl-only class, get its definition. Otherwise, just return the initial cl...
bool lookup_decl_only_class_types(const interned_string &qualified_name, const corpus &corp, type_base_wptrs_type &result)
Look into a given corpus to find the class type*s* that have a given qualified name and that are decl...
bool member_function_has_vtable_offset(const function_decl &f)
Test if a virtual member function has a vtable offset set.
bool parse_integral_type(const string &type_name, integral_type &type)
Parse an integral type from a string.
const type_base * peel_typedef_type(const type_base *type)
Return the leaf underlying type node of a typedef_decl node.
unordered_map< interned_string, bool, hash_interned_string > interned_string_bool_map_type
Convenience typedef for a map of interned_string -> bool.
type_base_sptr lookup_type_through_scopes(const list< string > &fqn, const translation_unit &tu)
Lookup a type from a translation unit by walking its scopes in sequence and by looking into them.
const enum_type_decl * is_enum_type(const type_or_decl_base *d)
Test if a decl is an enum_type_decl.
const global_scope * get_global_scope(const shared_ptr< decl_base > decl)
Return the global scope as seen by a given declaration.
unordered_map< interned_string, type_base_wptrs_type, hash_interned_string > istring_type_base_wptrs_map_type
A convenience typedef for a map which key is an interned_string and which value is a vector of type_b...
shared_ptr< class_or_union > is_class_or_union_type(const shared_ptr< type_or_decl_base > &t)
Test if a type is a class_or_union.
bool function_decl_is_less_than(const function_decl &f, const function_decl &s)
Test if the pretty representation of a given function_decl is lexicographically less then the pretty ...
bool elf_symbols_alias(const elf_symbol &s1, const elf_symbol &s2)
Test if two symbols alias.
var_decl_sptr find_data_member_from_anonymous_data_member(const var_decl_sptr &anon_dm, const string &name)
Find a data member inside an anonymous data member.
shared_ptr< var_decl > var_decl_sptr
Convenience typedef for a shared pointer on a var_decl.
const location & get_natural_or_artificial_location(const decl_base *decl)
Get the non-artificial (natural) location of a decl.
string build_qualified_name(const scope_decl *scope, const type_base_sptr &type)
Build and return the qualified name of a type in its scope.
size_t hash_type_or_decl(const type_or_decl_base *tod)
Hash an ABI artifact that is either a type or a decl.
corpus::origin operator&(corpus::origin l, corpus::origin r)
Bitwise & operator for the corpus::origin type.
unordered_map< const function_decl *, string, function_decl::hash, function_decl::ptr_equal > fns_to_str_map_type
Convenience typedef for a hash map of pointer to function_decl and string.
shared_ptr< scope_decl > scope_decl_sptr
Convenience typedef for a shared pointer on a scope_decl.
class_decl_sptr lookup_class_type_per_location(const string &loc, const corpus &corp)
Look up a class_decl from a given corpus by its location.
bool string_to_elf_symbol_binding(const string &s, elf_symbol::binding &b)
Convert a string representing a an elf symbol binding into an elf_symbol::binding.
shared_ptr< type_or_decl_base > type_or_decl_base_sptr
A convenience typedef for a shared_ptr to type_or_decl_base.
shared_ptr< translation_unit > translation_unit_sptr
Convenience typedef for a shared pointer on a translation_unit type.
namespace_decl * is_namespace(const decl_base *d)
Tests if a declaration is a namespace declaration.
type_base * peel_typedef_pointer_or_reference_type(const type_base *type, bool peel_qual_type)
Return the leaf underlying or pointed-to type node of a typedef_decl, pointer_type_def or reference_t...
lookup_entity_kind
This enum describe the kind of entity to lookup, while using the lookup API.
type_base * type_has_non_canonicalized_subtype(type_base_sptr t)
Test if a type has sub-types that are non-canonicalized.
bool is_function_template_pattern(const shared_ptr< decl_base > decl)
Test whether a decl is the pattern of a function template.
void push_composite_type_comparison_operands(const type_base &left, const type_base &right)
Push a pair of operands on the stack of operands of the current type comparison, during type canonica...
bool is_java_language(translation_unit::language l)
Test if a language enumerator designates the Java language.
function_decl::parameter * is_function_parameter(const type_or_decl_base *tod)
Test whether a declaration is a function_decl.
type_decl_sptr lookup_basic_type(const string &qualified_name, const corpus &corp)
Look into a given corpus to find a basic type which has a given qualified name.
class_or_union * is_at_class_scope(const decl_base &decl)
Tests whether a given decl is at class scope.
bool equals(const decl_base &l, const decl_base &r, change_kind *k)
Compares two instances of decl_base.
bool get_data_member_is_laid_out(const var_decl &m)
Test whether a data member is laid out.
bool is_template_parm_composition_type(const shared_ptr< decl_base > decl)
Tests whether a decl is a template parameter composition type.
const decl_base_sptr lookup_var_decl_in_scope(const std::list< string > &comps, const scope_decl_sptr &skope)
lookup a var_decl in a scope.
bool string_to_elf_symbol_visibility(const string &s, elf_symbol::visibility &v)
Convert a string representing a an elf symbol visibility into an elf_symbol::visibility.
union_decl_sptr lookup_union_type_per_location(const string &loc, const corpus &corp)
Lookup a union type in a given corpus, from its location.
bool is_declaration_only_class_type(const type_base_sptr &t)
Test wheter a type is a declaration-only class.
type_base_sptr canonicalize(type_base_sptr t)
Compute the canonical type of a given type.
weak_ptr< elf_symbol > elf_symbol_wptr
A convenience typedef for a weak pointer to elf_symbol.
bool get_member_function_is_const(const function_decl &f)
Test whether a member function is const.
interned_string get_name_of_reference_to_type(const type_base &pointed_to_type, bool lvalue_reference, bool qualified, bool internal)
Get the name of the reference to a given type.
shared_ptr< pointer_type_def > pointer_type_def_sptr
Convenience typedef for a shared pointer on a pointer_type_def.
void maybe_update_types_lookup_map(const type_decl_sptr &basic_type)
Update the map that associates the fully qualified name of a basic type with the type itself.
pointer_type_def * is_pointer_type(type_or_decl_base *t)
Test whether a type is a pointer_type_def.
interned_string get_method_type_name(const method_type &fn_type, bool internal)
Get the name of a given method type and return a copy of it.
translation_unit::language string_to_translation_unit_language(const string &l)
Parse a string representing a language into a translation_unit::language enumerator into a string.
enum_type_decl_sptr is_enum_type(const type_or_decl_base_sptr &d)
Test if a decl is an enum_type_decl.
type_base_sptr lookup_type_per_location(const interned_string &loc, const corpus &corp)
Lookup a type from a corpus, by its location.
bool get_next_data_member_offset(const class_or_union *klass, const var_decl_sptr &dm, uint64_t &offset)
Get the offset of the non-static data member that comes after a given one.
uint64_t get_absolute_data_member_offset(const var_decl &m)
Get the absolute offset of a data member.
shared_ptr< ir_traversable_base > ir_traversable_base_sptr
Convenience typedef for a shared pointer to ir_traversable_base.
bool is_member_function(const function_decl &f)
Test whether a function_decl is a member function.
const function_decl::parameter * get_function_parameter(const decl_base *fun, unsigned parm_index)
Get the function parameter designated by its index.
var_decl * is_var_decl(const type_or_decl_base *tod)
Tests if a declaration is a variable declaration.
bool is_c_language(translation_unit::language l)
Test if a language enumerator designates the C language.
decl_base * is_decl(const type_or_decl_base *d)
Test if an ABI artifact is a declaration.
void keep_type_alive(type_base_sptr t)
Make sure that the life time of a given (smart pointer to a) type is the same as the life time of the...
method_decl * is_method_decl(const type_or_decl_base *d)
Test if a function_decl is actually a method_decl.
bool is_member_type(const type_base_sptr &t)
Tests if a type is a class member.
string get_class_or_union_flat_representation(const class_or_union &cou, const string &indent, bool one_line, bool internal, bool qualified_names)
Get the flat representation of an instance of class_or_union type.
array_type_def::subrange_sptr is_subrange_type(const type_or_decl_base_sptr &type)
Test if a type is an array_type_def::subrange_type.
decl_base_sptr add_decl_to_scope(decl_base_sptr decl, scope_decl *scope)
Appends a declaration to a given scope, if the declaration doesn't already belong to one.
string build_internal_underlying_enum_type_name(const string &base_name, bool is_anonymous, uint64_t size)
Build the internal name of the underlying type of an enum.
access_specifier get_member_access_specifier(const decl_base &d)
Gets the access specifier for a class member.
shared_ptr< enum_type_decl > enum_type_decl_sptr
Convenience typedef for shared pointer to a enum_type_decl.
void set_data_member_offset(var_decl_sptr m, uint64_t o)
Set the offset of a data member into its containing class.
type_base_sptr strip_typedef(const type_base_sptr type)
Recursively returns the the underlying type of a typedef. The return type should not be a typedef of ...
uint64_t get_data_member_offset(const var_decl &m)
Get the offset of a data member.
unordered_set< uintptr_t > pointer_set
A convenience typedef for an unordered set of pointer values.
type_decl_sptr is_type_decl(const type_or_decl_base_sptr &t)
Test whether a type is a type_decl (a builtin type).
class_or_union * is_at_class_scope(const decl_base_sptr decl)
Tests whether a given decl is at class scope.
bool get_member_function_is_virtual(const function_decl &f)
Test if a given member function is virtual.
bool types_are_compatible(const decl_base_sptr d1, const decl_base_sptr d2)
Test if two types are equal modulo a typedef.
class_or_union * anonymous_data_member_to_class_or_union(const var_decl *d)
Get the class_or_union type of a given anonymous data member.
location get_location(const type_base_sptr &type)
Get the location of the declaration of a given type.
weak_ptr< decl_base > decl_base_wptr
Convenience typedef for a weak pointer to a decl_base.
decl_base_sptr insert_decl_into_scope(decl_base_sptr decl, scope_decl::declarations::iterator before, scope_decl *scope)
Inserts a declaration into a given scope, before a given IR child node of the scope.
interned_string get_function_type_name(const function_type_sptr &fn_type, bool internal)
Get the name of a given function type and return a copy of it.
bool return_comparison_result(T &l, T &r, bool value, bool propagate_canonical_type=true)
Return the result of the comparison of two (sub) types.
class_or_union * look_through_decl_only_class(class_or_union *the_class)
If a class (or union) is a decl-only class, get its definition. Otherwise, just return the initial cl...
bool is_union_type(const type_or_decl_base &t)
Test if a type is a union_decl.
const location & get_artificial_or_natural_location(const decl_base *decl)
Get the artificial location of a decl.
typedef_decl_sptr lookup_typedef_type_per_location(const string &loc, const corpus &corp)
Lookup a typedef_decl from a corpus, by its location.
type_base_sptr peel_typedef_type(const type_base_sptr &type)
Return the leaf underlying type node of a typedef_decl node.
interned_string get_name_of_qualified_type(const type_base_sptr &underlying_type, qualified_type_def::CV quals, bool qualified, bool internal)
Get the name of a qualified type, given the underlying type and its qualifiers.
shared_ptr< template_decl > template_decl_sptr
Convenience typedef for a shared pointer to template_decl.
array_type_def_sptr is_typedef_of_array(const type_base_sptr &t)
Test if a type is a typedef of an array.
string get_string_representation_of_cv_quals(const qualified_type_def::CV cv_quals)
Get the string representation of a CV qualifier bitmap.
void set_data_member_is_laid_out(var_decl_sptr m, bool l)
Set a flag saying if a data member is laid out.
array_type_def_sptr is_array_type(const type_or_decl_base_sptr &type)
Test if a type is an array_type_def.
bool is_data_member(const var_decl &v)
Test if a var_decl is a data member.
var_decl_sptr find_first_data_member_matching_regexp(const class_or_union &t, const regex::regex_t_sptr &r)
Find the first data member of a class or union which name matches a regular expression.
union_decl_sptr is_union_type(const shared_ptr< type_or_decl_base > &t)
Test if a type is a union_decl.
const decl_base * get_type_declaration(const type_base *t)
Get the declaration for a given type.
bool is_at_global_scope(const decl_base *decl)
Tests whether a given declaration is at global scope.
void set_member_is_static(decl_base &d, bool s)
Sets the static-ness property of a class member.
weak_ptr< template_decl > template_decl_wptr
Convenience typedef for a weak pointer to template_decl.
const var_decl * lookup_data_member(const type_base *type, const char *dm_name)
Look for a data member of a given class, struct or union type and return it.
shared_ptr< type_decl > type_decl_sptr
Convenience typedef for a shared pointer on a type_decl.
bool is_comparison_cycle_detected(T &l, T &r)
Detect if a recursive comparison cycle is detected while structurally comparing two types (a....
typedef_decl_sptr clone_typedef(const typedef_decl_sptr &t)
Clone a typedef type.
string get_pretty_representation(const method_type_sptr method, bool internal)
Get the pretty representation of a method type.
typedef_decl * is_typedef(type_base *t)
Test whether a type is a typedef.
void unmark_types_as_being_compared(T &l, T &r)
Mark a pair of types as being not compared anymore.
unordered_set< type_base_sptr, canonical_type_hash > canonical_type_sptr_set_type
Helper typedef for an unordered set of type_base_sptr which uses pointer value to tell its members ap...
bool is_template_decl(const shared_ptr< decl_base > decl)
Tests whether a decl is a template.
array_type_def_sptr lookup_array_type(const interned_string &qualified_name, const corpus &corp)
Look into a given corpus to find an array type which has the same qualified name as a given array typ...
shared_ptr< namespace_decl > namespace_decl_sptr
Convenience typedef for a shared pointer on namespace_decl.
var_decl_sptr is_var_decl(const type_or_decl_base_sptr &decl)
Tests if a declaration is a variable declaration.
bool is_ada_language(translation_unit::language l)
Test if a language enumerator designates the Ada language.
string demangle_cplus_mangled_name(const string &mangled_name)
Demangle a C++ mangled name and return the resulting string.
string components_to_type_name(const list< string > &comps)
Turn a set of qualified name components (that name a type) into a qualified name string.
interned_string get_type_name(const type_base_sptr &t, bool qualified, bool internal)
Get the name of a given type and return a copy of it.
bool mark_dependant_types_compared_until(const type_base &r)
In the stack of the current types being compared (as part of type canonicalization),...
corpus::origin operator&=(corpus::origin &l, corpus::origin r)
Bitwise &= operator for the corpus::origin type.
type_base_sptr clone_array_tree(const type_base_sptr t)
Clone a type tree made of an array or a typedef of array.
interned_string get_function_type_name(const function_type &fn_type, bool internal)
Get the name of a given function type and return a copy of it.
decl_base_sptr is_decl(const type_or_decl_base_sptr &d)
Test if an ABI artifact is a declaration.
bool operator!=(const translation_unit_sptr &l, const translation_unit_sptr &r)
A deep inequality operator for pointers to translation units.
interned_string get_name_of_pointer_to_type(const type_base &pointed_to_type, bool qualified, bool internal)
Get the name of the pointer to a given type.
function_decl * is_function_decl(const type_or_decl_base *d)
Test whether a declaration is a function_decl.
bool elf_symbol_is_variable(elf_symbol::type t)
Test if the type of an ELF symbol denotes a function symbol.
bool type_has_sub_type_changes(const type_base_sptr t_v1, const type_base_sptr t_v2)
Tests if the change of a given type effectively comes from just its sub-types. That is,...
reference_type_def_sptr is_reference_type(const type_or_decl_base_sptr &t)
Test whether a type is a reference_type_def.
method_type_sptr is_method_type(const type_or_decl_base_sptr &t)
Test whether a type is a method_type.
qualified_type_def * is_qualified_type(const type_or_decl_base *t)
Test whether a type is a reference_type_def.
const scope_decl * get_top_most_scope_under(const decl_base_sptr decl, const scope_decl_sptr scope)
Return the a scope S containing a given declaration and that is right under a given scope P.
std::unordered_map< string, elf_symbols > string_elf_symbols_map_type
Convenience typedef for a map which key is a string and which value is a vector of elf_symbol.
interned_string get_function_id_or_pretty_representation(function_decl *fn)
Get the ID of a function, or, if the ID can designate several different functions,...
string build_qualified_name(const scope_decl *scope, const string &name)
Build and return a qualified name from a name and its scope.
void set_member_function_vtable_offset(function_decl &f, ssize_t s)
Set the vtable offset of a member function.
method_decl_sptr copy_member_function(const class_or_union_sptr &t, const method_decl_sptr &method)
Copy a method of a class_or_union into a new class_or_union.
decl_base_sptr get_type_declaration(const type_base_sptr t)
Get the declaration for a given type.
shared_ptr< function_tdecl > function_tdecl_sptr
Convenience typedef for a shared pointer on a function_tdecl.
type_base * peel_qualified_or_typedef_type(const type_base *type)
Return the leaf underlying type of a qualified or typedef type.
type_base_sptr type_or_void(const type_base_sptr t, const environment &env)
Return either the type given in parameter if it's non-null, or the void type.
const type_base_wptrs_type * lookup_union_types(const string &qualified_name, const corpus &corp)
Look into a given corpus to find the union types that have a given qualified name.
bool is_member_decl(const decl_base_sptr d)
Tests if a declaration is a class member.
bool maybe_compare_as_member_decls(const decl_base &l, const decl_base &r, change_kind *k)
Compare the properties that belong to the "is-a-member-relation" of a decl.
qualified_type_def_sptr is_qualified_type(const type_or_decl_base_sptr &t)
Test whether a type is a qualified_type_def.
class_decl_sptr lookup_class_type_through_scopes(const list< string > &fqn, const translation_unit &tu)
Lookup a class type from a translation unit by walking its scopes in sequence and by looking into the...
const type_base * is_void_pointer_type(const type_base *type)
Test if a type is a pointer to void type.
void fqn_to_components(const string &fqn, list< string > &comps)
Decompose a fully qualified name into the list of its components.
bool get_member_function_is_ctor(const function_decl &f)
Test whether a member function is a constructor.
enum_type_decl_sptr lookup_enum_type(const interned_string &qualified_name, const corpus &corp)
Look into a given corpus to find an enum type which has a given qualified name.
bool match(const regex_t_sptr &r, const std::string &str)
See if a string matches a regex.
std::shared_ptr< regex_t > regex_t_sptr
A convenience typedef for a shared pointer of regex_t.
Toplevel namespace for libabigail.
std::string operator+(const interned_string &s1, const std::string &s2)
Concatenation operator.
bool operator==(const std::string &l, const interned_string &r)
Equality operator.
std::ostream & operator<<(std::ostream &o, const interned_string &s)
Streaming operator.
unordered_map< string, string * > pool_map_type
Convenience typedef for a map of string -> string*.
A functor to hash instances of interned_string.
size_t operator()(const type_base_sptr &l) const
Hash a type by returning the pointer value of its canonical type.
The hashing functor for class_decl::base_spec.
Hasher for the class_decl type.
The private data of the environment type.
A hashing functor fo instances and pointers of function_decl.
A hashing functor for a function_decl::parameter.
Equality functor for instances of function_decl.
The hashing functor for function_type.
The type of the private data of the function_type type.
virtual bool traverse(ir_node_visitor &v)
Traverse a given IR node and its children, calling an visitor on each node.
The hashing functor for member_base.
Hasher for the non_type_tparameter type.
Hasher for the scope_decl type.
Private type to hold private members of translation_unit.
Definition of the private data of type_base.
Hasher for the type_composition type.
A predicate for deep equality of instances of shared_ptr<type_base>
A hashing functor for instances and pointers of var_decl.
A deleter for shared pointers that ... doesn't delete the object managed by the shared pointer.