20#include <unordered_map>
24#include "abg-internal.h"
26ABG_BEGIN_EXPORT_DECLARATIONS
33ABG_END_EXPORT_DECLARATIONS
69using std::unordered_map;
70using std::dynamic_pointer_cast;
71using std::static_pointer_cast;
78struct 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);}
156operator!=(
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);}
207hash_as_canonical_type_or_constant(
const type_base *t);
210has_generic_anonymous_internal_type_name(
const decl_base *d);
212static interned_string
213get_generic_anonymous_internal_type_name(
const decl_base *d);
216get_internal_integral_type_name(
const type_base*);
219update_qualified_name(decl_base * d);
222update_qualified_name(decl_base_sptr d);
224static interned_string
225pointer_declaration_name(
const type_base* ptr,
226 const string& variable_name,
227 bool qualified,
bool internal);
229static interned_string
230pointer_declaration_name(
const type_base_sptr& ptr,
231 const string& variable_name,
232 bool qualified,
bool internal);
234static interned_string
235ptr_to_mbr_declaration_name(
const ptr_to_mbr_type* ptr,
236 const string& variable_name,
237 bool qualified,
bool internal);
239static interned_string
241 const string& variable_name,
242 bool qualified,
bool internal);
244static interned_string
245array_declaration_name(
const array_type_def* array,
246 const string& variable_name,
247 bool qualified,
bool internal);
249static interned_string
251 const string& variable_name,
252 bool qualified,
bool internal);
255stream_pretty_representation_of_fn_parms(
const function_type& fn_type,
256 ostream& o,
bool qualified,
259add_outer_pointer_to_fn_type_expr(
const type_base* pointer_to_fn,
260 const string& input,
bool qualified,
264add_outer_pointer_to_fn_type_expr(
const type_base_sptr& pointer_to_fn,
265 const string& input,
bool qualified,
269add_outer_pointer_to_array_type_expr(
const type_base* pointer_to_ar,
270 const string& input,
bool qualified,
274add_outer_pointer_to_array_type_expr(
const type_base_sptr& pointer_to_ar,
275 const string& input,
bool qualified,
279add_outer_ptr_to_mbr_type_expr(
const ptr_to_mbr_type* p,
280 const string& input,
bool qualified,
285 const string& input,
bool qualified,
289add_outer_pointer_to_ptr_to_mbr_type_expr(
const type_base* p,
291 bool qualified,
bool internal);
295 const type_base& right);
299 const type_base& right);
318 env.priv_->push_composite_type_comparison_operands(&left, &right);
339 env.priv_->pop_composite_type_comparison_operands(&left, &right);
403 return env.priv_->mark_dependant_types_compared_until(&r);
410class expanded_location
422 expanded_location(
const string& path,
unsigned line,
unsigned column)
423 : path_(path), line_(line), column_(column)
429 return (path_ == l.path_
431 && column_ && l.column_);
435 operator<(
const expanded_location& l)
const
439 else if (path_ > l.path_)
444 else if (line_ > l.line_)
447 return column_ < l.column_;
464 if (!get_location_manager())
485 unsigned line = 0, column = 0;
486 expand(path, line, column);
488 std::ostringstream o;
489 o << path <<
":" << line <<
":" << column;
493struct location_manager::priv
499 std::vector<expanded_location> locs;
502location_manager::location_manager()
506location_manager::~location_manager() =
default;
521 expanded_location l(file_path, line, col);
525 priv_->locs.push_back(l);
526 return location(priv_->locs.size(),
this);
543 unsigned& column)
const
547 expanded_location &l = priv_->locs[
location.value_ - 1];
560struct type_maps::priv
574 mutable vector<type_base_wptr> sorted_types_;
577type_maps::type_maps()
581type_maps::~type_maps() =
default;
606{
return priv_->basic_types_;}
613{
return priv_->basic_types_;}
620{
return priv_->class_types_;}
627{
return priv_->class_types_;}
634{
return priv_->union_types_;}
641{
return priv_->union_types_;}
648{
return priv_->enum_types_;}
655{
return priv_->enum_types_;}
662{
return priv_->typedef_types_;}
669{
return priv_->typedef_types_;}
675{
return priv_->qualified_types_;}
681{
return priv_->qualified_types_;}
688{
return priv_->pointer_types_;}
695{
return priv_->ptr_to_mbr_types_;}
702{
return priv_->ptr_to_mbr_types_;}
709{
return priv_->pointer_types_;}
716{
return priv_->reference_types_;}
723{
return priv_->reference_types_;}
730{
return priv_->array_types_;}
737{
return priv_->array_types_;}
744{
return priv_->subrange_types_;}
751{
return priv_->subrange_types_;}
758{
return priv_->function_types_;}
765{
return priv_->function_types_;}
784 if (l == 0 && r == 0)
789 return l_repr < r_repr;
803 operator()(
const type_base_sptr &l,
const type_base_sptr &r)
const
804 {
return operator()(l.get(), r.get());}
818 {
return operator()(type_base_sptr(l), type_base_sptr(r));}
821#ifdef WITH_DEBUG_SELF_COMPARISON
837notify_equality_failed(
const type_or_decl_base &l __attribute__((unused)),
838 const type_or_decl_base &r __attribute__((unused)))
855notify_equality_failed(
const type_or_decl_base *l __attribute__((unused)),
856 const type_or_decl_base *r __attribute__((unused)))
859#define ABG_RETURN_EQUAL(l, r) \
863 notify_equality_failed(l, r); \
869#define ABG_RETURN_FALSE \
872 notify_equality_failed(l, r); \
876#define ABG_RETURN(value) \
879 if (value == false) \
880 notify_equality_failed(l, r); \
886#define ABG_RETURN_FALSE return false
887#define ABG_RETURN(value) return (value)
888#define ABG_RETURN_EQUAL(l, r) return ((l) == (r));
904#if WITH_DEBUG_TYPE_CANONICALIZATION
924 if (env.priv_->use_canonical_type_comparison_)
928 ABG_RETURN_EQUAL(lc, rc);
934 ABG_RETURN_EQUAL(lc, rc);
953 bool result = l.priv_->comparison_started(l, r);
993#define RETURN_TRUE_IF_COMPARISON_CYCLE_DETECTED(l, r) \
996 if (is_comparison_cycle_detected(l, r)) \
998 mark_dependant_types_compared_until(r); \
1017 l.priv_->mark_as_being_compared(l, r);
1052 l.priv_->unmark_as_being_compared(l, r);
1101 bool propagate_canonical_type =
true)
1103 if (propagate_canonical_type && (value ==
true))
1104 maybe_propagate_canonical_type(l, r);
1117 && (
is_type(&r)->priv_->depends_on_recursive_type()
1118 || env.priv_->is_recursive_type(&r))
1119 &&
is_type(&r)->priv_->canonical_type_propagated()
1120 && !
is_type(&r)->priv_->propagated_canonical_type_confirmed()
1121 && !env.priv_->right_type_comp_operands_.empty())
1126 env.priv_->add_to_types_with_non_confirmed_propagated_ct(
is_type(&r));
1128 else if (value ==
true
1129 && env.priv_->right_type_comp_operands_.empty()
1130 &&
is_type(&r)->priv_->canonical_type_propagated()
1131 && !
is_type(&r)->priv_->propagated_canonical_type_confirmed())
1140 env.priv_->confirm_ct_propagation(&r);
1142 else if (value ==
true
1143 &&
is_type(&r)->priv_->canonical_type_propagated()
1144 && !
is_type(&r)->priv_->propagated_canonical_type_confirmed())
1147 env.priv_->add_to_types_with_non_confirmed_propagated_ct(
is_type(&r));
1148 else if (value ==
false)
1155 env.priv_->cancel_all_non_confirmed_propagated_canonical_types();
1167 && env.priv_->right_type_comp_operands_.empty()
1168 && !env.priv_->types_with_non_confirmed_propagated_ct_.empty())
1173 env.priv_->confirm_ct_propagation();
1175#ifdef WITH_DEBUG_SELF_COMPARISON
1176 if (value ==
false && env.priv_->right_type_comp_operands_.empty())
1178 for (
const auto i : env.priv_->types_with_non_confirmed_propagated_ct_)
1181 env.priv_->check_abixml_canonical_type_propagation_during_self_comp(t);
1189#define CACHE_AND_RETURN_COMPARISON_RESULT(value) \
1192 bool res = return_comparison_result(l, r, value); \
1193 l.get_environment().priv_->cache_type_comparison_result(l, r, res); \
1201#define CACHE_COMPARISON_RESULT_AND_RETURN(value) \
1204 l.get_environment().priv_->cache_type_comparison_result(l, r, value); \
1212const vector<type_base_wptr>&
1215 if (priv_->sorted_types_.empty())
1217 istring_type_base_wptrs_map_type::const_iterator i;
1218 vector<type_base_wptr>::const_iterator j;
1221 for (j = i->second.begin(); j != i->second.end(); ++j)
1222 priv_->sorted_types_.push_back(*j);
1225 for (j = i->second.begin(); j != i->second.end(); ++j)
1226 priv_->sorted_types_.push_back(*j);
1229 for (j = i->second.begin(); j != i->second.end(); ++j)
1230 priv_->sorted_types_.push_back(*j);
1233 for (j = i->second.begin(); j != i->second.end(); ++j)
1234 priv_->sorted_types_.push_back(*j);
1237 for (j = i->second.begin(); j != i->second.end(); ++j)
1238 priv_->sorted_types_.push_back(*j);
1240 type_name_comp comp;
1241 sort(priv_->sorted_types_.begin(), priv_->sorted_types_.end(), comp);
1244 return priv_->sorted_types_;
1263 const std::string& path,
1265 : priv_(new
priv(env))
1267 priv_->path_ = path;
1268 priv_->address_size_ = address_size;
1290 if (!priv_->global_scope_)
1292 priv_->global_scope_.reset
1294 priv_->global_scope_->set_translation_unit
1297 return priv_->global_scope_;
1305{
return priv_->types_;}
1312{
return priv_->types_;}
1319const vector<function_type_sptr>&
1321{
return priv_->live_fn_types_;}
1328{
return priv_->env_;}
1335{
return priv_->language_;}
1342{priv_->language_ = l;}
1355{
return priv_->path_;}
1366{priv_->path_ = a_path;}
1379{
return priv_->comp_dir_path_;}
1390{priv_->comp_dir_path_ = d;}
1399 if (priv_->abs_path_.empty())
1402 if (!priv_->path_.empty())
1404 if (!priv_->comp_dir_path_.empty())
1406 path = priv_->comp_dir_path_;
1409 path += priv_->path_;
1411 priv_->abs_path_ = path;
1414 return priv_->abs_path_;
1433{
return priv_->corp;}
1449{
return priv_->loc_mgr_;}
1457{
return priv_->loc_mgr_;}
1466 if (!priv_->global_scope_)
1476{
return priv_->address_size_;}
1483{priv_->address_size_= a;}
1499{
return priv_->is_constructed_;}
1515{priv_->is_constructed_ = f;}
1554 const_cast<translation_unit*
>(
this)->priv_->live_fn_types_.push_back(ftype);
1587translation_unit::~translation_unit()
1600 case translation_unit::LANG_UNKNOWN:
1601 return "LANG_UNKNOWN";
1602 case translation_unit::LANG_Cobol74:
1603 return "LANG_Cobol74";
1604 case translation_unit::LANG_Cobol85:
1605 return "LANG_Cobol85";
1606 case translation_unit::LANG_C89:
1608 case translation_unit::LANG_C99:
1610 case translation_unit::LANG_C11:
1612 case translation_unit::LANG_C:
1614 case translation_unit::LANG_C_plus_plus_11:
1615 return "LANG_C_plus_plus_11";
1616 case translation_unit::LANG_C_plus_plus_14:
1617 return "LANG_C_plus_plus_14";
1618 case translation_unit::LANG_C_plus_plus:
1619 return "LANG_C_plus_plus";
1620 case translation_unit::LANG_ObjC:
1622 case translation_unit::LANG_ObjC_plus_plus:
1623 return "LANG_ObjC_plus_plus";
1624 case translation_unit::LANG_Fortran77:
1625 return "LANG_Fortran77";
1626 case translation_unit::LANG_Fortran90:
1627 return "LANG_Fortran90";
1628 case translation_unit::LANG_Fortran95:
1629 return "LANG_Fortran95";
1630 case translation_unit::LANG_Ada83:
1631 return "LANG_Ada83";
1632 case translation_unit::LANG_Ada95:
1633 return "LANG_Ada95";
1634 case translation_unit::LANG_Pascal83:
1635 return "LANG_Pascal83";
1636 case translation_unit::LANG_Modula2:
1637 return "LANG_Modula2";
1638 case translation_unit::LANG_Java:
1640 case translation_unit::LANG_PLI:
1642 case translation_unit::LANG_UPC:
1644 case translation_unit::LANG_D:
1646 case translation_unit::LANG_Python:
1647 return "LANG_Python";
1648 case translation_unit::LANG_Go:
1650 case translation_unit::LANG_Mips_Assembler:
1651 return "LANG_Mips_Assembler";
1653 return "LANG_UNKNOWN";
1656 return "LANG_UNKNOWN";
1668 if (l ==
"LANG_Cobol74")
1669 return translation_unit::LANG_Cobol74;
1670 else if (l ==
"LANG_Cobol85")
1671 return translation_unit::LANG_Cobol85;
1672 else if (l ==
"LANG_C89")
1673 return translation_unit::LANG_C89;
1674 else if (l ==
"LANG_C99")
1675 return translation_unit::LANG_C99;
1676 else if (l ==
"LANG_C11")
1677 return translation_unit::LANG_C11;
1678 else if (l ==
"LANG_C")
1679 return translation_unit::LANG_C;
1680 else if (l ==
"LANG_C_plus_plus_11")
1681 return translation_unit::LANG_C_plus_plus_11;
1682 else if (l ==
"LANG_C_plus_plus_14")
1683 return translation_unit::LANG_C_plus_plus_14;
1684 else if (l ==
"LANG_C_plus_plus")
1685 return translation_unit::LANG_C_plus_plus;
1686 else if (l ==
"LANG_ObjC")
1687 return translation_unit::LANG_ObjC;
1688 else if (l ==
"LANG_ObjC_plus_plus")
1689 return translation_unit::LANG_ObjC_plus_plus;
1690 else if (l ==
"LANG_Fortran77")
1691 return translation_unit::LANG_Fortran77;
1692 else if (l ==
"LANG_Fortran90")
1693 return translation_unit::LANG_Fortran90;
1694 else if (l ==
"LANG_Fortran95")
1695 return translation_unit::LANG_Fortran95;
1696 else if (l ==
"LANG_Ada83")
1697 return translation_unit::LANG_Ada83;
1698 else if (l ==
"LANG_Ada95")
1699 return translation_unit::LANG_Ada95;
1700 else if (l ==
"LANG_Pascal83")
1701 return translation_unit::LANG_Pascal83;
1702 else if (l ==
"LANG_Modula2")
1703 return translation_unit::LANG_Modula2;
1704 else if (l ==
"LANG_Java")
1705 return translation_unit::LANG_Java;
1706 else if (l ==
"LANG_PLI")
1707 return translation_unit::LANG_PLI;
1708 else if (l ==
"LANG_UPC")
1709 return translation_unit::LANG_UPC;
1710 else if (l ==
"LANG_D")
1711 return translation_unit::LANG_D;
1712 else if (l ==
"LANG_Python")
1713 return translation_unit::LANG_Python;
1714 else if (l ==
"LANG_Go")
1715 return translation_unit::LANG_Go;
1716 else if (l ==
"LANG_Mips_Assembler")
1717 return translation_unit::LANG_Mips_Assembler;
1719 return translation_unit::LANG_UNKNOWN;
1730 return (l == translation_unit::LANG_C89
1731 || l == translation_unit::LANG_C99
1732 || l == translation_unit::LANG_C11
1733 || l == translation_unit::LANG_C);
1744 return (l == translation_unit::LANG_C_plus_plus_03
1745 || l == translation_unit::LANG_C_plus_plus_11
1746 || l == translation_unit::LANG_C_plus_plus_14
1747 || l == translation_unit::LANG_C_plus_plus);
1757{
return l == translation_unit::LANG_Java;}
1767 return (l == translation_unit::LANG_Ada83
1768 || l == translation_unit::LANG_Ada95);
1781 if (l.get() == r.get())
1804struct elf_symbol::priv
1844 bool is_in_ksymtab_;
1847 bool is_suppressed_;
1862 is_in_ksymtab_(false),
1865 is_suppressed_(false)
1868 priv(
const environment& e,
1876 const elf_symbol::version& ve,
1898 is_common_ = type_ == COMMON_TYPE;
1932elf_symbol::elf_symbol(
const environment& e,
2008 elf_symbol_sptr sym(
new elf_symbol(e, i, s, n, t, b, d, c, ve, vi,
2010 sym->priv_->main_symbol_ = sym;
2050{
return priv_->env_;}
2057{
return priv_->index_;}
2071{
return priv_->name_;}
2080 priv_->id_string_.clear();
2088{
return priv_->type_;}
2102{
return priv_->size_;}
2109{priv_->size_ = size;}
2116{
return priv_->binding_;}
2123{priv_->binding_ = b;}
2130{
return priv_->version_;}
2138 priv_->version_ = v;
2139 priv_->id_string_.clear();
2148{priv_->visibility_ = v;}
2156{
return priv_->visibility_;}
2164{
return priv_->is_defined_;}
2172{priv_->is_defined_ = d;}
2225{
return priv_->is_in_ksymtab_;}
2240{
return priv_->crc_;}
2254{
return priv_->namespace_;}
2261{priv_->namespace_ = ns;}
2270{
return priv_->is_suppressed_;}
2309{
return priv_->main_symbol_.lock();}
2316{
return priv_->main_symbol_.lock();}
2330{
return priv_->next_alias_.lock();}
2350 a = a->get_next_alias())
2373 a && !a->is_main_symbol();
2374 a = a->get_next_alias())
2376 if (a->get_next_alias()->is_main_symbol())
2384 last_alias->priv_->next_alias_ = alias;
2387 priv_->next_alias_ = alias;
2417 a = a->get_next_alias())
2418 if (a->get_name() == name)
2428 priv_->main_symbol_ = new_main;
2430 a = a->get_next_alias())
2431 a->priv_->main_symbol_ = new_main;
2441{
return priv_->is_common_;}
2472{
return priv_->next_common_instance_.lock();}
2487 ABG_ASSERT(!common->has_other_common_instances());
2496 c = c->get_next_common_instance())
2501 last_common_instance = c;
2506 last_common_instance->priv_->next_common_instance_ = common;
2509 priv_->next_common_instance_ = common;
2529 if (priv_->id_string_.empty())
2541 priv_->id_string_ = s;
2544 return priv_->id_string_;
2561 a = a->get_next_alias())
2562 if (a->get_name() == name)
2579 a && a.get() != a->get_main_symbol().get();
2580 a = a->get_next_alias())
2581 if (textually_equals(*
this, *a))
2598 bool include_symbol_itself)
const
2602 if (include_symbol_itself)
2605 vector<elf_symbol_sptr> aliases;
2606 compute_aliases_for_elf_symbol(*
this, syms, aliases);
2607 if (!aliases.empty() && include_symbol_itself)
2610 for (vector<elf_symbol_sptr>::const_iterator i = aliases.begin();
2614 if (i != aliases.begin())
2616 result += (*i)->get_id_string();
2631 vector<elf_symbol_sptr> aliases;
2632 if (include_symbol_itself)
2637 a = a->get_next_alias())
2638 aliases.push_back(a);
2641 for (vector<elf_symbol_sptr>::const_iterator i = aliases.begin();
2645 if (i != aliases.begin())
2647 result += (*i)->get_id_string();
2667 name.clear(), ver.clear();
2669 string::size_type i =
id.find(
'@');
2670 if (i == string::npos)
2676 name =
id.substr(0, i);
2682 string::size_type j =
id.find(
'@', i);
2683 if (j == string::npos)
2710 bool are_equal = textually_equals(*
this, other);
2731 a && !a->is_main_symbol();
2732 a = a->get_next_alias())
2756 return *lhs == *rhs;
2782compute_aliases_for_elf_symbol(
const elf_symbol& sym,
2784 vector<elf_symbol_sptr>& aliases)
2788 for (; a && !a->is_main_symbol(); a = a->get_next_alias())
2789 aliases.push_back(a);
2791 for (string_elf_symbols_map_type::const_iterator i = symtab.begin();
2794 for (elf_symbols::const_iterator j = i->second.begin();
2795 j != i->second.end();
2800 s && !s->is_main_symbol();
2801 s = s->get_next_alias())
2802 aliases.push_back(s);
2805 s && !s->is_main_symbol();
2806 s = s->get_next_alias())
2808 aliases.push_back(*j);
2853 case elf_symbol::NOTYPE_TYPE:
2854 repr =
"unspecified symbol type";
2856 case elf_symbol::OBJECT_TYPE:
2857 repr =
"variable symbol type";
2859 case elf_symbol::FUNC_TYPE:
2860 repr =
"function symbol type";
2862 case elf_symbol::SECTION_TYPE:
2863 repr =
"section symbol type";
2865 case elf_symbol::FILE_TYPE:
2866 repr =
"file symbol type";
2868 case elf_symbol::COMMON_TYPE:
2869 repr =
"common data object symbol type";
2871 case elf_symbol::TLS_TYPE:
2872 repr =
"thread local data object symbol type";
2874 case elf_symbol::GNU_IFUNC_TYPE:
2875 repr =
"indirect function symbol type";
2879 std::ostringstream s;
2880 s <<
"unknown symbol type (" << (char)t <<
')';
2903 case elf_symbol::LOCAL_BINDING:
2904 repr =
"local binding";
2906 case elf_symbol::GLOBAL_BINDING:
2907 repr =
"global binding";
2909 case elf_symbol::WEAK_BINDING:
2910 repr =
"weak binding";
2912 case elf_symbol::GNU_UNIQUE_BINDING:
2913 repr =
"GNU unique binding";
2917 std::ostringstream s;
2918 s <<
"unknown binding (" << (
unsigned char) b <<
")";
2941 case elf_symbol::DEFAULT_VISIBILITY:
2942 repr =
"default visibility";
2944 case elf_symbol::PROTECTED_VISIBILITY:
2945 repr =
"protected visibility";
2947 case elf_symbol::HIDDEN_VISIBILITY:
2948 repr =
"hidden visibility";
2950 case elf_symbol::INTERNAL_VISIBILITY:
2951 repr =
"internal visibility";
2955 std::ostringstream s;
2956 s <<
"unknown visibility (" << (
unsigned char) v <<
")";
2978 t = elf_symbol::NOTYPE_TYPE;
2979 else if (s ==
"object-type")
2980 t = elf_symbol::OBJECT_TYPE;
2981 else if (s ==
"func-type")
2982 t = elf_symbol::FUNC_TYPE;
2983 else if (s ==
"section-type")
2984 t = elf_symbol::SECTION_TYPE;
2985 else if (s ==
"file-type")
2986 t = elf_symbol::FILE_TYPE;
2987 else if (s ==
"common-type")
2988 t = elf_symbol::COMMON_TYPE;
2989 else if (s ==
"tls-type")
2990 t = elf_symbol::TLS_TYPE;
2991 else if (s ==
"gnu-ifunc-type")
2992 t = elf_symbol::GNU_IFUNC_TYPE;
3010 if (s ==
"local-binding")
3011 b = elf_symbol::LOCAL_BINDING;
3012 else if (s ==
"global-binding")
3013 b = elf_symbol::GLOBAL_BINDING;
3014 else if (s ==
"weak-binding")
3015 b = elf_symbol::WEAK_BINDING;
3016 else if (s ==
"gnu-unique-binding")
3017 b = elf_symbol::GNU_UNIQUE_BINDING;
3035 if (s ==
"default-visibility")
3036 v = elf_symbol::DEFAULT_VISIBILITY;
3037 else if (s ==
"protected-visibility")
3038 v = elf_symbol::PROTECTED_VISIBILITY;
3039 else if (s ==
"hidden-visibility")
3040 v = elf_symbol::HIDDEN_VISIBILITY;
3041 else if (s ==
"internal-visibility")
3042 v = elf_symbol::INTERNAL_VISIBILITY;
3057{
return t == elf_symbol::FUNC_TYPE;}
3067{
return t == elf_symbol::OBJECT_TYPE;}
3071struct elf_symbol::version::priv
3077 : is_default_(false)
3080 priv(
const string& v,
3087elf_symbol::version::version()
3094elf_symbol::version::version(
const string& v,
3096 : priv_(new priv(v, is_default))
3100 : priv_(new priv(v.str(), v.is_default()))
3104elf_symbol::version::~version() =
default;
3109elf_symbol::version::operator
const string&()
const
3110{
return priv_->version_;}
3117{
return priv_->version_;}
3124{priv_->version_ = s;}
3131{
return priv_->is_default_;}
3138{priv_->is_default_ = f;}
3141elf_symbol::version::is_empty()
const
3142{
return str().empty();}
3151{
return str() == o.
str();}
3180struct dm_context_rel::priv
3183 size_t offset_in_bits_;
3186 priv(
bool is_static =
false)
3187 : is_laid_out_(!is_static),
3189 anonymous_data_member_()
3192 priv(
bool is_laid_out,
size_t offset_in_bits)
3193 : is_laid_out_(is_laid_out),
3194 offset_in_bits_(offset_in_bits),
3195 anonymous_data_member_()
3199dm_context_rel::dm_context_rel()
3204dm_context_rel::dm_context_rel(scope_decl* s,
3206 size_t offset_in_bits,
3209 : context_rel(s, a, is_static),
3210 priv_(new priv(is_laid_out, offset_in_bits))
3213dm_context_rel::dm_context_rel(scope_decl* s)
3219dm_context_rel::get_is_laid_out()
const
3220{
return priv_->is_laid_out_;}
3223dm_context_rel::set_is_laid_out(
bool f)
3224{priv_->is_laid_out_ = f;}
3227dm_context_rel::get_offset_in_bits()
const
3228{
return priv_->offset_in_bits_;}
3231dm_context_rel::set_offset_in_bits(
size_t o)
3232{priv_->offset_in_bits_ = o;}
3235dm_context_rel::operator==(
const dm_context_rel& o)
const
3237 if (!context_rel::operator==(o))
3240 return (priv_->is_laid_out_ == o.priv_->is_laid_out_
3241 && priv_->offset_in_bits_ == o.priv_->offset_in_bits_);
3245dm_context_rel::operator!=(
const dm_context_rel& o)
const
3256{
return priv_->anonymous_data_member_;}
3266{priv_->anonymous_data_member_ = anon_dm;}
3268dm_context_rel::~dm_context_rel()
3294{
return priv_->canonical_types_;}
3338 unsigned l1 = 0, l2 = 0, c1 = 0, c2 = 0;
3360 vector<type_base_sptr>& result)
3363 result.push_back(t);
3366 std::stable_sort(result.begin(), result.end(), comp);
3378const type_base_sptr&
3381 if (!priv_->void_type_)
3382 priv_->void_type_.reset(
new type_decl(*
this,
3385 return priv_->void_type_;
3397const type_base_sptr&
3400 if (!priv_->void_pointer_type_)
3403 return priv_->void_pointer_type_;
3416const type_base_sptr&
3419 if (!priv_->variadic_marker_type_)
3420 priv_->variadic_marker_type_.
3423 return priv_->variadic_marker_type_;
3432 static string variadic_parameter_type_name =
"variadic parameter type";
3433 return variadic_parameter_type_name;
3443{
return priv_->canonicalization_is_done_;}
3457{priv_->canonicalization_is_done_ = f;}
3466{
return priv_->do_on_the_fly_canonicalization_;}
3475{priv_->do_on_the_fly_canonicalization_ = f;}
3499{
return priv_->decl_only_class_equals_definition_;}
3524{priv_->decl_only_class_equals_definition_ = f;}
3629{
return const_cast<environment*
>(
this)->priv_->string_pool_.create_string(s);}
3636{
return priv_->config_;}
3646{
return priv_->analyze_exported_interfaces_only_.has_value();}
3659{priv_->analyze_exported_interfaces_only_ = f;}
3672{
return priv_->analyze_exported_interfaces_only_.value_or(
false);}
3674#ifdef WITH_DEBUG_SELF_COMPARISON
3687environment::set_self_comparison_debug_input(
const corpus_sptr& c)
3689 self_comparison_debug_is_on(
true);
3690 if (priv_->first_self_comparison_corpus_.expired())
3691 priv_->first_self_comparison_corpus_ = c;
3692 else if (priv_->second_self_comparison_corpus_.expired()
3693 && c.get() != corpus_sptr(priv_->first_self_comparison_corpus_).get())
3694 priv_->second_self_comparison_corpus_ = c;
3707environment::get_self_comparison_debug_inputs(corpus_sptr& first_corpus,
3708 corpus_sptr& second_corpus)
3710 first_corpus = priv_->first_self_comparison_corpus_.lock();
3711 second_corpus = priv_->second_self_comparison_corpus_.lock();
3718environment::self_comparison_debug_is_on(
bool f)
3719{priv_->self_comparison_debug_on_ = f;}
3726environment::self_comparison_debug_is_on()
const
3727{
return priv_->self_comparison_debug_on_;}
3730#ifdef WITH_DEBUG_TYPE_CANONICALIZATION
3737environment::debug_type_canonicalization_is_on(
bool flag)
3738{priv_->debug_type_canonicalization_ = flag;}
3746environment::debug_type_canonicalization_is_on()
const
3747{
return priv_->debug_type_canonicalization_;}
3755environment::debug_die_canonicalization_is_on(
bool flag)
3756{priv_->debug_die_canonicalization_ = flag;}
3764environment::debug_die_canonicalization_is_on()
const
3765{
return priv_->debug_die_canonicalization_;}
3781vector<type_base_sptr>*
3808 if (!types ||index >= types->size())
3810 return (*types)[index].get();
3813#ifdef WITH_DEBUG_SELF_COMPARISON
3823const unordered_map<string, uintptr_t>&
3824environment::get_type_id_canonical_type_map()
const
3825{
return priv_->get_type_id_canonical_type_map();}
3836unordered_map<string, uintptr_t>&
3837environment::get_type_id_canonical_type_map()
3838{
return priv_->get_type_id_canonical_type_map();}
3853const unordered_map<uintptr_t, string>&
3854environment::get_pointer_type_id_map()
const
3855{
return priv_->get_pointer_type_id_map();}
3870unordered_map<uintptr_t, string>&
3871environment::get_pointer_type_id_map()
3872{
return priv_->get_pointer_type_id_map();}
3890environment::get_type_id_from_pointer(uintptr_t ptr)
const
3891{
return priv_->get_type_id_from_pointer(ptr);}
3909environment::get_type_id_from_type(
const type_base *t)
const
3910{
return priv_->get_type_id_from_type(t);}
3927environment::get_canonical_type_from_type_id(
const char* type_id)
const
3928{
return priv_->get_canonical_type_from_type_id(type_id);}
3936struct type_or_decl_base::priv
3954 void* type_or_decl_ptr_;
3955 bool hashing_started_;
3956 const environment& env_;
3957 translation_unit* translation_unit_;
3962 location artificial_location_;
3966 bool is_artificial_;
3974 priv(
const environment& e,
3978 type_or_decl_ptr_(),
3981 translation_unit_(),
4001 (
static_cast<unsigned>(l) |
static_cast<unsigned>(r));
4021 (
static_cast<unsigned>(l) &
static_cast<unsigned>(r));
4042 :priv_(new priv(e, k))
4058{
return priv_->is_artificial_;}
4070{priv_->is_artificial_ = f;}
4081{
return priv_->kind();}
4101{
return priv_->rtti_;}
4110{
return priv_->rtti_;}
4122 priv_->type_or_decl_ptr_ = t;
4124 priv_->type_or_decl_ptr_ = d;
4147{
return priv_->type_or_decl_ptr_;}
4154{
return priv_->hashing_started_;}
4161{priv_->hashing_started_ = b;}
4168{
return priv_->env_;}
4186{priv_->artificial_location_ = l;}
4204{
return priv_->artificial_location_;}
4212 return (priv_->artificial_location_
4213 && priv_->artificial_location_.get_is_artificial());
4244{priv_->translation_unit_ = tu;}
4253{
return priv_->translation_unit_;}
4285 *dr =
dynamic_cast<const decl_base*
>(r);
4294 *tr =
dynamic_cast<const type_base*
>(r);
4339struct decl_base::priv
4341 bool in_pub_sym_tab_;
4367 decl_base_sptr declaration_;
4369 decl_base* naked_definition_of_declaration_;
4370 bool is_declaration_only_;
4374 : in_pub_sym_tab_(false),
4375 is_anonymous_(true),
4377 visibility_(VISIBILITY_DEFAULT),
4378 naked_definition_of_declaration_(),
4379 is_declaration_only_(false)
4382 priv(interned_string name, interned_string linkage_name,
visibility vis)
4383 : in_pub_sym_tab_(false),
4386 qualified_name_(name),
4387 linkage_name_(linkage_name),
4389 naked_definition_of_declaration_(),
4390 is_declaration_only_(false)
4392 is_anonymous_ = name_.
empty();
4417 const string& linkage_name,
4420 priv_(new priv(e.intern(name), e.intern(linkage_name), vis))
4444 priv_(new priv(name, linkage_name, vis))
4471{
return priv_->qualified_name_;}
4480{priv_->qualified_name_.clear();}
4487{priv_->qualified_name_ = n;}
4500{
return priv_->temporary_qualified_name_;}
4514{priv_->temporary_qualified_name_ = n;}
4521{
return priv_->context_;}
4528{
return priv_->context_;}
4532{priv_->context_ = c;}
4563{
return priv_->in_pub_sym_tab_;}
4571{priv_->in_pub_sym_tab_ = f;}
4591{
return priv_->location_;}
4633 priv_->location_ = l;
4643 priv_->is_anonymous_ = n.empty();
4654{
return priv_->is_anonymous_;}
4664{priv_->is_anonymous_ = f;}
4701{
return priv_->naming_typedef_;}
4729 &&
is_type(
this)->get_naked_canonical_type() ==
nullptr);
4731 priv_->naming_typedef_ = t;
4738 update_qualified_name(
this);
4746{
return priv_->linkage_name_;}
4755 priv_->linkage_name_ = env.
intern(m);
4763{
return priv_->visibility_;}
4770{priv_->visibility_ = v;}
4779 if (priv_->context_)
4780 return priv_->context_->get_scope();
4790{
return priv_->qualified_parent_name_;}
4797{
return priv_->name_;}
4832 bool qualified_name)
const
4836 && has_generic_anonymous_internal_type_name(
this))
4847 string name = get_generic_anonymous_internal_type_name(
this);
4875{
return priv_->qualified_name_;}
4889{
return priv_->scoped_name_;}
4897{
return priv_->declaration_;}
4906 if (d && d->get_is_declaration_only())
4907 priv_->declaration_ = d;
4917{
return priv_->definition_of_declaration_.lock();}
4933{
return priv_->naked_definition_of_declaration_;}
4940{
return priv_->is_declaration_only_;}
4950 bool update_types_lookup_map = !f && priv_->is_declaration_only_;
4952 priv_->is_declaration_only_ = f;
4954 if (update_types_lookup_map)
4957 scope_decl::declarations::iterator i;
4958 if (s->find_iterator_for_member(
this, i))
4968 return static_cast<change_kind>(
static_cast<unsigned>(l)
4969 |
static_cast<unsigned>(r));
4975 return static_cast<change_kind>(
static_cast<unsigned>(l)
4976 &
static_cast<unsigned>(r));
5023 bool member_types_or_functions =
5027 if (member_types_or_functions)
5036 la = r1->get_access_specifier();
5037 ra = r2->get_access_specifier();
5038 r1->set_access_specifier(no_access);
5039 r2->set_access_specifier(no_access);
5042 bool rels_are_different = *r1 != *r2;
5044 if (member_types_or_functions)
5047 r1->set_access_specifier(la);
5048 r2->set_access_specifier(ra);
5051 if (rels_are_different)
5072get_decl_name_for_comparison(
const decl_base &d)
5074 if (has_generic_anonymous_internal_type_name(&d)
5080 r += get_generic_anonymous_internal_type_name(&d);
5117 if (!l_linkage_name.
empty() && !r_linkage_name.
empty())
5119 if (l_linkage_name != r_linkage_name)
5154 bool decls_are_same = (ln == rn);
5163 decls_are_same =
true;
5173 if (!decls_are_same)
5196{
return equals(*
this, other, 0);}
5235 if (!priv_->context_)
5238 priv_->context_->set_scope(scope);
5256 case decl_base::VISIBILITY_NONE:
5259 case decl_base::VISIBILITY_DEFAULT:
5262 case decl_base::VISIBILITY_PROTECTED:
5265 case decl_base::VISIBILITY_HIDDEN:
5268 case decl_base::VISIBILITY_INTERNAL:
5288 case decl_base::BINDING_NONE:
5291 case decl_base::BINDING_LOCAL:
5294 case decl_base::BINDING_GLOBAL:
5297 case decl_base::BINDING_WEAK:
5320 if (l.get() == r.get())
5356 if (l.get() == r.get())
5442{
return dynamic_pointer_cast<scope_decl>(d);}
5508 return c->get_access_specifier();
5538 c->set_access_specifier(a);
5568 return c->get_is_static();
5710 var_decl_sptr first = *klass->get_non_static_data_members().begin();
5731 if (!klass ||!data_member)
5734 for (class_or_union::data_members::const_iterator it =
5738 if (**it == *data_member)
5807 bool result =
false;
5825 dms[member->get_name()] = member;
6034 return class_or_union_sptr();
6043const class_or_union_sptr
6048 if (cou->get_is_anonymous())
6051 return class_or_union_sptr();
6060const class_or_union_sptr
6065 return class_or_union_sptr();
6074const class_or_union_sptr
6089 return class_or_union_sptr();
6114 for (
auto anon_dm_m : cl->get_non_static_data_members())
6161 ctxt_rel->set_offset_in_bits(o);
6176 return ctxt_rel->get_offset_in_bits();
6266 const var_decl *containing_anonymous_data_member =
6269 uint64_t containing_anonymous_data_member_offset = 0;
6270 if (containing_anonymous_data_member)
6271 containing_anonymous_data_member_offset =
6274 return (ctxt_rel->get_offset_in_bits()
6276 containing_anonymous_data_member_offset);
6304 type_base_sptr t = v->get_type();
6307 return t->get_size_in_bits();
6321 ctxt_rel->set_is_laid_out(l);
6336 return ctxt_rel->get_is_laid_out();
6638 return ctxt->is_virtual();
6675 ctxt->is_virtual(is_virtual);
6690 (dynamic_pointer_cast<method_decl>(fn));
6728 if (!cl->get_canonical_type())
6734 type_base_sptr t = type;
6745 ty->get_size_in_bits(),
6746 ty->get_alignment_in_bits(),
6747 ty->get_location()));
6755 ty->get_size_in_bits(),
6756 ty->get_alignment_in_bits(),
6757 ty->get_location()));
6766 ty->get_location()));
6772 t.reset(
new array_type_def(p, ty->get_subranges(), ty->get_location()));
6777 for (function_decl::parameters::const_iterator i =
6778 ty->get_parameters().begin();
6779 i != ty->get_parameters().end();
6790 p->get_variadic_marker(),
6791 p->get_is_artificial()));
6792 parm.push_back(stripped);
6797 parm, ty->get_is_const(),
6798 ty->get_size_in_bits(),
6799 ty->get_alignment_in_bits()));
6804 for (function_decl::parameters::const_iterator i =
6805 ty->get_parameters().begin();
6806 i != ty->get_parameters().end();
6817 p->get_variadic_marker(),
6818 p->get_is_artificial()));
6819 parm.push_back(stripped);
6824 ty->get_size_in_bits(),
6825 ty->get_alignment_in_bits()));
6828 if (!t->get_translation_unit())
6829 t->set_translation_unit(type->get_translation_unit());
6834 return t->get_canonical_type() ? t->get_canonical_type() : t;
6857 decl_base_sptr result = t;
6858 type_base_sptr u = t->get_underlying_type();
6861 if ((t->get_cv_quals() & qualified_type_def::CV_CONST
6863 || (t->get_cv_quals() & qualified_type_def::CV_CONST
6865 || t->get_cv_quals() == qualified_type_def::CV_NONE)
6911static qualified_type_def_sptr
6912strip_redundant_quals_from_underyling_types(
const qualified_type_def_sptr& t,
6921 qualified_type_def_sptr underlying_qualified_type =
6929 currated_quals &= ~redundant_quals;
6930 t->set_cv_quals(currated_quals);
6934 redundant_quals |= currated_quals;
6936 qualified_type_def_sptr result = t;
6937 if (underlying_qualified_type)
6941 strip_redundant_quals_from_underyling_types(underlying_qualified_type,
6975strip_redundant_quals_from_underyling_types(
const qualified_type_def_sptr& t)
6981 strip_redundant_quals_from_underyling_types(t, redundant_quals);
7008 return t->get_underlying_type();
7062 return t->get_pointed_to_type();
7118 return t->get_pointed_to_type();
7243 if (t->get_cv_quals() == qualified_type_def::CV_CONST)
7276 return q->get_underlying_type();
7325 type_base_sptr type = t;
7348 type_base_sptr typ = type;
7410 bool peel_qual_type)
7449 bool peel_qual_type)
7487 vector<array_type_def::subrange_sptr> subranges;
7489 for (vector<array_type_def::subrange_sptr>::const_iterator i =
7490 array->get_subranges().begin();
7491 i != array->get_subranges().end();
7497 (*i)->get_lower_bound(),
7498 (*i)->get_upper_bound(),
7499 (*i)->get_underlying_type(),
7500 (*i)->get_location(),
7501 (*i)->get_language()));
7502 subrange->is_non_finite((*i)->is_non_finite());
7505 subranges.push_back(subrange);
7510 subranges, array->get_location()));
7533 (
new typedef_decl(t->get_name(), t->get_underlying_type(),
7534 t->get_location(), t->get_linkage_name(),
7535 t->get_visibility()));
7551qualified_type_def_sptr
7557 qualified_type_def_sptr result
7559 t->get_cv_quals(), t->get_location()));
7571static type_base_sptr
7572clone_typedef_array_qualified_type(type_base_sptr type)
7578 type_base_sptr result;
7587 return type_base_sptr();
7610 type_base_sptr result = clone_typedef_array_qualified_type(t);
7613 type_base_sptr subtree;
7617 clone_typedef_array_qualified_type(type->get_underlying_type());
7621 type->set_underlying_type(subtree);
7627 clone_typedef_array_qualified_type(type->get_element_type());
7631 type->set_element_type(subtree);
7641 clone_typedef_array_qualified_type(t->get_underlying_type());
7648 t->set_underlying_type (s);
7657 clone_typedef_array_qualified_type(t->get_underlying_type());
7664 t->set_underlying_type(s);
7672 type_base_sptr e = t->get_element_type();
7676 clone_typedef_array_qualified_type(e);
7682 t->set_element_type(s);
7701 ::qualified_name_setter setter;
7709update_qualified_name(decl_base_sptr d)
7710{
return update_qualified_name(d.get());}
7730{
return reinterpret_cast<size_t>(l);}
7732struct scope_decl::priv
7777{
return priv_->canonical_types_;}
7795 if (priv_->sorted_canonical_types_.empty())
7797 for (canonical_type_sptr_set_type::const_iterator e =
7801 priv_->sorted_canonical_types_.push_back(*e);
7804 std::stable_sort(priv_->sorted_canonical_types_.begin(),
7805 priv_->sorted_canonical_types_.end(),
7808 return priv_->sorted_canonical_types_;
7818{
return priv_->members_;}
7827{
return priv_->members_;}
7838 if (priv_->sorted_members_.empty())
7843 priv_->sorted_members_.push_back(*i);
7845 std::stable_sort(priv_->sorted_members_.begin(),
7846 priv_->sorted_members_.end(),
7849 return priv_->sorted_members_;
7864 if (t->get_is_anonymous())
7882 if (t->get_is_anonymous())
7900 if (t->get_is_anonymous())
7911{
return priv_->member_scopes_;}
7918{
return priv_->member_scopes_;}
7940maybe_set_translation_unit(
const decl_base_sptr& decl,
7955 decl->set_translation_unit(tu);
7972 member->set_scope(
this);
7973 priv_->members_.push_back(member);
7975 priv_->member_types_.push_back(
is_type(member));
7978 priv_->member_scopes_.push_back(m);
7980 update_qualified_name(member);
7983 maybe_set_translation_unit(member, tu);
7995{
return priv_->member_types_;}
8010 return type_base_sptr();
8020 declarations::iterator before)
8026 priv_->member_types_.push_back(t);
8062 for (
auto i = priv_->member_types_.begin();
8063 i != priv_->member_types_.end();
8068 priv_->member_types_.erase(i);
8081 if (priv_->sorted_member_types_.empty())
8084 priv_->sorted_member_types_.push_back(t);
8087 std::stable_sort(priv_->sorted_member_types_.begin(),
8088 priv_->sorted_member_types_.end(),
8091 return priv_->sorted_member_types_;
8107 declarations::iterator before)
8111 member->set_scope(
this);
8112 priv_->members_.insert(before, member);
8115 priv_-> member_scopes_.push_back(m);
8117 update_qualified_name(member);
8120 maybe_set_translation_unit(member, tu);
8133 for (declarations::iterator i = priv_->members_.begin();
8134 i != priv_->members_.end();
8139 priv_->members_.erase(i);
8149 for (scopes::iterator i = priv_->member_scopes_.begin();
8150 i != priv_->member_scopes_.end();
8155 priv_->member_scopes_.erase(i);
8161 member->set_scope(
nullptr);
8162 member->set_translation_unit(
nullptr);
8174 return hash_scope(
this);
8201 if (!l.decl_base::operator==(r))
8210 scope_decl::declarations::const_iterator i, j;
8252 return equals(*
this, *other, 0);
8267 if (l.get() == r.get())
8293 declarations::iterator& i)
8308 if ((*it).get() == decl)
8328 declarations::iterator& i)
8345 if (v.visit_begin(
this))
8348 for (scope_decl::declarations::const_iterator i =
8352 if (!(*i)->traverse(v))
8356 return v.visit_end(
this);
8359scope_decl::~scope_decl()
8374 if (scope && decl && !decl->
get_scope())
8414 scope_decl::declarations::iterator before,
8417 if (scope && decl && !decl->
get_scope())
8436 scope_decl::declarations::iterator before,
8446 | ABSTRACT_DECL_BASE
8447 | ABSTRACT_SCOPE_DECL),
8450 translation_unit_(tu)
8452 runtime_type_instance(
this);
8471 return scope ?
dynamic_cast<global_scope*
> (scope) : 0;
8578 if (cv_quals & qualified_type_def::CV_RESTRICT)
8580 if (cv_quals & qualified_type_def::CV_CONST)
8586 if (cv_quals & qualified_type_def::CV_VOLATILE)
8638{
return get_name(tod.get(), qualified);}
8656 string qualified_name;
8660 if (qualified_name.empty())
8661 qualified_name = name;
8663 qualified_name = qualified_name +
"::" + name;
8665 return qualified_name;
8700 location loc = decl->get_location();
8704 if (c->get_is_declaration_only() && c->get_definition_of_declaration())
8707 loc = c->get_location();
8765has_generic_anonymous_internal_type_name(
const decl_base *d)
8782static interned_string
8783get_generic_anonymous_internal_type_name(
const decl_base *d)
8785 ABG_ASSERT(has_generic_anonymous_internal_type_name(d));
8787 const environment&env = d->get_environment();
8789 interned_string result;
8822get_internal_integral_type_name(
const type_base* t)
8830 integral_type int_type;
8832 name = int_type.to_string(
true);
8872 r += get_generic_anonymous_internal_type_name(d);
8882 return env.
intern(get_internal_integral_type_name(t));
8891 internal, qualified));
8930 bool qualified,
bool internal)
8933 string tn =
get_type_name(pointed_to_type, qualified, internal);
8952 bool lvalue_reference,
8953 bool qualified,
bool internal)
8957 string name =
get_type_name(pointed_to_type, qualified, internal);
8958 if (lvalue_reference)
8983 bool qualified,
bool internal)
8985 const environment& env = underlying_type->get_environment();
8988 string name =
get_type_name(underlying_type, qualified, internal);
8990 if (quals_repr.empty() && internal)
9002 if (!quals_repr.empty())
9011 name = quals_repr +
" " + name;
9068 std::ostringstream o;
9073 type_base_sptr return_type =
9080 stream_pretty_representation_of_fn_parms(fn_type, o,
9083 return env.
intern(o.str());
9102 c->get_exported_decls_builder();
9103 if (b->fn_id_maps_to_several_fns(fn))
9159 std::ostringstream o;
9164 type_base_sptr return_type =
9180 o <<
" (" << class_type->get_qualified_name(internal) <<
"::*) ";
9181 stream_pretty_representation_of_fn_parms(fn_type, o,
9185 return env.
intern(o.str());
9351 std::ostringstream o;
9369 std::ostringstream o;
9424 const string& indent,
9427 bool qualified_names)
9430 string local_indent =
" ";
9435 if (!internal && clazz->is_struct())
9441 repr = indent +
"union";
9459 for (class_or_union::data_members::const_iterator dm = dmems.begin();
9463 if (dm != dmems.begin())
9468 real_indent =
"\n" + indent + local_indent;
9475 real_indent, one_line, internal, qualified_names);
9480 if (dm != dmems.begin())
9481 repr += real_indent;
9482 repr += (*dm)->get_pretty_representation(internal,
9487 real_indent+ (*dm)->get_pretty_representation(internal,
9496 repr += indent +
"}";
9519 const string& indent,
9522 bool qualified_names)
9526 internal, qualified_names);
9548 const string& indent,
9551 bool qualified_names)
9580 const string& indent,
bool one_line,
9581 bool qualified_names)
9584 std::ostringstream o;
9585 string local_indent =
" ";
9587 repr = indent +
"enum ";
9590 o << (qualified_names
9604 o << enumerator.get_name() +
"=" << enumerator.get_value() <<
", ";
9608 o <<
"\n" + indent <<
"}";
9639 const string& indent,
bool one_line,
9640 bool qualified_names)
9646 one_line, qualified_names);
9671 const string& indent,
bool one_line,
9672 bool qualified_names)
9701 const string& indent,
9704 bool qualified_name)
9710 internal, qualified_name);
9738 std::ostringstream o;
9753 o <<
" :" << std::endl;
9757 if (b->get_is_virtual())
9759 o << b->get_base_class()->get_qualified_name()
9769 <<
" // @: " << std::hex <<
is_type(c)
9775 type_base_sptr t = m->get_type();
9779 << m->get_pretty_representation(
false,
9783 if (t && t->get_canonical_type())
9784 o <<
" // uses canonical type '@"
9785 << std::hex << t->get_canonical_type().get() << std::dec;
9787 o <<
"'" << std::endl;
9792 o <<
" // virtual member functions\n\n";
9794 o <<
" " << f->get_pretty_representation(
false,
9796 <<
";" << std::endl;
9799 o <<
"};" << std::endl;
9805 string name = e->get_qualified_name();
9806 std::ostringstream o;
9807 o <<
"enum " << name
9809 << e->get_underlying_type()->get_pretty_representation(
false,
9813 <<
" // size in bits: " << e->get_size_in_bits() <<
"\n"
9814 <<
" // is-declaration-only: " << e->get_is_declaration_only() <<
"\n"
9816 <<
" // translation unit: "
9817 << e->get_translation_unit()->get_absolute_path() <<
"\n"
9818 <<
" // @: " << std::hex <<
is_type(e)
9819 <<
", @canonical: " << e->get_canonical_type().get() << std::dec
9822 for (
const auto &enom : e->get_enumerators())
9823 o <<
" " << enom.get_name() <<
" = " << enom.get_value() <<
",\n";
9829 return artifact->get_pretty_representation(
true,
9928 return const_cast<type_base*
>(artifact);
9945 return const_cast<decl_base*
>(artifact);
9975debug_comp_vec(
const vector<const type_base*>& vect, std::ostringstream& o)
9979 o <<
"|" << t->get_pretty_representation()
9980 <<
"@" << std::hex << t << std::dec;
9992print_comp_stack(
const environment& env)
9994 std::ostringstream o;
9995 o <<
"left-operands: ";
9996 debug_comp_vec(env.priv_->left_type_comp_operands_, o);
9997 o <<
"\n" <<
"right-operands: ";
9998 debug_comp_vec(env.priv_->right_type_comp_operands_, o);
10011 std::cerr << print_comp_stack(env);
10012 std::cerr << std::endl;
10044{
return dynamic_cast<const decl_base*
>(t);}
10062{
return dynamic_pointer_cast<decl_base>(t);}
10078 const type_base_sptr type2)
10080 if (!type1 || !type2)
10083 if (type1 == type2)
10116 const decl_base_sptr d2)
10254 const string& name)
10259 if (!containing_class_or_union)
10276{
return (decl &&
dynamic_cast<template_decl*
>(decl->get_scope()));}
10286 return (decl && (dynamic_pointer_cast<type_tparameter>(decl)
10287 || dynamic_pointer_cast<non_type_tparameter>(decl)
10288 || dynamic_pointer_cast<template_tparameter>(decl)));
10318{
return dynamic_pointer_cast<function_decl>(d);}
10341{
return dynamic_pointer_cast<function_decl::parameter>(tod);}
10352 if (d && (d->
kind() & type_or_decl_base::ABSTRACT_DECL_BASE))
10354 if (!(d->
kind() & type_or_decl_base::ABSTRACT_TYPE_BASE))
10380{
return dynamic_pointer_cast<decl_base>(d);}
10402{
return dynamic_pointer_cast<decl_base>(t);}
10412 if (
dynamic_cast<const type_base*
>(&tod))
10425 if (t && (t->
kind() & type_or_decl_base::ABSTRACT_TYPE_BASE))
10439{
return dynamic_pointer_cast<type_base>(tod);}
10471 if (!cou->get_naming_typedef())
10513{
return dynamic_cast<const type_decl*
>(t);}
10521{
return dynamic_pointer_cast<type_decl>(t);}
10571{
return dynamic_pointer_cast<typedef_decl>(t);}
10652{
return dynamic_pointer_cast<enum_type_decl>(d);}
10706 if (t->
kind() & type_or_decl_base::CLASS_TYPE)
10720{
return dynamic_pointer_cast<class_decl>(d);}
10742 if (array->is_non_finite())
10812 if (array->get_subranges().size() == 1
10813 && array->get_subranges()[0]->get_length() == 1)
10883 return klass->get_is_declaration_only();
10932shared_ptr<class_or_union>
10934{
return dynamic_pointer_cast<class_or_union>(t);}
10963 const class_or_union_sptr& second)
10993{
return dynamic_pointer_cast<union_decl>(t);}
11007 bool look_through_qualifiers)
11013 if (look_through_qualifiers)
11031 bool look_through_qualifiers)
11033 type_base_sptr type =
is_type(t);
11034 if (look_through_qualifiers)
11036 return dynamic_pointer_cast<pointer_type_def>(type);
11179 bool look_through_qualifiers)
11185 if (look_through_qualifiers)
11202 bool look_through_qualifiers)
11206 if (look_through_qualifiers)
11223 bool look_through_qualifiers)
11225 type_base_sptr type =
is_type(t);
11226 if (look_through_qualifiers)
11228 return dynamic_pointer_cast<reference_type_def>(type);
11239 bool look_through_qualifiers)
11242 if (look_through_qualifiers)
11259 bool look_through_qualifiers)
11261 type_base_sptr type =
is_type(t);
11262 if (look_through_qualifiers)
11264 return dynamic_pointer_cast<ptr_to_mbr_type>(type);
11338const type_base_sptr
11341 type_base_sptr nil;
11345 if (t->get_environment().get_void_pointer_type().get() == t.get())
11374qualified_type_def_sptr
11376{
return dynamic_pointer_cast<qualified_type_def>(t);}
11386{
return dynamic_pointer_cast<function_type>(t);}
11416{
return dynamic_pointer_cast<method_type>(t);}
11496 decl_base_sptr decl;
11503 while (decl->get_is_declaration_only()
11504 && decl->get_definition_of_declaration())
11505 decl = decl->get_definition_of_declaration();
11572 decl_base_sptr d =
is_decl(t);
11597{
return dynamic_pointer_cast<var_decl>(decl);}
11606{
return dynamic_pointer_cast<namespace_decl>(d);}
11640 && dynamic_pointer_cast<function_decl>(decl)
11651 bool look_through_qualifiers)
11655 if (look_through_qualifiers)
11667 bool look_through_qualifiers)
11669 type_base_sptr t =
is_type(type);
11671 if (look_through_qualifiers)
11673 return dynamic_pointer_cast<array_type_def>(t);
11682qualified_type_def_sptr
11686 return qualified_type_def_sptr();
11741array_type_def::subrange_type*
11756{
return dynamic_pointer_cast<array_type_def::subrange_type>(type);}
11766{
return decl && dynamic_pointer_cast<template_decl>(decl);}
11772 LOOKUP_ENTITY_TYPE,
11804find_next_delim_in_cplus_type(
const string& fqn,
11808 int angle_count = 0;
11809 bool found =
false;
11811 for (; i < fqn.size(); ++i)
11815 else if (fqn[i] ==
'>')
11817 else if (i + 1 < fqn.size()
11820 && fqn[i+1] ==
':')
11837 list<string>& comps)
11839 string::size_type fqn_size = fqn.size(), comp_begin = 0, comp_end = fqn_size;
11842 if (!find_next_delim_in_cplus_type(fqn, comp_begin, comp_end))
11843 comp_end = fqn_size;
11845 string comp = fqn.substr(comp_begin, comp_end - comp_begin);
11846 comps.push_back(comp);
11848 comp_begin = comp_end + 2;
11849 if (comp_begin >= fqn_size)
11865 for (list<string>::const_iterator c = comps.begin();
11868 if (c == comps.begin())
11871 result +=
"::" + *c;
11886template<
typename T>
11888iterator_is_last(T& container,
11889 typename T::const_iterator i)
11891 typename T::const_iterator next = i;
11893 return (next == container.end());
11910lookup_types_in_map(
const interned_string& type_name,
11913 istring_type_base_wptrs_map_type::const_iterator i = type_map.find(type_name);
11914 if (i != type_map.end())
11935template <
class TypeKind>
11936static shared_ptr<TypeKind>
11937lookup_type_in_map(
const interned_string& type_name,
11940 istring_type_base_wptrs_map_type::const_iterator i = type_map.find(type_name);
11941 if (i != type_map.end())
11945 for (
auto j : i->second)
11947 type_base_sptr t(j);
11948 decl_base_sptr d =
is_decl(t);
11949 if (d && !d->get_is_declaration_only())
11950 return dynamic_pointer_cast<TypeKind>(type_base_sptr(j));
11955 return dynamic_pointer_cast<TypeKind>(type_base_sptr(i->second.back()));
11957 return shared_ptr<TypeKind>();
11974 return lookup_type_in_map<type_decl>(type_name,
12033 return lookup_type_in_map<class_decl>(type_name,
12051 return lookup_type_in_map<union_decl>(type_name,
12086 union_decl_sptr result = lookup_type_in_map<union_decl>(loc, m);
12119 return lookup_type_in_map<enum_type_decl>(type_name,
12158 return lookup_type_in_map<typedef_decl>(type_name,
12194qualified_type_def_sptr
12199 return lookup_type_in_map<qualified_type_def>(type_name,
12218qualified_type_def_sptr
12245 return lookup_type_in_map<pointer_type_def>(type_name,
12307 return lookup_type_in_map<reference_type_def>(type_name,
12326 bool lvalue_reference,
12351 return lookup_type_in_map<array_type_def>(type_name,
12371 return lookup_type_in_map<function_type>(type_name,
12417const type_base_sptr
12421 type_base_sptr result;
12460const type_base_sptr
12484const type_base_sptr
12488 list<string> comps;
12501const decl_base_sptr
12505 list<string> comps;
12521template<
typename NodeKind>
12533{
return node->get_name();}
12553{
return node->get_name();}
12562template<
typename NodeKind>
12563static decl_base_sptr
12564convert_node_to_decl(shared_ptr<NodeKind> node);
12577template<
typename NodeKind>
12579lookup_node_in_scope(
const list<string>& fqn,
12583 shared_ptr<NodeKind> node;
12584 bool it_is_last =
false;
12587 for (list<string>::const_iterator c = fqn.begin(); c != fqn.end(); ++c)
12590 it_is_last = iterator_is_last(fqn, c);
12591 for (scope_decl::declarations::const_iterator m =
12592 cur_scope->get_member_decls().begin();
12593 m != cur_scope->get_member_decls().end();
12599 scope = dynamic_pointer_cast<scope_decl>(*m);
12600 if (scope && scope->get_name() == *c)
12609 node = dynamic_pointer_cast<NodeKind>(*m);
12613 dynamic_pointer_cast<class_decl>(node))
12614 if (cl->get_is_declaration_only()
12615 && !cl->get_definition_of_declaration())
12617 resulting_decl = node;
12622 if (!new_scope && !resulting_decl)
12623 return decl_base_sptr();
12624 cur_scope = new_scope;
12627 return resulting_decl;
12648const type_base_sptr
12651{
return is_type(lookup_node_in_scope<type_base>(comps, scope));}
12675static const type_base_sptr
12677 const vector<scope_decl*>& access_path,
12680 vector<scope_decl*> a = access_path;
12681 type_base_sptr result;
12686 first_scope = a.back();
12694 for (scope_decl::declarations::const_iterator i =
12698 if (
is_type(*i) && (*i)->get_name() == n)
12706 first_scope = a.back();
12707 interned_string scope_name, cur_scope_name = first_scope->
get_name();
12708 for (scope_decl::scopes::const_iterator i =
12713 scope_name = (*i)->get_name();
12714 if (scope_name == cur_scope_name)
12740static const type_base_sptr
12742 const scope_decl* scope)
12745 return type_base_sptr();
12749 vector<scope_decl*> access_path;
12750 for (scope_decl* s = type_decl->get_scope(); s != 0; s = s->get_scope())
12752 access_path.push_back(s);
12778const type_base_sptr
12793const decl_base_sptr
12796{
return is_var_decl(lookup_node_in_scope<var_decl>(comps, skope));}
12809template<
typename NodeKind>
12811lookup_node_in_translation_unit(
const list<string>& fqn,
12829{
return is_type(lookup_node_in_translation_unit<type_base>(fqn, tu));}
12849{
return is_class_type(lookup_node_in_translation_unit<class_decl>(fqn, tu));}
12862lookup_basic_type_through_translation_units(
const interned_string& type_name,
12863 const corpus& abi_corpus)
12867 for (translation_units::const_iterator tu =
12887static union_decl_sptr
12888lookup_union_type_through_translation_units(
const interned_string& type_name,
12889 const corpus & abi_corpus)
12891 union_decl_sptr result;
12893 for (translation_units::const_iterator tu =
12894 abi_corpus.get_translation_units().begin();
12895 tu != abi_corpus.get_translation_units().end();
12914lookup_enum_type_through_translation_units(
const interned_string& type_name,
12915 const corpus & abi_corpus)
12919 for (translation_units::const_iterator tu =
12920 abi_corpus.get_translation_units().begin();
12921 tu != abi_corpus.get_translation_units().end();
12938lookup_typedef_type_through_translation_units(
const interned_string& type_name,
12939 const corpus & abi_corpus)
12943 for (translation_units::const_iterator tu =
12944 abi_corpus.get_translation_units().begin();
12945 tu != abi_corpus.get_translation_units().end();
12962static qualified_type_def_sptr
12963lookup_qualified_type_through_translation_units(
const interned_string& t_name,
12964 const corpus & abi_corpus)
12966 qualified_type_def_sptr result;
12968 for (translation_units::const_iterator tu =
12969 abi_corpus.get_translation_units().begin();
12970 tu != abi_corpus.get_translation_units().end();
12988lookup_pointer_type_through_translation_units(
const interned_string& type_name,
12989 const corpus & abi_corpus)
12993 for (translation_units::const_iterator tu =
12994 abi_corpus.get_translation_units().begin();
12995 tu != abi_corpus.get_translation_units().end();
13013lookup_reference_type_through_translation_units(
const interned_string& t_name,
13014 const corpus & abi_corpus)
13018 for (translation_units::const_iterator tu =
13019 abi_corpus.get_translation_units().begin();
13020 tu != abi_corpus.get_translation_units().end();
13038lookup_array_type_through_translation_units(
const interned_string& type_name,
13039 const corpus & abi_corpus)
13043 for (translation_units::const_iterator tu =
13044 abi_corpus.get_translation_units().begin();
13045 tu != abi_corpus.get_translation_units().end();
13063lookup_function_type_through_translation_units(
const interned_string& type_name,
13064 const corpus & abi_corpus)
13068 for (translation_units::const_iterator tu =
13069 abi_corpus.get_translation_units().begin();
13070 tu != abi_corpus.get_translation_units().end();
13088 const corpus& abi_corpus)
13090 type_base_sptr result;
13092 for (translation_units::const_iterator tu =
13113 const string& tu_path,
13116 string_tu_map_type::const_iterator i = corp.priv_->path_tu_map.find(tu_path);
13117 if (i == corp.priv_->path_tu_map.end())
13118 return type_base_sptr();
13147 for (translation_units::const_iterator i =
13193 result = lookup_type_in_map<type_decl>(qualified_name, m);
13195 result = lookup_basic_type_through_translation_units(qualified_name, corp);
13215 result = lookup_type_in_map<type_decl>(loc, m);
13306 class_decl_sptr result = lookup_type_in_map<class_decl>(qualified_name, m);
13324 return lookup_types_in_map(qualified_name, m);
13350 for (
auto type : *v)
13352 type_base_sptr t(type);
13354 if (c->get_is_declaration_only()
13355 && !c->get_definition_of_declaration())
13356 result.push_back(type);
13359 return !result.empty();
13375 return lookup_types_in_map(qualified_name, m);
13456 union_decl_sptr result = lookup_type_in_map<union_decl>(type_name, m);
13458 result = lookup_union_type_through_translation_units(type_name, corp);
13537 lookup_type_in_map<enum_type_decl>(qualified_name, m);
13539 result = lookup_enum_type_through_translation_units(qualified_name, corp);
13557 return lookup_types_in_map(qualified_name, m);
13662 lookup_type_in_map<typedef_decl>(qualified_name, m);
13664 result = lookup_typedef_type_through_translation_units(qualified_name,
13759qualified_type_def_sptr
13774qualified_type_def_sptr
13780 qualified_type_def_sptr result =
13781 lookup_type_in_map<qualified_type_def>(qualified_name, m);
13784 result = lookup_qualified_type_through_translation_units(qualified_name,
13826 lookup_type_in_map<pointer_type_def>(qualified_name, m);
13828 result = lookup_pointer_type_through_translation_units(qualified_name,
13876 lookup_type_in_map<reference_type_def>(qualified_name, m);
13878 result = lookup_reference_type_through_translation_units(qualified_name,
13925 lookup_type_in_map<array_type_def>(qualified_name, m);
13927 result = lookup_array_type_through_translation_units(qualified_name, corp);
13996 lookup_type_in_map<function_type>(qualified_name, m);
13998 result = lookup_function_type_through_translation_units(qualified_name,
14021 type_base_sptr result;
14054 type_base_sptr result;
14102 return type_base_sptr();
14119template<
typename TypeKind>
14123 bool use_type_name_as_key =
true)
14127 if (use_type_name_as_key)
14129 else if (
location l = type->get_location())
14131 string str = l.expand();
14132 s = type->get_environment().intern(str);
14135 istring_type_base_wptrs_map_type::iterator i = types_map.find(s);
14136 bool result =
false;
14138 if (i == types_map.end())
14140 types_map[s].push_back(type);
14144 i->second.push_back(type);
14165 bool use_type_name_as_key)
14169 bool update_qname_map =
true;
14170 if (type->get_is_declaration_only())
14176 is_class_type(class_type->get_definition_of_declaration()))
14180 if (!update_qname_map)
14184 if (use_type_name_as_key)
14186 string qname = type->get_qualified_name();
14187 s = type->get_environment().intern(qname);
14189 else if (
location l = type->get_location())
14191 string str = l.expand();
14192 s = type->get_environment().intern(str);
14195 bool result =
false;
14196 istring_type_base_wptrs_map_type::iterator i = map.find(s);
14197 if (i == map.end())
14199 map[s].push_back(type);
14203 i->second.push_back(type);
14229 bool result =
false;
14231 istring_type_base_wptrs_map_type::iterator i = types_map.find(s);
14232 if (i == types_map.end())
14234 types_map[s].push_back(type);
14238 i->second.push_back(type);
14258 maybe_update_types_lookup_map<type_decl>
14261 if (
corpus *type_corpus = basic_type->get_corpus())
14263 maybe_update_types_lookup_map<type_decl>
14265 type_corpus->priv_->get_types().basic_types());
14267 maybe_update_types_lookup_map<type_decl>
14269 type_corpus->get_type_per_loc_map().basic_types(),
14274 maybe_update_types_lookup_map<type_decl>
14276 group->priv_->get_types().basic_types());
14278 maybe_update_types_lookup_map<type_decl>
14280 group->get_type_per_loc_map().basic_types(),
14305 if (
corpus *type_corpus = class_type->get_corpus())
14309 type_corpus->priv_->get_types().class_types());
14313 type_corpus->get_type_per_loc_map().class_types(),
14320 group->priv_->get_types().class_types());
14324 group->get_type_per_loc_map().class_types(),
14345 maybe_update_types_lookup_map<union_decl>
14348 if (
corpus *type_corpus = union_type->get_corpus())
14350 maybe_update_types_lookup_map<union_decl>
14352 type_corpus->priv_->get_types().union_types());
14354 maybe_update_types_lookup_map<union_decl>
14356 type_corpus->get_type_per_loc_map().union_types(),
14361 maybe_update_types_lookup_map<union_decl>
14363 group->priv_->get_types().union_types());
14365 maybe_update_types_lookup_map<union_decl>
14367 group->get_type_per_loc_map().union_types(),
14388 maybe_update_types_lookup_map<enum_type_decl>
14391 if (
corpus *type_corpus = enum_type->get_corpus())
14393 maybe_update_types_lookup_map<enum_type_decl>
14395 type_corpus->priv_->get_types().enum_types());
14397 maybe_update_types_lookup_map<enum_type_decl>
14399 type_corpus->get_type_per_loc_map().enum_types(),
14404 maybe_update_types_lookup_map<enum_type_decl>
14406 group->priv_->get_types().enum_types());
14408 maybe_update_types_lookup_map<enum_type_decl>
14410 group->get_type_per_loc_map().enum_types(),
14432 maybe_update_types_lookup_map<typedef_decl>
14435 if (
corpus *type_corpus = typedef_type->get_corpus())
14437 maybe_update_types_lookup_map<typedef_decl>
14439 type_corpus->priv_->get_types().typedef_types());
14441 maybe_update_types_lookup_map<typedef_decl>
14443 type_corpus->get_type_per_loc_map().typedef_types(),
14448 maybe_update_types_lookup_map<typedef_decl>
14450 group->priv_->get_types().typedef_types());
14452 maybe_update_types_lookup_map<typedef_decl>
14454 group->get_type_per_loc_map().typedef_types(),
14475 maybe_update_types_lookup_map<qualified_type_def>
14478 if (
corpus *type_corpus = qualified_type->get_corpus())
14480 maybe_update_types_lookup_map<qualified_type_def>
14482 type_corpus->priv_->get_types().qualified_types());
14486 maybe_update_types_lookup_map<qualified_type_def>
14488 group->priv_->get_types().qualified_types());
14508 maybe_update_types_lookup_map<pointer_type_def>
14511 if (
corpus *type_corpus = pointer_type->get_corpus())
14513 maybe_update_types_lookup_map<pointer_type_def>
14515 type_corpus->priv_->get_types().pointer_types());
14519 maybe_update_types_lookup_map<pointer_type_def>
14521 group->priv_->get_types().pointer_types());
14541 maybe_update_types_lookup_map<ptr_to_mbr_type>
14544 if (
corpus *type_corpus = ptr_to_member->get_corpus())
14546 maybe_update_types_lookup_map<ptr_to_mbr_type>
14548 type_corpus->priv_->get_types().ptr_to_mbr_types());
14552 maybe_update_types_lookup_map<ptr_to_mbr_type>
14554 group->priv_->get_types().ptr_to_mbr_types());
14574 maybe_update_types_lookup_map<reference_type_def>
14577 if (
corpus *type_corpus = reference_type->get_corpus())
14579 maybe_update_types_lookup_map<reference_type_def>
14581 type_corpus->priv_->get_types().reference_types());
14585 maybe_update_types_lookup_map<reference_type_def>
14587 group->priv_->get_types().reference_types());
14607 maybe_update_types_lookup_map<array_type_def>
14610 if (
corpus *type_corpus = array_type->get_corpus())
14612 maybe_update_types_lookup_map<array_type_def>
14614 type_corpus->priv_->get_types().array_types());
14616 maybe_update_types_lookup_map<array_type_def>
14618 type_corpus->get_type_per_loc_map().array_types(),
14623 maybe_update_types_lookup_map<array_type_def>
14625 group->priv_->get_types().array_types());
14627 maybe_update_types_lookup_map<array_type_def>
14629 group->get_type_per_loc_map().array_types(),
14651 maybe_update_types_lookup_map<array_type_def::subrange_type>
14654 if (
corpus *type_corpus = subrange_type->get_corpus())
14656 maybe_update_types_lookup_map<array_type_def::subrange_type>
14658 type_corpus->priv_->get_types().subrange_types());
14660 maybe_update_types_lookup_map<array_type_def::subrange_type>
14662 type_corpus->get_type_per_loc_map().subrange_types(),
14665 if (
corpus *group = subrange_type->get_corpus())
14667 maybe_update_types_lookup_map<array_type_def::subrange_type>
14669 group->priv_->get_types().subrange_types());
14671 maybe_update_types_lookup_map<array_type_def::subrange_type>
14673 group->get_type_per_loc_map().subrange_types(),
14698 if (
corpus *type_corpus = fn_type->get_corpus())
14702 type_corpus->priv_->get_types().function_types());
14704 if (
corpus *group = fn_type->get_corpus())
14708 group->priv_->get_types().function_types());
14801 type_base_sptr result;
14809 type_base_sptr underlying_type =
14812 if (underlying_type)
14815 qual->get_cv_quals(),
14816 qual->get_location()));
14821 type_base_sptr pointed_to_type =
14824 if (pointed_to_type)
14827 p->get_size_in_bits(),
14828 p->get_alignment_in_bits(),
14829 p->get_location()));
14834 type_base_sptr pointed_to_type =
14836 if (pointed_to_type)
14840 r->get_size_in_bits(),
14841 r->get_alignment_in_bits(),
14842 r->get_location()));
14856 tu.priv_->synthesized_types_.push_back(result);
14889 type_base_sptr result_return_type;
14894 if (!result_return_type)
14898 type_base_sptr parm_type;
14900 for (function_type::parameters::const_iterator i =
14905 type_base_sptr t = (*i)->get_type();
14912 (*i)->get_location(),
14913 (*i)->get_variadic_marker(),
14914 (*i)->get_is_artificial()));
14915 parms.push_back(parm);
14918 class_or_union_sptr class_type;
14930 result_fn_type.reset(
new method_type(result_return_type,
14942 tu.priv_->synthesized_types_.push_back(result_fn_type);
14946 return result_fn_type;
14957 if (mangled_name.empty())
14962 char * str = abi::__cxa_demangle(mangled_name.c_str(),
14963 NULL, &l, &status);
14964 string demangled_name = mangled_name;
14968 demangled_name = str;
14972 return demangled_name;
14997global_scope::~global_scope()
15002maybe_propagate_canonical_type(
const type_base& lhs_type,
15003 const type_base& rhs_type);
15022types_defined_same_linux_kernel_corpus_public(
const type_base& t1,
15023 const type_base& t2)
15025 const corpus *t1_corpus = t1.get_corpus(), *t2_corpus = t2.get_corpus();
15026 string t1_file_path, t2_file_path;
15030 if (!(t1_corpus && t2_corpus
15031 && t1_corpus == t2_corpus
15032 && (t1_corpus->get_origin() & corpus::LINUX_KERNEL_BINARY_ORIGIN)
15037 class_or_union *c1 = 0, *c2 = 0;
15043 if ((c1 && c1->get_is_anonymous() && !c1->get_naming_typedef())
15044 || (c2 && c2->get_is_anonymous() && !c2->get_naming_typedef()))
15051 && c1->get_is_anonymous() && c1->get_naming_typedef()
15052 && c2->get_is_anonymous() && c2->get_naming_typedef())
15053 if (c1->get_naming_typedef()->get_name()
15054 != c2->get_naming_typedef()->get_name())
15060 if (e1->get_is_anonymous() || e2->get_is_anonymous())
15070 if (c1->get_is_declaration_only() != c2->get_is_declaration_only())
15072 if (c1->get_environment().decl_only_class_equals_definition())
15082 if (t1.get_size_in_bits() != t2.get_size_in_bits())
15091 l = c1->get_location();
15093 l =
dynamic_cast<const decl_base&
>(t1).
get_location();
15095 unsigned line = 0, col = 0;
15097 l.
expand(t1_file_path, line, col);
15099 l = c2->get_location();
15101 l =
dynamic_cast<const decl_base&
>(t2).
get_location();
15103 l.
expand(t2_file_path, line, col);
15106 if (t1_file_path.empty() || t2_file_path.empty())
15109 if (t1_file_path == t2_file_path)
15145compare_types_during_canonicalization(
const type_base& canonical_type,
15146 const type_base& candidate_type)
15148#ifdef WITH_DEBUG_TYPE_CANONICALIZATION
15149 const environment& env = canonical_type.get_environment();
15150 if (env.debug_type_canonicalization_is_on())
15152 bool canonical_equality =
false, structural_equality =
false;
15153 env.priv_->use_canonical_type_comparison_ =
false;
15154 structural_equality = canonical_type == candidate_type;
15155 env.priv_->use_canonical_type_comparison_ =
true;
15156 canonical_equality = canonical_type == candidate_type;
15157 if (canonical_equality != structural_equality)
15159 std::cerr <<
"structural & canonical equality different for type: "
15160 << canonical_type.get_pretty_representation(
true,
true)
15164 return structural_equality;
15167 return canonical_type == candidate_type;
15191compare_canonical_type_against_candidate(
const type_base& canonical_type,
15192 const type_base& candidate_type)
15194 environment& env =
const_cast<environment&
>(canonical_type.get_environment());
15212 bool saved_decl_only_class_equals_definition =
15213 env.decl_only_class_equals_definition();
15214 env.do_on_the_fly_canonicalization(
true);
15217 env.decl_only_class_equals_definition(
false);
15218 env.priv_->allow_type_comparison_results_caching(
true);
15219 bool equal = (types_defined_same_linux_kernel_corpus_public(canonical_type,
15221 || compare_types_during_canonicalization(canonical_type,
15226 env.priv_->clear_type_comparison_results_cache();
15227 env.priv_->allow_type_comparison_results_caching(
false);
15228 env.do_on_the_fly_canonicalization(
false);
15229 env.decl_only_class_equals_definition
15230 (saved_decl_only_class_equals_definition);
15255compare_canonical_type_against_candidate(
const type_base* canonical_type,
15256 const type_base* candidate_type)
15258 return compare_canonical_type_against_candidate(*canonical_type,
15283compare_canonical_type_against_candidate(
const type_base_sptr& canonical_type,
15284 const type_base_sptr& candidate_type)
15286 return compare_canonical_type_against_candidate(canonical_type.get(),
15287 candidate_type.get());
15313type_base::get_canonical_type_for(type_base_sptr t)
15318 environment& env =
const_cast<environment&
>(t->get_environment());
15322 return type_base_sptr();
15328 bool decl_only_class_equals_definition =
15341 if (decl_only_class_equals_definition)
15342 if (class_or_union)
15343 if (class_or_union->get_is_declaration_only())
15344 return type_base_sptr();
15347 if (t->get_canonical_type())
15348 return t->get_canonical_type();
15356 || !class_or_union->get_is_anonymous()
15357 || class_or_union->get_linkage_name().empty());
15369 string repr = t->get_cached_pretty_representation(
true);
15374 type_base_sptr canonical_type_present_in_corpus;
15376 env.get_canonical_types_map();
15378 type_base_sptr result;
15379 environment::canonical_types_map_type::iterator i = types.find(repr);
15380 if (i == types.end())
15382 vector<type_base_sptr> v;
15389 vector<type_base_sptr> &v = i->second;
15396 for (vector<type_base_sptr>::const_reverse_iterator it = v.rbegin();
15400 bool equal = compare_canonical_type_against_candidate(*it, t);
15407#ifdef WITH_DEBUG_SELF_COMPARISON
15408 if (env.self_comparison_debug_is_on())
15412 corpus_sptr corp1, corp2;
15413 env.get_self_comparison_debug_inputs(corp1, corp2);
15414 if (corp1 && corp2 && t->get_corpus() == corp2.get())
15425 check_canonical_type_from_abixml_during_self_comp(t,
15431 uintptr_t should_have_canonical_type = 0;
15432 string type_id = env.get_type_id_from_type(t.get());
15433 if (type_id.empty())
15434 type_id =
"type-id-<not-found>";
15436 should_have_canonical_type =
15437 env.get_canonical_type_from_type_id(type_id.c_str());
15438 std::cerr <<
"error: wrong canonical type for '"
15447 <<
"'. Should have had canonical type: "
15449 << should_have_canonical_type
15455 uintptr_t ptr_val =
reinterpret_cast<uintptr_t
>(t.get());
15456 string type_id = env.get_type_id_from_pointer(ptr_val);
15457 if (type_id.empty())
15458 type_id =
"type-id-<not-found>";
15475 std::cerr <<
"error: wrong induced canonical type for '"
15477 <<
"' from second corpus"
15478 <<
", ptr: " << std::hex << t.get()
15479 <<
" type-id: " << type_id
15518maybe_adjust_canonical_type(
const type_base_sptr& canonical,
15519 const type_base_sptr& type)
15521 if (type->get_naked_canonical_type())
15528 if (canonical_class
15529 && canonical_class.get() != cl.get())
15533 for (class_decl::member_functions::const_iterator i =
15534 cl->get_member_functions().begin();
15535 i != cl->get_member_functions().end();
15537 if ((*i)->get_symbol())
15540 find_member_function((*i)->get_linkage_name()))
15543 if (s1 && !m->get_symbol())
15550 if (canonical_class->get_corpus()
15551 && cl->get_corpus()
15552 && (cl->get_corpus() == canonical_class->get_corpus()))
15577 canonical_class = cl;
15580 if (canonical_class)
15582 if (
auto abi_corpus = canonical_class->get_corpus())
15584 for (
auto& fn : canonical_class->get_member_functions())
15590 fn->set_is_in_public_symbol_table(
true);
15591 auto b = abi_corpus->get_exported_decls_builder();
15592 b->maybe_add_fn_to_exported_fns(fn.get());
15595 abi_corpus->get_undefined_functions().insert(fn.get());
15607 if (type->get_is_artificial() != canonical->get_is_artificial())
15608 canonical->set_is_artificial(
false);
15632 if (t->get_canonical_type())
15633 return t->get_canonical_type();
15635 if (t->get_environment().priv_->do_log())
15636 std::cerr <<
"Canonicalization of type '"
15637 << t->get_pretty_representation(
true,
true)
15638 <<
"/@#" << std::hex << t.get() <<
": ";
15642 if (t->get_environment().priv_->do_log())
15644 type_base_sptr canonical = type_base::get_canonical_type_for(t);
15646 if (t->get_environment().priv_->do_log())
15649 if (t->get_environment().priv_->do_log())
15650 std::cerr << tmr <<
"\n";
15652 maybe_adjust_canonical_type(canonical, t);
15654 t->priv_->canonical_type = canonical;
15655 t->priv_->naked_canonical_type = canonical.get();
15669 ABG_ASSERT(!t->priv_->canonical_type_propagated()
15670 || t->priv_->propagated_canonical_type_confirmed());
15673 if (type_base_sptr d =
is_type(cl->get_earlier_declaration()))
15674 if ((canonical = d->get_canonical_type()))
15676 d->priv_->canonical_type = canonical;
15677 d->priv_->naked_canonical_type = canonical.get();
15694 if (type_base_sptr c =
is_type(scope)->get_canonical_type())
15708#ifdef WITH_DEBUG_CT_PROPAGATION
15717 env.priv_->erase_type_with_cleared_propagated_canonical_type(t.get());
15721 t->on_canonical_type_set();
15732 priv_->definition_of_declaration_ = d;
15734 if (type_base_sptr canonical_type =
is_type(d)->get_canonical_type())
15735 t->priv_->canonical_type = canonical_type;
15737 priv_->naked_definition_of_declaration_ =
const_cast<decl_base*
>(d.get());
15747 priv_(new
priv(s, a))
15759{
return priv_->canonical_type.lock();}
15775{
return priv_->naked_canonical_type;}
15800 return priv_->internal_cached_repr_;
15809 return priv_->cached_repr_;
15847{
return equals(*
this, other, 0);}
15864{priv_->size_in_bits = s;}
15871{
return priv_->size_in_bits;}
15878{priv_->alignment_in_bits = a;}
15885{
return priv_->alignment_in_bits;}
15901 v.visit_begin(
this);
15902 bool result = v.visit_end(
this);
15908type_base::~type_base()
15927 static_cast<unsigned>(r));
15942 static_cast<unsigned>(r));
15999parse_integral_type_modifier(
const string& word,
16002 if (word ==
"signed")
16004 else if (word ==
"unsigned")
16006 else if (word ==
"short")
16008 else if (word ==
"long")
16010 else if (word ==
"long long")
16028parse_base_integral_type(
const string& type_name,
16031 if (type_name ==
"int")
16033 else if (type_name ==
"char")
16035 else if (type_name ==
"bool" || type_name ==
"_Bool")
16037 else if (type_name ==
"double")
16039 else if (type_name ==
"float")
16041 else if (type_name ==
"char16_t")
16043 else if (type_name ==
"char32_t")
16045 else if (type_name ==
"wchar_t")
16070 string input = type_name;
16071 string::size_type len = input.length();
16072 string::size_type cur_pos = 0, prev_pos = 0;
16073 string cur_word, prev_word;
16076 while (cur_pos < len)
16078 if (cur_pos < len && isspace(input[cur_pos]))
16081 while (cur_pos < len && isspace(input[cur_pos]));
16083 prev_pos = cur_pos;
16084 cur_pos = input.find(
' ', prev_pos);
16085 prev_word = cur_word;
16086 cur_word = input.substr(prev_pos, cur_pos - prev_pos);
16089 && cur_word ==
"long"
16090 && prev_word !=
"long")
16092 if (cur_pos < len && isspace(input[cur_pos]))
16095 while (cur_pos < len && isspace(input[cur_pos]));
16096 prev_pos = cur_pos;
16098 cur_pos = input.find(
' ', prev_pos);
16099 string saved_prev_word = prev_word;
16100 prev_word = cur_word;
16101 cur_word = input.substr(prev_pos, cur_pos - prev_pos);
16102 if (cur_word ==
"long")
16103 cur_word =
"long long";
16106 cur_pos = prev_pos;
16107 cur_word = prev_word;
16108 prev_word = saved_prev_word;
16112 if (!parse_integral_type_modifier(cur_word, modifiers))
16114 if (!parse_base_integral_type(cur_word, base))
16152 : base_(INT_BASE_TYPE),
16153 modifiers_(NO_MODIFIER)
16162 : base_(b), modifiers_(m)
16170 : base_(INT_BASE_TYPE),
16171 modifiers_(NO_MODIFIER)
16189{
return modifiers_;}
16206{
return base_ == other.base_ && modifiers_ == other.modifiers_;}
16224 result +=
"signed ";
16226 result +=
"unsigned ";
16237 result +=
"short ";
16241 result +=
"long long ";
16252 result +=
"double";
16256 result +=
"char16_t";
16258 result +=
"char32_t";
16260 result +=
"wchar_t";
16270integral_type::operator string()
const
16271{
return to_string();}
16294 const string& name,
16295 size_t size_in_bits,
16296 size_t alignment_in_bits,
16298 const string& linkage_name,
16303 | ABSTRACT_TYPE_BASE
16304 | ABSTRACT_DECL_BASE),
16305 decl_base(env, name, locus, linkage_name, vis),
16306 type_base(env, size_in_bits, alignment_in_bits)
16317 string integral_type_name = int_type;
16351 bool result =
false;
16382 return *
this == *other;
16410 return *
this == other;
16456 if (l.get() == r.get())
16484 bool internal)
const
16508 if (decl_base::priv_->internal_qualified_name_.
empty())
16509 decl_base::priv_->internal_qualified_name_ =
16510 env.
intern(get_internal_integral_type_name(
this));
16511 return decl_base::priv_->internal_qualified_name_;
16515 decl_base::priv_->temporary_internal_qualified_name_ =
16516 env.
intern(get_internal_integral_type_name(
this));
16517 return decl_base::priv_->temporary_internal_qualified_name_;
16543 bool qualified_name)
const
16547 return get_internal_integral_type_name(
this);
16549 if (qualified_name)
16567 v.visit_begin(
this);
16568 bool result = v.visit_end(
this);
16574type_decl::~type_decl()
16594 const string& name,
16595 size_t size_in_bits,
16596 size_t alignment_in_bits,
16600 ABSTRACT_SCOPE_TYPE_DECL
16601 | ABSTRACT_TYPE_BASE
16602 | ABSTRACT_DECL_BASE),
16604 type_base(env, size_in_bits, alignment_in_bits),
16673 return *
this == *other;
16697 if (v.visit_begin(
this))
16700 for (scope_decl::declarations::const_iterator i =
16704 if (!(*i)->traverse(v))
16709 bool result = v.visit_end(
this);
16715scope_type_decl::~scope_type_decl()
16731 const string& name,
16742 | ABSTRACT_DECL_BASE
16743 | ABSTRACT_SCOPE_DECL),
16769 bool qualified_name)
const
16811 if (!ns->is_empty_or_has_empty_sub_namespaces())
16832 if (v.visit_begin(
this))
16835 scope_decl::declarations::const_iterator i;
16841 dynamic_pointer_cast<ir_traversable_base>(*i);
16843 if (!t->traverse (v))
16848 return v.visit_end(
this);
16851namespace_decl::~namespace_decl()
16860class qualified_type_def::priv
16871 weak_ptr<type_base> underlying_type_;
16874 : cv_quals_(CV_NONE)
16879 : cv_quals_(quals),
16880 underlying_type_(t)
16932qualified_type_def::qualified_type_def(type_base_sptr type,
16937 | ABSTRACT_TYPE_BASE
16938 | ABSTRACT_DECL_BASE),
16939 type_base(type->get_environment(), type->get_size_in_bits(),
16940 type->get_alignment_in_bits()),
16941 decl_base(type->get_environment(),
"", locus,
"",
16942 dynamic_pointer_cast<
decl_base>(type)->get_visibility()),
16943 priv_(new priv(quals, type))
16962 | ABSTRACT_TYPE_BASE
16963 | ABSTRACT_DECL_BASE),
16967 priv_(new priv(quals))
16990 s = ut->get_size_in_bits();
17019 bool result =
true;
17086 return *
this == *other;
17104 return *
this == *other;
17119 bool internal)
const
17147 if (priv_->temporary_internal_name_.empty())
17148 priv_->temporary_internal_name_ =
17150 return priv_->temporary_internal_name_;
17166 if (priv_->internal_name_.empty())
17167 priv_->internal_name_ =
17170 return priv_->internal_name_;
17199 if (v.visit_begin(
this))
17206 bool result = v.visit_end(
this);
17211qualified_type_def::~qualified_type_def()
17218{
return priv_->cv_quals_;}
17223{priv_->cv_quals_ = cv_quals;}
17237{
return priv_->underlying_type_.lock();}
17246 priv_->underlying_type_ = t;
17256 scope_decl::declarations::iterator i;
17257 if (s->find_iterator_for_member(
this, i))
17272operator==(
const qualified_type_def_sptr& l,
const qualified_type_def_sptr& r)
17274 if (l.get() == r.get())
17290operator!=(
const qualified_type_def_sptr& l,
const qualified_type_def_sptr& r)
17298 (
static_cast<unsigned>(lhs) |
static_cast<unsigned>(rhs));
17322 (
static_cast<unsigned>(lhs) &
static_cast<unsigned>(rhs));
17344 case qualified_type_def::CV_NONE:
17347 case qualified_type_def::CV_CONST:
17350 case qualified_type_def::CV_VOLATILE:
17353 case qualified_type_def::CV_RESTRICT:
17367struct pointer_type_def::priv
17374 priv(
const type_base_sptr& t)
17376 naked_pointed_to_type_(t.get())
17380 : naked_pointed_to_type_()
17405pointer_type_def::pointer_type_def(
const type_base_sptr& pointed_to,
17406 size_t size_in_bits,
17407 size_t align_in_bits,
17411 | ABSTRACT_TYPE_BASE
17412 | ABSTRACT_DECL_BASE),
17413 type_base(pointed_to->get_environment(), size_in_bits, align_in_bits),
17414 decl_base(pointed_to->get_environment(),
"", locus,
""),
17415 priv_(new priv(pointed_to))
17421 const environment& env = pointed_to->get_environment();
17422 decl_base_sptr pto = dynamic_pointer_cast<decl_base>(pointed_to);
17423 string name = (pto ? pto->get_name() : string(
"void")) +
"*";
17441pointer_type_def::pointer_type_def(
const environment& env,
size_t size_in_bits,
17442 size_t alignment_in_bits,
17446 | ABSTRACT_TYPE_BASE
17447 | ABSTRACT_DECL_BASE),
17448 type_base(env, size_in_bits, alignment_in_bits),
17453 string name = string(
"void") +
"*";
17464 priv_->pointed_to_type_ = t;
17465 priv_->naked_pointed_to_type_ = t.get();
17470 decl_base_sptr pto = dynamic_pointer_cast<decl_base>(t);
17471 string name = (pto ? pto->get_name() : string(
"void")) +
"*";
17554 return *
this == *o;
17575const type_base_sptr
17577{
return priv_->pointed_to_type_.lock();}
17584{
return priv_->naked_pointed_to_type_;}
17622 if (priv_->internal_qualified_name_.empty())
17623 if (pointed_to_type)
17624 priv_->internal_qualified_name_ =
17625 pointer_declaration_name(
this,
17632 return priv_->internal_qualified_name_;
17640 if (pointed_to_type)
17641 if (priv_->temp_internal_qualified_name_.empty())
17642 priv_->temp_internal_qualified_name_ =
17643 pointer_declaration_name(
this,
17650 return priv_->temp_internal_qualified_name_;
17659 (pointer_declaration_name(
this,
17671 if (pointed_to_type)
17673 (pointer_declaration_name(
this,
17698 if (v.visit_begin(
this))
17706 bool result = v.visit_end(
this);
17711pointer_type_def::~pointer_type_def()
17728 if (l.get() == r.get())
17756struct reference_type_def::priv
17764 priv(
const type_base_sptr& t,
bool is_lvalue)
17766 is_lvalue_(is_lvalue)
17769 priv(
bool is_lvalue)
17770 : is_lvalue_(is_lvalue)
17799reference_type_def::reference_type_def(
const type_base_sptr pointed_to,
17801 size_t size_in_bits,
17802 size_t align_in_bits,
17806 | ABSTRACT_TYPE_BASE
17807 | ABSTRACT_DECL_BASE),
17808 type_base(pointed_to->get_environment(), size_in_bits, align_in_bits),
17809 decl_base(pointed_to->get_environment(),
"", locus,
""),
17810 priv_(new priv(pointed_to, lvalue))
17816 decl_base_sptr pto = dynamic_pointer_cast<decl_base>(pointed_to);
17821 name = string(pto->get_name()) +
"&";
17829 const environment& env = pointed_to->get_environment();
17853reference_type_def::reference_type_def(
const environment& env,
bool lvalue,
17854 size_t size_in_bits,
17855 size_t alignment_in_bits,
17859 | ABSTRACT_TYPE_BASE
17860 | ABSTRACT_DECL_BASE),
17861 type_base(env, size_in_bits, alignment_in_bits),
17863 priv_(new priv(lvalue))
17866 string name =
"void&";
17881 priv_->pointed_to_type_ = pointed_to_type;
17883 decl_base_sptr pto;
17885 {pto = dynamic_pointer_cast<decl_base>(pointed_to_type);}
17892 string name = string(pto->get_name()) +
"&";
17922 if (l.is_lvalue() != r.is_lvalue())
17930 bool result = (l.get_pointed_to_type() == r.get_pointed_to_type());
17969 return *
this == *other;
17984 return *
this == *other;
17988reference_type_def::get_pointed_to_type()
const
17989{
return priv_->pointed_to_type_.lock();}
17992reference_type_def::is_lvalue()
const
17993{
return priv_->is_lvalue_;}
18023 type_base_sptr pointed_to_type = get_pointed_to_type();
18030 if (priv_->internal_qualified_name_.empty())
18031 if (pointed_to_type)
18032 priv_->internal_qualified_name_ =
18040 return priv_->internal_qualified_name_;
18048 if (pointed_to_type)
18049 if (priv_->temp_internal_qualified_name_.empty())
18050 priv_->temp_internal_qualified_name_ =
18058 return priv_->temp_internal_qualified_name_;
18078 if (pointed_to_type)
18108 bool qualified_name)
const
18112 (get_pointed_to_type()),
18136 if (v.visit_begin(
this))
18139 if (type_base_sptr t = get_pointed_to_type())
18144 bool result = v.visit_end(
this);
18149reference_type_def::~reference_type_def()
18166 if (l.get() == r.get())
18194struct ptr_to_mbr_type::priv
18198 type_base_sptr dm_type_;
18201 type_base_sptr containing_type_;
18208 priv(
const type_base_sptr& dm_type,
const type_base_sptr& containing_type)
18209 : dm_type_(dm_type),
18210 containing_type_(containing_type)
18232 const type_base_sptr& member_type,
18233 const type_base_sptr& containing_type,
18234 size_t size_in_bits,
18235 size_t alignment_in_bits,
18238 POINTER_TO_MEMBER_TYPE
18239 | ABSTRACT_TYPE_BASE
18240 | ABSTRACT_DECL_BASE),
18241 type_base(env, size_in_bits, alignment_in_bits),
18243 priv_(new priv(member_type, containing_type))
18258const type_base_sptr&
18260{
return priv_->dm_type_;}
18267const type_base_sptr&
18269{
return priv_->containing_type_;}
18299 return *
this == *other;
18314 return *
this == *other;
18326 bool internal)
const
18345 if (priv_->internal_qualified_name_.empty())
18346 priv_->internal_qualified_name_ =
18347 ptr_to_mbr_declaration_name(
this,
"",
18350 return priv_->internal_qualified_name_;
18354 priv_->temp_internal_qualified_name_ =
18355 ptr_to_mbr_declaration_name(
this,
"",
true, internal);
18356 return priv_->temp_internal_qualified_name_;
18362 (ptr_to_mbr_declaration_name(
this,
"",
true,
18384 if (v.visit_begin(
this))
18395 bool result = v.visit_end(
this);
18427 bool result =
true;
18429 if (!(l.decl_base::operator==(r)))
18468array_type_def::subrange_type::~subrange_type() =
default;
18477 : s_(UNSIGNED_SIGNEDNESS)
18486 : s_(UNSIGNED_SIGNEDNESS)
18495 : s_(SIGNED_SIGNEDNESS)
18503enum array_type_def::subrange_type::bound_value::signedness
18527{
return v_.unsigned_;}
18535 s_ = UNSIGNED_SIGNEDNESS;
18545 s_ = SIGNED_SIGNEDNESS;
18557 return s_ == v.s_ && v_.unsigned_ == v.v_.unsigned_;
18562struct array_type_def::subrange_type::priv
18572 : upper_bound_(ub), language_(l), infinite_(false)
18575 priv(bound_value lb, bound_value ub,
18577 : lower_bound_(lb), upper_bound_(ub),
18578 language_(l), infinite_(false)
18581 priv(bound_value lb, bound_value ub,
const type_base_sptr &u,
18583 : lower_bound_(lb), upper_bound_(ub), underlying_type_(u),
18584 language_(l), infinite_(false)
18603 const string& name,
18606 const type_base_sptr& utype,
18609 :
type_or_decl_base(env, SUBRANGE_TYPE | ABSTRACT_TYPE_BASE | ABSTRACT_DECL_BASE),
18616 priv_(new priv(lower_bound, upper_bound, utype, l))
18636 const string& name,
18641 :
type_or_decl_base(env, SUBRANGE_TYPE | ABSTRACT_TYPE_BASE | ABSTRACT_DECL_BASE),
18644 priv_(new priv(lower_bound, upper_bound, l))
18662 const string& name,
18666 :
type_or_decl_base(env, SUBRANGE_TYPE | ABSTRACT_TYPE_BASE | ABSTRACT_DECL_BASE),
18667 type_base(env, upper_bound.get_unsigned_value(), 0),
18669 priv_(new priv(upper_bound, l))
18680{
return priv_->underlying_type_.lock();}
18689 ABG_ASSERT(priv_->underlying_type_.expired());
18690 priv_->underlying_type_ = u;
18700{
return priv_->upper_bound_.get_signed_value();}
18707{
return priv_->lower_bound_.get_signed_value();}
18714{priv_->upper_bound_ = ub;}
18721{priv_->lower_bound_ = lb;}
18738 if (get_upper_bound() >= get_lower_bound())
18739 return get_upper_bound() - get_lower_bound() + 1;
18748{
return priv_->infinite_;}
18756{priv_->infinite_ = f;}
18763{
return priv_->language_;}
18771 std::ostringstream o;
18775 type_base_sptr underlying_type = get_underlying_type();
18776 if (underlying_type)
18778 o <<
"range "<< get_lower_bound() <<
" .. " << get_upper_bound();
18783 o <<
"[" << get_length() <<
"]";
18798 for (vector<subrange_sptr>::const_iterator i = v.begin();
18801 r += (*i)->as_string();
18830 bool result =
true;
18874 return *
this == *other;
18942 repr +=
"<anonymous range>";
18944 repr +=
"<range " +
get_name() +
">";
18945 repr += as_string();
18963 if (v.visit_begin(
this))
18966 if (type_base_sptr u = get_underlying_type())
18971 bool result = v.visit_end(
this);
18978struct array_type_def::priv
18985 priv(type_base_sptr t)
18990 : element_type_(t), subranges_(subs)
19010array_type_def::array_type_def(
const type_base_sptr e_type,
19011 const std::vector<subrange_sptr>& subs,
19015 | ABSTRACT_TYPE_BASE
19016 | ABSTRACT_DECL_BASE),
19019 priv_(new priv(e_type))
19043 const std::vector<subrange_sptr>& subs,
19047 | ABSTRACT_TYPE_BASE
19048 | ABSTRACT_DECL_BASE),
19062array_type_def::update_size()
19064 type_base_sptr e = priv_->element_type_.lock();
19067 size_t s = e->get_size_in_bits();
19071 s *= sub->get_length();
19079array_type_def::get_subrange_representation()
const
19105 bool qualified_name)
const
19107 return array_declaration_name(
this,
"",
19108 qualified_name, internal);
19133 std::vector<array_type_def::subrange_sptr > this_subs = l.
get_subranges();
19134 std::vector<array_type_def::subrange_sptr > other_subs = r.
get_subranges();
19136 bool result =
true;
19137 if (this_subs.size() != other_subs.size())
19146 std::vector<array_type_def::subrange_sptr >::const_iterator i,j;
19147 for (i = this_subs.begin(), j = other_subs.begin();
19148 i != this_subs.end() && j != other_subs.end();
19195 std::vector<array_type_def::subrange_sptr > this_subs = l->
get_subranges();
19196 std::vector<array_type_def::subrange_sptr > other_subs = r->
get_subranges();
19198 if (this_subs.size() != other_subs.size())
19201 std::vector<array_type_def::subrange_sptr >::const_iterator i,j;
19202 for (i = this_subs.begin(), j = other_subs.begin();
19203 i != this_subs.end() && j != other_subs.end();
19213 if (*first_element_type != *second_element_type)
19225 const std::vector<subrange_sptr>& subranges =
19228 if (subranges.empty())
19229 return translation_unit::LANG_C11;
19230 return subranges.front()->get_language();
19249 return *
this == *other;
19255const type_base_sptr
19257{
return priv_->element_type_.lock();}
19273 priv_->element_type_ = element_type;
19284 for (
const auto &sub : subs)
19285 priv_->subranges_.push_back(sub);
19297 if (priv_->subranges_.empty())
19300 for (std::vector<shared_ptr<subrange_type> >::const_iterator i =
19301 priv_->subranges_.begin();
19302 i != priv_->subranges_.end();
19304 if ((*i)->is_non_finite())
19311array_type_def::get_dimension_count()
const
19312{
return priv_->subranges_.size();}
19343 if (priv_->internal_qualified_name_.empty())
19344 priv_->internal_qualified_name_ =
19345 array_declaration_name(
this,
"",
19348 return priv_->internal_qualified_name_;
19352 priv_->temp_internal_qualified_name_ =
19353 array_declaration_name(
this,
"",
19355 return priv_->temp_internal_qualified_name_;
19372 (array_declaration_name(
this,
"",
19396 if (v.visit_begin(
this))
19404 bool result = v.visit_end(
this);
19410array_type_def::get_location()
const
19414const std::vector<array_type_def::subrange_sptr>&
19416{
return priv_->subranges_;}
19418array_type_def::~array_type_def()
19425class enum_type_decl::priv
19427 type_base_sptr underlying_type_;
19436 priv(type_base_sptr underlying_type,
19438 : underlying_type_(underlying_type),
19456enum_type_decl::enum_type_decl(
const string& name,
19458 type_base_sptr underlying_type,
19460 const string& linkage_name,
19464 | ABSTRACT_TYPE_BASE
19465 | ABSTRACT_DECL_BASE),
19466 type_base(underlying_type->get_environment(),
19467 underlying_type->get_size_in_bits(),
19468 underlying_type->get_alignment_in_bits()),
19469 decl_base(underlying_type->get_environment(),
19470 name, locus, linkage_name, vis),
19471 priv_(new priv(underlying_type, enums))
19477 e->set_enum_type(
this);
19483{
return priv_->underlying_type_;}
19488{
return priv_->enumerators_;}
19493{
return priv_->enumerators_;}
19501 if (priv_->sorted_enumerators_.empty())
19506 priv_->sorted_enumerators_.push_back(*e);
19508 std::sort(priv_->sorted_enumerators_.begin(),
19509 priv_->sorted_enumerators_.end(),
19513 if (l.get_name() == r.get_name())
19514 return l.get_value() < r.get_value();
19515 return (l.get_name() < r.get_name());
19519 return priv_->sorted_enumerators_;
19541 bool qualified_name)
const
19543 string r =
"enum ";
19573 if (v.visit_begin(
this))
19581 bool result = v.visit_end(
this);
19603 bool result =
false;
19613 enum_type_decl::enumerators::const_iterator i, j;
19646 if (!(l.decl_base::operator==(r) && l.type_base::operator==(r)))
19651 if (!l.decl_base::operator==(r))
19653 if (!l.type_base::operator==(r))
19700enumerators_values_are_equal(
const enum_type_decl::enumerator &enr,
19701 const enum_type_decl::enumerator &enl)
19702{
return enr.get_value() == enl.get_value();}
19725is_enumerator_value_present_in_enum(
const enum_type_decl::enumerator &enr,
19726 const enum_type_decl &enom,
19727 vector<enum_type_decl::enumerator>& redundant_enrs)
19729 bool found =
false;
19730 for (
const auto &e : enom.get_enumerators())
19731 if (enumerators_values_are_equal(e, enr))
19735 redundant_enrs.push_back(e);
19753is_enumerator_value_redundant(
const enum_type_decl::enumerator &enr,
19754 const enum_type_decl &enom)
19756 vector<enum_type_decl::enumerator> redundant_enrs;
19757 if (is_enumerator_value_present_in_enum(enr, enom, redundant_enrs))
19759 if (!redundant_enrs.empty())
19787 bool result =
true;
19803 if (!!def1 != !!def2)
19833 if (!(def1->decl_base::operator==(*def2)
19834 && def1->type_base::operator==(*def2)))
19839 if (!def1->decl_base::operator==(*def2))
19841 if (!def1->type_base::operator==(*def2))
19892 && (!is_enumerator_value_redundant(e, *def2)
19893 || !is_enumerator_value_redundant(e, *def1)))
19907 && (!is_enumerator_value_redundant(e, *def1)
19908 || !is_enumerator_value_redundant(e, *def2)))
19950 return *
this == *other;
19965 if (l.get() == r.get())
19967 decl_base_sptr o = r;
19984class enum_type_decl::enumerator::priv
19988 string qualified_name_;
19991 friend class enum_type_decl::enumerator;
19999 priv(
const string& name,
20001 enum_type_decl* e = 0)
20013enum_type_decl::enumerator::~enumerator() =
default;
20024 : priv_(new priv(name, value))
20031 : priv_(new priv(other.
get_name(),
20033 other.get_enum_type()))
20058 bool names_equal =
true;
20060 return names_equal && (get_value() == other.
get_value());
20079{
return priv_->name_;}
20097 if (priv_->qualified_name_.empty())
20099 priv_->qualified_name_ =
20100 get_enum_type()->get_qualified_name(internal)
20104 return priv_->qualified_name_;
20120{
return priv_->value_;}
20134{
return priv_->enum_type_;}
20141{priv_->enum_type_ = e;}
20147struct typedef_decl::priv
20151 priv(
const type_base_sptr& t)
20152 : underlying_type_(t)
20167typedef_decl::typedef_decl(
const string& name,
20168 const type_base_sptr underlying_type,
20170 const string& linkage_name,
20174 | ABSTRACT_TYPE_BASE
20175 | ABSTRACT_DECL_BASE),
20180 name, locus, linkage_name, vis),
20181 priv_(new priv(underlying_type))
20197typedef_decl::typedef_decl(
const string& name,
20200 const string& mangled_name,
20204 | ABSTRACT_TYPE_BASE
20205 | ABSTRACT_DECL_BASE),
20208 decl_base(env, name, locus, mangled_name, vis),
20209 priv_(new priv(nullptr))
20270 bool result =
true;
20274 if (!(l.decl_base::operator==(r)))
20321 return *
this == *other;
20343 bool qualified_name)
const
20346 string result =
"typedef ";
20351 if (qualified_name)
20365{
return priv_->underlying_type_.lock();}
20373 priv_->underlying_type_ = t;
20387 bool internal)
const
20405 return decl_base::priv_->internal_qualified_name_;
20407 return decl_base::priv_->qualified_name_;
20426 if (v.visit_begin(
this))
20434 bool result = v.visit_end(
this);
20439typedef_decl::~typedef_decl()
20445struct var_decl::priv
20458 priv(type_base_sptr t,
20461 naked_type_(t.get()),
20472 naked_type_ = t.get();
20489var_decl::var_decl(
const string& name,
20490 type_base_sptr type,
20492 const string& linkage_name,
20496 VAR_DECL | ABSTRACT_DECL_BASE),
20497 decl_base(type->get_environment(), name, locus, linkage_name, vis),
20498 priv_(new priv(type, bind))
20506const type_base_sptr
20508{
return priv_->type_.lock();}
20515{priv_->set_type(t);}
20526{
return priv_->naked_type_;}
20533{
return priv_->binding_;}
20540{priv_->binding_ = b;}
20556 priv_->symbol_ = sym;
20571{
return priv_->symbol_;}
20640 bool result =
true;
20653 else if (s0 && s0 != s1)
20661 bool symbols_are_equal = (s0 && s1 && result);
20663 if (symbols_are_equal)
20672 bool decl_bases_different = !l.decl_base::operator==(r);
20673 const_cast<var_decl&
>(l).set_qualified_name(n1);
20674 const_cast<var_decl&
>(r).set_qualified_name(n2);
20676 if (decl_bases_different)
20686 if (!l.decl_base::operator==(r))
20735 bool result =
true;
20771 return equals(*
this, *other, 0);
20786 if (priv_->id_.empty())
20791 sym_str = s->get_id_string();
20796 priv_->id_ = env.
intern(repr);
20797 if (!sym_str.empty())
20798 priv_->id_ = env.
intern(priv_->id_ +
"{" + sym_str +
"}");
20810 return hash_var(
this);
20875 result =
"static ";
20879 bool member_of_anonymous_class =
false;
20882 member_of_anonymous_class =
true;
20891 if (member_of_anonymous_class || !qualified_name)
20898 string quals_repr =
20900 if (!quals_repr.empty())
20901 name = quals_repr +
" " + name;
20905 name = string(
" ") + name;
20907 result += array_declaration_name(t, name, qualified_name, internal);
20909 result += pointer_declaration_name(t, name, qualified_name, internal);
20911 result += pointer_declaration_name(t, name, qualified_name, internal);
20913 result += ptr_to_mbr_declaration_name(t, name,
20928 "",
true, internal);
20934 "",
true, internal);
20937 && (member_of_anonymous_class || !qualified_name))
20953 && (member_of_anonymous_class || !qualified_name))
21007 if (v.visit_begin(
this))
21010 if (type_base_sptr t =
get_type())
21014 return v.visit_end(
this);
21017var_decl::~var_decl()
21032 priv_->cached_name_.clear();
21033 priv_->internal_cached_name_.clear();
21053function_type::function_type(type_base_sptr return_type,
21055 size_t size_in_bits,
21056 size_t alignment_in_bits)
21058 FUNCTION_TYPE | ABSTRACT_TYPE_BASE),
21059 type_base(return_type->get_environment(), size_in_bits, alignment_in_bits),
21060 priv_(new
priv(parms, return_type))
21064 for (parameters::size_type i = 0, j = 1;
21065 i < priv_->parms_.size();
21068 if (i == 0 && priv_->parms_[i]->get_is_artificial())
21075 priv_->parms_[i]->set_index(j);
21086function_type::function_type(type_base_sptr return_type,
21087 size_t size_in_bits,
size_t alignment_in_bits)
21089 FUNCTION_TYPE | ABSTRACT_TYPE_BASE),
21090 type_base(return_type->get_environment(), size_in_bits, alignment_in_bits),
21091 priv_(new
priv(return_type))
21106 size_t size_in_bits,
21107 size_t alignment_in_bits)
21109 type_base(env, size_in_bits, alignment_in_bits),
21121{
return priv_->return_type_.lock();}
21129{priv_->return_type_ = t;}
21138{
return priv_->parms_;}
21181 for (parameters::size_type i = 0, j = 1;
21182 i < priv_->parms_.size();
21185 if (i == 0 && priv_->parms_[i]->get_is_artificial())
21192 priv_->parms_[i]->set_index(j);
21203 parm->set_index(priv_->parms_.size());
21204 priv_->parms_.push_back(parm);
21218 return (!priv_->parms_.empty()
21219 && priv_->parms_.back()->get_variadic_marker());
21251#define RETURN(value) CACHE_AND_RETURN_COMPARISON_RESULT(value)
21260 bool cached_result =
false;
21268 bool result =
true;
21270 if (!l.type_base::operator==(r))
21281 l_class = m->get_class_type().get();
21284 r_class = m->get_class_type().get();
21288 if (!!l_class != !!r_class)
21298 != r_class->get_qualified_name()))
21315 bool compare_result_types =
true;
21316 string l_rt_name = l_return_type_decl
21319 string r_rt_name = r_return_type_decl
21325 (r_class && (r_class->get_qualified_name() == r_rt_name)))
21326 compare_result_types =
false;
21328 if (compare_result_types)
21354 if (l_rt_name != r_rt_name)
21363 vector<shared_ptr<function_decl::parameter> >::const_iterator i,j;
21404function_type::parameters::const_iterator
21410 bool is_method =
dynamic_cast<const method_type*
>(
this);
21414 if (is_method && (*i)->get_is_artificial())
21426function_type::parameters::const_iterator
21453 if (priv_->internal_cached_name_.empty())
21454 priv_->internal_cached_name_ =
21456 return priv_->internal_cached_name_;
21460 if (priv_->temp_internal_cached_name_.empty())
21461 priv_->temp_internal_cached_name_ =
21463 return priv_->temp_internal_cached_name_;
21470 if (priv_->cached_name_.empty())
21471 priv_->cached_name_ =
21473 return priv_->cached_name_;
21477 priv_->cached_name_ =
21479 return priv_->cached_name_;
21540 if (v.visit_begin(
this))
21543 bool keep_going =
true;
21547 if (!t->traverse(v))
21548 keep_going =
false;
21555 if (type_base_sptr parm_type = (*i)->get_type())
21556 if (!parm_type->traverse(v))
21561 return v.visit_end(
this);
21564function_type::~function_type()
21570struct method_type::priv
21572 class_or_union_wptr class_type_;
21600method_type::method_type (type_base_sptr return_type,
21601 class_or_union_sptr class_type,
21602 const std::vector<function_decl::parameter_sptr>& p,
21604 size_t size_in_bits,
21605 size_t alignment_in_bits)
21607 METHOD_TYPE | ABSTRACT_TYPE_BASE | FUNCTION_TYPE),
21608 type_base(class_type->get_environment(), size_in_bits, alignment_in_bits),
21609 function_type(return_type, p, size_in_bits, alignment_in_bits),
21640method_type::method_type(type_base_sptr return_type,
21641 type_base_sptr class_type,
21642 const std::vector<function_decl::parameter_sptr>& p,
21644 size_t size_in_bits,
21645 size_t alignment_in_bits)
21647 METHOD_TYPE | ABSTRACT_TYPE_BASE | FUNCTION_TYPE),
21648 type_base(class_type->get_environment(), size_in_bits, alignment_in_bits),
21649 function_type(return_type, p, size_in_bits, alignment_in_bits),
21665 size_t size_in_bits,
21666 size_t alignment_in_bits)
21668 type_base(env, size_in_bits, alignment_in_bits),
21688method_type::method_type(class_or_union_sptr class_type,
21690 size_t size_in_bits,
21691 size_t alignment_in_bits)
21693 METHOD_TYPE | ABSTRACT_TYPE_BASE | FUNCTION_TYPE),
21694 type_base(class_type->get_environment(), size_in_bits, alignment_in_bits),
21697 alignment_in_bits),
21710{
return class_or_union_sptr(priv_->class_type_);}
21723 priv_->class_type_ = t;
21751{priv_->is_const = f;}
21758{
return priv_->is_const;}
21774 if (!first_parm->get_is_artificial())
21777 type_base_sptr this_ptr_type = first_parm->get_type();
21785 type_base_sptr candidate_class_type =
21805struct function_decl::priv
21807 bool declared_inline_;
21815 : declared_inline_(false),
21821 bool declared_inline,
21823 : declared_inline_(declared_inline),
21826 naked_type_(t.get())
21830 bool declared_inline,
21833 : declared_inline_(declared_inline),
21836 naked_type_(t.get()),
21858 bool declared_inline,
21860 const string& mangled_name,
21864 FUNCTION_DECL | ABSTRACT_DECL_BASE),
21895 type_base_sptr fn_type,
21896 bool declared_inline,
21898 const string& linkage_name,
21902 FUNCTION_DECL | ABSTRACT_DECL_BASE),
21903 decl_base(fn_type->get_environment(), name, locus, linkage_name, vis),
21904 priv_(new priv(dynamic_pointer_cast<
function_type>(fn_type),
21926 bool qualified_name)
const
21931 string fn_prefix = mem_fn ?
"method ":
"function ";
21937 fn_prefix +=
"virtual ";
21939 decl_base_sptr return_type;
21946 return_type = mem_fn
21957 internal) +
" " + result;
21960 result = add_outer_pointer_to_fn_type_expr(p, result,
21965 result = add_outer_pointer_to_array_type_expr(p, result,
21972 return fn_prefix + result;
22002 result += mem_fn->
get_type()->get_class_type()->get_qualified_name()
22008 std::ostringstream fn_parms;
22009 stream_pretty_representation_of_fn_parms(*
get_type(),
22013 result += fn_parms.str();
22018 result +=
" const";
22029function_decl::parameters::const_iterator
22035 bool is_method =
dynamic_cast<const method_decl*
>(
this);
22048const shared_ptr<function_type>
22050{
return priv_->type_.lock();}
22065{
return priv_->naked_type_;}
22070 priv_->type_ = fn_type;
22071 priv_->naked_type_ = fn_type.get();
22088 priv_->symbol_ = sym;
22103{
return priv_->symbol_;}
22110{
return priv_->declared_inline_;}
22117{priv_->declared_inline_ = value;}
22120function_decl::get_binding()
const
22121{
return priv_->binding_;}
22124const shared_ptr<type_base>
22126{
return get_type()->get_return_type();}
22129const std::vector<shared_ptr<function_decl::parameter> >&
22131{
return get_type()->get_parameters();}
22138{
get_type()->append_parameter(parm);}
22146 for (std::vector<shared_ptr<parameter> >::const_iterator i = parms.begin();
22219 bool result =
true;
22223 if (t0 == t1 || *t0 == *t1)
22249 else if (s0 && s0 != s1)
22260 bool symbols_are_equal = (s0 && s1 && result);
22262 if (symbols_are_equal)
22274 bool decl_bases_different = !l.decl_base::operator==(r);
22281 if (decl_bases_different)
22291 if (!l.decl_base::operator==(r))
22303 if (l.get_binding() != r.get_binding())
22360 return equals(*
this, *o, 0);
22384 return hash_fn(*
this);
22399 if (priv_->id_.empty())
22404 string virtual_member_suffix;
22414 virtual_member_suffix +=
"/o";
22417 if (s->has_aliases())
22424 priv_->id_ = env.
intern(s->get_id_string());
22426 if (!virtual_member_suffix.empty())
22427 priv_->id_ = env.
intern(priv_->id_ + virtual_member_suffix);
22471 if (v.visit_begin(
this))
22474 if (type_base_sptr t =
get_type())
22478 return v.visit_end(
this);
22500 if (l.get() == r.get())
22523struct function_decl::parameter::priv
22527 bool variadic_marker_;
22534 priv(type_base_sptr type,
22536 bool variadic_marker)
22539 variadic_marker_(variadic_marker)
22543function_decl::parameter::parameter(
const type_base_sptr type,
22545 const string& name,
22546 const location& loc,
22548 : type_or_decl_base(type->get_environment(),
22549 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
22550 decl_base(type->get_environment(), name, loc),
22551 priv_(new priv(type, index, is_variadic))
22553 runtime_type_instance(
this);
22556function_decl::parameter::parameter(
const type_base_sptr type,
22558 const string& name,
22559 const location& loc,
22561 bool is_artificial)
22562 : type_or_decl_base(type->get_environment(),
22563 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
22564 decl_base(type->get_environment(), name, loc),
22565 priv_(new priv(type, index, is_variadic))
22567 runtime_type_instance(
this);
22568 set_is_artificial(is_artificial);
22571function_decl::parameter::parameter(
const type_base_sptr type,
22572 const string& name,
22573 const location& loc,
22575 bool is_artificial)
22576 : type_or_decl_base(type->get_environment(),
22577 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
22578 decl_base(type->get_environment(), name, loc),
22579 priv_(new priv(type, 0, is_variadic))
22581 runtime_type_instance(
this);
22582 set_is_artificial(is_artificial);
22585function_decl::parameter::parameter(
const type_base_sptr type,
22588 : type_or_decl_base(type->get_environment(),
22589 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
22590 decl_base(type->get_environment(),
"", location()),
22591 priv_(new priv(type, index, variad))
22593 runtime_type_instance(
this);
22596function_decl::parameter::~parameter() =
default;
22598const type_base_sptr
22599function_decl::parameter::get_type()
const
22600{
return priv_->type_.lock();}
22627 if (get_variadic_marker()
22647 std::ostringstream o;
22648 o <<
"parameter-" << get_index();
22650 return env.
intern(o.str());
22654function_decl::parameter::get_index()
const
22655{
return priv_->index_;}
22658function_decl::parameter::set_index(
unsigned i)
22659{priv_->index_ = i;}
22663function_decl::parameter::get_variadic_marker()
const
22664{
return priv_->variadic_marker_;}
22690 bool result =
true;
22692 if ((l.get_variadic_marker() != r.get_variadic_marker())
22693 || (l.get_index() != r.get_index())
22694 || (!!l.get_type() != !!r.get_type()))
22699 if (l.get_index() != r.get_index())
22701 if (l.get_variadic_marker() != r.get_variadic_marker()
22702 || !!l.get_type() != !!r.get_type())
22711 if (l_type != r_type)
22729function_decl::parameter::operator==(
const parameter& o)
const
22730{
return equals(*
this, o, 0);}
22739 return function_decl::parameter::operator==(*p);
22785 if (v.visit_begin(
this))
22788 if (type_base_sptr t =
get_type())
22792 return v.visit_end(
this);
22803 return hash_fn_parm(
this);
22836 bool qualified_name)
const
22843 type_repr =
"void";
22849 string result = type_repr;
22850 string parm_name = get_name_id();
22852 if (!parm_name.empty())
22853 result +=
" " + parm_name;
22887 size_t size_in_bits,
size_t align_in_bits,
22894 | ABSTRACT_DECL_BASE
22895 | ABSTRACT_SCOPE_TYPE_DECL
22896 | ABSTRACT_SCOPE_DECL),
22897 decl_base(env, name, locus, name, vis),
22898 type_base(env, size_in_bits, align_in_bits),
22902 for (member_types::iterator i = mem_types.begin();
22903 i != mem_types.end();
22914 for (member_functions::iterator i = member_fns.begin();
22915 i != member_fns.end();
22917 if (!
has_scope(static_pointer_cast<decl_base>(*i)))
22937 size_t size_in_bits,
size_t align_in_bits,
22941 | ABSTRACT_DECL_BASE
22942 | ABSTRACT_SCOPE_TYPE_DECL
22943 | ABSTRACT_SCOPE_DECL),
22944 decl_base(env, name, locus, name, vis),
22945 type_base(env, size_in_bits, align_in_bits),
22959 bool is_declaration_only)
22962 | ABSTRACT_DECL_BASE
22963 | ABSTRACT_SCOPE_TYPE_DECL
22964 | ABSTRACT_SCOPE_DECL),
22990 if (v.visit_begin(
this))
22999 if (!(*i)->traverse(v))
23009 if (!(*i)->traverse(v))
23019 if (!(*i)->traverse(v))
23026 for (member_function_templates::const_iterator i =
23030 if (!(*i)->traverse(v))
23037 for (member_class_templates::const_iterator i =
23041 if (!(*i)->traverse(v))
23049 bool result = v.visit_end(
this);
23078 type_base_sptr t =
is_type(decl);
23108 for (class_or_union::data_members::const_iterator it =
23197 if (t->get_is_anonymous())
23215 if (t->get_is_anonymous())
23233 if (t->get_is_anonymous())
23258 bool is_laid_out,
bool is_static,
23259 size_t offset_in_bits)
23263 priv_->data_members_.push_back(v);
23274 bool is_already_in =
false;
23275 for (data_members::const_iterator i =
23276 priv_->non_static_data_members_.begin();
23277 i != priv_->non_static_data_members_.end();
23281 is_already_in =
true;
23284 if (!is_already_in)
23285 priv_->non_static_data_members_.push_back(v);
23301{
return priv_->data_members_;}
23316 if ((*i)->get_name() == name)
23328 if (
var_decl_sptr data_member = type->find_data_member(name))
23329 return data_member;
23343 if (!v->get_name().empty())
23351 if ((*it)->get_pretty_representation(
false,
true)
23352 == v->get_pretty_representation(
false,
true))
23379 if (v->get_name().empty())
23392{
return priv_->non_static_data_members_;}
23410 bool is_static,
bool is_ctor,
23411 bool is_dtor,
bool is_const)
23423 priv_->member_functions_.push_back(f);
23427 if (!f->get_linkage_name().empty())
23428 priv_->mem_fns_map_[f->get_linkage_name()] = f;
23437{
return priv_->member_functions_;}
23458 string_mem_fn_sptr_map_type::const_iterator i =
23459 priv_->mem_fns_map_.find(linkage_name);
23460 if (i == priv_->mem_fns_map_.end())
23462 return i->second.get();
23473 string_mem_fn_sptr_map_type::const_iterator i =
23474 priv_->mem_fns_map_.find(linkage_name);
23475 if (i == priv_->mem_fns_map_.end())
23501 string_mem_fn_ptr_map_type::const_iterator i =
23502 priv_->signature_2_mem_fn_map_.find(s);
23503 if (i == priv_->signature_2_mem_fn_map_.end())
23511const member_function_templates&
23513{
return priv_->member_function_templates_;}
23518const member_class_templates&
23520{
return priv_->member_class_templates_;}
23531 priv_->member_function_templates_.push_back(m);
23546 priv_->member_class_templates_.push_back(m);
23556 && priv_->data_members_.empty()
23557 && priv_->member_functions_.empty()
23558 && priv_->member_function_templates_.empty()
23559 && priv_->member_class_templates_.empty());
23578 else if (method_decl_sptr f = dynamic_pointer_cast<method_decl>(d))
23584 else if (member_function_template_sptr f =
23585 dynamic_pointer_cast<member_function_template>(d))
23587 else if (member_class_template_sptr c =
23588 dynamic_pointer_cast<member_class_template>(d))
23637 return *
this == *o;
23678 if (l_is_decl_only || r_is_decl_only)
23688 if (!def1 || !def2)
23692 && l_is_decl_only && r_is_decl_only
23733 if (!!def1 != !!def2)
23741 if (!(l.decl_base::operator==(r)
23742 && l.type_base::operator==(r)))
23753 bool val = *def1 == *def2;
23762 if (!(l.decl_base::operator==(r) && l.type_base::operator==(r)))
23769 if (types_defined_same_linux_kernel_corpus_public(l, r))
23777#define RETURN(value) \
23778 return return_comparison_result(l, r, value, \
23785 bool result =
true;
23799 for (class_or_union::data_members::const_iterator
23813 || (*d0)->get_type() == (*d1)->get_type())
23840 for (member_function_templates::const_iterator
23845 ++fn_tmpl_it0, ++fn_tmpl_it1)
23846 if (**fn_tmpl_it0 != **fn_tmpl_it1)
23871 for (member_class_templates::const_iterator
23876 ++cl_tmpl_it0, ++cl_tmpl_it1)
23877 if (**cl_tmpl_it0 != **cl_tmpl_it1)
23905 const method_decl_sptr& method)
23927 old_type->get_parameters(),
23928 old_type->get_is_const(),
23929 old_type->get_size_in_bits(),
23930 old_type->get_alignment_in_bits()));
23931 t->get_translation_unit()->bind_function_type_life_time(new_type);
23940 method->get_binding()));
23941 new_method->set_symbol(method->
get_symbol());
23944 class_type->add_member_function(new_method,
23953 t->add_member_function(new_method,
24066maybe_propagate_canonical_type(
const type_base& lhs_type,
24070#if WITH_DEBUG_TYPE_CANONICALIZATION
24071 if (!env.priv_->use_canonical_type_comparison_)
24078 if (env.priv_->propagate_ct(lhs_type, rhs_type))
24089struct class_decl::priv
24092 unordered_map<string, base_spec_sptr> bases_map_;
24098 : is_struct_(false)
24139 size_t size_in_bits,
size_t align_in_bits,
24140 bool is_struct,
const location& locus,
24147 | ABSTRACT_TYPE_BASE
24148 | ABSTRACT_DECL_BASE
24149 | ABSTRACT_SCOPE_TYPE_DECL
24150 | ABSTRACT_SCOPE_DECL),
24151 decl_base(env, name, locus, name, vis),
24152 type_base(env, size_in_bits, align_in_bits),
24154 locus, vis, mbr_types, data_mbrs, mbr_fns),
24155 priv_(new priv(is_struct, bases))
24190 size_t size_in_bits,
size_t align_in_bits,
24191 bool is_struct,
const location& locus,
24197 | ABSTRACT_TYPE_BASE
24198 | ABSTRACT_DECL_BASE
24199 | ABSTRACT_SCOPE_TYPE_DECL
24200 | ABSTRACT_SCOPE_DECL),
24209 is_anonymous ? string() : name,
24211 type_base(env, size_in_bits, align_in_bits),
24213 locus, vis, mbr_types, data_mbrs, mbr_fns),
24214 priv_(new priv(is_struct, bases))
24236 size_t size_in_bits,
size_t align_in_bits,
24237 bool is_struct,
const location& locus,
24241 | ABSTRACT_TYPE_BASE
24242 | ABSTRACT_DECL_BASE
24243 | ABSTRACT_SCOPE_TYPE_DECL
24244 | ABSTRACT_SCOPE_DECL),
24245 decl_base(env, name, locus, name, vis),
24246 type_base(env, size_in_bits, align_in_bits),
24249 priv_(new priv(is_struct))
24273 size_t size_in_bits,
size_t align_in_bits,
24274 bool is_struct,
const location& locus,
24278 | ABSTRACT_TYPE_BASE
24279 | ABSTRACT_DECL_BASE
24280 | ABSTRACT_SCOPE_TYPE_DECL
24281 | ABSTRACT_SCOPE_DECL),
24290 is_anonymous ? string() : name,
24292 type_base(env, size_in_bits, align_in_bits),
24295 priv_(new priv(is_struct))
24311 bool is_struct,
bool is_declaration_only)
24314 | ABSTRACT_TYPE_BASE
24315 | ABSTRACT_DECL_BASE
24316 | ABSTRACT_SCOPE_TYPE_DECL
24317 | ABSTRACT_SCOPE_DECL),
24321 priv_(new priv(is_struct))
24336 for (class_decl::virtual_mem_fn_map_type::iterator i =
24337 priv_->virtual_mem_fns_map_.begin();
24338 i != priv_->virtual_mem_fns_map_.end();
24340 sort_virtual_member_functions(i->second);
24348{priv_->is_struct_ = f;}
24355{
return priv_->is_struct_;}
24363 priv_->bases_.push_back(b);
24364 priv_->bases_map_[b->get_base_class()->get_qualified_name()] = b;
24372{
return priv_->bases_;}
24383 unordered_map<string, base_spec_sptr>::iterator i =
24384 priv_->bases_map_.find(qualified_name);
24386 if (i != priv_->bases_map_.end())
24387 return i->second->get_base_class();
24398{
return priv_->virtual_mem_fns_;}
24417{
return priv_->virtual_mem_fns_map_;}
24422{sort_virtual_member_functions(priv_->virtual_mem_fns_);}
24443 bool qualified_name)
const
24445 string cl =
"class ";
24454 if (internal && !
get_name().empty())
24462 string result = cl;
24463 if (qualified_name)
24472class_decl::insert_member_decl(decl_base_sptr d)
24474 if (method_decl_sptr f = dynamic_pointer_cast<method_decl>(d))
24489struct class_decl::base_spec::priv
24492 long offset_in_bits_;
24496 long offset_in_bits,
24499 offset_in_bits_(offset_in_bits),
24500 is_virtual_(is_virtual)
24518 long offset_in_bits,
24521 ABSTRACT_DECL_BASE),
24523 base->get_linkage_name(), base->get_visibility()),
24525 priv_(new priv(base, offset_in_bits, is_virtual))
24537{
return priv_->base_class_.lock();}
24544{
return priv_->is_virtual_;}
24551{
return priv_->offset_in_bits_;}
24581 if (v.visit_begin(
this))
24584 get_base_class()->traverse(v);
24588 return v.visit_end(
this);
24608class_decl::base_spec::base_spec(
const type_base_sptr& base,
24610 long offset_in_bits,
24613 ABSTRACT_DECL_BASE),
24619 priv_(new priv(dynamic_pointer_cast<
class_decl>(base),
24626class_decl::base_spec::~base_spec() =
default;
24652 if (!l.member_base::operator==(r))
24678 return equals(*
this, *o, 0);
24699mem_fn_context_rel::~mem_fn_context_rel()
24719method_decl::method_decl(
const string& name,
24721 bool declared_inline,
24723 const string& linkage_name,
24728 | ABSTRACT_DECL_BASE
24732 declared_inline, locus, linkage_name, vis, bind)
24756method_decl::method_decl(
const string& name,
24758 bool declared_inline,
24760 const string& linkage_name,
24765 | ABSTRACT_DECL_BASE
24767 decl_base(type->get_environment(), name, locus, linkage_name, vis),
24770 declared_inline, locus, linkage_name, vis, bind)
24793method_decl::method_decl(
const string& name,
24794 type_base_sptr type,
24795 bool declared_inline,
24797 const string& linkage_name,
24802 | ABSTRACT_DECL_BASE
24804 decl_base(type->get_environment(), name, locus, linkage_name, vis),
24807 declared_inline, locus, linkage_name, vis, bind)
24826 class_or_union_sptr cl = t->get_class_type();
24828 cl->priv_->mem_fns_map_[l] = m;
24829 if (!old_lname.empty() && l != old_lname)
24831 if (method_decl_sptr m = cl->find_member_function_sptr(old_lname))
24834 cl->priv_->mem_fns_map_.erase(old_lname);
24840method_decl::~method_decl()
24877 if (l.get() == r.get())
24930{
return dynamic_pointer_cast<method_decl>(d);}
24934struct virtual_member_function_less_than
24958 if (f_offset != s_offset)
return f_offset < s_offset;
24964 if (fn != sn)
return fn < sn;
24970 if ((!f_sym) != (!s_sym))
return !f_sym;
24971 if (f_sym && s_sym)
24973 fn = f_sym->get_id_string();
24974 sn = s_sym->get_id_string();
24975 if (fn != sn)
return fn < sn;
24982 if (fn != sn)
return fn < sn;
24986 string fn_filepath, sn_filepath;
24987 unsigned line = 0, column = 0;
24990 fn_loc.
expand(fn_filepath, line, column);
24992 sn_loc.expand(sn_filepath, line, column);
24993 return fn_filepath < sn_filepath;
25008 operator()(
const method_decl_sptr f,
25009 const method_decl_sptr s)
25010 {
return operator()(*f, *s);}
25019 virtual_member_function_less_than lt;
25020 std::stable_sort(mem_fns.begin(), mem_fns.end(), lt);
25049 size_t vtable_offset,
25050 bool is_static,
bool is_ctor,
25051 bool is_dtor,
bool is_const)
25054 is_dtor, is_const);
25062 sort_virtual_member_functions(klass->priv_->virtual_mem_fns_);
25081 class_decl::member_functions::const_iterator m;
25082 for (m = klass->priv_->virtual_mem_fns_.begin();
25083 m != klass->priv_->virtual_mem_fns_.end();
25085 if (m->get() == method.get()
25086 || (*m)->get_linkage_name() == method->get_linkage_name())
25088 if (m == klass->priv_->virtual_mem_fns_.end())
25089 klass->priv_->virtual_mem_fns_.push_back(method);
25097 class_decl::virtual_mem_fn_map_type::iterator i =
25098 klass->priv_->virtual_mem_fns_map_.find(voffset);
25099 if (i == klass->priv_->virtual_mem_fns_map_.end())
25102 virtual_mem_fns_at_voffset.push_back(method);
25103 klass->priv_->virtual_mem_fns_map_[voffset] = virtual_mem_fns_at_voffset;
25107 for (m = i->second.begin() ; m != i->second.end(); ++m)
25108 if (m->get() == method.get()
25109 || (*m)->get_linkage_name() == method->get_linkage_name())
25111 if (m == i->second.end())
25112 i->second.push_back(method);
25141 if ((*b)->get_is_virtual()
25142 || (*b)->get_base_class()->has_virtual_bases())
25171 ssize_t offset = -1;
25172 for (class_decl::virtual_mem_fn_map_type::const_iterator e =
25176 if (e->first > offset)
25189 return hash_class(
this);
25202methods_equal_modulo_elf_symbol(
const method_decl_sptr& f,
25203 const method_decl_sptr& s)
25205 method_decl_sptr first = f, second = s;
25207 first->get_symbol();
25209 second->get_symbol();
25211 first->get_linkage_name();
25213 second->get_linkage_name();
25216 first->set_linkage_name(
"");
25218 second->set_linkage_name(
"");
25220 bool equal = *first == *second;
25222 first->set_symbol(saved_first_elf_symbol);
25223 first->set_linkage_name(saved_first_linkage_name);
25224 second->set_symbol(saved_second_elf_symbol);
25225 second->set_linkage_name(saved_second_linkage_name);
25246method_matches_at_least_one_in_vector(
const method_decl_sptr& method,
25249 for (class_decl::member_functions::const_iterator i = fns.begin();
25258 if (methods_equal_modulo_elf_symbol(method, *i))
25274maybe_cancel_propagated_canonical_type(
const class_or_union& t)
25276 const environment& env = t.get_environment();
25277 if (env.do_on_the_fly_canonicalization())
25278 if (
is_type(&t)->priv_->canonical_type_propagated())
25280 is_type(&t)->priv_->clear_propagated_canonical_type();
25281 env.priv_->remove_from_types_with_non_confirmed_propagated_ct(&t);
25314 bool result =
false;
25315 if (l.
get_environment().priv_->is_type_comparison_cached(l, r, result))
25327 bool result =
true;
25341 if (!had_canonical_type)
25342 maybe_cancel_propagated_canonical_type(r);
25348#define RETURN(value) CACHE_AND_RETURN_COMPARISON_RESULT(value)
25360 for (class_decl::base_specs::const_iterator
25372 (*b1)->get_base_class().get()))
25418 for (class_decl::virtual_mem_fn_map_type::const_iterator first_v_fn_entry =
25421 ++first_v_fn_entry)
25423 unsigned voffset = first_v_fn_entry->first;
25425 first_v_fn_entry->second;
25427 const class_decl::virtual_mem_fn_map_type::const_iterator
25439 second_v_fn_entry->second;
25441 bool matches =
false;
25442 for (class_decl::member_functions::const_iterator i =
25443 first_vfns.begin();
25444 i != first_vfns.end();
25446 if (method_matches_at_least_one_in_vector(*i, second_vfns))
25536 return *
this == *o;
25580 if (l.get() == r.get())
25612operator==(
const class_or_union_sptr& l,
const class_or_union_sptr& r)
25614 if (l.get() == r.get())
25631operator!=(
const class_or_union_sptr& l,
const class_or_union_sptr& r)
25651 if (v.visit_begin(
this))
25660 if (!(*i)->traverse(v))
25671 if (!(*i)->traverse(v))
25681 if (!(*i)->traverse(v))
25691 if (!(*i)->traverse(v))
25698 for (member_function_templates::const_iterator i =
25702 if (!(*i)->traverse(v))
25709 for (member_class_templates::const_iterator i =
25713 if (!(*i)->traverse(v))
25721 bool result = v.visit_end(
this);
25730context_rel::~context_rel()
25734member_base::operator==(
const member_base& o)
const
25754 if (l.get() == r.get())
25759 return *l ==
static_cast<const decl_base&
>(*r);
25798{
return dynamic_pointer_cast<class_decl::base_spec>(tod);}
25801member_function_template::operator==(
const member_base& other)
const
25808 if (!(is_constructor() == o.is_constructor()
25809 && is_const() == o.is_const()
25810 && member_base::operator==(o)))
25817 return ftdecl->function_tdecl::operator==(*other_ftdecl);
25836 const member_function_template_sptr& r)
25838 if (l.get() == r.get())
25857 const member_function_template_sptr& r)
25874 if (v.visit_begin(
this))
25881 return v.visit_end(
this);
25897 if (!member_base::operator==(o))
25900 return as_class_tdecl()->class_tdecl::operator==(o);
25914 if (!decl_base::operator==(other))
25916 return as_class_tdecl()->class_tdecl::operator==(other);
25930 return *
this == *o;
25943 const member_class_template_sptr& r)
25945 if (l.get() == r.get())
25963 const member_class_template_sptr& r)
25980 if (v.visit_begin(
this))
25987 return v.visit_end(
this);
26007 case private_access:
26010 case protected_access:
26013 case public_access:
26037 c->set_is_static(s);
26047 for (class_decl::data_members::iterator i =
26048 cl->priv_->non_static_data_members_.begin();
26049 i != cl->priv_->non_static_data_members_.end();
26052 if ((*i)->get_name() == v->get_name())
26054 cl->priv_->non_static_data_members_.erase(i);
26060 bool is_already_in_non_static_data_members =
false;
26061 for (class_or_union::data_members::iterator i =
26062 cl->priv_->non_static_data_members_.begin();
26063 i != cl->priv_->non_static_data_members_.end();
26066 if ((*i)->get_name() == v->get_name())
26068 is_already_in_non_static_data_members =
true;
26072 if (!is_already_in_non_static_data_members)
26076 for (class_or_union::data_members::const_iterator i =
26077 cl->priv_->data_members_.begin();
26078 i != cl->priv_->data_members_.end();
26081 if ((*i)->get_name() == v->get_name())
26088 cl->priv_->non_static_data_members_.push_back(var);
26129 size_t size_in_bits,
const location& locus,
26134 | ABSTRACT_TYPE_BASE
26135 | ABSTRACT_DECL_BASE),
26136 decl_base(env, name, locus, name, vis),
26139 locus, vis, mbr_types, data_mbrs, member_fns)
26165 size_t size_in_bits,
const location& locus,
26171 | ABSTRACT_TYPE_BASE
26172 | ABSTRACT_DECL_BASE),
26181 is_anonymous ? string() : name,
26185 locus, vis, mbr_types, data_mbrs, member_fns)
26203 size_t size_in_bits,
const location& locus,
26207 | ABSTRACT_TYPE_BASE
26208 | ABSTRACT_DECL_BASE
26209 | ABSTRACT_SCOPE_TYPE_DECL
26210 | ABSTRACT_SCOPE_DECL),
26211 decl_base(env, name, locus, name, vis),
26234 size_t size_in_bits,
const location& locus,
26238 | ABSTRACT_TYPE_BASE
26239 | ABSTRACT_DECL_BASE
26240 | ABSTRACT_SCOPE_TYPE_DECL
26241 | ABSTRACT_SCOPE_DECL),
26250 is_anonymous ? string() : name,
26269 const string& name,
26270 bool is_declaration_only)
26273 | ABSTRACT_TYPE_BASE
26274 | ABSTRACT_DECL_BASE
26275 | ABSTRACT_SCOPE_TYPE_DECL
26276 | ABSTRACT_SCOPE_DECL),
26303 bool qualified_name)
const
26308 if (internal && !
get_name().empty())
26309 repr = string(
"union ") +
26319 if (qualified_name)
26356 return *
this == *o;
26370 return *
this == *o;
26403 if (v.visit_begin(
this))
26412 if (!(*i)->traverse(v))
26422 if (!(*i)->traverse(v))
26432 if (!(*i)->traverse(v))
26439 for (member_function_templates::const_iterator i =
26443 if (!(*i)->traverse(v))
26450 for (member_class_templates::const_iterator i =
26454 if (!(*i)->traverse(v))
26462 bool result = v.visit_end(
this);
26501 bool result =
false;
26502 if (l.
get_environment().priv_->is_type_comparison_cached(l, r, result))
26523 const method_decl_sptr& f)
26538 const class_or_union_sptr t = union_type;
26553 if (l.get() == r.get())
26577class template_decl::priv
26581 std::list<template_parameter_sptr> parms_;
26594{priv_->parms_.push_back(p);}
26600const std::list<template_parameter_sptr>&
26602{
return priv_->parms_;}
26615 const string& name,
26640 return *
this == *other;
26653 list<shared_ptr<template_parameter> >::const_iterator t0, t1;
26679class template_parameter::priv
26685 mutable bool hashing_started_;
26686 mutable bool comparison_started_;
26694 template_decl_(enclosing_template_decl),
26695 hashing_started_(),
26696 comparison_started_()
26700template_parameter::template_parameter(
unsigned index,
26702 : priv_(new priv(index, enclosing_template))
26706template_parameter::get_index()
const
26707{
return priv_->index_;}
26710template_parameter::get_enclosing_template_decl()
const
26711{
return priv_->template_decl_.lock();}
26714template_parameter::get_hashing_has_started()
const
26715{
return priv_->hashing_started_;}
26718template_parameter::set_hashing_has_started(
bool f)
const
26719{priv_->hashing_started_ = f;}
26724 if (get_index() != o.get_index())
26727 if (priv_->comparison_started_)
26730 bool result =
false;
26735 priv_->comparison_started_ =
true;
26737 if (!!get_enclosing_template_decl() != !!o.get_enclosing_template_decl())
26739 else if (get_enclosing_template_decl()
26740 && (*get_enclosing_template_decl()
26741 != *o.get_enclosing_template_decl()))
26746 priv_->comparison_started_ =
false;
26766class type_tparameter::priv
26781type_tparameter::type_tparameter(
unsigned index,
26783 const string& name,
26787 | ABSTRACT_TYPE_BASE
26789 decl_base(enclosing_tdecl->get_environment(), name, locus),
26790 type_base(enclosing_tdecl->get_environment(), 0, 0),
26791 type_decl(enclosing_tdecl->get_environment(), name, 0, 0, locus),
26806 if (!type_decl::operator==(other))
26826 if (!type_decl::operator==(other))
26846 if (!decl_base::operator==(other))
26882{
return *
this ==
static_cast<const type_base&
>(other);}
26884type_tparameter::~type_tparameter()
26888class non_type_tparameter::priv
26898 priv(type_base_sptr type)
26916non_type_tparameter::non_type_tparameter(
unsigned index,
26918 const string& name,
26919 type_base_sptr type,
26922 decl_base(type->get_environment(), name, locus,
""),
26924 priv_(new priv(type))
26932const type_base_sptr
26934{
return priv_->type_.lock();}
26943 return hash_tparm(
this);
26949 if (!decl_base::operator==(other))
26956 return (template_parameter::operator==(o)
26975non_type_tparameter::~non_type_tparameter()
26981class template_tparameter::priv
26995template_tparameter::template_tparameter(
unsigned index,
26997 const string& name,
27001 | ABSTRACT_TYPE_BASE
27003 decl_base(enclosing_tdecl->get_environment(), name, locus),
27004 type_base(enclosing_tdecl->get_environment(), 0, 0),
27005 type_decl(enclosing_tdecl->get_environment(), name,
27006 0, 0, locus, name, VISIBILITY_DEFAULT),
27008 template_decl(enclosing_tdecl->get_environment(), name, locus),
27026 return (type_tparameter::operator==(o)
27045 return (type_tparameter::operator==(o)
27059 return *
this ==
static_cast<const type_base&
>(other);
27078template_tparameter::~template_tparameter()
27086class type_composition::priv
27110type_composition::type_composition(
unsigned index,
27114 ABSTRACT_DECL_BASE),
27125const type_base_sptr
27127{
return priv_->type_.lock();}
27143 return hash_type_composition(
this);
27146type_composition::~type_composition()
27155class function_tdecl::priv
27167 : pattern_(pattern), binding_(bind)
27194 | ABSTRACT_SCOPE_DECL),
27198 priv_(new priv(bind))
27222 | ABSTRACT_SCOPE_DECL),
27227 priv_(new priv(pattern, bind))
27238 priv_->pattern_ = p;
27248{
return priv_->pattern_;}
27255{
return priv_->binding_;}
27267 return *
this == *o;
27281 return *
this == *o;
27294 && template_decl::operator==(o)
27295 && scope_decl::operator==(o)
27319 if (!v.visit_begin(
this))
27326 return v.visit_end(
this);
27329function_tdecl::~function_tdecl()
27337class class_tdecl::priv
27348 : pattern_(pattern)
27367 | ABSTRACT_SCOPE_DECL),
27392 | ABSTRACT_SCOPE_DECL),
27397 priv_(new priv(pattern))
27408 priv_->pattern_ = p;
27418{
return priv_->pattern_;}
27427 if (!(template_decl::operator==(o)
27428 && scope_decl::operator==(o)
27447 return *
this ==
static_cast<const decl_base&
>(o);
27455{
return *
this ==
static_cast<const decl_base&
>(o);}
27471 if (v.visit_begin(
this))
27475 pattern->traverse(v);
27478 return v.visit_end(
this);
27481class_tdecl::~class_tdecl()
27492 non_canonicalized_subtype_detector();
27495 non_canonicalized_subtype_detector(
type_base* type)
27497 has_non_canonical_type_()
27506 has_non_canonical_type()
const
27507 {
return has_non_canonical_type_;}
27512 visit_begin(function_decl* f)
27530 visit_begin(type_base* t)
27534 if (!t->get_canonical_type())
27538 has_non_canonical_type_ = t;
27553 visit_end(type_base* )
27555 if (has_non_canonical_type_)
27572 non_canonicalized_subtype_detector v(t.get());
27574 return v.has_non_canonical_type();
27590 const type_base_sptr t_v2)
27597 return (t1 != t2 && repr1 == repr2);
27608 env.priv_->extra_live_types_.push_back(t);
27644 string repr = v->get_pretty_representation(
true);
27645 std::hash<string> hash_string;
27646 h = hashing::combine_hashes(h, hash_string(repr));
27653 string repr = f->get_pretty_representation(
true);
27654 std::hash<string> hash_string;
27655 h = hashing::combine_hashes(h, hash_string(repr));
27660 type_base_sptr parm_type = p->get_type();
27662 std::hash<bool> hash_bool;
27663 std::hash<unsigned> hash_unsigned;
27665 h = hashing::combine_hashes(h, hash_unsigned(p->get_index()));
27666 h = hashing::combine_hashes(h, hash_bool(p->get_variadic_marker()));
27672 std::hash<size_t> hash_size;
27673 std::hash<bool> hash_bool;
27674 type_base_sptr type = bs->get_base_class();
27676 h = hashing::combine_hashes(h, hash_member(*bs));
27677 h = hashing::combine_hashes(h, hash_size(bs->get_offset_in_bits()));
27678 h = hashing::combine_hashes(h, hash_bool(bs->get_is_virtual()));
27685 result = d->get_hash();
27710{
return hash_as_canonical_type_or_constant(t);}
27818 exemplar =
const_cast<type_base*
>(type);
27847hash_as_canonical_type_or_constant(
const type_base *t)
27854 if (!canonical_type)
27872 if (canonical_type)
27873 return reinterpret_cast<size_t>(canonical_type);
27948 const type_base_sptr& second,
27949 bool indirect_type)
27981 bool indirect_type)
27983 if (!!first != !!second)
27995 if (
typeid(*first) !=
typeid(*second))
28011 if (ty1->is_lvalue() != ty2->is_lvalue())
28014 ty2->get_pointed_to_type(),
28033 if (!indirect_type)
28037 return ty1->get_name() == ty2->
get_name();
28043 if (!indirect_type)
28047 return (
get_name(ty1->get_underlying_type())
28055 && ty1->get_name() != ty2->
get_name())
28058 if (!indirect_type)
28061 || (ty1->get_non_static_data_members().size()
28065 for (class_or_union::data_members::const_iterator
28066 i = ty1->get_non_static_data_members().begin(),
28068 (i != ty1->get_non_static_data_members().end()
28075 dm2->get_type().get(),
28088 && ty1->get_name() != ty2->
get_name())
28091 if (!indirect_type)
28101 if (!indirect_type)
28104 || ty1->get_dimension_count() != ty2->get_dimension_count())
28138 if (ty1->get_parameters().size() != ty2->
get_parameters().size())
28141 for (function_type::parameters::const_iterator
28142 i = ty1->get_parameters().begin(),
28144 (i != ty1->get_parameters().end()
28174 const char* dm_name)
28202 return cou->find_data_member(dm);
28217 unsigned parm_index)
28224 if (parms.size() <= parm_index)
28227 return parms[parm_index].get();
28242 std::ostringstream o;
28245 o <<
"unnamed-enum";
28249 o <<
"-underlying-type-" << size;
28269 return data_member;
28289 for (; d != e; ++d)
28310stream_pretty_representation_of_fn_parms(
const function_type& fn_type,
28311 ostream& o,
bool qualified,
28319 type_base_sptr type;
28326 if (i != first_parm)
28329 type = parm->get_type();
28390add_outer_pointer_to_fn_type_expr(
const type_base* p,
28391 const string& input,
28392 bool qualified,
bool internal)
28398 string star_or_ref;
28411 if (!pointed_to_fn)
28414 std::ostringstream left, right, inner;
28416 inner <<
"(" << star_or_ref << input <<
")";
28418 type_base_sptr type;
28419 stream_pretty_representation_of_fn_parms(*pointed_to_fn, right,
28420 qualified, internal);
28421 type_base_sptr return_type =
28424 : pointed_to_fn->get_return_type();
28434 result = left.str() +
" " + inner.str() + right.str();
28438 string inner_string = inner.str() + right.str();
28439 result = add_outer_pointer_to_fn_type_expr(p, inner_string,
28440 qualified, internal);
28444 string inner_string = inner.str() + right.str();
28445 result = add_outer_pointer_to_array_type_expr(p, inner_string,
28446 qualified, internal);
28501add_outer_pointer_to_fn_type_expr(
const type_base_sptr& p,
28502 const string& input,
28503 bool qualified,
bool internal)
28504{
return add_outer_pointer_to_fn_type_expr(p.get(), input, qualified, internal);}
28557add_outer_pointer_to_array_type_expr(
const type_base* p,
28558 const string& input,
bool qualified,
28564 string star_or_ref;
28565 type_base_sptr pointed_to_type;
28569 pointed_to_type = ptr->get_pointed_to_type();
28574 pointed_to_type = ref->get_pointed_to_type();
28582 std::ostringstream left, right, inner;
28583 inner <<
"(" << star_or_ref << input <<
")";
28584 right << array->get_subrange_representation();
28587 type_base_sptr array_element_type = array->get_element_type();
28593 left <<
get_type_name(array_element_type, qualified, internal);
28594 result = left.str() + inner.str() + right.str();
28599 string r = inner.str() + right.str();
28600 result = add_outer_pointer_to_fn_type_expr(p, r, qualified, internal);
28605 string inner_string = inner.str() + right.str();
28606 result = add_outer_pointer_to_array_type_expr(p, inner_string,
28607 qualified, internal);
28666add_outer_pointer_to_array_type_expr(
const type_base_sptr& pointer_to_ar,
28667 const string& input,
bool qualified,
28669{
return add_outer_pointer_to_array_type_expr(pointer_to_ar.get(),
28670 input, qualified, internal);}
28718add_outer_ptr_to_mbr_type_expr(
const ptr_to_mbr_type* p,
28719 const string& input,
bool qualified,
28725 std::ostringstream left, right, inner;
28726 string containing_type_name =
get_type_name(p->get_containing_type(),
28727 qualified, internal);
28728 type_base_sptr mbr_type = p->get_member_type();
28732 inner <<
"(" << containing_type_name <<
"::*" << input <<
")";
28733 stream_pretty_representation_of_fn_parms(*fn_type, right,
28734 qualified, internal);
28742 left <<
get_type_name(return_type, qualified, internal) <<
" ";;
28743 result = left.str() + inner.str() + right.str();
28747 string inner_str = inner.str() + right.str();
28748 result = pointer_declaration_name(p, inner_str, qualified, internal);
28752 string inner_str = inner.str() + right.str();
28753 result = add_outer_ptr_to_mbr_type_expr(p, inner_str,
28754 qualified, internal);
28761 inner <<
"(" << containing_type_name <<
"::*" << input <<
")";
28762 stream_pretty_representation_of_fn_parms(*fn_type, right,
28763 qualified, internal);
28764 string inner_str = inner.str() + right.str();
28765 result = add_outer_ptr_to_mbr_type_expr(ptr_mbr_type, inner_str,
28766 qualified, internal);
28770 left <<
get_type_name(p->get_member_type(), qualified, internal) <<
" ";
28771 inner << containing_type_name <<
"::*" << input;
28772 result = left.str()+ inner.str();
28825 const string& input,
bool qualified,
28827{
return add_outer_ptr_to_mbr_type_expr(p.get(), input, qualified, internal);}
28847add_outer_pointer_to_ptr_to_mbr_type_expr(
const type_base* p,
28848 const string& input,
bool qualified,
28854 string star_or_ref;
28855 type_base_sptr pointed_to_type;
28859 pointed_to_type = ptr->get_pointed_to_type();
28864 pointed_to_type= ref->get_pointed_to_type();
28868 if (!pointed_to_type)
28873 if (!pointed_to_ptr_to_mbr)
28876 std::ostringstream inner;
28877 inner << star_or_ref << input;
28878 string result = add_outer_ptr_to_mbr_type_expr(pointed_to_ptr_to_mbr,
28880 qualified, internal);
28897static interned_string
28898pointer_declaration_name(
const type_base* ptr,
28899 const string& idname,
28900 bool qualified,
bool internal)
28903 return interned_string();
28905 type_base_sptr pointed_to_type;
28906 string star_or_ref;
28909 pointed_to_type = p->get_pointed_to_type();
28914 pointed_to_type = p->get_pointed_to_type();
28918 if (!pointed_to_type)
28919 return interned_string();
28932 if (!idname.empty())
28939 result = add_outer_pointer_to_fn_type_expr(ptr, idname,
28940 qualified, internal);
28942 result = add_outer_pointer_to_array_type_expr(ptr, idname,
28943 qualified, internal);
28945 result = add_outer_pointer_to_ptr_to_mbr_type_expr(ptr, idname,
28946 qualified, internal);
28950 return ptr->get_environment().intern(result);
28967static interned_string
28968pointer_declaration_name(
const type_base_sptr& ptr,
28969 const string& variable_name,
28970 bool qualified,
bool internal)
28971{
return pointer_declaration_name(ptr.get(), variable_name,
28972 qualified, internal);}
28987static interned_string
28988array_declaration_name(
const array_type_def* array,
28989 const string& variable_name,
28990 bool qualified,
bool internal)
28993 return interned_string();
28995 type_base_sptr e_type = array->get_element_type();
28996 string e_type_repr =
29004 std::ostringstream o;
29005 if (!variable_name.empty())
29006 o << variable_name <<
" is ";
29008 << array->get_subrange_representation()
29009 <<
") of " << e_type_repr;
29020 result = e_type_repr;
29021 if (!variable_name.empty())
29022 result += variable_name;
29023 result += array->get_subrange_representation();
29027 string s = variable_name + array->get_subrange_representation();
29028 result = pointer_declaration_name(p, s, qualified, internal);
29032 string s = variable_name + array->get_subrange_representation();
29033 result = ptr_to_mbr_declaration_name(p, s, qualified, internal);
29038 return array->get_environment().intern(result);
29054static interned_string
29056 const string& variable_name,
29057 bool qualified,
bool internal)
29058{
return array_declaration_name(array.get(), variable_name,
29059 qualified, internal);}
29074static interned_string
29075ptr_to_mbr_declaration_name(
const ptr_to_mbr_type* ptr,
29076 const string& variable_name,
29077 bool qualified,
bool internal)
29080 return interned_string();
29082 string input = variable_name;
29083 string result = add_outer_ptr_to_mbr_type_expr(ptr, input,
29084 qualified, internal);
29085 return ptr->get_environment().intern(result);
29101static interned_string
29103 const string& variable_name,
29104 bool qualified,
bool internal)
29106 return ptr_to_mbr_declaration_name(ptr.get(), variable_name,
29107 qualified, internal);
29117struct ir_node_visitor::priv
29132ir_node_visitor::~ir_node_visitor() =
default;
29141{priv_->allow_visiting_already_visited_type_node = f;}
29150{
return priv_->allow_visiting_already_visited_type_node;}
29171 canonical_type = p;
29175 size_t canonical_ptr_value =
reinterpret_cast<size_t>(canonical_type);
29176 priv_->visited_ir_nodes.insert(canonical_ptr_value);
29189{priv_->visited_ir_nodes.clear();}
29210 canonical_type = p;
29214 size_t ptr_value =
reinterpret_cast<size_t>(canonical_type);
29215 pointer_set::iterator it = priv_->visited_ir_nodes.find(ptr_value);
29216 if (it == priv_->visited_ir_nodes.end())
29223ir_node_visitor::visit_begin(
decl_base*)
29231ir_node_visitor::visit_begin(scope_decl*)
29235ir_node_visitor::visit_end(scope_decl*)
29239ir_node_visitor::visit_begin(type_base*)
29243ir_node_visitor::visit_end(type_base*)
29247ir_node_visitor::visit_begin(scope_type_decl* t)
29248{
return visit_begin(
static_cast<type_base*
>(t));}
29251ir_node_visitor::visit_end(scope_type_decl* t)
29252{
return visit_end(
static_cast<type_base*
>(t));}
29255ir_node_visitor::visit_begin(type_decl* t)
29256{
return visit_begin(
static_cast<type_base*
>(t));}
29259ir_node_visitor::visit_end(type_decl* t)
29260{
return visit_end(
static_cast<type_base*
>(t));}
29263ir_node_visitor::visit_begin(namespace_decl* d)
29264{
return visit_begin(
static_cast<decl_base*
>(d));}
29267ir_node_visitor::visit_end(namespace_decl* d)
29268{
return visit_end(
static_cast<decl_base*
>(d));}
29271ir_node_visitor::visit_begin(qualified_type_def* t)
29272{
return visit_begin(
static_cast<type_base*
>(t));}
29275ir_node_visitor::visit_end(qualified_type_def* t)
29276{
return visit_end(
static_cast<type_base*
>(t));}
29279ir_node_visitor::visit_begin(pointer_type_def* t)
29280{
return visit_begin(
static_cast<type_base*
>(t));}
29283ir_node_visitor::visit_end(pointer_type_def* t)
29284{
return visit_end(
static_cast<type_base*
>(t));}
29287ir_node_visitor::visit_begin(reference_type_def* t)
29288{
return visit_begin(
static_cast<type_base*
>(t));}
29291ir_node_visitor::visit_end(reference_type_def* t)
29292{
return visit_end(
static_cast<type_base*
>(t));}
29295ir_node_visitor::visit_begin(ptr_to_mbr_type* t)
29296{
return visit_begin(
static_cast<type_base*
>(t));}
29299ir_node_visitor::visit_end(ptr_to_mbr_type* t)
29300{
return visit_end(
static_cast<type_base*
>(t));}
29303ir_node_visitor::visit_begin(array_type_def* t)
29304{
return visit_begin(
static_cast<type_base*
>(t));}
29307ir_node_visitor::visit_end(array_type_def* t)
29308{
return visit_end(
static_cast<type_base*
>(t));}
29311ir_node_visitor::visit_begin(array_type_def::subrange_type* t)
29312{
return visit_begin(
static_cast<type_base*
>(t));}
29315ir_node_visitor::visit_end(array_type_def::subrange_type* t)
29316{
return visit_end(
static_cast<type_base*
>(t));}
29319ir_node_visitor::visit_begin(enum_type_decl* t)
29320{
return visit_begin(
static_cast<type_base*
>(t));}
29323ir_node_visitor::visit_end(enum_type_decl* t)
29324{
return visit_end(
static_cast<type_base*
>(t));}
29327ir_node_visitor::visit_begin(typedef_decl* t)
29328{
return visit_begin(
static_cast<type_base*
>(t));}
29331ir_node_visitor::visit_end(typedef_decl* t)
29332{
return visit_end(
static_cast<type_base*
>(t));}
29335ir_node_visitor::visit_begin(function_type* t)
29336{
return visit_begin(
static_cast<type_base*
>(t));}
29339ir_node_visitor::visit_end(function_type* t)
29340{
return visit_end(
static_cast<type_base*
>(t));}
29343ir_node_visitor::visit_begin(var_decl* d)
29344{
return visit_begin(
static_cast<decl_base*
>(d));}
29347ir_node_visitor::visit_end(var_decl* d)
29348{
return visit_end(
static_cast<decl_base*
>(d));}
29351ir_node_visitor::visit_begin(function_decl* d)
29352{
return visit_begin(
static_cast<decl_base*
>(d));}
29355ir_node_visitor::visit_end(function_decl* d)
29356{
return visit_end(
static_cast<decl_base*
>(d));}
29359ir_node_visitor::visit_begin(function_decl::parameter* d)
29360{
return visit_begin(
static_cast<decl_base*
>(d));}
29363ir_node_visitor::visit_end(function_decl::parameter* d)
29364{
return visit_end(
static_cast<decl_base*
>(d));}
29367ir_node_visitor::visit_begin(function_tdecl* d)
29368{
return visit_begin(
static_cast<decl_base*
>(d));}
29371ir_node_visitor::visit_end(function_tdecl* d)
29372{
return visit_end(
static_cast<decl_base*
>(d));}
29375ir_node_visitor::visit_begin(class_tdecl* d)
29376{
return visit_begin(
static_cast<decl_base*
>(d));}
29379ir_node_visitor::visit_end(class_tdecl* d)
29380{
return visit_end(
static_cast<decl_base*
>(d));}
29383ir_node_visitor::visit_begin(class_or_union* t)
29384{
return visit_begin(
static_cast<type_base*
>(t));}
29387ir_node_visitor::visit_end(class_or_union* t)
29388{
return visit_end(
static_cast<type_base*
>(t));}
29391ir_node_visitor::visit_begin(class_decl* t)
29392{
return visit_begin(
static_cast<type_base*
>(t));}
29395ir_node_visitor::visit_end(class_decl* t)
29396{
return visit_end(
static_cast<type_base*
>(t));}
29399ir_node_visitor::visit_begin(union_decl* t)
29400{
return visit_begin(
static_cast<type_base*
>(t));}
29403ir_node_visitor::visit_end(union_decl* t)
29404{
return visit_end(
static_cast<type_base*
>(t));}
29407ir_node_visitor::visit_begin(class_decl::base_spec* d)
29408{
return visit_begin(
static_cast<decl_base*
>(d));}
29411ir_node_visitor::visit_end(class_decl::base_spec* d)
29412{
return visit_end(
static_cast<decl_base*
>(d));}
29415ir_node_visitor::visit_begin(member_function_template* d)
29416{
return visit_begin(
static_cast<decl_base*
>(d));}
29419ir_node_visitor::visit_end(member_function_template* d)
29420{
return visit_end(
static_cast<decl_base*
>(d));}
29423ir_node_visitor::visit_begin(member_class_template* d)
29424{
return visit_begin(
static_cast<decl_base*
>(d));}
29427ir_node_visitor::visit_end(member_class_template* d)
29428{
return visit_end(
static_cast<decl_base*
>(d));}
29440 static __thread
size_t counter;
29442 std::ostringstream o;
29449typedef unordered_map<
const function_decl*, string,
29450 function_decl::hash,
29469static const string&
29473 fns_to_str_map_type::const_iterator i = m.find(fn);
29476 string s = get_next_string();
29497fns_to_str(vector<function_decl*>::const_iterator begin,
29498 vector<function_decl*>::const_iterator end,
29502 vector<function_decl*>::const_iterator i;
29503 for (i = begin; i != end; ++i)
29504 o <<
"'" << fn_to_str(*i, m) <<
"' ";
29530fns_to_str(vector<function_decl*>::const_iterator a_begin,
29531 vector<function_decl*>::const_iterator a_end,
29532 vector<function_decl*>::const_iterator b_begin,
29533 vector<function_decl*>::const_iterator b_end,
29537 fns_to_str(a_begin, a_end, m, o);
29539 fns_to_str(b_begin, b_end, m, o);
29563fns_to_str(vector<function_decl*>::const_iterator a_begin,
29564 vector<function_decl*>::const_iterator a_end,
29565 vector<function_decl*>::const_iterator b_begin,
29566 vector<function_decl*>::const_iterator b_end,
29570 fns_to_str(a_begin, a_end, b_begin, b_end, m, o);
29592 std::string parent_qualified_name;
29601 if (!d->priv_->qualified_parent_name_.empty())
29607 d->priv_->qualified_name_ =
29608 env.
intern(d->priv_->qualified_parent_name_ +
"::" + d->
get_name());
29613 if (d->priv_->scoped_name_.empty())
29618 d->priv_->scoped_name_ =
29621 d->priv_->scoped_name_ =
29639{
return do_update(d);}
29651 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.
bool is_non_finite() const
Test if the length of the subrange type is infinite.
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 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 bool is_non_finite() const
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.
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 and if the d...
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
const enumerators & get_sorted_enumerators() const
Get the lexicographically sorted vector of enumerators.
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.
bool is_void_pointer_type(const type_base_sptr &) const
Test if a given type is the same as the void pointer type of the environment.
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 the unique 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 type_base_sptr & get_void_pointer_type() const
Getter of the "pointer-to-void" IR node that is shared across the ABI corpus. This node must be the o...
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.
bool is_declared_inline() const
Test if the function was declared inline.
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.
bool get_is_for_static_method() const
Test if the current method type is for a static method or not.
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 pointer-to-member type.
virtual void get_qualified_name(interned_string &qualified_name, bool internal=false) const
Get the qualified name for the current ptr_to_mbr_type.
const type_base_sptr & get_containing_type() const
Getter of the type containing the member pointed-to by the current ptr_to_mbr_type.
bool operator==(const ptr_to_mbr_type &) const
Equality operator for the current ptr_to_mbr_type.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function for ptr_to_mbr_type.
const type_base_sptr & get_member_type() const
Getter of the member type of the current ptr_to_mbr_type.
virtual ~ptr_to_mbr_type()
Desctructor for ptr_to_mbr_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 and if the d...
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...
istring_type_base_wptrs_map_type & ptr_to_mbr_types()
Getter for the map that associates the name of a pointer-to-member type to the vector of instances of...
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.
const corpus * get_corpus() const
Get the corpus this ABI artifact belongs to.
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.
friend class_decl * is_class_type(const type_or_decl_base *)
Test whether a type is a class.
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,...
friend decl_base * is_decl(const type_or_decl_base *d)
Test if an ABI artifact is a declaration.
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 type_base * is_type(const type_or_decl_base *)
Test whether a declaration is a type.
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.
virtual void get_qualified_name(interned_string &qualified_name, bool internal=false) const
Implementation of the virtual "get_qualified_name" method.
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...
const type_base * is_void_pointer_type_equivalent(const type_base &type)
Test if a type is equivalent to a pointer to void type.
shared_ptr< reference_type_def > reference_type_def_sptr
Convenience typedef for a shared pointer on a reference_type_def.
bool is_declaration_only_class_or_union_type(const type_base_sptr &t, bool look_through_decl_only)
Test wheter a type is a declaration-only class.
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.
size_t hash_type(const type_base *t)
Hash an ABI artifact that is either a type.
void fqn_to_components(const string &fqn, list< string > &comps)
Decompose a fully qualified name into the list of its components.
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.
bool is_typedef_of_maybe_qualified_class_or_union_type(const type_base_sptr &t)
Test if a type is a typedef of a class or union type, or a typedef of a qualified class or union type...
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 is_template_parm_composition_type(const shared_ptr< decl_base > decl)
Tests whether a decl is a template parameter composition type.
bool get_member_is_static(const decl_base &d)
Gets a flag saying if a class member is static or not.
pointer_type_def_sptr is_pointer_to_npaf_type(const type_base_sptr &t)
Test if we are looking at a pointer to a neither-a-pointer-to-an-array-nor-a-function type.
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.
bool function_decls_alias(const function_decl &f1, const function_decl &f2)
Test if two function declarations are aliases.
pointer_type_def_sptr is_pointer_to_array_type(const type_base_sptr &t)
Test if a type is a pointer to array type.
shared_ptr< class_tdecl > class_tdecl_sptr
Convenience typedef for a shared pointer on a class_tdecl.
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:
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.
ptr_to_mbr_type_sptr is_ptr_to_mbr_type(const type_or_decl_base_sptr &t, bool look_through_qualifiers)
Test whether a type is a ptr_to_mbr_type_sptr.
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.
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.
const type_base_sptr is_void_pointer_type(const type_base_sptr &t)
Test if a type is a pointer to void type.
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_template_parameter(const shared_ptr< decl_base > decl)
Tests whether a decl is a template parameter.
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.
class_decl::base_spec * is_class_base_spec(const type_or_decl_base *tod)
Test if an ABI artifact is a class base specifier.
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.
void set_member_function_vtable_offset(function_decl &f, ssize_t s)
Set the vtable offset of a member function.
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.
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.
location get_location(const decl_base_sptr &decl)
Get the location of a given declaration.
const typedef_decl * is_typedef(const type_or_decl_base *t)
Test whether a type is a typedef.
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 ptr_to_mbr_type * is_ptr_to_mbr_type(const type_or_decl_base *t, bool look_through_qualifiers)
Test whether a type is a ptr_to_mbr_type.
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.
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...
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.
string get_enum_flat_representation(const enum_type_decl &enum_type, const string &indent, bool one_line, bool qualified_names)
Get the flat representation of an instance of enum_type_decl type.
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.
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.
void unmark_types_as_being_compared(T &l, T &r)
Mark a pair of types as being not compared anymore.
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 collect_non_anonymous_data_members(const class_or_union *cou, string_decl_base_sptr_map &dms)
Collect all the non-anonymous data members of a class or union type.
union_decl_sptr is_union_type(const shared_ptr< type_or_decl_base > &t)
Test if a type is a union_decl.
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.
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.
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_declaration_only_class_or_union_type(const type_base *t, bool look_through_decl_only)
Test wheter a type is a declaration-only class.
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...
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.
const type_base_sptr peel_qualified_type(const type_base_sptr &type)
Return the leaf underlying type of a qualified type.
type_base_sptr peel_const_qualified_type(const qualified_type_def_sptr &q)
If a qualified type is const, then return its underlying type.
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.
translation_unit * get_translation_unit(const shared_ptr< decl_base > decl)
Return the translation unit a declaration belongs to.
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 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.
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...
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 is_comparison_cycle_detected(T &l, T &r)
Detect if a recursive comparison cycle is detected while structurally comparing two types (a....
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 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.
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.
reference_type_def * is_reference_type(type_or_decl_base *t, bool look_through_qualifiers)
Test whether a type is a reference_type_def.
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.
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.
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.
unordered_map< interned_string, bool, hash_interned_string > interned_string_bool_map_type
Convenience typedef for a map of interned_string -> bool.
const enum_type_decl * is_enum_type(const type_or_decl_base *d)
Test if a decl is an enum_type_decl.
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...
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.
shared_ptr< ptr_to_mbr_type > ptr_to_mbr_type_sptr
Convenience typedef for a shared pointer to a ptr_to_mbr_type.
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.
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.
size_t hash_type_or_decl(const type_or_decl_base *tod)
Hash an ABI artifact that is either a type or a decl.
array_type_def_sptr is_array_type(const type_or_decl_base_sptr &type, bool look_through_qualifiers)
Test if a type is an array_type_def.
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.
bool is_template_decl(const decl_base_sptr &decl)
Tests whether a decl is a template.
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.
bool is_data_member_of_anonymous_class_or_union(const var_decl &d)
Test if a var_decl is a data member belonging to an anonymous 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...
const type_base * is_void_pointer_type_equivalent(const type_base *type)
Test if a type is equivalent to a pointer to void type.
lookup_entity_kind
This enum describe the kind of entity to lookup, while using the lookup API.
bool try_canonical_compare(const T *l, const T *r)
Compare two types by comparing their canonical types if present.
type_base * type_has_non_canonicalized_subtype(type_base_sptr t)
Test if a type has sub-types that are non-canonicalized.
unordered_map< string, decl_base_sptr > string_decl_base_sptr_map
Convenience typedef for a map which key is a string and which value is a decl_base_sptr.
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.
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.
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.
bool is_enumerator_present_in_enum(const enum_type_decl::enumerator &enr, const enum_type_decl &enom)
Test if a given enumerator is found present in an enum.
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.
bool is_const_qualified_type(const qualified_type_def_sptr &t)
Test if a given qualified type is const.
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.
var_decl_sptr has_fake_flexible_array_data_member(const class_decl_sptr &klass)
Test if the last data member of a class is an array with one element.
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.
string get_pretty_representation(const method_type_sptr method, bool internal)
Get the pretty representation of a method type.
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 and if the d...
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.
bool is_npaf_type(const type_base_sptr &t)
Test if a type is a neither a pointer, an array nor a function type.
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.
const interned_string & get_node_name(var_decl_sptr node)
Gets the name of a var_decl node.
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.
const pointer_type_def * is_pointer_type(const type_or_decl_base *t, bool look_through_qualifiers)
Test whether a type is a pointer_type_def.
string get_class_or_enum_flat_representation(const type_base &coe, const string &indent, bool one_line, bool internal, bool qualified_name)
Get the flat representation of an instance of enum_type_decl type.
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.
pointer_type_def_sptr is_pointer_to_function_type(const type_base_sptr &t)
Test if a type is a pointer to function type.
weak_ptr< decl_base > decl_base_wptr
Convenience typedef for a weak pointer to a decl_base.
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 is_function_template_pattern(const shared_ptr< decl_base > decl)
Test whether a decl is the pattern of a function template.
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.
bool is_global_scope(const shared_ptr< scope_decl >scope)
Tests whether if a given scope is the global scope.
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.
pointer_type_def_sptr is_pointer_to_ptr_to_mbr_type(const type_base_sptr &t)
Test if we are looking at a pointer to pointer to member type.
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.
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.
array_type_def * is_array_type(const type_or_decl_base *type, bool look_through_qualifiers)
Test if a type is an array_type_def.
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.
interned_string get_function_id_or_pretty_representation(const function_decl *fn)
Get the ID of a function, or, if the ID can designate several different functions,...
shared_ptr< type_decl > type_decl_sptr
Convenience typedef for a shared pointer on a type_decl.
const global_scope * get_global_scope(const shared_ptr< decl_base > decl)
Return the global scope as seen by a given declaration.
typedef_decl_sptr clone_typedef(const typedef_decl_sptr &t)
Clone a typedef type.
bool compare_using_locations(const decl_base *f, const decl_base *s)
Compare decls using their locations.
string get_enum_flat_representation(const enum_type_decl_sptr &enum_type, const string &indent, bool one_line, bool qualified_names)
Get the flat representation of an instance of enum_type_decl type.
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...
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.
bool is_unique_type(const type_base_sptr &t)
Test if a type is unique in the entire environment.
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.
void mark_types_as_being_compared(T &l, T &r)
Mark a pair of types as being compared.
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.
bool is_at_template_scope(const shared_ptr< decl_base > decl)
Tests whether a given decl is at template scope.
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,...
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:
var_decl_sptr has_flexible_array_data_member(const class_decl_sptr &klass)
Test if the last data member of a class is an array with non-finite data member.
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.
bool is_typedef_ptr_or_ref_to_decl_only_class_or_union_type(const type_base *t)
Test if a type is a typedef, pointer or reference to a decl-only class/union.
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.
string build_qualified_name(const scope_decl *scope, const string &name)
Build and return a qualified name from a name and its scope.
bool is_ptr_ref_or_qual_type(const type_base *t)
Helper to detect if a type is either a reference, a pointer, or a qualified type.
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.
pointer_type_def_sptr is_pointer_type(const type_or_decl_base_sptr &t, bool look_through_qualifiers)
Test whether a type is a pointer_type_def.
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.
bool class_or_union_types_of_same_kind(const class_or_union_sptr &first, const class_or_union_sptr &second)
Test if two class or union types are of the same kind.
reference_type_def_sptr is_reference_type(const type_or_decl_base_sptr &t, bool look_through_qualifiers)
Test whether a type is a reference_type_def.
bool get_member_function_is_ctor(const function_decl &f)
Test whether a member function is a constructor.
void set_member_function_is_ctor(function_decl &f, bool c)
Setter for the is_ctor property of the member function.
bool is_declaration_only_class_type(const type_base_sptr &t, bool look_through_decl_only)
Test wheter a type is a declaration-only class.
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.
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.
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.
bool operator==(const std::string &l, const interned_string &r)
Equality operator.
std::string operator+(const interned_string &s1, const std::string &s2)
Concatenation 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.
A functor to sort decls somewhat topologically. That is, types are sorted in a way that makes the one...
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 functor to sort types somewhat topologically. That is, types are sorted in a way that makes the one...
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.