20#include <unordered_map>
24#include "abg-internal.h"
26ABG_BEGIN_EXPORT_DECLARATIONS
33ABG_END_EXPORT_DECLARATIONS
68using std::unordered_map;
69using std::dynamic_pointer_cast;
70using std::static_pointer_cast;
77struct interned_string_pool::priv
97{
return priv_->map.find(s) != priv_->map.end();}
108 unordered_map<string, string*>::const_iterator i =
110 if (i == priv_->map.end())
113 return i->second->c_str();
125 string*& result = priv_->map[str_value];
126 if (!result && !str_value.empty())
127 result =
new string(str_value);
134 for (pool_map_type::iterator i = priv_->map.begin();
135 i != priv_->map.end();
152{
return r.operator==(l);}
155operator!=(
const std::string& l,
const interned_string& r)
170 o << static_cast<std::string>(s);
186{
return static_cast<std::string
>(s1) + s2;}
200{
return s1 +
static_cast<std::string
>(s2);}
206hash_as_canonical_type_or_constant(
const type_base *t);
209has_generic_anonymous_internal_type_name(
const decl_base *d);
211static interned_string
212get_generic_anonymous_internal_type_name(
const decl_base *d);
215get_internal_real_type_name(
const type_base*);
218update_qualified_name(decl_base * d);
221update_qualified_name(decl_base_sptr d);
223static interned_string
224pointer_declaration_name(
const type_base* ptr,
225 const string& variable_name,
226 bool qualified,
bool internal);
228static interned_string
229pointer_declaration_name(
const type_base_sptr& ptr,
230 const string& variable_name,
231 bool qualified,
bool internal);
233static interned_string
234ptr_to_mbr_declaration_name(
const ptr_to_mbr_type* ptr,
235 const string& variable_name,
236 bool qualified,
bool internal);
238static interned_string
240 const string& variable_name,
241 bool qualified,
bool internal);
243static interned_string
244array_declaration_name(
const array_type_def* array,
245 const string& variable_name,
246 bool qualified,
bool internal);
248static interned_string
250 const string& variable_name,
251 bool qualified,
bool internal);
254stream_pretty_representation_of_fn_parms(
const function_type& fn_type,
255 ostream& o,
bool qualified,
258add_outer_pointer_to_fn_type_expr(
const type_base* pointer_to_fn,
259 const string& input,
bool qualified,
263add_outer_pointer_to_fn_type_expr(
const type_base_sptr& pointer_to_fn,
264 const string& input,
bool qualified,
268add_outer_pointer_to_array_type_expr(
const type_base* pointer_to_ar,
269 const string& input,
bool qualified,
273add_outer_pointer_to_array_type_expr(
const type_base_sptr& pointer_to_ar,
274 const string& input,
bool qualified,
278add_outer_ptr_to_mbr_type_expr(
const ptr_to_mbr_type* p,
279 const string& input,
bool qualified,
284 const string& input,
bool qualified,
288add_outer_pointer_to_ptr_to_mbr_type_expr(
const type_base* p,
290 bool qualified,
bool internal);
294 const type_base& right);
298 const type_base& right);
315 env.priv_->push_composite_type_comparison_operands(&left, &right);
336 env.priv_->pop_composite_type_comparison_operands(&left, &right);
346{
return t.priv_->canonical_type_index;}
381 if (c && t->get_corpus())
386 if (t->get_corpus()->get_group() == g.get())
391 if (t->get_corpus() == c.get())
400class expanded_location
412 expanded_location(
const string& path,
unsigned line,
unsigned column)
413 : path_(path), line_(line), column_(column)
417 operator==(
const expanded_location& l)
const
419 return (path_ == l.path_
421 && column_ && l.column_);
425 operator<(
const expanded_location& l)
const
429 else if (path_ > l.path_)
434 else if (line_ > l.line_)
437 return column_ < l.column_;
454 if (!get_location_manager())
475 unsigned line = 0, column = 0;
476 expand(path, line, column);
478 std::ostringstream o;
479 o << path <<
":" << line <<
":" << column;
483struct location_manager::priv
489 std::vector<expanded_location> locs;
492location_manager::location_manager()
496location_manager::~location_manager() =
default;
511 expanded_location l(file_path, line, col);
515 priv_->locs.push_back(l);
516 return location(priv_->locs.size(),
this);
533 unsigned& column)
const
537 expanded_location &l = priv_->locs[
location.value_ - 1];
550struct type_maps::priv
564 mutable vector<type_base_wptr> sorted_types_;
567type_maps::type_maps()
571type_maps::~type_maps() =
default;
596{
return priv_->basic_types_;}
603{
return priv_->basic_types_;}
610{
return priv_->class_types_;}
617{
return priv_->class_types_;}
624{
return priv_->union_types_;}
631{
return priv_->union_types_;}
638{
return priv_->enum_types_;}
645{
return priv_->enum_types_;}
652{
return priv_->typedef_types_;}
659{
return priv_->typedef_types_;}
665{
return priv_->qualified_types_;}
671{
return priv_->qualified_types_;}
678{
return priv_->pointer_types_;}
685{
return priv_->ptr_to_mbr_types_;}
692{
return priv_->ptr_to_mbr_types_;}
699{
return priv_->pointer_types_;}
706{
return priv_->reference_types_;}
713{
return priv_->reference_types_;}
720{
return priv_->array_types_;}
727{
return priv_->array_types_;}
734{
return priv_->subrange_types_;}
741{
return priv_->subrange_types_;}
748{
return priv_->function_types_;}
755{
return priv_->function_types_;}
774 if (l == 0 && r == 0)
779 return l_repr < r_repr;
793 operator()(
const type_base_sptr &l,
const type_base_sptr &r)
const
794 {
return operator()(l.get(), r.get());}
808 {
return operator()(type_base_sptr(l), type_base_sptr(r));}
811#ifdef WITH_DEBUG_SELF_COMPARISON
827notify_equality_failed(
const type_or_decl_base &l __attribute__((unused)),
828 const type_or_decl_base &r __attribute__((unused)))
845notify_equality_failed(
const type_or_decl_base *l __attribute__((unused)),
846 const type_or_decl_base *r __attribute__((unused)))
849#define ABG_RETURN_EQUAL(l, r) \
853 notify_equality_failed(l, r); \
859#define ABG_RETURN_FALSE \
862 notify_equality_failed(l, r); \
866#define ABG_RETURN(value) \
869 if (value == false) \
870 notify_equality_failed(l, r); \
876#define ABG_RETURN_FALSE return false
877#define ABG_RETURN(value) return (value)
878#define ABG_RETURN_EQUAL(l, r) return ((l) == (r));
898 if (
type_base* type = t->get_naked_canonical_type())
899 return dynamic_cast<T*
>(type);
916#if WITH_DEBUG_TYPE_CANONICALIZATION
936 if (env.priv_->use_canonical_type_comparison_)
938 if (
const type_base *lc = l->get_naked_canonical_type())
939 if (
const type_base *rc = r->get_naked_canonical_type())
940 ABG_RETURN_EQUAL(lc, rc);
949 if (l_hash != r_hash)
958 if (
const type_base *lc = l->get_naked_canonical_type())
959 if (
const type_base *rc = r->get_naked_canonical_type())
960 ABG_RETURN_EQUAL(lc, rc);
968 if (l_hash != r_hash)
991 bool result = l.priv_->comparison_started(l, r);
1031#define RETURN_TRUE_IF_COMPARISON_CYCLE_DETECTED(l, r) \
1034 if (is_comparison_cycle_detected(l, r)) \
1052 l.priv_->mark_as_being_compared(l, r);
1087 l.priv_->unmark_as_being_compared(l, r);
1133#define CACHE_AND_RETURN_COMPARISON_RESULT(value) \
1136 bool res = return_comparison_result(l, r, value); \
1137 l.get_environment().priv_->cache_type_comparison_result(l, r, res); \
1145#define CACHE_COMPARISON_RESULT_AND_RETURN(value) \
1148 l.get_environment().priv_->cache_type_comparison_result(l, r, value); \
1156const vector<type_base_wptr>&
1159 if (priv_->sorted_types_.empty())
1161 istring_type_base_wptrs_map_type::const_iterator i;
1162 vector<type_base_wptr>::const_iterator j;
1165 for (j = i->second.begin(); j != i->second.end(); ++j)
1166 priv_->sorted_types_.push_back(*j);
1169 for (j = i->second.begin(); j != i->second.end(); ++j)
1170 priv_->sorted_types_.push_back(*j);
1173 for (j = i->second.begin(); j != i->second.end(); ++j)
1174 priv_->sorted_types_.push_back(*j);
1177 for (j = i->second.begin(); j != i->second.end(); ++j)
1178 priv_->sorted_types_.push_back(*j);
1181 for (j = i->second.begin(); j != i->second.end(); ++j)
1182 priv_->sorted_types_.push_back(*j);
1184 type_name_comp comp;
1185 sort(priv_->sorted_types_.begin(), priv_->sorted_types_.end(), comp);
1188 return priv_->sorted_types_;
1207 const std::string& path,
1209 : priv_(new
priv(env))
1211 priv_->path_ = path;
1212 priv_->address_size_ = address_size;
1234 if (!priv_->global_scope_)
1236 priv_->global_scope_.reset
1238 priv_->global_scope_->set_translation_unit
1241 return priv_->global_scope_;
1249{
return priv_->types_;}
1256{
return priv_->types_;}
1263const vector<function_type_sptr>&
1265{
return priv_->live_fn_types_;}
1272{
return priv_->env_;}
1279{
return priv_->language_;}
1286{priv_->language_ = l;}
1299{
return priv_->path_;}
1310{priv_->path_ = a_path;}
1323{
return priv_->comp_dir_path_;}
1334{priv_->comp_dir_path_ = d;}
1343 if (priv_->abs_path_.empty())
1346 if (!priv_->path_.empty())
1348 if (!priv_->comp_dir_path_.empty())
1350 path = priv_->comp_dir_path_;
1353 path += priv_->path_;
1355 priv_->abs_path_ = path;
1358 return priv_->abs_path_;
1377{
return priv_->corp;}
1393{
return priv_->loc_mgr_;}
1401{
return priv_->loc_mgr_;}
1410 if (!priv_->global_scope_)
1420{
return priv_->address_size_;}
1427{priv_->address_size_= a;}
1443{
return priv_->is_constructed_;}
1459{priv_->is_constructed_ = f;}
1498 const_cast<translation_unit*
>(
this)->priv_->live_fn_types_.push_back(ftype);
1531translation_unit::~translation_unit()
1544 case translation_unit::LANG_UNKNOWN:
1545 return "LANG_UNKNOWN";
1546 case translation_unit::LANG_Cobol74:
1547 return "LANG_Cobol74";
1548 case translation_unit::LANG_Cobol85:
1549 return "LANG_Cobol85";
1550 case translation_unit::LANG_C89:
1552 case translation_unit::LANG_C99:
1554 case translation_unit::LANG_C11:
1556 case translation_unit::LANG_C:
1558 case translation_unit::LANG_C_plus_plus_11:
1559 return "LANG_C_plus_plus_11";
1560 case translation_unit::LANG_C_plus_plus_14:
1561 return "LANG_C_plus_plus_14";
1562 case translation_unit::LANG_C_plus_plus:
1563 return "LANG_C_plus_plus";
1564 case translation_unit::LANG_ObjC:
1566 case translation_unit::LANG_ObjC_plus_plus:
1567 return "LANG_ObjC_plus_plus";
1568 case translation_unit::LANG_Fortran77:
1569 return "LANG_Fortran77";
1570 case translation_unit::LANG_Fortran90:
1571 return "LANG_Fortran90";
1572 case translation_unit::LANG_Fortran95:
1573 return "LANG_Fortran95";
1574 case translation_unit::LANG_Ada83:
1575 return "LANG_Ada83";
1576 case translation_unit::LANG_Ada95:
1577 return "LANG_Ada95";
1578 case translation_unit::LANG_Pascal83:
1579 return "LANG_Pascal83";
1580 case translation_unit::LANG_Modula2:
1581 return "LANG_Modula2";
1582 case translation_unit::LANG_Java:
1584 case translation_unit::LANG_PLI:
1586 case translation_unit::LANG_UPC:
1588 case translation_unit::LANG_D:
1590 case translation_unit::LANG_Python:
1591 return "LANG_Python";
1592 case translation_unit::LANG_Go:
1594 case translation_unit::LANG_Mips_Assembler:
1595 return "LANG_Mips_Assembler";
1597 return "LANG_UNKNOWN";
1600 return "LANG_UNKNOWN";
1612 if (l ==
"LANG_Cobol74")
1613 return translation_unit::LANG_Cobol74;
1614 else if (l ==
"LANG_Cobol85")
1615 return translation_unit::LANG_Cobol85;
1616 else if (l ==
"LANG_C89")
1617 return translation_unit::LANG_C89;
1618 else if (l ==
"LANG_C99")
1619 return translation_unit::LANG_C99;
1620 else if (l ==
"LANG_C11")
1621 return translation_unit::LANG_C11;
1622 else if (l ==
"LANG_C")
1623 return translation_unit::LANG_C;
1624 else if (l ==
"LANG_C_plus_plus_11")
1625 return translation_unit::LANG_C_plus_plus_11;
1626 else if (l ==
"LANG_C_plus_plus_14")
1627 return translation_unit::LANG_C_plus_plus_14;
1628 else if (l ==
"LANG_C_plus_plus")
1629 return translation_unit::LANG_C_plus_plus;
1630 else if (l ==
"LANG_ObjC")
1631 return translation_unit::LANG_ObjC;
1632 else if (l ==
"LANG_ObjC_plus_plus")
1633 return translation_unit::LANG_ObjC_plus_plus;
1634 else if (l ==
"LANG_Fortran77")
1635 return translation_unit::LANG_Fortran77;
1636 else if (l ==
"LANG_Fortran90")
1637 return translation_unit::LANG_Fortran90;
1638 else if (l ==
"LANG_Fortran95")
1639 return translation_unit::LANG_Fortran95;
1640 else if (l ==
"LANG_Ada83")
1641 return translation_unit::LANG_Ada83;
1642 else if (l ==
"LANG_Ada95")
1643 return translation_unit::LANG_Ada95;
1644 else if (l ==
"LANG_Pascal83")
1645 return translation_unit::LANG_Pascal83;
1646 else if (l ==
"LANG_Modula2")
1647 return translation_unit::LANG_Modula2;
1648 else if (l ==
"LANG_Java")
1649 return translation_unit::LANG_Java;
1650 else if (l ==
"LANG_PLI")
1651 return translation_unit::LANG_PLI;
1652 else if (l ==
"LANG_UPC")
1653 return translation_unit::LANG_UPC;
1654 else if (l ==
"LANG_D")
1655 return translation_unit::LANG_D;
1656 else if (l ==
"LANG_Python")
1657 return translation_unit::LANG_Python;
1658 else if (l ==
"LANG_Go")
1659 return translation_unit::LANG_Go;
1660 else if (l ==
"LANG_Mips_Assembler")
1661 return translation_unit::LANG_Mips_Assembler;
1663 return translation_unit::LANG_UNKNOWN;
1674 return (l == translation_unit::LANG_C89
1675 || l == translation_unit::LANG_C99
1676 || l == translation_unit::LANG_C11
1677 || l == translation_unit::LANG_C);
1688 return (l == translation_unit::LANG_C_plus_plus_03
1689 || l == translation_unit::LANG_C_plus_plus_11
1690 || l == translation_unit::LANG_C_plus_plus_14
1691 || l == translation_unit::LANG_C_plus_plus);
1701{
return l == translation_unit::LANG_Java;}
1711 return (l == translation_unit::LANG_Ada83
1712 || l == translation_unit::LANG_Ada95);
1725 if (l.get() == r.get())
1748struct elf_symbol::priv
1788 bool is_in_ksymtab_;
1791 bool is_suppressed_;
1806 is_in_ksymtab_(false),
1809 is_suppressed_(false)
1812 priv(
const environment& e,
1820 const elf_symbol::version& ve,
1842 is_common_ = type_ == COMMON_TYPE;
1876elf_symbol::elf_symbol(
const environment& e,
1952 elf_symbol_sptr sym(
new elf_symbol(e, i, s, n, t, b, d, c, ve, vi,
1954 sym->priv_->main_symbol_ = sym;
1994{
return priv_->env_;}
2001{
return priv_->index_;}
2015{
return priv_->name_;}
2024 priv_->id_string_.clear();
2032{
return priv_->type_;}
2046{
return priv_->size_;}
2053{priv_->size_ = size;}
2060{
return priv_->binding_;}
2067{priv_->binding_ = b;}
2074{
return priv_->version_;}
2082 priv_->version_ = v;
2083 priv_->id_string_.clear();
2092{priv_->visibility_ = v;}
2100{
return priv_->visibility_;}
2108{
return priv_->is_defined_;}
2116{priv_->is_defined_ = d;}
2169{
return priv_->is_in_ksymtab_;}
2184{
return priv_->crc_;}
2198{
return priv_->namespace_;}
2205{priv_->namespace_ = ns;}
2214{
return priv_->is_suppressed_;}
2253{
return priv_->main_symbol_.lock();}
2260{
return priv_->main_symbol_.lock();}
2274{
return priv_->next_alias_.lock();}
2294 a = a->get_next_alias())
2317 a && !a->is_main_symbol();
2318 a = a->get_next_alias())
2320 if (a->get_next_alias()->is_main_symbol())
2328 last_alias->priv_->next_alias_ = alias;
2331 priv_->next_alias_ = alias;
2361 a = a->get_next_alias())
2362 if (a->get_name() == name)
2372 priv_->main_symbol_ = new_main;
2374 a = a->get_next_alias())
2375 a->priv_->main_symbol_ = new_main;
2385{
return priv_->is_common_;}
2416{
return priv_->next_common_instance_.lock();}
2431 ABG_ASSERT(!common->has_other_common_instances());
2440 c = c->get_next_common_instance())
2445 last_common_instance = c;
2450 last_common_instance->priv_->next_common_instance_ = common;
2453 priv_->next_common_instance_ = common;
2473 if (priv_->id_string_.empty())
2485 priv_->id_string_ = s;
2488 return priv_->id_string_;
2505 a = a->get_next_alias())
2506 if (a->get_name() == name)
2523 a && a.get() != a->get_main_symbol().get();
2524 a = a->get_next_alias())
2525 if (textually_equals(*
this, *a))
2542 bool include_symbol_itself)
const
2546 if (include_symbol_itself)
2549 vector<elf_symbol_sptr> aliases;
2550 compute_aliases_for_elf_symbol(*
this, syms, aliases);
2551 if (!aliases.empty() && include_symbol_itself)
2554 for (vector<elf_symbol_sptr>::const_iterator i = aliases.begin();
2558 if (i != aliases.begin())
2560 result += (*i)->get_id_string();
2575 vector<elf_symbol_sptr> aliases;
2576 if (include_symbol_itself)
2581 a = a->get_next_alias())
2582 aliases.push_back(a);
2585 for (vector<elf_symbol_sptr>::const_iterator i = aliases.begin();
2589 if (i != aliases.begin())
2591 result += (*i)->get_id_string();
2611 name.clear(), ver.clear();
2613 string::size_type i =
id.find(
'@');
2614 if (i == string::npos)
2620 name =
id.substr(0, i);
2626 string::size_type j =
id.find(
'@', i);
2627 if (j == string::npos)
2654 bool are_equal = textually_equals(*
this, other);
2675 a && !a->is_main_symbol();
2676 a = a->get_next_alias())
2700 return *lhs == *rhs;
2726compute_aliases_for_elf_symbol(
const elf_symbol& sym,
2728 vector<elf_symbol_sptr>& aliases)
2732 for (; a && !a->is_main_symbol(); a = a->get_next_alias())
2733 aliases.push_back(a);
2735 for (string_elf_symbols_map_type::const_iterator i = symtab.begin();
2738 for (elf_symbols::const_iterator j = i->second.begin();
2739 j != i->second.end();
2744 s && !s->is_main_symbol();
2745 s = s->get_next_alias())
2746 aliases.push_back(s);
2749 s && !s->is_main_symbol();
2750 s = s->get_next_alias())
2752 aliases.push_back(*j);
2797 case elf_symbol::NOTYPE_TYPE:
2798 repr =
"unspecified symbol type";
2800 case elf_symbol::OBJECT_TYPE:
2801 repr =
"variable symbol type";
2803 case elf_symbol::FUNC_TYPE:
2804 repr =
"function symbol type";
2806 case elf_symbol::SECTION_TYPE:
2807 repr =
"section symbol type";
2809 case elf_symbol::FILE_TYPE:
2810 repr =
"file symbol type";
2812 case elf_symbol::COMMON_TYPE:
2813 repr =
"common data object symbol type";
2815 case elf_symbol::TLS_TYPE:
2816 repr =
"thread local data object symbol type";
2818 case elf_symbol::GNU_IFUNC_TYPE:
2819 repr =
"indirect function symbol type";
2823 std::ostringstream s;
2824 s <<
"unknown symbol type (" << (char)t <<
')';
2847 case elf_symbol::LOCAL_BINDING:
2848 repr =
"local binding";
2850 case elf_symbol::GLOBAL_BINDING:
2851 repr =
"global binding";
2853 case elf_symbol::WEAK_BINDING:
2854 repr =
"weak binding";
2856 case elf_symbol::GNU_UNIQUE_BINDING:
2857 repr =
"GNU unique binding";
2861 std::ostringstream s;
2862 s <<
"unknown binding (" << (
unsigned char) b <<
")";
2885 case elf_symbol::DEFAULT_VISIBILITY:
2886 repr =
"default visibility";
2888 case elf_symbol::PROTECTED_VISIBILITY:
2889 repr =
"protected visibility";
2891 case elf_symbol::HIDDEN_VISIBILITY:
2892 repr =
"hidden visibility";
2894 case elf_symbol::INTERNAL_VISIBILITY:
2895 repr =
"internal visibility";
2899 std::ostringstream s;
2900 s <<
"unknown visibility (" << (
unsigned char) v <<
")";
2922 t = elf_symbol::NOTYPE_TYPE;
2923 else if (s ==
"object-type")
2924 t = elf_symbol::OBJECT_TYPE;
2925 else if (s ==
"func-type")
2926 t = elf_symbol::FUNC_TYPE;
2927 else if (s ==
"section-type")
2928 t = elf_symbol::SECTION_TYPE;
2929 else if (s ==
"file-type")
2930 t = elf_symbol::FILE_TYPE;
2931 else if (s ==
"common-type")
2932 t = elf_symbol::COMMON_TYPE;
2933 else if (s ==
"tls-type")
2934 t = elf_symbol::TLS_TYPE;
2935 else if (s ==
"gnu-ifunc-type")
2936 t = elf_symbol::GNU_IFUNC_TYPE;
2954 if (s ==
"local-binding")
2955 b = elf_symbol::LOCAL_BINDING;
2956 else if (s ==
"global-binding")
2957 b = elf_symbol::GLOBAL_BINDING;
2958 else if (s ==
"weak-binding")
2959 b = elf_symbol::WEAK_BINDING;
2960 else if (s ==
"gnu-unique-binding")
2961 b = elf_symbol::GNU_UNIQUE_BINDING;
2979 if (s ==
"default-visibility")
2980 v = elf_symbol::DEFAULT_VISIBILITY;
2981 else if (s ==
"protected-visibility")
2982 v = elf_symbol::PROTECTED_VISIBILITY;
2983 else if (s ==
"hidden-visibility")
2984 v = elf_symbol::HIDDEN_VISIBILITY;
2985 else if (s ==
"internal-visibility")
2986 v = elf_symbol::INTERNAL_VISIBILITY;
3001{
return t == elf_symbol::FUNC_TYPE;}
3011{
return t == elf_symbol::OBJECT_TYPE;}
3015struct elf_symbol::version::priv
3021 : is_default_(false)
3024 priv(
const string& v,
3031elf_symbol::version::version()
3038elf_symbol::version::version(
const string& v,
3040 : priv_(new priv(v, is_default))
3044 : priv_(new priv(v.str(), v.is_default()))
3048elf_symbol::version::~version() =
default;
3053elf_symbol::version::operator
const string&()
const
3054{
return priv_->version_;}
3061{
return priv_->version_;}
3068{priv_->version_ = s;}
3075{
return priv_->is_default_;}
3082{priv_->is_default_ = f;}
3085elf_symbol::version::is_empty()
const
3086{
return str().empty();}
3095{
return str() == o.
str();}
3124struct dm_context_rel::priv
3127 size_t offset_in_bits_;
3130 priv(
bool is_static =
false)
3131 : is_laid_out_(!is_static),
3133 anonymous_data_member_()
3136 priv(
bool is_laid_out,
size_t offset_in_bits)
3137 : is_laid_out_(is_laid_out),
3138 offset_in_bits_(offset_in_bits),
3139 anonymous_data_member_()
3143dm_context_rel::dm_context_rel()
3148dm_context_rel::dm_context_rel(scope_decl* s,
3150 size_t offset_in_bits,
3153 : context_rel(s, a, is_static),
3154 priv_(new priv(is_laid_out, offset_in_bits))
3157dm_context_rel::dm_context_rel(scope_decl* s)
3163dm_context_rel::get_is_laid_out()
const
3164{
return priv_->is_laid_out_;}
3167dm_context_rel::set_is_laid_out(
bool f)
3168{priv_->is_laid_out_ = f;}
3171dm_context_rel::get_offset_in_bits()
const
3172{
return priv_->offset_in_bits_;}
3175dm_context_rel::set_offset_in_bits(
size_t o)
3176{priv_->offset_in_bits_ = o;}
3179dm_context_rel::operator==(
const dm_context_rel& o)
const
3181 if (!context_rel::operator==(o))
3184 return (priv_->is_laid_out_ == o.priv_->is_laid_out_
3185 && priv_->offset_in_bits_ == o.priv_->offset_in_bits_);
3189dm_context_rel::operator!=(
const dm_context_rel& o)
const
3200{
return priv_->anonymous_data_member_;}
3210{priv_->anonymous_data_member_ = anon_dm;}
3212dm_context_rel::~dm_context_rel()
3238{
return priv_->canonical_types_;}
3282 unsigned l1 = 0, l2 = 0, c1 = 0, c2 = 0;
3304 vector<type_base_sptr>& result)
3307 result.push_back(t);
3310 std::stable_sort(result.begin(), result.end(), comp);
3322const type_base_sptr&
3325 if (!priv_->void_type_)
3326 priv_->void_type_.reset(
new type_decl(*
this,
3329 return priv_->void_type_;
3341const type_base_sptr&
3344 if (!priv_->void_pointer_type_)
3347 return priv_->void_pointer_type_;
3360const type_base_sptr&
3363 if (!priv_->variadic_marker_type_)
3364 priv_->variadic_marker_type_.
3367 return priv_->variadic_marker_type_;
3376 static string variadic_parameter_type_name =
"variadic parameter type";
3377 return variadic_parameter_type_name;
3387{
return priv_->canonicalization_is_done_;}
3402 priv_->canonicalization_is_done_ = f;
3403 if (priv_->canonicalization_is_done_)
3414{
return priv_->canonicalization_started_;}
3423{priv_->canonicalization_started_ = f;}
3447{
return priv_->decl_only_class_equals_definition_;}
3472{priv_->decl_only_class_equals_definition_ = f;}
3577{
return const_cast<environment*
>(
this)->priv_->string_pool_.create_string(s);}
3584{
return priv_->config_;}
3594{
return priv_->analyze_exported_interfaces_only_.has_value();}
3607{priv_->analyze_exported_interfaces_only_ = f;}
3620{
return priv_->analyze_exported_interfaces_only_.value_or(
false);}
3622#ifdef WITH_DEBUG_SELF_COMPARISON
3635environment::set_self_comparison_debug_input(
const corpus_sptr& c)
3637 self_comparison_debug_is_on(
true);
3638 if (priv_->first_self_comparison_corpus_.expired())
3639 priv_->first_self_comparison_corpus_ = c;
3640 else if (priv_->second_self_comparison_corpus_.expired()
3641 && c.get() != corpus_sptr(priv_->first_self_comparison_corpus_).get())
3642 priv_->second_self_comparison_corpus_ = c;
3655environment::get_self_comparison_debug_inputs(corpus_sptr& first_corpus,
3656 corpus_sptr& second_corpus)
3658 first_corpus = priv_->first_self_comparison_corpus_.lock();
3659 second_corpus = priv_->second_self_comparison_corpus_.lock();
3666environment::self_comparison_debug_is_on(
bool f)
3667{priv_->self_comparison_debug_on_ = f;}
3674environment::self_comparison_debug_is_on()
const
3675{
return priv_->self_comparison_debug_on_;}
3678#ifdef WITH_DEBUG_TYPE_CANONICALIZATION
3685environment::debug_type_canonicalization_is_on(
bool flag)
3686{priv_->debug_type_canonicalization_ = flag;}
3694environment::debug_type_canonicalization_is_on()
const
3695{
return priv_->debug_type_canonicalization_;}
3703environment::debug_die_canonicalization_is_on(
bool flag)
3704{priv_->debug_die_canonicalization_ = flag;}
3712environment::debug_die_canonicalization_is_on()
const
3713{
return priv_->debug_die_canonicalization_;}
3729const vector<type_base_sptr>*
3756 if (!types ||index >= types->size())
3758 return (*types)[index].get();
3761#ifdef WITH_DEBUG_SELF_COMPARISON
3771const unordered_map<string, uintptr_t>&
3772environment::get_type_id_canonical_type_map()
const
3773{
return priv_->get_type_id_canonical_type_map();}
3784unordered_map<string, uintptr_t>&
3785environment::get_type_id_canonical_type_map()
3786{
return priv_->get_type_id_canonical_type_map();}
3801const unordered_map<uintptr_t, string>&
3802environment::get_pointer_type_id_map()
const
3803{
return priv_->get_pointer_type_id_map();}
3818unordered_map<uintptr_t, string>&
3819environment::get_pointer_type_id_map()
3820{
return priv_->get_pointer_type_id_map();}
3838environment::get_type_id_from_pointer(uintptr_t ptr)
const
3839{
return priv_->get_type_id_from_pointer(ptr);}
3857environment::get_type_id_from_type(
const type_base *t)
const
3858{
return priv_->get_type_id_from_type(t);}
3875environment::get_canonical_type_from_type_id(
const char* type_id)
const
3876{
return priv_->get_canonical_type_from_type_id(type_id);}
3890 (
static_cast<unsigned>(l) |
static_cast<unsigned>(r));
3910 (
static_cast<unsigned>(l) &
static_cast<unsigned>(r));
3931 :priv_(new
priv(e, k))
3947{
return priv_->is_artificial_;}
3959{priv_->is_artificial_ = f;}
3970{
return priv_->kind();}
3990{
return priv_->rtti_;}
3999{
return priv_->rtti_;}
4011 priv_->type_or_decl_ptr_ = t;
4013 priv_->type_or_decl_ptr_ = d;
4036{
return priv_->type_or_decl_ptr_;}
4047{
return priv_->hash_value_;}
4050type_or_decl_base::set_hash_value(
hash_t h)
const
4051{priv_->set_hash_value(h);}
4058{
return priv_->env_;}
4076{priv_->artificial_location_ = l;}
4094{
return priv_->artificial_location_;}
4102 return (priv_->artificial_location_
4103 && priv_->artificial_location_.get_is_artificial());
4134{priv_->translation_unit_ = tu;}
4143{
return priv_->translation_unit_;}
4175 *dr =
dynamic_cast<const decl_base*
>(r);
4184 *tr =
dynamic_cast<const type_base*
>(r);
4229struct decl_base::priv
4231 bool in_pub_sym_tab_;
4258 visibility visibility_;
4259 decl_base_sptr declaration_;
4261 decl_base* naked_definition_of_declaration_;
4262 bool is_declaration_only_;
4266 : in_pub_sym_tab_(false),
4267 is_anonymous_(true),
4269 visibility_(VISIBILITY_DEFAULT),
4270 naked_definition_of_declaration_(),
4271 is_declaration_only_(false)
4274 priv(interned_string name, interned_string linkage_name, visibility vis)
4275 : in_pub_sym_tab_(false),
4278 qualified_name_(name),
4279 linkage_name_(linkage_name),
4281 naked_definition_of_declaration_(),
4282 is_declaration_only_(false)
4284 is_anonymous_ = name_.
empty();
4309 const string& linkage_name,
4312 priv_(new priv(e.intern(name), e.intern(linkage_name), vis))
4336 priv_(new priv(name, linkage_name, vis))
4363{
return priv_->qualified_name_;}
4372{priv_->qualified_name_.
clear();}
4379{priv_->qualified_name_ = n;}
4392{
return priv_->temporary_qualified_name_;}
4406{priv_->temporary_qualified_name_ = n;}
4413{
return priv_->context_;}
4420{
return priv_->context_;}
4424{priv_->context_ = c;}
4433{
return priv_->in_pub_sym_tab_;}
4441{priv_->in_pub_sym_tab_ = f;}
4461{
return priv_->location_;}
4503 priv_->location_ = l;
4513 priv_->is_anonymous_ = n.empty();
4524{
return priv_->is_anonymous_;}
4534{priv_->is_anonymous_ = f;}
4571{
return priv_->naming_typedef_;}
4599 &&
is_type(
this)->get_naked_canonical_type() ==
nullptr);
4601 priv_->naming_typedef_ = t;
4608 update_qualified_name(
this);
4616{
return priv_->linkage_name_;}
4625 priv_->linkage_name_ = env.
intern(m);
4633{
return priv_->visibility_;}
4640{priv_->visibility_ = v;}
4649 if (priv_->context_)
4650 return priv_->context_->get_scope();
4660{
return priv_->qualified_parent_name_;}
4667{
return priv_->name_;}
4702 bool qualified_name)
const
4706 && has_generic_anonymous_internal_type_name(
this))
4717 string name = get_generic_anonymous_internal_type_name(
this);
4753 if (priv_->internal_cached_repr_.
empty())
4758 return priv_->internal_cached_repr_;
4761 if (priv_->cached_repr_.
empty())
4767 return priv_->cached_repr_;
4787{
return priv_->qualified_name_;}
4801{
return priv_->scoped_name_;}
4809{
return priv_->declaration_;}
4818 if (d && d->get_is_declaration_only())
4819 priv_->declaration_ = d;
4829{
return priv_->definition_of_declaration_.lock();}
4845{
return priv_->naked_definition_of_declaration_;}
4852{
return priv_->is_declaration_only_;}
4862 bool update_types_lookup_map = !f && priv_->is_declaration_only_;
4864 priv_->is_declaration_only_ = f;
4866 if (update_types_lookup_map)
4869 scope_decl::declarations::iterator i;
4870 if (s->find_iterator_for_member(
this, i))
4880 return static_cast<change_kind>(
static_cast<unsigned>(l)
4881 |
static_cast<unsigned>(r));
4887 return static_cast<change_kind>(
static_cast<unsigned>(l)
4888 &
static_cast<unsigned>(r));
4935 bool member_types_or_functions =
4939 if (member_types_or_functions)
4948 la = r1->get_access_specifier();
4949 ra = r2->get_access_specifier();
4950 r1->set_access_specifier(no_access);
4951 r2->set_access_specifier(no_access);
4954 bool rels_are_different = *r1 != *r2;
4956 if (member_types_or_functions)
4959 r1->set_access_specifier(la);
4960 r2->set_access_specifier(ra);
4963 if (rels_are_different)
4998 if (!l_linkage_name.
empty() && !r_linkage_name.
empty())
5000 if (l_linkage_name != r_linkage_name)
5040 bool decls_are_same = (ln == rn);
5042 if (!decls_are_same)
5065{
return equals(*
this, other, 0);}
5104 if (!priv_->context_)
5107 priv_->context_->set_scope(scope);
5125 case decl_base::VISIBILITY_NONE:
5128 case decl_base::VISIBILITY_DEFAULT:
5131 case decl_base::VISIBILITY_PROTECTED:
5134 case decl_base::VISIBILITY_HIDDEN:
5137 case decl_base::VISIBILITY_INTERNAL:
5157 case decl_base::BINDING_NONE:
5160 case decl_base::BINDING_LOCAL:
5163 case decl_base::BINDING_GLOBAL:
5166 case decl_base::BINDING_WEAK:
5189 if (l.get() == r.get())
5225 if (l.get() == r.get())
5311{
return dynamic_pointer_cast<scope_decl>(d);}
5377 return c->get_access_specifier();
5407 c->set_access_specifier(a);
5437 return c->get_is_static();
5579 var_decl_sptr first = *klass->get_non_static_data_members().begin();
5600 if (!klass ||!data_member)
5603 for (class_or_union::data_members::const_iterator it =
5607 if (**it == *data_member)
5676 bool result =
false;
5694 dms[member->get_name()] = member;
5903 return class_or_union_sptr();
5912const class_or_union_sptr
5917 if (cou->get_is_anonymous())
5920 return class_or_union_sptr();
5929const class_or_union_sptr
5934 return class_or_union_sptr();
5943const class_or_union_sptr
5958 return class_or_union_sptr();
5983 for (
auto anon_dm_m : cl->get_non_static_data_members())
6030 ctxt_rel->set_offset_in_bits(o);
6045 return ctxt_rel->get_offset_in_bits();
6135 const var_decl *containing_anonymous_data_member =
6138 uint64_t containing_anonymous_data_member_offset = 0;
6139 if (containing_anonymous_data_member)
6140 containing_anonymous_data_member_offset =
6143 return (ctxt_rel->get_offset_in_bits()
6145 containing_anonymous_data_member_offset);
6173 type_base_sptr t = v->get_type();
6176 return t->get_size_in_bits();
6190 ctxt_rel->set_is_laid_out(l);
6205 return ctxt_rel->get_is_laid_out();
6466set_member_function_vtable_offset(
function_decl& f, ssize_t s)
6488{
return set_member_function_vtable_offset(*f, s);}
6507 return ctxt->is_virtual();
6534set_member_function_is_virtual(
function_decl& f,
bool is_virtual)
6544 ctxt->is_virtual(is_virtual);
6557 set_member_function_is_virtual(*fn, is_virtual);
6576 set_member_function_vtable_offset(fn, voffset);
6577 set_member_function_is_virtual(fn, is_virtual);
6608 set_member_function_vtable_offset(fn, voffset);
6609 set_member_function_is_virtual(fn, is_virtual);
6646 if (!cl->get_canonical_type())
6652 type_base_sptr t = type;
6663 ty->get_size_in_bits(),
6664 ty->get_alignment_in_bits(),
6665 ty->get_location()));
6673 ty->get_size_in_bits(),
6674 ty->get_alignment_in_bits(),
6675 ty->get_location()));
6684 ty->get_location()));
6690 t.reset(
new array_type_def(p, ty->get_subranges(), ty->get_location()));
6695 for (function_decl::parameters::const_iterator i =
6696 ty->get_parameters().begin();
6697 i != ty->get_parameters().end();
6708 p->get_variadic_marker(),
6709 p->get_is_artificial()));
6710 parm.push_back(stripped);
6715 parm, ty->get_is_const(),
6716 ty->get_size_in_bits(),
6717 ty->get_alignment_in_bits()));
6722 for (function_decl::parameters::const_iterator i =
6723 ty->get_parameters().begin();
6724 i != ty->get_parameters().end();
6735 p->get_variadic_marker(),
6736 p->get_is_artificial()));
6737 parm.push_back(stripped);
6742 ty->get_size_in_bits(),
6743 ty->get_alignment_in_bits()));
6746 if (!t->get_translation_unit())
6747 t->set_translation_unit(type->get_translation_unit());
6752 return t->get_canonical_type() ? t->get_canonical_type() : t;
6775 decl_base_sptr result = t;
6776 type_base_sptr u = t->get_underlying_type();
6779 if ((t->get_cv_quals() & qualified_type_def::CV_CONST
6781 || (t->get_cv_quals() & qualified_type_def::CV_CONST
6783 || t->get_cv_quals() == qualified_type_def::CV_NONE)
6829static qualified_type_def_sptr
6830strip_redundant_quals_from_underyling_types(
const qualified_type_def_sptr& t,
6839 qualified_type_def_sptr underlying_qualified_type =
6847 currated_quals &= ~redundant_quals;
6848 t->set_cv_quals(currated_quals);
6852 redundant_quals |= currated_quals;
6854 qualified_type_def_sptr result = t;
6855 if (underlying_qualified_type)
6859 strip_redundant_quals_from_underyling_types(underlying_qualified_type,
6893strip_redundant_quals_from_underyling_types(
const qualified_type_def_sptr& t)
6899 strip_redundant_quals_from_underyling_types(t, redundant_quals);
6926 return t->get_underlying_type();
6980 return t->get_pointed_to_type();
7036 return t->get_pointed_to_type();
7161 if (t->get_cv_quals() == qualified_type_def::CV_CONST)
7194 return q->get_underlying_type();
7243 type_base_sptr type = t;
7266 type_base_sptr typ = type;
7328 bool peel_qual_type)
7367 bool peel_qual_type)
7405 vector<array_type_def::subrange_sptr> subranges;
7407 for (vector<array_type_def::subrange_sptr>::const_iterator i =
7408 array->get_subranges().begin();
7409 i != array->get_subranges().end();
7415 (*i)->get_lower_bound(),
7416 (*i)->get_upper_bound(),
7417 (*i)->get_underlying_type(),
7418 (*i)->get_location(),
7419 (*i)->get_language()));
7420 subrange->is_non_finite((*i)->is_non_finite());
7423 subranges.push_back(subrange);
7428 subranges, array->get_location()));
7451 (
new typedef_decl(t->get_name(), t->get_underlying_type(),
7452 t->get_location(), t->get_linkage_name(),
7453 t->get_visibility()));
7469qualified_type_def_sptr
7475 qualified_type_def_sptr result
7477 t->get_cv_quals(), t->get_location()));
7489static type_base_sptr
7490clone_typedef_array_qualified_type(type_base_sptr type)
7496 type_base_sptr result;
7505 return type_base_sptr();
7528 type_base_sptr result = clone_typedef_array_qualified_type(t);
7531 type_base_sptr subtree;
7535 clone_typedef_array_qualified_type(type->get_underlying_type());
7539 type->set_underlying_type(subtree);
7545 clone_typedef_array_qualified_type(type->get_element_type());
7549 type->set_element_type(subtree);
7559 clone_typedef_array_qualified_type(t->get_underlying_type());
7566 t->set_underlying_type (s);
7575 clone_typedef_array_qualified_type(t->get_underlying_type());
7582 t->set_underlying_type(s);
7590 type_base_sptr e = t->get_element_type();
7594 clone_typedef_array_qualified_type(e);
7600 t->set_element_type(s);
7619 ::qualified_name_setter setter;
7627update_qualified_name(decl_base_sptr d)
7628{
return update_qualified_name(d.get());}
7648{
return reinterpret_cast<size_t>(l);}
7650struct scope_decl::priv
7659 bool clear_sorted_member_types_cache_ =
false;
7696{
return priv_->canonical_types_;}
7714 if (priv_->sorted_canonical_types_.empty())
7716 for (canonical_type_sptr_set_type::const_iterator e =
7720 priv_->sorted_canonical_types_.push_back(*e);
7723 std::stable_sort(priv_->sorted_canonical_types_.begin(),
7724 priv_->sorted_canonical_types_.end(),
7727 return priv_->sorted_canonical_types_;
7737{
return priv_->members_;}
7746{
return priv_->members_;}
7757 if (priv_->sorted_members_.empty())
7762 priv_->sorted_members_.push_back(*i);
7764 std::stable_sort(priv_->sorted_members_.begin(),
7765 priv_->sorted_members_.end(),
7768 return priv_->sorted_members_;
7783 if (t->get_is_anonymous())
7801 if (t->get_is_anonymous())
7819 if (t->get_is_anonymous())
7830{
return priv_->member_scopes_;}
7837{
return priv_->member_scopes_;}
7859maybe_set_translation_unit(
const decl_base_sptr& decl,
7876 decl->set_translation_unit(tu);
7893 member->set_scope(
this);
7894 priv_->members_.push_back(member);
7897 priv_->member_types_.push_back(
is_type(member));
7898 priv_->clear_sorted_member_types_cache_ =
true;
7902 priv_->member_scopes_.push_back(m);
7904 update_qualified_name(member);
7907 maybe_set_translation_unit(member, tu);
7919{
return priv_->member_types_;}
7934 return type_base_sptr();
7944 declarations::iterator before)
7950 priv_->member_types_.push_back(t);
7951 priv_->clear_sorted_member_types_cache_=
true;
7987 for (
auto i = priv_->member_types_.begin();
7988 i != priv_->member_types_.end();
7993 priv_->member_types_.erase(i);
8006 if (priv_->clear_sorted_member_types_cache_)
8008 priv_->sorted_member_types_.clear();
8009 priv_->clear_sorted_member_types_cache_ =
false;
8012 if (priv_->sorted_member_types_.empty())
8014 unordered_set<type_base_sptr> canonical_pointer_types;
8018 priv_->sorted_member_types_.push_back(t);
8019 else if (
auto c = t->get_canonical_type())
8020 canonical_pointer_types.insert(c);
8022 canonical_pointer_types.insert(t);
8025 for (
auto t : canonical_pointer_types)
8026 priv_->sorted_member_types_.push_back(t);
8029 std::stable_sort(priv_->sorted_member_types_.begin(),
8030 priv_->sorted_member_types_.end(),
8036 priv_->clear_sorted_member_types_cache_ =
true;
8038 return priv_->sorted_member_types_;
8054 declarations::iterator before)
8058 member->set_scope(
this);
8059 priv_->members_.insert(before, member);
8062 priv_-> member_scopes_.push_back(m);
8064 update_qualified_name(member);
8067 maybe_set_translation_unit(member, tu);
8080 for (declarations::iterator i = priv_->members_.begin();
8081 i != priv_->members_.end();
8086 priv_->members_.erase(i);
8096 for (scopes::iterator i = priv_->member_scopes_.begin();
8097 i != priv_->member_scopes_.end();
8102 priv_->member_scopes_.erase(i);
8108 member->set_scope(
nullptr);
8109 member->set_translation_unit(
nullptr);
8136 if (!l.decl_base::operator==(r))
8145 scope_decl::declarations::const_iterator i, j;
8187 return equals(*
this, *other, 0);
8202 if (l.get() == r.get())
8228 declarations::iterator& i)
8243 if ((*it).get() == decl)
8263 declarations::iterator& i)
8280 if (v.visit_begin(
this))
8283 for (scope_decl::declarations::const_iterator i =
8287 if (!(*i)->traverse(v))
8291 return v.visit_end(
this);
8294scope_decl::~scope_decl()
8310 if (scope && decl && !decl->get_scope())
8350 scope_decl::declarations::iterator before,
8353 if (scope && decl && !decl->get_scope())
8372 scope_decl::declarations::iterator before,
8382 | ABSTRACT_DECL_BASE
8383 | ABSTRACT_SCOPE_DECL),
8386 translation_unit_(tu)
8388 runtime_type_instance(
this);
8407 return scope ?
dynamic_cast<global_scope*
> (scope) : 0;
8514 if (cv_quals & qualified_type_def::CV_RESTRICT)
8516 if (cv_quals & qualified_type_def::CV_CONST)
8522 if (cv_quals & qualified_type_def::CV_VOLATILE)
8574{
return get_name(tod.get(), qualified);}
8592 string qualified_name;
8596 if (qualified_name.empty())
8597 qualified_name = name;
8599 qualified_name = qualified_name +
"::" + name;
8601 return qualified_name;
8636 location loc = decl->get_location();
8640 if (c->get_is_declaration_only() && c->get_definition_of_declaration())
8643 loc = c->get_location();
8701has_generic_anonymous_internal_type_name(
const decl_base *d)
8718static interned_string
8719get_generic_anonymous_internal_type_name(
const decl_base *d)
8721 ABG_ASSERT(has_generic_anonymous_internal_type_name(d));
8723 const environment&env = d->get_environment();
8725 interned_string result;
8758get_internal_real_type_name(
const type_base* t)
8768 name = int_type.to_string(
true);
8811 r += get_generic_anonymous_internal_type_name(d);
8821 return env.
intern(get_internal_real_type_name(t));
8830 internal, qualified));
8869 bool qualified,
bool internal)
8872 string tn =
get_type_name(pointed_to_type, qualified, internal);
8891 bool lvalue_reference,
8892 bool qualified,
bool internal)
8896 string name =
get_type_name(pointed_to_type, qualified, internal);
8897 if (lvalue_reference)
8922 bool qualified,
bool internal)
8924 const environment& env = underlying_type->get_environment();
8927 string name =
get_type_name(underlying_type, qualified, internal);
8929 if (quals_repr.empty() && internal)
8941 if (!quals_repr.empty())
8950 name = quals_repr +
" " + name;
9007 std::ostringstream o;
9016 stream_pretty_representation_of_fn_parms(fn_type, o,
9019 return env.
intern(o.str());
9038 c->get_exported_decls_builder();
9039 if (b->fn_id_maps_to_several_fns(fn))
9095 std::ostringstream o;
9114 o <<
" (" << class_type->get_qualified_name(internal) <<
"::*) ";
9115 stream_pretty_representation_of_fn_parms(fn_type, o,
9119 return env.
intern(o.str());
9285 std::ostringstream o;
9303 std::ostringstream o;
9358 const string& indent,
9361 bool qualified_names)
9364 string local_indent =
" ";
9369 if (!internal && clazz->is_struct())
9375 repr = indent +
"union";
9408 for (class_or_union::data_members::const_iterator dm = dmems.begin();
9412 if (dm != dmems.begin())
9417 real_indent =
"\n" + indent + local_indent;
9424 real_indent, one_line, internal, qualified_names);
9429 if (dm != dmems.begin())
9430 repr += real_indent;
9431 repr += (*dm)->get_pretty_representation(internal,
9436 real_indent+ (*dm)->get_pretty_representation(internal,
9445 repr += indent +
"}";
9473 const string& indent,
9476 bool qualified_names)
9480 internal, qualified_names);
9502 const string& indent,
9505 bool qualified_names)
9534 const string& indent,
bool one_line,
9535 bool qualified_names)
9538 std::ostringstream o;
9539 string local_indent =
" ";
9541 repr = indent +
"enum ";
9544 o << (qualified_names
9558 o << enumerator.get_name() +
"=" << enumerator.get_value() <<
", ";
9562 o <<
"\n" + indent <<
"}";
9593 const string& indent,
bool one_line,
9594 bool qualified_names)
9600 one_line, qualified_names);
9625 const string& indent,
bool one_line,
9626 bool qualified_names)
9655 const string& indent,
9658 bool qualified_name)
9664 internal, qualified_name);
9693 std::ostringstream o;
9708 o <<
" :" << std::endl;
9712 if (b->get_is_virtual())
9714 o << b->get_base_class()->get_qualified_name()
9718 o << std::hex << *h << std::dec;
9729 <<
" // translation unit: "
9734 <<
" // @: " << std::hex <<
is_type(c)
9740 o << std::hex << *h << std::dec;
9750 << member_type->get_pretty_representation(
false,
9753 if (member_type->get_canonical_type())
9755 o <<
" // uses canonical type: '@"
9756 << std::hex << member_type->get_canonical_type().get() <<
"'";
9759 o << std::hex << *h << std::dec;
9779 if (t && t->get_canonical_type())
9780 o <<
" // uses canonical type '@"
9781 << std::hex << t->get_canonical_type().get() <<
"'";
9786 o << std::hex << *h << std::dec;
9797 o <<
" // virtual member functions\n\n";
9806 o << std::hex << *h << std::dec;
9809 o <<
";" << std::endl;
9813 o <<
"};" << std::endl;
9819 string name = e->get_qualified_name();
9820 std::ostringstream o;
9821 o <<
"enum " << name
9823 << e->get_underlying_type()->get_pretty_representation(
false,
9827 <<
" // size in bits: " << e->get_size_in_bits() <<
"\n"
9828 <<
" // is-declaration-only: " << e->get_is_declaration_only() <<
"\n"
9830 <<
" // translation unit: "
9831 << e->get_translation_unit()->get_absolute_path() <<
"\n"
9832 <<
" // @: " << std::hex <<
is_type(e)
9833 <<
", @canonical: " << e->get_canonical_type().get() << std::dec <<
"\n"
9838 o << std::hex << *h << std::dec;
9844 for (
const auto &enom : e->get_enumerators())
9845 o <<
" " << enom.get_name() <<
" = " << enom.get_value() <<
",\n";
9853 std::ostringstream o;
9854 o << t->get_pretty_representation(
true,
9861 return artifact->get_pretty_representation(
true,
9960 return const_cast<type_base*
>(artifact);
9977 return const_cast<decl_base*
>(artifact);
10007debug_comp_vec(
const vector<const type_base*>& vect, std::ostringstream& o)
10009 for (
auto t : vect)
10011 o <<
"|" << t->get_pretty_representation()
10012 <<
"@" << std::hex << t << std::dec;
10024print_comp_stack(
const environment& env)
10026 std::ostringstream o;
10027 o <<
"left-operands: ";
10028 debug_comp_vec(env.priv_->left_type_comp_operands_, o);
10029 o <<
"\n" <<
"right-operands: ";
10030 debug_comp_vec(env.priv_->right_type_comp_operands_, o);
10043 std::cerr << print_comp_stack(env);
10044 std::cerr << std::endl;
10079{
return dynamic_cast<const decl_base*
>(t);}
10097{
return dynamic_pointer_cast<decl_base>(t);}
10113 const type_base_sptr type2)
10115 if (!type1 || !type2)
10118 if (type1 == type2)
10151 const decl_base_sptr d2)
10309 const string& name)
10314 if (!containing_class_or_union)
10331{
return (decl &&
dynamic_cast<template_decl*
>(decl->get_scope()));}
10341 return (decl && (dynamic_pointer_cast<type_tparameter>(decl)
10342 || dynamic_pointer_cast<non_type_tparameter>(decl)
10343 || dynamic_pointer_cast<template_tparameter>(decl)));
10373{
return dynamic_pointer_cast<function_decl>(d);}
10396{
return dynamic_pointer_cast<function_decl::parameter>(tod);}
10407 if (d && (d->
kind() & type_or_decl_base::ABSTRACT_DECL_BASE))
10409 if (!(d->
kind() & type_or_decl_base::ABSTRACT_TYPE_BASE))
10435{
return dynamic_pointer_cast<decl_base>(d);}
10457{
return dynamic_pointer_cast<decl_base>(t);}
10467 if (
dynamic_cast<const type_base*
>(&tod))
10480 if (t && (t->
kind() & type_or_decl_base::ABSTRACT_TYPE_BASE))
10494{
return dynamic_pointer_cast<type_base>(tod);}
10526 if (!cou->get_naming_typedef())
10568{
return dynamic_cast<const type_decl*
>(t);}
10576{
return dynamic_pointer_cast<type_decl>(t);}
10670{
return dynamic_pointer_cast<typedef_decl>(t);}
10751{
return dynamic_pointer_cast<enum_type_decl>(d);}
10805 if (t->
kind() & type_or_decl_base::CLASS_TYPE)
10819{
return dynamic_pointer_cast<class_decl>(d);}
10841 if (array->is_non_finite())
10911 if (array->get_subranges().size() == 1
10912 && array->get_subranges()[0]->get_length() == 1)
10982 return klass->get_is_declaration_only();
11031shared_ptr<class_or_union>
11033{
return dynamic_pointer_cast<class_or_union>(t);}
11062 const class_or_union_sptr& second)
11092{
return dynamic_pointer_cast<union_decl>(t);}
11106 bool look_through_qualifiers)
11112 if (look_through_qualifiers)
11130 bool look_through_qualifiers)
11132 type_base_sptr type =
is_type(t);
11133 if (look_through_qualifiers)
11135 return dynamic_pointer_cast<pointer_type_def>(type);
11278 bool look_through_qualifiers)
11284 if (look_through_qualifiers)
11301 bool look_through_qualifiers)
11305 if (look_through_qualifiers)
11322 bool look_through_qualifiers)
11324 type_base_sptr type =
is_type(t);
11325 if (look_through_qualifiers)
11327 return dynamic_pointer_cast<reference_type_def>(type);
11338 bool look_through_qualifiers)
11341 if (look_through_qualifiers)
11358 bool look_through_qualifiers)
11360 type_base_sptr type =
is_type(t);
11361 if (look_through_qualifiers)
11363 return dynamic_pointer_cast<ptr_to_mbr_type>(type);
11437const type_base_sptr
11440 type_base_sptr nil;
11444 if (t->get_environment().get_void_pointer_type().get() == t.get())
11473qualified_type_def_sptr
11475{
return dynamic_pointer_cast<qualified_type_def>(t);}
11485{
return dynamic_pointer_cast<function_type>(t);}
11515{
return dynamic_pointer_cast<method_type>(t);}
11595 decl_base_sptr decl;
11602 while (decl->get_is_declaration_only()
11603 && decl->get_definition_of_declaration())
11604 decl = decl->get_definition_of_declaration();
11671 decl_base_sptr d =
is_decl(t);
11696{
return dynamic_pointer_cast<var_decl>(decl);}
11705{
return dynamic_pointer_cast<namespace_decl>(d);}
11739 && dynamic_pointer_cast<function_decl>(decl)
11750 bool look_through_qualifiers)
11754 if (look_through_qualifiers)
11766 bool look_through_qualifiers)
11768 type_base_sptr t =
is_type(type);
11770 if (look_through_qualifiers)
11772 return dynamic_pointer_cast<array_type_def>(t);
11781qualified_type_def_sptr
11785 return qualified_type_def_sptr();
11855{
return dynamic_pointer_cast<array_type_def::subrange_type>(type);}
11865{
return decl && dynamic_pointer_cast<template_decl>(decl);}
11871 LOOKUP_ENTITY_TYPE,
11903find_next_delim_in_cplus_type(
const string& fqn,
11907 int angle_count = 0;
11908 bool found =
false;
11910 for (; i < fqn.size(); ++i)
11914 else if (fqn[i] ==
'>')
11916 else if (i + 1 < fqn.size()
11919 && fqn[i+1] ==
':')
11936 list<string>& comps)
11938 string::size_type fqn_size = fqn.size(), comp_begin = 0, comp_end = fqn_size;
11941 if (!find_next_delim_in_cplus_type(fqn, comp_begin, comp_end))
11942 comp_end = fqn_size;
11944 string comp = fqn.substr(comp_begin, comp_end - comp_begin);
11945 comps.push_back(comp);
11947 comp_begin = comp_end + 2;
11948 if (comp_begin >= fqn_size)
11964 for (list<string>::const_iterator c = comps.begin();
11967 if (c == comps.begin())
11970 result +=
"::" + *c;
11985template<
typename T>
11987iterator_is_last(T& container,
11988 typename T::const_iterator i)
11990 typename T::const_iterator next = i;
11992 return (next == container.end());
12009lookup_types_in_map(
const interned_string& type_name,
12012 istring_type_base_wptrs_map_type::const_iterator i = type_map.find(type_name);
12013 if (i != type_map.end())
12034template <
class TypeKind>
12035static shared_ptr<TypeKind>
12036lookup_type_in_map(
const interned_string& type_name,
12039 istring_type_base_wptrs_map_type::const_iterator i = type_map.find(type_name);
12040 if (i != type_map.end())
12044 for (
auto j : i->second)
12046 type_base_sptr t(j);
12047 decl_base_sptr d =
is_decl(t);
12048 if (d && !d->get_is_declaration_only())
12049 return dynamic_pointer_cast<TypeKind>(type_base_sptr(j));
12054 return dynamic_pointer_cast<TypeKind>(type_base_sptr(i->second.back()));
12056 return shared_ptr<TypeKind>();
12073 return lookup_type_in_map<type_decl>(type_name,
12132 return lookup_type_in_map<class_decl>(type_name,
12150 return lookup_type_in_map<union_decl>(type_name,
12185 union_decl_sptr result = lookup_type_in_map<union_decl>(loc, m);
12218 return lookup_type_in_map<enum_type_decl>(type_name,
12257 return lookup_type_in_map<typedef_decl>(type_name,
12293qualified_type_def_sptr
12298 return lookup_type_in_map<qualified_type_def>(type_name,
12317qualified_type_def_sptr
12344 return lookup_type_in_map<pointer_type_def>(type_name,
12406 return lookup_type_in_map<reference_type_def>(type_name,
12425 bool lvalue_reference,
12450 return lookup_type_in_map<array_type_def>(type_name,
12470 return lookup_type_in_map<function_type>(type_name,
12516const type_base_sptr
12520 type_base_sptr result;
12559const type_base_sptr
12583const type_base_sptr
12587 list<string> comps;
12600const decl_base_sptr
12604 list<string> comps;
12620template<
typename NodeKind>
12622get_node_name(shared_ptr<NodeKind> node);
12632{
return node->get_name();}
12641get_node_name(type_base_sptr node)
12652{
return node->get_name();}
12661template<
typename NodeKind>
12662static decl_base_sptr
12663convert_node_to_decl(shared_ptr<NodeKind> node);
12676template<
typename NodeKind>
12678lookup_node_in_scope(
const list<string>& fqn,
12682 shared_ptr<NodeKind> node;
12683 bool it_is_last =
false;
12686 for (list<string>::const_iterator c = fqn.begin(); c != fqn.end(); ++c)
12689 it_is_last = iterator_is_last(fqn, c);
12690 for (scope_decl::declarations::const_iterator m =
12691 cur_scope->get_member_decls().begin();
12692 m != cur_scope->get_member_decls().end();
12698 scope = dynamic_pointer_cast<scope_decl>(*m);
12699 if (scope && scope->get_name() == *c)
12708 node = dynamic_pointer_cast<NodeKind>(*m);
12709 if (node && get_node_name(node) == *c)
12712 dynamic_pointer_cast<class_decl>(node))
12713 if (cl->get_is_declaration_only()
12714 && !cl->get_definition_of_declaration())
12716 resulting_decl = node;
12721 if (!new_scope && !resulting_decl)
12722 return decl_base_sptr();
12723 cur_scope = new_scope;
12726 return resulting_decl;
12747const type_base_sptr
12750{
return is_type(lookup_node_in_scope<type_base>(comps, scope));}
12774static const type_base_sptr
12776 const vector<scope_decl*>& access_path,
12779 vector<scope_decl*> a = access_path;
12780 type_base_sptr result;
12785 first_scope = a.back();
12793 for (scope_decl::declarations::const_iterator i =
12797 if (
is_type(*i) && (*i)->get_name() == n)
12805 first_scope = a.back();
12806 interned_string scope_name, cur_scope_name = first_scope->
get_name();
12807 for (scope_decl::scopes::const_iterator i =
12812 scope_name = (*i)->get_name();
12813 if (scope_name == cur_scope_name)
12839static const type_base_sptr
12841 const scope_decl* scope)
12844 return type_base_sptr();
12848 vector<scope_decl*> access_path;
12849 for (scope_decl* s = type_decl->get_scope(); s != 0; s = s->get_scope())
12851 access_path.push_back(s);
12877const type_base_sptr
12892const decl_base_sptr
12895{
return is_var_decl(lookup_node_in_scope<var_decl>(comps, skope));}
12908template<
typename NodeKind>
12910lookup_node_in_translation_unit(
const list<string>& fqn,
12928{
return is_type(lookup_node_in_translation_unit<type_base>(fqn, tu));}
12948{
return is_class_type(lookup_node_in_translation_unit<class_decl>(fqn, tu));}
12961lookup_basic_type_through_translation_units(
const interned_string& type_name,
12962 const corpus& abi_corpus)
12966 for (translation_units::const_iterator tu =
12986static union_decl_sptr
12987lookup_union_type_through_translation_units(
const interned_string& type_name,
12988 const corpus & abi_corpus)
12990 union_decl_sptr result;
12992 for (translation_units::const_iterator tu =
12993 abi_corpus.get_translation_units().begin();
12994 tu != abi_corpus.get_translation_units().end();
13013lookup_enum_type_through_translation_units(
const interned_string& type_name,
13014 const corpus & abi_corpus)
13018 for (translation_units::const_iterator tu =
13019 abi_corpus.get_translation_units().begin();
13020 tu != abi_corpus.get_translation_units().end();
13037lookup_typedef_type_through_translation_units(
const interned_string& type_name,
13038 const corpus & abi_corpus)
13042 for (translation_units::const_iterator tu =
13043 abi_corpus.get_translation_units().begin();
13044 tu != abi_corpus.get_translation_units().end();
13061static qualified_type_def_sptr
13062lookup_qualified_type_through_translation_units(
const interned_string& t_name,
13063 const corpus & abi_corpus)
13065 qualified_type_def_sptr result;
13067 for (translation_units::const_iterator tu =
13068 abi_corpus.get_translation_units().begin();
13069 tu != abi_corpus.get_translation_units().end();
13087lookup_pointer_type_through_translation_units(
const interned_string& type_name,
13088 const corpus & abi_corpus)
13092 for (translation_units::const_iterator tu =
13093 abi_corpus.get_translation_units().begin();
13094 tu != abi_corpus.get_translation_units().end();
13112lookup_reference_type_through_translation_units(
const interned_string& t_name,
13113 const corpus & abi_corpus)
13117 for (translation_units::const_iterator tu =
13118 abi_corpus.get_translation_units().begin();
13119 tu != abi_corpus.get_translation_units().end();
13137lookup_array_type_through_translation_units(
const interned_string& type_name,
13138 const corpus & abi_corpus)
13142 for (translation_units::const_iterator tu =
13143 abi_corpus.get_translation_units().begin();
13144 tu != abi_corpus.get_translation_units().end();
13162lookup_function_type_through_translation_units(
const interned_string& type_name,
13163 const corpus & abi_corpus)
13167 for (translation_units::const_iterator tu =
13168 abi_corpus.get_translation_units().begin();
13169 tu != abi_corpus.get_translation_units().end();
13187 const corpus& abi_corpus)
13189 type_base_sptr result;
13191 for (translation_units::const_iterator tu =
13212 const string& tu_path,
13215 string_tu_map_type::const_iterator i = corp.priv_->path_tu_map.find(tu_path);
13216 if (i == corp.priv_->path_tu_map.end())
13217 return type_base_sptr();
13246 for (translation_units::const_iterator i =
13292 result = lookup_type_in_map<type_decl>(qualified_name, m);
13294 result = lookup_basic_type_through_translation_units(qualified_name, corp);
13314 result = lookup_type_in_map<type_decl>(loc, m);
13405 class_decl_sptr result = lookup_type_in_map<class_decl>(qualified_name, m);
13423 return lookup_types_in_map(qualified_name, m);
13449 for (
auto type : *v)
13451 type_base_sptr t(type);
13453 if (c->get_is_declaration_only()
13454 && !c->get_definition_of_declaration())
13455 result.push_back(type);
13458 return !result.empty();
13474 return lookup_types_in_map(qualified_name, m);
13555 union_decl_sptr result = lookup_type_in_map<union_decl>(type_name, m);
13557 result = lookup_union_type_through_translation_units(type_name, corp);
13636 lookup_type_in_map<enum_type_decl>(qualified_name, m);
13638 result = lookup_enum_type_through_translation_units(qualified_name, corp);
13656 return lookup_types_in_map(qualified_name, m);
13761 lookup_type_in_map<typedef_decl>(qualified_name, m);
13763 result = lookup_typedef_type_through_translation_units(qualified_name,
13858qualified_type_def_sptr
13873qualified_type_def_sptr
13879 qualified_type_def_sptr result =
13880 lookup_type_in_map<qualified_type_def>(qualified_name, m);
13883 result = lookup_qualified_type_through_translation_units(qualified_name,
13925 lookup_type_in_map<pointer_type_def>(qualified_name, m);
13927 result = lookup_pointer_type_through_translation_units(qualified_name,
13975 lookup_type_in_map<reference_type_def>(qualified_name, m);
13977 result = lookup_reference_type_through_translation_units(qualified_name,
14024 lookup_type_in_map<array_type_def>(qualified_name, m);
14026 result = lookup_array_type_through_translation_units(qualified_name, corp);
14095 lookup_type_in_map<function_type>(qualified_name, m);
14097 result = lookup_function_type_through_translation_units(qualified_name,
14120 type_base_sptr result;
14153 type_base_sptr result;
14201 return type_base_sptr();
14218template<
typename TypeKind>
14222 bool use_type_name_as_key =
true)
14226 if (use_type_name_as_key)
14228 else if (
location l = type->get_location())
14230 string str = l.expand();
14231 s = type->get_environment().intern(str);
14234 istring_type_base_wptrs_map_type::iterator i = types_map.find(s);
14235 bool result =
false;
14237 if (i == types_map.end())
14239 types_map[s].push_back(type);
14243 i->second.push_back(type);
14264 bool use_type_name_as_key)
14268 bool update_qname_map =
true;
14269 if (type->get_is_declaration_only())
14275 is_class_type(class_type->get_definition_of_declaration()))
14279 if (!update_qname_map)
14283 if (use_type_name_as_key)
14285 string qname = type->get_qualified_name();
14286 s = type->get_environment().intern(qname);
14288 else if (
location l = type->get_location())
14290 string str = l.expand();
14291 s = type->get_environment().intern(str);
14294 bool result =
false;
14295 istring_type_base_wptrs_map_type::iterator i = map.find(s);
14296 if (i == map.end())
14298 map[s].push_back(type);
14302 i->second.push_back(type);
14328 bool result =
false;
14330 istring_type_base_wptrs_map_type::iterator i = types_map.find(s);
14331 if (i == types_map.end())
14333 types_map[s].push_back(type);
14337 i->second.push_back(type);
14360 if (
corpus *type_corpus = basic_type->get_corpus())
14364 type_corpus->priv_->get_types().basic_types());
14368 type_corpus->get_type_per_loc_map().basic_types(),
14375 group->priv_->get_types().basic_types());
14379 group->get_type_per_loc_map().basic_types(),
14404 if (
corpus *type_corpus = class_type->get_corpus())
14408 type_corpus->priv_->get_types().class_types());
14412 type_corpus->get_type_per_loc_map().class_types(),
14419 group->priv_->get_types().class_types());
14423 group->get_type_per_loc_map().class_types(),
14447 if (
corpus *type_corpus = union_type->get_corpus())
14451 type_corpus->priv_->get_types().union_types());
14455 type_corpus->get_type_per_loc_map().union_types(),
14462 group->priv_->get_types().union_types());
14466 group->get_type_per_loc_map().union_types(),
14490 if (
corpus *type_corpus = enum_type->get_corpus())
14494 type_corpus->priv_->get_types().enum_types());
14498 type_corpus->get_type_per_loc_map().enum_types(),
14505 group->priv_->get_types().enum_types());
14509 group->get_type_per_loc_map().enum_types(),
14534 if (
corpus *type_corpus = typedef_type->get_corpus())
14538 type_corpus->priv_->get_types().typedef_types());
14542 type_corpus->get_type_per_loc_map().typedef_types(),
14549 group->priv_->get_types().typedef_types());
14553 group->get_type_per_loc_map().typedef_types(),
14577 if (
corpus *type_corpus = qualified_type->get_corpus())
14581 type_corpus->priv_->get_types().qualified_types());
14587 group->priv_->get_types().qualified_types());
14610 if (
corpus *type_corpus = pointer_type->get_corpus())
14614 type_corpus->priv_->get_types().pointer_types());
14620 group->priv_->get_types().pointer_types());
14643 if (
corpus *type_corpus = ptr_to_member->get_corpus())
14647 type_corpus->priv_->get_types().ptr_to_mbr_types());
14653 group->priv_->get_types().ptr_to_mbr_types());
14676 if (
corpus *type_corpus = reference_type->get_corpus())
14680 type_corpus->priv_->get_types().reference_types());
14686 group->priv_->get_types().reference_types());
14709 if (
corpus *type_corpus = array_type->get_corpus())
14713 type_corpus->priv_->get_types().array_types());
14717 type_corpus->get_type_per_loc_map().array_types(),
14724 group->priv_->get_types().array_types());
14728 group->get_type_per_loc_map().array_types(),
14753 if (
corpus *type_corpus = subrange_type->get_corpus())
14757 type_corpus->priv_->get_types().subrange_types());
14761 type_corpus->get_type_per_loc_map().subrange_types(),
14764 if (
corpus *group = subrange_type->get_corpus())
14768 group->priv_->get_types().subrange_types());
14772 group->get_type_per_loc_map().subrange_types(),
14797 if (
corpus *type_corpus = fn_type->get_corpus())
14801 type_corpus->priv_->get_types().function_types());
14803 if (
corpus *group = fn_type->get_corpus())
14807 group->priv_->get_types().function_types());
14900 type_base_sptr result;
14908 type_base_sptr underlying_type =
14911 if (underlying_type)
14914 qual->get_cv_quals(),
14915 qual->get_location()));
14920 type_base_sptr pointed_to_type =
14923 if (pointed_to_type)
14926 p->get_size_in_bits(),
14927 p->get_alignment_in_bits(),
14928 p->get_location()));
14933 type_base_sptr pointed_to_type =
14935 if (pointed_to_type)
14939 r->get_size_in_bits(),
14940 r->get_alignment_in_bits(),
14941 r->get_location()));
14955 tu.priv_->synthesized_types_.push_back(result);
14988 type_base_sptr result_return_type;
14993 if (!result_return_type)
14997 type_base_sptr parm_type;
14999 for (function_type::parameters::const_iterator i =
15004 type_base_sptr t = (*i)->get_type();
15011 (*i)->get_location(),
15012 (*i)->get_variadic_marker(),
15013 (*i)->get_is_artificial()));
15014 parms.push_back(parm);
15017 class_or_union_sptr class_type;
15029 result_fn_type.reset(
new method_type(result_return_type,
15041 tu.priv_->synthesized_types_.push_back(result_fn_type);
15045 return result_fn_type;
15056 if (mangled_name.empty())
15061 char * str = abi::__cxa_demangle(mangled_name.c_str(),
15062 NULL, &l, &status);
15063 string demangled_name = mangled_name;
15067 demangled_name = str;
15071 return demangled_name;
15096global_scope::~global_scope()
15117types_defined_same_linux_kernel_corpus_public(
const type_base& t1,
15118 const type_base& t2)
15120 const corpus *t1_corpus = t1.get_corpus(), *t2_corpus = t2.get_corpus();
15121 string t1_file_path, t2_file_path;
15125 if (!(t1_corpus && t2_corpus
15126 && t1_corpus == t2_corpus
15127 && (t1_corpus->get_origin() & corpus::LINUX_KERNEL_BINARY_ORIGIN)
15132 class_or_union *c1 = 0, *c2 = 0;
15138 if ((c1 && c1->get_is_anonymous() && !c1->get_naming_typedef())
15139 || (c2 && c2->get_is_anonymous() && !c2->get_naming_typedef()))
15146 && c1->get_is_anonymous() && c1->get_naming_typedef()
15147 && c2->get_is_anonymous() && c2->get_naming_typedef())
15148 if (c1->get_naming_typedef()->get_name()
15149 != c2->get_naming_typedef()->get_name())
15155 if (e1->get_is_anonymous() || e2->get_is_anonymous())
15165 if (c1->get_is_declaration_only() != c2->get_is_declaration_only())
15167 if (c1->get_environment().decl_only_class_equals_definition())
15177 if (t1.get_size_in_bits() != t2.get_size_in_bits())
15186 l = c1->get_location();
15188 l =
dynamic_cast<const decl_base&
>(t1).
get_location();
15190 unsigned line = 0, col = 0;
15192 l.
expand(t1_file_path, line, col);
15194 l = c2->get_location();
15196 l =
dynamic_cast<const decl_base&
>(t2).
get_location();
15198 l.
expand(t2_file_path, line, col);
15201 if (t1_file_path.empty() || t2_file_path.empty())
15204 if (t1_file_path == t2_file_path)
15240compare_types_during_canonicalization(
const type_base& canonical_type,
15241 const type_base& candidate_type)
15243#ifdef WITH_DEBUG_TYPE_CANONICALIZATION
15244 const environment& env = canonical_type.get_environment();
15245 if (env.debug_type_canonicalization_is_on())
15247 bool canonical_equality =
false, structural_equality =
false;
15248 env.priv_->allow_type_comparison_results_caching(
false);
15249 env.priv_->use_canonical_type_comparison_ =
false;
15250 structural_equality = canonical_type == candidate_type;
15251 env.priv_->use_canonical_type_comparison_ =
true;
15252 canonical_equality = canonical_type == candidate_type;
15253 env.priv_->allow_type_comparison_results_caching(
true);
15254 if (canonical_equality != structural_equality)
15256 std::cerr <<
"structural & canonical equality different for type: "
15257 << canonical_type.get_pretty_representation(
true,
true)
15261 return structural_equality;
15264 return canonical_type == candidate_type;
15288compare_canonical_type_against_candidate(
const type_base& canonical_type,
15289 const type_base& candidate_type)
15291 environment& env =
const_cast<environment&
>(canonical_type.get_environment());
15309 bool saved_decl_only_class_equals_definition =
15310 env.decl_only_class_equals_definition();
15314 env.decl_only_class_equals_definition(
false);
15315 env.priv_->allow_type_comparison_results_caching(
true);
15316 bool equal = (types_defined_same_linux_kernel_corpus_public(canonical_type,
15318 || compare_types_during_canonicalization(canonical_type,
15323 env.priv_->clear_type_comparison_results_cache();
15324 env.priv_->allow_type_comparison_results_caching(
false);
15325 env.decl_only_class_equals_definition
15326 (saved_decl_only_class_equals_definition);
15351compare_canonical_type_against_candidate(
const type_base* canonical_type,
15352 const type_base* candidate_type)
15354 return compare_canonical_type_against_candidate(*canonical_type,
15379compare_canonical_type_against_candidate(
const type_base_sptr& canonical_type,
15380 const type_base_sptr& candidate_type)
15382 return compare_canonical_type_against_candidate(canonical_type.get(),
15383 candidate_type.get());
15403static type_base_sptr
15404candidate_matches_a_canonical_type_hash(
const vector<type_base_sptr>& cncls,
15407 if (type.get_corpus()
15408 && type.get_corpus()->get_origin() == corpus::NATIVE_XML_ORIGIN
15417 for (
const auto& c : cncls)
15423 if (compare_canonical_type_against_candidate(*c, type))
15427 for (
const auto& c : cncls)
15432 if (compare_canonical_type_against_candidate(*c, type))
15482type_base::get_canonical_type_for(type_base_sptr t)
15491 return type_base_sptr();
15497 bool decl_only_class_equals_definition =
15510 if (decl_only_class_equals_definition)
15513 return type_base_sptr();
15516 if (t->get_canonical_type())
15517 return t->get_canonical_type();
15538 string repr = t->get_cached_pretty_representation(
true);
15543 type_base_sptr canonical_type_present_in_corpus;
15547 type_base_sptr result;
15548 environment::canonical_types_map_type::iterator i = types.find(repr);
15550 if (i == types.end())
15552 vector<type_base_sptr> v;
15559 vector<type_base_sptr> &v = i->second;
15564 result = candidate_matches_a_canonical_type_hash(v, *t);
15572 for (vector<type_base_sptr>::const_reverse_iterator it = v.rbegin();
15573 !result && it != v.rend();
15576 bool equal = compare_canonical_type_against_candidate(*it, t);
15583#ifdef WITH_DEBUG_SELF_COMPARISON
15584 if (env.self_comparison_debug_is_on())
15588 corpus_sptr corp1, corp2;
15589 env.get_self_comparison_debug_inputs(corp1, corp2);
15591 && corp1->get_origin() != corp2->get_origin()
15592 && corp2->get_origin() & corpus::NATIVE_XML_ORIGIN)
15603 check_canonical_type_from_abixml_during_self_comp(t,
15609 uintptr_t should_have_canonical_type = 0;
15610 string type_id = env.get_type_id_from_type(t.get());
15611 if (type_id.empty())
15612 type_id =
"type-id-<not-found>";
15614 should_have_canonical_type =
15615 env.get_canonical_type_from_type_id(type_id.c_str());
15616 std::cerr <<
"error: wrong canonical type for '"
15625 <<
"'. Should have had canonical type: "
15627 << should_have_canonical_type
15634 uintptr_t ptr_val =
reinterpret_cast<uintptr_t
>(t.get());
15635 string type_id = env.get_type_id_from_pointer(ptr_val);
15636 if (type_id.empty())
15637 type_id =
"type-id-<not-found>";
15654 std::cerr <<
"error: wrong induced canonical type for '"
15656 <<
"' from second corpus"
15657 <<
", ptr: " << std::hex << t.get()
15658 <<
" type-id: " << type_id
15660 << *t->hash_value()
15670 if (t_hash != result_hash)
15672 std::cerr <<
"error: type hash mismatch"
15673 <<
" between type: '"
15679 << *t->hash_value()
15680 <<
" and its computed canonical type @"
15685 << *result->hash_value()
15700 t->priv_->canonical_type_index = v.size();
15729maybe_adjust_canonical_type(
const type_base_sptr& canonical,
15730 const type_base_sptr& type)
15732 if (type->get_naked_canonical_type())
15740 if (canonical_class
15741 && canonical_class.get() != cl.get())
15745 for (class_decl::member_functions::const_iterator i =
15746 cl->get_member_functions().begin();
15747 i != cl->get_member_functions().end();
15749 if ((*i)->get_symbol())
15752 find_member_function((*i)->get_linkage_name()))
15762 if (canonical_class->get_corpus()
15763 && cl->get_corpus()
15764 && (cl->get_corpus() == canonical_class->get_corpus()))
15778 for (
const auto& data_member : cl->get_data_members())
15785 const auto& canonical_data_member =
15786 canonical_class->find_data_member(data_member->get_name());
15787 if (!canonical_data_member)
15796 if (!canonical_data_member->get_symbol())
15797 canonical_data_member->set_symbol(sym);
15813 canonical_class = cl;
15816 if (canonical_class)
15818 if (
auto abi_corpus = canonical_class->get_corpus())
15820 for (
auto& fn : canonical_class->get_member_functions())
15824 if (sym->is_defined() && sym->is_public())
15826 fn->set_is_in_public_symbol_table(
true);
15827 auto b = abi_corpus->get_exported_decls_builder();
15828 b->maybe_add_fn_to_exported_fns(fn.get());
15830 else if (!sym->is_defined())
15831 abi_corpus->get_undefined_functions().insert(fn.get());
15843 if (type->get_is_artificial() != canonical->get_is_artificial())
15844 canonical->set_is_artificial(
false);
15874 if (t->get_canonical_type())
15875 return t->get_canonical_type();
15877 if (do_log && show_stats)
15878 std::cerr <<
"Canonicalization of type '"
15879 << t->get_pretty_representation(
true,
true)
15880 <<
"/@#" << std::hex << t.get() <<
": ";
15884 if (do_log && show_stats)
15886 type_base_sptr canonical = type_base::get_canonical_type_for(t);
15888 if (do_log && show_stats)
15891 if (do_log && show_stats)
15892 std::cerr << tmr <<
"\n";
15894 maybe_adjust_canonical_type(canonical, t);
15896 t->priv_->canonical_type = canonical;
15897 t->priv_->naked_canonical_type = canonical.get();
15900 if (!t->priv_->canonical_type_index)
15901 t->priv_->canonical_type_index = canonical->priv_->canonical_type_index;
15904 if (type_base_sptr d =
is_type(cl->get_earlier_declaration()))
15905 if ((canonical = d->get_canonical_type()))
15907 d->priv_->canonical_type = canonical;
15908 d->priv_->naked_canonical_type = canonical.get();
15925 if (type_base_sptr c =
is_type(scope)->get_canonical_type())
15940 t->on_canonical_type_set();
15951 priv_->definition_of_declaration_ = d;
15953 if (type_base_sptr canonical_type =
is_type(d)->get_canonical_type())
15954 t->priv_->canonical_type = canonical_type;
15956 priv_->naked_definition_of_declaration_ =
const_cast<decl_base*
>(d.get());
15966 priv_(new
priv(s, a))
15980 return do_hash(
this);
15992{
return priv_->canonical_type.lock();}
16008{
return priv_->naked_canonical_type;}
16035 if (priv_->internal_cached_repr_.
empty())
16040 return priv_->internal_cached_repr_;
16043 if (priv_->cached_repr_.
empty())
16049 return priv_->cached_repr_;
16087{
return equals(*
this, other, 0);}
16104{priv_->size_in_bits = s;}
16111{
return priv_->size_in_bits;}
16118{priv_->alignment_in_bits = a;}
16125{
return priv_->alignment_in_bits;}
16141 v.visit_begin(
this);
16142 bool result = v.visit_end(
this);
16148type_base::~type_base()
16167 static_cast<unsigned>(r));
16182 static_cast<unsigned>(r));
16239parse_real_type_modifier(
const string& word,
16242 if (word ==
"signed")
16244 else if (word ==
"unsigned")
16246 else if (word ==
"short")
16248 else if (word ==
"long")
16250 else if (word ==
"long long")
16268parse_base_real_type(
const string& type_name,
16271 if (type_name ==
"int")
16273 else if (type_name ==
"char")
16275 else if (type_name ==
"bool" || type_name ==
"_Bool")
16277 else if (type_name ==
"double")
16279 else if (type_name ==
"float")
16281 else if (type_name ==
"char16_t")
16283 else if (type_name ==
"char32_t")
16285 else if (type_name ==
"wchar_t")
16287 else if (type_name ==
"__ARRAY_SIZE_TYPE__")
16289 else if (type_name ==
"sizetype")
16290 base = real_type::SIZE_BASE_TYPE;
16291 else if (type_name ==
"ssizetype")
16292 base = real_type::SSIZE_BASE_TYPE;
16293 else if (type_name ==
"bitsizetype")
16294 base = real_type::BIT_SIZE_BASE_TYPE;
16295 else if (type_name ==
"sbitsizetype")
16296 base = real_type::SBIT_SIZE_BASE_TYPE;
16320 string input = type_name;
16321 string::size_type len = input.length();
16322 string::size_type cur_pos = 0, prev_pos = 0;
16323 string cur_word, prev_word;
16326 while (cur_pos < len)
16328 if (cur_pos < len && isspace(input[cur_pos]))
16331 while (cur_pos < len && isspace(input[cur_pos]));
16333 prev_pos = cur_pos;
16334 cur_pos = input.find(
' ', prev_pos);
16335 prev_word = cur_word;
16336 cur_word = input.substr(prev_pos, cur_pos - prev_pos);
16339 && cur_word ==
"long"
16340 && prev_word !=
"long")
16342 if (cur_pos < len && isspace(input[cur_pos]))
16345 while (cur_pos < len && isspace(input[cur_pos]));
16346 prev_pos = cur_pos;
16348 cur_pos = input.find(
' ', prev_pos);
16349 string saved_prev_word = prev_word;
16350 prev_word = cur_word;
16351 cur_word = input.substr(prev_pos, cur_pos - prev_pos);
16352 if (cur_word ==
"long")
16353 cur_word =
"long long";
16356 cur_pos = prev_pos;
16357 cur_word = prev_word;
16358 prev_word = saved_prev_word;
16362 if (!parse_real_type_modifier(cur_word, modifiers))
16364 if (!parse_base_real_type(cur_word, base))
16395 real_type int_type(base_type, modifiers);
16402 : base_(INT_BASE_TYPE),
16403 modifiers_(NO_MODIFIER)
16412 : base_(b), modifiers_(m)
16420 : base_(INT_BASE_TYPE),
16421 modifiers_(NO_MODIFIER)
16439{
return modifiers_;}
16456{
return base_ == other.base_ && modifiers_ == other.modifiers_;}
16474 result +=
"signed ";
16476 result +=
"unsigned ";
16487 result +=
"short ";
16491 result +=
"long long ";
16502 result +=
"double";
16506 result +=
"char16_t";
16508 result +=
"char32_t";
16510 result +=
"wchar_t";
16512 result +=
"__ARRAY_SIZE_TYPE__";
16513 else if (base_ == SIZE_BASE_TYPE)
16514 result +=
"sizetype";
16515 else if (base_ == SSIZE_BASE_TYPE)
16516 result +=
"ssizetype";
16517 else if (base_ == BIT_SIZE_BASE_TYPE)
16518 result +=
"bitsizetype";
16519 else if (base_ == SBIT_SIZE_BASE_TYPE)
16520 result +=
"sbitsizetype";
16529real_type::operator string()
const
16530{
return to_string();}
16553 const string& name,
16554 size_t size_in_bits,
16555 size_t alignment_in_bits,
16557 const string& linkage_name,
16562 | ABSTRACT_TYPE_BASE
16563 | ABSTRACT_DECL_BASE),
16564 decl_base(env, name, locus, linkage_name, vis),
16565 type_base(env, size_in_bits, alignment_in_bits)
16571 real_type int_type(base_type, modifiers);
16576 string real_type_name = int_type;
16624 bool result =
false;
16655 return *
this == *other;
16683 return *
this == other;
16729 if (l.get() == r.get())
16757 bool internal)
const
16781 if (decl_base::priv_->internal_qualified_name_.
empty())
16782 decl_base::priv_->internal_qualified_name_ =
16783 env.
intern(get_internal_real_type_name(
this));
16784 return decl_base::priv_->internal_qualified_name_;
16788 decl_base::priv_->temporary_internal_qualified_name_ =
16789 env.
intern(get_internal_real_type_name(
this));
16790 return decl_base::priv_->temporary_internal_qualified_name_;
16816 bool qualified_name)
const
16820 return get_internal_real_type_name(
this);
16822 if (qualified_name)
16840 v.visit_begin(
this);
16841 bool result = v.visit_end(
this);
16847type_decl::~type_decl()
16867 const string& name,
16868 size_t size_in_bits,
16869 size_t alignment_in_bits,
16873 ABSTRACT_SCOPE_TYPE_DECL
16874 | ABSTRACT_TYPE_BASE
16875 | ABSTRACT_DECL_BASE),
16877 type_base(env, size_in_bits, alignment_in_bits),
16946 return *
this == *other;
16970 if (v.visit_begin(
this))
16973 for (scope_decl::declarations::const_iterator i =
16977 if (!(*i)->traverse(v))
16982 bool result = v.visit_end(
this);
16988scope_type_decl::~scope_type_decl()
17004 const string& name,
17015 | ABSTRACT_DECL_BASE
17016 | ABSTRACT_SCOPE_DECL),
17042 bool qualified_name)
const
17045 "namespace " + scope_decl::get_pretty_representation(internal,
17084 if (!ns->is_empty_or_has_empty_sub_namespaces())
17105 if (v.visit_begin(
this))
17108 scope_decl::declarations::const_iterator i;
17114 dynamic_pointer_cast<ir_traversable_base>(*i);
17116 if (!t->traverse (v))
17121 return v.visit_end(
this);
17124namespace_decl::~namespace_decl()
17133class qualified_type_def::priv
17144 weak_ptr<type_base> underlying_type_;
17147 : cv_quals_(CV_NONE)
17152 : cv_quals_(quals),
17153 underlying_type_(t)
17205qualified_type_def::qualified_type_def(type_base_sptr type,
17210 | ABSTRACT_TYPE_BASE
17211 | ABSTRACT_DECL_BASE),
17212 type_base(type->get_environment(), type->get_size_in_bits(),
17213 type->get_alignment_in_bits()),
17214 decl_base(type->get_environment(),
"", locus,
"",
17215 dynamic_pointer_cast<
decl_base>(type)->get_visibility()),
17216 priv_(new priv(quals, type))
17235 | ABSTRACT_TYPE_BASE
17236 | ABSTRACT_DECL_BASE),
17240 priv_(new priv(quals))
17277 s = ut->get_size_in_bits();
17306 bool result =
true;
17373 return *
this == *other;
17391 return *
this == *other;
17406 bool internal)
const
17434 if (priv_->temporary_internal_name_.empty())
17435 priv_->temporary_internal_name_ =
17437 return priv_->temporary_internal_name_;
17453 if (priv_->internal_name_.empty())
17454 priv_->internal_name_ =
17457 return priv_->internal_name_;
17486 if (v.visit_begin(
this))
17493 bool result = v.visit_end(
this);
17498qualified_type_def::~qualified_type_def()
17505{
return priv_->cv_quals_;}
17510{priv_->cv_quals_ = cv_quals;}
17524{
return priv_->underlying_type_.lock();}
17533 priv_->underlying_type_ = t;
17543 scope_decl::declarations::iterator i;
17544 if (s->find_iterator_for_member(
this, i))
17559operator==(
const qualified_type_def_sptr& l,
const qualified_type_def_sptr& r)
17561 if (l.get() == r.get())
17577operator!=(
const qualified_type_def_sptr& l,
const qualified_type_def_sptr& r)
17585 (
static_cast<unsigned>(lhs) |
static_cast<unsigned>(rhs));
17609 (
static_cast<unsigned>(lhs) &
static_cast<unsigned>(rhs));
17631 case qualified_type_def::CV_NONE:
17634 case qualified_type_def::CV_CONST:
17637 case qualified_type_def::CV_VOLATILE:
17640 case qualified_type_def::CV_RESTRICT:
17654struct pointer_type_def::priv
17661 priv(
const type_base_sptr& t)
17663 naked_pointed_to_type_(t.get())
17667 : naked_pointed_to_type_()
17692pointer_type_def::pointer_type_def(
const type_base_sptr& pointed_to,
17693 size_t size_in_bits,
17694 size_t align_in_bits,
17698 | ABSTRACT_TYPE_BASE
17699 | ABSTRACT_DECL_BASE),
17700 type_base(pointed_to->get_environment(), size_in_bits, align_in_bits),
17701 decl_base(pointed_to->get_environment(),
"", locus,
""),
17702 priv_(new priv(pointed_to))
17708 const environment& env = pointed_to->get_environment();
17709 decl_base_sptr pto = dynamic_pointer_cast<decl_base>(pointed_to);
17710 string name = (pto ? pto->get_name() :
string(
"void")) +
"*";
17728pointer_type_def::pointer_type_def(
const environment& env,
size_t size_in_bits,
17729 size_t alignment_in_bits,
17733 | ABSTRACT_TYPE_BASE
17734 | ABSTRACT_DECL_BASE),
17735 type_base(env, size_in_bits, alignment_in_bits),
17740 string name = string(
"void") +
"*";
17765 priv_->pointed_to_type_ = t;
17766 priv_->naked_pointed_to_type_ = t.get();
17771 decl_base_sptr pto = dynamic_pointer_cast<decl_base>(t);
17772 string name = (pto ? pto->get_name() :
string(
"void")) +
"*";
17804 bool result = p1 == p2;
17846 return *
this == *o;
17867const type_base_sptr
17869{
return priv_->pointed_to_type_.lock();}
17876{
return priv_->naked_pointed_to_type_;}
17914 if (priv_->internal_qualified_name_.empty())
17915 if (pointed_to_type)
17916 priv_->internal_qualified_name_ =
17917 pointer_declaration_name(
this,
17924 return priv_->internal_qualified_name_;
17932 if (pointed_to_type)
17933 if (priv_->temp_internal_qualified_name_.empty())
17934 priv_->temp_internal_qualified_name_ =
17935 pointer_declaration_name(
this,
17942 return priv_->temp_internal_qualified_name_;
17951 (pointer_declaration_name(
this,
17963 if (pointed_to_type)
17965 (pointer_declaration_name(
this,
17990 if (v.visit_begin(
this))
17998 bool result = v.visit_end(
this);
18003pointer_type_def::~pointer_type_def()
18020 if (l.get() == r.get())
18048struct reference_type_def::priv
18056 priv(
const type_base_sptr& t,
bool is_lvalue)
18058 is_lvalue_(is_lvalue)
18061 priv(
bool is_lvalue)
18062 : is_lvalue_(is_lvalue)
18091reference_type_def::reference_type_def(
const type_base_sptr pointed_to,
18093 size_t size_in_bits,
18094 size_t align_in_bits,
18098 | ABSTRACT_TYPE_BASE
18099 | ABSTRACT_DECL_BASE),
18100 type_base(pointed_to->get_environment(), size_in_bits, align_in_bits),
18101 decl_base(pointed_to->get_environment(),
"", locus,
""),
18102 priv_(new priv(pointed_to, lvalue))
18108 decl_base_sptr pto = dynamic_pointer_cast<decl_base>(pointed_to);
18113 name = string(pto->get_name()) +
"&";
18121 const environment& env = pointed_to->get_environment();
18145reference_type_def::reference_type_def(
const environment& env,
bool lvalue,
18146 size_t size_in_bits,
18147 size_t alignment_in_bits,
18151 | ABSTRACT_TYPE_BASE
18152 | ABSTRACT_DECL_BASE),
18153 type_base(env, size_in_bits, alignment_in_bits),
18155 priv_(new priv(lvalue))
18158 string name =
"void&";
18187 priv_->pointed_to_type_ = pointed_to_type;
18189 decl_base_sptr pto;
18191 {pto = dynamic_pointer_cast<decl_base>(pointed_to_type);}
18198 string name = string(pto->get_name()) +
"&";
18228 if (l.is_lvalue() != r.is_lvalue())
18234 type_base_sptr p1 = l.get_pointed_to_type(), p2 = r.get_pointed_to_type();
18235 bool result = p1 == p2;
18274 return *
this == *other;
18289 return *
this == *other;
18293reference_type_def::get_pointed_to_type()
const
18294{
return priv_->pointed_to_type_.lock();}
18297reference_type_def::is_lvalue()
const
18298{
return priv_->is_lvalue_;}
18328 type_base_sptr pointed_to_type = get_pointed_to_type();
18335 if (priv_->internal_qualified_name_.empty())
18336 if (pointed_to_type)
18337 priv_->internal_qualified_name_ =
18345 return priv_->internal_qualified_name_;
18353 if (pointed_to_type)
18354 if (priv_->temp_internal_qualified_name_.empty())
18355 priv_->temp_internal_qualified_name_ =
18363 return priv_->temp_internal_qualified_name_;
18383 if (pointed_to_type)
18413 bool qualified_name)
const
18417 (get_pointed_to_type()),
18441 if (v.visit_begin(
this))
18444 if (type_base_sptr t = get_pointed_to_type())
18449 bool result = v.visit_end(
this);
18454reference_type_def::~reference_type_def()
18471 if (l.get() == r.get())
18499struct ptr_to_mbr_type::priv
18503 type_base_sptr dm_type_;
18506 type_base_sptr containing_type_;
18513 priv(
const type_base_sptr& dm_type,
const type_base_sptr& containing_type)
18514 : dm_type_(dm_type),
18515 containing_type_(containing_type)
18537 const type_base_sptr& member_type,
18538 const type_base_sptr& containing_type,
18539 size_t size_in_bits,
18540 size_t alignment_in_bits,
18543 POINTER_TO_MEMBER_TYPE
18544 | ABSTRACT_TYPE_BASE
18545 | ABSTRACT_DECL_BASE),
18546 type_base(env, size_in_bits, alignment_in_bits),
18548 priv_(new priv(member_type, containing_type))
18585const type_base_sptr&
18587{
return priv_->dm_type_;}
18594const type_base_sptr&
18596{
return priv_->containing_type_;}
18626 return *
this == *other;
18641 return *
this == *other;
18653 bool internal)
const
18672 if (priv_->internal_qualified_name_.empty())
18673 priv_->internal_qualified_name_ =
18674 ptr_to_mbr_declaration_name(
this,
"",
18677 return priv_->internal_qualified_name_;
18681 priv_->temp_internal_qualified_name_ =
18682 ptr_to_mbr_declaration_name(
this,
"",
true, internal);
18683 return priv_->temp_internal_qualified_name_;
18689 (ptr_to_mbr_declaration_name(
this,
"",
true,
18711 if (v.visit_begin(
this))
18722 bool result = v.visit_end(
this);
18754 bool result =
true;
18756 if (!(l.decl_base::operator==(r)))
18795array_type_def::subrange_type::~subrange_type() =
default;
18804 : s_(UNSIGNED_SIGNEDNESS)
18813 : s_(UNSIGNED_SIGNEDNESS)
18822 : s_(SIGNED_SIGNEDNESS)
18830enum array_type_def::subrange_type::bound_value::signedness
18854{
return v_.unsigned_;}
18862 s_ = UNSIGNED_SIGNEDNESS;
18872 s_ = SIGNED_SIGNEDNESS;
18884 return s_ == v.s_ && v_.unsigned_ == v.v_.unsigned_;
18889struct array_type_def::subrange_type::priv
18899 : upper_bound_(ub), language_(l), infinite_(false)
18902 priv(bound_value lb, bound_value ub,
18904 : lower_bound_(lb), upper_bound_(ub),
18905 language_(l), infinite_(false)
18908 priv(bound_value lb, bound_value ub,
const type_base_sptr &u,
18910 : lower_bound_(lb), upper_bound_(ub), underlying_type_(u),
18911 language_(l), infinite_(false)
18930 const string& name,
18933 const type_base_sptr& utype,
18936 :
type_or_decl_base(env, SUBRANGE_TYPE | ABSTRACT_TYPE_BASE | ABSTRACT_DECL_BASE),
18943 priv_(new priv(lower_bound, upper_bound, utype, l))
18963 const string& name,
18968 :
type_or_decl_base(env, SUBRANGE_TYPE | ABSTRACT_TYPE_BASE | ABSTRACT_DECL_BASE),
18971 priv_(new priv(lower_bound, upper_bound, l))
18989 const string& name,
18993 :
type_or_decl_base(env, SUBRANGE_TYPE | ABSTRACT_TYPE_BASE | ABSTRACT_DECL_BASE),
18994 type_base(env, upper_bound.get_unsigned_value(), 0),
18996 priv_(new priv(upper_bound, l))
19021{
return priv_->underlying_type_.lock();}
19030 ABG_ASSERT(priv_->underlying_type_.expired());
19031 priv_->underlying_type_ = u;
19041{
return priv_->upper_bound_.get_signed_value();}
19048{
return priv_->lower_bound_.get_signed_value();}
19055{priv_->upper_bound_ = ub;}
19062{priv_->lower_bound_ = lb;}
19079 if (get_upper_bound() >= get_lower_bound())
19080 return get_upper_bound() - get_lower_bound() + 1;
19089{
return priv_->infinite_;}
19097{priv_->infinite_ = f;}
19104{
return priv_->language_;}
19112 std::ostringstream o;
19116 type_base_sptr underlying_type = get_underlying_type();
19117 if (underlying_type)
19119 o <<
"range "<< get_lower_bound() <<
" .. " << get_upper_bound();
19124 o <<
"[" << get_length() <<
"]";
19139 for (vector<subrange_sptr>::const_iterator i = v.begin();
19142 r += (*i)->as_string();
19171 bool result =
true;
19226 return *
this == *other;
19294 repr +=
"<anonymous range>";
19296 repr +=
"<range " +
get_name() +
">";
19297 repr += as_string();
19315 if (v.visit_begin(
this))
19318 if (type_base_sptr u = get_underlying_type())
19323 bool result = v.visit_end(
this);
19330struct array_type_def::priv
19337 priv(type_base_sptr t)
19341 priv(type_base_sptr t, subranges_type subs)
19342 : element_type_(t), subranges_(subs)
19362array_type_def::array_type_def(
const type_base_sptr e_type,
19363 const std::vector<subrange_sptr>& subs,
19367 | ABSTRACT_TYPE_BASE
19368 | ABSTRACT_DECL_BASE),
19371 priv_(new priv(e_type))
19395 const std::vector<subrange_sptr>& subs,
19399 | ABSTRACT_TYPE_BASE
19400 | ABSTRACT_DECL_BASE),
19428array_type_def::update_size()
19430 type_base_sptr e = priv_->element_type_.lock();
19433 size_t s = e->get_size_in_bits();
19437 s *= sub->get_length();
19445array_type_def::get_subrange_representation()
const
19471 bool qualified_name)
const
19473 return array_declaration_name(
this,
"",
19474 qualified_name, internal);
19499 std::vector<array_type_def::subrange_sptr > this_subs = l.
get_subranges();
19500 std::vector<array_type_def::subrange_sptr > other_subs = r.
get_subranges();
19502 bool result =
true;
19503 if (this_subs.size() != other_subs.size())
19512 std::vector<array_type_def::subrange_sptr >::const_iterator i,j;
19513 for (i = this_subs.begin(), j = other_subs.begin();
19514 i != this_subs.end() && j != other_subs.end();
19561 std::vector<array_type_def::subrange_sptr > this_subs = l->
get_subranges();
19562 std::vector<array_type_def::subrange_sptr > other_subs = r->
get_subranges();
19564 if (this_subs.size() != other_subs.size())
19567 std::vector<array_type_def::subrange_sptr >::const_iterator i,j;
19568 for (i = this_subs.begin(), j = other_subs.begin();
19569 i != this_subs.end() && j != other_subs.end();
19579 if (*first_element_type != *second_element_type)
19591 const std::vector<subrange_sptr>& subranges =
19594 if (subranges.empty())
19595 return translation_unit::LANG_C11;
19596 return subranges.front()->get_language();
19615 return *
this == *other;
19621const type_base_sptr
19623{
return priv_->element_type_.lock();}
19639 priv_->element_type_ = element_type;
19650 for (
const auto &sub : subs)
19651 priv_->subranges_.push_back(sub);
19663 if (priv_->subranges_.empty())
19666 for (std::vector<shared_ptr<subrange_type> >::const_iterator i =
19667 priv_->subranges_.begin();
19668 i != priv_->subranges_.end();
19670 if ((*i)->is_non_finite())
19677array_type_def::get_dimension_count()
const
19678{
return priv_->subranges_.size();}
19709 if (priv_->internal_qualified_name_.empty())
19710 priv_->internal_qualified_name_ =
19711 array_declaration_name(
this,
"",
19714 return priv_->internal_qualified_name_;
19718 priv_->temp_internal_qualified_name_ =
19719 array_declaration_name(
this,
"",
19721 return priv_->temp_internal_qualified_name_;
19738 (array_declaration_name(
this,
"",
19762 if (v.visit_begin(
this))
19770 bool result = v.visit_end(
this);
19776array_type_def::get_location()
const
19780const std::vector<array_type_def::subrange_sptr>&
19782{
return priv_->subranges_;}
19784array_type_def::~array_type_def()
19791class enum_type_decl::priv
19793 type_base_sptr underlying_type_;
19802 priv(type_base_sptr underlying_type,
19804 : underlying_type_(underlying_type),
19822enum_type_decl::enum_type_decl(
const string& name,
19824 type_base_sptr underlying_type,
19826 const string& linkage_name,
19830 | ABSTRACT_TYPE_BASE
19831 | ABSTRACT_DECL_BASE),
19832 type_base(underlying_type->get_environment(),
19833 underlying_type->get_size_in_bits(),
19834 underlying_type->get_alignment_in_bits()),
19835 decl_base(underlying_type->get_environment(),
19836 name, locus, linkage_name, vis),
19837 priv_(new priv(underlying_type, enums))
19843 e->set_enum_type(
this);
19863{
return priv_->underlying_type_;}
19868{
return priv_->enumerators_;}
19873{
return priv_->enumerators_;}
19881 if (priv_->sorted_enumerators_.empty())
19886 priv_->sorted_enumerators_.push_back(*e);
19888 std::sort(priv_->sorted_enumerators_.begin(),
19889 priv_->sorted_enumerators_.end(),
19893 if (l.get_name() == r.get_name())
19894 return l.get_value() < r.get_value();
19895 return (l.get_name() < r.get_name());
19899 return priv_->sorted_enumerators_;
19921 bool qualified_name)
const
19923 string r =
"enum ";
19953 if (v.visit_begin(
this))
19961 bool result = v.visit_end(
this);
19983 bool result =
false;
19993 enum_type_decl::enumerators::const_iterator i, j;
20026 if (!(l.decl_base::operator==(r) && l.type_base::operator==(r)))
20031 if (!l.decl_base::operator==(r))
20033 if (!l.type_base::operator==(r))
20105is_enumerator_value_present_in_enum(
const enum_type_decl::enumerator &enr,
20106 const enum_type_decl &enom,
20107 vector<enum_type_decl::enumerator>& redundant_enrs)
20109 bool found =
false;
20110 for (
const auto &e : enom.get_enumerators())
20111 if (enumerators_values_are_equal(e, enr))
20115 redundant_enrs.push_back(e);
20133is_enumerator_value_redundant(
const enum_type_decl::enumerator &enr,
20134 const enum_type_decl &enom)
20136 vector<enum_type_decl::enumerator> redundant_enrs;
20137 if (is_enumerator_value_present_in_enum(enr, enom, redundant_enrs))
20139 if (!redundant_enrs.empty())
20167 bool result =
true;
20183 if (!!def1 != !!def2)
20213 if (!(def1->decl_base::operator==(*def2)
20214 && def1->type_base::operator==(*def2)))
20219 if (!def1->decl_base::operator==(*def2))
20221 if (!def1->type_base::operator==(*def2))
20299 && (!is_enumerator_value_redundant(e, *def2)
20300 || !is_enumerator_value_redundant(e, *def1)))
20314 && (!is_enumerator_value_redundant(e, *def1)
20315 || !is_enumerator_value_redundant(e, *def2)))
20357 return *
this == *other;
20372 if (l.get() == r.get())
20374 decl_base_sptr o = r;
20391class enum_type_decl::enumerator::priv
20395 string qualified_name_;
20406 priv(
const string& name,
20408 enum_type_decl* e = 0)
20420enum_type_decl::enumerator::~enumerator() =
default;
20431 : priv_(new priv(name, value))
20438 : priv_(new priv(other.
get_name(),
20440 other.get_enum_type()))
20465 bool names_equal =
true;
20467 return names_equal && (get_value() == other.
get_value());
20486{
return priv_->name_;}
20504 if (priv_->qualified_name_.empty())
20506 priv_->qualified_name_ =
20507 get_enum_type()->get_qualified_name(internal)
20511 return priv_->qualified_name_;
20527{
return priv_->value_;}
20541{
return priv_->enum_type_;}
20548{priv_->enum_type_ = e;}
20554struct typedef_decl::priv
20558 priv(
const type_base_sptr& t)
20559 : underlying_type_(t)
20574typedef_decl::typedef_decl(
const string& name,
20575 const type_base_sptr underlying_type,
20577 const string& linkage_name,
20581 | ABSTRACT_TYPE_BASE
20582 | ABSTRACT_DECL_BASE),
20587 name, locus, linkage_name, vis),
20588 priv_(new priv(underlying_type))
20604typedef_decl::typedef_decl(
const string& name,
20607 const string& mangled_name,
20611 | ABSTRACT_TYPE_BASE
20612 | ABSTRACT_DECL_BASE),
20615 decl_base(env, name, locus, mangled_name, vis),
20616 priv_(new priv(nullptr))
20691 bool result =
true;
20695 if (!(l.decl_base::operator==(r)))
20742 return *
this == *other;
20764 bool qualified_name)
const
20767 string result =
"typedef ";
20768 if (qualified_name)
20781{
return priv_->underlying_type_.lock();}
20789 priv_->underlying_type_ = t;
20803 bool internal)
const
20821 return decl_base::priv_->internal_qualified_name_;
20823 return decl_base::priv_->qualified_name_;
20842 if (v.visit_begin(
this))
20850 bool result = v.visit_end(
this);
20855typedef_decl::~typedef_decl()
20861struct var_decl::priv
20874 priv(type_base_sptr t,
20877 naked_type_(t.get()),
20885 set_type(type_base_sptr t)
20888 naked_type_ = t.get();
20905var_decl::var_decl(
const string& name,
20906 type_base_sptr type,
20908 const string& linkage_name,
20912 VAR_DECL | ABSTRACT_DECL_BASE),
20913 decl_base(type->get_environment(), name, locus, linkage_name, vis),
20914 priv_(new priv(type, bind))
20922const type_base_sptr
20924{
return priv_->type_.lock();}
20931{priv_->set_type(t);}
20942{
return priv_->naked_type_;}
20949{
return priv_->binding_;}
20956{priv_->binding_ = b;}
20972 priv_->symbol_ = sym;
20987{
return priv_->symbol_;}
21056 bool result =
true;
21069 else if (s0 && s0 != s1)
21077 bool symbols_are_equal = (s0 && s1 && result);
21079 if (symbols_are_equal)
21088 bool decl_bases_different = !l.decl_base::operator==(r);
21089 const_cast<var_decl&
>(l).set_qualified_name(n1);
21090 const_cast<var_decl&
>(r).set_qualified_name(n2);
21092 if (decl_bases_different)
21102 if (!l.decl_base::operator==(r))
21151 bool result =
true;
21187 return equals(*
this, *other, 0);
21202 if (priv_->id_.empty())
21207 sym_str = s->get_id_string();
21212 priv_->id_ = env.
intern(repr);
21213 if (!sym_str.empty())
21214 priv_->id_ = env.
intern(priv_->id_ +
"{" + sym_str +
"}");
21281 result =
"static ";
21285 bool member_of_anonymous_class =
false;
21288 member_of_anonymous_class =
true;
21297 if (member_of_anonymous_class || !qualified_name)
21304 string quals_repr =
21306 if (!quals_repr.empty())
21307 name = quals_repr +
" " + name;
21311 name = string(
" ") + name;
21313 result += array_declaration_name(t, name, qualified_name, internal);
21315 result += pointer_declaration_name(t, name, qualified_name, internal);
21317 result += pointer_declaration_name(t, name, qualified_name, internal);
21319 result += ptr_to_mbr_declaration_name(t, name,
21334 "",
true, internal);
21340 "",
true, internal);
21343 && (member_of_anonymous_class || !qualified_name))
21359 && (member_of_anonymous_class || !qualified_name))
21413 if (v.visit_begin(
this))
21416 if (type_base_sptr t =
get_type())
21420 return v.visit_end(
this);
21423var_decl::~var_decl()
21438 priv_->cached_name_.clear();
21439 priv_->internal_cached_name_.clear();
21459function_type::function_type(type_base_sptr return_type,
21461 size_t size_in_bits,
21462 size_t alignment_in_bits)
21464 FUNCTION_TYPE | ABSTRACT_TYPE_BASE),
21465 type_base(return_type->get_environment(), size_in_bits, alignment_in_bits),
21466 priv_(new
priv(parms, return_type))
21470 for (parameters::size_type i = 0, j = 1;
21471 i < priv_->parms_.size();
21474 if (i == 0 && priv_->parms_[i]->get_is_artificial())
21481 priv_->parms_[i]->set_index(j);
21492function_type::function_type(type_base_sptr return_type,
21493 size_t size_in_bits,
size_t alignment_in_bits)
21495 FUNCTION_TYPE | ABSTRACT_TYPE_BASE),
21496 type_base(return_type->get_environment(), size_in_bits, alignment_in_bits),
21497 priv_(new
priv(return_type))
21512 size_t size_in_bits,
21513 size_t alignment_in_bits)
21515 type_base(env, size_in_bits, alignment_in_bits),
21541{
return priv_->return_type_.lock();}
21549{priv_->return_type_ = t;}
21558{
return priv_->parms_;}
21601 for (parameters::size_type i = 0, j = 1;
21602 i < priv_->parms_.size();
21605 if (i == 0 && priv_->parms_[i]->get_is_artificial())
21612 priv_->parms_[i]->set_index(j);
21623 parm->set_index(priv_->parms_.size());
21624 priv_->parms_.push_back(parm);
21638 return (!priv_->parms_.empty()
21639 && priv_->parms_.back()->get_variadic_marker());
21671#define RETURN(value) CACHE_AND_RETURN_COMPARISON_RESULT(value)
21680 bool cached_result =
false;
21688 bool result =
true;
21690 if (!l.type_base::operator==(r))
21701 l_class = m->get_class_type().get();
21704 r_class = m->get_class_type().get();
21708 if (!!l_class != !!r_class)
21718 != r_class->get_qualified_name()))
21735 bool compare_result_types =
true;
21736 string l_rt_name = l_return_type_decl
21739 string r_rt_name = r_return_type_decl
21745 (r_class && (r_class->get_qualified_name() == r_rt_name)))
21746 compare_result_types =
false;
21748 if (compare_result_types)
21772 if (l_rt_name != r_rt_name)
21781 vector<shared_ptr<function_decl::parameter> >::const_iterator i,j;
21822function_type::parameters::const_iterator
21828 bool is_method =
dynamic_cast<const method_type*
>(
this);
21832 if (is_method && (*i)->get_is_artificial())
21844function_type::parameters::const_iterator
21871 if (priv_->internal_cached_name_.empty())
21872 priv_->internal_cached_name_ =
21874 return priv_->internal_cached_name_;
21878 priv_->temp_internal_cached_name_ =
21880 return priv_->temp_internal_cached_name_;
21887 if (priv_->cached_name_.empty())
21888 priv_->cached_name_ =
21890 return priv_->cached_name_;
21894 priv_->cached_name_ =
21896 return priv_->cached_name_;
21957 if (v.visit_begin(
this))
21960 bool keep_going =
true;
21964 if (!t->traverse(v))
21965 keep_going =
false;
21972 if (type_base_sptr parm_type = (*i)->get_type())
21973 if (!parm_type->traverse(v))
21978 return v.visit_end(
this);
21981function_type::~function_type()
21987struct method_type::priv
21989 class_or_union_wptr class_type_;
22017method_type::method_type (type_base_sptr return_type,
22018 class_or_union_sptr class_type,
22019 const std::vector<function_decl::parameter_sptr>& p,
22021 size_t size_in_bits,
22022 size_t alignment_in_bits)
22024 METHOD_TYPE | ABSTRACT_TYPE_BASE | FUNCTION_TYPE),
22025 type_base(class_type->get_environment(), size_in_bits, alignment_in_bits),
22026 function_type(return_type, p, size_in_bits, alignment_in_bits),
22057method_type::method_type(type_base_sptr return_type,
22058 type_base_sptr class_type,
22059 const std::vector<function_decl::parameter_sptr>& p,
22061 size_t size_in_bits,
22062 size_t alignment_in_bits)
22064 METHOD_TYPE | ABSTRACT_TYPE_BASE | FUNCTION_TYPE),
22065 type_base(class_type->get_environment(), size_in_bits, alignment_in_bits),
22066 function_type(return_type, p, size_in_bits, alignment_in_bits),
22082 size_t size_in_bits,
22083 size_t alignment_in_bits)
22085 type_base(env, size_in_bits, alignment_in_bits),
22105method_type::method_type(class_or_union_sptr class_type,
22107 size_t size_in_bits,
22108 size_t alignment_in_bits)
22110 METHOD_TYPE | ABSTRACT_TYPE_BASE | FUNCTION_TYPE),
22111 type_base(class_type->get_environment(), size_in_bits, alignment_in_bits),
22114 alignment_in_bits),
22141{
return class_or_union_sptr(priv_->class_type_);}
22154 priv_->class_type_ = t;
22182{priv_->is_const = f;}
22189{
return priv_->is_const;}
22205 if (!first_parm->get_is_artificial())
22208 type_base_sptr this_ptr_type = first_parm->get_type();
22216 type_base_sptr candidate_class_type =
22236struct function_decl::priv
22238 bool declared_inline_;
22246 : declared_inline_(false),
22252 bool declared_inline,
22254 : declared_inline_(declared_inline),
22257 naked_type_(t.get())
22261 bool declared_inline,
22264 : declared_inline_(declared_inline),
22267 naked_type_(t.get()),
22289 bool declared_inline,
22291 const string& mangled_name,
22295 FUNCTION_DECL | ABSTRACT_DECL_BASE),
22326 type_base_sptr fn_type,
22327 bool declared_inline,
22329 const string& linkage_name,
22333 FUNCTION_DECL | ABSTRACT_DECL_BASE),
22334 decl_base(fn_type->get_environment(), name, locus, linkage_name, vis),
22335 priv_(new priv(dynamic_pointer_cast<
function_type>(fn_type),
22357 bool qualified_name)
const
22362 string fn_prefix = mem_fn ?
"method ":
"function ";
22368 fn_prefix +=
"virtual ";
22370 decl_base_sptr return_type;
22377 return_type = mem_fn
22388 internal) +
" " + result;
22391 result = add_outer_pointer_to_fn_type_expr(p, result,
22396 result = add_outer_pointer_to_array_type_expr(p, result,
22403 return fn_prefix + result;
22433 result += mem_fn->
get_type()->get_class_type()->get_qualified_name()
22439 std::ostringstream fn_parms;
22440 stream_pretty_representation_of_fn_parms(*
get_type(),
22444 result += fn_parms.str();
22449 result +=
" const";
22460function_decl::parameters::const_iterator
22466 bool is_method =
dynamic_cast<const method_decl*
>(
this);
22479const shared_ptr<function_type>
22481{
return priv_->type_.lock();}
22496{
return priv_->naked_type_;}
22501 priv_->type_ = fn_type;
22502 priv_->naked_type_ = fn_type.get();
22519 priv_->symbol_ = sym;
22534{
return priv_->symbol_;}
22541{
return priv_->declared_inline_;}
22548{priv_->declared_inline_ = value;}
22551function_decl::get_binding()
const
22552{
return priv_->binding_;}
22555const shared_ptr<type_base>
22557{
return get_type()->get_return_type();}
22560const std::vector<shared_ptr<function_decl::parameter> >&
22562{
return get_type()->get_parameters();}
22569{
get_type()->append_parameter(parm);}
22577 for (std::vector<shared_ptr<parameter> >::const_iterator i = parms.begin();
22650 bool result =
true;
22654 if (t0 == t1 || *t0 == *t1)
22680 else if (s0 && s0 != s1)
22691 bool symbols_are_equal = (s0 && s1 && result);
22693 if (symbols_are_equal)
22705 bool decl_bases_different = !l.decl_base::operator==(r);
22712 if (decl_bases_different)
22722 if (!l.decl_base::operator==(r))
22734 if (l.get_binding() != r.get_binding())
22791 return equals(*
this, *o, 0);
22818 if (priv_->id_.
empty())
22823 string virtual_member_suffix;
22833 virtual_member_suffix +=
"/o";
22836 if (s->has_aliases())
22843 priv_->id_ = env.
intern(s->get_id_string());
22845 if (!virtual_member_suffix.empty())
22846 priv_->id_ = env.
intern(priv_->id_ + virtual_member_suffix);
22890 if (v.visit_begin(
this))
22893 if (type_base_sptr t =
get_type())
22897 return v.visit_end(
this);
22919 if (l.get() == r.get())
22942struct function_decl::parameter::priv
22946 bool variadic_marker_;
22953 priv(type_base_sptr type,
22955 bool variadic_marker)
22958 variadic_marker_(variadic_marker)
22962function_decl::parameter::parameter(
const type_base_sptr type,
22964 const string& name,
22965 const location& loc,
22967 : type_or_decl_base(type->get_environment(),
22968 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
22969 decl_base(type->get_environment(), name, loc),
22970 priv_(new priv(type, index, is_variadic))
22972 runtime_type_instance(
this);
22975function_decl::parameter::parameter(
const type_base_sptr type,
22977 const string& name,
22978 const location& loc,
22980 bool is_artificial)
22981 : type_or_decl_base(type->get_environment(),
22982 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
22983 decl_base(type->get_environment(), name, loc),
22984 priv_(new priv(type, index, is_variadic))
22986 runtime_type_instance(
this);
22987 set_is_artificial(is_artificial);
22990function_decl::parameter::parameter(
const type_base_sptr type,
22991 const string& name,
22992 const location& loc,
22994 bool is_artificial)
22995 : type_or_decl_base(type->get_environment(),
22996 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
22997 decl_base(type->get_environment(), name, loc),
22998 priv_(new priv(type, 0, is_variadic))
23000 runtime_type_instance(
this);
23001 set_is_artificial(is_artificial);
23004function_decl::parameter::parameter(
const type_base_sptr type,
23007 : type_or_decl_base(type->get_environment(),
23008 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
23009 decl_base(type->get_environment(),
"", location()),
23010 priv_(new priv(type, index, variad))
23012 runtime_type_instance(
this);
23015function_decl::parameter::~parameter() =
default;
23017const type_base_sptr
23018function_decl::parameter::get_type()
const
23019{
return priv_->type_.lock();}
23046 if (get_variadic_marker()
23066 std::ostringstream o;
23067 o <<
"parameter-" << get_index();
23069 return env.
intern(o.str());
23073function_decl::parameter::get_index()
const
23074{
return priv_->index_;}
23077function_decl::parameter::set_index(
unsigned i)
23078{priv_->index_ = i;}
23082function_decl::parameter::get_variadic_marker()
const
23083{
return priv_->variadic_marker_;}
23109 bool result =
true;
23111 if ((l.get_variadic_marker() != r.get_variadic_marker())
23112 || (l.get_index() != r.get_index())
23113 || (!!l.get_type() != !!r.get_type()))
23118 if (l.get_index() != r.get_index())
23120 if (l.get_variadic_marker() != r.get_variadic_marker()
23121 || !!l.get_type() != !!r.get_type())
23128 type_base_sptr l_type = l.get_type();
23129 type_base_sptr r_type = r.get_type();
23131 if (l_type != r_type)
23149function_decl::parameter::operator==(
const parameter& o)
const
23150{
return equals(*
this, o, 0);}
23159 return function_decl::parameter::operator==(*p);
23205 if (v.visit_begin(
this))
23208 if (type_base_sptr t =
get_type())
23212 return v.visit_end(
this);
23245 bool qualified_name)
const
23252 type_repr =
"void";
23258 string result = type_repr;
23259 string parm_name = get_name_id();
23261 if (!parm_name.empty())
23262 result +=
" " + parm_name;
23296 size_t size_in_bits,
size_t align_in_bits,
23303 | ABSTRACT_DECL_BASE
23304 | ABSTRACT_SCOPE_TYPE_DECL
23305 | ABSTRACT_SCOPE_DECL),
23306 decl_base(env, name, locus, name, vis),
23307 type_base(env, size_in_bits, align_in_bits),
23311 for (member_types::iterator i = mem_types.begin();
23312 i != mem_types.end();
23323 for (member_functions::iterator i = member_fns.begin();
23324 i != member_fns.end();
23326 if (!
has_scope(static_pointer_cast<decl_base>(*i)))
23346 size_t size_in_bits,
size_t align_in_bits,
23350 | ABSTRACT_DECL_BASE
23351 | ABSTRACT_SCOPE_TYPE_DECL
23352 | ABSTRACT_SCOPE_DECL),
23353 decl_base(env, name, locus, name, vis),
23354 type_base(env, size_in_bits, align_in_bits),
23368 bool is_declaration_only)
23371 | ABSTRACT_DECL_BASE
23372 | ABSTRACT_SCOPE_TYPE_DECL
23373 | ABSTRACT_SCOPE_DECL),
23393 hash_t h = do_hash(
this);
23414 if (v.visit_begin(
this))
23423 if (!(*i)->traverse(v))
23433 if (!(*i)->traverse(v))
23443 if (!(*i)->traverse(v))
23450 for (member_function_templates::const_iterator i =
23454 if (!(*i)->traverse(v))
23461 for (member_class_templates::const_iterator i =
23465 if (!(*i)->traverse(v))
23473 bool result = v.visit_end(
this);
23502 type_base_sptr t =
is_type(decl);
23532 for (class_or_union::data_members::const_iterator it =
23621 if (t->get_is_anonymous())
23639 if (t->get_is_anonymous())
23657 if (t->get_is_anonymous())
23682 bool is_laid_out,
bool is_static,
23683 size_t offset_in_bits)
23687 priv_->data_members_.push_back(v);
23696 bool is_already_in =
false;
23699 for (
const auto& s_dm: priv_->static_data_members_)
23703 is_already_in =
true;
23707 if (!is_already_in)
23708 priv_->static_data_members_.push_back(v);
23714 for (data_members::const_iterator i =
23715 priv_->non_static_data_members_.begin();
23716 i != priv_->non_static_data_members_.end();
23720 is_already_in =
true;
23723 if (!is_already_in)
23724 priv_->non_static_data_members_.push_back(v);
23740{
return priv_->data_members_;}
23755 if ((*i)->get_name() == name)
23767 if (
var_decl_sptr data_member = type->find_data_member(name))
23768 return data_member;
23782 if (!v->get_name().empty())
23790 if ((*it)->get_pretty_representation(
false,
true)
23791 == v->get_pretty_representation(
false,
true))
23818 if (v->get_name().empty())
23831{
return priv_->non_static_data_members_;}
23839{
return priv_->static_data_members_;}
23857 bool is_static,
bool is_ctor,
23858 bool is_dtor,
bool is_const)
23870 priv_->member_functions_.push_back(f);
23874 if (!f->get_linkage_name().empty())
23875 priv_->mem_fns_map_[f->get_linkage_name()] = f;
23884{
return priv_->member_functions_;}
23905 string_mem_fn_sptr_map_type::const_iterator i =
23906 priv_->mem_fns_map_.find(linkage_name);
23907 if (i == priv_->mem_fns_map_.end())
23909 return i->second.get();
23920 string_mem_fn_sptr_map_type::const_iterator i =
23921 priv_->mem_fns_map_.find(linkage_name);
23922 if (i == priv_->mem_fns_map_.end())
23948 string_mem_fn_ptr_map_type::const_iterator i =
23949 priv_->signature_2_mem_fn_map_.find(s);
23950 if (i == priv_->signature_2_mem_fn_map_.end())
23958const member_function_templates&
23960{
return priv_->member_function_templates_;}
23965const member_class_templates&
23967{
return priv_->member_class_templates_;}
23975 decl_base* c = m->as_function_tdecl()->get_scope();
23978 priv_->member_function_templates_.push_back(m);
23989 decl_base* c = m->as_class_tdecl()->get_scope();
23992 m->set_scope(
this);
23993 priv_->member_class_templates_.push_back(m);
24003 && priv_->data_members_.empty()
24004 && priv_->member_functions_.empty()
24005 && priv_->member_function_templates_.empty()
24006 && priv_->member_class_templates_.empty());
24025 else if (method_decl_sptr f = dynamic_pointer_cast<method_decl>(d))
24031 else if (member_function_template_sptr f =
24032 dynamic_pointer_cast<member_function_template>(d))
24034 else if (member_class_template_sptr c =
24035 dynamic_pointer_cast<member_class_template>(d))
24084 return *
this == *o;
24125 if (l_is_decl_only || r_is_decl_only)
24135 if (!def1 || !def2)
24139 && l_is_decl_only && r_is_decl_only
24178 if (!!def1 != !!def2)
24186 if (!(l.decl_base::operator==(r)
24187 && l.type_base::operator==(r)))
24198 bool val = *def1 == *def2;
24207 if (!(l.decl_base::operator==(r) && l.type_base::operator==(r)))
24214 if (types_defined_same_linux_kernel_corpus_public(l, r))
24222#define RETURN(value) \
24223 return return_comparison_result(l, r, value);
24229 bool result =
true;
24243 for (class_or_union::data_members::const_iterator
24257 || (*d0)->get_type() == (*d1)->get_type())
24284 for (member_function_templates::const_iterator
24289 ++fn_tmpl_it0, ++fn_tmpl_it1)
24290 if (**fn_tmpl_it0 != **fn_tmpl_it1)
24315 for (member_class_templates::const_iterator
24320 ++cl_tmpl_it0, ++cl_tmpl_it1)
24321 if (**cl_tmpl_it0 != **cl_tmpl_it1)
24349 const method_decl_sptr& method)
24371 old_type->get_parameters(),
24372 old_type->get_is_const(),
24373 old_type->get_size_in_bits(),
24374 old_type->get_alignment_in_bits()));
24375 t->get_translation_unit()->bind_function_type_life_time(new_type);
24384 method->get_binding()));
24385 new_method->set_symbol(method->
get_symbol());
24388 class_type->add_member_function(new_method,
24397 t->add_member_function(new_method,
24414struct class_decl::priv
24417 unordered_map<string, base_spec_sptr> bases_map_;
24418 member_functions virtual_mem_fns_;
24419 virtual_mem_fn_map_type virtual_mem_fns_map_;
24423 : is_struct_(false)
24464 size_t size_in_bits,
size_t align_in_bits,
24465 bool is_struct,
const location& locus,
24472 | ABSTRACT_TYPE_BASE
24473 | ABSTRACT_DECL_BASE
24474 | ABSTRACT_SCOPE_TYPE_DECL
24475 | ABSTRACT_SCOPE_DECL),
24476 decl_base(env, name, locus, name, vis),
24477 type_base(env, size_in_bits, align_in_bits),
24479 locus, vis, mbr_types, data_mbrs, mbr_fns),
24480 priv_(new priv(is_struct, bases))
24515 size_t size_in_bits,
size_t align_in_bits,
24516 bool is_struct,
const location& locus,
24522 | ABSTRACT_TYPE_BASE
24523 | ABSTRACT_DECL_BASE
24524 | ABSTRACT_SCOPE_TYPE_DECL
24525 | ABSTRACT_SCOPE_DECL),
24534 is_anonymous ? string() : name,
24536 type_base(env, size_in_bits, align_in_bits),
24538 locus, vis, mbr_types, data_mbrs, mbr_fns),
24539 priv_(new priv(is_struct, bases))
24561 size_t size_in_bits,
size_t align_in_bits,
24562 bool is_struct,
const location& locus,
24566 | ABSTRACT_TYPE_BASE
24567 | ABSTRACT_DECL_BASE
24568 | ABSTRACT_SCOPE_TYPE_DECL
24569 | ABSTRACT_SCOPE_DECL),
24570 decl_base(env, name, locus, name, vis),
24571 type_base(env, size_in_bits, align_in_bits),
24574 priv_(new priv(is_struct))
24598 size_t size_in_bits,
size_t align_in_bits,
24599 bool is_struct,
const location& locus,
24603 | ABSTRACT_TYPE_BASE
24604 | ABSTRACT_DECL_BASE
24605 | ABSTRACT_SCOPE_TYPE_DECL
24606 | ABSTRACT_SCOPE_DECL),
24615 is_anonymous ? string() : name,
24617 type_base(env, size_in_bits, align_in_bits),
24620 priv_(new priv(is_struct))
24636 bool is_struct,
bool is_declaration_only)
24639 | ABSTRACT_TYPE_BASE
24640 | ABSTRACT_DECL_BASE
24641 | ABSTRACT_SCOPE_TYPE_DECL
24642 | ABSTRACT_SCOPE_DECL),
24646 priv_(new priv(is_struct))
24661 for (class_decl::virtual_mem_fn_map_type::iterator i =
24662 priv_->virtual_mem_fns_map_.begin();
24663 i != priv_->virtual_mem_fns_map_.end();
24665 sort_virtual_member_functions(i->second);
24673{priv_->is_struct_ = f;}
24680{
return priv_->is_struct_;}
24688 priv_->bases_.push_back(b);
24689 priv_->bases_map_[b->get_base_class()->get_qualified_name()] = b;
24697{
return priv_->bases_;}
24708 unordered_map<string, base_spec_sptr>::iterator i =
24709 priv_->bases_map_.find(qualified_name);
24711 if (i != priv_->bases_map_.end())
24712 return i->second->get_base_class();
24723{
return priv_->virtual_mem_fns_;}
24742{
return priv_->virtual_mem_fns_map_;}
24747{sort_virtual_member_functions(priv_->virtual_mem_fns_);}
24768 bool qualified_name)
const
24770 string cl =
"class ";
24779 if (internal && !
get_name().empty())
24787 string result = cl;
24788 if (qualified_name)
24797class_decl::insert_member_decl(decl_base_sptr d)
24799 if (method_decl_sptr f = dynamic_pointer_cast<method_decl>(d))
24814struct class_decl::base_spec::priv
24817 long offset_in_bits_;
24821 long offset_in_bits,
24824 offset_in_bits_(offset_in_bits),
24825 is_virtual_(is_virtual)
24843 long offset_in_bits,
24846 ABSTRACT_DECL_BASE),
24848 base->get_linkage_name(), base->get_visibility()),
24850 priv_(new priv(base, offset_in_bits, is_virtual))
24876{
return priv_->base_class_.lock();}
24883{
return priv_->is_virtual_;}
24890{
return priv_->offset_in_bits_;}
24910 if (v.visit_begin(
this))
24913 get_base_class()->traverse(v);
24917 return v.visit_end(
this);
24937class_decl::base_spec::base_spec(
const type_base_sptr& base,
24939 long offset_in_bits,
24942 ABSTRACT_DECL_BASE),
24948 priv_(new priv(dynamic_pointer_cast<
class_decl>(base),
24955class_decl::base_spec::~base_spec() =
default;
24981 if (!l.member_base::operator==(r))
25007 return equals(*
this, *o, 0);
25028mem_fn_context_rel::~mem_fn_context_rel()
25048method_decl::method_decl(
const string& name,
25050 bool declared_inline,
25052 const string& linkage_name,
25057 | ABSTRACT_DECL_BASE
25061 declared_inline, locus, linkage_name, vis, bind)
25085method_decl::method_decl(
const string& name,
25087 bool declared_inline,
25089 const string& linkage_name,
25094 | ABSTRACT_DECL_BASE
25096 decl_base(type->get_environment(), name, locus, linkage_name, vis),
25099 declared_inline, locus, linkage_name, vis, bind)
25122method_decl::method_decl(
const string& name,
25123 type_base_sptr type,
25124 bool declared_inline,
25126 const string& linkage_name,
25131 | ABSTRACT_DECL_BASE
25133 decl_base(type->get_environment(), name, locus, linkage_name, vis),
25136 declared_inline, locus, linkage_name, vis, bind)
25155 class_or_union_sptr cl = t->get_class_type();
25157 cl->priv_->mem_fns_map_[l] = m;
25158 if (!old_lname.empty() && l != old_lname)
25160 if (method_decl_sptr m = cl->find_member_function_sptr(old_lname))
25163 cl->priv_->mem_fns_map_.erase(old_lname);
25169method_decl::~method_decl()
25206 if (l.get() == r.get())
25259{
return dynamic_pointer_cast<method_decl>(d);}
25263struct virtual_member_function_less_than
25287 if (f_offset != s_offset)
return f_offset < s_offset;
25293 if (fn != sn)
return fn < sn;
25299 if ((!f_sym) != (!s_sym))
return !f_sym;
25300 if (f_sym && s_sym)
25302 fn = f_sym->get_id_string();
25303 sn = s_sym->get_id_string();
25304 if (fn != sn)
return fn < sn;
25311 if (fn != sn)
return fn < sn;
25315 string fn_filepath, sn_filepath;
25316 unsigned line = 0, column = 0;
25319 fn_loc.
expand(fn_filepath, line, column);
25321 sn_loc.expand(sn_filepath, line, column);
25322 return fn_filepath < sn_filepath;
25337 operator()(
const method_decl_sptr f,
25338 const method_decl_sptr s)
25339 {
return operator()(*f, *s);}
25348 virtual_member_function_less_than lt;
25349 std::stable_sort(mem_fns.begin(), mem_fns.end(), lt);
25378 size_t vtable_offset,
25379 bool is_static,
bool is_ctor,
25380 bool is_dtor,
bool is_const)
25383 is_dtor, is_const);
25390 sort_virtual_member_functions(klass->priv_->virtual_mem_fns_);
25409 class_decl::member_functions::const_iterator m;
25410 for (m = klass->priv_->virtual_mem_fns_.begin();
25411 m != klass->priv_->virtual_mem_fns_.end();
25413 if (m->get() == method.get()
25414 || (*m)->get_linkage_name() == method->get_linkage_name())
25416 if (m == klass->priv_->virtual_mem_fns_.end())
25417 klass->priv_->virtual_mem_fns_.push_back(method);
25425 class_decl::virtual_mem_fn_map_type::iterator i =
25426 klass->priv_->virtual_mem_fns_map_.find(voffset);
25427 if (i == klass->priv_->virtual_mem_fns_map_.end())
25430 virtual_mem_fns_at_voffset.push_back(method);
25431 klass->priv_->virtual_mem_fns_map_[voffset] = virtual_mem_fns_at_voffset;
25435 for (m = i->second.begin() ; m != i->second.end(); ++m)
25436 if (m->get() == method.get()
25437 || (*m)->get_linkage_name() == method->get_linkage_name())
25439 if (m == i->second.end())
25440 i->second.push_back(method);
25469 if ((*b)->get_is_virtual()
25470 || (*b)->get_base_class()->has_virtual_bases())
25499 ssize_t offset = -1;
25500 for (class_decl::virtual_mem_fn_map_type::const_iterator e =
25504 if (e->first > offset)
25534methods_equal_modulo_elf_symbol(
const method_decl_sptr& f,
25535 const method_decl_sptr& s)
25537 method_decl_sptr first = f, second = s;
25539 first->get_symbol();
25541 second->get_symbol();
25543 first->get_linkage_name();
25545 second->get_linkage_name();
25548 first->set_linkage_name(
"");
25550 second->set_linkage_name(
"");
25552 bool equal = *first == *second;
25554 first->set_symbol(saved_first_elf_symbol);
25555 first->set_linkage_name(saved_first_linkage_name);
25556 second->set_symbol(saved_second_elf_symbol);
25557 second->set_linkage_name(saved_second_linkage_name);
25578method_matches_at_least_one_in_vector(
const method_decl_sptr& method,
25581 for (class_decl::member_functions::const_iterator i = fns.begin();
25590 if (methods_equal_modulo_elf_symbol(method, *i))
25623 bool result =
false;
25624 if (l.
get_environment().priv_->is_type_comparison_cached(l, r, result))
25635 bool result =
true;
25649#define RETURN(value) CACHE_AND_RETURN_COMPARISON_RESULT(value)
25661 for (class_decl::base_specs::const_iterator
25673 (*b1)->get_base_class().get()))
25719 for (class_decl::virtual_mem_fn_map_type::const_iterator first_v_fn_entry =
25722 ++first_v_fn_entry)
25724 unsigned voffset = first_v_fn_entry->first;
25726 first_v_fn_entry->second;
25728 const class_decl::virtual_mem_fn_map_type::const_iterator
25740 second_v_fn_entry->second;
25742 bool matches =
false;
25743 for (class_decl::member_functions::const_iterator i =
25744 first_vfns.begin();
25745 i != first_vfns.end();
25747 if (method_matches_at_least_one_in_vector(*i, second_vfns))
25841 return *
this == *o;
25885 if (l.get() == r.get())
25917operator==(
const class_or_union_sptr& l,
const class_or_union_sptr& r)
25919 if (l.get() == r.get())
25936operator!=(
const class_or_union_sptr& l,
const class_or_union_sptr& r)
25956 if (v.visit_begin(
this))
25965 if (!(*i)->traverse(v))
25976 if (!(*i)->traverse(v))
25986 if (!(*i)->traverse(v))
25996 if (!(*i)->traverse(v))
26003 for (member_function_templates::const_iterator i =
26007 if (!(*i)->traverse(v))
26014 for (member_class_templates::const_iterator i =
26018 if (!(*i)->traverse(v))
26026 bool result = v.visit_end(
this);
26035context_rel::~context_rel()
26039member_base::operator==(
const member_base& o)
const
26059 if (l.get() == r.get())
26064 return *l ==
static_cast<const decl_base&
>(*r);
26103{
return dynamic_pointer_cast<class_decl::base_spec>(tod);}
26106member_function_template::operator==(
const member_base& other)
const
26113 if (!(is_constructor() == o.is_constructor()
26114 && is_const() == o.is_const()
26115 && member_base::operator==(o)))
26122 return ftdecl->function_tdecl::operator==(*other_ftdecl);
26141 const member_function_template_sptr& r)
26143 if (l.get() == r.get())
26162 const member_function_template_sptr& r)
26179 if (v.visit_begin(
this))
26186 return v.visit_end(
this);
26202 if (!member_base::operator==(o))
26205 return as_class_tdecl()->class_tdecl::operator==(o);
26219 if (!decl_base::operator==(other))
26221 return as_class_tdecl()->class_tdecl::operator==(other);
26235 return *
this == *o;
26248 const member_class_template_sptr& r)
26250 if (l.get() == r.get())
26268 const member_class_template_sptr& r)
26285 if (v.visit_begin(
this))
26292 return v.visit_end(
this);
26312 case private_access:
26315 case protected_access:
26318 case public_access:
26342 c->set_is_static(s);
26352 for (
const auto& dm : cl->get_data_members())
26353 if (dm->get_name() == v->get_name())
26364 for (class_decl::data_members::iterator i =
26365 cl->priv_->non_static_data_members_.begin();
26366 i != cl->priv_->non_static_data_members_.end();
26369 if ((*i)->get_name() == v->get_name())
26371 cl->priv_->non_static_data_members_.erase(i);
26378 bool already_in_static_dms =
false;
26379 for (
const auto& s_dm : cl->priv_->static_data_members_)
26380 if (s_dm->get_name() == v->get_name())
26382 already_in_static_dms =
true;
26385 if (!already_in_static_dms)
26386 cl->priv_->static_data_members_.push_back(var);
26391 for (class_or_union::data_members::iterator i =
26392 cl->priv_->static_data_members_.begin();
26393 i != cl->priv_->static_data_members_.end();
26395 if ((*i)->get_name() == v->get_name())
26397 cl->priv_->static_data_members_.erase(i);
26403 bool is_already_in_non_static_data_members =
false;
26404 for (
const auto& ns_dm : cl->priv_->non_static_data_members_)
26405 if (ns_dm->get_name() == v->get_name())
26407 is_already_in_non_static_data_members =
true;
26410 if (!is_already_in_non_static_data_members)
26411 cl->priv_->non_static_data_members_.push_back(var);
26451 size_t size_in_bits,
const location& locus,
26456 | ABSTRACT_TYPE_BASE
26457 | ABSTRACT_DECL_BASE),
26458 decl_base(env, name, locus, name, vis),
26461 locus, vis, mbr_types, data_mbrs, member_fns)
26487 size_t size_in_bits,
const location& locus,
26493 | ABSTRACT_TYPE_BASE
26494 | ABSTRACT_DECL_BASE),
26503 is_anonymous ? string() : name,
26507 locus, vis, mbr_types, data_mbrs, member_fns)
26525 size_t size_in_bits,
const location& locus,
26529 | ABSTRACT_TYPE_BASE
26530 | ABSTRACT_DECL_BASE
26531 | ABSTRACT_SCOPE_TYPE_DECL
26532 | ABSTRACT_SCOPE_DECL),
26533 decl_base(env, name, locus, name, vis),
26556 size_t size_in_bits,
const location& locus,
26560 | ABSTRACT_TYPE_BASE
26561 | ABSTRACT_DECL_BASE
26562 | ABSTRACT_SCOPE_TYPE_DECL
26563 | ABSTRACT_SCOPE_DECL),
26572 is_anonymous ? string() : name,
26591 const string& name,
26592 bool is_declaration_only)
26595 | ABSTRACT_TYPE_BASE
26596 | ABSTRACT_DECL_BASE
26597 | ABSTRACT_SCOPE_TYPE_DECL
26598 | ABSTRACT_SCOPE_DECL),
26639 bool qualified_name)
const
26644 if (internal && !
get_name().empty())
26645 repr = string(
"union ") +
26655 if (qualified_name)
26692 return *
this == *o;
26706 return *
this == *o;
26739 if (v.visit_begin(
this))
26748 if (!(*i)->traverse(v))
26758 if (!(*i)->traverse(v))
26768 if (!(*i)->traverse(v))
26775 for (member_function_templates::const_iterator i =
26779 if (!(*i)->traverse(v))
26786 for (member_class_templates::const_iterator i =
26790 if (!(*i)->traverse(v))
26798 bool result = v.visit_end(
this);
26837 bool result =
false;
26838 if (l.
get_environment().priv_->is_type_comparison_cached(l, r, result))
26859 const method_decl_sptr& f)
26874 const class_or_union_sptr t = union_type;
26889 if (l.get() == r.get())
26913class template_decl::priv
26917 std::list<template_parameter_sptr> parms_;
26930{priv_->parms_.push_back(p);}
26936const std::list<template_parameter_sptr>&
26938{
return priv_->parms_;}
26951 const string& name,
26976 return *
this == *other;
26989 list<shared_ptr<template_parameter> >::const_iterator t0, t1;
27015class template_parameter::priv
27021 mutable bool hashing_started_;
27022 mutable bool comparison_started_;
27030 template_decl_(enclosing_template_decl),
27031 hashing_started_(),
27032 comparison_started_()
27036template_parameter::template_parameter(
unsigned index,
27038 : priv_(new priv(index, enclosing_template))
27042template_parameter::get_index()
const
27043{
return priv_->index_;}
27046template_parameter::get_enclosing_template_decl()
const
27047{
return priv_->template_decl_.lock();}
27051template_parameter::operator==(
const template_parameter& o)
const
27053 if (get_index() != o.get_index())
27056 if (priv_->comparison_started_)
27059 bool result =
false;
27064 priv_->comparison_started_ =
true;
27066 if (!!get_enclosing_template_decl() != !!o.get_enclosing_template_decl())
27068 else if (get_enclosing_template_decl()
27069 && (*get_enclosing_template_decl()
27070 != *o.get_enclosing_template_decl()))
27075 priv_->comparison_started_ =
false;
27088{
return !operator==(other);}
27095class type_tparameter::priv
27110type_tparameter::type_tparameter(
unsigned index,
27112 const string& name,
27116 | ABSTRACT_TYPE_BASE
27118 decl_base(enclosing_tdecl->get_environment(), name, locus),
27119 type_base(enclosing_tdecl->get_environment(), 0, 0),
27120 type_decl(enclosing_tdecl->get_environment(), name, 0, 0, locus),
27135 if (!type_decl::operator==(other))
27141 return template_parameter::operator==(o);
27155 if (!type_decl::operator==(other))
27161 return template_parameter::operator==(o);
27175 if (!decl_base::operator==(other))
27181 return template_parameter::operator==(o);
27211{
return *
this ==
static_cast<const type_base&
>(other);}
27213type_tparameter::~type_tparameter()
27217class non_type_tparameter::priv
27227 priv(type_base_sptr type)
27245non_type_tparameter::non_type_tparameter(
unsigned index,
27247 const string& name,
27248 type_base_sptr type,
27251 decl_base(type->get_environment(), name, locus,
""),
27253 priv_(new priv(type))
27261const type_base_sptr
27263{
return priv_->type_.lock();}
27269 if (!decl_base::operator==(other))
27276 return (template_parameter::operator==(o)
27295non_type_tparameter::~non_type_tparameter()
27301class template_tparameter::priv
27315template_tparameter::template_tparameter(
unsigned index,
27317 const string& name,
27321 | ABSTRACT_TYPE_BASE
27323 decl_base(enclosing_tdecl->get_environment(), name, locus),
27324 type_base(enclosing_tdecl->get_environment(), 0, 0),
27325 type_decl(enclosing_tdecl->get_environment(), name,
27326 0, 0, locus, name, VISIBILITY_DEFAULT),
27328 template_decl(enclosing_tdecl->get_environment(), name, locus),
27346 return (type_tparameter::operator==(o)
27347 && template_decl::operator==(o));
27365 return (type_tparameter::operator==(o)
27366 && template_decl::operator==(o));
27379 return *
this ==
static_cast<const type_base&
>(other);
27398template_tparameter::~template_tparameter()
27406class type_composition::priv
27430type_composition::type_composition(
unsigned index,
27434 ABSTRACT_DECL_BASE),
27445const type_base_sptr
27447{
return priv_->type_.lock();}
27456type_composition::~type_composition()
27465class function_tdecl::priv
27477 : pattern_(pattern), binding_(bind)
27504 | ABSTRACT_SCOPE_DECL),
27508 priv_(new priv(bind))
27532 | ABSTRACT_SCOPE_DECL),
27537 priv_(new priv(pattern, bind))
27548 priv_->pattern_ = p;
27558{
return priv_->pattern_;}
27565{
return priv_->binding_;}
27577 return *
this == *o;
27591 return *
this == *o;
27604 && template_decl::operator==(o)
27605 && scope_decl::operator==(o)
27629 if (!v.visit_begin(
this))
27636 return v.visit_end(
this);
27639function_tdecl::~function_tdecl()
27647class class_tdecl::priv
27658 : pattern_(pattern)
27677 | ABSTRACT_SCOPE_DECL),
27702 | ABSTRACT_SCOPE_DECL),
27707 priv_(new priv(pattern))
27718 priv_->pattern_ = p;
27728{
return priv_->pattern_;}
27737 if (!(template_decl::operator==(o)
27738 && scope_decl::operator==(o)
27757 return *
this ==
static_cast<const decl_base&
>(o);
27765{
return *
this ==
static_cast<const decl_base&
>(o);}
27781 if (v.visit_begin(
this))
27785 pattern->traverse(v);
27788 return v.visit_end(
this);
27791class_tdecl::~class_tdecl()
27802 non_canonicalized_subtype_detector();
27805 non_canonicalized_subtype_detector(
type_base* type)
27807 has_non_canonical_type_()
27816 has_non_canonical_type()
const
27817 {
return has_non_canonical_type_;}
27822 visit_begin(function_decl* f)
27840 visit_begin(type_base* t)
27844 if (!t->get_canonical_type())
27848 has_non_canonical_type_ = t;
27863 visit_end(type_base* )
27865 if (has_non_canonical_type_)
27882 non_canonicalized_subtype_detector v(t.get());
27884 return v.has_non_canonical_type();
27900 const type_base_sptr t_v2)
27907 return (t1 != t2 && repr1 == repr2);
27918 env.priv_->extra_live_types_.push_back(t);
27953 result =
reinterpret_cast<size_t>(g);
27955 result =
reinterpret_cast<size_t>(s);
27961 string repr = v->get_pretty_representation(
true);
27962 std::hash<string> hash_string;
27970 string repr = f->get_pretty_representation(
true);
27971 std::hash<string> hash_string;
27977 type_base_sptr parm_type = p->get_type();
27979 std::hash<bool> hash_bool;
27980 std::hash<unsigned> hash_unsigned;
27989 std::hash<size_t> hash_size;
27990 std::hash<bool> hash_bool;
27991 type_base_sptr type = bs->get_base_class();
28028{
return hash_as_canonical_type_or_constant(t);}
28055 if (d->type_or_decl_base::priv_->get_hashing_state()
28057 return d->type_or_decl_base::priv_->hash_value_;
28060 return artefact.priv_->hash_value_;
28162 exemplar =
const_cast<type_base*
>(type);
28191hash_as_canonical_type_or_constant(
const type_base *t)
28198 if (!canonical_type)
28216 if (canonical_type)
28217 return reinterpret_cast<size_t>(canonical_type);
28292 const type_base_sptr& second,
28293 bool indirect_type)
28325 bool indirect_type)
28327 if (!!first != !!second)
28339 if (
typeid(*first) !=
typeid(*second))
28355 if (ty1->is_lvalue() != ty2->is_lvalue())
28358 ty2->get_pointed_to_type(),
28377 if (!indirect_type)
28381 return ty1->get_name() == ty2->
get_name();
28387 if (!indirect_type)
28391 return (
get_name(ty1->get_underlying_type())
28399 && ty1->get_name() != ty2->
get_name())
28402 if (!indirect_type)
28405 || (ty1->get_non_static_data_members().size()
28409 for (class_or_union::data_members::const_iterator
28410 i = ty1->get_non_static_data_members().begin(),
28412 (i != ty1->get_non_static_data_members().end()
28419 dm2->get_type().get(),
28432 && ty1->get_name() != ty2->
get_name())
28435 if (!indirect_type)
28445 if (!indirect_type)
28448 || ty1->get_dimension_count() != ty2->get_dimension_count())
28482 if (ty1->get_parameters().size() != ty2->
get_parameters().size())
28485 for (function_type::parameters::const_iterator
28486 i = ty1->get_parameters().begin(),
28488 (i != ty1->get_parameters().end()
28518 const char* dm_name)
28546 return cou->find_data_member(dm);
28561 unsigned parm_index)
28568 if (parms.size() <= parm_index)
28571 return parms[parm_index].get();
28586 std::ostringstream o;
28589 o <<
"unnamed-enum";
28591 o <<
"enum-" << base_name;
28593 o <<
"-underlying-type-" << size;
28613 return data_member;
28633 for (; d != e; ++d)
28654stream_pretty_representation_of_fn_parms(
const function_type& fn_type,
28655 ostream& o,
bool qualified,
28663 type_base_sptr type;
28670 if (i != first_parm)
28673 type = parm->get_type();
28736add_outer_pointer_to_fn_type_expr(
const type_base* p,
28737 const string& input,
28738 bool qualified,
bool internal)
28744 string star_or_ref;
28757 if (!pointed_to_fn)
28760 if (pointed_to_fn->priv_->is_pretty_printing())
28770 pointed_to_fn->priv_->set_is_pretty_printing();
28772 std::ostringstream left, right, inner;
28774 inner <<
"(" << star_or_ref << input <<
")";
28776 type_base_sptr type;
28777 stream_pretty_representation_of_fn_parms(*pointed_to_fn, right,
28778 qualified, internal);
28780 type_base_sptr return_type = pointed_to_fn->get_return_type();
28789 result = left.str() +
" " + inner.str() + right.str();
28793 string inner_string = inner.str() + right.str();
28794 result = add_outer_pointer_to_fn_type_expr(p, inner_string,
28795 qualified, internal);
28799 string inner_string = inner.str() + right.str();
28800 result = add_outer_pointer_to_array_type_expr(p, inner_string,
28801 qualified, internal);
28809 pointed_to_fn->priv_->unset_is_pretty_printing();
28860add_outer_pointer_to_fn_type_expr(
const type_base_sptr& p,
28861 const string& input,
28862 bool qualified,
bool internal)
28863{
return add_outer_pointer_to_fn_type_expr(p.get(), input, qualified, internal);}
28916add_outer_pointer_to_array_type_expr(
const type_base* p,
28917 const string& input,
bool qualified,
28923 string star_or_ref;
28924 type_base_sptr pointed_to_type;
28928 pointed_to_type = ptr->get_pointed_to_type();
28933 pointed_to_type = ref->get_pointed_to_type();
28941 std::ostringstream left, right, inner;
28942 inner <<
"(" << star_or_ref << input <<
")";
28943 right << array->get_subrange_representation();
28946 type_base_sptr array_element_type = array->get_element_type();
28952 left <<
get_type_name(array_element_type, qualified, internal);
28953 result = left.str() + inner.str() + right.str();
28958 string r = inner.str() + right.str();
28959 result = add_outer_pointer_to_fn_type_expr(p, r, qualified, internal);
28964 string inner_string = inner.str() + right.str();
28965 result = add_outer_pointer_to_array_type_expr(p, inner_string,
28966 qualified, internal);
29025add_outer_pointer_to_array_type_expr(
const type_base_sptr& pointer_to_ar,
29026 const string& input,
bool qualified,
29028{
return add_outer_pointer_to_array_type_expr(pointer_to_ar.get(),
29029 input, qualified, internal);}
29077add_outer_ptr_to_mbr_type_expr(
const ptr_to_mbr_type* p,
29078 const string& input,
bool qualified,
29084 std::ostringstream left, right, inner;
29085 type_base_sptr void_type = p->get_environment().get_void_type();
29086 string containing_type_name =
get_type_name(p->get_containing_type(),
29087 qualified, internal);
29088 type_base_sptr mbr_type = p->get_member_type();
29092 inner <<
"(" << containing_type_name <<
"::*" << input <<
")";
29093 stream_pretty_representation_of_fn_parms(*fn_type, right,
29094 qualified, internal);
29097 return_type = void_type;
29104 left <<
get_type_name(return_type, qualified, internal) <<
" ";;
29105 result = left.str() + inner.str() + right.str();
29109 string inner_str = inner.str() + right.str();
29110 result = pointer_declaration_name(p, inner_str, qualified, internal);
29114 string inner_str = inner.str() + right.str();
29115 result = add_outer_ptr_to_mbr_type_expr(p, inner_str,
29116 qualified, internal);
29123 inner <<
"(" << containing_type_name <<
"::*" << input <<
")";
29124 stream_pretty_representation_of_fn_parms(*fn_type, right,
29125 qualified, internal);
29126 string inner_str = inner.str() + right.str();
29127 result = add_outer_ptr_to_mbr_type_expr(ptr_mbr_type, inner_str,
29128 qualified, internal);
29132 left <<
get_type_name(p->get_member_type(), qualified, internal) <<
" ";
29133 inner << containing_type_name <<
"::*" << input;
29134 result = left.str()+ inner.str();
29187 const string& input,
bool qualified,
29189{
return add_outer_ptr_to_mbr_type_expr(p.get(), input, qualified, internal);}
29209add_outer_pointer_to_ptr_to_mbr_type_expr(
const type_base* p,
29210 const string& input,
bool qualified,
29216 string star_or_ref;
29217 type_base_sptr pointed_to_type;
29221 pointed_to_type = ptr->get_pointed_to_type();
29226 pointed_to_type= ref->get_pointed_to_type();
29230 if (!pointed_to_type)
29235 if (!pointed_to_ptr_to_mbr)
29238 std::ostringstream inner;
29239 inner << star_or_ref << input;
29240 string result = add_outer_ptr_to_mbr_type_expr(pointed_to_ptr_to_mbr,
29242 qualified, internal);
29259static interned_string
29260pointer_declaration_name(
const type_base* ptr,
29261 const string& idname,
29262 bool qualified,
bool internal)
29265 return interned_string();
29267 type_base_sptr pointed_to_type;
29268 string star_or_ref;
29271 pointed_to_type = p->get_pointed_to_type();
29276 pointed_to_type = p->get_pointed_to_type();
29280 if (!pointed_to_type)
29281 return interned_string();
29294 if (!idname.empty())
29301 result = add_outer_pointer_to_fn_type_expr(ptr, idname,
29302 qualified, internal);
29304 result = add_outer_pointer_to_array_type_expr(ptr, idname,
29305 qualified, internal);
29307 result = add_outer_pointer_to_ptr_to_mbr_type_expr(ptr, idname,
29308 qualified, internal);
29312 return ptr->get_environment().intern(result);
29329static interned_string
29330pointer_declaration_name(
const type_base_sptr& ptr,
29331 const string& variable_name,
29332 bool qualified,
bool internal)
29333{
return pointer_declaration_name(ptr.get(), variable_name,
29334 qualified, internal);}
29349static interned_string
29350array_declaration_name(
const array_type_def* array,
29351 const string& variable_name,
29352 bool qualified,
bool internal)
29355 return interned_string();
29357 type_base_sptr e_type = array->get_element_type();
29358 string e_type_repr =
29366 std::ostringstream o;
29367 if (!variable_name.empty())
29368 o << variable_name <<
" is ";
29370 << array->get_subrange_representation()
29371 <<
") of " << e_type_repr;
29376 if (is_npaf_type(e_type)
29377 || !(is_pointer_to_function_type(e_type)
29378 || is_pointer_to_array_type(e_type)
29379 || is_pointer_to_ptr_to_mbr_type(e_type)
29380 || is_ptr_to_mbr_type(e_type)))
29382 result = e_type_repr;
29383 if (!variable_name.empty())
29384 result += variable_name;
29385 result += array->get_subrange_representation();
29389 string s = variable_name + array->get_subrange_representation();
29390 result = pointer_declaration_name(p, s, qualified, internal);
29394 string s = variable_name + array->get_subrange_representation();
29395 result = ptr_to_mbr_declaration_name(p, s, qualified, internal);
29400 return array->get_environment().intern(result);
29416static interned_string
29418 const string& variable_name,
29419 bool qualified,
bool internal)
29420{
return array_declaration_name(array.get(), variable_name,
29421 qualified, internal);}
29436static interned_string
29437ptr_to_mbr_declaration_name(
const ptr_to_mbr_type* ptr,
29438 const string& variable_name,
29439 bool qualified,
bool internal)
29442 return interned_string();
29444 string input = variable_name;
29445 string result = add_outer_ptr_to_mbr_type_expr(ptr, input,
29446 qualified, internal);
29447 return ptr->get_environment().intern(result);
29463static interned_string
29465 const string& variable_name,
29466 bool qualified,
bool internal)
29468 return ptr_to_mbr_declaration_name(ptr.get(), variable_name,
29469 qualified, internal);
29488struct ir_node_visitor::priv
29491 bool allow_visiting_already_visited_type_node;
29494 : allow_visiting_already_visited_type_node(true)
29503ir_node_visitor::~ir_node_visitor() =
default;
29512{priv_->allow_visiting_already_visited_type_node = f;}
29521{
return priv_->allow_visiting_already_visited_type_node;}
29542 canonical_type = p;
29546 size_t canonical_ptr_value =
reinterpret_cast<size_t>(canonical_type);
29547 priv_->visited_ir_nodes.insert(canonical_ptr_value);
29560{priv_->visited_ir_nodes.clear();}
29581 canonical_type = p;
29585 size_t ptr_value =
reinterpret_cast<size_t>(canonical_type);
29586 pointer_set::iterator it = priv_->visited_ir_nodes.find(ptr_value);
29587 if (it == priv_->visited_ir_nodes.end())
29594ir_node_visitor::visit_begin(
decl_base*)
29602ir_node_visitor::visit_begin(scope_decl*)
29606ir_node_visitor::visit_end(scope_decl*)
29610ir_node_visitor::visit_begin(type_base*)
29614ir_node_visitor::visit_end(type_base*)
29618ir_node_visitor::visit_begin(scope_type_decl* t)
29619{
return visit_begin(
static_cast<type_base*
>(t));}
29622ir_node_visitor::visit_end(scope_type_decl* t)
29623{
return visit_end(
static_cast<type_base*
>(t));}
29626ir_node_visitor::visit_begin(type_decl* t)
29627{
return visit_begin(
static_cast<type_base*
>(t));}
29630ir_node_visitor::visit_end(type_decl* t)
29631{
return visit_end(
static_cast<type_base*
>(t));}
29634ir_node_visitor::visit_begin(namespace_decl* d)
29635{
return visit_begin(
static_cast<decl_base*
>(d));}
29638ir_node_visitor::visit_end(namespace_decl* d)
29639{
return visit_end(
static_cast<decl_base*
>(d));}
29642ir_node_visitor::visit_begin(qualified_type_def* t)
29643{
return visit_begin(
static_cast<type_base*
>(t));}
29646ir_node_visitor::visit_end(qualified_type_def* t)
29647{
return visit_end(
static_cast<type_base*
>(t));}
29650ir_node_visitor::visit_begin(pointer_type_def* t)
29651{
return visit_begin(
static_cast<type_base*
>(t));}
29654ir_node_visitor::visit_end(pointer_type_def* t)
29655{
return visit_end(
static_cast<type_base*
>(t));}
29658ir_node_visitor::visit_begin(reference_type_def* t)
29659{
return visit_begin(
static_cast<type_base*
>(t));}
29662ir_node_visitor::visit_end(reference_type_def* t)
29663{
return visit_end(
static_cast<type_base*
>(t));}
29666ir_node_visitor::visit_begin(ptr_to_mbr_type* t)
29667{
return visit_begin(
static_cast<type_base*
>(t));}
29670ir_node_visitor::visit_end(ptr_to_mbr_type* t)
29671{
return visit_end(
static_cast<type_base*
>(t));}
29674ir_node_visitor::visit_begin(array_type_def* t)
29675{
return visit_begin(
static_cast<type_base*
>(t));}
29678ir_node_visitor::visit_end(array_type_def* t)
29679{
return visit_end(
static_cast<type_base*
>(t));}
29682ir_node_visitor::visit_begin(array_type_def::subrange_type* t)
29683{
return visit_begin(
static_cast<type_base*
>(t));}
29686ir_node_visitor::visit_end(array_type_def::subrange_type* t)
29687{
return visit_end(
static_cast<type_base*
>(t));}
29690ir_node_visitor::visit_begin(enum_type_decl* t)
29691{
return visit_begin(
static_cast<type_base*
>(t));}
29694ir_node_visitor::visit_end(enum_type_decl* t)
29695{
return visit_end(
static_cast<type_base*
>(t));}
29698ir_node_visitor::visit_begin(typedef_decl* t)
29699{
return visit_begin(
static_cast<type_base*
>(t));}
29702ir_node_visitor::visit_end(typedef_decl* t)
29703{
return visit_end(
static_cast<type_base*
>(t));}
29706ir_node_visitor::visit_begin(function_type* t)
29707{
return visit_begin(
static_cast<type_base*
>(t));}
29710ir_node_visitor::visit_end(function_type* t)
29711{
return visit_end(
static_cast<type_base*
>(t));}
29714ir_node_visitor::visit_begin(var_decl* d)
29715{
return visit_begin(
static_cast<decl_base*
>(d));}
29718ir_node_visitor::visit_end(var_decl* d)
29719{
return visit_end(
static_cast<decl_base*
>(d));}
29722ir_node_visitor::visit_begin(function_decl* d)
29723{
return visit_begin(
static_cast<decl_base*
>(d));}
29726ir_node_visitor::visit_end(function_decl* d)
29727{
return visit_end(
static_cast<decl_base*
>(d));}
29730ir_node_visitor::visit_begin(function_decl::parameter* d)
29731{
return visit_begin(
static_cast<decl_base*
>(d));}
29734ir_node_visitor::visit_end(function_decl::parameter* d)
29735{
return visit_end(
static_cast<decl_base*
>(d));}
29738ir_node_visitor::visit_begin(function_tdecl* d)
29739{
return visit_begin(
static_cast<decl_base*
>(d));}
29742ir_node_visitor::visit_end(function_tdecl* d)
29743{
return visit_end(
static_cast<decl_base*
>(d));}
29746ir_node_visitor::visit_begin(class_tdecl* d)
29747{
return visit_begin(
static_cast<decl_base*
>(d));}
29750ir_node_visitor::visit_end(class_tdecl* d)
29751{
return visit_end(
static_cast<decl_base*
>(d));}
29754ir_node_visitor::visit_begin(class_or_union* t)
29755{
return visit_begin(
static_cast<type_base*
>(t));}
29758ir_node_visitor::visit_end(class_or_union* t)
29759{
return visit_end(
static_cast<type_base*
>(t));}
29762ir_node_visitor::visit_begin(class_decl* t)
29763{
return visit_begin(
static_cast<type_base*
>(t));}
29766ir_node_visitor::visit_end(class_decl* t)
29767{
return visit_end(
static_cast<type_base*
>(t));}
29770ir_node_visitor::visit_begin(union_decl* t)
29771{
return visit_begin(
static_cast<type_base*
>(t));}
29774ir_node_visitor::visit_end(union_decl* t)
29775{
return visit_end(
static_cast<type_base*
>(t));}
29778ir_node_visitor::visit_begin(class_decl::base_spec* d)
29779{
return visit_begin(
static_cast<decl_base*
>(d));}
29782ir_node_visitor::visit_end(class_decl::base_spec* d)
29783{
return visit_end(
static_cast<decl_base*
>(d));}
29786ir_node_visitor::visit_begin(member_function_template* d)
29787{
return visit_begin(
static_cast<decl_base*
>(d));}
29790ir_node_visitor::visit_end(member_function_template* d)
29791{
return visit_end(
static_cast<decl_base*
>(d));}
29794ir_node_visitor::visit_begin(member_class_template* d)
29795{
return visit_begin(
static_cast<decl_base*
>(d));}
29798ir_node_visitor::visit_end(member_class_template* d)
29799{
return visit_end(
static_cast<decl_base*
>(d));}
29811 static __thread
size_t counter;
29813 std::ostringstream o;
29819struct function_decl_hash
29821 size_t operator()(
const function_decl* f)
const
29822 {
return reinterpret_cast<size_t>(f);}
29825 {
return operator()(f.get());}
29830typedef unordered_map<
const function_decl*, string,
29831 function_decl_hash,
29850static const string&
29854 fns_to_str_map_type::const_iterator i = m.find(fn);
29857 string s = get_next_string();
29878fns_to_str(vector<function_decl*>::const_iterator begin,
29879 vector<function_decl*>::const_iterator end,
29883 vector<function_decl*>::const_iterator i;
29884 for (i = begin; i != end; ++i)
29885 o <<
"'" << fn_to_str(*i, m) <<
"' ";
29911fns_to_str(vector<function_decl*>::const_iterator a_begin,
29912 vector<function_decl*>::const_iterator a_end,
29913 vector<function_decl*>::const_iterator b_begin,
29914 vector<function_decl*>::const_iterator b_end,
29918 fns_to_str(a_begin, a_end, m, o);
29920 fns_to_str(b_begin, b_end, m, o);
29944fns_to_str(vector<function_decl*>::const_iterator a_begin,
29945 vector<function_decl*>::const_iterator a_end,
29946 vector<function_decl*>::const_iterator b_begin,
29947 vector<function_decl*>::const_iterator b_end,
29951 fns_to_str(a_begin, a_end, b_begin, b_end, m, o);
29973 std::string parent_qualified_name;
29982 if (!d->priv_->qualified_parent_name_.
empty())
29988 d->priv_->qualified_name_ =
29989 env.
intern(d->priv_->qualified_parent_name_ +
"::" + d->
get_name());
29997 d->priv_->internal_qualified_name_ = d->priv_->qualified_name_;
29999 if (d->priv_->scoped_name_.
empty())
30004 d->priv_->scoped_name_ =
30007 d->priv_->scoped_name_ =
30025{
return do_update(d);}
30037 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.
void clear()
Clear the string.
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 hash_t hash_value() const
Return the hash value of the current IR node.
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.
std::vector< subrange_sptr > subranges_type
Convenience typedef for a vector of subrange_sptr.
virtual hash_t hash_value() const
Return the hash value of the current IR node.
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.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
shared_ptr< subrange_type > subrange_sptr
Convenience typedef for a shared pointer on a function_decl::subrange.
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.
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 hash_t hash_value() const
Return the hash value of the current IR node.
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.
Abstracts a class declaration.
shared_ptr< base_spec > base_spec_sptr
Convenience typedef.
friend bool equals(const class_decl &, const class_decl &, change_kind *)
Compares two instances of class_decl.
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.
virtual hash_t hash_value() const
Return the hash value of the current IR node.
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.
vector< base_spec_sptr > base_specs
Convenience typedef.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
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.
virtual bool operator==(const decl_base &) const
Comparison operator for class_decl.
class_decl_sptr find_base_class(const string &qualified_name) const
Find a base class of a given qualified name for the current class.
bool has_no_base_nor_member() const
Return true iff the class has no entity in its scope.
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.
unordered_map< ssize_t, member_functions > virtual_mem_fn_map_type
Convenience typedef.
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.
vector< type_base_sptr > member_types
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.
virtual hash_t hash_value() const
Return the hash value of the current IR node.
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 members 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.
const data_members & get_static_data_members() const
Get the static data memebers of this class_or_union.
void maybe_fixup_members_of_anon_data_member(var_decl_sptr &anon_dm)
Fixup the members of the type of an anonymous data member.
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.
vector< var_decl_sptr > data_members
Convenience typedef.
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.
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
Equality operator.
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...
const translation_units & get_translation_units() const
Return the list of translation units of the current corpus.
origin get_origin() const
Getter for the origin of the 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.
shared_ptr< exported_decls_builder > exported_decls_builder_sptr
Convenience typedef for shared_ptr<exported_decls_builder>.
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.
const interned_string & get_cached_pretty_representation(bool internal=false) const
Get the pretty representation of the current decl.
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.
virtual 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.
virtual 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.
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.
friend bool equals(const decl_base &, const decl_base &, change_kind *)
Compares two instances of decl_base.
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.
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 hash_t hash_value() const
Return the hash value of the current IR node.
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.
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 vector< type_base_sptr > * get_canonical_types(const char *name) const
Get the vector of canonical types which have a given "stringrepresentation".
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.
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 "stringrepresentation".
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.
bool canonicalization_started() const
Getter of a flag saying if the canonicalization process has started or not.
interned_string intern(const string &) const
Do intern a string.
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 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 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.
std::vector< parameter_sptr > parameters
Convenience typedef for a vector of parameter_sptr.
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.
bool is_declared_inline() const
Test if the function was declared inline.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Get the pretty representation of the current instance of function_decl.
interned_string get_id() const
Return an ID that tries to uniquely identify the function inside a program or a library.
Abstract a function template declaration.
binding get_binding() const
Get the binding of the function template.
void set_pattern(shared_ptr< function_decl > p)
Set a new pattern to the function template.
shared_ptr< function_decl > get_pattern() const
Get the pattern of the function template.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
virtual bool operator==(const decl_base &) const
Comparison operator for the function_tdecl type.
Abstraction of a function type.
std::vector< parameter_sptr > parameters
Convenience typedef for a vector of parameter_sptr.
virtual hash_t hash_value() const
Return the hash value of the current IR node.
virtual bool traverse(ir_node_visitor &)
Traverses an instance of function_type, visiting all the sub-types and decls that it might contain.
shared_ptr< function_decl::parameter > parameter_sptr
Convenience typedef for a shared pointer on a function_decl::parameter.
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.
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 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.
virtual void set_linkage_name(const string &)
Set the linkage name of the method.
friend void set_member_function_is_const(function_decl &, bool)
set the const-ness property of a member function.
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.
virtual hash_t hash_value() const
Return the hash value of the current IR node.
void set_is_const(bool)
Setter of the "is-const" property of method_type.
bool get_is_for_static_method() const
Test if the current method type is for a static method or not.
virtual ~method_type()
The destructor of method_type.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Return a copy of the pretty representation of the current method_type.
class_or_union_sptr get_class_type() const
Get the class type this method belongs to.
bool get_is_const() const
Getter of the "is-const" property of method_type.
The abstraction of a namespace declaration.
bool is_empty_or_has_empty_sub_namespaces() const
Test if the current namespace_decl is empty or contains empty namespaces itself.
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
namespace_decl(const environment &env, const string &name, const location &locus, visibility vis=VISIBILITY_DEFAULT)
Constructor.
virtual bool operator==(const decl_base &) const
Return true iff both namespaces and their members are equal.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Build and return a copy of the pretty representation of the namespace.
Abstracts non type template parameters.
const type_base_sptr get_type() const
Getter for the type of the template parameter.
virtual bool operator==(const decl_base &) const
Return true iff the two decls have the same name.
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 hash_t hash_value() const
Return the hash value of the current IR node.
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.
virtual const interned_string & get_name() const
Getter of the name of the current ptr-to-mbr-type.
virtual hash_t hash_value() const
Return the hash value of the current IR node.
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.
virtual hash_t hash_value() const
Return the hash value of the current IR node.
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.
The internal representation of an integral type.
void set_modifiers(modifiers_type)
Setter of the modifiers bitmap of the real_type.
string to_string(bool internal=false) const
Return the string representation of the current instance of real_type.
base_type get_base_type() const
Getter of the base type of the real_type.
bool operator==(const real_type &) const
Equality operator for the real_type.
real_type()
Default constructor of the real_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.
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.
@ ARRAY_SIZE_BASE_TYPE
The aray size type used by Clang.
@ DOUBLE_BASE_TYPE
The "double" base type.
modifiers_type get_modifiers() const
Getter of the modifiers bitmap of the real_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 hash_t hash_value() const
Return the hash value of the current IR node.
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.
std::vector< scope_decl_sptr > scopes
Convenience typedef for a vector of scope_decl_sptr.
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< decl_base_sptr > declarations
Convenience typedef for a vector of decl_base_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....
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.
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 hash_t hash_value() const
Return the hash value of the current IR node.
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.
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 hash_t hash_value() const
Return the hash value of the current IR node.
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.
friend hash_t peek_hash_value(const type_or_decl_base &)
Get the hash value associated to an IR node.
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.
friend hash_t set_or_get_cached_hash_value(const T &type_or_decl)
Set the hash value of an IR node and return it.
friend class_decl * is_class_type(const type_or_decl_base *)
Test whether a type is a class.
virtual hash_t hash_value() const
Return the hash value of the current IR node.
enum type_or_decl_kind kind() const
Getter for the "kind" property of type_or_decl_base type.
void set_is_artificial(bool)
Setter of the flag that says if the artefact is artificial.
virtual bool traverse(ir_node_visitor &)
Traverse the the ABI artifact.
const void * runtime_type_instance() const
Getter of the pointer to the runtime type sub-object of the current instance.
const void * type_or_decl_base_pointer() const
Getter of the pointer to either the type_base sub-object of the current instance if it's a type,...
friend decl_base * is_decl(const type_or_decl_base *d)
Test if an ABI artifact is a declaration.
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 hash_t hash_value() const
Return the hash value of the current IR node.
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 hash_t hash_value() const
Return the hash value of the current IR node.
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 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...
string get_pretty_representation(diff *d)
Get a copy of the pretty representation of a diff node.
ostream & operator<<(ostream &o, diff_category c)
Serialize an instance of diff_category to an output stream.
hash_t combine_hashes(hash_t val1, hash_t val2)
Combine two hash values to produce a third hash value.
@ HASHING_FINISHED_STATE
Hashing of given IR node started and is now done. If an ABI artifact is in this state,...
real_type::modifiers_type operator~(real_type::modifiers_type l)
Bitwise one's complement operator for real_type::modifiers_type.
shared_ptr< reference_type_def > reference_type_def_sptr
Convenience typedef for a shared pointer on a reference_type_def.
bool enum_has_non_name_change(const enum_type_decl &l, const enum_type_decl &r, change_kind *k)
Test if two enums differ, but not by a name change.
const type_base_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.
hash_t peek_hash_value(const type_or_decl_base &artefact)
Get the hash value associated to an IR node.
type_decl_sptr lookup_basic_type(const interned_string &type_name, const translation_unit &tu)
Lookup a basic type from a translation unit.
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 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_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.
shared_ptr< function_decl > function_decl_sptr
Convenience typedef for a shared pointer on a function_decl.
access_specifier
Access specifier for class members.
size_t get_canonical_type_index(const type_base &t)
Getter of the canonical type index of a given type.
const type_base_wptrs_type * lookup_enum_types(const interned_string &qualified_name, const corpus &corp)
Look into a given corpus to find the enum type*s* that have a given qualified name.
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.
bool type_is_suitable_for_hash_computing(const type_base &)
Test if we should attempt to compute a hash value for a given 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.
ssize_t get_member_function_vtable_offset(const function_decl &f)
Get the vtable offset of a member function.
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.
scope_decl * get_type_scope(type_base *t)
Get the scope of a given type.
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 scope_decl * is_scope_decl(const decl_base *d)
Test if a declaration is a scope_decl.
qualified_type_def_sptr clone_qualified_type(const qualified_type_def_sptr &t)
Clone a qualifiend type.
const type_base * is_void_pointer_type(const type_base *t)
Test if a type is a pointer to void type.
bool is_type(const type_or_decl_base &tod)
Test whether a declaration is a type.
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.
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_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.
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.
T * maybe_get_canonical_type(T *t)
Get the canonical type of a given type T* as a T*.
shared_ptr< elf_symbol > elf_symbol_sptr
A convenience typedef for a shared pointer to elf_symbol.
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.
type_base * get_exemplar_type(const type_base *type)
For a given type, return its exemplar type.
class_decl_sptr is_compatible_with_class_type(const type_base_sptr &t)
Test if a type is a class. This function looks through typedefs.
bool type_originates_from_corpus(type_base_sptr t, corpus_sptr &c)
Test if a type originates from a corpus.
bool parse_real_type(const string &type_name, real_type &type)
Parse a real type from a string.
void remove_decl_from_scope(decl_base_sptr decl)
Remove a given decl from its scope.
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.
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...
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.
weak_ptr< class_decl > class_decl_wptr
Convenience typedef for a weak pointer on a class_decl.
string components_to_type_name(const list< string > &comps)
Turn a set of qualified name components (that name a type) into a qualified name string.
void unmark_types_as_being_compared(T &l, T &r)
Mark a pair of types as being not compared anymore.
vector< type_base_sptr > type_base_sptrs_type
Helper typedef for a vector of shared pointer to a type_base.
void debug_comp_stack(const environment &env)
Emit a trace of the two comparison operands stack on the standard error stream.
bool collect_non_anonymous_data_members(const class_or_union *cou, string_decl_base_sptr_map &dms)
Collect all the non-anonymous data members of a class or union type.
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.
void set_member_function_virtuality(function_decl &fn, bool is_virtual, ssize_t voffset)
Set the virtual-ness of a member fcuntion.
shared_ptr< array_type_def > array_type_def_sptr
Convenience typedef for a shared pointer on a array_type_def.
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.
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.
string get_pretty_representation(const type_or_decl_base *tod, bool internal)
Build and return a copy of the pretty representation of an ABI artifact that could be either a type o...
bool is_anonymous_type(const type_base *t)
Test whether a declaration is a type.
type_base_sptr lookup_class_typedef_or_enum_type(const string &qualified_name, const corpus &corp)
Look into a corpus to find a class, typedef or enum type which has a given qualified name.
type_base_sptr peel_const_qualified_type(const qualified_type_def_sptr &q)
If a qualified type is const, then return its underlying type.
const class_or_union_sptr data_member_has_anonymous_type(const var_decl &d)
Test if a data member has annonymous type or not.
type_decl * is_integral_type(const type_or_decl_base *t)
Test if a type is an integral type.
bool anonymous_data_member_exists_in_class(const var_decl &anon_dm, const class_or_union &clazz)
Test if a given anonymous data member exists in a class or union.
class_decl_sptr lookup_class_type_per_location(const interned_string &loc, const corpus &corp)
Look up a class_decl from a given corpus by its location.
void set_member_function_is_dtor(function_decl &f, bool d)
Set the destructor-ness property of a member function.
const type_base_sptr peel_array_type(const type_base_sptr &type)
Return the leaf element type of an array.
reference_type_def_sptr lookup_reference_type(const interned_string &type_name, const translation_unit &tu)
Lookup a reference type from a translation unit.
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.
corpus_group_sptr is_corpus_group(const corpus_sptr &corpus)
Test if a corpus is a corpus_group.
shared_ptr< template_parameter > template_parameter_sptr
Convenience typedef for shared pointer to template parameter.
class_or_union * is_class_or_union_type(const type_or_decl_base *t)
Test if a type is a class_or_union.
var_decl_sptr get_data_member(class_or_union *clazz, const char *member_name)
Get a given data member, referred to by its name, of a class type.
type_base * look_through_decl_only_type(type_base *t)
If a type is is decl-only, then get its definition. Otherwise, just return the initial type.
const var_decl_sptr get_next_data_member(const class_or_union *klass, const var_decl_sptr &data_member)
In the context of a given class or union, this function returns the data member that is located after...
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.
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.
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.
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.
abg_compat::optional< uint64_t > hash_t
The abstraction for an 8 bytes hash value.
uint64_t get_var_size_in_bits(const var_decl_sptr &v)
Get the size of a given variable.
enum_type_decl_sptr lookup_enum_type_per_location(const interned_string &loc, const corpus &corp)
Look up an enum_type_decl from a given corpus, by its location.
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.
class_decl_sptr lookup_class_type(const string &fqn, const translation_unit &tu)
Lookup a class type from a translation unit.
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.
qualified_type_def_sptr is_array_of_qualified_element(const array_type_def_sptr &array)
Tests if the element of a given array is a qualified type.
void sort_types(const canonical_type_sptr_set_type &types, vector< type_base_sptr > &result)
Sort types in a hopefully stable manner.
bool is_typedef_of_maybe_qualified_class_or_union_type(const type_base *t)
Test if a type is a typedef of a class or union type, or a typedef of a qualified class or union type...
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...
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.
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.
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.
const global_scope * get_global_scope(const decl_base &decl)
return the global scope as seen by a given declaration.
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.
size_t hash_type_or_decl(const type_or_decl_base *tod)
Hash an ABI artifact that is either a type or a decl.
corpus::origin operator&(corpus::origin l, corpus::origin r)
Bitwise & operator for the corpus::origin type.
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.
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.
pointer_type_def_sptr lookup_pointer_type(const interned_string &type_name, const translation_unit &tu)
Lookup a pointer type from a translation unit.
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.
const type_base * is_void_pointer_type_equivalent(const type_base *type)
Test if a type is equivalent to a pointer to void 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.
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.
const decl_base_sptr lookup_var_decl_in_scope(const string &fqn, const scope_decl_sptr &skope)
Lookup a var_decl in a scope.
type_base * type_has_non_canonicalized_subtype(type_base_sptr t)
Test if a type has sub-types that are non-canonicalized.
unordered_map< string, decl_base_sptr > string_decl_base_sptr_map
Convenience typedef for a map which key is a string and which value is a decl_base_sptr.
qualified_type_def_sptr lookup_qualified_type(const interned_string &type_name, const translation_unit &tu)
Lookup a qualified type from a translation unit.
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...
const type_base_sptr lookup_type(const interned_string &fqn, const translation_unit &tu)
Lookup a type in a translation unit.
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.
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.
union_decl_sptr lookup_union_type(const interned_string &type_name, const translation_unit &tu)
Lookup a union type from a translation unit.
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.
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.
bool is_const_qualified_type(const qualified_type_def_sptr &t)
Test if a given qualified type is const.
translation_unit::language string_to_translation_unit_language(const string &l)
Parse a string representing a language into a translation_unit::language enumerator into a string.
type_base_sptr lookup_type_per_location(const interned_string &loc, const corpus &corp)
Lookup a type from a corpus, by its location.
bool get_next_data_member_offset(const class_or_union *klass, const var_decl_sptr &dm, uint64_t &offset)
Get the offset of the non-static data member that comes after a given one.
uint64_t get_absolute_data_member_offset(const var_decl &m)
Get the absolute offset of a data member.
shared_ptr< ir_traversable_base > ir_traversable_base_sptr
Convenience typedef for a shared pointer to ir_traversable_base.
bool is_member_function(const function_decl &f)
Test whether a function_decl is a member function.
const function_decl::parameter * get_function_parameter(const decl_base *fun, unsigned parm_index)
Get the function parameter designated by its index.
var_decl * is_var_decl(const type_or_decl_base *tod)
Tests if a declaration is a variable declaration.
bool is_c_language(translation_unit::language l)
Test if a language enumerator designates the C language.
decl_base * is_decl(const type_or_decl_base *d)
Test if an ABI artifact is a declaration.
void keep_type_alive(type_base_sptr t)
Make sure that the life time of a given (smart pointer to a) type is the same as the life time of the...
method_decl * is_method_decl(const type_or_decl_base *d)
Test if a function_decl is actually a method_decl.
array_type_def_sptr lookup_array_type(const interned_string &type_name, const translation_unit &tu)
Lookup an array type from a translation unit.
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.
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.
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.
void sort_types_for_hash_computing_and_c14n(IteratorType begin, IteratorType end)
Sort types before hashing (and then canonicalizing) them.
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.
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.
translation_unit * get_translation_unit(const type_or_decl_base &t)
Return the translation unit a declaration belongs to.
weak_ptr< decl_base > decl_base_wptr
Convenience typedef for a weak pointer to a decl_base.
var_decl_sptr has_fake_flexible_array_data_member(const class_decl &klass)
Test if the last data member of a class is an array with one element.
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.
enum_type_decl_sptr lookup_enum_type(const interned_string &type_name, const translation_unit &tu)
Lookup an enum type from a translation unit.
type_base_sptr peel_typedef_type(const type_base_sptr &type)
Return the leaf underlying type node of a typedef_decl node.
const type_base_wptrs_type * lookup_union_types(const interned_string &qualified_name, const corpus &corp)
Look into a given corpus to find the union type*s* that have a given qualified name.
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.
function_type_sptr lookup_function_type(const interned_string &type_name, const translation_unit &tu)
Lookup a function type from a translation unit.
bool is_global_scope(const scope_decl &scope)
Tests whether if a given scope is the global scope.
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 type_base_wptrs_type * lookup_class_types(const interned_string &qualified_name, const corpus &corp)
Look into a given corpus to find the class type*s* that have a given qualified name.
const decl_base * get_type_declaration(const type_base *t)
Get the declaration for a given type.
var_decl_sptr has_flexible_array_data_member(const class_decl &klass)
Test if the last data member of a class is an array with non-finite data member.
void set_member_is_static(decl_base &d, bool s)
Sets the static-ness property of a class member.
type_base_sptr canonicalize(type_base_sptr t, bool do_log, bool show_stats)
Compute the canonical type of a given type.
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.
interned_string get_method_type_name(const method_type_sptr fn_type, bool internal)
Get the name of a given method type and return a copy of it.
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.
typedef_decl_sptr clone_typedef(const typedef_decl_sptr &t)
Clone a typedef type.
type_decl_sptr lookup_basic_type_per_location(const interned_string &loc, const corpus &corp)
Lookup a type_decl type from a given corpus, by its location.
bool compare_using_locations(const decl_base *f, const decl_base *s)
Compare decls using their locations.
const type_base_sptr lookup_type_through_scopes(const type_base_sptr type, const translation_unit &tu)
Lookup a type from a translation unit by walking the scopes of the translation unit in sequence and l...
type_or_decl_base * debug(const type_or_decl_base *artifact)
Emit a textual representation of an artifact to std error stream for debugging purposes.
unordered_set< type_base_sptr, canonical_type_hash > canonical_type_sptr_set_type
Helper typedef for an unordered set of type_base_sptr which uses pointer value to tell its members ap...
bool return_comparison_result(T &l, T &r, bool value)
Return the result of the comparison of two (sub) types.
shared_ptr< namespace_decl > namespace_decl_sptr
Convenience typedef for a shared pointer on namespace_decl.
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.
bool types_are_compatible(const type_base_sptr type1, const type_base_sptr type2)
Test if two types are equal modulo a typedef.
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.
const scope_decl * get_top_most_scope_under(const decl_base *decl, const scope_decl *scope)
Return the a scope S containing a given declaration and that is right under a given scope P.
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.
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.
typedef_decl_sptr lookup_typedef_type_per_location(const interned_string &loc, const corpus &corp)
Lookup a typedef_decl from a corpus, by its location.
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:
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.
typedef_decl_sptr lookup_typedef_type(const interned_string &type_name, const translation_unit &tu)
Lookup a typedef type from a translation unit.
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.
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.
union_decl_sptr lookup_union_type_per_location(const interned_string &loc, const corpus &corp)
Lookup a union type in a given corpus, from its location.
bool class_or_union_types_of_same_kind(const class_or_union *first, const class_or_union *second)
Test if two class or union types are of the same kind.
string build_qualified_name(const scope_decl *scope, const string &name)
Build and return a qualified name from a name and its scope.
bool is_ptr_ref_or_qual_type(const type_base *t)
Helper to detect if a type is either a reference, a pointer, or a qualified type.
method_decl_sptr copy_member_function(const class_or_union_sptr &t, const method_decl_sptr &method)
Copy a method of a class_or_union into a new class_or_union.
enum_type_decl_sptr look_through_decl_only_enum(const enum_type_decl &the_enum)
If an enum is a decl-only enum, get its definition. Otherwise, just return the initial enum.
shared_ptr< function_tdecl > function_tdecl_sptr
Convenience typedef for a shared pointer on a function_tdecl.
enum_type_decl_sptr is_compatible_with_enum_type(const type_base_sptr &t)
Test if a type is an enum. This function looks through typedefs.
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.
bool is_at_global_scope(const decl_base &decl)
Tests whether a given declaration is at global scope.
type_decl * is_real_type(const type_or_decl_base *t)
Test if a type is a real type.
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.
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.
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.
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.
Hasher for the class_or_union type.
bool is_printing_flat_representation() const
Getter of the 'is_printing_flat_representation_' boolean.
void unset_printing_flat_representation()
Set the 'is_printing_flat_representation_' boolean to false.
void set_printing_flat_representation()
Set the 'is_printing_flat_representation_' boolean to true.
A functor to sort decls somewhat topologically. That is, types are sorted in a way that makes the one...
The private data of the environment type.
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.
Private type to hold private members of translation_unit.
Hash functor for instances of type_base.
Definition of the private data of type_base.
The private data of type_or_decl_base.
A predicate for deep equality of instances of shared_ptr<type_base>
A functor to sort types somewhat topologically. That is, types are sorted in a way that makes the one...
A deleter for shared pointers that ... doesn't delete the object managed by the shared pointer.