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;}
2219{
return priv_->is_in_ksymtab_;}
2234{
return priv_->crc_;}
2248{
return priv_->namespace_;}
2255{priv_->namespace_ = ns;}
2264{
return priv_->is_suppressed_;}
2303{
return priv_->main_symbol_.lock();}
2310{
return priv_->main_symbol_.lock();}
2324{
return priv_->next_alias_.lock();}
2344 a = a->get_next_alias())
2367 a && !a->is_main_symbol();
2368 a = a->get_next_alias())
2370 if (a->get_next_alias()->is_main_symbol())
2378 last_alias->priv_->next_alias_ = alias;
2381 priv_->next_alias_ = alias;
2411 a = a->get_next_alias())
2412 if (a->get_name() == name)
2422 priv_->main_symbol_ = new_main;
2424 a = a->get_next_alias())
2425 a->priv_->main_symbol_ = new_main;
2435{
return priv_->is_common_;}
2466{
return priv_->next_common_instance_.lock();}
2481 ABG_ASSERT(!common->has_other_common_instances());
2490 c = c->get_next_common_instance())
2495 last_common_instance = c;
2500 last_common_instance->priv_->next_common_instance_ = common;
2503 priv_->next_common_instance_ = common;
2523 if (priv_->id_string_.empty())
2535 priv_->id_string_ = s;
2538 return priv_->id_string_;
2555 a = a->get_next_alias())
2556 if (a->get_name() == name)
2573 a && a.get() != a->get_main_symbol().get();
2574 a = a->get_next_alias())
2575 if (textually_equals(*
this, *a))
2592 bool include_symbol_itself)
const
2596 if (include_symbol_itself)
2599 vector<elf_symbol_sptr> aliases;
2600 compute_aliases_for_elf_symbol(*
this, syms, aliases);
2601 if (!aliases.empty() && include_symbol_itself)
2604 for (vector<elf_symbol_sptr>::const_iterator i = aliases.begin();
2608 if (i != aliases.begin())
2610 result += (*i)->get_id_string();
2625 vector<elf_symbol_sptr> aliases;
2626 if (include_symbol_itself)
2631 a = a->get_next_alias())
2632 aliases.push_back(a);
2635 for (vector<elf_symbol_sptr>::const_iterator i = aliases.begin();
2639 if (i != aliases.begin())
2641 result += (*i)->get_id_string();
2661 name.clear(), ver.clear();
2663 string::size_type i =
id.find(
'@');
2664 if (i == string::npos)
2670 name =
id.substr(0, i);
2676 string::size_type j =
id.find(
'@', i);
2677 if (j == string::npos)
2704 bool are_equal = textually_equals(*
this, other);
2725 a && !a->is_main_symbol();
2726 a = a->get_next_alias())
2750 return *lhs == *rhs;
2776compute_aliases_for_elf_symbol(
const elf_symbol& sym,
2778 vector<elf_symbol_sptr>& aliases)
2782 for (; a && !a->is_main_symbol(); a = a->get_next_alias())
2783 aliases.push_back(a);
2785 for (string_elf_symbols_map_type::const_iterator i = symtab.begin();
2788 for (elf_symbols::const_iterator j = i->second.begin();
2789 j != i->second.end();
2794 s && !s->is_main_symbol();
2795 s = s->get_next_alias())
2796 aliases.push_back(s);
2799 s && !s->is_main_symbol();
2800 s = s->get_next_alias())
2802 aliases.push_back(*j);
2847 case elf_symbol::NOTYPE_TYPE:
2848 repr =
"unspecified symbol type";
2850 case elf_symbol::OBJECT_TYPE:
2851 repr =
"variable symbol type";
2853 case elf_symbol::FUNC_TYPE:
2854 repr =
"function symbol type";
2856 case elf_symbol::SECTION_TYPE:
2857 repr =
"section symbol type";
2859 case elf_symbol::FILE_TYPE:
2860 repr =
"file symbol type";
2862 case elf_symbol::COMMON_TYPE:
2863 repr =
"common data object symbol type";
2865 case elf_symbol::TLS_TYPE:
2866 repr =
"thread local data object symbol type";
2868 case elf_symbol::GNU_IFUNC_TYPE:
2869 repr =
"indirect function symbol type";
2873 std::ostringstream s;
2874 s <<
"unknown symbol type (" << (char)t <<
')';
2897 case elf_symbol::LOCAL_BINDING:
2898 repr =
"local binding";
2900 case elf_symbol::GLOBAL_BINDING:
2901 repr =
"global binding";
2903 case elf_symbol::WEAK_BINDING:
2904 repr =
"weak binding";
2906 case elf_symbol::GNU_UNIQUE_BINDING:
2907 repr =
"GNU unique binding";
2911 std::ostringstream s;
2912 s <<
"unknown binding (" << (
unsigned char) b <<
")";
2935 case elf_symbol::DEFAULT_VISIBILITY:
2936 repr =
"default visibility";
2938 case elf_symbol::PROTECTED_VISIBILITY:
2939 repr =
"protected visibility";
2941 case elf_symbol::HIDDEN_VISIBILITY:
2942 repr =
"hidden visibility";
2944 case elf_symbol::INTERNAL_VISIBILITY:
2945 repr =
"internal visibility";
2949 std::ostringstream s;
2950 s <<
"unknown visibility (" << (
unsigned char) v <<
")";
2972 t = elf_symbol::NOTYPE_TYPE;
2973 else if (s ==
"object-type")
2974 t = elf_symbol::OBJECT_TYPE;
2975 else if (s ==
"func-type")
2976 t = elf_symbol::FUNC_TYPE;
2977 else if (s ==
"section-type")
2978 t = elf_symbol::SECTION_TYPE;
2979 else if (s ==
"file-type")
2980 t = elf_symbol::FILE_TYPE;
2981 else if (s ==
"common-type")
2982 t = elf_symbol::COMMON_TYPE;
2983 else if (s ==
"tls-type")
2984 t = elf_symbol::TLS_TYPE;
2985 else if (s ==
"gnu-ifunc-type")
2986 t = elf_symbol::GNU_IFUNC_TYPE;
3004 if (s ==
"local-binding")
3005 b = elf_symbol::LOCAL_BINDING;
3006 else if (s ==
"global-binding")
3007 b = elf_symbol::GLOBAL_BINDING;
3008 else if (s ==
"weak-binding")
3009 b = elf_symbol::WEAK_BINDING;
3010 else if (s ==
"gnu-unique-binding")
3011 b = elf_symbol::GNU_UNIQUE_BINDING;
3029 if (s ==
"default-visibility")
3030 v = elf_symbol::DEFAULT_VISIBILITY;
3031 else if (s ==
"protected-visibility")
3032 v = elf_symbol::PROTECTED_VISIBILITY;
3033 else if (s ==
"hidden-visibility")
3034 v = elf_symbol::HIDDEN_VISIBILITY;
3035 else if (s ==
"internal-visibility")
3036 v = elf_symbol::INTERNAL_VISIBILITY;
3051{
return t == elf_symbol::FUNC_TYPE;}
3061{
return t == elf_symbol::OBJECT_TYPE;}
3065struct elf_symbol::version::priv
3071 : is_default_(false)
3074 priv(
const string& v,
3081elf_symbol::version::version()
3088elf_symbol::version::version(
const string& v,
3090 : priv_(new priv(v, is_default))
3094 : priv_(new priv(v.str(), v.is_default()))
3098elf_symbol::version::~version() =
default;
3103elf_symbol::version::operator
const string&()
const
3104{
return priv_->version_;}
3111{
return priv_->version_;}
3118{priv_->version_ = s;}
3125{
return priv_->is_default_;}
3132{priv_->is_default_ = f;}
3135elf_symbol::version::is_empty()
const
3136{
return str().empty();}
3145{
return str() == o.
str();}
3174struct dm_context_rel::priv
3177 size_t offset_in_bits_;
3180 priv(
bool is_static =
false)
3181 : is_laid_out_(!is_static),
3183 anonymous_data_member_()
3186 priv(
bool is_laid_out,
size_t offset_in_bits)
3187 : is_laid_out_(is_laid_out),
3188 offset_in_bits_(offset_in_bits),
3189 anonymous_data_member_()
3193dm_context_rel::dm_context_rel()
3198dm_context_rel::dm_context_rel(scope_decl* s,
3200 size_t offset_in_bits,
3203 : context_rel(s, a, is_static),
3204 priv_(new priv(is_laid_out, offset_in_bits))
3207dm_context_rel::dm_context_rel(scope_decl* s)
3213dm_context_rel::get_is_laid_out()
const
3214{
return priv_->is_laid_out_;}
3217dm_context_rel::set_is_laid_out(
bool f)
3218{priv_->is_laid_out_ = f;}
3221dm_context_rel::get_offset_in_bits()
const
3222{
return priv_->offset_in_bits_;}
3225dm_context_rel::set_offset_in_bits(
size_t o)
3226{priv_->offset_in_bits_ = o;}
3229dm_context_rel::operator==(
const dm_context_rel& o)
const
3231 if (!context_rel::operator==(o))
3234 return (priv_->is_laid_out_ == o.priv_->is_laid_out_
3235 && priv_->offset_in_bits_ == o.priv_->offset_in_bits_);
3239dm_context_rel::operator!=(
const dm_context_rel& o)
const
3250{
return priv_->anonymous_data_member_;}
3260{priv_->anonymous_data_member_ = anon_dm;}
3262dm_context_rel::~dm_context_rel()
3288{
return priv_->canonical_types_;}
3301is_ptr_ref_or_qual_type(
const type_base *t)
3318compare_using_locations(
const decl_base *f,
3332 unsigned l1 = 0, l2 = 0, c1 = 0, c2 = 0;
3355struct decl_topo_comp
3366 operator()(
const decl_base *f,
3385 if ((!f->get_corpus() && !s->get_corpus())
3386 || (f->get_corpus()->get_origin() == corpus::NATIVE_XML_ORIGIN
3387 && s->get_corpus()->get_origin() == corpus::NATIVE_XML_ORIGIN))
3388 return compare_using_locations(f, s);
3395 if (fl.get_value() && sl.get_value())
3396 return compare_using_locations(f, s);
3397 else if (!!fl != !!sl)
3404 if (f->get_is_anonymous()
3405 && s->get_is_anonymous()
3408 return f->get_name() < s->get_name();
3422 operator()(
const decl_base_sptr &f,
3423 const decl_base_sptr &s)
3424 {
return operator()(f.get(), s.get());}
3435struct type_topo_comp
3443 has_artificial_or_natural_location(
const decl_base* d)
3452 has_artificial_or_natural_location(
const type_base* t)
3454 if (decl_base *d =
is_decl(t))
3455 return has_artificial_or_natural_location(d);
3467 operator()(
const type_base_sptr &f,
3468 const type_base_sptr &s)
3469 {
return operator()(f.get(), s.get());}
3479 operator()(
const type_base *f,
3484 if ((!f->get_corpus() && !s->get_corpus())
3485 || (f->get_corpus()->get_origin() == corpus::NATIVE_XML_ORIGIN
3486 && s->get_corpus()->get_origin() == corpus::NATIVE_XML_ORIGIN))
3489 bool f_is_ptr_ref_or_qual = is_ptr_ref_or_qual_type(f);
3490 bool s_is_ptr_ref_or_qual = is_ptr_ref_or_qual_type(s);
3492 if (f_is_ptr_ref_or_qual != s_is_ptr_ref_or_qual)
3493 return !f_is_ptr_ref_or_qual && s_is_ptr_ref_or_qual;
3495 if (f_is_ptr_ref_or_qual && s_is_ptr_ref_or_qual
3496 && !has_artificial_or_natural_location(f)
3497 && !has_artificial_or_natural_location(s))
3505 if (q->get_cv_quals() == qualified_type_def::CV_NONE)
3537 type_base *peeled_f =
3539 type_base *peeled_s =
3596 decl_topo_comp decl_comp;
3597 return decl_comp(fd, sd);
3608 vector<type_base_sptr>& result)
3611 result.push_back(t);
3613 type_topo_comp comp;
3614 std::stable_sort(result.begin(), result.end(), comp);
3626const type_base_sptr&
3629 if (!priv_->void_type_)
3630 priv_->void_type_.reset(
new type_decl(*
this,
3633 return priv_->void_type_;
3645const type_base_sptr&
3648 if (!priv_->void_pointer_type_)
3651 return priv_->void_pointer_type_;
3664const type_base_sptr&
3667 if (!priv_->variadic_marker_type_)
3668 priv_->variadic_marker_type_.
3671 return priv_->variadic_marker_type_;
3680 static string variadic_parameter_type_name =
"variadic parameter type";
3681 return variadic_parameter_type_name;
3691{
return priv_->canonicalization_is_done_;}
3705{priv_->canonicalization_is_done_ = f;}
3714{
return priv_->do_on_the_fly_canonicalization_;}
3723{priv_->do_on_the_fly_canonicalization_ = f;}
3747{
return priv_->decl_only_class_equals_definition_;}
3772{priv_->decl_only_class_equals_definition_ = f;}
3877{
return const_cast<environment*
>(
this)->priv_->string_pool_.create_string(s);}
3884{
return priv_->config_;}
3894{
return priv_->analyze_exported_interfaces_only_.has_value();}
3907{priv_->analyze_exported_interfaces_only_ = f;}
3920{
return priv_->analyze_exported_interfaces_only_.value_or(
false);}
3922#ifdef WITH_DEBUG_SELF_COMPARISON
3935environment::set_self_comparison_debug_input(
const corpus_sptr& c)
3937 self_comparison_debug_is_on(
true);
3938 if (priv_->first_self_comparison_corpus_.expired())
3939 priv_->first_self_comparison_corpus_ = c;
3940 else if (priv_->second_self_comparison_corpus_.expired()
3941 && c.get() != corpus_sptr(priv_->first_self_comparison_corpus_).get())
3942 priv_->second_self_comparison_corpus_ = c;
3955environment::get_self_comparison_debug_inputs(corpus_sptr& first_corpus,
3956 corpus_sptr& second_corpus)
3958 first_corpus = priv_->first_self_comparison_corpus_.lock();
3959 second_corpus = priv_->second_self_comparison_corpus_.lock();
3966environment::self_comparison_debug_is_on(
bool f)
3967{priv_->self_comparison_debug_on_ = f;}
3974environment::self_comparison_debug_is_on()
const
3975{
return priv_->self_comparison_debug_on_;}
3978#ifdef WITH_DEBUG_TYPE_CANONICALIZATION
3985environment::debug_type_canonicalization_is_on(
bool flag)
3986{priv_->debug_type_canonicalization_ = flag;}
3994environment::debug_type_canonicalization_is_on()
const
3995{
return priv_->debug_type_canonicalization_;}
4003environment::debug_die_canonicalization_is_on(
bool flag)
4004{priv_->debug_die_canonicalization_ = flag;}
4012environment::debug_die_canonicalization_is_on()
const
4013{
return priv_->debug_die_canonicalization_;}
4029vector<type_base_sptr>*
4056 if (!types ||index >= types->size())
4058 return (*types)[index].get();
4061#ifdef WITH_DEBUG_SELF_COMPARISON
4071const unordered_map<string, uintptr_t>&
4072environment::get_type_id_canonical_type_map()
const
4073{
return priv_->get_type_id_canonical_type_map();}
4084unordered_map<string, uintptr_t>&
4085environment::get_type_id_canonical_type_map()
4086{
return priv_->get_type_id_canonical_type_map();}
4101const unordered_map<uintptr_t, string>&
4102environment::get_pointer_type_id_map()
const
4103{
return priv_->get_pointer_type_id_map();}
4118unordered_map<uintptr_t, string>&
4119environment::get_pointer_type_id_map()
4120{
return priv_->get_pointer_type_id_map();}
4138environment::get_type_id_from_pointer(uintptr_t ptr)
const
4139{
return priv_->get_type_id_from_pointer(ptr);}
4157environment::get_type_id_from_type(
const type_base *t)
const
4158{
return priv_->get_type_id_from_type(t);}
4175environment::get_canonical_type_from_type_id(
const char* type_id)
const
4176{
return priv_->get_canonical_type_from_type_id(type_id);}
4184struct type_or_decl_base::priv
4202 void* type_or_decl_ptr_;
4203 bool hashing_started_;
4204 const environment& env_;
4205 translation_unit* translation_unit_;
4210 location artificial_location_;
4214 bool is_artificial_;
4222 priv(
const environment& e,
4226 type_or_decl_ptr_(),
4229 translation_unit_(),
4249 (
static_cast<unsigned>(l) |
static_cast<unsigned>(r));
4269 (
static_cast<unsigned>(l) &
static_cast<unsigned>(r));
4290 :priv_(new priv(e, k))
4306{
return priv_->is_artificial_;}
4318{priv_->is_artificial_ = f;}
4329{
return priv_->kind();}
4349{
return priv_->rtti_;}
4358{
return priv_->rtti_;}
4370 priv_->type_or_decl_ptr_ = t;
4372 priv_->type_or_decl_ptr_ = d;
4395{
return priv_->type_or_decl_ptr_;}
4402{
return priv_->hashing_started_;}
4409{priv_->hashing_started_ = b;}
4416{
return priv_->env_;}
4434{priv_->artificial_location_ = l;}
4452{
return priv_->artificial_location_;}
4460 return (priv_->artificial_location_
4461 && priv_->artificial_location_.get_is_artificial());
4492{priv_->translation_unit_ = tu;}
4501{
return priv_->translation_unit_;}
4533 *dr =
dynamic_cast<const decl_base*
>(r);
4542 *tr =
dynamic_cast<const type_base*
>(r);
4587struct decl_base::priv
4589 bool in_pub_sym_tab_;
4615 decl_base_sptr declaration_;
4617 decl_base* naked_definition_of_declaration_;
4618 bool is_declaration_only_;
4622 : in_pub_sym_tab_(false),
4623 is_anonymous_(true),
4625 visibility_(VISIBILITY_DEFAULT),
4626 naked_definition_of_declaration_(),
4627 is_declaration_only_(false)
4630 priv(interned_string name, interned_string linkage_name,
visibility vis)
4631 : in_pub_sym_tab_(false),
4634 qualified_name_(name),
4635 linkage_name_(linkage_name),
4637 naked_definition_of_declaration_(),
4638 is_declaration_only_(false)
4640 is_anonymous_ = name_.
empty();
4665 const string& linkage_name,
4668 priv_(new priv(e.intern(name), e.intern(linkage_name), vis))
4692 priv_(new priv(name, linkage_name, vis))
4719{
return priv_->qualified_name_;}
4728{priv_->qualified_name_.clear();}
4735{priv_->qualified_name_ = n;}
4748{
return priv_->temporary_qualified_name_;}
4762{priv_->temporary_qualified_name_ = n;}
4769{
return priv_->context_;}
4776{
return priv_->context_;}
4780{priv_->context_ = c;}
4811{
return priv_->in_pub_sym_tab_;}
4819{priv_->in_pub_sym_tab_ = f;}
4839{
return priv_->location_;}
4881 priv_->location_ = l;
4891 priv_->is_anonymous_ = n.empty();
4902{
return priv_->is_anonymous_;}
4912{priv_->is_anonymous_ = f;}
4949{
return priv_->naming_typedef_;}
4977 &&
is_type(
this)->get_naked_canonical_type() ==
nullptr);
4979 priv_->naming_typedef_ = t;
4986 update_qualified_name(
this);
4994{
return priv_->linkage_name_;}
5003 priv_->linkage_name_ = env.
intern(m);
5011{
return priv_->visibility_;}
5018{priv_->visibility_ = v;}
5027 if (priv_->context_)
5028 return priv_->context_->get_scope();
5038{
return priv_->qualified_parent_name_;}
5045{
return priv_->name_;}
5080 bool qualified_name)
const
5084 && has_generic_anonymous_internal_type_name(
this))
5095 string name = get_generic_anonymous_internal_type_name(
this);
5123{
return priv_->qualified_name_;}
5137{
return priv_->scoped_name_;}
5145{
return priv_->declaration_;}
5154 if (d && d->get_is_declaration_only())
5155 priv_->declaration_ = d;
5165{
return priv_->definition_of_declaration_.lock();}
5181{
return priv_->naked_definition_of_declaration_;}
5188{
return priv_->is_declaration_only_;}
5198 bool update_types_lookup_map = !f && priv_->is_declaration_only_;
5200 priv_->is_declaration_only_ = f;
5202 if (update_types_lookup_map)
5205 scope_decl::declarations::iterator i;
5206 if (s->find_iterator_for_member(
this, i))
5216 return static_cast<change_kind>(
static_cast<unsigned>(l)
5217 |
static_cast<unsigned>(r));
5223 return static_cast<change_kind>(
static_cast<unsigned>(l)
5224 &
static_cast<unsigned>(r));
5271 bool member_types_or_functions =
5275 if (member_types_or_functions)
5284 la = r1->get_access_specifier();
5285 ra = r2->get_access_specifier();
5286 r1->set_access_specifier(no_access);
5287 r2->set_access_specifier(no_access);
5290 bool rels_are_different = *r1 != *r2;
5292 if (member_types_or_functions)
5295 r1->set_access_specifier(la);
5296 r2->set_access_specifier(ra);
5299 if (rels_are_different)
5320get_decl_name_for_comparison(
const decl_base &d)
5322 if (has_generic_anonymous_internal_type_name(&d)
5328 r += get_generic_anonymous_internal_type_name(&d);
5365 if (!l_linkage_name.
empty() && !r_linkage_name.
empty())
5367 if (l_linkage_name != r_linkage_name)
5402 bool decls_are_same = (ln == rn);
5411 decls_are_same =
true;
5421 if (!decls_are_same)
5444{
return equals(*
this, other, 0);}
5483 if (!priv_->context_)
5486 priv_->context_->set_scope(scope);
5504 case decl_base::VISIBILITY_NONE:
5507 case decl_base::VISIBILITY_DEFAULT:
5510 case decl_base::VISIBILITY_PROTECTED:
5513 case decl_base::VISIBILITY_HIDDEN:
5516 case decl_base::VISIBILITY_INTERNAL:
5536 case decl_base::BINDING_NONE:
5539 case decl_base::BINDING_LOCAL:
5542 case decl_base::BINDING_GLOBAL:
5545 case decl_base::BINDING_WEAK:
5568 if (l.get() == r.get())
5604 if (l.get() == r.get())
5690{
return dynamic_pointer_cast<scope_decl>(d);}
5756 return c->get_access_specifier();
5786 c->set_access_specifier(a);
5816 return c->get_is_static();
5958 var_decl_sptr first = *klass->get_non_static_data_members().begin();
5979 if (!klass ||!data_member)
5982 for (class_or_union::data_members::const_iterator it =
5986 if (**it == *data_member)
6214 return class_or_union_sptr();
6223const class_or_union_sptr
6228 if (cou->get_is_anonymous())
6231 return class_or_union_sptr();
6240const class_or_union_sptr
6245 return class_or_union_sptr();
6254const class_or_union_sptr
6269 return class_or_union_sptr();
6294 for (
auto anon_dm_m : cl->get_non_static_data_members())
6341 ctxt_rel->set_offset_in_bits(o);
6356 return ctxt_rel->get_offset_in_bits();
6446 const var_decl *containing_anonymous_data_member =
6449 uint64_t containing_anonymous_data_member_offset = 0;
6450 if (containing_anonymous_data_member)
6451 containing_anonymous_data_member_offset =
6454 return (ctxt_rel->get_offset_in_bits()
6456 containing_anonymous_data_member_offset);
6484 type_base_sptr t = v->get_type();
6487 return t->get_size_in_bits();
6501 ctxt_rel->set_is_laid_out(l);
6516 return ctxt_rel->get_is_laid_out();
6818 return ctxt->is_virtual();
6855 ctxt->is_virtual(is_virtual);
6870 (dynamic_pointer_cast<method_decl>(fn));
6908 if (!cl->get_canonical_type())
6914 type_base_sptr t = type;
6925 ty->get_size_in_bits(),
6926 ty->get_alignment_in_bits(),
6927 ty->get_location()));
6935 ty->get_size_in_bits(),
6936 ty->get_alignment_in_bits(),
6937 ty->get_location()));
6946 ty->get_location()));
6952 t.reset(
new array_type_def(p, ty->get_subranges(), ty->get_location()));
6957 for (function_decl::parameters::const_iterator i =
6958 ty->get_parameters().begin();
6959 i != ty->get_parameters().end();
6970 p->get_variadic_marker(),
6971 p->get_is_artificial()));
6972 parm.push_back(stripped);
6977 parm, ty->get_is_const(),
6978 ty->get_size_in_bits(),
6979 ty->get_alignment_in_bits()));
6984 for (function_decl::parameters::const_iterator i =
6985 ty->get_parameters().begin();
6986 i != ty->get_parameters().end();
6997 p->get_variadic_marker(),
6998 p->get_is_artificial()));
6999 parm.push_back(stripped);
7004 ty->get_size_in_bits(),
7005 ty->get_alignment_in_bits()));
7008 if (!t->get_translation_unit())
7009 t->set_translation_unit(type->get_translation_unit());
7014 return t->get_canonical_type() ? t->get_canonical_type() : t;
7037 decl_base_sptr result = t;
7038 type_base_sptr u = t->get_underlying_type();
7041 if ((t->get_cv_quals() & qualified_type_def::CV_CONST
7043 || (t->get_cv_quals() & qualified_type_def::CV_CONST
7045 || t->get_cv_quals() == qualified_type_def::CV_NONE)
7091static qualified_type_def_sptr
7092strip_redundant_quals_from_underyling_types(
const qualified_type_def_sptr& t,
7101 qualified_type_def_sptr underlying_qualified_type =
7109 currated_quals &= ~redundant_quals;
7110 t->set_cv_quals(currated_quals);
7114 redundant_quals |= currated_quals;
7116 qualified_type_def_sptr result = t;
7117 if (underlying_qualified_type)
7121 strip_redundant_quals_from_underyling_types(underlying_qualified_type,
7155strip_redundant_quals_from_underyling_types(
const qualified_type_def_sptr& t)
7161 strip_redundant_quals_from_underyling_types(t, redundant_quals);
7188 return t->get_underlying_type();
7242 return t->get_pointed_to_type();
7298 return t->get_pointed_to_type();
7456 type_base_sptr type = t;
7479 type_base_sptr typ = type;
7541 bool peel_qual_type)
7580 bool peel_qual_type)
7618 vector<array_type_def::subrange_sptr> subranges;
7620 for (vector<array_type_def::subrange_sptr>::const_iterator i =
7621 array->get_subranges().begin();
7622 i != array->get_subranges().end();
7628 (*i)->get_lower_bound(),
7629 (*i)->get_upper_bound(),
7630 (*i)->get_underlying_type(),
7631 (*i)->get_location(),
7632 (*i)->get_language()));
7633 subrange->is_non_finite((*i)->is_non_finite());
7636 subranges.push_back(subrange);
7641 subranges, array->get_location()));
7664 (
new typedef_decl(t->get_name(), t->get_underlying_type(),
7665 t->get_location(), t->get_linkage_name(),
7666 t->get_visibility()));
7682qualified_type_def_sptr
7688 qualified_type_def_sptr result
7690 t->get_cv_quals(), t->get_location()));
7702static type_base_sptr
7703clone_typedef_array_qualified_type(type_base_sptr type)
7709 type_base_sptr result;
7718 return type_base_sptr();
7741 type_base_sptr result = clone_typedef_array_qualified_type(t);
7744 type_base_sptr subtree;
7748 clone_typedef_array_qualified_type(type->get_underlying_type());
7752 type->set_underlying_type(subtree);
7758 clone_typedef_array_qualified_type(type->get_element_type());
7762 type->set_element_type(subtree);
7772 clone_typedef_array_qualified_type(t->get_underlying_type());
7779 t->set_underlying_type (s);
7788 clone_typedef_array_qualified_type(t->get_underlying_type());
7795 t->set_underlying_type(s);
7803 type_base_sptr e = t->get_element_type();
7807 clone_typedef_array_qualified_type(e);
7813 t->set_element_type(s);
7832 ::qualified_name_setter setter;
7840update_qualified_name(decl_base_sptr d)
7841{
return update_qualified_name(d.get());}
7861{
return reinterpret_cast<size_t>(l);}
7863struct scope_decl::priv
7908{
return priv_->canonical_types_;}
7926 if (priv_->sorted_canonical_types_.empty())
7928 for (canonical_type_sptr_set_type::const_iterator e =
7932 priv_->sorted_canonical_types_.push_back(*e);
7934 type_topo_comp comp;
7935 std::stable_sort(priv_->sorted_canonical_types_.begin(),
7936 priv_->sorted_canonical_types_.end(),
7939 return priv_->sorted_canonical_types_;
7949{
return priv_->members_;}
7958{
return priv_->members_;}
7968 decl_topo_comp comp;
7969 if (priv_->sorted_members_.empty())
7974 priv_->sorted_members_.push_back(*i);
7976 std::stable_sort(priv_->sorted_members_.begin(),
7977 priv_->sorted_members_.end(),
7980 return priv_->sorted_members_;
7995 if (t->get_is_anonymous())
8013 if (t->get_is_anonymous())
8031 if (t->get_is_anonymous())
8042{
return priv_->member_scopes_;}
8049{
return priv_->member_scopes_;}
8071maybe_set_translation_unit(
const decl_base_sptr& decl,
8086 decl->set_translation_unit(tu);
8103 member->set_scope(
this);
8104 priv_->members_.push_back(member);
8106 priv_->member_types_.push_back(
is_type(member));
8109 priv_->member_scopes_.push_back(m);
8111 update_qualified_name(member);
8114 maybe_set_translation_unit(member, tu);
8126{
return priv_->member_types_;}
8141 return type_base_sptr();
8151 declarations::iterator before)
8157 priv_->member_types_.push_back(t);
8193 for (
auto i = priv_->member_types_.begin();
8194 i != priv_->member_types_.end();
8199 priv_->member_types_.erase(i);
8212 if (priv_->sorted_member_types_.empty())
8215 priv_->sorted_member_types_.push_back(t);
8217 type_topo_comp comp;
8218 std::stable_sort(priv_->sorted_member_types_.begin(),
8219 priv_->sorted_member_types_.end(),
8222 return priv_->sorted_member_types_;
8238 declarations::iterator before)
8242 member->set_scope(
this);
8243 priv_->members_.insert(before, member);
8246 priv_-> member_scopes_.push_back(m);
8248 update_qualified_name(member);
8251 maybe_set_translation_unit(member, tu);
8264 for (declarations::iterator i = priv_->members_.begin();
8265 i != priv_->members_.end();
8270 priv_->members_.erase(i);
8280 for (scopes::iterator i = priv_->member_scopes_.begin();
8281 i != priv_->member_scopes_.end();
8286 priv_->member_scopes_.erase(i);
8292 member->set_scope(
nullptr);
8293 member->set_translation_unit(
nullptr);
8305 return hash_scope(
this);
8332 if (!l.decl_base::operator==(r))
8341 scope_decl::declarations::const_iterator i, j;
8383 return equals(*
this, *other, 0);
8398 if (l.get() == r.get())
8424 declarations::iterator& i)
8439 if ((*it).get() == decl)
8459 declarations::iterator& i)
8476 if (v.visit_begin(
this))
8479 for (scope_decl::declarations::const_iterator i =
8483 if (!(*i)->traverse(v))
8487 return v.visit_end(
this);
8490scope_decl::~scope_decl()
8505 if (scope && decl && !decl->
get_scope())
8545 scope_decl::declarations::iterator before,
8548 if (scope && decl && !decl->
get_scope())
8567 scope_decl::declarations::iterator before,
8577 | ABSTRACT_DECL_BASE
8578 | ABSTRACT_SCOPE_DECL),
8581 translation_unit_(tu)
8583 runtime_type_instance(
this);
8602 return scope ?
dynamic_cast<global_scope*
> (scope) : 0;
8709 if (cv_quals & qualified_type_def::CV_RESTRICT)
8711 if (cv_quals & qualified_type_def::CV_CONST)
8717 if (cv_quals & qualified_type_def::CV_VOLATILE)
8769{
return get_name(tod.get(), qualified);}
8787 string qualified_name;
8791 if (qualified_name.empty())
8792 qualified_name = name;
8794 qualified_name = qualified_name +
"::" + name;
8796 return qualified_name;
8831 location loc = decl->get_location();
8835 if (c->get_is_declaration_only() && c->get_definition_of_declaration())
8838 loc = c->get_location();
8896has_generic_anonymous_internal_type_name(
const decl_base *d)
8913static interned_string
8914get_generic_anonymous_internal_type_name(
const decl_base *d)
8916 ABG_ASSERT(has_generic_anonymous_internal_type_name(d));
8918 const environment&env = d->get_environment();
8920 interned_string result;
8953get_internal_integral_type_name(
const type_base* t)
8961 integral_type int_type;
8963 name = int_type.to_string(
true);
9003 r += get_generic_anonymous_internal_type_name(d);
9013 return env.
intern(get_internal_integral_type_name(t));
9022 internal, qualified));
9061 bool qualified,
bool internal)
9064 string tn =
get_type_name(pointed_to_type, qualified, internal);
9083 bool lvalue_reference,
9084 bool qualified,
bool internal)
9088 string name =
get_type_name(pointed_to_type, qualified, internal);
9089 if (lvalue_reference)
9114 bool qualified,
bool internal)
9116 const environment& env = underlying_type->get_environment();
9119 string name =
get_type_name(underlying_type, qualified, internal);
9121 if (quals_repr.empty() && internal)
9133 if (!quals_repr.empty())
9142 name = quals_repr +
" " + name;
9199 std::ostringstream o;
9204 type_base_sptr return_type =
9211 stream_pretty_representation_of_fn_parms(fn_type, o,
9214 return env.
intern(o.str());
9233 c->get_exported_decls_builder();
9234 if (b->fn_id_maps_to_several_fns(fn))
9290 std::ostringstream o;
9295 type_base_sptr return_type =
9302 o << return_type->get_cached_pretty_representation(internal);
9311 o <<
" (" << class_type->get_qualified_name(internal) <<
"::*) ";
9312 stream_pretty_representation_of_fn_parms(fn_type, o,
9316 return env.
intern(o.str());
9482 std::ostringstream o;
9500 std::ostringstream o;
9555 const string& indent,
9558 bool qualified_names)
9561 string local_indent =
" ";
9566 if (!internal && clazz->is_struct())
9572 repr = indent +
"union";
9590 for (class_or_union::data_members::const_iterator dm = dmems.begin();
9594 if (dm != dmems.begin())
9599 real_indent =
"\n" + indent + local_indent;
9606 real_indent, one_line, internal, qualified_names);
9611 if (dm != dmems.begin())
9612 repr += real_indent;
9613 repr += (*dm)->get_pretty_representation(internal,
9618 real_indent+ (*dm)->get_pretty_representation(internal,
9627 repr += indent +
"}";
9650 const string& indent,
9653 bool qualified_names)
9657 internal, qualified_names);
9679 const string& indent,
9682 bool qualified_names)
9711 const string& indent,
bool one_line,
9712 bool qualified_names)
9715 std::ostringstream o;
9716 string local_indent =
" ";
9718 repr = indent +
"enum ";
9721 o << (qualified_names
9735 o << enumerator.get_name() +
"=" << enumerator.get_value() <<
", ";
9739 o <<
"\n" + indent <<
"}";
9770 const string& indent,
bool one_line,
9771 bool qualified_names)
9777 one_line, qualified_names);
9802 const string& indent,
bool one_line,
9803 bool qualified_names)
9832 const string& indent,
9835 bool qualified_name)
9841 internal, qualified_name);
9869 std::ostringstream o;
9884 o <<
" :" << std::endl;
9888 if (b->get_is_virtual())
9890 o << b->get_base_class()->get_qualified_name()
9900 <<
" // @: " << std::hex <<
is_type(c)
9906 type_base_sptr t = m->get_type();
9910 << m->get_pretty_representation(
false,
9914 if (t && t->get_canonical_type())
9915 o <<
" // uses canonical type '@"
9916 << std::hex << t->get_canonical_type().get() << std::dec;
9918 o <<
"'" << std::endl;
9923 o <<
" // virtual member functions\n\n";
9925 o <<
" " << f->get_pretty_representation(
false,
9927 <<
";" << std::endl;
9930 o <<
"};" << std::endl;
9936 string name = e->get_qualified_name();
9937 std::ostringstream o;
9938 o <<
"enum " << name
9940 << e->get_underlying_type()->get_pretty_representation(
false,
9944 <<
" // size in bits: " << e->get_size_in_bits() <<
"\n"
9945 <<
" // is-declaration-only: " << e->get_is_declaration_only() <<
"\n"
9947 <<
" // translation unit: "
9948 << e->get_translation_unit()->get_absolute_path() <<
"\n"
9949 <<
" // @: " << std::hex <<
is_type(e)
9950 <<
", @canonical: " << e->get_canonical_type().get() << std::dec
9953 for (
const auto &enom : e->get_enumerators())
9954 o <<
" " << enom.get_name() <<
" = " << enom.get_value() <<
",\n";
9960 return artifact->get_pretty_representation(
true,
10059 return const_cast<type_base*
>(artifact);
10076 return const_cast<decl_base*
>(artifact);
10106debug_comp_vec(
const vector<const type_base*>& vect, std::ostringstream& o)
10108 for (
auto t : vect)
10110 o <<
"|" << t->get_pretty_representation()
10111 <<
"@" << std::hex << t << std::dec;
10123print_comp_stack(
const environment& env)
10125 std::ostringstream o;
10126 o <<
"left-operands: ";
10127 debug_comp_vec(env.priv_->left_type_comp_operands_, o);
10128 o <<
"\n" <<
"right-operands: ";
10129 debug_comp_vec(env.priv_->right_type_comp_operands_, o);
10142 std::cerr << print_comp_stack(env);
10143 std::cerr << std::endl;
10175{
return dynamic_cast<const decl_base*
>(t);}
10193{
return dynamic_pointer_cast<decl_base>(t);}
10209 const type_base_sptr type2)
10211 if (!type1 || !type2)
10214 if (type1 == type2)
10247 const decl_base_sptr d2)
10385 const string& name)
10390 if (!containing_class_or_union)
10407{
return (decl &&
dynamic_cast<template_decl*
>(decl->get_scope()));}
10417 return (decl && (dynamic_pointer_cast<type_tparameter>(decl)
10418 || dynamic_pointer_cast<non_type_tparameter>(decl)
10419 || dynamic_pointer_cast<template_tparameter>(decl)));
10449{
return dynamic_pointer_cast<function_decl>(d);}
10472{
return dynamic_pointer_cast<function_decl::parameter>(tod);}
10483 if (d && (d->
kind() & type_or_decl_base::ABSTRACT_DECL_BASE))
10485 if (!(d->
kind() & type_or_decl_base::ABSTRACT_TYPE_BASE))
10511{
return dynamic_pointer_cast<decl_base>(d);}
10533{
return dynamic_pointer_cast<decl_base>(t);}
10543 if (
dynamic_cast<const type_base*
>(&tod))
10556 if (t && (t->
kind() & type_or_decl_base::ABSTRACT_TYPE_BASE))
10570{
return dynamic_pointer_cast<type_base>(tod);}
10602 if (!cou->get_naming_typedef())
10644{
return dynamic_cast<const type_decl*
>(t);}
10652{
return dynamic_pointer_cast<type_decl>(t);}
10702{
return dynamic_pointer_cast<typedef_decl>(t);}
10783{
return dynamic_pointer_cast<enum_type_decl>(d);}
10837 if (t->
kind() & type_or_decl_base::CLASS_TYPE)
10851{
return dynamic_pointer_cast<class_decl>(d);}
10873 if (array->is_non_finite())
10943 if (array->get_subranges().size() == 1
10944 && array->get_subranges()[0]->get_length() == 1)
11014 return klass->get_is_declaration_only();
11063shared_ptr<class_or_union>
11065{
return dynamic_pointer_cast<class_or_union>(t);}
11094 const class_or_union_sptr& second)
11124{
return dynamic_pointer_cast<union_decl>(t);}
11138 bool look_through_qualifiers)
11144 if (look_through_qualifiers)
11162 bool look_through_qualifiers)
11164 type_base_sptr type =
is_type(t);
11165 if (look_through_qualifiers)
11167 return dynamic_pointer_cast<pointer_type_def>(type);
11310 bool look_through_qualifiers)
11316 if (look_through_qualifiers)
11333 bool look_through_qualifiers)
11337 if (look_through_qualifiers)
11354 bool look_through_qualifiers)
11356 type_base_sptr type =
is_type(t);
11357 if (look_through_qualifiers)
11359 return dynamic_pointer_cast<reference_type_def>(type);
11370 bool look_through_qualifiers)
11373 if (look_through_qualifiers)
11390 bool look_through_qualifiers)
11392 type_base_sptr type =
is_type(t);
11393 if (look_through_qualifiers)
11395 return dynamic_pointer_cast<ptr_to_mbr_type>(type);
11469const type_base_sptr
11472 type_base_sptr nil;
11476 if (t->get_environment().get_void_pointer_type().get() == t.get())
11505qualified_type_def_sptr
11507{
return dynamic_pointer_cast<qualified_type_def>(t);}
11517{
return dynamic_pointer_cast<function_type>(t);}
11547{
return dynamic_pointer_cast<method_type>(t);}
11627 decl_base_sptr decl;
11634 while (decl->get_is_declaration_only()
11635 && decl->get_definition_of_declaration())
11636 decl = decl->get_definition_of_declaration();
11703 decl_base_sptr d =
is_decl(t);
11728{
return dynamic_pointer_cast<var_decl>(decl);}
11737{
return dynamic_pointer_cast<namespace_decl>(d);}
11771 && dynamic_pointer_cast<function_decl>(decl)
11782 bool look_through_qualifiers)
11786 if (look_through_qualifiers)
11798 bool look_through_qualifiers)
11800 type_base_sptr t =
is_type(type);
11802 if (look_through_qualifiers)
11804 return dynamic_pointer_cast<array_type_def>(t);
11813qualified_type_def_sptr
11817 return qualified_type_def_sptr();
11872array_type_def::subrange_type*
11887{
return dynamic_pointer_cast<array_type_def::subrange_type>(type);}
11897{
return decl && dynamic_pointer_cast<template_decl>(decl);}
11903 LOOKUP_ENTITY_TYPE,
11935find_next_delim_in_cplus_type(
const string& fqn,
11939 int angle_count = 0;
11940 bool found =
false;
11942 for (; i < fqn.size(); ++i)
11946 else if (fqn[i] ==
'>')
11948 else if (i + 1 < fqn.size()
11951 && fqn[i+1] ==
':')
11968 list<string>& comps)
11970 string::size_type fqn_size = fqn.size(), comp_begin = 0, comp_end = fqn_size;
11973 if (!find_next_delim_in_cplus_type(fqn, comp_begin, comp_end))
11974 comp_end = fqn_size;
11976 string comp = fqn.substr(comp_begin, comp_end - comp_begin);
11977 comps.push_back(comp);
11979 comp_begin = comp_end + 2;
11980 if (comp_begin >= fqn_size)
11996 for (list<string>::const_iterator c = comps.begin();
11999 if (c == comps.begin())
12002 result +=
"::" + *c;
12017template<
typename T>
12019iterator_is_last(T& container,
12020 typename T::const_iterator i)
12022 typename T::const_iterator next = i;
12024 return (next == container.end());
12041lookup_types_in_map(
const interned_string& type_name,
12044 istring_type_base_wptrs_map_type::const_iterator i = type_map.find(type_name);
12045 if (i != type_map.end())
12066template <
class TypeKind>
12067static shared_ptr<TypeKind>
12068lookup_type_in_map(
const interned_string& type_name,
12071 istring_type_base_wptrs_map_type::const_iterator i = type_map.find(type_name);
12072 if (i != type_map.end())
12076 for (
auto j : i->second)
12078 type_base_sptr t(j);
12079 decl_base_sptr d =
is_decl(t);
12080 if (d && !d->get_is_declaration_only())
12081 return dynamic_pointer_cast<TypeKind>(type_base_sptr(j));
12086 return dynamic_pointer_cast<TypeKind>(type_base_sptr(i->second.back()));
12088 return shared_ptr<TypeKind>();
12105 return lookup_type_in_map<type_decl>(type_name,
12164 return lookup_type_in_map<class_decl>(type_name,
12182 return lookup_type_in_map<union_decl>(type_name,
12217 union_decl_sptr result = lookup_type_in_map<union_decl>(loc, m);
12250 return lookup_type_in_map<enum_type_decl>(type_name,
12289 return lookup_type_in_map<typedef_decl>(type_name,
12325qualified_type_def_sptr
12330 return lookup_type_in_map<qualified_type_def>(type_name,
12349qualified_type_def_sptr
12376 return lookup_type_in_map<pointer_type_def>(type_name,
12438 return lookup_type_in_map<reference_type_def>(type_name,
12457 bool lvalue_reference,
12482 return lookup_type_in_map<array_type_def>(type_name,
12502 return lookup_type_in_map<function_type>(type_name,
12548const type_base_sptr
12552 type_base_sptr result;
12591const type_base_sptr
12615const type_base_sptr
12619 list<string> comps;
12632const decl_base_sptr
12636 list<string> comps;
12652template<
typename NodeKind>
12664{
return node->get_name();}
12684{
return node->get_name();}
12693template<
typename NodeKind>
12694static decl_base_sptr
12695convert_node_to_decl(shared_ptr<NodeKind> node);
12708template<
typename NodeKind>
12710lookup_node_in_scope(
const list<string>& fqn,
12714 shared_ptr<NodeKind> node;
12715 bool it_is_last =
false;
12718 for (list<string>::const_iterator c = fqn.begin(); c != fqn.end(); ++c)
12721 it_is_last = iterator_is_last(fqn, c);
12722 for (scope_decl::declarations::const_iterator m =
12723 cur_scope->get_member_decls().begin();
12724 m != cur_scope->get_member_decls().end();
12730 scope = dynamic_pointer_cast<scope_decl>(*m);
12731 if (scope && scope->get_name() == *c)
12740 node = dynamic_pointer_cast<NodeKind>(*m);
12744 dynamic_pointer_cast<class_decl>(node))
12745 if (cl->get_is_declaration_only()
12746 && !cl->get_definition_of_declaration())
12748 resulting_decl = node;
12753 if (!new_scope && !resulting_decl)
12754 return decl_base_sptr();
12755 cur_scope = new_scope;
12758 return resulting_decl;
12779const type_base_sptr
12782{
return is_type(lookup_node_in_scope<type_base>(comps, scope));}
12806static const type_base_sptr
12808 const vector<scope_decl*>& access_path,
12811 vector<scope_decl*> a = access_path;
12812 type_base_sptr result;
12817 first_scope = a.back();
12825 for (scope_decl::declarations::const_iterator i =
12829 if (
is_type(*i) && (*i)->get_name() == n)
12837 first_scope = a.back();
12838 interned_string scope_name, cur_scope_name = first_scope->
get_name();
12839 for (scope_decl::scopes::const_iterator i =
12844 scope_name = (*i)->get_name();
12845 if (scope_name == cur_scope_name)
12871static const type_base_sptr
12873 const scope_decl* scope)
12876 return type_base_sptr();
12880 vector<scope_decl*> access_path;
12881 for (scope_decl* s = type_decl->get_scope(); s != 0; s = s->get_scope())
12883 access_path.push_back(s);
12909const type_base_sptr
12924const decl_base_sptr
12927{
return is_var_decl(lookup_node_in_scope<var_decl>(comps, skope));}
12940template<
typename NodeKind>
12942lookup_node_in_translation_unit(
const list<string>& fqn,
12960{
return is_type(lookup_node_in_translation_unit<type_base>(fqn, tu));}
12980{
return is_class_type(lookup_node_in_translation_unit<class_decl>(fqn, tu));}
12993lookup_basic_type_through_translation_units(
const interned_string& type_name,
12994 const corpus& abi_corpus)
12998 for (translation_units::const_iterator tu =
13018static union_decl_sptr
13019lookup_union_type_through_translation_units(
const interned_string& type_name,
13020 const corpus & abi_corpus)
13022 union_decl_sptr result;
13024 for (translation_units::const_iterator tu =
13025 abi_corpus.get_translation_units().begin();
13026 tu != abi_corpus.get_translation_units().end();
13045lookup_enum_type_through_translation_units(
const interned_string& type_name,
13046 const corpus & abi_corpus)
13050 for (translation_units::const_iterator tu =
13051 abi_corpus.get_translation_units().begin();
13052 tu != abi_corpus.get_translation_units().end();
13069lookup_typedef_type_through_translation_units(
const interned_string& type_name,
13070 const corpus & abi_corpus)
13074 for (translation_units::const_iterator tu =
13075 abi_corpus.get_translation_units().begin();
13076 tu != abi_corpus.get_translation_units().end();
13093static qualified_type_def_sptr
13094lookup_qualified_type_through_translation_units(
const interned_string& t_name,
13095 const corpus & abi_corpus)
13097 qualified_type_def_sptr result;
13099 for (translation_units::const_iterator tu =
13100 abi_corpus.get_translation_units().begin();
13101 tu != abi_corpus.get_translation_units().end();
13119lookup_pointer_type_through_translation_units(
const interned_string& type_name,
13120 const corpus & abi_corpus)
13124 for (translation_units::const_iterator tu =
13125 abi_corpus.get_translation_units().begin();
13126 tu != abi_corpus.get_translation_units().end();
13144lookup_reference_type_through_translation_units(
const interned_string& t_name,
13145 const corpus & abi_corpus)
13149 for (translation_units::const_iterator tu =
13150 abi_corpus.get_translation_units().begin();
13151 tu != abi_corpus.get_translation_units().end();
13169lookup_array_type_through_translation_units(
const interned_string& type_name,
13170 const corpus & abi_corpus)
13174 for (translation_units::const_iterator tu =
13175 abi_corpus.get_translation_units().begin();
13176 tu != abi_corpus.get_translation_units().end();
13194lookup_function_type_through_translation_units(
const interned_string& type_name,
13195 const corpus & abi_corpus)
13199 for (translation_units::const_iterator tu =
13200 abi_corpus.get_translation_units().begin();
13201 tu != abi_corpus.get_translation_units().end();
13219 const corpus& abi_corpus)
13221 type_base_sptr result;
13223 for (translation_units::const_iterator tu =
13244 const string& tu_path,
13247 string_tu_map_type::const_iterator i = corp.priv_->path_tu_map.find(tu_path);
13248 if (i == corp.priv_->path_tu_map.end())
13249 return type_base_sptr();
13278 for (translation_units::const_iterator i =
13324 result = lookup_type_in_map<type_decl>(qualified_name, m);
13326 result = lookup_basic_type_through_translation_units(qualified_name, corp);
13346 result = lookup_type_in_map<type_decl>(loc, m);
13437 class_decl_sptr result = lookup_type_in_map<class_decl>(qualified_name, m);
13455 return lookup_types_in_map(qualified_name, m);
13481 for (
auto type : *v)
13483 type_base_sptr t(type);
13485 if (c->get_is_declaration_only()
13486 && !c->get_definition_of_declaration())
13487 result.push_back(type);
13490 return !result.empty();
13506 return lookup_types_in_map(qualified_name, m);
13587 union_decl_sptr result = lookup_type_in_map<union_decl>(type_name, m);
13589 result = lookup_union_type_through_translation_units(type_name, corp);
13668 lookup_type_in_map<enum_type_decl>(qualified_name, m);
13670 result = lookup_enum_type_through_translation_units(qualified_name, corp);
13688 return lookup_types_in_map(qualified_name, m);
13793 lookup_type_in_map<typedef_decl>(qualified_name, m);
13795 result = lookup_typedef_type_through_translation_units(qualified_name,
13890qualified_type_def_sptr
13905qualified_type_def_sptr
13911 qualified_type_def_sptr result =
13912 lookup_type_in_map<qualified_type_def>(qualified_name, m);
13915 result = lookup_qualified_type_through_translation_units(qualified_name,
13957 lookup_type_in_map<pointer_type_def>(qualified_name, m);
13959 result = lookup_pointer_type_through_translation_units(qualified_name,
14007 lookup_type_in_map<reference_type_def>(qualified_name, m);
14009 result = lookup_reference_type_through_translation_units(qualified_name,
14056 lookup_type_in_map<array_type_def>(qualified_name, m);
14058 result = lookup_array_type_through_translation_units(qualified_name, corp);
14127 lookup_type_in_map<function_type>(qualified_name, m);
14129 result = lookup_function_type_through_translation_units(qualified_name,
14152 type_base_sptr result;
14185 type_base_sptr result;
14233 return type_base_sptr();
14250template<
typename TypeKind>
14254 bool use_type_name_as_key =
true)
14258 if (use_type_name_as_key)
14260 else if (
location l = type->get_location())
14262 string str = l.expand();
14263 s = type->get_environment().intern(str);
14266 istring_type_base_wptrs_map_type::iterator i = types_map.find(s);
14267 bool result =
false;
14269 if (i == types_map.end())
14271 types_map[s].push_back(type);
14275 i->second.push_back(type);
14296 bool use_type_name_as_key)
14300 bool update_qname_map =
true;
14301 if (type->get_is_declaration_only())
14307 is_class_type(class_type->get_definition_of_declaration()))
14311 if (!update_qname_map)
14315 if (use_type_name_as_key)
14317 string qname = type->get_qualified_name();
14318 s = type->get_environment().intern(qname);
14320 else if (
location l = type->get_location())
14322 string str = l.expand();
14323 s = type->get_environment().intern(str);
14326 bool result =
false;
14327 istring_type_base_wptrs_map_type::iterator i = map.find(s);
14328 if (i == map.end())
14330 map[s].push_back(type);
14334 i->second.push_back(type);
14360 bool result =
false;
14362 istring_type_base_wptrs_map_type::iterator i = types_map.find(s);
14363 if (i == types_map.end())
14365 types_map[s].push_back(type);
14369 i->second.push_back(type);
14389 maybe_update_types_lookup_map<type_decl>
14392 if (
corpus *type_corpus = basic_type->get_corpus())
14394 maybe_update_types_lookup_map<type_decl>
14396 type_corpus->priv_->get_types().basic_types());
14398 maybe_update_types_lookup_map<type_decl>
14400 type_corpus->get_type_per_loc_map().basic_types(),
14405 maybe_update_types_lookup_map<type_decl>
14407 group->priv_->get_types().basic_types());
14409 maybe_update_types_lookup_map<type_decl>
14411 group->get_type_per_loc_map().basic_types(),
14436 if (
corpus *type_corpus = class_type->get_corpus())
14440 type_corpus->priv_->get_types().class_types());
14444 type_corpus->get_type_per_loc_map().class_types(),
14451 group->priv_->get_types().class_types());
14455 group->get_type_per_loc_map().class_types(),
14476 maybe_update_types_lookup_map<union_decl>
14479 if (
corpus *type_corpus = union_type->get_corpus())
14481 maybe_update_types_lookup_map<union_decl>
14483 type_corpus->priv_->get_types().union_types());
14485 maybe_update_types_lookup_map<union_decl>
14487 type_corpus->get_type_per_loc_map().union_types(),
14492 maybe_update_types_lookup_map<union_decl>
14494 group->priv_->get_types().union_types());
14496 maybe_update_types_lookup_map<union_decl>
14498 group->get_type_per_loc_map().union_types(),
14519 maybe_update_types_lookup_map<enum_type_decl>
14522 if (
corpus *type_corpus = enum_type->get_corpus())
14524 maybe_update_types_lookup_map<enum_type_decl>
14526 type_corpus->priv_->get_types().enum_types());
14528 maybe_update_types_lookup_map<enum_type_decl>
14530 type_corpus->get_type_per_loc_map().enum_types(),
14535 maybe_update_types_lookup_map<enum_type_decl>
14537 group->priv_->get_types().enum_types());
14539 maybe_update_types_lookup_map<enum_type_decl>
14541 group->get_type_per_loc_map().enum_types(),
14563 maybe_update_types_lookup_map<typedef_decl>
14566 if (
corpus *type_corpus = typedef_type->get_corpus())
14568 maybe_update_types_lookup_map<typedef_decl>
14570 type_corpus->priv_->get_types().typedef_types());
14572 maybe_update_types_lookup_map<typedef_decl>
14574 type_corpus->get_type_per_loc_map().typedef_types(),
14579 maybe_update_types_lookup_map<typedef_decl>
14581 group->priv_->get_types().typedef_types());
14583 maybe_update_types_lookup_map<typedef_decl>
14585 group->get_type_per_loc_map().typedef_types(),
14606 maybe_update_types_lookup_map<qualified_type_def>
14609 if (
corpus *type_corpus = qualified_type->get_corpus())
14611 maybe_update_types_lookup_map<qualified_type_def>
14613 type_corpus->priv_->get_types().qualified_types());
14617 maybe_update_types_lookup_map<qualified_type_def>
14619 group->priv_->get_types().qualified_types());
14639 maybe_update_types_lookup_map<pointer_type_def>
14642 if (
corpus *type_corpus = pointer_type->get_corpus())
14644 maybe_update_types_lookup_map<pointer_type_def>
14646 type_corpus->priv_->get_types().pointer_types());
14650 maybe_update_types_lookup_map<pointer_type_def>
14652 group->priv_->get_types().pointer_types());
14672 maybe_update_types_lookup_map<ptr_to_mbr_type>
14675 if (
corpus *type_corpus = ptr_to_member->get_corpus())
14677 maybe_update_types_lookup_map<ptr_to_mbr_type>
14679 type_corpus->priv_->get_types().ptr_to_mbr_types());
14683 maybe_update_types_lookup_map<ptr_to_mbr_type>
14685 group->priv_->get_types().ptr_to_mbr_types());
14705 maybe_update_types_lookup_map<reference_type_def>
14708 if (
corpus *type_corpus = reference_type->get_corpus())
14710 maybe_update_types_lookup_map<reference_type_def>
14712 type_corpus->priv_->get_types().reference_types());
14716 maybe_update_types_lookup_map<reference_type_def>
14718 group->priv_->get_types().reference_types());
14738 maybe_update_types_lookup_map<array_type_def>
14741 if (
corpus *type_corpus = array_type->get_corpus())
14743 maybe_update_types_lookup_map<array_type_def>
14745 type_corpus->priv_->get_types().array_types());
14747 maybe_update_types_lookup_map<array_type_def>
14749 type_corpus->get_type_per_loc_map().array_types(),
14754 maybe_update_types_lookup_map<array_type_def>
14756 group->priv_->get_types().array_types());
14758 maybe_update_types_lookup_map<array_type_def>
14760 group->get_type_per_loc_map().array_types(),
14782 maybe_update_types_lookup_map<array_type_def::subrange_type>
14785 if (
corpus *type_corpus = subrange_type->get_corpus())
14787 maybe_update_types_lookup_map<array_type_def::subrange_type>
14789 type_corpus->priv_->get_types().subrange_types());
14791 maybe_update_types_lookup_map<array_type_def::subrange_type>
14793 type_corpus->get_type_per_loc_map().subrange_types(),
14796 if (
corpus *group = subrange_type->get_corpus())
14798 maybe_update_types_lookup_map<array_type_def::subrange_type>
14800 group->priv_->get_types().subrange_types());
14802 maybe_update_types_lookup_map<array_type_def::subrange_type>
14804 group->get_type_per_loc_map().subrange_types(),
14829 if (
corpus *type_corpus = fn_type->get_corpus())
14833 type_corpus->priv_->get_types().function_types());
14835 if (
corpus *group = fn_type->get_corpus())
14839 group->priv_->get_types().function_types());
14932 type_base_sptr result;
14940 type_base_sptr underlying_type =
14943 if (underlying_type)
14946 qual->get_cv_quals(),
14947 qual->get_location()));
14952 type_base_sptr pointed_to_type =
14955 if (pointed_to_type)
14958 p->get_size_in_bits(),
14959 p->get_alignment_in_bits(),
14960 p->get_location()));
14965 type_base_sptr pointed_to_type =
14967 if (pointed_to_type)
14971 r->get_size_in_bits(),
14972 r->get_alignment_in_bits(),
14973 r->get_location()));
14987 tu.priv_->synthesized_types_.push_back(result);
15020 type_base_sptr result_return_type;
15025 if (!result_return_type)
15029 type_base_sptr parm_type;
15031 for (function_type::parameters::const_iterator i =
15036 type_base_sptr t = (*i)->get_type();
15043 (*i)->get_location(),
15044 (*i)->get_variadic_marker(),
15045 (*i)->get_is_artificial()));
15046 parms.push_back(parm);
15049 class_or_union_sptr class_type;
15061 result_fn_type.reset(
new method_type(result_return_type,
15073 tu.priv_->synthesized_types_.push_back(result_fn_type);
15077 return result_fn_type;
15088 if (mangled_name.empty())
15093 char * str = abi::__cxa_demangle(mangled_name.c_str(),
15094 NULL, &l, &status);
15095 string demangled_name = mangled_name;
15099 demangled_name = str;
15103 return demangled_name;
15128global_scope::~global_scope()
15133maybe_propagate_canonical_type(
const type_base& lhs_type,
15134 const type_base& rhs_type);
15153types_defined_same_linux_kernel_corpus_public(
const type_base& t1,
15154 const type_base& t2)
15156 const corpus *t1_corpus = t1.get_corpus(), *t2_corpus = t2.get_corpus();
15157 string t1_file_path, t2_file_path;
15161 if (!(t1_corpus && t2_corpus
15162 && t1_corpus == t2_corpus
15163 && (t1_corpus->get_origin() & corpus::LINUX_KERNEL_BINARY_ORIGIN)
15168 class_or_union *c1 = 0, *c2 = 0;
15174 if ((c1 && c1->get_is_anonymous() && !c1->get_naming_typedef())
15175 || (c2 && c2->get_is_anonymous() && !c2->get_naming_typedef()))
15182 && c1->get_is_anonymous() && c1->get_naming_typedef()
15183 && c2->get_is_anonymous() && c2->get_naming_typedef())
15184 if (c1->get_naming_typedef()->get_name()
15185 != c2->get_naming_typedef()->get_name())
15191 if (e1->get_is_anonymous() || e2->get_is_anonymous())
15201 if (c1->get_is_declaration_only() != c2->get_is_declaration_only())
15203 if (c1->get_environment().decl_only_class_equals_definition())
15213 if (t1.get_size_in_bits() != t2.get_size_in_bits())
15222 l = c1->get_location();
15224 l =
dynamic_cast<const decl_base&
>(t1).
get_location();
15226 unsigned line = 0, col = 0;
15228 l.
expand(t1_file_path, line, col);
15230 l = c2->get_location();
15232 l =
dynamic_cast<const decl_base&
>(t2).
get_location();
15234 l.
expand(t2_file_path, line, col);
15237 if (t1_file_path.empty() || t2_file_path.empty())
15240 if (t1_file_path == t2_file_path)
15276compare_types_during_canonicalization(
const type_base& canonical_type,
15277 const type_base& candidate_type)
15279#ifdef WITH_DEBUG_TYPE_CANONICALIZATION
15280 const environment& env = canonical_type.get_environment();
15281 if (env.debug_type_canonicalization_is_on())
15283 bool canonical_equality =
false, structural_equality =
false;
15284 env.priv_->use_canonical_type_comparison_ =
false;
15285 structural_equality = canonical_type == candidate_type;
15286 env.priv_->use_canonical_type_comparison_ =
true;
15287 canonical_equality = canonical_type == candidate_type;
15288 if (canonical_equality != structural_equality)
15290 std::cerr <<
"structural & canonical equality different for type: "
15291 << canonical_type.get_pretty_representation(
true,
true)
15295 return structural_equality;
15298 return canonical_type == candidate_type;
15322compare_canonical_type_against_candidate(
const type_base& canonical_type,
15323 const type_base& candidate_type)
15325 environment& env =
const_cast<environment&
>(canonical_type.get_environment());
15343 bool saved_decl_only_class_equals_definition =
15344 env.decl_only_class_equals_definition();
15345 env.do_on_the_fly_canonicalization(
true);
15348 env.decl_only_class_equals_definition(
false);
15349 env.priv_->allow_type_comparison_results_caching(
true);
15350 bool equal = (types_defined_same_linux_kernel_corpus_public(canonical_type,
15352 || compare_types_during_canonicalization(canonical_type,
15357 env.priv_->clear_type_comparison_results_cache();
15358 env.priv_->allow_type_comparison_results_caching(
false);
15359 env.do_on_the_fly_canonicalization(
false);
15360 env.decl_only_class_equals_definition
15361 (saved_decl_only_class_equals_definition);
15386compare_canonical_type_against_candidate(
const type_base* canonical_type,
15387 const type_base* candidate_type)
15389 return compare_canonical_type_against_candidate(*canonical_type,
15414compare_canonical_type_against_candidate(
const type_base_sptr& canonical_type,
15415 const type_base_sptr& candidate_type)
15417 return compare_canonical_type_against_candidate(canonical_type.get(),
15418 candidate_type.get());
15444type_base::get_canonical_type_for(type_base_sptr t)
15449 environment& env =
const_cast<environment&
>(t->get_environment());
15453 return type_base_sptr();
15459 bool decl_only_class_equals_definition =
15472 if (decl_only_class_equals_definition)
15473 if (class_or_union)
15474 if (class_or_union->get_is_declaration_only())
15475 return type_base_sptr();
15478 if (t->get_canonical_type())
15479 return t->get_canonical_type();
15487 || !class_or_union->get_is_anonymous()
15488 || class_or_union->get_linkage_name().empty());
15500 string repr = t->get_cached_pretty_representation(
true);
15505 type_base_sptr canonical_type_present_in_corpus;
15507 env.get_canonical_types_map();
15509 type_base_sptr result;
15510 environment::canonical_types_map_type::iterator i = types.find(repr);
15511 if (i == types.end())
15513 vector<type_base_sptr> v;
15520 vector<type_base_sptr> &v = i->second;
15527 for (vector<type_base_sptr>::const_reverse_iterator it = v.rbegin();
15531 bool equal = compare_canonical_type_against_candidate(*it, t);
15538#ifdef WITH_DEBUG_SELF_COMPARISON
15539 if (env.self_comparison_debug_is_on())
15543 corpus_sptr corp1, corp2;
15544 env.get_self_comparison_debug_inputs(corp1, corp2);
15545 if (corp1 && corp2 && t->get_corpus() == corp2.get())
15556 check_canonical_type_from_abixml_during_self_comp(t,
15562 uintptr_t should_have_canonical_type = 0;
15563 string type_id = env.get_type_id_from_type(t.get());
15564 if (type_id.empty())
15565 type_id =
"type-id-<not-found>";
15567 should_have_canonical_type =
15568 env.get_canonical_type_from_type_id(type_id.c_str());
15569 std::cerr <<
"error: wrong canonical type for '"
15578 <<
"'. Should have had canonical type: "
15580 << should_have_canonical_type
15586 uintptr_t ptr_val =
reinterpret_cast<uintptr_t
>(t.get());
15587 string type_id = env.get_type_id_from_pointer(ptr_val);
15588 if (type_id.empty())
15589 type_id =
"type-id-<not-found>";
15606 std::cerr <<
"error: wrong induced canonical type for '"
15608 <<
"' from second corpus"
15609 <<
", ptr: " << std::hex << t.get()
15610 <<
" type-id: " << type_id
15649maybe_adjust_canonical_type(
const type_base_sptr& canonical,
15650 const type_base_sptr& type)
15652 if (type->get_naked_canonical_type())
15659 if (canonical_class
15660 && canonical_class.get() != cl.get())
15664 for (class_decl::member_functions::const_iterator i =
15665 cl->get_member_functions().begin();
15666 i != cl->get_member_functions().end();
15668 if ((*i)->get_symbol())
15671 find_member_function((*i)->get_linkage_name()))
15674 if (s1 && !m->get_symbol())
15687 method_decl_sptr method =
15706 canonical_class = cl;
15709 if (canonical_class)
15711 if (
auto abi_corpus = canonical_class->get_corpus())
15713 for (
auto& fn : canonical_class->get_member_functions())
15718 fn->set_is_in_public_symbol_table(
true);
15719 auto b = abi_corpus->get_exported_decls_builder();
15720 b->maybe_add_fn_to_exported_fns(fn.get());
15732 if (type->get_is_artificial() != canonical->get_is_artificial())
15733 canonical->set_is_artificial(
false);
15757 if (t->get_canonical_type())
15758 return t->get_canonical_type();
15760 if (t->get_environment().priv_->do_log())
15761 std::cerr <<
"Canonicalization of type '"
15762 << t->get_pretty_representation(
true,
true)
15763 <<
"/@#" << std::hex << t.get() <<
": ";
15767 if (t->get_environment().priv_->do_log())
15769 type_base_sptr canonical = type_base::get_canonical_type_for(t);
15771 if (t->get_environment().priv_->do_log())
15774 if (t->get_environment().priv_->do_log())
15775 std::cerr << tmr <<
"\n";
15777 maybe_adjust_canonical_type(canonical, t);
15779 t->priv_->canonical_type = canonical;
15780 t->priv_->naked_canonical_type = canonical.get();
15794 ABG_ASSERT(!t->priv_->canonical_type_propagated()
15795 || t->priv_->propagated_canonical_type_confirmed());
15798 if (type_base_sptr d =
is_type(cl->get_earlier_declaration()))
15799 if ((canonical = d->get_canonical_type()))
15801 d->priv_->canonical_type = canonical;
15802 d->priv_->naked_canonical_type = canonical.get();
15819 if (type_base_sptr c =
is_type(scope)->get_canonical_type())
15833#ifdef WITH_DEBUG_CT_PROPAGATION
15842 env.priv_->erase_type_with_cleared_propagated_canonical_type(t.get());
15846 t->on_canonical_type_set();
15857 priv_->definition_of_declaration_ = d;
15859 if (type_base_sptr canonical_type =
is_type(d)->get_canonical_type())
15860 t->priv_->canonical_type = canonical_type;
15862 priv_->naked_definition_of_declaration_ =
const_cast<decl_base*
>(d.get());
15872 priv_(new
priv(s, a))
15884{
return priv_->canonical_type.lock();}
15900{
return priv_->naked_canonical_type;}
15925 return priv_->internal_cached_repr_;
15934 return priv_->cached_repr_;
15972{
return equals(*
this, other, 0);}
15989{priv_->size_in_bits = s;}
15996{
return priv_->size_in_bits;}
16003{priv_->alignment_in_bits = a;}
16010{
return priv_->alignment_in_bits;}
16026 v.visit_begin(
this);
16027 bool result = v.visit_end(
this);
16033type_base::~type_base()
16052 static_cast<unsigned>(r));
16067 static_cast<unsigned>(r));
16124parse_integral_type_modifier(
const string& word,
16127 if (word ==
"signed")
16129 else if (word ==
"unsigned")
16131 else if (word ==
"short")
16133 else if (word ==
"long")
16135 else if (word ==
"long long")
16153parse_base_integral_type(
const string& type_name,
16156 if (type_name ==
"int")
16158 else if (type_name ==
"char")
16160 else if (type_name ==
"bool" || type_name ==
"_Bool")
16162 else if (type_name ==
"double")
16164 else if (type_name ==
"float")
16166 else if (type_name ==
"char16_t")
16168 else if (type_name ==
"char32_t")
16170 else if (type_name ==
"wchar_t")
16195 string input = type_name;
16196 string::size_type len = input.length();
16197 string::size_type cur_pos = 0, prev_pos = 0;
16198 string cur_word, prev_word;
16201 while (cur_pos < len)
16203 if (cur_pos < len && isspace(input[cur_pos]))
16206 while (cur_pos < len && isspace(input[cur_pos]));
16208 prev_pos = cur_pos;
16209 cur_pos = input.find(
' ', prev_pos);
16210 prev_word = cur_word;
16211 cur_word = input.substr(prev_pos, cur_pos - prev_pos);
16214 && cur_word ==
"long"
16215 && prev_word !=
"long")
16217 if (cur_pos < len && isspace(input[cur_pos]))
16220 while (cur_pos < len && isspace(input[cur_pos]));
16221 prev_pos = cur_pos;
16223 cur_pos = input.find(
' ', prev_pos);
16224 string saved_prev_word = prev_word;
16225 prev_word = cur_word;
16226 cur_word = input.substr(prev_pos, cur_pos - prev_pos);
16227 if (cur_word ==
"long")
16228 cur_word =
"long long";
16231 cur_pos = prev_pos;
16232 cur_word = prev_word;
16233 prev_word = saved_prev_word;
16237 if (!parse_integral_type_modifier(cur_word, modifiers))
16239 if (!parse_base_integral_type(cur_word, base))
16277 : base_(INT_BASE_TYPE),
16278 modifiers_(NO_MODIFIER)
16287 : base_(b), modifiers_(m)
16295 : base_(INT_BASE_TYPE),
16296 modifiers_(NO_MODIFIER)
16314{
return modifiers_;}
16331{
return base_ == other.base_ && modifiers_ == other.modifiers_;}
16349 result +=
"signed ";
16351 result +=
"unsigned ";
16362 result +=
"short ";
16366 result +=
"long long ";
16377 result +=
"double";
16381 result +=
"char16_t";
16383 result +=
"char32_t";
16385 result +=
"wchar_t";
16395integral_type::operator string()
const
16396{
return to_string();}
16419 const string& name,
16420 size_t size_in_bits,
16421 size_t alignment_in_bits,
16423 const string& linkage_name,
16428 | ABSTRACT_TYPE_BASE
16429 | ABSTRACT_DECL_BASE),
16430 decl_base(env, name, locus, linkage_name, vis),
16431 type_base(env, size_in_bits, alignment_in_bits)
16442 string integral_type_name = int_type;
16476 bool result =
false;
16507 return *
this == *other;
16535 return *
this == other;
16581 if (l.get() == r.get())
16609 bool internal)
const
16633 if (decl_base::priv_->internal_qualified_name_.
empty())
16634 decl_base::priv_->internal_qualified_name_ =
16635 env.
intern(get_internal_integral_type_name(
this));
16636 return decl_base::priv_->internal_qualified_name_;
16640 decl_base::priv_->temporary_internal_qualified_name_ =
16641 env.
intern(get_internal_integral_type_name(
this));
16642 return decl_base::priv_->temporary_internal_qualified_name_;
16668 bool qualified_name)
const
16672 return get_internal_integral_type_name(
this);
16674 if (qualified_name)
16692 v.visit_begin(
this);
16693 bool result = v.visit_end(
this);
16699type_decl::~type_decl()
16719 const string& name,
16720 size_t size_in_bits,
16721 size_t alignment_in_bits,
16725 ABSTRACT_SCOPE_TYPE_DECL
16726 | ABSTRACT_TYPE_BASE
16727 | ABSTRACT_DECL_BASE),
16729 type_base(env, size_in_bits, alignment_in_bits),
16798 return *
this == *other;
16822 if (v.visit_begin(
this))
16825 for (scope_decl::declarations::const_iterator i =
16829 if (!(*i)->traverse(v))
16834 bool result = v.visit_end(
this);
16840scope_type_decl::~scope_type_decl()
16856 const string& name,
16867 | ABSTRACT_DECL_BASE
16868 | ABSTRACT_SCOPE_DECL),
16894 bool qualified_name)
const
16936 if (!ns->is_empty_or_has_empty_sub_namespaces())
16957 if (v.visit_begin(
this))
16960 scope_decl::declarations::const_iterator i;
16966 dynamic_pointer_cast<ir_traversable_base>(*i);
16968 if (!t->traverse (v))
16973 return v.visit_end(
this);
16976namespace_decl::~namespace_decl()
16985class qualified_type_def::priv
16996 weak_ptr<type_base> underlying_type_;
16999 : cv_quals_(CV_NONE)
17004 : cv_quals_(quals),
17005 underlying_type_(t)
17057qualified_type_def::qualified_type_def(type_base_sptr type,
17062 | ABSTRACT_TYPE_BASE
17063 | ABSTRACT_DECL_BASE),
17064 type_base(type->get_environment(), type->get_size_in_bits(),
17065 type->get_alignment_in_bits()),
17066 decl_base(type->get_environment(),
"", locus,
"",
17067 dynamic_pointer_cast<
decl_base>(type)->get_visibility()),
17068 priv_(new priv(quals, type))
17087 | ABSTRACT_TYPE_BASE
17088 | ABSTRACT_DECL_BASE),
17092 priv_(new priv(quals))
17115 s = ut->get_size_in_bits();
17144 bool result =
true;
17211 return *
this == *other;
17229 return *
this == *other;
17244 bool internal)
const
17272 if (priv_->temporary_internal_name_.empty())
17273 priv_->temporary_internal_name_ =
17275 return priv_->temporary_internal_name_;
17291 if (priv_->internal_name_.empty())
17292 priv_->internal_name_ =
17295 return priv_->internal_name_;
17324 if (v.visit_begin(
this))
17331 bool result = v.visit_end(
this);
17336qualified_type_def::~qualified_type_def()
17343{
return priv_->cv_quals_;}
17348{priv_->cv_quals_ = cv_quals;}
17362{
return priv_->underlying_type_.lock();}
17371 priv_->underlying_type_ = t;
17381 scope_decl::declarations::iterator i;
17382 if (s->find_iterator_for_member(
this, i))
17397operator==(
const qualified_type_def_sptr& l,
const qualified_type_def_sptr& r)
17399 if (l.get() == r.get())
17415operator!=(
const qualified_type_def_sptr& l,
const qualified_type_def_sptr& r)
17423 (
static_cast<unsigned>(lhs) |
static_cast<unsigned>(rhs));
17447 (
static_cast<unsigned>(lhs) &
static_cast<unsigned>(rhs));
17469 case qualified_type_def::CV_NONE:
17472 case qualified_type_def::CV_CONST:
17475 case qualified_type_def::CV_VOLATILE:
17478 case qualified_type_def::CV_RESTRICT:
17492struct pointer_type_def::priv
17499 priv(
const type_base_sptr& t)
17501 naked_pointed_to_type_(t.get())
17505 : naked_pointed_to_type_()
17530pointer_type_def::pointer_type_def(
const type_base_sptr& pointed_to,
17531 size_t size_in_bits,
17532 size_t align_in_bits,
17536 | ABSTRACT_TYPE_BASE
17537 | ABSTRACT_DECL_BASE),
17538 type_base(pointed_to->get_environment(), size_in_bits, align_in_bits),
17539 decl_base(pointed_to->get_environment(),
"", locus,
""),
17540 priv_(new priv(pointed_to))
17546 const environment& env = pointed_to->get_environment();
17547 decl_base_sptr pto = dynamic_pointer_cast<decl_base>(pointed_to);
17548 string name = (pto ? pto->get_name() : string(
"void")) +
"*";
17566pointer_type_def::pointer_type_def(
const environment& env,
size_t size_in_bits,
17567 size_t alignment_in_bits,
17571 | ABSTRACT_TYPE_BASE
17572 | ABSTRACT_DECL_BASE),
17573 type_base(env, size_in_bits, alignment_in_bits),
17578 string name = string(
"void") +
"*";
17589 priv_->pointed_to_type_ = t;
17590 priv_->naked_pointed_to_type_ = t.get();
17595 decl_base_sptr pto = dynamic_pointer_cast<decl_base>(t);
17596 string name = (pto ? pto->get_name() : string(
"void")) +
"*";
17679 return *
this == *o;
17700const type_base_sptr
17702{
return priv_->pointed_to_type_.lock();}
17709{
return priv_->naked_pointed_to_type_;}
17747 if (priv_->internal_qualified_name_.empty())
17748 if (pointed_to_type)
17749 priv_->internal_qualified_name_ =
17750 pointer_declaration_name(
this,
17757 return priv_->internal_qualified_name_;
17765 if (pointed_to_type)
17766 if (priv_->temp_internal_qualified_name_.empty())
17767 priv_->temp_internal_qualified_name_ =
17768 pointer_declaration_name(
this,
17775 return priv_->temp_internal_qualified_name_;
17784 (pointer_declaration_name(
this,
17796 if (pointed_to_type)
17798 (pointer_declaration_name(
this,
17823 if (v.visit_begin(
this))
17831 bool result = v.visit_end(
this);
17836pointer_type_def::~pointer_type_def()
17853 if (l.get() == r.get())
17881struct reference_type_def::priv
17889 priv(
const type_base_sptr& t,
bool is_lvalue)
17891 is_lvalue_(is_lvalue)
17894 priv(
bool is_lvalue)
17895 : is_lvalue_(is_lvalue)
17924reference_type_def::reference_type_def(
const type_base_sptr pointed_to,
17926 size_t size_in_bits,
17927 size_t align_in_bits,
17931 | ABSTRACT_TYPE_BASE
17932 | ABSTRACT_DECL_BASE),
17933 type_base(pointed_to->get_environment(), size_in_bits, align_in_bits),
17934 decl_base(pointed_to->get_environment(),
"", locus,
""),
17935 priv_(new priv(pointed_to, lvalue))
17941 decl_base_sptr pto = dynamic_pointer_cast<decl_base>(pointed_to);
17946 name = string(pto->get_name()) +
"&";
17954 const environment& env = pointed_to->get_environment();
17978reference_type_def::reference_type_def(
const environment& env,
bool lvalue,
17979 size_t size_in_bits,
17980 size_t alignment_in_bits,
17984 | ABSTRACT_TYPE_BASE
17985 | ABSTRACT_DECL_BASE),
17986 type_base(env, size_in_bits, alignment_in_bits),
17988 priv_(new priv(lvalue))
17991 string name =
"void&";
18006 priv_->pointed_to_type_ = pointed_to_type;
18008 decl_base_sptr pto;
18010 {pto = dynamic_pointer_cast<decl_base>(pointed_to_type);}
18017 string name = string(pto->get_name()) +
"&";
18047 if (l.is_lvalue() != r.is_lvalue())
18055 bool result = (l.get_pointed_to_type() == r.get_pointed_to_type());
18094 return *
this == *other;
18109 return *
this == *other;
18113reference_type_def::get_pointed_to_type()
const
18114{
return priv_->pointed_to_type_.lock();}
18117reference_type_def::is_lvalue()
const
18118{
return priv_->is_lvalue_;}
18148 type_base_sptr pointed_to_type = get_pointed_to_type();
18155 if (priv_->internal_qualified_name_.empty())
18156 if (pointed_to_type)
18157 priv_->internal_qualified_name_ =
18165 return priv_->internal_qualified_name_;
18173 if (pointed_to_type)
18174 if (priv_->temp_internal_qualified_name_.empty())
18175 priv_->temp_internal_qualified_name_ =
18183 return priv_->temp_internal_qualified_name_;
18203 if (pointed_to_type)
18233 bool qualified_name)
const
18237 (get_pointed_to_type()),
18261 if (v.visit_begin(
this))
18264 if (type_base_sptr t = get_pointed_to_type())
18269 bool result = v.visit_end(
this);
18274reference_type_def::~reference_type_def()
18291 if (l.get() == r.get())
18319struct ptr_to_mbr_type::priv
18323 type_base_sptr dm_type_;
18326 type_base_sptr containing_type_;
18333 priv(
const type_base_sptr& dm_type,
const type_base_sptr& containing_type)
18334 : dm_type_(dm_type),
18335 containing_type_(containing_type)
18357 const type_base_sptr& member_type,
18358 const type_base_sptr& containing_type,
18359 size_t size_in_bits,
18360 size_t alignment_in_bits,
18363 POINTER_TO_MEMBER_TYPE
18364 | ABSTRACT_TYPE_BASE
18365 | ABSTRACT_DECL_BASE),
18366 type_base(env, size_in_bits, alignment_in_bits),
18368 priv_(new priv(member_type, containing_type))
18383const type_base_sptr&
18385{
return priv_->dm_type_;}
18392const type_base_sptr&
18394{
return priv_->containing_type_;}
18424 return *
this == *other;
18439 return *
this == *other;
18451 bool internal)
const
18470 if (priv_->internal_qualified_name_.empty())
18471 priv_->internal_qualified_name_ =
18472 ptr_to_mbr_declaration_name(
this,
"",
18475 return priv_->internal_qualified_name_;
18479 priv_->temp_internal_qualified_name_ =
18480 ptr_to_mbr_declaration_name(
this,
"",
true, internal);
18481 return priv_->temp_internal_qualified_name_;
18487 (ptr_to_mbr_declaration_name(
this,
"",
true,
18509 if (v.visit_begin(
this))
18520 bool result = v.visit_end(
this);
18552 bool result =
true;
18554 if (!(l.decl_base::operator==(r)))
18593array_type_def::subrange_type::~subrange_type() =
default;
18602 : s_(UNSIGNED_SIGNEDNESS)
18611 : s_(UNSIGNED_SIGNEDNESS)
18620 : s_(SIGNED_SIGNEDNESS)
18628enum array_type_def::subrange_type::bound_value::signedness
18652{
return v_.unsigned_;}
18660 s_ = UNSIGNED_SIGNEDNESS;
18670 s_ = SIGNED_SIGNEDNESS;
18682 return s_ == v.s_ && v_.unsigned_ == v.v_.unsigned_;
18687struct array_type_def::subrange_type::priv
18697 : upper_bound_(ub), language_(l), infinite_(false)
18700 priv(bound_value lb, bound_value ub,
18702 : lower_bound_(lb), upper_bound_(ub),
18703 language_(l), infinite_(false)
18706 priv(bound_value lb, bound_value ub,
const type_base_sptr &u,
18708 : lower_bound_(lb), upper_bound_(ub), underlying_type_(u),
18709 language_(l), infinite_(false)
18728 const string& name,
18731 const type_base_sptr& utype,
18734 :
type_or_decl_base(env, SUBRANGE_TYPE | ABSTRACT_TYPE_BASE | ABSTRACT_DECL_BASE),
18736 upper_bound.get_unsigned_value()
18737 - lower_bound.get_unsigned_value(),
18740 priv_(new priv(lower_bound, upper_bound, utype, l))
18760 const string& name,
18765 :
type_or_decl_base(env, SUBRANGE_TYPE | ABSTRACT_TYPE_BASE | ABSTRACT_DECL_BASE),
18767 upper_bound.get_unsigned_value()
18768 - lower_bound.get_unsigned_value(), 0),
18770 priv_(new priv(lower_bound, upper_bound, l))
18788 const string& name,
18792 :
type_or_decl_base(env, SUBRANGE_TYPE | ABSTRACT_TYPE_BASE | ABSTRACT_DECL_BASE),
18793 type_base(env, upper_bound.get_unsigned_value(), 0),
18795 priv_(new priv(upper_bound, l))
18806{
return priv_->underlying_type_.lock();}
18815 ABG_ASSERT(priv_->underlying_type_.expired());
18816 priv_->underlying_type_ = u;
18824{
return priv_->upper_bound_.get_signed_value();}
18831{
return priv_->lower_bound_.get_signed_value();}
18838{priv_->upper_bound_ = ub;}
18845{priv_->lower_bound_ = lb;}
18862 if (get_upper_bound() >= get_lower_bound())
18863 return get_upper_bound() - get_lower_bound() + 1;
18872{
return priv_->infinite_;}
18880{priv_->infinite_ = f;}
18887{
return priv_->language_;}
18895 std::ostringstream o;
18899 type_base_sptr underlying_type = get_underlying_type();
18900 if (underlying_type)
18902 o <<
"range "<< get_lower_bound() <<
" .. " << get_upper_bound();
18907 o <<
"[" << get_length() <<
"]";
18922 for (vector<subrange_sptr>::const_iterator i = v.begin();
18925 r += (*i)->as_string();
18954 bool result =
true;
18998 return *
this == *other;
19066 repr +=
"<anonymous range>";
19068 repr +=
"<range " +
get_name() +
">";
19069 repr += as_string();
19087 if (v.visit_begin(
this))
19090 if (type_base_sptr u = get_underlying_type())
19095 bool result = v.visit_end(
this);
19102struct array_type_def::priv
19109 priv(type_base_sptr t)
19114 : element_type_(t), subranges_(subs)
19134array_type_def::array_type_def(
const type_base_sptr e_type,
19135 const std::vector<subrange_sptr>& subs,
19139 | ABSTRACT_TYPE_BASE
19140 | ABSTRACT_DECL_BASE),
19143 priv_(new priv(e_type))
19167 const std::vector<subrange_sptr>& subs,
19171 | ABSTRACT_TYPE_BASE
19172 | ABSTRACT_DECL_BASE),
19186array_type_def::update_size()
19188 type_base_sptr e = priv_->element_type_.lock();
19191 size_t s = e->get_size_in_bits();
19195 s *= sub->get_length();
19203array_type_def::get_subrange_representation()
const
19229 bool qualified_name)
const
19231 return array_declaration_name(
this,
"",
19232 qualified_name, internal);
19257 std::vector<array_type_def::subrange_sptr > this_subs = l.
get_subranges();
19258 std::vector<array_type_def::subrange_sptr > other_subs = r.
get_subranges();
19260 bool result =
true;
19261 if (this_subs.size() != other_subs.size())
19270 std::vector<array_type_def::subrange_sptr >::const_iterator i,j;
19271 for (i = this_subs.begin(), j = other_subs.begin();
19272 i != this_subs.end() && j != other_subs.end();
19319 std::vector<array_type_def::subrange_sptr > this_subs = l->
get_subranges();
19320 std::vector<array_type_def::subrange_sptr > other_subs = r->
get_subranges();
19322 if (this_subs.size() != other_subs.size())
19325 std::vector<array_type_def::subrange_sptr >::const_iterator i,j;
19326 for (i = this_subs.begin(), j = other_subs.begin();
19327 i != this_subs.end() && j != other_subs.end();
19337 if (*first_element_type != *second_element_type)
19349 const std::vector<subrange_sptr>& subranges =
19352 if (subranges.empty())
19353 return translation_unit::LANG_C11;
19354 return subranges.front()->get_language();
19373 return *
this == *other;
19379const type_base_sptr
19381{
return priv_->element_type_.lock();}
19397 priv_->element_type_ = element_type;
19408 for (
const auto &sub : subs)
19409 priv_->subranges_.push_back(sub);
19421 if (priv_->subranges_.empty())
19424 for (std::vector<shared_ptr<subrange_type> >::const_iterator i =
19425 priv_->subranges_.begin();
19426 i != priv_->subranges_.end();
19428 if ((*i)->is_non_finite())
19435array_type_def::get_dimension_count()
const
19436{
return priv_->subranges_.size();}
19467 if (priv_->internal_qualified_name_.empty())
19468 priv_->internal_qualified_name_ =
19469 array_declaration_name(
this,
"",
19472 return priv_->internal_qualified_name_;
19476 priv_->temp_internal_qualified_name_ =
19477 array_declaration_name(
this,
"",
19479 return priv_->temp_internal_qualified_name_;
19496 (array_declaration_name(
this,
"",
19520 if (v.visit_begin(
this))
19528 bool result = v.visit_end(
this);
19534array_type_def::get_location()
const
19538const std::vector<array_type_def::subrange_sptr>&
19540{
return priv_->subranges_;}
19542array_type_def::~array_type_def()
19549class enum_type_decl::priv
19551 type_base_sptr underlying_type_;
19560 priv(type_base_sptr underlying_type,
19562 : underlying_type_(underlying_type),
19580enum_type_decl::enum_type_decl(
const string& name,
19582 type_base_sptr underlying_type,
19584 const string& linkage_name,
19588 | ABSTRACT_TYPE_BASE
19589 | ABSTRACT_DECL_BASE),
19590 type_base(underlying_type->get_environment(),
19591 underlying_type->get_size_in_bits(),
19592 underlying_type->get_alignment_in_bits()),
19593 decl_base(underlying_type->get_environment(),
19594 name, locus, linkage_name, vis),
19595 priv_(new priv(underlying_type, enums))
19601 e->set_enum_type(
this);
19607{
return priv_->underlying_type_;}
19612{
return priv_->enumerators_;}
19617{
return priv_->enumerators_;}
19625 if (priv_->sorted_enumerators_.empty())
19630 priv_->sorted_enumerators_.push_back(*e);
19632 std::sort(priv_->sorted_enumerators_.begin(),
19633 priv_->sorted_enumerators_.end(),
19637 if (l.get_name() == r.get_name())
19638 return l.get_value() < r.get_value();
19639 return (l.get_name() < r.get_name());
19643 return priv_->sorted_enumerators_;
19665 bool qualified_name)
const
19667 string r =
"enum ";
19697 if (v.visit_begin(
this))
19705 bool result = v.visit_end(
this);
19727 bool result =
false;
19737 enum_type_decl::enumerators::const_iterator i, j;
19770 if (!(l.decl_base::operator==(r) && l.type_base::operator==(r)))
19775 if (!l.decl_base::operator==(r))
19777 if (!l.type_base::operator==(r))
19824enumerators_values_are_equal(
const enum_type_decl::enumerator &enr,
19825 const enum_type_decl::enumerator &enl)
19826{
return enr.get_value() == enl.get_value();}
19849is_enumerator_value_present_in_enum(
const enum_type_decl::enumerator &enr,
19850 const enum_type_decl &enom,
19851 vector<enum_type_decl::enumerator>& redundant_enrs)
19853 bool found =
false;
19854 for (
const auto &e : enom.get_enumerators())
19855 if (enumerators_values_are_equal(e, enr))
19859 redundant_enrs.push_back(e);
19877is_enumerator_value_redundant(
const enum_type_decl::enumerator &enr,
19878 const enum_type_decl &enom)
19880 vector<enum_type_decl::enumerator> redundant_enrs;
19881 if (is_enumerator_value_present_in_enum(enr, enom, redundant_enrs))
19883 if (!redundant_enrs.empty())
19911 bool result =
true;
19927 if (!!def1 != !!def2)
19957 if (!(def1->decl_base::operator==(*def2)
19958 && def1->type_base::operator==(*def2)))
19963 if (!def1->decl_base::operator==(*def2))
19965 if (!def1->type_base::operator==(*def2))
20016 && (!is_enumerator_value_redundant(e, *def2)
20017 || !is_enumerator_value_redundant(e, *def1)))
20031 && (!is_enumerator_value_redundant(e, *def1)
20032 || !is_enumerator_value_redundant(e, *def2)))
20074 return *
this == *other;
20089 if (l.get() == r.get())
20091 decl_base_sptr o = r;
20108class enum_type_decl::enumerator::priv
20112 string qualified_name_;
20115 friend class enum_type_decl::enumerator;
20123 priv(
const string& name,
20125 enum_type_decl* e = 0)
20137enum_type_decl::enumerator::~enumerator() =
default;
20148 : priv_(new priv(name, value))
20155 : priv_(new priv(other.
get_name(),
20157 other.get_enum_type()))
20182 bool names_equal =
true;
20184 return names_equal && (get_value() == other.
get_value());
20203{
return priv_->name_;}
20221 if (priv_->qualified_name_.empty())
20223 priv_->qualified_name_ =
20224 get_enum_type()->get_qualified_name(internal)
20228 return priv_->qualified_name_;
20244{
return priv_->value_;}
20258{
return priv_->enum_type_;}
20265{priv_->enum_type_ = e;}
20271struct typedef_decl::priv
20275 priv(
const type_base_sptr& t)
20276 : underlying_type_(t)
20291typedef_decl::typedef_decl(
const string& name,
20292 const type_base_sptr underlying_type,
20294 const string& linkage_name,
20298 | ABSTRACT_TYPE_BASE
20299 | ABSTRACT_DECL_BASE),
20304 name, locus, linkage_name, vis),
20305 priv_(new priv(underlying_type))
20321typedef_decl::typedef_decl(
const string& name,
20324 const string& mangled_name,
20328 | ABSTRACT_TYPE_BASE
20329 | ABSTRACT_DECL_BASE),
20332 decl_base(env, name, locus, mangled_name, vis),
20333 priv_(new priv(nullptr))
20394 bool result =
true;
20398 if (!(l.decl_base::operator==(r)))
20445 return *
this == *other;
20467 bool qualified_name)
const
20470 string result =
"typedef ";
20475 if (qualified_name)
20489{
return priv_->underlying_type_.lock();}
20497 priv_->underlying_type_ = t;
20511 bool internal)
const
20529 return decl_base::priv_->internal_qualified_name_;
20531 return decl_base::priv_->qualified_name_;
20550 if (v.visit_begin(
this))
20558 bool result = v.visit_end(
this);
20563typedef_decl::~typedef_decl()
20569struct var_decl::priv
20582 priv(type_base_sptr t,
20585 naked_type_(t.get()),
20596 naked_type_ = t.get();
20613var_decl::var_decl(
const string& name,
20614 type_base_sptr type,
20616 const string& linkage_name,
20620 VAR_DECL | ABSTRACT_DECL_BASE),
20621 decl_base(type->get_environment(), name, locus, linkage_name, vis),
20622 priv_(new priv(type, bind))
20630const type_base_sptr
20632{
return priv_->type_.lock();}
20639{priv_->set_type(t);}
20650{
return priv_->naked_type_;}
20657{
return priv_->binding_;}
20664{priv_->binding_ = b;}
20680 priv_->symbol_ = sym;
20695{
return priv_->symbol_;}
20764 bool result =
true;
20777 else if (s0 && s0 != s1)
20785 bool symbols_are_equal = (s0 && s1 && result);
20787 if (symbols_are_equal)
20796 bool decl_bases_different = !l.decl_base::operator==(r);
20797 const_cast<var_decl&
>(l).set_qualified_name(n1);
20798 const_cast<var_decl&
>(r).set_qualified_name(n2);
20800 if (decl_bases_different)
20810 if (!l.decl_base::operator==(r))
20859 bool result =
true;
20895 return equals(*
this, *other, 0);
20910 if (priv_->id_.empty())
20915 sym_str = s->get_id_string();
20920 priv_->id_ = env.
intern(repr);
20921 if (!sym_str.empty())
20922 priv_->id_ = env.
intern(priv_->id_ +
"{" + sym_str +
"}");
20934 return hash_var(
this);
20999 result =
"static ";
21003 bool member_of_anonymous_class =
false;
21006 member_of_anonymous_class =
true;
21015 if (member_of_anonymous_class || !qualified_name)
21022 string quals_repr =
21024 if (!quals_repr.empty())
21025 name = quals_repr +
" " + name;
21029 name = string(
" ") + name;
21031 result += array_declaration_name(t, name, qualified_name, internal);
21033 result += pointer_declaration_name(t, name, qualified_name, internal);
21035 result += pointer_declaration_name(t, name, qualified_name, internal);
21037 result += ptr_to_mbr_declaration_name(t, name,
21052 "",
true, internal);
21058 "",
true, internal);
21061 && (member_of_anonymous_class || !qualified_name))
21077 && (member_of_anonymous_class || !qualified_name))
21131 if (v.visit_begin(
this))
21134 if (type_base_sptr t =
get_type())
21138 return v.visit_end(
this);
21141var_decl::~var_decl()
21156 priv_->cached_name_.clear();
21157 priv_->internal_cached_name_.clear();
21177function_type::function_type(type_base_sptr return_type,
21179 size_t size_in_bits,
21180 size_t alignment_in_bits)
21182 FUNCTION_TYPE | ABSTRACT_TYPE_BASE),
21183 type_base(return_type->get_environment(), size_in_bits, alignment_in_bits),
21184 priv_(new
priv(parms, return_type))
21188 for (parameters::size_type i = 0, j = 1;
21189 i < priv_->parms_.size();
21192 if (i == 0 && priv_->parms_[i]->get_is_artificial())
21199 priv_->parms_[i]->set_index(j);
21210function_type::function_type(type_base_sptr return_type,
21211 size_t size_in_bits,
size_t alignment_in_bits)
21213 FUNCTION_TYPE | ABSTRACT_TYPE_BASE),
21214 type_base(return_type->get_environment(), size_in_bits, alignment_in_bits),
21215 priv_(new
priv(return_type))
21230 size_t size_in_bits,
21231 size_t alignment_in_bits)
21233 type_base(env, size_in_bits, alignment_in_bits),
21245{
return priv_->return_type_.lock();}
21253{priv_->return_type_ = t;}
21262{
return priv_->parms_;}
21305 for (parameters::size_type i = 0, j = 1;
21306 i < priv_->parms_.size();
21309 if (i == 0 && priv_->parms_[i]->get_is_artificial())
21316 priv_->parms_[i]->set_index(j);
21327 parm->set_index(priv_->parms_.size());
21328 priv_->parms_.push_back(parm);
21342 return (!priv_->parms_.empty()
21343 && priv_->parms_.back()->get_variadic_marker());
21375#define RETURN(value) CACHE_AND_RETURN_COMPARISON_RESULT(value)
21384 bool cached_result =
false;
21392 bool result =
true;
21394 if (!l.type_base::operator==(r))
21405 l_class = m->get_class_type().get();
21408 r_class = m->get_class_type().get();
21412 if (!!l_class != !!r_class)
21422 != r_class->get_qualified_name()))
21439 bool compare_result_types =
true;
21440 string l_rt_name = l_return_type_decl
21443 string r_rt_name = r_return_type_decl
21449 (r_class && (r_class->get_qualified_name() == r_rt_name)))
21450 compare_result_types =
false;
21452 if (compare_result_types)
21478 if (l_rt_name != r_rt_name)
21487 vector<shared_ptr<function_decl::parameter> >::const_iterator i,j;
21528function_type::parameters::const_iterator
21534 bool is_method =
dynamic_cast<const method_type*
>(
this);
21550function_type::parameters::const_iterator
21577 if (priv_->internal_cached_name_.empty())
21578 priv_->internal_cached_name_ =
21580 return priv_->internal_cached_name_;
21584 if (priv_->temp_internal_cached_name_.empty())
21585 priv_->temp_internal_cached_name_ =
21587 return priv_->temp_internal_cached_name_;
21594 if (priv_->cached_name_.empty())
21595 priv_->cached_name_ =
21597 return priv_->cached_name_;
21601 priv_->cached_name_ =
21603 return priv_->cached_name_;
21664 if (v.visit_begin(
this))
21667 bool keep_going =
true;
21671 if (!t->traverse(v))
21672 keep_going =
false;
21679 if (type_base_sptr parm_type = (*i)->get_type())
21680 if (!parm_type->traverse(v))
21685 return v.visit_end(
this);
21688function_type::~function_type()
21694struct method_type::priv
21696 class_or_union_wptr class_type_;
21724method_type::method_type (type_base_sptr return_type,
21725 class_or_union_sptr class_type,
21726 const std::vector<function_decl::parameter_sptr>& p,
21728 size_t size_in_bits,
21729 size_t alignment_in_bits)
21731 METHOD_TYPE | ABSTRACT_TYPE_BASE | FUNCTION_TYPE),
21732 type_base(class_type->get_environment(), size_in_bits, alignment_in_bits),
21733 function_type(return_type, p, size_in_bits, alignment_in_bits),
21764method_type::method_type(type_base_sptr return_type,
21765 type_base_sptr class_type,
21766 const std::vector<function_decl::parameter_sptr>& p,
21768 size_t size_in_bits,
21769 size_t alignment_in_bits)
21771 METHOD_TYPE | ABSTRACT_TYPE_BASE | FUNCTION_TYPE),
21772 type_base(class_type->get_environment(), size_in_bits, alignment_in_bits),
21773 function_type(return_type, p, size_in_bits, alignment_in_bits),
21789 size_t size_in_bits,
21790 size_t alignment_in_bits)
21792 type_base(env, size_in_bits, alignment_in_bits),
21812method_type::method_type(class_or_union_sptr class_type,
21814 size_t size_in_bits,
21815 size_t alignment_in_bits)
21817 METHOD_TYPE | ABSTRACT_TYPE_BASE | FUNCTION_TYPE),
21818 type_base(class_type->get_environment(), size_in_bits, alignment_in_bits),
21821 alignment_in_bits),
21834{
return class_or_union_sptr(priv_->class_type_);}
21847 priv_->class_type_ = t;
21875{priv_->is_const = f;}
21882{
return priv_->is_const;}
21892struct function_decl::priv
21894 bool declared_inline_;
21902 : declared_inline_(false),
21908 bool declared_inline,
21910 : declared_inline_(declared_inline),
21913 naked_type_(t.get())
21917 bool declared_inline,
21920 : declared_inline_(declared_inline),
21923 naked_type_(t.get()),
21945 bool declared_inline,
21947 const string& mangled_name,
21951 FUNCTION_DECL | ABSTRACT_DECL_BASE),
21982 type_base_sptr fn_type,
21983 bool declared_inline,
21985 const string& linkage_name,
21989 FUNCTION_DECL | ABSTRACT_DECL_BASE),
21990 decl_base(fn_type->get_environment(), name, locus, linkage_name, vis),
21991 priv_(new priv(dynamic_pointer_cast<
function_type>(fn_type),
22013 bool qualified_name)
const
22018 string fn_prefix = mem_fn ?
"method ":
"function ";
22024 fn_prefix +=
"virtual ";
22026 decl_base_sptr return_type;
22033 return_type = mem_fn
22044 internal) +
" " + result;
22047 result = add_outer_pointer_to_fn_type_expr(p, result,
22052 result = add_outer_pointer_to_array_type_expr(p, result,
22059 return fn_prefix + result;
22089 result += mem_fn->
get_type()->get_class_type()->get_qualified_name()
22095 std::ostringstream fn_parms;
22096 stream_pretty_representation_of_fn_parms(*
get_type(),
22100 result += fn_parms.str();
22105 result +=
" const";
22116function_decl::parameters::const_iterator
22122 bool is_method =
dynamic_cast<const method_decl*
>(
this);
22135const shared_ptr<function_type>
22137{
return priv_->type_.lock();}
22152{
return priv_->naked_type_;}
22157 priv_->type_ = fn_type;
22158 priv_->naked_type_ = fn_type.get();
22175 priv_->symbol_ = sym;
22190{
return priv_->symbol_;}
22193function_decl::is_declared_inline()
const
22194{
return priv_->declared_inline_;}
22197function_decl::get_binding()
const
22198{
return priv_->binding_;}
22201const shared_ptr<type_base>
22203{
return get_type()->get_return_type();}
22206const std::vector<shared_ptr<function_decl::parameter> >&
22208{
return get_type()->get_parameters();}
22215{
get_type()->append_parameter(parm);}
22223 for (std::vector<shared_ptr<parameter> >::const_iterator i = parms.begin();
22242 is_declared_inline(),
22262 is_declared_inline(),
22296 bool result =
true;
22300 if (t0 == t1 || *t0 == *t1)
22326 else if (s0 && s0 != s1)
22337 bool symbols_are_equal = (s0 && s1 && result);
22339 if (symbols_are_equal)
22351 bool decl_bases_different = !l.decl_base::operator==(r);
22358 if (decl_bases_different)
22368 if (!l.decl_base::operator==(r))
22378 if (l.is_declared_inline() != r.is_declared_inline()
22379 || l.get_binding() != r.get_binding())
22436 return equals(*
this, *o, 0);
22460 return hash_fn(*
this);
22475 if (priv_->id_.empty())
22480 string virtual_member_suffix;
22490 virtual_member_suffix +=
"/o";
22493 if (s->has_aliases())
22500 priv_->id_ = env.
intern(s->get_id_string());
22502 if (!virtual_member_suffix.empty())
22503 priv_->id_ = env.
intern(priv_->id_ + virtual_member_suffix);
22547 if (v.visit_begin(
this))
22550 if (type_base_sptr t =
get_type())
22554 return v.visit_end(
this);
22576 if (l.get() == r.get())
22599struct function_decl::parameter::priv
22603 bool variadic_marker_;
22610 priv(type_base_sptr type,
22612 bool variadic_marker)
22615 variadic_marker_(variadic_marker)
22619function_decl::parameter::parameter(
const type_base_sptr type,
22621 const string& name,
22622 const location& loc,
22624 : type_or_decl_base(type->get_environment(),
22625 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
22626 decl_base(type->get_environment(), name, loc),
22627 priv_(new priv(type, index, is_variadic))
22629 runtime_type_instance(
this);
22632function_decl::parameter::parameter(
const type_base_sptr type,
22634 const string& name,
22635 const location& loc,
22637 bool is_artificial)
22638 : type_or_decl_base(type->get_environment(),
22639 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
22640 decl_base(type->get_environment(), name, loc),
22641 priv_(new priv(type, index, is_variadic))
22643 runtime_type_instance(
this);
22644 set_is_artificial(is_artificial);
22647function_decl::parameter::parameter(
const type_base_sptr type,
22648 const string& name,
22649 const location& loc,
22651 bool is_artificial)
22652 : type_or_decl_base(type->get_environment(),
22653 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
22654 decl_base(type->get_environment(), name, loc),
22655 priv_(new priv(type, 0, is_variadic))
22657 runtime_type_instance(
this);
22658 set_is_artificial(is_artificial);
22661function_decl::parameter::parameter(
const type_base_sptr type,
22664 : type_or_decl_base(type->get_environment(),
22665 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
22666 decl_base(type->get_environment(),
"", location()),
22667 priv_(new priv(type, index, variad))
22669 runtime_type_instance(
this);
22672function_decl::parameter::~parameter() =
default;
22674const type_base_sptr
22675function_decl::parameter::get_type()
const
22676{
return priv_->type_.lock();}
22703 if (get_variadic_marker()
22723 std::ostringstream o;
22724 o <<
"parameter-" << get_index();
22726 return env.
intern(o.str());
22730function_decl::parameter::get_index()
const
22731{
return priv_->index_;}
22734function_decl::parameter::set_index(
unsigned i)
22735{priv_->index_ = i;}
22739function_decl::parameter::get_variadic_marker()
const
22740{
return priv_->variadic_marker_;}
22766 bool result =
true;
22768 if ((l.get_variadic_marker() != r.get_variadic_marker())
22769 || (l.get_index() != r.get_index())
22770 || (!!l.get_type() != !!r.get_type()))
22775 if (l.get_index() != r.get_index())
22777 if (l.get_variadic_marker() != r.get_variadic_marker()
22778 || !!l.get_type() != !!r.get_type())
22787 if (l_type != r_type)
22805function_decl::parameter::operator==(
const parameter& o)
const
22806{
return equals(*
this, o, 0);}
22815 return function_decl::parameter::operator==(*p);
22861 if (v.visit_begin(
this))
22864 if (type_base_sptr t =
get_type())
22868 return v.visit_end(
this);
22879 return hash_fn_parm(
this);
22912 bool qualified_name)
const
22919 type_repr =
"void";
22925 string result = type_repr;
22926 string parm_name = get_name_id();
22928 if (!parm_name.empty())
22929 result +=
" " + parm_name;
22963 size_t size_in_bits,
size_t align_in_bits,
22970 | ABSTRACT_DECL_BASE
22971 | ABSTRACT_SCOPE_TYPE_DECL
22972 | ABSTRACT_SCOPE_DECL),
22973 decl_base(env, name, locus, name, vis),
22974 type_base(env, size_in_bits, align_in_bits),
22978 for (member_types::iterator i = mem_types.begin();
22979 i != mem_types.end();
22990 for (member_functions::iterator i = member_fns.begin();
22991 i != member_fns.end();
22993 if (!
has_scope(static_pointer_cast<decl_base>(*i)))
23013 size_t size_in_bits,
size_t align_in_bits,
23017 | ABSTRACT_DECL_BASE
23018 | ABSTRACT_SCOPE_TYPE_DECL
23019 | ABSTRACT_SCOPE_DECL),
23020 decl_base(env, name, locus, name, vis),
23021 type_base(env, size_in_bits, align_in_bits),
23035 bool is_declaration_only)
23038 | ABSTRACT_DECL_BASE
23039 | ABSTRACT_SCOPE_TYPE_DECL
23040 | ABSTRACT_SCOPE_DECL),
23066 if (v.visit_begin(
this))
23075 if (!(*i)->traverse(v))
23085 if (!(*i)->traverse(v))
23095 if (!(*i)->traverse(v))
23102 for (member_function_templates::const_iterator i =
23106 if (!(*i)->traverse(v))
23113 for (member_class_templates::const_iterator i =
23117 if (!(*i)->traverse(v))
23125 bool result = v.visit_end(
this);
23154 type_base_sptr t =
is_type(decl);
23184 for (class_or_union::data_members::const_iterator it =
23273 if (t->get_is_anonymous())
23291 if (t->get_is_anonymous())
23309 if (t->get_is_anonymous())
23334 bool is_laid_out,
bool is_static,
23335 size_t offset_in_bits)
23339 priv_->data_members_.push_back(v);
23350 bool is_already_in =
false;
23351 for (data_members::const_iterator i =
23352 priv_->non_static_data_members_.begin();
23353 i != priv_->non_static_data_members_.end();
23357 is_already_in =
true;
23360 if (!is_already_in)
23361 priv_->non_static_data_members_.push_back(v);
23377{
return priv_->data_members_;}
23392 if ((*i)->get_name() == name)
23404 if (
var_decl_sptr data_member = type->find_data_member(name))
23405 return data_member;
23419 if (!v->get_name().empty())
23427 if ((*it)->get_pretty_representation(
false,
true)
23428 == v->get_pretty_representation(
false,
true))
23455 if (v->get_name().empty())
23468{
return priv_->non_static_data_members_;}
23486 bool is_static,
bool is_ctor,
23487 bool is_dtor,
bool is_const)
23499 priv_->member_functions_.push_back(f);
23503 if (!f->get_linkage_name().empty())
23504 priv_->mem_fns_map_[f->get_linkage_name()] = f;
23513{
return priv_->member_functions_;}
23534 string_mem_fn_sptr_map_type::const_iterator i =
23535 priv_->mem_fns_map_.find(linkage_name);
23536 if (i == priv_->mem_fns_map_.end())
23538 return i->second.get();
23549 string_mem_fn_sptr_map_type::const_iterator i =
23550 priv_->mem_fns_map_.find(linkage_name);
23551 if (i == priv_->mem_fns_map_.end())
23577 string_mem_fn_ptr_map_type::const_iterator i =
23578 priv_->signature_2_mem_fn_map_.find(s);
23579 if (i == priv_->signature_2_mem_fn_map_.end())
23587const member_function_templates&
23589{
return priv_->member_function_templates_;}
23594const member_class_templates&
23596{
return priv_->member_class_templates_;}
23607 priv_->member_function_templates_.push_back(m);
23622 priv_->member_class_templates_.push_back(m);
23632 && priv_->data_members_.empty()
23633 && priv_->member_functions_.empty()
23634 && priv_->member_function_templates_.empty()
23635 && priv_->member_class_templates_.empty());
23654 else if (method_decl_sptr f = dynamic_pointer_cast<method_decl>(d))
23660 else if (member_function_template_sptr f =
23661 dynamic_pointer_cast<member_function_template>(d))
23663 else if (member_class_template_sptr c =
23664 dynamic_pointer_cast<member_class_template>(d))
23713 return *
this == *o;
23754 if (l_is_decl_only || r_is_decl_only)
23764 if (!def1 || !def2)
23768 && l_is_decl_only && r_is_decl_only
23809 if (!!def1 != !!def2)
23817 if (!(l.decl_base::operator==(r)
23818 && l.type_base::operator==(r)))
23829 bool val = *def1 == *def2;
23838 if (!(l.decl_base::operator==(r) && l.type_base::operator==(r)))
23845 if (types_defined_same_linux_kernel_corpus_public(l, r))
23853#define RETURN(value) \
23854 return return_comparison_result(l, r, value, \
23861 bool result =
true;
23875 for (class_or_union::data_members::const_iterator
23889 || (*d0)->get_type() == (*d1)->get_type())
23916 for (member_function_templates::const_iterator
23921 ++fn_tmpl_it0, ++fn_tmpl_it1)
23922 if (**fn_tmpl_it0 != **fn_tmpl_it1)
23947 for (member_class_templates::const_iterator
23952 ++cl_tmpl_it0, ++cl_tmpl_it1)
23953 if (**cl_tmpl_it0 != **cl_tmpl_it1)
23981 const method_decl_sptr& method)
24003 old_type->get_parameters(),
24004 old_type->get_is_const(),
24005 old_type->get_size_in_bits(),
24006 old_type->get_alignment_in_bits()));
24007 t->get_translation_unit()->bind_function_type_life_time(new_type);
24012 method->is_declared_inline(),
24016 method->get_binding()));
24017 new_method->set_symbol(method->
get_symbol());
24020 class_type->add_member_function(new_method,
24029 t->add_member_function(new_method,
24142maybe_propagate_canonical_type(
const type_base& lhs_type,
24146#if WITH_DEBUG_TYPE_CANONICALIZATION
24147 if (!env.priv_->use_canonical_type_comparison_)
24154 if (env.priv_->propagate_ct(lhs_type, rhs_type))
24165struct class_decl::priv
24168 unordered_map<string, base_spec_sptr> bases_map_;
24174 : is_struct_(false)
24215 size_t size_in_bits,
size_t align_in_bits,
24216 bool is_struct,
const location& locus,
24223 | ABSTRACT_TYPE_BASE
24224 | ABSTRACT_DECL_BASE
24225 | ABSTRACT_SCOPE_TYPE_DECL
24226 | ABSTRACT_SCOPE_DECL),
24227 decl_base(env, name, locus, name, vis),
24228 type_base(env, size_in_bits, align_in_bits),
24230 locus, vis, mbr_types, data_mbrs, mbr_fns),
24231 priv_(new priv(is_struct, bases))
24266 size_t size_in_bits,
size_t align_in_bits,
24267 bool is_struct,
const location& locus,
24273 | ABSTRACT_TYPE_BASE
24274 | ABSTRACT_DECL_BASE
24275 | ABSTRACT_SCOPE_TYPE_DECL
24276 | ABSTRACT_SCOPE_DECL),
24285 is_anonymous ? string() : name,
24287 type_base(env, size_in_bits, align_in_bits),
24289 locus, vis, mbr_types, data_mbrs, mbr_fns),
24290 priv_(new priv(is_struct, bases))
24312 size_t size_in_bits,
size_t align_in_bits,
24313 bool is_struct,
const location& locus,
24317 | ABSTRACT_TYPE_BASE
24318 | ABSTRACT_DECL_BASE
24319 | ABSTRACT_SCOPE_TYPE_DECL
24320 | ABSTRACT_SCOPE_DECL),
24321 decl_base(env, name, locus, name, vis),
24322 type_base(env, size_in_bits, align_in_bits),
24325 priv_(new priv(is_struct))
24349 size_t size_in_bits,
size_t align_in_bits,
24350 bool is_struct,
const location& locus,
24354 | ABSTRACT_TYPE_BASE
24355 | ABSTRACT_DECL_BASE
24356 | ABSTRACT_SCOPE_TYPE_DECL
24357 | ABSTRACT_SCOPE_DECL),
24366 is_anonymous ? string() : name,
24368 type_base(env, size_in_bits, align_in_bits),
24371 priv_(new priv(is_struct))
24387 bool is_struct,
bool is_declaration_only)
24390 | ABSTRACT_TYPE_BASE
24391 | ABSTRACT_DECL_BASE
24392 | ABSTRACT_SCOPE_TYPE_DECL
24393 | ABSTRACT_SCOPE_DECL),
24397 priv_(new priv(is_struct))
24412 for (class_decl::virtual_mem_fn_map_type::iterator i =
24413 priv_->virtual_mem_fns_map_.begin();
24414 i != priv_->virtual_mem_fns_map_.end();
24416 sort_virtual_member_functions(i->second);
24424{priv_->is_struct_ = f;}
24431{
return priv_->is_struct_;}
24439 priv_->bases_.push_back(b);
24440 priv_->bases_map_[b->get_base_class()->get_qualified_name()] = b;
24448{
return priv_->bases_;}
24459 unordered_map<string, base_spec_sptr>::iterator i =
24460 priv_->bases_map_.find(qualified_name);
24462 if (i != priv_->bases_map_.end())
24463 return i->second->get_base_class();
24474{
return priv_->virtual_mem_fns_;}
24493{
return priv_->virtual_mem_fns_map_;}
24498{sort_virtual_member_functions(priv_->virtual_mem_fns_);}
24519 bool qualified_name)
const
24521 string cl =
"class ";
24530 if (internal && !
get_name().empty())
24538 string result = cl;
24539 if (qualified_name)
24548class_decl::insert_member_decl(decl_base_sptr d)
24550 if (method_decl_sptr f = dynamic_pointer_cast<method_decl>(d))
24565struct class_decl::base_spec::priv
24568 long offset_in_bits_;
24572 long offset_in_bits,
24575 offset_in_bits_(offset_in_bits),
24576 is_virtual_(is_virtual)
24594 long offset_in_bits,
24597 ABSTRACT_DECL_BASE),
24599 base->get_linkage_name(), base->get_visibility()),
24601 priv_(new priv(base, offset_in_bits, is_virtual))
24613{
return priv_->base_class_.lock();}
24620{
return priv_->is_virtual_;}
24627{
return priv_->offset_in_bits_;}
24657 if (v.visit_begin(
this))
24660 get_base_class()->traverse(v);
24664 return v.visit_end(
this);
24684class_decl::base_spec::base_spec(
const type_base_sptr& base,
24686 long offset_in_bits,
24689 ABSTRACT_DECL_BASE),
24695 priv_(new priv(dynamic_pointer_cast<
class_decl>(base),
24702class_decl::base_spec::~base_spec() =
default;
24728 if (!l.member_base::operator==(r))
24754 return equals(*
this, *o, 0);
24775mem_fn_context_rel::~mem_fn_context_rel()
24795method_decl::method_decl(
const string& name,
24797 bool declared_inline,
24799 const string& linkage_name,
24804 | ABSTRACT_DECL_BASE
24808 declared_inline, locus, linkage_name, vis, bind)
24832method_decl::method_decl(
const string& name,
24834 bool declared_inline,
24836 const string& linkage_name,
24841 | ABSTRACT_DECL_BASE
24843 decl_base(type->get_environment(), name, locus, linkage_name, vis),
24846 declared_inline, locus, linkage_name, vis, bind)
24869method_decl::method_decl(
const string& name,
24870 type_base_sptr type,
24871 bool declared_inline,
24873 const string& linkage_name,
24878 | ABSTRACT_DECL_BASE
24880 decl_base(type->get_environment(), name, locus, linkage_name, vis),
24883 declared_inline, locus, linkage_name, vis, bind)
24902 class_or_union_sptr cl = t->get_class_type();
24904 cl->priv_->mem_fns_map_[l] = m;
24905 if (!old_lname.empty() && l != old_lname)
24907 if (method_decl_sptr m = cl->find_member_function_sptr(old_lname))
24910 cl->priv_->mem_fns_map_.erase(old_lname);
24916method_decl::~method_decl()
24953 if (l.get() == r.get())
25006{
return dynamic_pointer_cast<method_decl>(d);}
25010struct virtual_member_function_less_than
25034 if (f_offset != s_offset)
return f_offset < s_offset;
25040 if (fn != sn)
return fn < sn;
25046 if ((!f_sym) != (!s_sym))
return !f_sym;
25047 if (f_sym && s_sym)
25049 fn = f_sym->get_id_string();
25050 sn = s_sym->get_id_string();
25051 if (fn != sn)
return fn < sn;
25058 if (fn != sn)
return fn < sn;
25062 string fn_filepath, sn_filepath;
25063 unsigned line = 0, column = 0;
25066 fn_loc.
expand(fn_filepath, line, column);
25068 sn_loc.expand(sn_filepath, line, column);
25069 return fn_filepath < sn_filepath;
25084 operator()(
const method_decl_sptr f,
25085 const method_decl_sptr s)
25086 {
return operator()(*f, *s);}
25095 virtual_member_function_less_than lt;
25096 std::stable_sort(mem_fns.begin(), mem_fns.end(), lt);
25125 size_t vtable_offset,
25126 bool is_static,
bool is_ctor,
25127 bool is_dtor,
bool is_const)
25130 is_dtor, is_const);
25138 sort_virtual_member_functions(klass->priv_->virtual_mem_fns_);
25157 class_decl::member_functions::const_iterator m;
25158 for (m = klass->priv_->virtual_mem_fns_.begin();
25159 m != klass->priv_->virtual_mem_fns_.end();
25161 if (m->get() == method.get()
25162 || (*m)->get_linkage_name() == method->get_linkage_name())
25164 if (m == klass->priv_->virtual_mem_fns_.end())
25165 klass->priv_->virtual_mem_fns_.push_back(method);
25173 class_decl::virtual_mem_fn_map_type::iterator i =
25174 klass->priv_->virtual_mem_fns_map_.find(voffset);
25175 if (i == klass->priv_->virtual_mem_fns_map_.end())
25178 virtual_mem_fns_at_voffset.push_back(method);
25179 klass->priv_->virtual_mem_fns_map_[voffset] = virtual_mem_fns_at_voffset;
25183 for (m = i->second.begin() ; m != i->second.end(); ++m)
25184 if (m->get() == method.get()
25185 || (*m)->get_linkage_name() == method->get_linkage_name())
25187 if (m == i->second.end())
25188 i->second.push_back(method);
25217 if ((*b)->get_is_virtual()
25218 || (*b)->get_base_class()->has_virtual_bases())
25247 ssize_t offset = -1;
25248 for (class_decl::virtual_mem_fn_map_type::const_iterator e =
25252 if (e->first > offset)
25265 return hash_class(
this);
25278methods_equal_modulo_elf_symbol(
const method_decl_sptr& f,
25279 const method_decl_sptr& s)
25281 method_decl_sptr first = f, second = s;
25283 first->get_symbol();
25285 second->get_symbol();
25287 first->get_linkage_name();
25289 second->get_linkage_name();
25292 first->set_linkage_name(
"");
25294 second->set_linkage_name(
"");
25296 bool equal = *first == *second;
25298 first->set_symbol(saved_first_elf_symbol);
25299 first->set_linkage_name(saved_first_linkage_name);
25300 second->set_symbol(saved_second_elf_symbol);
25301 second->set_linkage_name(saved_second_linkage_name);
25322method_matches_at_least_one_in_vector(
const method_decl_sptr& method,
25325 for (class_decl::member_functions::const_iterator i = fns.begin();
25334 if (methods_equal_modulo_elf_symbol(method, *i))
25350maybe_cancel_propagated_canonical_type(
const class_or_union& t)
25352 const environment& env = t.get_environment();
25353 if (env.do_on_the_fly_canonicalization())
25354 if (
is_type(&t)->priv_->canonical_type_propagated())
25356 is_type(&t)->priv_->clear_propagated_canonical_type();
25357 env.priv_->remove_from_types_with_non_confirmed_propagated_ct(&t);
25390 bool result =
false;
25391 if (l.
get_environment().priv_->is_type_comparison_cached(l, r, result))
25403 bool result =
true;
25417 if (!had_canonical_type)
25418 maybe_cancel_propagated_canonical_type(r);
25424#define RETURN(value) CACHE_AND_RETURN_COMPARISON_RESULT(value)
25436 for (class_decl::base_specs::const_iterator
25448 (*b1)->get_base_class().get()))
25494 for (class_decl::virtual_mem_fn_map_type::const_iterator first_v_fn_entry =
25497 ++first_v_fn_entry)
25499 unsigned voffset = first_v_fn_entry->first;
25501 first_v_fn_entry->second;
25503 const class_decl::virtual_mem_fn_map_type::const_iterator
25515 second_v_fn_entry->second;
25517 bool matches =
false;
25518 for (class_decl::member_functions::const_iterator i =
25519 first_vfns.begin();
25520 i != first_vfns.end();
25522 if (method_matches_at_least_one_in_vector(*i, second_vfns))
25612 return *
this == *o;
25656 if (l.get() == r.get())
25688operator==(
const class_or_union_sptr& l,
const class_or_union_sptr& r)
25690 if (l.get() == r.get())
25707operator!=(
const class_or_union_sptr& l,
const class_or_union_sptr& r)
25727 if (v.visit_begin(
this))
25736 if (!(*i)->traverse(v))
25747 if (!(*i)->traverse(v))
25757 if (!(*i)->traverse(v))
25767 if (!(*i)->traverse(v))
25774 for (member_function_templates::const_iterator i =
25778 if (!(*i)->traverse(v))
25785 for (member_class_templates::const_iterator i =
25789 if (!(*i)->traverse(v))
25797 bool result = v.visit_end(
this);
25806context_rel::~context_rel()
25810member_base::operator==(
const member_base& o)
const
25830 if (l.get() == r.get())
25835 return *l ==
static_cast<const decl_base&
>(*r);
25874{
return dynamic_pointer_cast<class_decl::base_spec>(tod);}
25877member_function_template::operator==(
const member_base& other)
const
25884 if (!(is_constructor() == o.is_constructor()
25885 && is_const() == o.is_const()
25886 && member_base::operator==(o)))
25893 return ftdecl->function_tdecl::operator==(*other_ftdecl);
25912 const member_function_template_sptr& r)
25914 if (l.get() == r.get())
25933 const member_function_template_sptr& r)
25950 if (v.visit_begin(
this))
25957 return v.visit_end(
this);
25973 if (!member_base::operator==(o))
25976 return as_class_tdecl()->class_tdecl::operator==(o);
25990 if (!decl_base::operator==(other))
25992 return as_class_tdecl()->class_tdecl::operator==(other);
26006 return *
this == *o;
26019 const member_class_template_sptr& r)
26021 if (l.get() == r.get())
26039 const member_class_template_sptr& r)
26056 if (v.visit_begin(
this))
26063 return v.visit_end(
this);
26083 case private_access:
26086 case protected_access:
26089 case public_access:
26113 c->set_is_static(s);
26123 for (class_decl::data_members::iterator i =
26124 cl->priv_->non_static_data_members_.begin();
26125 i != cl->priv_->non_static_data_members_.end();
26128 if ((*i)->get_name() == v->get_name())
26130 cl->priv_->non_static_data_members_.erase(i);
26136 bool is_already_in_non_static_data_members =
false;
26137 for (class_or_union::data_members::iterator i =
26138 cl->priv_->non_static_data_members_.begin();
26139 i != cl->priv_->non_static_data_members_.end();
26142 if ((*i)->get_name() == v->get_name())
26144 is_already_in_non_static_data_members =
true;
26148 if (!is_already_in_non_static_data_members)
26152 for (class_or_union::data_members::const_iterator i =
26153 cl->priv_->data_members_.begin();
26154 i != cl->priv_->data_members_.end();
26157 if ((*i)->get_name() == v->get_name())
26164 cl->priv_->non_static_data_members_.push_back(var);
26205 size_t size_in_bits,
const location& locus,
26210 | ABSTRACT_TYPE_BASE
26211 | ABSTRACT_DECL_BASE),
26212 decl_base(env, name, locus, name, vis),
26215 locus, vis, mbr_types, data_mbrs, member_fns)
26241 size_t size_in_bits,
const location& locus,
26247 | ABSTRACT_TYPE_BASE
26248 | ABSTRACT_DECL_BASE),
26257 is_anonymous ? string() : name,
26261 locus, vis, mbr_types, data_mbrs, member_fns)
26279 size_t size_in_bits,
const location& locus,
26283 | ABSTRACT_TYPE_BASE
26284 | ABSTRACT_DECL_BASE
26285 | ABSTRACT_SCOPE_TYPE_DECL
26286 | ABSTRACT_SCOPE_DECL),
26287 decl_base(env, name, locus, name, vis),
26310 size_t size_in_bits,
const location& locus,
26314 | ABSTRACT_TYPE_BASE
26315 | ABSTRACT_DECL_BASE
26316 | ABSTRACT_SCOPE_TYPE_DECL
26317 | ABSTRACT_SCOPE_DECL),
26326 is_anonymous ? string() : name,
26345 const string& name,
26346 bool is_declaration_only)
26349 | ABSTRACT_TYPE_BASE
26350 | ABSTRACT_DECL_BASE
26351 | ABSTRACT_SCOPE_TYPE_DECL
26352 | ABSTRACT_SCOPE_DECL),
26379 bool qualified_name)
const
26384 if (internal && !
get_name().empty())
26385 repr = string(
"union ") +
26395 if (qualified_name)
26432 return *
this == *o;
26446 return *
this == *o;
26479 if (v.visit_begin(
this))
26488 if (!(*i)->traverse(v))
26498 if (!(*i)->traverse(v))
26508 if (!(*i)->traverse(v))
26515 for (member_function_templates::const_iterator i =
26519 if (!(*i)->traverse(v))
26526 for (member_class_templates::const_iterator i =
26530 if (!(*i)->traverse(v))
26538 bool result = v.visit_end(
this);
26577 bool result =
false;
26578 if (l.
get_environment().priv_->is_type_comparison_cached(l, r, result))
26599 const method_decl_sptr& f)
26614 const class_or_union_sptr t = union_type;
26629 if (l.get() == r.get())
26653class template_decl::priv
26657 std::list<template_parameter_sptr> parms_;
26670{priv_->parms_.push_back(p);}
26676const std::list<template_parameter_sptr>&
26678{
return priv_->parms_;}
26691 const string& name,
26716 return *
this == *other;
26729 list<shared_ptr<template_parameter> >::const_iterator t0, t1;
26755class template_parameter::priv
26761 mutable bool hashing_started_;
26762 mutable bool comparison_started_;
26770 template_decl_(enclosing_template_decl),
26771 hashing_started_(),
26772 comparison_started_()
26776template_parameter::template_parameter(
unsigned index,
26778 : priv_(new priv(index, enclosing_template))
26782template_parameter::get_index()
const
26783{
return priv_->index_;}
26786template_parameter::get_enclosing_template_decl()
const
26787{
return priv_->template_decl_.lock();}
26790template_parameter::get_hashing_has_started()
const
26791{
return priv_->hashing_started_;}
26794template_parameter::set_hashing_has_started(
bool f)
const
26795{priv_->hashing_started_ = f;}
26800 if (get_index() != o.get_index())
26803 if (priv_->comparison_started_)
26806 bool result =
false;
26811 priv_->comparison_started_ =
true;
26813 if (!!get_enclosing_template_decl() != !!o.get_enclosing_template_decl())
26815 else if (get_enclosing_template_decl()
26816 && (*get_enclosing_template_decl()
26817 != *o.get_enclosing_template_decl()))
26822 priv_->comparison_started_ =
false;
26842class type_tparameter::priv
26857type_tparameter::type_tparameter(
unsigned index,
26859 const string& name,
26863 | ABSTRACT_TYPE_BASE
26865 decl_base(enclosing_tdecl->get_environment(), name, locus),
26866 type_base(enclosing_tdecl->get_environment(), 0, 0),
26867 type_decl(enclosing_tdecl->get_environment(), name, 0, 0, locus),
26882 if (!type_decl::operator==(other))
26902 if (!type_decl::operator==(other))
26922 if (!decl_base::operator==(other))
26958{
return *
this ==
static_cast<const type_base&
>(other);}
26960type_tparameter::~type_tparameter()
26964class non_type_tparameter::priv
26974 priv(type_base_sptr type)
26992non_type_tparameter::non_type_tparameter(
unsigned index,
26994 const string& name,
26995 type_base_sptr type,
26998 decl_base(type->get_environment(), name, locus,
""),
27000 priv_(new priv(type))
27008const type_base_sptr
27010{
return priv_->type_.lock();}
27019 return hash_tparm(
this);
27025 if (!decl_base::operator==(other))
27032 return (template_parameter::operator==(o)
27051non_type_tparameter::~non_type_tparameter()
27057class template_tparameter::priv
27071template_tparameter::template_tparameter(
unsigned index,
27073 const string& name,
27077 | ABSTRACT_TYPE_BASE
27079 decl_base(enclosing_tdecl->get_environment(), name, locus),
27080 type_base(enclosing_tdecl->get_environment(), 0, 0),
27081 type_decl(enclosing_tdecl->get_environment(), name,
27082 0, 0, locus, name, VISIBILITY_DEFAULT),
27084 template_decl(enclosing_tdecl->get_environment(), name, locus),
27102 return (type_tparameter::operator==(o)
27121 return (type_tparameter::operator==(o)
27135 return *
this ==
static_cast<const type_base&
>(other);
27154template_tparameter::~template_tparameter()
27162class type_composition::priv
27186type_composition::type_composition(
unsigned index,
27190 ABSTRACT_DECL_BASE),
27201const type_base_sptr
27203{
return priv_->type_.lock();}
27219 return hash_type_composition(
this);
27222type_composition::~type_composition()
27231class function_tdecl::priv
27243 : pattern_(pattern), binding_(bind)
27270 | ABSTRACT_SCOPE_DECL),
27274 priv_(new priv(bind))
27298 | ABSTRACT_SCOPE_DECL),
27303 priv_(new priv(pattern, bind))
27314 priv_->pattern_ = p;
27324{
return priv_->pattern_;}
27331{
return priv_->binding_;}
27343 return *
this == *o;
27357 return *
this == *o;
27370 && template_decl::operator==(o)
27371 && scope_decl::operator==(o)
27395 if (!v.visit_begin(
this))
27402 return v.visit_end(
this);
27405function_tdecl::~function_tdecl()
27413class class_tdecl::priv
27424 : pattern_(pattern)
27443 | ABSTRACT_SCOPE_DECL),
27468 | ABSTRACT_SCOPE_DECL),
27473 priv_(new priv(pattern))
27484 priv_->pattern_ = p;
27494{
return priv_->pattern_;}
27503 if (!(template_decl::operator==(o)
27504 && scope_decl::operator==(o)
27523 return *
this ==
static_cast<const decl_base&
>(o);
27531{
return *
this ==
static_cast<const decl_base&
>(o);}
27547 if (v.visit_begin(
this))
27551 pattern->traverse(v);
27554 return v.visit_end(
this);
27557class_tdecl::~class_tdecl()
27568 non_canonicalized_subtype_detector();
27571 non_canonicalized_subtype_detector(
type_base* type)
27573 has_non_canonical_type_()
27582 has_non_canonical_type()
const
27583 {
return has_non_canonical_type_;}
27588 visit_begin(function_decl* f)
27606 visit_begin(type_base* t)
27610 if (!t->get_canonical_type())
27614 has_non_canonical_type_ = t;
27629 visit_end(type_base* )
27631 if (has_non_canonical_type_)
27648 non_canonicalized_subtype_detector v(t.get());
27650 return v.has_non_canonical_type();
27666 const type_base_sptr t_v2)
27673 return (t1 != t2 && repr1 == repr2);
27684 env.priv_->extra_live_types_.push_back(t);
27720 string repr = v->get_pretty_representation(
true);
27721 std::hash<string> hash_string;
27722 h = hashing::combine_hashes(h, hash_string(repr));
27729 string repr = f->get_pretty_representation(
true);
27730 std::hash<string> hash_string;
27731 h = hashing::combine_hashes(h, hash_string(repr));
27736 type_base_sptr parm_type = p->get_type();
27738 std::hash<bool> hash_bool;
27739 std::hash<unsigned> hash_unsigned;
27741 h = hashing::combine_hashes(h, hash_unsigned(p->get_index()));
27742 h = hashing::combine_hashes(h, hash_bool(p->get_variadic_marker()));
27748 std::hash<size_t> hash_size;
27749 std::hash<bool> hash_bool;
27750 type_base_sptr type = bs->get_base_class();
27752 h = hashing::combine_hashes(h, hash_member(*bs));
27753 h = hashing::combine_hashes(h, hash_size(bs->get_offset_in_bits()));
27754 h = hashing::combine_hashes(h, hash_bool(bs->get_is_virtual()));
27761 result = d->get_hash();
27786{
return hash_as_canonical_type_or_constant(t);}
27894 exemplar =
const_cast<type_base*
>(type);
27923hash_as_canonical_type_or_constant(
const type_base *t)
27930 if (!canonical_type)
27948 if (canonical_type)
27949 return reinterpret_cast<size_t>(canonical_type);
28024 const type_base_sptr& second,
28025 bool indirect_type)
28057 bool indirect_type)
28059 if (!!first != !!second)
28071 if (
typeid(*first) !=
typeid(*second))
28087 if (ty1->is_lvalue() != ty2->is_lvalue())
28090 ty2->get_pointed_to_type(),
28109 if (!indirect_type)
28113 return ty1->get_name() == ty2->
get_name();
28119 if (!indirect_type)
28123 return (
get_name(ty1->get_underlying_type())
28131 && ty1->get_name() != ty2->
get_name())
28134 if (!indirect_type)
28137 || (ty1->get_non_static_data_members().size()
28141 for (class_or_union::data_members::const_iterator
28142 i = ty1->get_non_static_data_members().begin(),
28144 (i != ty1->get_non_static_data_members().end()
28151 dm2->get_type().get(),
28164 && ty1->get_name() != ty2->
get_name())
28167 if (!indirect_type)
28177 if (!indirect_type)
28180 || ty1->get_dimension_count() != ty2->get_dimension_count())
28214 if (ty1->get_parameters().size() != ty2->
get_parameters().size())
28217 for (function_type::parameters::const_iterator
28218 i = ty1->get_parameters().begin(),
28220 (i != ty1->get_parameters().end()
28250 const char* dm_name)
28278 return cou->find_data_member(dm);
28293 unsigned parm_index)
28300 if (parms.size() <= parm_index)
28303 return parms[parm_index].get();
28318 std::ostringstream o;
28321 o <<
"unnamed-enum";
28325 o <<
"-underlying-type-" << size;
28345 return data_member;
28365 for (; d != e; ++d)
28386stream_pretty_representation_of_fn_parms(
const function_type& fn_type,
28387 ostream& o,
bool qualified,
28395 type_base_sptr type;
28402 if (i != first_parm)
28405 type = parm->get_type();
28466add_outer_pointer_to_fn_type_expr(
const type_base* p,
28467 const string& input,
28468 bool qualified,
bool internal)
28474 string star_or_ref;
28487 if (!pointed_to_fn)
28490 std::ostringstream left, right, inner;
28492 inner <<
"(" << star_or_ref << input <<
")";
28494 type_base_sptr type;
28495 stream_pretty_representation_of_fn_parms(*pointed_to_fn, right,
28496 qualified, internal);
28497 type_base_sptr return_type =
28500 : pointed_to_fn->get_return_type();
28510 result = left.str() +
" " + inner.str() + right.str();
28514 string inner_string = inner.str() + right.str();
28515 result = add_outer_pointer_to_fn_type_expr(p, inner_string,
28516 qualified, internal);
28520 string inner_string = inner.str() + right.str();
28521 result = add_outer_pointer_to_array_type_expr(p, inner_string,
28522 qualified, internal);
28577add_outer_pointer_to_fn_type_expr(
const type_base_sptr& p,
28578 const string& input,
28579 bool qualified,
bool internal)
28580{
return add_outer_pointer_to_fn_type_expr(p.get(), input, qualified, internal);}
28633add_outer_pointer_to_array_type_expr(
const type_base* p,
28634 const string& input,
bool qualified,
28640 string star_or_ref;
28641 type_base_sptr pointed_to_type;
28645 pointed_to_type = ptr->get_pointed_to_type();
28650 pointed_to_type = ref->get_pointed_to_type();
28658 std::ostringstream left, right, inner;
28659 inner <<
"(" << star_or_ref << input <<
")";
28660 right << array->get_subrange_representation();
28663 type_base_sptr array_element_type = array->get_element_type();
28669 left <<
get_type_name(array_element_type, qualified, internal);
28670 result = left.str() + inner.str() + right.str();
28675 string r = inner.str() + right.str();
28676 result = add_outer_pointer_to_fn_type_expr(p, r, qualified, internal);
28681 string inner_string = inner.str() + right.str();
28682 result = add_outer_pointer_to_array_type_expr(p, inner_string,
28683 qualified, internal);
28742add_outer_pointer_to_array_type_expr(
const type_base_sptr& pointer_to_ar,
28743 const string& input,
bool qualified,
28745{
return add_outer_pointer_to_array_type_expr(pointer_to_ar.get(),
28746 input, qualified, internal);}
28794add_outer_ptr_to_mbr_type_expr(
const ptr_to_mbr_type* p,
28795 const string& input,
bool qualified,
28801 std::ostringstream left, right, inner;
28802 string containing_type_name =
get_type_name(p->get_containing_type(),
28803 qualified, internal);
28804 type_base_sptr mbr_type = p->get_member_type();
28808 inner <<
"(" << containing_type_name <<
"::*" << input <<
")";
28809 stream_pretty_representation_of_fn_parms(*fn_type, right,
28810 qualified, internal);
28818 left <<
get_type_name(return_type, qualified, internal) <<
" ";;
28819 result = left.str() + inner.str() + right.str();
28823 string inner_str = inner.str() + right.str();
28824 result = pointer_declaration_name(p, inner_str, qualified, internal);
28828 string inner_str = inner.str() + right.str();
28829 result = add_outer_ptr_to_mbr_type_expr(p, inner_str,
28830 qualified, internal);
28837 inner <<
"(" << containing_type_name <<
"::*" << input <<
")";
28838 stream_pretty_representation_of_fn_parms(*fn_type, right,
28839 qualified, internal);
28840 string inner_str = inner.str() + right.str();
28841 result = add_outer_ptr_to_mbr_type_expr(ptr_mbr_type, inner_str,
28842 qualified, internal);
28846 left <<
get_type_name(p->get_member_type(), qualified, internal) <<
" ";
28847 inner << containing_type_name <<
"::*" << input;
28848 result = left.str()+ inner.str();
28901 const string& input,
bool qualified,
28903{
return add_outer_ptr_to_mbr_type_expr(p.get(), input, qualified, internal);}
28923add_outer_pointer_to_ptr_to_mbr_type_expr(
const type_base* p,
28924 const string& input,
bool qualified,
28930 string star_or_ref;
28931 type_base_sptr pointed_to_type;
28935 pointed_to_type = ptr->get_pointed_to_type();
28940 pointed_to_type= ref->get_pointed_to_type();
28944 if (!pointed_to_type)
28949 if (!pointed_to_ptr_to_mbr)
28952 std::ostringstream inner;
28953 inner << star_or_ref << input;
28954 string result = add_outer_ptr_to_mbr_type_expr(pointed_to_ptr_to_mbr,
28956 qualified, internal);
28973static interned_string
28974pointer_declaration_name(
const type_base* ptr,
28975 const string& idname,
28976 bool qualified,
bool internal)
28979 return interned_string();
28981 type_base_sptr pointed_to_type;
28982 string star_or_ref;
28985 pointed_to_type = p->get_pointed_to_type();
28990 pointed_to_type = p->get_pointed_to_type();
28994 if (!pointed_to_type)
28995 return interned_string();
29008 if (!idname.empty())
29015 result = add_outer_pointer_to_fn_type_expr(ptr, idname,
29016 qualified, internal);
29018 result = add_outer_pointer_to_array_type_expr(ptr, idname,
29019 qualified, internal);
29021 result = add_outer_pointer_to_ptr_to_mbr_type_expr(ptr, idname,
29022 qualified, internal);
29026 return ptr->get_environment().intern(result);
29043static interned_string
29044pointer_declaration_name(
const type_base_sptr& ptr,
29045 const string& variable_name,
29046 bool qualified,
bool internal)
29047{
return pointer_declaration_name(ptr.get(), variable_name,
29048 qualified, internal);}
29063static interned_string
29064array_declaration_name(
const array_type_def* array,
29065 const string& variable_name,
29066 bool qualified,
bool internal)
29069 return interned_string();
29071 type_base_sptr e_type = array->get_element_type();
29072 string e_type_repr =
29080 std::ostringstream o;
29081 if (!variable_name.empty())
29082 o << variable_name <<
" is ";
29084 << array->get_subrange_representation()
29085 <<
") of " << e_type_repr;
29096 result = e_type_repr;
29097 if (!variable_name.empty())
29098 result += variable_name;
29099 result += array->get_subrange_representation();
29103 string s = variable_name + array->get_subrange_representation();
29104 result = pointer_declaration_name(p, s, qualified, internal);
29108 string s = variable_name + array->get_subrange_representation();
29109 result = ptr_to_mbr_declaration_name(p, s, qualified, internal);
29114 return array->get_environment().intern(result);
29130static interned_string
29132 const string& variable_name,
29133 bool qualified,
bool internal)
29134{
return array_declaration_name(array.get(), variable_name,
29135 qualified, internal);}
29150static interned_string
29151ptr_to_mbr_declaration_name(
const ptr_to_mbr_type* ptr,
29152 const string& variable_name,
29153 bool qualified,
bool internal)
29156 return interned_string();
29158 string input = variable_name;
29159 string result = add_outer_ptr_to_mbr_type_expr(ptr, input,
29160 qualified, internal);
29161 return ptr->get_environment().intern(result);
29177static interned_string
29179 const string& variable_name,
29180 bool qualified,
bool internal)
29182 return ptr_to_mbr_declaration_name(ptr.get(), variable_name,
29183 qualified, internal);
29193struct ir_node_visitor::priv
29208ir_node_visitor::~ir_node_visitor() =
default;
29217{priv_->allow_visiting_already_visited_type_node = f;}
29226{
return priv_->allow_visiting_already_visited_type_node;}
29246 size_t canonical_ptr_value =
reinterpret_cast<size_t>(canonical_type);
29247 priv_->visited_ir_nodes.insert(canonical_ptr_value);
29260{priv_->visited_ir_nodes.clear();}
29280 size_t ptr_value =
reinterpret_cast<size_t>(canonical_type);
29281 pointer_set::iterator it = priv_->visited_ir_nodes.find(ptr_value);
29282 if (it == priv_->visited_ir_nodes.end())
29289ir_node_visitor::visit_begin(
decl_base*)
29297ir_node_visitor::visit_begin(scope_decl*)
29301ir_node_visitor::visit_end(scope_decl*)
29305ir_node_visitor::visit_begin(type_base*)
29309ir_node_visitor::visit_end(type_base*)
29313ir_node_visitor::visit_begin(scope_type_decl* t)
29314{
return visit_begin(
static_cast<type_base*
>(t));}
29317ir_node_visitor::visit_end(scope_type_decl* t)
29318{
return visit_end(
static_cast<type_base*
>(t));}
29321ir_node_visitor::visit_begin(type_decl* t)
29322{
return visit_begin(
static_cast<type_base*
>(t));}
29325ir_node_visitor::visit_end(type_decl* t)
29326{
return visit_end(
static_cast<type_base*
>(t));}
29329ir_node_visitor::visit_begin(namespace_decl* d)
29330{
return visit_begin(
static_cast<decl_base*
>(d));}
29333ir_node_visitor::visit_end(namespace_decl* d)
29334{
return visit_end(
static_cast<decl_base*
>(d));}
29337ir_node_visitor::visit_begin(qualified_type_def* t)
29338{
return visit_begin(
static_cast<type_base*
>(t));}
29341ir_node_visitor::visit_end(qualified_type_def* t)
29342{
return visit_end(
static_cast<type_base*
>(t));}
29345ir_node_visitor::visit_begin(pointer_type_def* t)
29346{
return visit_begin(
static_cast<type_base*
>(t));}
29349ir_node_visitor::visit_end(pointer_type_def* t)
29350{
return visit_end(
static_cast<type_base*
>(t));}
29353ir_node_visitor::visit_begin(reference_type_def* t)
29354{
return visit_begin(
static_cast<type_base*
>(t));}
29357ir_node_visitor::visit_end(reference_type_def* t)
29358{
return visit_end(
static_cast<type_base*
>(t));}
29361ir_node_visitor::visit_begin(ptr_to_mbr_type* t)
29362{
return visit_begin(
static_cast<type_base*
>(t));}
29365ir_node_visitor::visit_end(ptr_to_mbr_type* t)
29366{
return visit_end(
static_cast<type_base*
>(t));}
29369ir_node_visitor::visit_begin(array_type_def* t)
29370{
return visit_begin(
static_cast<type_base*
>(t));}
29373ir_node_visitor::visit_end(array_type_def* t)
29374{
return visit_end(
static_cast<type_base*
>(t));}
29377ir_node_visitor::visit_begin(array_type_def::subrange_type* t)
29378{
return visit_begin(
static_cast<type_base*
>(t));}
29381ir_node_visitor::visit_end(array_type_def::subrange_type* t)
29382{
return visit_end(
static_cast<type_base*
>(t));}
29385ir_node_visitor::visit_begin(enum_type_decl* t)
29386{
return visit_begin(
static_cast<type_base*
>(t));}
29389ir_node_visitor::visit_end(enum_type_decl* t)
29390{
return visit_end(
static_cast<type_base*
>(t));}
29393ir_node_visitor::visit_begin(typedef_decl* t)
29394{
return visit_begin(
static_cast<type_base*
>(t));}
29397ir_node_visitor::visit_end(typedef_decl* t)
29398{
return visit_end(
static_cast<type_base*
>(t));}
29401ir_node_visitor::visit_begin(function_type* t)
29402{
return visit_begin(
static_cast<type_base*
>(t));}
29405ir_node_visitor::visit_end(function_type* t)
29406{
return visit_end(
static_cast<type_base*
>(t));}
29409ir_node_visitor::visit_begin(var_decl* d)
29410{
return visit_begin(
static_cast<decl_base*
>(d));}
29413ir_node_visitor::visit_end(var_decl* d)
29414{
return visit_end(
static_cast<decl_base*
>(d));}
29417ir_node_visitor::visit_begin(function_decl* d)
29418{
return visit_begin(
static_cast<decl_base*
>(d));}
29421ir_node_visitor::visit_end(function_decl* d)
29422{
return visit_end(
static_cast<decl_base*
>(d));}
29425ir_node_visitor::visit_begin(function_decl::parameter* d)
29426{
return visit_begin(
static_cast<decl_base*
>(d));}
29429ir_node_visitor::visit_end(function_decl::parameter* d)
29430{
return visit_end(
static_cast<decl_base*
>(d));}
29433ir_node_visitor::visit_begin(function_tdecl* d)
29434{
return visit_begin(
static_cast<decl_base*
>(d));}
29437ir_node_visitor::visit_end(function_tdecl* d)
29438{
return visit_end(
static_cast<decl_base*
>(d));}
29441ir_node_visitor::visit_begin(class_tdecl* d)
29442{
return visit_begin(
static_cast<decl_base*
>(d));}
29445ir_node_visitor::visit_end(class_tdecl* d)
29446{
return visit_end(
static_cast<decl_base*
>(d));}
29449ir_node_visitor::visit_begin(class_or_union* t)
29450{
return visit_begin(
static_cast<type_base*
>(t));}
29453ir_node_visitor::visit_end(class_or_union* t)
29454{
return visit_end(
static_cast<type_base*
>(t));}
29457ir_node_visitor::visit_begin(class_decl* t)
29458{
return visit_begin(
static_cast<type_base*
>(t));}
29461ir_node_visitor::visit_end(class_decl* t)
29462{
return visit_end(
static_cast<type_base*
>(t));}
29465ir_node_visitor::visit_begin(union_decl* t)
29466{
return visit_begin(
static_cast<type_base*
>(t));}
29469ir_node_visitor::visit_end(union_decl* t)
29470{
return visit_end(
static_cast<type_base*
>(t));}
29473ir_node_visitor::visit_begin(class_decl::base_spec* d)
29474{
return visit_begin(
static_cast<decl_base*
>(d));}
29477ir_node_visitor::visit_end(class_decl::base_spec* d)
29478{
return visit_end(
static_cast<decl_base*
>(d));}
29481ir_node_visitor::visit_begin(member_function_template* d)
29482{
return visit_begin(
static_cast<decl_base*
>(d));}
29485ir_node_visitor::visit_end(member_function_template* d)
29486{
return visit_end(
static_cast<decl_base*
>(d));}
29489ir_node_visitor::visit_begin(member_class_template* d)
29490{
return visit_begin(
static_cast<decl_base*
>(d));}
29493ir_node_visitor::visit_end(member_class_template* d)
29494{
return visit_end(
static_cast<decl_base*
>(d));}
29506 static __thread
size_t counter;
29508 std::ostringstream o;
29515typedef unordered_map<
const function_decl*, string,
29516 function_decl::hash,
29535static const string&
29539 fns_to_str_map_type::const_iterator i = m.find(fn);
29542 string s = get_next_string();
29563fns_to_str(vector<function_decl*>::const_iterator begin,
29564 vector<function_decl*>::const_iterator end,
29568 vector<function_decl*>::const_iterator i;
29569 for (i = begin; i != end; ++i)
29570 o <<
"'" << fn_to_str(*i, m) <<
"' ";
29596fns_to_str(vector<function_decl*>::const_iterator a_begin,
29597 vector<function_decl*>::const_iterator a_end,
29598 vector<function_decl*>::const_iterator b_begin,
29599 vector<function_decl*>::const_iterator b_end,
29603 fns_to_str(a_begin, a_end, m, o);
29605 fns_to_str(b_begin, b_end, m, o);
29629fns_to_str(vector<function_decl*>::const_iterator a_begin,
29630 vector<function_decl*>::const_iterator a_end,
29631 vector<function_decl*>::const_iterator b_begin,
29632 vector<function_decl*>::const_iterator b_end,
29636 fns_to_str(a_begin, a_end, b_begin, b_end, m, o);
29658 std::string parent_qualified_name;
29667 if (!d->priv_->qualified_parent_name_.empty())
29673 d->priv_->qualified_name_ =
29674 env.
intern(d->priv_->qualified_parent_name_ +
"::" + d->
get_name());
29679 if (d->priv_->scoped_name_.empty())
29684 d->priv_->scoped_name_ =
29687 d->priv_->scoped_name_ =
29705{
return do_update(d);}
29717 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.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Get the pretty representation of the current instance of function_decl.
interned_string get_id() const
Return an ID that tries to uniquely identify the function inside a program or a library.
Abstract a function template declaration.
binding get_binding() const
Get the binding of the function template.
void set_pattern(shared_ptr< function_decl > p)
Set a new pattern to the function template.
shared_ptr< function_decl > get_pattern() const
Get the pattern of the function template.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
virtual bool operator==(const decl_base &) const
Comparison operator for the function_tdecl type.
Abstraction of a function type.
shared_ptr< function_decl::parameter > parameter_sptr
Convenience typedef for a shared pointer on a function_decl::parameter.
virtual bool traverse(ir_node_visitor &)
Traverses an instance of function_type, visiting all the sub-types and decls that it might contain.
bool is_variadic() const
Test if the current instance of function_type is for a variadic function.
parameters::const_iterator get_first_parm() const
Get the first parameter of the function.
virtual void on_canonical_type_set()
This function is automatically invoked whenever an instance of this type is canonicalized.
virtual bool operator==(const type_base &) const
Equality operator for function_type.
void append_parameter(parameter_sptr parm)
Append a new parameter to the vector of parameters of the current instance of function_type.
void set_parameters(const parameters &p)
Setter for the parameters of the current instance of function_type.
const interned_string & get_cached_name(bool internal=false) const
Get the name of the current function_type.
const parameter_sptr get_parm_at_index_from_first_non_implicit_parm(size_t) const
Get the Ith parameter of the vector of parameters of the current instance of function_type.
type_base_sptr get_return_type() const
Getter for the return type of the current instance of function_type.
void set_return_type(type_base_sptr t)
Setter of the return type of the current instance of function_type.
parameters::const_iterator get_first_non_implicit_parm() const
Get the first parameter of the function.
const parameters & get_parameters() const
Getter for the set of parameters of the current intance of function_type.
std::vector< parameter_sptr > parameters
Convenience typedef for a vector of parameter_sptr.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Return a copy of the pretty representation of the current function_type.
This abstracts the global scope of a given translation unit.
The internal representation of an integral type.
void set_modifiers(modifiers_type)
Setter of the modifiers bitmap of the integral_type.
string to_string(bool internal=false) const
Return the string representation of the current instance of integral_type.
base_type get_base_type() const
Getter of the base type of the integral_type.
modifiers_type
The modifiers of the base types above. Several modifiers can be combined for a given base type....
@ LONG_LONG_MODIFIER
The "long long" modifier.
@ LONG_MODIFIER
The "long" modifier.
@ SIGNED_MODIFIER
The "signed" modifier.
@ UNSIGNED_MODIFIER
The "unsigned" modier.
@ SHORT_MODIFIER
The "short" modifier.
bool operator==(const integral_type &) const
Equality operator for the integral_type.
base_type
The possible base types of integral types. We might have forgotten many of these, so do not hesitate ...
@ WCHAR_T_BASE_TYPE
The "wchar_t" base type.
@ CHAR32_T_BASE_TYPE
The "char32_t" base type.
@ FLOAT_BASE_TYPE
The "float" base type.
@ BOOL_BASE_TYPE
The "bool" base type in C++ or "_Bool" in C11.
@ CHAR_BASE_TYPE
The "char" base type.
@ CHAR16_T_BASE_TYPE
The "char16_t base type.
@ INT_BASE_TYPE
The "int" base type.
@ DOUBLE_BASE_TYPE
The "double" base type.
modifiers_type get_modifiers() const
Getter of the modifiers bitmap of the integral_type.
integral_type()
Default constructor of the integral_type.
The base class for the visitor type hierarchy used for traversing a translation unit.
bool allow_visiting_already_visited_type_node() const
Get if the walker using this visitor is allowed to re-visit a type node that was previously visited o...
bool type_node_has_been_visited(type_base *) const
Test if a given type node has been marked as visited.
void forget_visited_type_nodes()
Un-mark all visited type nodes.
ir_node_visitor()
Default Constructor of the ir_node_visitor type.
void mark_type_node_as_visited(type_base *)
Mark a given type node as having been visited.
The entry point to manage locations.
location create_new_location(const std::string &fle, size_t lne, size_t col)
Insert the triplet representing a source locus into our internal vector of location triplet....
void expand_location(const location &location, std::string &path, unsigned &line, unsigned &column) const
Given an instance of location type, return the triplet {path,line,column} that represents the source ...
The source location of a token.
bool get_is_artificial() const
Test if the location is artificial.
unsigned get_value() const
Get the value of the location.
string expand(void) const
Expand the location into a string.
void expand(std::string &path, unsigned &line, unsigned &column) const
Expand the current location into a tripplet file path, line and column number.
Abstraction of a member function context relationship. This relates a member function to its parent c...
bool is_constructor() const
Getter for the 'is-constructor' property.
bool is_const() const
Getter for the 'is-const' property.
size_t vtable_offset() const
Getter for the vtable offset property.
bool is_destructor() const
Getter for the 'is-destructor' property.
The base class for member types, data members and member functions. Its purpose is mainly to carry th...
access_specifier get_access_specifier() const
Getter for the access specifier of this member.
bool get_is_static() const
Abstracts a member class template template.
virtual bool operator==(const member_base &o) const
Equality operator of the the member_class_template class.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
Abstract a member function template.
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
Abstraction of the declaration of a method.
friend void set_member_function_is_const(function_decl &, bool)
set the const-ness property of a member function.
virtual void set_linkage_name(const string &)
Set the linkage name of the method.
const method_type_sptr get_type() const
Abstracts the type of a class member function.
void set_class_type(const class_or_union_sptr &t)
Sets the class type of the current instance of method_type.
void set_is_const(bool)
Setter of the "is-const" property of method_type.
virtual ~method_type()
The destructor of method_type.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Return a copy of the pretty representation of the current method_type.
class_or_union_sptr get_class_type() const
Get the class type this method belongs to.
bool get_is_const() const
Getter of the "is-const" property of method_type.
The abstraction of a namespace declaration.
bool is_empty_or_has_empty_sub_namespaces() const
Test if the current namespace_decl is empty or contains empty namespaces itself.
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
namespace_decl(const environment &env, const string &name, const location &locus, visibility vis=VISIBILITY_DEFAULT)
Constructor.
virtual bool operator==(const decl_base &) const
Return true iff both namespaces and their members are equal.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Build and return a copy of the pretty representation of the namespace.
Abstracts non type template parameters.
const type_base_sptr get_type() const
Getter for the type of the template parameter.
virtual bool operator==(const decl_base &) const
Return true iff the two decls have the same name.
virtual size_t get_hash() const
Get the hash value of the current instance.
The abstraction of a pointer type.
void set_pointed_to_type(const type_base_sptr &)
Set the pointed-to type of the pointer.
virtual void get_qualified_name(interned_string &, bool internal=false) const
Build and return the qualified name of the current instance of pointer_type_def.
virtual void on_canonical_type_set()
This function is automatically invoked whenever an instance of this type is canonicalized.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
virtual bool operator==(const decl_base &) const
Return true iff both instances of pointer_type_def are equal.
const type_base_sptr get_pointed_to_type() const
Getter of the pointed-to type.
type_base * get_naked_pointed_to_type() const
Getter of a naked pointer to the pointed-to type.
The abstraction of a 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.
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.
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.
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.
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.
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.
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.
The private data of the environment type.
A hashing functor fo instances and pointers of function_decl.
A hashing functor for a function_decl::parameter.
Equality functor for instances of function_decl.
The hashing functor for function_type.
The type of the private data of the function_type type.
virtual bool traverse(ir_node_visitor &v)
Traverse a given IR node and its children, calling an visitor on each node.
The hashing functor for member_base.
Hasher for the non_type_tparameter type.
Hasher for the scope_decl type.
Private type to hold private members of translation_unit.
Definition of the private data of type_base.
Hasher for the type_composition type.
A predicate for deep equality of instances of shared_ptr<type_base>
A hashing functor for instances and pointers of var_decl.
A deleter for shared pointers that ... doesn't delete the object managed by the shared pointer.