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)
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));
894#if WITH_DEBUG_TYPE_CANONICALIZATION
914 if (env.priv_->use_canonical_type_comparison_)
918 ABG_RETURN_EQUAL(lc, rc);
927 if (l_hash != r_hash)
934 ABG_RETURN_EQUAL(lc, rc);
942 if (l_hash != r_hash)
960 bool result = l.priv_->comparison_started(l, r);
1000#define RETURN_TRUE_IF_COMPARISON_CYCLE_DETECTED(l, r) \
1003 if (is_comparison_cycle_detected(l, r)) \
1021 l.priv_->mark_as_being_compared(l, r);
1056 l.priv_->unmark_as_being_compared(l, r);
1102#define CACHE_AND_RETURN_COMPARISON_RESULT(value) \
1105 bool res = return_comparison_result(l, r, value); \
1106 l.get_environment().priv_->cache_type_comparison_result(l, r, res); \
1114#define CACHE_COMPARISON_RESULT_AND_RETURN(value) \
1117 l.get_environment().priv_->cache_type_comparison_result(l, r, value); \
1125const vector<type_base_wptr>&
1128 if (priv_->sorted_types_.empty())
1130 istring_type_base_wptrs_map_type::const_iterator i;
1131 vector<type_base_wptr>::const_iterator j;
1134 for (j = i->second.begin(); j != i->second.end(); ++j)
1135 priv_->sorted_types_.push_back(*j);
1138 for (j = i->second.begin(); j != i->second.end(); ++j)
1139 priv_->sorted_types_.push_back(*j);
1142 for (j = i->second.begin(); j != i->second.end(); ++j)
1143 priv_->sorted_types_.push_back(*j);
1146 for (j = i->second.begin(); j != i->second.end(); ++j)
1147 priv_->sorted_types_.push_back(*j);
1150 for (j = i->second.begin(); j != i->second.end(); ++j)
1151 priv_->sorted_types_.push_back(*j);
1153 type_name_comp comp;
1154 sort(priv_->sorted_types_.begin(), priv_->sorted_types_.end(), comp);
1157 return priv_->sorted_types_;
1176 const std::string& path,
1178 : priv_(new
priv(env))
1180 priv_->path_ = path;
1181 priv_->address_size_ = address_size;
1203 if (!priv_->global_scope_)
1205 priv_->global_scope_.reset
1207 priv_->global_scope_->set_translation_unit
1210 return priv_->global_scope_;
1218{
return priv_->types_;}
1225{
return priv_->types_;}
1232const vector<function_type_sptr>&
1234{
return priv_->live_fn_types_;}
1241{
return priv_->env_;}
1248{
return priv_->language_;}
1255{priv_->language_ = l;}
1268{
return priv_->path_;}
1279{priv_->path_ = a_path;}
1292{
return priv_->comp_dir_path_;}
1303{priv_->comp_dir_path_ = d;}
1312 if (priv_->abs_path_.empty())
1315 if (!priv_->path_.empty())
1317 if (!priv_->comp_dir_path_.empty())
1319 path = priv_->comp_dir_path_;
1322 path += priv_->path_;
1324 priv_->abs_path_ = path;
1327 return priv_->abs_path_;
1346{
return priv_->corp;}
1362{
return priv_->loc_mgr_;}
1370{
return priv_->loc_mgr_;}
1379 if (!priv_->global_scope_)
1389{
return priv_->address_size_;}
1396{priv_->address_size_= a;}
1412{
return priv_->is_constructed_;}
1428{priv_->is_constructed_ = f;}
1467 const_cast<translation_unit*
>(
this)->priv_->live_fn_types_.push_back(ftype);
1500translation_unit::~translation_unit()
1513 case translation_unit::LANG_UNKNOWN:
1514 return "LANG_UNKNOWN";
1515 case translation_unit::LANG_Cobol74:
1516 return "LANG_Cobol74";
1517 case translation_unit::LANG_Cobol85:
1518 return "LANG_Cobol85";
1519 case translation_unit::LANG_C89:
1521 case translation_unit::LANG_C99:
1523 case translation_unit::LANG_C11:
1525 case translation_unit::LANG_C:
1527 case translation_unit::LANG_C_plus_plus_11:
1528 return "LANG_C_plus_plus_11";
1529 case translation_unit::LANG_C_plus_plus_14:
1530 return "LANG_C_plus_plus_14";
1531 case translation_unit::LANG_C_plus_plus:
1532 return "LANG_C_plus_plus";
1533 case translation_unit::LANG_ObjC:
1535 case translation_unit::LANG_ObjC_plus_plus:
1536 return "LANG_ObjC_plus_plus";
1537 case translation_unit::LANG_Fortran77:
1538 return "LANG_Fortran77";
1539 case translation_unit::LANG_Fortran90:
1540 return "LANG_Fortran90";
1541 case translation_unit::LANG_Fortran95:
1542 return "LANG_Fortran95";
1543 case translation_unit::LANG_Ada83:
1544 return "LANG_Ada83";
1545 case translation_unit::LANG_Ada95:
1546 return "LANG_Ada95";
1547 case translation_unit::LANG_Pascal83:
1548 return "LANG_Pascal83";
1549 case translation_unit::LANG_Modula2:
1550 return "LANG_Modula2";
1551 case translation_unit::LANG_Java:
1553 case translation_unit::LANG_PLI:
1555 case translation_unit::LANG_UPC:
1557 case translation_unit::LANG_D:
1559 case translation_unit::LANG_Python:
1560 return "LANG_Python";
1561 case translation_unit::LANG_Go:
1563 case translation_unit::LANG_Mips_Assembler:
1564 return "LANG_Mips_Assembler";
1566 return "LANG_UNKNOWN";
1569 return "LANG_UNKNOWN";
1581 if (l ==
"LANG_Cobol74")
1582 return translation_unit::LANG_Cobol74;
1583 else if (l ==
"LANG_Cobol85")
1584 return translation_unit::LANG_Cobol85;
1585 else if (l ==
"LANG_C89")
1586 return translation_unit::LANG_C89;
1587 else if (l ==
"LANG_C99")
1588 return translation_unit::LANG_C99;
1589 else if (l ==
"LANG_C11")
1590 return translation_unit::LANG_C11;
1591 else if (l ==
"LANG_C")
1592 return translation_unit::LANG_C;
1593 else if (l ==
"LANG_C_plus_plus_11")
1594 return translation_unit::LANG_C_plus_plus_11;
1595 else if (l ==
"LANG_C_plus_plus_14")
1596 return translation_unit::LANG_C_plus_plus_14;
1597 else if (l ==
"LANG_C_plus_plus")
1598 return translation_unit::LANG_C_plus_plus;
1599 else if (l ==
"LANG_ObjC")
1600 return translation_unit::LANG_ObjC;
1601 else if (l ==
"LANG_ObjC_plus_plus")
1602 return translation_unit::LANG_ObjC_plus_plus;
1603 else if (l ==
"LANG_Fortran77")
1604 return translation_unit::LANG_Fortran77;
1605 else if (l ==
"LANG_Fortran90")
1606 return translation_unit::LANG_Fortran90;
1607 else if (l ==
"LANG_Fortran95")
1608 return translation_unit::LANG_Fortran95;
1609 else if (l ==
"LANG_Ada83")
1610 return translation_unit::LANG_Ada83;
1611 else if (l ==
"LANG_Ada95")
1612 return translation_unit::LANG_Ada95;
1613 else if (l ==
"LANG_Pascal83")
1614 return translation_unit::LANG_Pascal83;
1615 else if (l ==
"LANG_Modula2")
1616 return translation_unit::LANG_Modula2;
1617 else if (l ==
"LANG_Java")
1618 return translation_unit::LANG_Java;
1619 else if (l ==
"LANG_PLI")
1620 return translation_unit::LANG_PLI;
1621 else if (l ==
"LANG_UPC")
1622 return translation_unit::LANG_UPC;
1623 else if (l ==
"LANG_D")
1624 return translation_unit::LANG_D;
1625 else if (l ==
"LANG_Python")
1626 return translation_unit::LANG_Python;
1627 else if (l ==
"LANG_Go")
1628 return translation_unit::LANG_Go;
1629 else if (l ==
"LANG_Mips_Assembler")
1630 return translation_unit::LANG_Mips_Assembler;
1632 return translation_unit::LANG_UNKNOWN;
1643 return (l == translation_unit::LANG_C89
1644 || l == translation_unit::LANG_C99
1645 || l == translation_unit::LANG_C11
1646 || l == translation_unit::LANG_C);
1657 return (l == translation_unit::LANG_C_plus_plus_03
1658 || l == translation_unit::LANG_C_plus_plus_11
1659 || l == translation_unit::LANG_C_plus_plus_14
1660 || l == translation_unit::LANG_C_plus_plus);
1670{
return l == translation_unit::LANG_Java;}
1680 return (l == translation_unit::LANG_Ada83
1681 || l == translation_unit::LANG_Ada95);
1694 if (l.get() == r.get())
1717struct elf_symbol::priv
1757 bool is_in_ksymtab_;
1760 bool is_suppressed_;
1775 is_in_ksymtab_(false),
1778 is_suppressed_(false)
1781 priv(
const environment& e,
1789 const elf_symbol::version& ve,
1811 is_common_ = type_ == COMMON_TYPE;
1845elf_symbol::elf_symbol(
const environment& e,
1921 elf_symbol_sptr sym(
new elf_symbol(e, i, s, n, t, b, d, c, ve, vi,
1923 sym->priv_->main_symbol_ = sym;
1963{
return priv_->env_;}
1970{
return priv_->index_;}
1984{
return priv_->name_;}
1993 priv_->id_string_.clear();
2001{
return priv_->type_;}
2015{
return priv_->size_;}
2022{priv_->size_ = size;}
2029{
return priv_->binding_;}
2036{priv_->binding_ = b;}
2043{
return priv_->version_;}
2051 priv_->version_ = v;
2052 priv_->id_string_.clear();
2061{priv_->visibility_ = v;}
2069{
return priv_->visibility_;}
2077{
return priv_->is_defined_;}
2085{priv_->is_defined_ = d;}
2138{
return priv_->is_in_ksymtab_;}
2153{
return priv_->crc_;}
2167{
return priv_->namespace_;}
2174{priv_->namespace_ = ns;}
2183{
return priv_->is_suppressed_;}
2222{
return priv_->main_symbol_.lock();}
2229{
return priv_->main_symbol_.lock();}
2243{
return priv_->next_alias_.lock();}
2263 a = a->get_next_alias())
2286 a && !a->is_main_symbol();
2287 a = a->get_next_alias())
2289 if (a->get_next_alias()->is_main_symbol())
2297 last_alias->priv_->next_alias_ = alias;
2300 priv_->next_alias_ = alias;
2330 a = a->get_next_alias())
2331 if (a->get_name() == name)
2341 priv_->main_symbol_ = new_main;
2343 a = a->get_next_alias())
2344 a->priv_->main_symbol_ = new_main;
2354{
return priv_->is_common_;}
2385{
return priv_->next_common_instance_.lock();}
2400 ABG_ASSERT(!common->has_other_common_instances());
2409 c = c->get_next_common_instance())
2414 last_common_instance = c;
2419 last_common_instance->priv_->next_common_instance_ = common;
2422 priv_->next_common_instance_ = common;
2442 if (priv_->id_string_.empty())
2454 priv_->id_string_ = s;
2457 return priv_->id_string_;
2474 a = a->get_next_alias())
2475 if (a->get_name() == name)
2492 a && a.get() != a->get_main_symbol().get();
2493 a = a->get_next_alias())
2494 if (textually_equals(*
this, *a))
2511 bool include_symbol_itself)
const
2515 if (include_symbol_itself)
2518 vector<elf_symbol_sptr> aliases;
2519 compute_aliases_for_elf_symbol(*
this, syms, aliases);
2520 if (!aliases.empty() && include_symbol_itself)
2523 for (vector<elf_symbol_sptr>::const_iterator i = aliases.begin();
2527 if (i != aliases.begin())
2529 result += (*i)->get_id_string();
2544 vector<elf_symbol_sptr> aliases;
2545 if (include_symbol_itself)
2550 a = a->get_next_alias())
2551 aliases.push_back(a);
2554 for (vector<elf_symbol_sptr>::const_iterator i = aliases.begin();
2558 if (i != aliases.begin())
2560 result += (*i)->get_id_string();
2580 name.clear(), ver.clear();
2582 string::size_type i =
id.find(
'@');
2583 if (i == string::npos)
2589 name =
id.substr(0, i);
2595 string::size_type j =
id.find(
'@', i);
2596 if (j == string::npos)
2623 bool are_equal = textually_equals(*
this, other);
2644 a && !a->is_main_symbol();
2645 a = a->get_next_alias())
2669 return *lhs == *rhs;
2695compute_aliases_for_elf_symbol(
const elf_symbol& sym,
2697 vector<elf_symbol_sptr>& aliases)
2701 for (; a && !a->is_main_symbol(); a = a->get_next_alias())
2702 aliases.push_back(a);
2704 for (string_elf_symbols_map_type::const_iterator i = symtab.begin();
2707 for (elf_symbols::const_iterator j = i->second.begin();
2708 j != i->second.end();
2713 s && !s->is_main_symbol();
2714 s = s->get_next_alias())
2715 aliases.push_back(s);
2718 s && !s->is_main_symbol();
2719 s = s->get_next_alias())
2721 aliases.push_back(*j);
2766 case elf_symbol::NOTYPE_TYPE:
2767 repr =
"unspecified symbol type";
2769 case elf_symbol::OBJECT_TYPE:
2770 repr =
"variable symbol type";
2772 case elf_symbol::FUNC_TYPE:
2773 repr =
"function symbol type";
2775 case elf_symbol::SECTION_TYPE:
2776 repr =
"section symbol type";
2778 case elf_symbol::FILE_TYPE:
2779 repr =
"file symbol type";
2781 case elf_symbol::COMMON_TYPE:
2782 repr =
"common data object symbol type";
2784 case elf_symbol::TLS_TYPE:
2785 repr =
"thread local data object symbol type";
2787 case elf_symbol::GNU_IFUNC_TYPE:
2788 repr =
"indirect function symbol type";
2792 std::ostringstream s;
2793 s <<
"unknown symbol type (" << (char)t <<
')';
2816 case elf_symbol::LOCAL_BINDING:
2817 repr =
"local binding";
2819 case elf_symbol::GLOBAL_BINDING:
2820 repr =
"global binding";
2822 case elf_symbol::WEAK_BINDING:
2823 repr =
"weak binding";
2825 case elf_symbol::GNU_UNIQUE_BINDING:
2826 repr =
"GNU unique binding";
2830 std::ostringstream s;
2831 s <<
"unknown binding (" << (
unsigned char) b <<
")";
2854 case elf_symbol::DEFAULT_VISIBILITY:
2855 repr =
"default visibility";
2857 case elf_symbol::PROTECTED_VISIBILITY:
2858 repr =
"protected visibility";
2860 case elf_symbol::HIDDEN_VISIBILITY:
2861 repr =
"hidden visibility";
2863 case elf_symbol::INTERNAL_VISIBILITY:
2864 repr =
"internal visibility";
2868 std::ostringstream s;
2869 s <<
"unknown visibility (" << (
unsigned char) v <<
")";
2891 t = elf_symbol::NOTYPE_TYPE;
2892 else if (s ==
"object-type")
2893 t = elf_symbol::OBJECT_TYPE;
2894 else if (s ==
"func-type")
2895 t = elf_symbol::FUNC_TYPE;
2896 else if (s ==
"section-type")
2897 t = elf_symbol::SECTION_TYPE;
2898 else if (s ==
"file-type")
2899 t = elf_symbol::FILE_TYPE;
2900 else if (s ==
"common-type")
2901 t = elf_symbol::COMMON_TYPE;
2902 else if (s ==
"tls-type")
2903 t = elf_symbol::TLS_TYPE;
2904 else if (s ==
"gnu-ifunc-type")
2905 t = elf_symbol::GNU_IFUNC_TYPE;
2923 if (s ==
"local-binding")
2924 b = elf_symbol::LOCAL_BINDING;
2925 else if (s ==
"global-binding")
2926 b = elf_symbol::GLOBAL_BINDING;
2927 else if (s ==
"weak-binding")
2928 b = elf_symbol::WEAK_BINDING;
2929 else if (s ==
"gnu-unique-binding")
2930 b = elf_symbol::GNU_UNIQUE_BINDING;
2948 if (s ==
"default-visibility")
2949 v = elf_symbol::DEFAULT_VISIBILITY;
2950 else if (s ==
"protected-visibility")
2951 v = elf_symbol::PROTECTED_VISIBILITY;
2952 else if (s ==
"hidden-visibility")
2953 v = elf_symbol::HIDDEN_VISIBILITY;
2954 else if (s ==
"internal-visibility")
2955 v = elf_symbol::INTERNAL_VISIBILITY;
2970{
return t == elf_symbol::FUNC_TYPE;}
2980{
return t == elf_symbol::OBJECT_TYPE;}
2984struct elf_symbol::version::priv
2990 : is_default_(false)
2993 priv(
const string& v,
3000elf_symbol::version::version()
3007elf_symbol::version::version(
const string& v,
3009 : priv_(new priv(v, is_default))
3013 : priv_(new priv(v.str(), v.is_default()))
3017elf_symbol::version::~version() =
default;
3022elf_symbol::version::operator
const string&()
const
3023{
return priv_->version_;}
3030{
return priv_->version_;}
3037{priv_->version_ = s;}
3044{
return priv_->is_default_;}
3051{priv_->is_default_ = f;}
3054elf_symbol::version::is_empty()
const
3055{
return str().empty();}
3064{
return str() == o.
str();}
3093struct dm_context_rel::priv
3096 size_t offset_in_bits_;
3099 priv(
bool is_static =
false)
3100 : is_laid_out_(!is_static),
3102 anonymous_data_member_()
3105 priv(
bool is_laid_out,
size_t offset_in_bits)
3106 : is_laid_out_(is_laid_out),
3107 offset_in_bits_(offset_in_bits),
3108 anonymous_data_member_()
3112dm_context_rel::dm_context_rel()
3117dm_context_rel::dm_context_rel(scope_decl* s,
3119 size_t offset_in_bits,
3122 : context_rel(s, a, is_static),
3123 priv_(new priv(is_laid_out, offset_in_bits))
3126dm_context_rel::dm_context_rel(scope_decl* s)
3132dm_context_rel::get_is_laid_out()
const
3133{
return priv_->is_laid_out_;}
3136dm_context_rel::set_is_laid_out(
bool f)
3137{priv_->is_laid_out_ = f;}
3140dm_context_rel::get_offset_in_bits()
const
3141{
return priv_->offset_in_bits_;}
3144dm_context_rel::set_offset_in_bits(
size_t o)
3145{priv_->offset_in_bits_ = o;}
3148dm_context_rel::operator==(
const dm_context_rel& o)
const
3150 if (!context_rel::operator==(o))
3153 return (priv_->is_laid_out_ == o.priv_->is_laid_out_
3154 && priv_->offset_in_bits_ == o.priv_->offset_in_bits_);
3158dm_context_rel::operator!=(
const dm_context_rel& o)
const
3169{
return priv_->anonymous_data_member_;}
3179{priv_->anonymous_data_member_ = anon_dm;}
3181dm_context_rel::~dm_context_rel()
3207{
return priv_->canonical_types_;}
3251 unsigned l1 = 0, l2 = 0, c1 = 0, c2 = 0;
3273 vector<type_base_sptr>& result)
3276 result.push_back(t);
3279 std::stable_sort(result.begin(), result.end(), comp);
3291const type_base_sptr&
3294 if (!priv_->void_type_)
3295 priv_->void_type_.reset(
new type_decl(*
this,
3298 return priv_->void_type_;
3310const type_base_sptr&
3313 if (!priv_->void_pointer_type_)
3316 return priv_->void_pointer_type_;
3329const type_base_sptr&
3332 if (!priv_->variadic_marker_type_)
3333 priv_->variadic_marker_type_.
3336 return priv_->variadic_marker_type_;
3345 static string variadic_parameter_type_name =
"variadic parameter type";
3346 return variadic_parameter_type_name;
3356{
return priv_->canonicalization_is_done_;}
3371 priv_->canonicalization_is_done_ = f;
3372 if (priv_->canonicalization_is_done_)
3383{
return priv_->canonicalization_started_;}
3392{priv_->canonicalization_started_ = f;}
3416{
return priv_->decl_only_class_equals_definition_;}
3441{priv_->decl_only_class_equals_definition_ = f;}
3546{
return const_cast<environment*
>(
this)->priv_->string_pool_.create_string(s);}
3553{
return priv_->config_;}
3563{
return priv_->analyze_exported_interfaces_only_.has_value();}
3576{priv_->analyze_exported_interfaces_only_ = f;}
3589{
return priv_->analyze_exported_interfaces_only_.value_or(
false);}
3591#ifdef WITH_DEBUG_SELF_COMPARISON
3604environment::set_self_comparison_debug_input(
const corpus_sptr& c)
3606 self_comparison_debug_is_on(
true);
3607 if (priv_->first_self_comparison_corpus_.expired())
3608 priv_->first_self_comparison_corpus_ = c;
3609 else if (priv_->second_self_comparison_corpus_.expired()
3610 && c.get() != corpus_sptr(priv_->first_self_comparison_corpus_).get())
3611 priv_->second_self_comparison_corpus_ = c;
3624environment::get_self_comparison_debug_inputs(corpus_sptr& first_corpus,
3625 corpus_sptr& second_corpus)
3627 first_corpus = priv_->first_self_comparison_corpus_.lock();
3628 second_corpus = priv_->second_self_comparison_corpus_.lock();
3635environment::self_comparison_debug_is_on(
bool f)
3636{priv_->self_comparison_debug_on_ = f;}
3643environment::self_comparison_debug_is_on()
const
3644{
return priv_->self_comparison_debug_on_;}
3647#ifdef WITH_DEBUG_TYPE_CANONICALIZATION
3654environment::debug_type_canonicalization_is_on(
bool flag)
3655{priv_->debug_type_canonicalization_ = flag;}
3663environment::debug_type_canonicalization_is_on()
const
3664{
return priv_->debug_type_canonicalization_;}
3672environment::debug_die_canonicalization_is_on(
bool flag)
3673{priv_->debug_die_canonicalization_ = flag;}
3681environment::debug_die_canonicalization_is_on()
const
3682{
return priv_->debug_die_canonicalization_;}
3698const vector<type_base_sptr>*
3725 if (!types ||index >= types->size())
3727 return (*types)[index].get();
3730#ifdef WITH_DEBUG_SELF_COMPARISON
3740const unordered_map<string, uintptr_t>&
3741environment::get_type_id_canonical_type_map()
const
3742{
return priv_->get_type_id_canonical_type_map();}
3753unordered_map<string, uintptr_t>&
3754environment::get_type_id_canonical_type_map()
3755{
return priv_->get_type_id_canonical_type_map();}
3770const unordered_map<uintptr_t, string>&
3771environment::get_pointer_type_id_map()
const
3772{
return priv_->get_pointer_type_id_map();}
3787unordered_map<uintptr_t, string>&
3788environment::get_pointer_type_id_map()
3789{
return priv_->get_pointer_type_id_map();}
3807environment::get_type_id_from_pointer(uintptr_t ptr)
const
3808{
return priv_->get_type_id_from_pointer(ptr);}
3826environment::get_type_id_from_type(
const type_base *t)
const
3827{
return priv_->get_type_id_from_type(t);}
3844environment::get_canonical_type_from_type_id(
const char* type_id)
const
3845{
return priv_->get_canonical_type_from_type_id(type_id);}
3859 (
static_cast<unsigned>(l) |
static_cast<unsigned>(r));
3879 (
static_cast<unsigned>(l) &
static_cast<unsigned>(r));
3900 :priv_(new
priv(e, k))
3916{
return priv_->is_artificial_;}
3928{priv_->is_artificial_ = f;}
3939{
return priv_->kind();}
3959{
return priv_->rtti_;}
3968{
return priv_->rtti_;}
3980 priv_->type_or_decl_ptr_ = t;
3982 priv_->type_or_decl_ptr_ = d;
4005{
return priv_->type_or_decl_ptr_;}
4016{
return priv_->hash_value_;}
4019type_or_decl_base::set_hash_value(
hash_t h)
const
4020{priv_->set_hash_value(h);}
4027{
return priv_->env_;}
4045{priv_->artificial_location_ = l;}
4063{
return priv_->artificial_location_;}
4071 return (priv_->artificial_location_
4072 && priv_->artificial_location_.get_is_artificial());
4103{priv_->translation_unit_ = tu;}
4112{
return priv_->translation_unit_;}
4144 *dr =
dynamic_cast<const decl_base*
>(r);
4153 *tr =
dynamic_cast<const type_base*
>(r);
4198struct decl_base::priv
4200 bool in_pub_sym_tab_;
4228 decl_base_sptr declaration_;
4230 decl_base* naked_definition_of_declaration_;
4231 bool is_declaration_only_;
4235 : in_pub_sym_tab_(false),
4236 is_anonymous_(true),
4238 visibility_(VISIBILITY_DEFAULT),
4239 naked_definition_of_declaration_(),
4240 is_declaration_only_(false)
4243 priv(interned_string name, interned_string linkage_name,
visibility vis)
4244 : in_pub_sym_tab_(false),
4247 qualified_name_(name),
4248 linkage_name_(linkage_name),
4250 naked_definition_of_declaration_(),
4251 is_declaration_only_(false)
4253 is_anonymous_ = name_.
empty();
4278 const string& linkage_name,
4281 priv_(new priv(e.intern(name), e.intern(linkage_name), vis))
4305 priv_(new priv(name, linkage_name, vis))
4332{
return priv_->qualified_name_;}
4341{priv_->qualified_name_.clear();}
4348{priv_->qualified_name_ = n;}
4361{
return priv_->temporary_qualified_name_;}
4375{priv_->temporary_qualified_name_ = n;}
4382{
return priv_->context_;}
4389{
return priv_->context_;}
4393{priv_->context_ = c;}
4402{
return priv_->in_pub_sym_tab_;}
4410{priv_->in_pub_sym_tab_ = f;}
4430{
return priv_->location_;}
4472 priv_->location_ = l;
4482 priv_->is_anonymous_ = n.empty();
4493{
return priv_->is_anonymous_;}
4503{priv_->is_anonymous_ = f;}
4540{
return priv_->naming_typedef_;}
4568 &&
is_type(
this)->get_naked_canonical_type() ==
nullptr);
4570 priv_->naming_typedef_ = t;
4577 update_qualified_name(
this);
4585{
return priv_->linkage_name_;}
4594 priv_->linkage_name_ = env.
intern(m);
4602{
return priv_->visibility_;}
4609{priv_->visibility_ = v;}
4618 if (priv_->context_)
4619 return priv_->context_->get_scope();
4629{
return priv_->qualified_parent_name_;}
4636{
return priv_->name_;}
4671 bool qualified_name)
const
4675 && has_generic_anonymous_internal_type_name(
this))
4686 string name = get_generic_anonymous_internal_type_name(
this);
4722 if (priv_->internal_cached_repr_.empty())
4727 return priv_->internal_cached_repr_;
4730 if (priv_->cached_repr_.empty())
4736 return priv_->cached_repr_;
4756{
return priv_->qualified_name_;}
4770{
return priv_->scoped_name_;}
4778{
return priv_->declaration_;}
4787 if (d && d->get_is_declaration_only())
4788 priv_->declaration_ = d;
4798{
return priv_->definition_of_declaration_.lock();}
4814{
return priv_->naked_definition_of_declaration_;}
4821{
return priv_->is_declaration_only_;}
4831 bool update_types_lookup_map = !f && priv_->is_declaration_only_;
4833 priv_->is_declaration_only_ = f;
4835 if (update_types_lookup_map)
4838 scope_decl::declarations::iterator i;
4839 if (s->find_iterator_for_member(
this, i))
4849 return static_cast<change_kind>(
static_cast<unsigned>(l)
4850 |
static_cast<unsigned>(r));
4856 return static_cast<change_kind>(
static_cast<unsigned>(l)
4857 &
static_cast<unsigned>(r));
4904 bool member_types_or_functions =
4908 if (member_types_or_functions)
4917 la = r1->get_access_specifier();
4918 ra = r2->get_access_specifier();
4919 r1->set_access_specifier(no_access);
4920 r2->set_access_specifier(no_access);
4923 bool rels_are_different = *r1 != *r2;
4925 if (member_types_or_functions)
4928 r1->set_access_specifier(la);
4929 r2->set_access_specifier(ra);
4932 if (rels_are_different)
4967 if (!l_linkage_name.
empty() && !r_linkage_name.
empty())
4969 if (l_linkage_name != r_linkage_name)
5009 bool decls_are_same = (ln == rn);
5011 if (!decls_are_same)
5034{
return equals(*
this, other, 0);}
5073 if (!priv_->context_)
5076 priv_->context_->set_scope(scope);
5094 case decl_base::VISIBILITY_NONE:
5097 case decl_base::VISIBILITY_DEFAULT:
5100 case decl_base::VISIBILITY_PROTECTED:
5103 case decl_base::VISIBILITY_HIDDEN:
5106 case decl_base::VISIBILITY_INTERNAL:
5126 case decl_base::BINDING_NONE:
5129 case decl_base::BINDING_LOCAL:
5132 case decl_base::BINDING_GLOBAL:
5135 case decl_base::BINDING_WEAK:
5158 if (l.get() == r.get())
5194 if (l.get() == r.get())
5280{
return dynamic_pointer_cast<scope_decl>(d);}
5346 return c->get_access_specifier();
5376 c->set_access_specifier(a);
5406 return c->get_is_static();
5548 var_decl_sptr first = *klass->get_non_static_data_members().begin();
5569 if (!klass ||!data_member)
5572 for (class_or_union::data_members::const_iterator it =
5576 if (**it == *data_member)
5645 bool result =
false;
5663 dms[member->get_name()] = member;
5872 return class_or_union_sptr();
5881const class_or_union_sptr
5886 if (cou->get_is_anonymous())
5889 return class_or_union_sptr();
5898const class_or_union_sptr
5903 return class_or_union_sptr();
5912const class_or_union_sptr
5927 return class_or_union_sptr();
5952 for (
auto anon_dm_m : cl->get_non_static_data_members())
5999 ctxt_rel->set_offset_in_bits(o);
6014 return ctxt_rel->get_offset_in_bits();
6104 const var_decl *containing_anonymous_data_member =
6107 uint64_t containing_anonymous_data_member_offset = 0;
6108 if (containing_anonymous_data_member)
6109 containing_anonymous_data_member_offset =
6112 return (ctxt_rel->get_offset_in_bits()
6114 containing_anonymous_data_member_offset);
6142 type_base_sptr t = v->get_type();
6145 return t->get_size_in_bits();
6159 ctxt_rel->set_is_laid_out(l);
6174 return ctxt_rel->get_is_laid_out();
6435set_member_function_vtable_offset(
function_decl& f, ssize_t s)
6457{
return set_member_function_vtable_offset(*f, s);}
6476 return ctxt->is_virtual();
6503set_member_function_is_virtual(
function_decl& f,
bool is_virtual)
6513 ctxt->is_virtual(is_virtual);
6526 set_member_function_is_virtual(*fn, is_virtual);
6545 set_member_function_vtable_offset(fn, voffset);
6546 set_member_function_is_virtual(fn, is_virtual);
6577 set_member_function_vtable_offset(fn, voffset);
6578 set_member_function_is_virtual(fn, is_virtual);
6615 if (!cl->get_canonical_type())
6621 type_base_sptr t = type;
6632 ty->get_size_in_bits(),
6633 ty->get_alignment_in_bits(),
6634 ty->get_location()));
6642 ty->get_size_in_bits(),
6643 ty->get_alignment_in_bits(),
6644 ty->get_location()));
6653 ty->get_location()));
6659 t.reset(
new array_type_def(p, ty->get_subranges(), ty->get_location()));
6664 for (function_decl::parameters::const_iterator i =
6665 ty->get_parameters().begin();
6666 i != ty->get_parameters().end();
6677 p->get_variadic_marker(),
6678 p->get_is_artificial()));
6679 parm.push_back(stripped);
6684 parm, ty->get_is_const(),
6685 ty->get_size_in_bits(),
6686 ty->get_alignment_in_bits()));
6691 for (function_decl::parameters::const_iterator i =
6692 ty->get_parameters().begin();
6693 i != ty->get_parameters().end();
6704 p->get_variadic_marker(),
6705 p->get_is_artificial()));
6706 parm.push_back(stripped);
6711 ty->get_size_in_bits(),
6712 ty->get_alignment_in_bits()));
6715 if (!t->get_translation_unit())
6716 t->set_translation_unit(type->get_translation_unit());
6721 return t->get_canonical_type() ? t->get_canonical_type() : t;
6744 decl_base_sptr result = t;
6745 type_base_sptr u = t->get_underlying_type();
6748 if ((t->get_cv_quals() & qualified_type_def::CV_CONST
6750 || (t->get_cv_quals() & qualified_type_def::CV_CONST
6752 || t->get_cv_quals() == qualified_type_def::CV_NONE)
6798static qualified_type_def_sptr
6799strip_redundant_quals_from_underyling_types(
const qualified_type_def_sptr& t,
6808 qualified_type_def_sptr underlying_qualified_type =
6816 currated_quals &= ~redundant_quals;
6817 t->set_cv_quals(currated_quals);
6821 redundant_quals |= currated_quals;
6823 qualified_type_def_sptr result = t;
6824 if (underlying_qualified_type)
6828 strip_redundant_quals_from_underyling_types(underlying_qualified_type,
6862strip_redundant_quals_from_underyling_types(
const qualified_type_def_sptr& t)
6868 strip_redundant_quals_from_underyling_types(t, redundant_quals);
6895 return t->get_underlying_type();
6949 return t->get_pointed_to_type();
7005 return t->get_pointed_to_type();
7130 if (t->get_cv_quals() == qualified_type_def::CV_CONST)
7163 return q->get_underlying_type();
7212 type_base_sptr type = t;
7235 type_base_sptr typ = type;
7297 bool peel_qual_type)
7336 bool peel_qual_type)
7374 vector<array_type_def::subrange_sptr> subranges;
7376 for (vector<array_type_def::subrange_sptr>::const_iterator i =
7377 array->get_subranges().begin();
7378 i != array->get_subranges().end();
7384 (*i)->get_lower_bound(),
7385 (*i)->get_upper_bound(),
7386 (*i)->get_underlying_type(),
7387 (*i)->get_location(),
7388 (*i)->get_language()));
7389 subrange->is_non_finite((*i)->is_non_finite());
7392 subranges.push_back(subrange);
7397 subranges, array->get_location()));
7420 (
new typedef_decl(t->get_name(), t->get_underlying_type(),
7421 t->get_location(), t->get_linkage_name(),
7422 t->get_visibility()));
7438qualified_type_def_sptr
7444 qualified_type_def_sptr result
7446 t->get_cv_quals(), t->get_location()));
7458static type_base_sptr
7459clone_typedef_array_qualified_type(type_base_sptr type)
7465 type_base_sptr result;
7474 return type_base_sptr();
7497 type_base_sptr result = clone_typedef_array_qualified_type(t);
7500 type_base_sptr subtree;
7504 clone_typedef_array_qualified_type(type->get_underlying_type());
7508 type->set_underlying_type(subtree);
7514 clone_typedef_array_qualified_type(type->get_element_type());
7518 type->set_element_type(subtree);
7528 clone_typedef_array_qualified_type(t->get_underlying_type());
7535 t->set_underlying_type (s);
7544 clone_typedef_array_qualified_type(t->get_underlying_type());
7551 t->set_underlying_type(s);
7559 type_base_sptr e = t->get_element_type();
7563 clone_typedef_array_qualified_type(e);
7569 t->set_element_type(s);
7588 ::qualified_name_setter setter;
7596update_qualified_name(decl_base_sptr d)
7597{
return update_qualified_name(d.get());}
7617{
return reinterpret_cast<size_t>(l);}
7619struct scope_decl::priv
7628 bool clear_sorted_member_types_cache_ =
false;
7665{
return priv_->canonical_types_;}
7683 if (priv_->sorted_canonical_types_.empty())
7685 for (canonical_type_sptr_set_type::const_iterator e =
7689 priv_->sorted_canonical_types_.push_back(*e);
7692 std::stable_sort(priv_->sorted_canonical_types_.begin(),
7693 priv_->sorted_canonical_types_.end(),
7696 return priv_->sorted_canonical_types_;
7706{
return priv_->members_;}
7715{
return priv_->members_;}
7726 if (priv_->sorted_members_.empty())
7731 priv_->sorted_members_.push_back(*i);
7733 std::stable_sort(priv_->sorted_members_.begin(),
7734 priv_->sorted_members_.end(),
7737 return priv_->sorted_members_;
7752 if (t->get_is_anonymous())
7770 if (t->get_is_anonymous())
7788 if (t->get_is_anonymous())
7799{
return priv_->member_scopes_;}
7806{
return priv_->member_scopes_;}
7828maybe_set_translation_unit(
const decl_base_sptr& decl,
7845 decl->set_translation_unit(tu);
7862 member->set_scope(
this);
7863 priv_->members_.push_back(member);
7866 priv_->member_types_.push_back(
is_type(member));
7867 priv_->clear_sorted_member_types_cache_ =
true;
7871 priv_->member_scopes_.push_back(m);
7873 update_qualified_name(member);
7876 maybe_set_translation_unit(member, tu);
7888{
return priv_->member_types_;}
7903 return type_base_sptr();
7913 declarations::iterator before)
7919 priv_->member_types_.push_back(t);
7920 priv_->clear_sorted_member_types_cache_=
true;
7956 for (
auto i = priv_->member_types_.begin();
7957 i != priv_->member_types_.end();
7962 priv_->member_types_.erase(i);
7975 if (priv_->clear_sorted_member_types_cache_)
7977 priv_->sorted_member_types_.clear();
7978 priv_->clear_sorted_member_types_cache_ =
false;
7981 if (priv_->sorted_member_types_.empty())
7983 unordered_set<type_base_sptr> canonical_pointer_types;
7987 priv_->sorted_member_types_.push_back(t);
7988 else if (
auto c = t->get_canonical_type())
7989 canonical_pointer_types.insert(c);
7991 canonical_pointer_types.insert(t);
7994 for (
auto t : canonical_pointer_types)
7995 priv_->sorted_member_types_.push_back(t);
7998 std::stable_sort(priv_->sorted_member_types_.begin(),
7999 priv_->sorted_member_types_.end(),
8005 priv_->clear_sorted_member_types_cache_ =
true;
8007 return priv_->sorted_member_types_;
8023 declarations::iterator before)
8027 member->set_scope(
this);
8028 priv_->members_.insert(before, member);
8031 priv_-> member_scopes_.push_back(m);
8033 update_qualified_name(member);
8036 maybe_set_translation_unit(member, tu);
8049 for (declarations::iterator i = priv_->members_.begin();
8050 i != priv_->members_.end();
8055 priv_->members_.erase(i);
8065 for (scopes::iterator i = priv_->member_scopes_.begin();
8066 i != priv_->member_scopes_.end();
8071 priv_->member_scopes_.erase(i);
8077 member->set_scope(
nullptr);
8078 member->set_translation_unit(
nullptr);
8105 if (!l.decl_base::operator==(r))
8114 scope_decl::declarations::const_iterator i, j;
8156 return equals(*
this, *other, 0);
8171 if (l.get() == r.get())
8197 declarations::iterator& i)
8212 if ((*it).get() == decl)
8232 declarations::iterator& i)
8249 if (v.visit_begin(
this))
8252 for (scope_decl::declarations::const_iterator i =
8256 if (!(*i)->traverse(v))
8260 return v.visit_end(
this);
8263scope_decl::~scope_decl()
8279 if (scope && decl && !decl->
get_scope())
8319 scope_decl::declarations::iterator before,
8322 if (scope && decl && !decl->
get_scope())
8341 scope_decl::declarations::iterator before,
8351 | ABSTRACT_DECL_BASE
8352 | ABSTRACT_SCOPE_DECL),
8355 translation_unit_(tu)
8357 runtime_type_instance(
this);
8376 return scope ?
dynamic_cast<global_scope*
> (scope) : 0;
8483 if (cv_quals & qualified_type_def::CV_RESTRICT)
8485 if (cv_quals & qualified_type_def::CV_CONST)
8491 if (cv_quals & qualified_type_def::CV_VOLATILE)
8543{
return get_name(tod.get(), qualified);}
8561 string qualified_name;
8565 if (qualified_name.empty())
8566 qualified_name = name;
8568 qualified_name = qualified_name +
"::" + name;
8570 return qualified_name;
8605 location loc = decl->get_location();
8609 if (c->get_is_declaration_only() && c->get_definition_of_declaration())
8612 loc = c->get_location();
8670has_generic_anonymous_internal_type_name(
const decl_base *d)
8687static interned_string
8688get_generic_anonymous_internal_type_name(
const decl_base *d)
8690 ABG_ASSERT(has_generic_anonymous_internal_type_name(d));
8692 const environment&env = d->get_environment();
8694 interned_string result;
8727get_internal_real_type_name(
const type_base* t)
8737 name = int_type.to_string(
true);
8780 r += get_generic_anonymous_internal_type_name(d);
8790 return env.
intern(get_internal_real_type_name(t));
8799 internal, qualified));
8838 bool qualified,
bool internal)
8841 string tn =
get_type_name(pointed_to_type, qualified, internal);
8860 bool lvalue_reference,
8861 bool qualified,
bool internal)
8865 string name =
get_type_name(pointed_to_type, qualified, internal);
8866 if (lvalue_reference)
8891 bool qualified,
bool internal)
8893 const environment& env = underlying_type->get_environment();
8896 string name =
get_type_name(underlying_type, qualified, internal);
8898 if (quals_repr.empty() && internal)
8910 if (!quals_repr.empty())
8919 name = quals_repr +
" " + name;
8976 std::ostringstream o;
8985 stream_pretty_representation_of_fn_parms(fn_type, o,
8988 return env.
intern(o.str());
9007 c->get_exported_decls_builder();
9008 if (b->fn_id_maps_to_several_fns(fn))
9064 std::ostringstream o;
9083 o <<
" (" << class_type->get_qualified_name(internal) <<
"::*) ";
9084 stream_pretty_representation_of_fn_parms(fn_type, o,
9088 return env.
intern(o.str());
9254 std::ostringstream o;
9272 std::ostringstream o;
9327 const string& indent,
9330 bool qualified_names)
9333 string local_indent =
" ";
9338 if (!internal && clazz->is_struct())
9344 repr = indent +
"union";
9377 for (class_or_union::data_members::const_iterator dm = dmems.begin();
9381 if (dm != dmems.begin())
9386 real_indent =
"\n" + indent + local_indent;
9393 real_indent, one_line, internal, qualified_names);
9398 if (dm != dmems.begin())
9399 repr += real_indent;
9400 repr += (*dm)->get_pretty_representation(internal,
9405 real_indent+ (*dm)->get_pretty_representation(internal,
9414 repr += indent +
"}";
9442 const string& indent,
9445 bool qualified_names)
9449 internal, qualified_names);
9471 const string& indent,
9474 bool qualified_names)
9503 const string& indent,
bool one_line,
9504 bool qualified_names)
9507 std::ostringstream o;
9508 string local_indent =
" ";
9510 repr = indent +
"enum ";
9513 o << (qualified_names
9527 o << enumerator.get_name() +
"=" << enumerator.get_value() <<
", ";
9531 o <<
"\n" + indent <<
"}";
9562 const string& indent,
bool one_line,
9563 bool qualified_names)
9569 one_line, qualified_names);
9594 const string& indent,
bool one_line,
9595 bool qualified_names)
9624 const string& indent,
9627 bool qualified_name)
9633 internal, qualified_name);
9662 std::ostringstream o;
9677 o <<
" :" << std::endl;
9681 if (b->get_is_virtual())
9683 o << b->get_base_class()->get_qualified_name()
9687 o << std::hex << *h << std::dec;
9698 <<
" // translation unit: "
9703 <<
" // @: " << std::hex <<
is_type(c)
9709 o << std::hex << *h << std::dec;
9719 << member_type->get_pretty_representation(
false,
9722 if (member_type->get_canonical_type())
9724 o <<
" // uses canonical type: '@"
9725 << std::hex << member_type->get_canonical_type().get() <<
"'";
9728 o << std::hex << *h << std::dec;
9748 if (t && t->get_canonical_type())
9749 o <<
" // uses canonical type '@"
9750 << std::hex << t->get_canonical_type().get() <<
"'";
9755 o << std::hex << *h << std::dec;
9766 o <<
" // virtual member functions\n\n";
9775 o << std::hex << *h << std::dec;
9778 o <<
";" << std::endl;
9782 o <<
"};" << std::endl;
9788 string name = e->get_qualified_name();
9789 std::ostringstream o;
9790 o <<
"enum " << name
9792 << e->get_underlying_type()->get_pretty_representation(
false,
9796 <<
" // size in bits: " << e->get_size_in_bits() <<
"\n"
9797 <<
" // is-declaration-only: " << e->get_is_declaration_only() <<
"\n"
9799 <<
" // translation unit: "
9800 << e->get_translation_unit()->get_absolute_path() <<
"\n"
9801 <<
" // @: " << std::hex <<
is_type(e)
9802 <<
", @canonical: " << e->get_canonical_type().get() << std::dec <<
"\n"
9807 o << std::hex << *h << std::dec;
9813 for (
const auto &enom : e->get_enumerators())
9814 o <<
" " << enom.get_name() <<
" = " << enom.get_value() <<
",\n";
9822 std::ostringstream o;
9823 o << t->get_pretty_representation(
true,
9830 return artifact->get_pretty_representation(
true,
9929 return const_cast<type_base*
>(artifact);
9946 return const_cast<decl_base*
>(artifact);
9976debug_comp_vec(
const vector<const type_base*>& vect, std::ostringstream& o)
9980 o <<
"|" << t->get_pretty_representation()
9981 <<
"@" << std::hex << t << std::dec;
9993print_comp_stack(
const environment& env)
9995 std::ostringstream o;
9996 o <<
"left-operands: ";
9997 debug_comp_vec(env.priv_->left_type_comp_operands_, o);
9998 o <<
"\n" <<
"right-operands: ";
9999 debug_comp_vec(env.priv_->right_type_comp_operands_, o);
10012 std::cerr << print_comp_stack(env);
10013 std::cerr << std::endl;
10048{
return dynamic_cast<const decl_base*
>(t);}
10066{
return dynamic_pointer_cast<decl_base>(t);}
10082 const type_base_sptr type2)
10084 if (!type1 || !type2)
10087 if (type1 == type2)
10120 const decl_base_sptr d2)
10278 const string& name)
10283 if (!containing_class_or_union)
10300{
return (decl &&
dynamic_cast<template_decl*
>(decl->get_scope()));}
10310 return (decl && (dynamic_pointer_cast<type_tparameter>(decl)
10311 || dynamic_pointer_cast<non_type_tparameter>(decl)
10312 || dynamic_pointer_cast<template_tparameter>(decl)));
10342{
return dynamic_pointer_cast<function_decl>(d);}
10365{
return dynamic_pointer_cast<function_decl::parameter>(tod);}
10376 if (d && (d->
kind() & type_or_decl_base::ABSTRACT_DECL_BASE))
10378 if (!(d->
kind() & type_or_decl_base::ABSTRACT_TYPE_BASE))
10404{
return dynamic_pointer_cast<decl_base>(d);}
10426{
return dynamic_pointer_cast<decl_base>(t);}
10436 if (
dynamic_cast<const type_base*
>(&tod))
10449 if (t && (t->
kind() & type_or_decl_base::ABSTRACT_TYPE_BASE))
10463{
return dynamic_pointer_cast<type_base>(tod);}
10495 if (!cou->get_naming_typedef())
10537{
return dynamic_cast<const type_decl*
>(t);}
10545{
return dynamic_pointer_cast<type_decl>(t);}
10639{
return dynamic_pointer_cast<typedef_decl>(t);}
10720{
return dynamic_pointer_cast<enum_type_decl>(d);}
10774 if (t->
kind() & type_or_decl_base::CLASS_TYPE)
10788{
return dynamic_pointer_cast<class_decl>(d);}
10810 if (array->is_non_finite())
10880 if (array->get_subranges().size() == 1
10881 && array->get_subranges()[0]->get_length() == 1)
10951 return klass->get_is_declaration_only();
11000shared_ptr<class_or_union>
11002{
return dynamic_pointer_cast<class_or_union>(t);}
11031 const class_or_union_sptr& second)
11061{
return dynamic_pointer_cast<union_decl>(t);}
11075 bool look_through_qualifiers)
11081 if (look_through_qualifiers)
11099 bool look_through_qualifiers)
11101 type_base_sptr type =
is_type(t);
11102 if (look_through_qualifiers)
11104 return dynamic_pointer_cast<pointer_type_def>(type);
11247 bool look_through_qualifiers)
11253 if (look_through_qualifiers)
11270 bool look_through_qualifiers)
11274 if (look_through_qualifiers)
11291 bool look_through_qualifiers)
11293 type_base_sptr type =
is_type(t);
11294 if (look_through_qualifiers)
11296 return dynamic_pointer_cast<reference_type_def>(type);
11307 bool look_through_qualifiers)
11310 if (look_through_qualifiers)
11327 bool look_through_qualifiers)
11329 type_base_sptr type =
is_type(t);
11330 if (look_through_qualifiers)
11332 return dynamic_pointer_cast<ptr_to_mbr_type>(type);
11406const type_base_sptr
11409 type_base_sptr nil;
11413 if (t->get_environment().get_void_pointer_type().get() == t.get())
11442qualified_type_def_sptr
11444{
return dynamic_pointer_cast<qualified_type_def>(t);}
11454{
return dynamic_pointer_cast<function_type>(t);}
11484{
return dynamic_pointer_cast<method_type>(t);}
11564 decl_base_sptr decl;
11571 while (decl->get_is_declaration_only()
11572 && decl->get_definition_of_declaration())
11573 decl = decl->get_definition_of_declaration();
11640 decl_base_sptr d =
is_decl(t);
11665{
return dynamic_pointer_cast<var_decl>(decl);}
11674{
return dynamic_pointer_cast<namespace_decl>(d);}
11708 && dynamic_pointer_cast<function_decl>(decl)
11719 bool look_through_qualifiers)
11723 if (look_through_qualifiers)
11735 bool look_through_qualifiers)
11737 type_base_sptr t =
is_type(type);
11739 if (look_through_qualifiers)
11741 return dynamic_pointer_cast<array_type_def>(t);
11750qualified_type_def_sptr
11754 return qualified_type_def_sptr();
11824{
return dynamic_pointer_cast<array_type_def::subrange_type>(type);}
11834{
return decl && dynamic_pointer_cast<template_decl>(decl);}
11840 LOOKUP_ENTITY_TYPE,
11872find_next_delim_in_cplus_type(
const string& fqn,
11876 int angle_count = 0;
11877 bool found =
false;
11879 for (; i < fqn.size(); ++i)
11883 else if (fqn[i] ==
'>')
11885 else if (i + 1 < fqn.size()
11888 && fqn[i+1] ==
':')
11905 list<string>& comps)
11907 string::size_type fqn_size = fqn.size(), comp_begin = 0, comp_end = fqn_size;
11910 if (!find_next_delim_in_cplus_type(fqn, comp_begin, comp_end))
11911 comp_end = fqn_size;
11913 string comp = fqn.substr(comp_begin, comp_end - comp_begin);
11914 comps.push_back(comp);
11916 comp_begin = comp_end + 2;
11917 if (comp_begin >= fqn_size)
11933 for (list<string>::const_iterator c = comps.begin();
11936 if (c == comps.begin())
11939 result +=
"::" + *c;
11954template<
typename T>
11956iterator_is_last(T& container,
11957 typename T::const_iterator i)
11959 typename T::const_iterator next = i;
11961 return (next == container.end());
11978lookup_types_in_map(
const interned_string& type_name,
11981 istring_type_base_wptrs_map_type::const_iterator i = type_map.find(type_name);
11982 if (i != type_map.end())
12003template <
class TypeKind>
12004static shared_ptr<TypeKind>
12005lookup_type_in_map(
const interned_string& type_name,
12008 istring_type_base_wptrs_map_type::const_iterator i = type_map.find(type_name);
12009 if (i != type_map.end())
12013 for (
auto j : i->second)
12015 type_base_sptr t(j);
12016 decl_base_sptr d =
is_decl(t);
12017 if (d && !d->get_is_declaration_only())
12018 return dynamic_pointer_cast<TypeKind>(type_base_sptr(j));
12023 return dynamic_pointer_cast<TypeKind>(type_base_sptr(i->second.back()));
12025 return shared_ptr<TypeKind>();
12042 return lookup_type_in_map<type_decl>(type_name,
12101 return lookup_type_in_map<class_decl>(type_name,
12119 return lookup_type_in_map<union_decl>(type_name,
12154 union_decl_sptr result = lookup_type_in_map<union_decl>(loc, m);
12187 return lookup_type_in_map<enum_type_decl>(type_name,
12226 return lookup_type_in_map<typedef_decl>(type_name,
12262qualified_type_def_sptr
12267 return lookup_type_in_map<qualified_type_def>(type_name,
12286qualified_type_def_sptr
12313 return lookup_type_in_map<pointer_type_def>(type_name,
12375 return lookup_type_in_map<reference_type_def>(type_name,
12394 bool lvalue_reference,
12419 return lookup_type_in_map<array_type_def>(type_name,
12439 return lookup_type_in_map<function_type>(type_name,
12485const type_base_sptr
12489 type_base_sptr result;
12528const type_base_sptr
12552const type_base_sptr
12556 list<string> comps;
12569const decl_base_sptr
12573 list<string> comps;
12589template<
typename NodeKind>
12601{
return node->get_name();}
12621{
return node->get_name();}
12630template<
typename NodeKind>
12631static decl_base_sptr
12632convert_node_to_decl(shared_ptr<NodeKind> node);
12645template<
typename NodeKind>
12647lookup_node_in_scope(
const list<string>& fqn,
12651 shared_ptr<NodeKind> node;
12652 bool it_is_last =
false;
12655 for (list<string>::const_iterator c = fqn.begin(); c != fqn.end(); ++c)
12658 it_is_last = iterator_is_last(fqn, c);
12659 for (scope_decl::declarations::const_iterator m =
12660 cur_scope->get_member_decls().begin();
12661 m != cur_scope->get_member_decls().end();
12667 scope = dynamic_pointer_cast<scope_decl>(*m);
12668 if (scope && scope->get_name() == *c)
12677 node = dynamic_pointer_cast<NodeKind>(*m);
12681 dynamic_pointer_cast<class_decl>(node))
12682 if (cl->get_is_declaration_only()
12683 && !cl->get_definition_of_declaration())
12685 resulting_decl = node;
12690 if (!new_scope && !resulting_decl)
12691 return decl_base_sptr();
12692 cur_scope = new_scope;
12695 return resulting_decl;
12716const type_base_sptr
12719{
return is_type(lookup_node_in_scope<type_base>(comps, scope));}
12743static const type_base_sptr
12745 const vector<scope_decl*>& access_path,
12748 vector<scope_decl*> a = access_path;
12749 type_base_sptr result;
12754 first_scope = a.back();
12762 for (scope_decl::declarations::const_iterator i =
12766 if (
is_type(*i) && (*i)->get_name() == n)
12774 first_scope = a.back();
12775 interned_string scope_name, cur_scope_name = first_scope->
get_name();
12776 for (scope_decl::scopes::const_iterator i =
12781 scope_name = (*i)->get_name();
12782 if (scope_name == cur_scope_name)
12808static const type_base_sptr
12810 const scope_decl* scope)
12813 return type_base_sptr();
12817 vector<scope_decl*> access_path;
12818 for (scope_decl* s = type_decl->get_scope(); s != 0; s = s->get_scope())
12820 access_path.push_back(s);
12846const type_base_sptr
12861const decl_base_sptr
12864{
return is_var_decl(lookup_node_in_scope<var_decl>(comps, skope));}
12877template<
typename NodeKind>
12879lookup_node_in_translation_unit(
const list<string>& fqn,
12897{
return is_type(lookup_node_in_translation_unit<type_base>(fqn, tu));}
12917{
return is_class_type(lookup_node_in_translation_unit<class_decl>(fqn, tu));}
12930lookup_basic_type_through_translation_units(
const interned_string& type_name,
12931 const corpus& abi_corpus)
12935 for (translation_units::const_iterator tu =
12955static union_decl_sptr
12956lookup_union_type_through_translation_units(
const interned_string& type_name,
12957 const corpus & abi_corpus)
12959 union_decl_sptr result;
12961 for (translation_units::const_iterator tu =
12962 abi_corpus.get_translation_units().begin();
12963 tu != abi_corpus.get_translation_units().end();
12982lookup_enum_type_through_translation_units(
const interned_string& type_name,
12983 const corpus & abi_corpus)
12987 for (translation_units::const_iterator tu =
12988 abi_corpus.get_translation_units().begin();
12989 tu != abi_corpus.get_translation_units().end();
13006lookup_typedef_type_through_translation_units(
const interned_string& type_name,
13007 const corpus & abi_corpus)
13011 for (translation_units::const_iterator tu =
13012 abi_corpus.get_translation_units().begin();
13013 tu != abi_corpus.get_translation_units().end();
13030static qualified_type_def_sptr
13031lookup_qualified_type_through_translation_units(
const interned_string& t_name,
13032 const corpus & abi_corpus)
13034 qualified_type_def_sptr result;
13036 for (translation_units::const_iterator tu =
13037 abi_corpus.get_translation_units().begin();
13038 tu != abi_corpus.get_translation_units().end();
13056lookup_pointer_type_through_translation_units(
const interned_string& type_name,
13057 const corpus & abi_corpus)
13061 for (translation_units::const_iterator tu =
13062 abi_corpus.get_translation_units().begin();
13063 tu != abi_corpus.get_translation_units().end();
13081lookup_reference_type_through_translation_units(
const interned_string& t_name,
13082 const corpus & abi_corpus)
13086 for (translation_units::const_iterator tu =
13087 abi_corpus.get_translation_units().begin();
13088 tu != abi_corpus.get_translation_units().end();
13106lookup_array_type_through_translation_units(
const interned_string& type_name,
13107 const corpus & abi_corpus)
13111 for (translation_units::const_iterator tu =
13112 abi_corpus.get_translation_units().begin();
13113 tu != abi_corpus.get_translation_units().end();
13131lookup_function_type_through_translation_units(
const interned_string& type_name,
13132 const corpus & abi_corpus)
13136 for (translation_units::const_iterator tu =
13137 abi_corpus.get_translation_units().begin();
13138 tu != abi_corpus.get_translation_units().end();
13156 const corpus& abi_corpus)
13158 type_base_sptr result;
13160 for (translation_units::const_iterator tu =
13181 const string& tu_path,
13184 string_tu_map_type::const_iterator i = corp.priv_->path_tu_map.find(tu_path);
13185 if (i == corp.priv_->path_tu_map.end())
13186 return type_base_sptr();
13215 for (translation_units::const_iterator i =
13261 result = lookup_type_in_map<type_decl>(qualified_name, m);
13263 result = lookup_basic_type_through_translation_units(qualified_name, corp);
13283 result = lookup_type_in_map<type_decl>(loc, m);
13374 class_decl_sptr result = lookup_type_in_map<class_decl>(qualified_name, m);
13392 return lookup_types_in_map(qualified_name, m);
13418 for (
auto type : *v)
13420 type_base_sptr t(type);
13422 if (c->get_is_declaration_only()
13423 && !c->get_definition_of_declaration())
13424 result.push_back(type);
13427 return !result.empty();
13443 return lookup_types_in_map(qualified_name, m);
13524 union_decl_sptr result = lookup_type_in_map<union_decl>(type_name, m);
13526 result = lookup_union_type_through_translation_units(type_name, corp);
13605 lookup_type_in_map<enum_type_decl>(qualified_name, m);
13607 result = lookup_enum_type_through_translation_units(qualified_name, corp);
13625 return lookup_types_in_map(qualified_name, m);
13730 lookup_type_in_map<typedef_decl>(qualified_name, m);
13732 result = lookup_typedef_type_through_translation_units(qualified_name,
13827qualified_type_def_sptr
13842qualified_type_def_sptr
13848 qualified_type_def_sptr result =
13849 lookup_type_in_map<qualified_type_def>(qualified_name, m);
13852 result = lookup_qualified_type_through_translation_units(qualified_name,
13894 lookup_type_in_map<pointer_type_def>(qualified_name, m);
13896 result = lookup_pointer_type_through_translation_units(qualified_name,
13944 lookup_type_in_map<reference_type_def>(qualified_name, m);
13946 result = lookup_reference_type_through_translation_units(qualified_name,
13993 lookup_type_in_map<array_type_def>(qualified_name, m);
13995 result = lookup_array_type_through_translation_units(qualified_name, corp);
14064 lookup_type_in_map<function_type>(qualified_name, m);
14066 result = lookup_function_type_through_translation_units(qualified_name,
14089 type_base_sptr result;
14122 type_base_sptr result;
14170 return type_base_sptr();
14187template<
typename TypeKind>
14191 bool use_type_name_as_key =
true)
14195 if (use_type_name_as_key)
14197 else if (
location l = type->get_location())
14199 string str = l.expand();
14200 s = type->get_environment().intern(str);
14203 istring_type_base_wptrs_map_type::iterator i = types_map.find(s);
14204 bool result =
false;
14206 if (i == types_map.end())
14208 types_map[s].push_back(type);
14212 i->second.push_back(type);
14233 bool use_type_name_as_key)
14237 bool update_qname_map =
true;
14238 if (type->get_is_declaration_only())
14244 is_class_type(class_type->get_definition_of_declaration()))
14248 if (!update_qname_map)
14252 if (use_type_name_as_key)
14254 string qname = type->get_qualified_name();
14255 s = type->get_environment().intern(qname);
14257 else if (
location l = type->get_location())
14259 string str = l.expand();
14260 s = type->get_environment().intern(str);
14263 bool result =
false;
14264 istring_type_base_wptrs_map_type::iterator i = map.find(s);
14265 if (i == map.end())
14267 map[s].push_back(type);
14271 i->second.push_back(type);
14297 bool result =
false;
14299 istring_type_base_wptrs_map_type::iterator i = types_map.find(s);
14300 if (i == types_map.end())
14302 types_map[s].push_back(type);
14306 i->second.push_back(type);
14326 maybe_update_types_lookup_map<type_decl>
14329 if (
corpus *type_corpus = basic_type->get_corpus())
14331 maybe_update_types_lookup_map<type_decl>
14333 type_corpus->priv_->get_types().basic_types());
14335 maybe_update_types_lookup_map<type_decl>
14337 type_corpus->get_type_per_loc_map().basic_types(),
14342 maybe_update_types_lookup_map<type_decl>
14344 group->priv_->get_types().basic_types());
14346 maybe_update_types_lookup_map<type_decl>
14348 group->get_type_per_loc_map().basic_types(),
14373 if (
corpus *type_corpus = class_type->get_corpus())
14377 type_corpus->priv_->get_types().class_types());
14381 type_corpus->get_type_per_loc_map().class_types(),
14388 group->priv_->get_types().class_types());
14392 group->get_type_per_loc_map().class_types(),
14413 maybe_update_types_lookup_map<union_decl>
14416 if (
corpus *type_corpus = union_type->get_corpus())
14418 maybe_update_types_lookup_map<union_decl>
14420 type_corpus->priv_->get_types().union_types());
14422 maybe_update_types_lookup_map<union_decl>
14424 type_corpus->get_type_per_loc_map().union_types(),
14429 maybe_update_types_lookup_map<union_decl>
14431 group->priv_->get_types().union_types());
14433 maybe_update_types_lookup_map<union_decl>
14435 group->get_type_per_loc_map().union_types(),
14456 maybe_update_types_lookup_map<enum_type_decl>
14459 if (
corpus *type_corpus = enum_type->get_corpus())
14461 maybe_update_types_lookup_map<enum_type_decl>
14463 type_corpus->priv_->get_types().enum_types());
14465 maybe_update_types_lookup_map<enum_type_decl>
14467 type_corpus->get_type_per_loc_map().enum_types(),
14472 maybe_update_types_lookup_map<enum_type_decl>
14474 group->priv_->get_types().enum_types());
14476 maybe_update_types_lookup_map<enum_type_decl>
14478 group->get_type_per_loc_map().enum_types(),
14500 maybe_update_types_lookup_map<typedef_decl>
14503 if (
corpus *type_corpus = typedef_type->get_corpus())
14505 maybe_update_types_lookup_map<typedef_decl>
14507 type_corpus->priv_->get_types().typedef_types());
14509 maybe_update_types_lookup_map<typedef_decl>
14511 type_corpus->get_type_per_loc_map().typedef_types(),
14516 maybe_update_types_lookup_map<typedef_decl>
14518 group->priv_->get_types().typedef_types());
14520 maybe_update_types_lookup_map<typedef_decl>
14522 group->get_type_per_loc_map().typedef_types(),
14543 maybe_update_types_lookup_map<qualified_type_def>
14546 if (
corpus *type_corpus = qualified_type->get_corpus())
14548 maybe_update_types_lookup_map<qualified_type_def>
14550 type_corpus->priv_->get_types().qualified_types());
14554 maybe_update_types_lookup_map<qualified_type_def>
14556 group->priv_->get_types().qualified_types());
14576 maybe_update_types_lookup_map<pointer_type_def>
14579 if (
corpus *type_corpus = pointer_type->get_corpus())
14581 maybe_update_types_lookup_map<pointer_type_def>
14583 type_corpus->priv_->get_types().pointer_types());
14587 maybe_update_types_lookup_map<pointer_type_def>
14589 group->priv_->get_types().pointer_types());
14609 maybe_update_types_lookup_map<ptr_to_mbr_type>
14612 if (
corpus *type_corpus = ptr_to_member->get_corpus())
14614 maybe_update_types_lookup_map<ptr_to_mbr_type>
14616 type_corpus->priv_->get_types().ptr_to_mbr_types());
14620 maybe_update_types_lookup_map<ptr_to_mbr_type>
14622 group->priv_->get_types().ptr_to_mbr_types());
14642 maybe_update_types_lookup_map<reference_type_def>
14645 if (
corpus *type_corpus = reference_type->get_corpus())
14647 maybe_update_types_lookup_map<reference_type_def>
14649 type_corpus->priv_->get_types().reference_types());
14653 maybe_update_types_lookup_map<reference_type_def>
14655 group->priv_->get_types().reference_types());
14675 maybe_update_types_lookup_map<array_type_def>
14678 if (
corpus *type_corpus = array_type->get_corpus())
14680 maybe_update_types_lookup_map<array_type_def>
14682 type_corpus->priv_->get_types().array_types());
14684 maybe_update_types_lookup_map<array_type_def>
14686 type_corpus->get_type_per_loc_map().array_types(),
14691 maybe_update_types_lookup_map<array_type_def>
14693 group->priv_->get_types().array_types());
14695 maybe_update_types_lookup_map<array_type_def>
14697 group->get_type_per_loc_map().array_types(),
14719 maybe_update_types_lookup_map<array_type_def::subrange_type>
14722 if (
corpus *type_corpus = subrange_type->get_corpus())
14724 maybe_update_types_lookup_map<array_type_def::subrange_type>
14726 type_corpus->priv_->get_types().subrange_types());
14728 maybe_update_types_lookup_map<array_type_def::subrange_type>
14730 type_corpus->get_type_per_loc_map().subrange_types(),
14733 if (
corpus *group = subrange_type->get_corpus())
14735 maybe_update_types_lookup_map<array_type_def::subrange_type>
14737 group->priv_->get_types().subrange_types());
14739 maybe_update_types_lookup_map<array_type_def::subrange_type>
14741 group->get_type_per_loc_map().subrange_types(),
14766 if (
corpus *type_corpus = fn_type->get_corpus())
14770 type_corpus->priv_->get_types().function_types());
14772 if (
corpus *group = fn_type->get_corpus())
14776 group->priv_->get_types().function_types());
14869 type_base_sptr result;
14877 type_base_sptr underlying_type =
14880 if (underlying_type)
14883 qual->get_cv_quals(),
14884 qual->get_location()));
14889 type_base_sptr pointed_to_type =
14892 if (pointed_to_type)
14895 p->get_size_in_bits(),
14896 p->get_alignment_in_bits(),
14897 p->get_location()));
14902 type_base_sptr pointed_to_type =
14904 if (pointed_to_type)
14908 r->get_size_in_bits(),
14909 r->get_alignment_in_bits(),
14910 r->get_location()));
14924 tu.priv_->synthesized_types_.push_back(result);
14957 type_base_sptr result_return_type;
14962 if (!result_return_type)
14966 type_base_sptr parm_type;
14968 for (function_type::parameters::const_iterator i =
14973 type_base_sptr t = (*i)->get_type();
14980 (*i)->get_location(),
14981 (*i)->get_variadic_marker(),
14982 (*i)->get_is_artificial()));
14983 parms.push_back(parm);
14986 class_or_union_sptr class_type;
14998 result_fn_type.reset(
new method_type(result_return_type,
15010 tu.priv_->synthesized_types_.push_back(result_fn_type);
15014 return result_fn_type;
15025 if (mangled_name.empty())
15030 char * str = abi::__cxa_demangle(mangled_name.c_str(),
15031 NULL, &l, &status);
15032 string demangled_name = mangled_name;
15036 demangled_name = str;
15040 return demangled_name;
15065global_scope::~global_scope()
15086types_defined_same_linux_kernel_corpus_public(
const type_base& t1,
15087 const type_base& t2)
15089 const corpus *t1_corpus = t1.get_corpus(), *t2_corpus = t2.get_corpus();
15090 string t1_file_path, t2_file_path;
15094 if (!(t1_corpus && t2_corpus
15095 && t1_corpus == t2_corpus
15096 && (t1_corpus->get_origin() & corpus::LINUX_KERNEL_BINARY_ORIGIN)
15101 class_or_union *c1 = 0, *c2 = 0;
15107 if ((c1 && c1->get_is_anonymous() && !c1->get_naming_typedef())
15108 || (c2 && c2->get_is_anonymous() && !c2->get_naming_typedef()))
15115 && c1->get_is_anonymous() && c1->get_naming_typedef()
15116 && c2->get_is_anonymous() && c2->get_naming_typedef())
15117 if (c1->get_naming_typedef()->get_name()
15118 != c2->get_naming_typedef()->get_name())
15124 if (e1->get_is_anonymous() || e2->get_is_anonymous())
15134 if (c1->get_is_declaration_only() != c2->get_is_declaration_only())
15136 if (c1->get_environment().decl_only_class_equals_definition())
15146 if (t1.get_size_in_bits() != t2.get_size_in_bits())
15155 l = c1->get_location();
15157 l =
dynamic_cast<const decl_base&
>(t1).
get_location();
15159 unsigned line = 0, col = 0;
15161 l.
expand(t1_file_path, line, col);
15163 l = c2->get_location();
15165 l =
dynamic_cast<const decl_base&
>(t2).
get_location();
15167 l.
expand(t2_file_path, line, col);
15170 if (t1_file_path.empty() || t2_file_path.empty())
15173 if (t1_file_path == t2_file_path)
15209compare_types_during_canonicalization(
const type_base& canonical_type,
15210 const type_base& candidate_type)
15212#ifdef WITH_DEBUG_TYPE_CANONICALIZATION
15213 const environment& env = canonical_type.get_environment();
15214 if (env.debug_type_canonicalization_is_on())
15216 bool canonical_equality =
false, structural_equality =
false;
15217 env.priv_->allow_type_comparison_results_caching(
false);
15218 env.priv_->use_canonical_type_comparison_ =
false;
15219 structural_equality = canonical_type == candidate_type;
15220 env.priv_->use_canonical_type_comparison_ =
true;
15221 canonical_equality = canonical_type == candidate_type;
15222 env.priv_->allow_type_comparison_results_caching(
true);
15223 if (canonical_equality != structural_equality)
15225 std::cerr <<
"structural & canonical equality different for type: "
15226 << canonical_type.get_pretty_representation(
true,
true)
15230 return structural_equality;
15233 return canonical_type == candidate_type;
15257compare_canonical_type_against_candidate(
const type_base& canonical_type,
15258 const type_base& candidate_type)
15260 environment& env =
const_cast<environment&
>(canonical_type.get_environment());
15278 bool saved_decl_only_class_equals_definition =
15279 env.decl_only_class_equals_definition();
15283 env.decl_only_class_equals_definition(
false);
15284 env.priv_->allow_type_comparison_results_caching(
true);
15285 bool equal = (types_defined_same_linux_kernel_corpus_public(canonical_type,
15287 || compare_types_during_canonicalization(canonical_type,
15292 env.priv_->clear_type_comparison_results_cache();
15293 env.priv_->allow_type_comparison_results_caching(
false);
15294 env.decl_only_class_equals_definition
15295 (saved_decl_only_class_equals_definition);
15320compare_canonical_type_against_candidate(
const type_base* canonical_type,
15321 const type_base* candidate_type)
15323 return compare_canonical_type_against_candidate(*canonical_type,
15348compare_canonical_type_against_candidate(
const type_base_sptr& canonical_type,
15349 const type_base_sptr& candidate_type)
15351 return compare_canonical_type_against_candidate(canonical_type.get(),
15352 candidate_type.get());
15372static type_base_sptr
15373candidate_matches_a_canonical_type_hash(
const vector<type_base_sptr>& cncls,
15376 if (type.get_corpus()
15377 && type.get_corpus()->get_origin() == corpus::NATIVE_XML_ORIGIN
15386 for (
const auto& c : cncls)
15392 if (compare_canonical_type_against_candidate(*c, type))
15396 for (
const auto& c : cncls)
15401 if (compare_canonical_type_against_candidate(*c, type))
15451type_base::get_canonical_type_for(type_base_sptr t)
15460 return type_base_sptr();
15466 bool decl_only_class_equals_definition =
15479 if (decl_only_class_equals_definition)
15482 return type_base_sptr();
15485 if (t->get_canonical_type())
15486 return t->get_canonical_type();
15507 string repr = t->get_cached_pretty_representation(
true);
15512 type_base_sptr canonical_type_present_in_corpus;
15516 type_base_sptr result;
15517 environment::canonical_types_map_type::iterator i = types.find(repr);
15519 if (i == types.end())
15521 vector<type_base_sptr> v;
15528 vector<type_base_sptr> &v = i->second;
15533 result = candidate_matches_a_canonical_type_hash(v, *t);
15541 for (vector<type_base_sptr>::const_reverse_iterator it = v.rbegin();
15542 !result && it != v.rend();
15545 bool equal = compare_canonical_type_against_candidate(*it, t);
15552#ifdef WITH_DEBUG_SELF_COMPARISON
15553 if (env.self_comparison_debug_is_on())
15557 corpus_sptr corp1, corp2;
15558 env.get_self_comparison_debug_inputs(corp1, corp2);
15560 && corp1->get_origin() != corp2->get_origin()
15561 && corp2->get_origin() & corpus::NATIVE_XML_ORIGIN)
15572 check_canonical_type_from_abixml_during_self_comp(t,
15578 uintptr_t should_have_canonical_type = 0;
15579 string type_id = env.get_type_id_from_type(t.get());
15580 if (type_id.empty())
15581 type_id =
"type-id-<not-found>";
15583 should_have_canonical_type =
15584 env.get_canonical_type_from_type_id(type_id.c_str());
15585 std::cerr <<
"error: wrong canonical type for '"
15594 <<
"'. Should have had canonical type: "
15596 << should_have_canonical_type
15603 uintptr_t ptr_val =
reinterpret_cast<uintptr_t
>(t.get());
15604 string type_id = env.get_type_id_from_pointer(ptr_val);
15605 if (type_id.empty())
15606 type_id =
"type-id-<not-found>";
15623 std::cerr <<
"error: wrong induced canonical type for '"
15625 <<
"' from second corpus"
15626 <<
", ptr: " << std::hex << t.get()
15627 <<
" type-id: " << type_id
15629 << *t->hash_value()
15639 if (t_hash != result_hash)
15641 std::cerr <<
"error: type hash mismatch"
15642 <<
" between type: '"
15648 << *t->hash_value()
15649 <<
" and its computed canonical type @"
15654 << *result->hash_value()
15669 t->priv_->canonical_type_index = v.size();
15698maybe_adjust_canonical_type(
const type_base_sptr& canonical,
15699 const type_base_sptr& type)
15701 if (type->get_naked_canonical_type())
15709 if (canonical_class
15710 && canonical_class.get() != cl.get())
15714 for (class_decl::member_functions::const_iterator i =
15715 cl->get_member_functions().begin();
15716 i != cl->get_member_functions().end();
15718 if ((*i)->get_symbol())
15721 find_member_function((*i)->get_linkage_name()))
15731 if (canonical_class->get_corpus()
15732 && cl->get_corpus()
15733 && (cl->get_corpus() == canonical_class->get_corpus()))
15747 for (
const auto& data_member : cl->get_data_members())
15754 const auto& canonical_data_member =
15755 canonical_class->find_data_member(data_member->get_name());
15756 if (!canonical_data_member)
15765 if (!canonical_data_member->get_symbol())
15766 canonical_data_member->set_symbol(sym);
15782 canonical_class = cl;
15785 if (canonical_class)
15787 if (
auto abi_corpus = canonical_class->get_corpus())
15789 for (
auto& fn : canonical_class->get_member_functions())
15793 if (sym->is_defined() && sym->is_public())
15795 fn->set_is_in_public_symbol_table(
true);
15796 auto b = abi_corpus->get_exported_decls_builder();
15797 b->maybe_add_fn_to_exported_fns(fn.get());
15799 else if (!sym->is_defined())
15800 abi_corpus->get_undefined_functions().insert(fn.get());
15812 if (type->get_is_artificial() != canonical->get_is_artificial())
15813 canonical->set_is_artificial(
false);
15843 if (t->get_canonical_type())
15844 return t->get_canonical_type();
15846 if (do_log && show_stats)
15847 std::cerr <<
"Canonicalization of type '"
15848 << t->get_pretty_representation(
true,
true)
15849 <<
"/@#" << std::hex << t.get() <<
": ";
15853 if (do_log && show_stats)
15855 type_base_sptr canonical = type_base::get_canonical_type_for(t);
15857 if (do_log && show_stats)
15860 if (do_log && show_stats)
15861 std::cerr << tmr <<
"\n";
15863 maybe_adjust_canonical_type(canonical, t);
15865 t->priv_->canonical_type = canonical;
15866 t->priv_->naked_canonical_type = canonical.get();
15869 if (!t->priv_->canonical_type_index)
15870 t->priv_->canonical_type_index = canonical->priv_->canonical_type_index;
15873 if (type_base_sptr d =
is_type(cl->get_earlier_declaration()))
15874 if ((canonical = d->get_canonical_type()))
15876 d->priv_->canonical_type = canonical;
15877 d->priv_->naked_canonical_type = canonical.get();
15894 if (type_base_sptr c =
is_type(scope)->get_canonical_type())
15909 t->on_canonical_type_set();
15920 priv_->definition_of_declaration_ = d;
15922 if (type_base_sptr canonical_type =
is_type(d)->get_canonical_type())
15923 t->priv_->canonical_type = canonical_type;
15925 priv_->naked_definition_of_declaration_ =
const_cast<decl_base*
>(d.get());
15935 priv_(new
priv(s, a))
15949 return do_hash(
this);
15961{
return priv_->canonical_type.lock();}
15977{
return priv_->naked_canonical_type;}
16004 if (priv_->internal_cached_repr_.
empty())
16009 return priv_->internal_cached_repr_;
16012 if (priv_->cached_repr_.
empty())
16018 return priv_->cached_repr_;
16056{
return equals(*
this, other, 0);}
16073{priv_->size_in_bits = s;}
16080{
return priv_->size_in_bits;}
16087{priv_->alignment_in_bits = a;}
16094{
return priv_->alignment_in_bits;}
16110 v.visit_begin(
this);
16111 bool result = v.visit_end(
this);
16117type_base::~type_base()
16136 static_cast<unsigned>(r));
16151 static_cast<unsigned>(r));
16208parse_real_type_modifier(
const string& word,
16211 if (word ==
"signed")
16213 else if (word ==
"unsigned")
16215 else if (word ==
"short")
16217 else if (word ==
"long")
16219 else if (word ==
"long long")
16237parse_base_real_type(
const string& type_name,
16240 if (type_name ==
"int")
16242 else if (type_name ==
"char")
16244 else if (type_name ==
"bool" || type_name ==
"_Bool")
16246 else if (type_name ==
"double")
16248 else if (type_name ==
"float")
16250 else if (type_name ==
"char16_t")
16252 else if (type_name ==
"char32_t")
16254 else if (type_name ==
"wchar_t")
16256 else if (type_name ==
"__ARRAY_SIZE_TYPE__")
16258 else if (type_name ==
"sizetype")
16259 base = real_type::SIZE_BASE_TYPE;
16260 else if (type_name ==
"ssizetype")
16261 base = real_type::SSIZE_BASE_TYPE;
16262 else if (type_name ==
"bitsizetype")
16263 base = real_type::BIT_SIZE_BASE_TYPE;
16264 else if (type_name ==
"sbitsizetype")
16265 base = real_type::SBIT_SIZE_BASE_TYPE;
16289 string input = type_name;
16290 string::size_type len = input.length();
16291 string::size_type cur_pos = 0, prev_pos = 0;
16292 string cur_word, prev_word;
16295 while (cur_pos < len)
16297 if (cur_pos < len && isspace(input[cur_pos]))
16300 while (cur_pos < len && isspace(input[cur_pos]));
16302 prev_pos = cur_pos;
16303 cur_pos = input.find(
' ', prev_pos);
16304 prev_word = cur_word;
16305 cur_word = input.substr(prev_pos, cur_pos - prev_pos);
16308 && cur_word ==
"long"
16309 && prev_word !=
"long")
16311 if (cur_pos < len && isspace(input[cur_pos]))
16314 while (cur_pos < len && isspace(input[cur_pos]));
16315 prev_pos = cur_pos;
16317 cur_pos = input.find(
' ', prev_pos);
16318 string saved_prev_word = prev_word;
16319 prev_word = cur_word;
16320 cur_word = input.substr(prev_pos, cur_pos - prev_pos);
16321 if (cur_word ==
"long")
16322 cur_word =
"long long";
16325 cur_pos = prev_pos;
16326 cur_word = prev_word;
16327 prev_word = saved_prev_word;
16331 if (!parse_real_type_modifier(cur_word, modifiers))
16333 if (!parse_base_real_type(cur_word, base))
16364 real_type int_type(base_type, modifiers);
16371 : base_(INT_BASE_TYPE),
16372 modifiers_(NO_MODIFIER)
16381 : base_(b), modifiers_(m)
16389 : base_(INT_BASE_TYPE),
16390 modifiers_(NO_MODIFIER)
16408{
return modifiers_;}
16425{
return base_ == other.base_ && modifiers_ == other.modifiers_;}
16443 result +=
"signed ";
16445 result +=
"unsigned ";
16456 result +=
"short ";
16460 result +=
"long long ";
16471 result +=
"double";
16475 result +=
"char16_t";
16477 result +=
"char32_t";
16479 result +=
"wchar_t";
16481 result +=
"__ARRAY_SIZE_TYPE__";
16482 else if (base_ == SIZE_BASE_TYPE)
16483 result +=
"sizetype";
16484 else if (base_ == SSIZE_BASE_TYPE)
16485 result +=
"ssizetype";
16486 else if (base_ == BIT_SIZE_BASE_TYPE)
16487 result +=
"bitsizetype";
16488 else if (base_ == SBIT_SIZE_BASE_TYPE)
16489 result +=
"sbitsizetype";
16498real_type::operator string()
const
16499{
return to_string();}
16522 const string& name,
16523 size_t size_in_bits,
16524 size_t alignment_in_bits,
16526 const string& linkage_name,
16531 | ABSTRACT_TYPE_BASE
16532 | ABSTRACT_DECL_BASE),
16533 decl_base(env, name, locus, linkage_name, vis),
16534 type_base(env, size_in_bits, alignment_in_bits)
16540 real_type int_type(base_type, modifiers);
16545 string real_type_name = int_type;
16593 bool result =
false;
16624 return *
this == *other;
16652 return *
this == other;
16698 if (l.get() == r.get())
16726 bool internal)
const
16750 if (decl_base::priv_->internal_qualified_name_.
empty())
16751 decl_base::priv_->internal_qualified_name_ =
16752 env.
intern(get_internal_real_type_name(
this));
16753 return decl_base::priv_->internal_qualified_name_;
16757 decl_base::priv_->temporary_internal_qualified_name_ =
16758 env.
intern(get_internal_real_type_name(
this));
16759 return decl_base::priv_->temporary_internal_qualified_name_;
16785 bool qualified_name)
const
16789 return get_internal_real_type_name(
this);
16791 if (qualified_name)
16809 v.visit_begin(
this);
16810 bool result = v.visit_end(
this);
16816type_decl::~type_decl()
16836 const string& name,
16837 size_t size_in_bits,
16838 size_t alignment_in_bits,
16842 ABSTRACT_SCOPE_TYPE_DECL
16843 | ABSTRACT_TYPE_BASE
16844 | ABSTRACT_DECL_BASE),
16846 type_base(env, size_in_bits, alignment_in_bits),
16915 return *
this == *other;
16939 if (v.visit_begin(
this))
16942 for (scope_decl::declarations::const_iterator i =
16946 if (!(*i)->traverse(v))
16951 bool result = v.visit_end(
this);
16957scope_type_decl::~scope_type_decl()
16973 const string& name,
16984 | ABSTRACT_DECL_BASE
16985 | ABSTRACT_SCOPE_DECL),
17011 bool qualified_name)
const
17053 if (!ns->is_empty_or_has_empty_sub_namespaces())
17074 if (v.visit_begin(
this))
17077 scope_decl::declarations::const_iterator i;
17083 dynamic_pointer_cast<ir_traversable_base>(*i);
17085 if (!t->traverse (v))
17090 return v.visit_end(
this);
17093namespace_decl::~namespace_decl()
17102class qualified_type_def::priv
17113 weak_ptr<type_base> underlying_type_;
17116 : cv_quals_(CV_NONE)
17121 : cv_quals_(quals),
17122 underlying_type_(t)
17174qualified_type_def::qualified_type_def(type_base_sptr type,
17179 | ABSTRACT_TYPE_BASE
17180 | ABSTRACT_DECL_BASE),
17181 type_base(type->get_environment(), type->get_size_in_bits(),
17182 type->get_alignment_in_bits()),
17183 decl_base(type->get_environment(),
"", locus,
"",
17184 dynamic_pointer_cast<
decl_base>(type)->get_visibility()),
17185 priv_(new priv(quals, type))
17204 | ABSTRACT_TYPE_BASE
17205 | ABSTRACT_DECL_BASE),
17209 priv_(new priv(quals))
17246 s = ut->get_size_in_bits();
17275 bool result =
true;
17342 return *
this == *other;
17360 return *
this == *other;
17375 bool internal)
const
17403 if (priv_->temporary_internal_name_.empty())
17404 priv_->temporary_internal_name_ =
17406 return priv_->temporary_internal_name_;
17422 if (priv_->internal_name_.empty())
17423 priv_->internal_name_ =
17426 return priv_->internal_name_;
17455 if (v.visit_begin(
this))
17462 bool result = v.visit_end(
this);
17467qualified_type_def::~qualified_type_def()
17474{
return priv_->cv_quals_;}
17479{priv_->cv_quals_ = cv_quals;}
17493{
return priv_->underlying_type_.lock();}
17502 priv_->underlying_type_ = t;
17512 scope_decl::declarations::iterator i;
17513 if (s->find_iterator_for_member(
this, i))
17528operator==(
const qualified_type_def_sptr& l,
const qualified_type_def_sptr& r)
17530 if (l.get() == r.get())
17546operator!=(
const qualified_type_def_sptr& l,
const qualified_type_def_sptr& r)
17554 (
static_cast<unsigned>(lhs) |
static_cast<unsigned>(rhs));
17578 (
static_cast<unsigned>(lhs) &
static_cast<unsigned>(rhs));
17600 case qualified_type_def::CV_NONE:
17603 case qualified_type_def::CV_CONST:
17606 case qualified_type_def::CV_VOLATILE:
17609 case qualified_type_def::CV_RESTRICT:
17623struct pointer_type_def::priv
17630 priv(
const type_base_sptr& t)
17632 naked_pointed_to_type_(t.get())
17636 : naked_pointed_to_type_()
17661pointer_type_def::pointer_type_def(
const type_base_sptr& pointed_to,
17662 size_t size_in_bits,
17663 size_t align_in_bits,
17667 | ABSTRACT_TYPE_BASE
17668 | ABSTRACT_DECL_BASE),
17669 type_base(pointed_to->get_environment(), size_in_bits, align_in_bits),
17670 decl_base(pointed_to->get_environment(),
"", locus,
""),
17671 priv_(new priv(pointed_to))
17677 const environment& env = pointed_to->get_environment();
17678 decl_base_sptr pto = dynamic_pointer_cast<decl_base>(pointed_to);
17679 string name = (pto ? pto->get_name() : string(
"void")) +
"*";
17697pointer_type_def::pointer_type_def(
const environment& env,
size_t size_in_bits,
17698 size_t alignment_in_bits,
17702 | ABSTRACT_TYPE_BASE
17703 | ABSTRACT_DECL_BASE),
17704 type_base(env, size_in_bits, alignment_in_bits),
17709 string name = string(
"void") +
"*";
17734 priv_->pointed_to_type_ = t;
17735 priv_->naked_pointed_to_type_ = t.get();
17740 decl_base_sptr pto = dynamic_pointer_cast<decl_base>(t);
17741 string name = (pto ? pto->get_name() : string(
"void")) +
"*";
17778 bool result = p1 == p2;
17820 return *
this == *o;
17841const type_base_sptr
17843{
return priv_->pointed_to_type_.lock();}
17850{
return priv_->naked_pointed_to_type_;}
17888 if (priv_->internal_qualified_name_.empty())
17889 if (pointed_to_type)
17890 priv_->internal_qualified_name_ =
17891 pointer_declaration_name(
this,
17898 return priv_->internal_qualified_name_;
17906 if (pointed_to_type)
17907 if (priv_->temp_internal_qualified_name_.empty())
17908 priv_->temp_internal_qualified_name_ =
17909 pointer_declaration_name(
this,
17916 return priv_->temp_internal_qualified_name_;
17925 (pointer_declaration_name(
this,
17937 if (pointed_to_type)
17939 (pointer_declaration_name(
this,
17964 if (v.visit_begin(
this))
17972 bool result = v.visit_end(
this);
17977pointer_type_def::~pointer_type_def()
17994 if (l.get() == r.get())
18022struct reference_type_def::priv
18030 priv(
const type_base_sptr& t,
bool is_lvalue)
18032 is_lvalue_(is_lvalue)
18035 priv(
bool is_lvalue)
18036 : is_lvalue_(is_lvalue)
18065reference_type_def::reference_type_def(
const type_base_sptr pointed_to,
18067 size_t size_in_bits,
18068 size_t align_in_bits,
18072 | ABSTRACT_TYPE_BASE
18073 | ABSTRACT_DECL_BASE),
18074 type_base(pointed_to->get_environment(), size_in_bits, align_in_bits),
18075 decl_base(pointed_to->get_environment(),
"", locus,
""),
18076 priv_(new priv(pointed_to, lvalue))
18082 decl_base_sptr pto = dynamic_pointer_cast<decl_base>(pointed_to);
18087 name = string(pto->get_name()) +
"&";
18095 const environment& env = pointed_to->get_environment();
18119reference_type_def::reference_type_def(
const environment& env,
bool lvalue,
18120 size_t size_in_bits,
18121 size_t alignment_in_bits,
18125 | ABSTRACT_TYPE_BASE
18126 | ABSTRACT_DECL_BASE),
18127 type_base(env, size_in_bits, alignment_in_bits),
18129 priv_(new priv(lvalue))
18132 string name =
"void&";
18161 priv_->pointed_to_type_ = pointed_to_type;
18163 decl_base_sptr pto;
18165 {pto = dynamic_pointer_cast<decl_base>(pointed_to_type);}
18172 string name = string(pto->get_name()) +
"&";
18202 if (l.is_lvalue() != r.is_lvalue())
18212 type_base_sptr p1 = l.get_pointed_to_type(), p2 = r.get_pointed_to_type();
18215 bool result = p1 == p2;
18254 return *
this == *other;
18269 return *
this == *other;
18273reference_type_def::get_pointed_to_type()
const
18274{
return priv_->pointed_to_type_.lock();}
18277reference_type_def::is_lvalue()
const
18278{
return priv_->is_lvalue_;}
18308 type_base_sptr pointed_to_type = get_pointed_to_type();
18315 if (priv_->internal_qualified_name_.empty())
18316 if (pointed_to_type)
18317 priv_->internal_qualified_name_ =
18325 return priv_->internal_qualified_name_;
18333 if (pointed_to_type)
18334 if (priv_->temp_internal_qualified_name_.empty())
18335 priv_->temp_internal_qualified_name_ =
18343 return priv_->temp_internal_qualified_name_;
18363 if (pointed_to_type)
18393 bool qualified_name)
const
18397 (get_pointed_to_type()),
18421 if (v.visit_begin(
this))
18424 if (type_base_sptr t = get_pointed_to_type())
18429 bool result = v.visit_end(
this);
18434reference_type_def::~reference_type_def()
18451 if (l.get() == r.get())
18479struct ptr_to_mbr_type::priv
18483 type_base_sptr dm_type_;
18486 type_base_sptr containing_type_;
18493 priv(
const type_base_sptr& dm_type,
const type_base_sptr& containing_type)
18494 : dm_type_(dm_type),
18495 containing_type_(containing_type)
18517 const type_base_sptr& member_type,
18518 const type_base_sptr& containing_type,
18519 size_t size_in_bits,
18520 size_t alignment_in_bits,
18523 POINTER_TO_MEMBER_TYPE
18524 | ABSTRACT_TYPE_BASE
18525 | ABSTRACT_DECL_BASE),
18526 type_base(env, size_in_bits, alignment_in_bits),
18528 priv_(new priv(member_type, containing_type))
18565const type_base_sptr&
18567{
return priv_->dm_type_;}
18574const type_base_sptr&
18576{
return priv_->containing_type_;}
18606 return *
this == *other;
18621 return *
this == *other;
18633 bool internal)
const
18652 if (priv_->internal_qualified_name_.empty())
18653 priv_->internal_qualified_name_ =
18654 ptr_to_mbr_declaration_name(
this,
"",
18657 return priv_->internal_qualified_name_;
18661 priv_->temp_internal_qualified_name_ =
18662 ptr_to_mbr_declaration_name(
this,
"",
true, internal);
18663 return priv_->temp_internal_qualified_name_;
18669 (ptr_to_mbr_declaration_name(
this,
"",
true,
18691 if (v.visit_begin(
this))
18702 bool result = v.visit_end(
this);
18734 bool result =
true;
18736 if (!(l.decl_base::operator==(r)))
18775array_type_def::subrange_type::~subrange_type() =
default;
18784 : s_(UNSIGNED_SIGNEDNESS)
18793 : s_(UNSIGNED_SIGNEDNESS)
18802 : s_(SIGNED_SIGNEDNESS)
18810enum array_type_def::subrange_type::bound_value::signedness
18834{
return v_.unsigned_;}
18842 s_ = UNSIGNED_SIGNEDNESS;
18852 s_ = SIGNED_SIGNEDNESS;
18864 return s_ == v.s_ && v_.unsigned_ == v.v_.unsigned_;
18869struct array_type_def::subrange_type::priv
18879 : upper_bound_(ub), language_(l), infinite_(false)
18882 priv(bound_value lb, bound_value ub,
18884 : lower_bound_(lb), upper_bound_(ub),
18885 language_(l), infinite_(false)
18888 priv(bound_value lb, bound_value ub,
const type_base_sptr &u,
18890 : lower_bound_(lb), upper_bound_(ub), underlying_type_(u),
18891 language_(l), infinite_(false)
18910 const string& name,
18913 const type_base_sptr& utype,
18916 :
type_or_decl_base(env, SUBRANGE_TYPE | ABSTRACT_TYPE_BASE | ABSTRACT_DECL_BASE),
18923 priv_(new priv(lower_bound, upper_bound, utype, l))
18943 const string& name,
18948 :
type_or_decl_base(env, SUBRANGE_TYPE | ABSTRACT_TYPE_BASE | ABSTRACT_DECL_BASE),
18951 priv_(new priv(lower_bound, upper_bound, l))
18969 const string& name,
18973 :
type_or_decl_base(env, SUBRANGE_TYPE | ABSTRACT_TYPE_BASE | ABSTRACT_DECL_BASE),
18974 type_base(env, upper_bound.get_unsigned_value(), 0),
18976 priv_(new priv(upper_bound, l))
19001{
return priv_->underlying_type_.lock();}
19010 ABG_ASSERT(priv_->underlying_type_.expired());
19011 priv_->underlying_type_ = u;
19021{
return priv_->upper_bound_.get_signed_value();}
19028{
return priv_->lower_bound_.get_signed_value();}
19035{priv_->upper_bound_ = ub;}
19042{priv_->lower_bound_ = lb;}
19059 if (get_upper_bound() >= get_lower_bound())
19060 return get_upper_bound() - get_lower_bound() + 1;
19069{
return priv_->infinite_;}
19077{priv_->infinite_ = f;}
19084{
return priv_->language_;}
19092 std::ostringstream o;
19096 type_base_sptr underlying_type = get_underlying_type();
19097 if (underlying_type)
19099 o <<
"range "<< get_lower_bound() <<
" .. " << get_upper_bound();
19104 o <<
"[" << get_length() <<
"]";
19119 for (vector<subrange_sptr>::const_iterator i = v.begin();
19122 r += (*i)->as_string();
19151 bool result =
true;
19206 return *
this == *other;
19274 repr +=
"<anonymous range>";
19276 repr +=
"<range " +
get_name() +
">";
19277 repr += as_string();
19295 if (v.visit_begin(
this))
19298 if (type_base_sptr u = get_underlying_type())
19303 bool result = v.visit_end(
this);
19310struct array_type_def::priv
19317 priv(type_base_sptr t)
19322 : element_type_(t), subranges_(subs)
19342array_type_def::array_type_def(
const type_base_sptr e_type,
19343 const std::vector<subrange_sptr>& subs,
19347 | ABSTRACT_TYPE_BASE
19348 | ABSTRACT_DECL_BASE),
19351 priv_(new priv(e_type))
19375 const std::vector<subrange_sptr>& subs,
19379 | ABSTRACT_TYPE_BASE
19380 | ABSTRACT_DECL_BASE),
19408array_type_def::update_size()
19410 type_base_sptr e = priv_->element_type_.lock();
19413 size_t s = e->get_size_in_bits();
19417 s *= sub->get_length();
19425array_type_def::get_subrange_representation()
const
19451 bool qualified_name)
const
19453 return array_declaration_name(
this,
"",
19454 qualified_name, internal);
19479 std::vector<array_type_def::subrange_sptr > this_subs = l.
get_subranges();
19480 std::vector<array_type_def::subrange_sptr > other_subs = r.
get_subranges();
19482 bool result =
true;
19483 if (this_subs.size() != other_subs.size())
19492 std::vector<array_type_def::subrange_sptr >::const_iterator i,j;
19493 for (i = this_subs.begin(), j = other_subs.begin();
19494 i != this_subs.end() && j != other_subs.end();
19541 std::vector<array_type_def::subrange_sptr > this_subs = l->
get_subranges();
19542 std::vector<array_type_def::subrange_sptr > other_subs = r->
get_subranges();
19544 if (this_subs.size() != other_subs.size())
19547 std::vector<array_type_def::subrange_sptr >::const_iterator i,j;
19548 for (i = this_subs.begin(), j = other_subs.begin();
19549 i != this_subs.end() && j != other_subs.end();
19559 if (*first_element_type != *second_element_type)
19571 const std::vector<subrange_sptr>& subranges =
19574 if (subranges.empty())
19575 return translation_unit::LANG_C11;
19576 return subranges.front()->get_language();
19595 return *
this == *other;
19601const type_base_sptr
19603{
return priv_->element_type_.lock();}
19619 priv_->element_type_ = element_type;
19630 for (
const auto &sub : subs)
19631 priv_->subranges_.push_back(sub);
19643 if (priv_->subranges_.empty())
19646 for (std::vector<shared_ptr<subrange_type> >::const_iterator i =
19647 priv_->subranges_.begin();
19648 i != priv_->subranges_.end();
19650 if ((*i)->is_non_finite())
19657array_type_def::get_dimension_count()
const
19658{
return priv_->subranges_.size();}
19689 if (priv_->internal_qualified_name_.empty())
19690 priv_->internal_qualified_name_ =
19691 array_declaration_name(
this,
"",
19694 return priv_->internal_qualified_name_;
19698 priv_->temp_internal_qualified_name_ =
19699 array_declaration_name(
this,
"",
19701 return priv_->temp_internal_qualified_name_;
19718 (array_declaration_name(
this,
"",
19742 if (v.visit_begin(
this))
19750 bool result = v.visit_end(
this);
19756array_type_def::get_location()
const
19760const std::vector<array_type_def::subrange_sptr>&
19762{
return priv_->subranges_;}
19764array_type_def::~array_type_def()
19771class enum_type_decl::priv
19773 type_base_sptr underlying_type_;
19782 priv(type_base_sptr underlying_type,
19784 : underlying_type_(underlying_type),
19802enum_type_decl::enum_type_decl(
const string& name,
19804 type_base_sptr underlying_type,
19806 const string& linkage_name,
19810 | ABSTRACT_TYPE_BASE
19811 | ABSTRACT_DECL_BASE),
19812 type_base(underlying_type->get_environment(),
19813 underlying_type->get_size_in_bits(),
19814 underlying_type->get_alignment_in_bits()),
19815 decl_base(underlying_type->get_environment(),
19816 name, locus, linkage_name, vis),
19817 priv_(new priv(underlying_type, enums))
19823 e->set_enum_type(
this);
19843{
return priv_->underlying_type_;}
19848{
return priv_->enumerators_;}
19853{
return priv_->enumerators_;}
19861 if (priv_->sorted_enumerators_.empty())
19866 priv_->sorted_enumerators_.push_back(*e);
19868 std::sort(priv_->sorted_enumerators_.begin(),
19869 priv_->sorted_enumerators_.end(),
19873 if (l.get_name() == r.get_name())
19874 return l.get_value() < r.get_value();
19875 return (l.get_name() < r.get_name());
19879 return priv_->sorted_enumerators_;
19901 bool qualified_name)
const
19903 string r =
"enum ";
19933 if (v.visit_begin(
this))
19941 bool result = v.visit_end(
this);
19963 bool result =
false;
19973 enum_type_decl::enumerators::const_iterator i, j;
20006 if (!(l.decl_base::operator==(r) && l.type_base::operator==(r)))
20011 if (!l.decl_base::operator==(r))
20013 if (!l.type_base::operator==(r))
20085is_enumerator_value_present_in_enum(
const enum_type_decl::enumerator &enr,
20086 const enum_type_decl &enom,
20087 vector<enum_type_decl::enumerator>& redundant_enrs)
20089 bool found =
false;
20090 for (
const auto &e : enom.get_enumerators())
20091 if (enumerators_values_are_equal(e, enr))
20095 redundant_enrs.push_back(e);
20113is_enumerator_value_redundant(
const enum_type_decl::enumerator &enr,
20114 const enum_type_decl &enom)
20116 vector<enum_type_decl::enumerator> redundant_enrs;
20117 if (is_enumerator_value_present_in_enum(enr, enom, redundant_enrs))
20119 if (!redundant_enrs.empty())
20147 bool result =
true;
20163 if (!!def1 != !!def2)
20193 if (!(def1->decl_base::operator==(*def2)
20194 && def1->type_base::operator==(*def2)))
20199 if (!def1->decl_base::operator==(*def2))
20201 if (!def1->type_base::operator==(*def2))
20279 && (!is_enumerator_value_redundant(e, *def2)
20280 || !is_enumerator_value_redundant(e, *def1)))
20294 && (!is_enumerator_value_redundant(e, *def1)
20295 || !is_enumerator_value_redundant(e, *def2)))
20337 return *
this == *other;
20352 if (l.get() == r.get())
20354 decl_base_sptr o = r;
20371class enum_type_decl::enumerator::priv
20375 string qualified_name_;
20386 priv(
const string& name,
20388 enum_type_decl* e = 0)
20400enum_type_decl::enumerator::~enumerator() =
default;
20411 : priv_(new priv(name, value))
20418 : priv_(new priv(other.
get_name(),
20420 other.get_enum_type()))
20445 bool names_equal =
true;
20447 return names_equal && (get_value() == other.
get_value());
20466{
return priv_->name_;}
20484 if (priv_->qualified_name_.empty())
20486 priv_->qualified_name_ =
20487 get_enum_type()->get_qualified_name(internal)
20491 return priv_->qualified_name_;
20507{
return priv_->value_;}
20521{
return priv_->enum_type_;}
20528{priv_->enum_type_ = e;}
20534struct typedef_decl::priv
20538 priv(
const type_base_sptr& t)
20539 : underlying_type_(t)
20554typedef_decl::typedef_decl(
const string& name,
20555 const type_base_sptr underlying_type,
20557 const string& linkage_name,
20561 | ABSTRACT_TYPE_BASE
20562 | ABSTRACT_DECL_BASE),
20567 name, locus, linkage_name, vis),
20568 priv_(new priv(underlying_type))
20584typedef_decl::typedef_decl(
const string& name,
20587 const string& mangled_name,
20591 | ABSTRACT_TYPE_BASE
20592 | ABSTRACT_DECL_BASE),
20595 decl_base(env, name, locus, mangled_name, vis),
20596 priv_(new priv(nullptr))
20671 bool result =
true;
20675 if (!(l.decl_base::operator==(r)))
20722 return *
this == *other;
20744 bool qualified_name)
const
20747 string result =
"typedef ";
20748 if (qualified_name)
20761{
return priv_->underlying_type_.lock();}
20769 priv_->underlying_type_ = t;
20783 bool internal)
const
20801 return decl_base::priv_->internal_qualified_name_;
20803 return decl_base::priv_->qualified_name_;
20822 if (v.visit_begin(
this))
20830 bool result = v.visit_end(
this);
20835typedef_decl::~typedef_decl()
20841struct var_decl::priv
20854 priv(type_base_sptr t,
20857 naked_type_(t.get()),
20868 naked_type_ = t.get();
20885var_decl::var_decl(
const string& name,
20886 type_base_sptr type,
20888 const string& linkage_name,
20892 VAR_DECL | ABSTRACT_DECL_BASE),
20893 decl_base(type->get_environment(), name, locus, linkage_name, vis),
20894 priv_(new priv(type, bind))
20902const type_base_sptr
20904{
return priv_->type_.lock();}
20911{priv_->set_type(t);}
20922{
return priv_->naked_type_;}
20929{
return priv_->binding_;}
20936{priv_->binding_ = b;}
20952 priv_->symbol_ = sym;
20967{
return priv_->symbol_;}
21036 bool result =
true;
21049 else if (s0 && s0 != s1)
21057 bool symbols_are_equal = (s0 && s1 && result);
21059 if (symbols_are_equal)
21068 bool decl_bases_different = !l.decl_base::operator==(r);
21069 const_cast<var_decl&
>(l).set_qualified_name(n1);
21070 const_cast<var_decl&
>(r).set_qualified_name(n2);
21072 if (decl_bases_different)
21082 if (!l.decl_base::operator==(r))
21131 bool result =
true;
21167 return equals(*
this, *other, 0);
21182 if (priv_->id_.empty())
21187 sym_str = s->get_id_string();
21192 priv_->id_ = env.
intern(repr);
21193 if (!sym_str.empty())
21194 priv_->id_ = env.
intern(priv_->id_ +
"{" + sym_str +
"}");
21261 result =
"static ";
21265 bool member_of_anonymous_class =
false;
21268 member_of_anonymous_class =
true;
21277 if (member_of_anonymous_class || !qualified_name)
21284 string quals_repr =
21286 if (!quals_repr.empty())
21287 name = quals_repr +
" " + name;
21291 name = string(
" ") + name;
21293 result += array_declaration_name(t, name, qualified_name, internal);
21295 result += pointer_declaration_name(t, name, qualified_name, internal);
21297 result += pointer_declaration_name(t, name, qualified_name, internal);
21299 result += ptr_to_mbr_declaration_name(t, name,
21314 "",
true, internal);
21320 "",
true, internal);
21323 && (member_of_anonymous_class || !qualified_name))
21339 && (member_of_anonymous_class || !qualified_name))
21393 if (v.visit_begin(
this))
21396 if (type_base_sptr t =
get_type())
21400 return v.visit_end(
this);
21403var_decl::~var_decl()
21418 priv_->cached_name_.clear();
21419 priv_->internal_cached_name_.clear();
21439function_type::function_type(type_base_sptr return_type,
21441 size_t size_in_bits,
21442 size_t alignment_in_bits)
21444 FUNCTION_TYPE | ABSTRACT_TYPE_BASE),
21445 type_base(return_type->get_environment(), size_in_bits, alignment_in_bits),
21446 priv_(new
priv(parms, return_type))
21450 for (parameters::size_type i = 0, j = 1;
21451 i < priv_->parms_.size();
21454 if (i == 0 && priv_->parms_[i]->get_is_artificial())
21461 priv_->parms_[i]->set_index(j);
21472function_type::function_type(type_base_sptr return_type,
21473 size_t size_in_bits,
size_t alignment_in_bits)
21475 FUNCTION_TYPE | ABSTRACT_TYPE_BASE),
21476 type_base(return_type->get_environment(), size_in_bits, alignment_in_bits),
21477 priv_(new
priv(return_type))
21492 size_t size_in_bits,
21493 size_t alignment_in_bits)
21495 type_base(env, size_in_bits, alignment_in_bits),
21521{
return priv_->return_type_.lock();}
21529{priv_->return_type_ = t;}
21538{
return priv_->parms_;}
21581 for (parameters::size_type i = 0, j = 1;
21582 i < priv_->parms_.size();
21585 if (i == 0 && priv_->parms_[i]->get_is_artificial())
21592 priv_->parms_[i]->set_index(j);
21603 parm->set_index(priv_->parms_.size());
21604 priv_->parms_.push_back(parm);
21618 return (!priv_->parms_.empty()
21619 && priv_->parms_.back()->get_variadic_marker());
21651#define RETURN(value) CACHE_AND_RETURN_COMPARISON_RESULT(value)
21660 bool cached_result =
false;
21668 bool result =
true;
21670 if (!l.type_base::operator==(r))
21681 l_class = m->get_class_type().get();
21684 r_class = m->get_class_type().get();
21688 if (!!l_class != !!r_class)
21698 != r_class->get_qualified_name()))
21715 bool compare_result_types =
true;
21716 string l_rt_name = l_return_type_decl
21719 string r_rt_name = r_return_type_decl
21725 (r_class && (r_class->get_qualified_name() == r_rt_name)))
21726 compare_result_types =
false;
21728 if (compare_result_types)
21752 if (l_rt_name != r_rt_name)
21761 vector<shared_ptr<function_decl::parameter> >::const_iterator i,j;
21802function_type::parameters::const_iterator
21808 bool is_method =
dynamic_cast<const method_type*
>(
this);
21812 if (is_method && (*i)->get_is_artificial())
21824function_type::parameters::const_iterator
21851 if (priv_->internal_cached_name_.empty())
21852 priv_->internal_cached_name_ =
21854 return priv_->internal_cached_name_;
21858 priv_->temp_internal_cached_name_ =
21860 return priv_->temp_internal_cached_name_;
21867 if (priv_->cached_name_.empty())
21868 priv_->cached_name_ =
21870 return priv_->cached_name_;
21874 priv_->cached_name_ =
21876 return priv_->cached_name_;
21937 if (v.visit_begin(
this))
21940 bool keep_going =
true;
21944 if (!t->traverse(v))
21945 keep_going =
false;
21952 if (type_base_sptr parm_type = (*i)->get_type())
21953 if (!parm_type->traverse(v))
21958 return v.visit_end(
this);
21961function_type::~function_type()
21967struct method_type::priv
21969 class_or_union_wptr class_type_;
21997method_type::method_type (type_base_sptr return_type,
21998 class_or_union_sptr class_type,
21999 const std::vector<function_decl::parameter_sptr>& p,
22001 size_t size_in_bits,
22002 size_t alignment_in_bits)
22004 METHOD_TYPE | ABSTRACT_TYPE_BASE | FUNCTION_TYPE),
22005 type_base(class_type->get_environment(), size_in_bits, alignment_in_bits),
22006 function_type(return_type, p, size_in_bits, alignment_in_bits),
22037method_type::method_type(type_base_sptr return_type,
22038 type_base_sptr class_type,
22039 const std::vector<function_decl::parameter_sptr>& p,
22041 size_t size_in_bits,
22042 size_t alignment_in_bits)
22044 METHOD_TYPE | ABSTRACT_TYPE_BASE | FUNCTION_TYPE),
22045 type_base(class_type->get_environment(), size_in_bits, alignment_in_bits),
22046 function_type(return_type, p, size_in_bits, alignment_in_bits),
22062 size_t size_in_bits,
22063 size_t alignment_in_bits)
22065 type_base(env, size_in_bits, alignment_in_bits),
22085method_type::method_type(class_or_union_sptr class_type,
22087 size_t size_in_bits,
22088 size_t alignment_in_bits)
22090 METHOD_TYPE | ABSTRACT_TYPE_BASE | FUNCTION_TYPE),
22091 type_base(class_type->get_environment(), size_in_bits, alignment_in_bits),
22094 alignment_in_bits),
22121{
return class_or_union_sptr(priv_->class_type_);}
22134 priv_->class_type_ = t;
22162{priv_->is_const = f;}
22169{
return priv_->is_const;}
22185 if (!first_parm->get_is_artificial())
22188 type_base_sptr this_ptr_type = first_parm->get_type();
22196 type_base_sptr candidate_class_type =
22216struct function_decl::priv
22218 bool declared_inline_;
22226 : declared_inline_(false),
22232 bool declared_inline,
22234 : declared_inline_(declared_inline),
22237 naked_type_(t.get())
22241 bool declared_inline,
22244 : declared_inline_(declared_inline),
22247 naked_type_(t.get()),
22269 bool declared_inline,
22271 const string& mangled_name,
22275 FUNCTION_DECL | ABSTRACT_DECL_BASE),
22306 type_base_sptr fn_type,
22307 bool declared_inline,
22309 const string& linkage_name,
22313 FUNCTION_DECL | ABSTRACT_DECL_BASE),
22314 decl_base(fn_type->get_environment(), name, locus, linkage_name, vis),
22315 priv_(new priv(dynamic_pointer_cast<
function_type>(fn_type),
22337 bool qualified_name)
const
22342 string fn_prefix = mem_fn ?
"method ":
"function ";
22348 fn_prefix +=
"virtual ";
22350 decl_base_sptr return_type;
22357 return_type = mem_fn
22368 internal) +
" " + result;
22371 result = add_outer_pointer_to_fn_type_expr(p, result,
22376 result = add_outer_pointer_to_array_type_expr(p, result,
22383 return fn_prefix + result;
22413 result += mem_fn->
get_type()->get_class_type()->get_qualified_name()
22419 std::ostringstream fn_parms;
22420 stream_pretty_representation_of_fn_parms(*
get_type(),
22424 result += fn_parms.str();
22429 result +=
" const";
22440function_decl::parameters::const_iterator
22446 bool is_method =
dynamic_cast<const method_decl*
>(
this);
22459const shared_ptr<function_type>
22461{
return priv_->type_.lock();}
22476{
return priv_->naked_type_;}
22481 priv_->type_ = fn_type;
22482 priv_->naked_type_ = fn_type.get();
22499 priv_->symbol_ = sym;
22514{
return priv_->symbol_;}
22521{
return priv_->declared_inline_;}
22528{priv_->declared_inline_ = value;}
22531function_decl::get_binding()
const
22532{
return priv_->binding_;}
22535const shared_ptr<type_base>
22537{
return get_type()->get_return_type();}
22540const std::vector<shared_ptr<function_decl::parameter> >&
22542{
return get_type()->get_parameters();}
22549{
get_type()->append_parameter(parm);}
22557 for (std::vector<shared_ptr<parameter> >::const_iterator i = parms.begin();
22630 bool result =
true;
22634 if (t0 == t1 || *t0 == *t1)
22660 else if (s0 && s0 != s1)
22671 bool symbols_are_equal = (s0 && s1 && result);
22673 if (symbols_are_equal)
22685 bool decl_bases_different = !l.decl_base::operator==(r);
22692 if (decl_bases_different)
22702 if (!l.decl_base::operator==(r))
22714 if (l.get_binding() != r.get_binding())
22771 return equals(*
this, *o, 0);
22798 if (priv_->id_.empty())
22803 string virtual_member_suffix;
22813 virtual_member_suffix +=
"/o";
22816 if (s->has_aliases())
22823 priv_->id_ = env.
intern(s->get_id_string());
22825 if (!virtual_member_suffix.empty())
22826 priv_->id_ = env.
intern(priv_->id_ + virtual_member_suffix);
22870 if (v.visit_begin(
this))
22873 if (type_base_sptr t =
get_type())
22877 return v.visit_end(
this);
22899 if (l.get() == r.get())
22922struct function_decl::parameter::priv
22926 bool variadic_marker_;
22933 priv(type_base_sptr type,
22935 bool variadic_marker)
22938 variadic_marker_(variadic_marker)
22942function_decl::parameter::parameter(
const type_base_sptr type,
22944 const string& name,
22945 const location& loc,
22947 : type_or_decl_base(type->get_environment(),
22948 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
22949 decl_base(type->get_environment(), name, loc),
22950 priv_(new priv(type, index, is_variadic))
22952 runtime_type_instance(
this);
22955function_decl::parameter::parameter(
const type_base_sptr type,
22957 const string& name,
22958 const location& loc,
22960 bool is_artificial)
22961 : type_or_decl_base(type->get_environment(),
22962 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
22963 decl_base(type->get_environment(), name, loc),
22964 priv_(new priv(type, index, is_variadic))
22966 runtime_type_instance(
this);
22967 set_is_artificial(is_artificial);
22970function_decl::parameter::parameter(
const type_base_sptr type,
22971 const string& name,
22972 const location& loc,
22974 bool is_artificial)
22975 : type_or_decl_base(type->get_environment(),
22976 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
22977 decl_base(type->get_environment(), name, loc),
22978 priv_(new priv(type, 0, is_variadic))
22980 runtime_type_instance(
this);
22981 set_is_artificial(is_artificial);
22984function_decl::parameter::parameter(
const type_base_sptr type,
22987 : type_or_decl_base(type->get_environment(),
22988 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
22989 decl_base(type->get_environment(),
"", location()),
22990 priv_(new priv(type, index, variad))
22992 runtime_type_instance(
this);
22995function_decl::parameter::~parameter() =
default;
22997const type_base_sptr
22998function_decl::parameter::get_type()
const
22999{
return priv_->type_.lock();}
23026 if (get_variadic_marker()
23046 std::ostringstream o;
23047 o <<
"parameter-" << get_index();
23049 return env.
intern(o.str());
23053function_decl::parameter::get_index()
const
23054{
return priv_->index_;}
23057function_decl::parameter::set_index(
unsigned i)
23058{priv_->index_ = i;}
23062function_decl::parameter::get_variadic_marker()
const
23063{
return priv_->variadic_marker_;}
23089 bool result =
true;
23091 if ((l.get_variadic_marker() != r.get_variadic_marker())
23092 || (l.get_index() != r.get_index())
23093 || (!!l.get_type() != !!r.get_type()))
23098 if (l.get_index() != r.get_index())
23100 if (l.get_variadic_marker() != r.get_variadic_marker()
23101 || !!l.get_type() != !!r.get_type())
23108 type_base_sptr l_type = l.get_type();
23109 type_base_sptr r_type = r.get_type();
23111 if (l_type != r_type)
23129function_decl::parameter::operator==(
const parameter& o)
const
23130{
return equals(*
this, o, 0);}
23139 return function_decl::parameter::operator==(*p);
23185 if (v.visit_begin(
this))
23188 if (type_base_sptr t =
get_type())
23192 return v.visit_end(
this);
23225 bool qualified_name)
const
23232 type_repr =
"void";
23238 string result = type_repr;
23239 string parm_name = get_name_id();
23241 if (!parm_name.empty())
23242 result +=
" " + parm_name;
23276 size_t size_in_bits,
size_t align_in_bits,
23283 | ABSTRACT_DECL_BASE
23284 | ABSTRACT_SCOPE_TYPE_DECL
23285 | ABSTRACT_SCOPE_DECL),
23286 decl_base(env, name, locus, name, vis),
23287 type_base(env, size_in_bits, align_in_bits),
23291 for (member_types::iterator i = mem_types.begin();
23292 i != mem_types.end();
23303 for (member_functions::iterator i = member_fns.begin();
23304 i != member_fns.end();
23306 if (!
has_scope(static_pointer_cast<decl_base>(*i)))
23326 size_t size_in_bits,
size_t align_in_bits,
23330 | ABSTRACT_DECL_BASE
23331 | ABSTRACT_SCOPE_TYPE_DECL
23332 | ABSTRACT_SCOPE_DECL),
23333 decl_base(env, name, locus, name, vis),
23334 type_base(env, size_in_bits, align_in_bits),
23348 bool is_declaration_only)
23351 | ABSTRACT_DECL_BASE
23352 | ABSTRACT_SCOPE_TYPE_DECL
23353 | ABSTRACT_SCOPE_DECL),
23373 hash_t h = do_hash(
this);
23394 if (v.visit_begin(
this))
23403 if (!(*i)->traverse(v))
23413 if (!(*i)->traverse(v))
23423 if (!(*i)->traverse(v))
23430 for (member_function_templates::const_iterator i =
23434 if (!(*i)->traverse(v))
23441 for (member_class_templates::const_iterator i =
23445 if (!(*i)->traverse(v))
23453 bool result = v.visit_end(
this);
23482 type_base_sptr t =
is_type(decl);
23512 for (class_or_union::data_members::const_iterator it =
23601 if (t->get_is_anonymous())
23619 if (t->get_is_anonymous())
23637 if (t->get_is_anonymous())
23662 bool is_laid_out,
bool is_static,
23663 size_t offset_in_bits)
23667 priv_->data_members_.push_back(v);
23676 bool is_already_in =
false;
23679 for (
const auto& s_dm: priv_->static_data_members_)
23683 is_already_in =
true;
23687 if (!is_already_in)
23688 priv_->static_data_members_.push_back(v);
23694 for (data_members::const_iterator i =
23695 priv_->non_static_data_members_.begin();
23696 i != priv_->non_static_data_members_.end();
23700 is_already_in =
true;
23703 if (!is_already_in)
23704 priv_->non_static_data_members_.push_back(v);
23720{
return priv_->data_members_;}
23735 if ((*i)->get_name() == name)
23747 if (
var_decl_sptr data_member = type->find_data_member(name))
23748 return data_member;
23762 if (!v->get_name().empty())
23770 if ((*it)->get_pretty_representation(
false,
true)
23771 == v->get_pretty_representation(
false,
true))
23798 if (v->get_name().empty())
23811{
return priv_->non_static_data_members_;}
23819{
return priv_->static_data_members_;}
23837 bool is_static,
bool is_ctor,
23838 bool is_dtor,
bool is_const)
23850 priv_->member_functions_.push_back(f);
23854 if (!f->get_linkage_name().empty())
23855 priv_->mem_fns_map_[f->get_linkage_name()] = f;
23864{
return priv_->member_functions_;}
23885 string_mem_fn_sptr_map_type::const_iterator i =
23886 priv_->mem_fns_map_.find(linkage_name);
23887 if (i == priv_->mem_fns_map_.end())
23889 return i->second.get();
23900 string_mem_fn_sptr_map_type::const_iterator i =
23901 priv_->mem_fns_map_.find(linkage_name);
23902 if (i == priv_->mem_fns_map_.end())
23928 string_mem_fn_ptr_map_type::const_iterator i =
23929 priv_->signature_2_mem_fn_map_.find(s);
23930 if (i == priv_->signature_2_mem_fn_map_.end())
23938const member_function_templates&
23940{
return priv_->member_function_templates_;}
23945const member_class_templates&
23947{
return priv_->member_class_templates_;}
23958 priv_->member_function_templates_.push_back(m);
23973 priv_->member_class_templates_.push_back(m);
23983 && priv_->data_members_.empty()
23984 && priv_->member_functions_.empty()
23985 && priv_->member_function_templates_.empty()
23986 && priv_->member_class_templates_.empty());
24005 else if (method_decl_sptr f = dynamic_pointer_cast<method_decl>(d))
24011 else if (member_function_template_sptr f =
24012 dynamic_pointer_cast<member_function_template>(d))
24014 else if (member_class_template_sptr c =
24015 dynamic_pointer_cast<member_class_template>(d))
24064 return *
this == *o;
24105 if (l_is_decl_only || r_is_decl_only)
24115 if (!def1 || !def2)
24119 && l_is_decl_only && r_is_decl_only
24158 if (!!def1 != !!def2)
24166 if (!(l.decl_base::operator==(r)
24167 && l.type_base::operator==(r)))
24178 bool val = *def1 == *def2;
24187 if (!(l.decl_base::operator==(r) && l.type_base::operator==(r)))
24194 if (types_defined_same_linux_kernel_corpus_public(l, r))
24202#define RETURN(value) \
24203 return return_comparison_result(l, r, value);
24209 bool result =
true;
24223 for (class_or_union::data_members::const_iterator
24237 || (*d0)->get_type() == (*d1)->get_type())
24264 for (member_function_templates::const_iterator
24269 ++fn_tmpl_it0, ++fn_tmpl_it1)
24270 if (**fn_tmpl_it0 != **fn_tmpl_it1)
24295 for (member_class_templates::const_iterator
24300 ++cl_tmpl_it0, ++cl_tmpl_it1)
24301 if (**cl_tmpl_it0 != **cl_tmpl_it1)
24329 const method_decl_sptr& method)
24351 old_type->get_parameters(),
24352 old_type->get_is_const(),
24353 old_type->get_size_in_bits(),
24354 old_type->get_alignment_in_bits()));
24355 t->get_translation_unit()->bind_function_type_life_time(new_type);
24364 method->get_binding()));
24365 new_method->set_symbol(method->
get_symbol());
24368 class_type->add_member_function(new_method,
24377 t->add_member_function(new_method,
24394struct class_decl::priv
24397 unordered_map<string, base_spec_sptr> bases_map_;
24403 : is_struct_(false)
24444 size_t size_in_bits,
size_t align_in_bits,
24445 bool is_struct,
const location& locus,
24452 | ABSTRACT_TYPE_BASE
24453 | ABSTRACT_DECL_BASE
24454 | ABSTRACT_SCOPE_TYPE_DECL
24455 | ABSTRACT_SCOPE_DECL),
24456 decl_base(env, name, locus, name, vis),
24457 type_base(env, size_in_bits, align_in_bits),
24459 locus, vis, mbr_types, data_mbrs, mbr_fns),
24460 priv_(new priv(is_struct, bases))
24495 size_t size_in_bits,
size_t align_in_bits,
24496 bool is_struct,
const location& locus,
24502 | ABSTRACT_TYPE_BASE
24503 | ABSTRACT_DECL_BASE
24504 | ABSTRACT_SCOPE_TYPE_DECL
24505 | ABSTRACT_SCOPE_DECL),
24514 is_anonymous ? string() : name,
24516 type_base(env, size_in_bits, align_in_bits),
24518 locus, vis, mbr_types, data_mbrs, mbr_fns),
24519 priv_(new priv(is_struct, bases))
24541 size_t size_in_bits,
size_t align_in_bits,
24542 bool is_struct,
const location& locus,
24546 | ABSTRACT_TYPE_BASE
24547 | ABSTRACT_DECL_BASE
24548 | ABSTRACT_SCOPE_TYPE_DECL
24549 | ABSTRACT_SCOPE_DECL),
24550 decl_base(env, name, locus, name, vis),
24551 type_base(env, size_in_bits, align_in_bits),
24554 priv_(new priv(is_struct))
24578 size_t size_in_bits,
size_t align_in_bits,
24579 bool is_struct,
const location& locus,
24583 | ABSTRACT_TYPE_BASE
24584 | ABSTRACT_DECL_BASE
24585 | ABSTRACT_SCOPE_TYPE_DECL
24586 | ABSTRACT_SCOPE_DECL),
24595 is_anonymous ? string() : name,
24597 type_base(env, size_in_bits, align_in_bits),
24600 priv_(new priv(is_struct))
24616 bool is_struct,
bool is_declaration_only)
24619 | ABSTRACT_TYPE_BASE
24620 | ABSTRACT_DECL_BASE
24621 | ABSTRACT_SCOPE_TYPE_DECL
24622 | ABSTRACT_SCOPE_DECL),
24626 priv_(new priv(is_struct))
24641 for (class_decl::virtual_mem_fn_map_type::iterator i =
24642 priv_->virtual_mem_fns_map_.begin();
24643 i != priv_->virtual_mem_fns_map_.end();
24645 sort_virtual_member_functions(i->second);
24653{priv_->is_struct_ = f;}
24660{
return priv_->is_struct_;}
24668 priv_->bases_.push_back(b);
24669 priv_->bases_map_[b->get_base_class()->get_qualified_name()] = b;
24677{
return priv_->bases_;}
24688 unordered_map<string, base_spec_sptr>::iterator i =
24689 priv_->bases_map_.find(qualified_name);
24691 if (i != priv_->bases_map_.end())
24692 return i->second->get_base_class();
24703{
return priv_->virtual_mem_fns_;}
24722{
return priv_->virtual_mem_fns_map_;}
24727{sort_virtual_member_functions(priv_->virtual_mem_fns_);}
24748 bool qualified_name)
const
24750 string cl =
"class ";
24759 if (internal && !
get_name().empty())
24767 string result = cl;
24768 if (qualified_name)
24777class_decl::insert_member_decl(decl_base_sptr d)
24779 if (method_decl_sptr f = dynamic_pointer_cast<method_decl>(d))
24794struct class_decl::base_spec::priv
24797 long offset_in_bits_;
24801 long offset_in_bits,
24804 offset_in_bits_(offset_in_bits),
24805 is_virtual_(is_virtual)
24823 long offset_in_bits,
24826 ABSTRACT_DECL_BASE),
24828 base->get_linkage_name(), base->get_visibility()),
24830 priv_(new priv(base, offset_in_bits, is_virtual))
24856{
return priv_->base_class_.lock();}
24863{
return priv_->is_virtual_;}
24870{
return priv_->offset_in_bits_;}
24890 if (v.visit_begin(
this))
24893 get_base_class()->traverse(v);
24897 return v.visit_end(
this);
24917class_decl::base_spec::base_spec(
const type_base_sptr& base,
24919 long offset_in_bits,
24922 ABSTRACT_DECL_BASE),
24928 priv_(new priv(dynamic_pointer_cast<
class_decl>(base),
24935class_decl::base_spec::~base_spec() =
default;
24961 if (!l.member_base::operator==(r))
24987 return equals(*
this, *o, 0);
25008mem_fn_context_rel::~mem_fn_context_rel()
25028method_decl::method_decl(
const string& name,
25030 bool declared_inline,
25032 const string& linkage_name,
25037 | ABSTRACT_DECL_BASE
25041 declared_inline, locus, linkage_name, vis, bind)
25065method_decl::method_decl(
const string& name,
25067 bool declared_inline,
25069 const string& linkage_name,
25074 | ABSTRACT_DECL_BASE
25076 decl_base(type->get_environment(), name, locus, linkage_name, vis),
25079 declared_inline, locus, linkage_name, vis, bind)
25102method_decl::method_decl(
const string& name,
25103 type_base_sptr type,
25104 bool declared_inline,
25106 const string& linkage_name,
25111 | ABSTRACT_DECL_BASE
25113 decl_base(type->get_environment(), name, locus, linkage_name, vis),
25116 declared_inline, locus, linkage_name, vis, bind)
25135 class_or_union_sptr cl = t->get_class_type();
25137 cl->priv_->mem_fns_map_[l] = m;
25138 if (!old_lname.empty() && l != old_lname)
25140 if (method_decl_sptr m = cl->find_member_function_sptr(old_lname))
25143 cl->priv_->mem_fns_map_.erase(old_lname);
25149method_decl::~method_decl()
25186 if (l.get() == r.get())
25239{
return dynamic_pointer_cast<method_decl>(d);}
25243struct virtual_member_function_less_than
25267 if (f_offset != s_offset)
return f_offset < s_offset;
25273 if (fn != sn)
return fn < sn;
25279 if ((!f_sym) != (!s_sym))
return !f_sym;
25280 if (f_sym && s_sym)
25282 fn = f_sym->get_id_string();
25283 sn = s_sym->get_id_string();
25284 if (fn != sn)
return fn < sn;
25291 if (fn != sn)
return fn < sn;
25295 string fn_filepath, sn_filepath;
25296 unsigned line = 0, column = 0;
25299 fn_loc.
expand(fn_filepath, line, column);
25301 sn_loc.expand(sn_filepath, line, column);
25302 return fn_filepath < sn_filepath;
25317 operator()(
const method_decl_sptr f,
25318 const method_decl_sptr s)
25319 {
return operator()(*f, *s);}
25328 virtual_member_function_less_than lt;
25329 std::stable_sort(mem_fns.begin(), mem_fns.end(), lt);
25358 size_t vtable_offset,
25359 bool is_static,
bool is_ctor,
25360 bool is_dtor,
bool is_const)
25363 is_dtor, is_const);
25370 sort_virtual_member_functions(klass->priv_->virtual_mem_fns_);
25389 class_decl::member_functions::const_iterator m;
25390 for (m = klass->priv_->virtual_mem_fns_.begin();
25391 m != klass->priv_->virtual_mem_fns_.end();
25393 if (m->get() == method.get()
25394 || (*m)->get_linkage_name() == method->get_linkage_name())
25396 if (m == klass->priv_->virtual_mem_fns_.end())
25397 klass->priv_->virtual_mem_fns_.push_back(method);
25405 class_decl::virtual_mem_fn_map_type::iterator i =
25406 klass->priv_->virtual_mem_fns_map_.find(voffset);
25407 if (i == klass->priv_->virtual_mem_fns_map_.end())
25410 virtual_mem_fns_at_voffset.push_back(method);
25411 klass->priv_->virtual_mem_fns_map_[voffset] = virtual_mem_fns_at_voffset;
25415 for (m = i->second.begin() ; m != i->second.end(); ++m)
25416 if (m->get() == method.get()
25417 || (*m)->get_linkage_name() == method->get_linkage_name())
25419 if (m == i->second.end())
25420 i->second.push_back(method);
25449 if ((*b)->get_is_virtual()
25450 || (*b)->get_base_class()->has_virtual_bases())
25479 ssize_t offset = -1;
25480 for (class_decl::virtual_mem_fn_map_type::const_iterator e =
25484 if (e->first > offset)
25514methods_equal_modulo_elf_symbol(
const method_decl_sptr& f,
25515 const method_decl_sptr& s)
25517 method_decl_sptr first = f, second = s;
25519 first->get_symbol();
25521 second->get_symbol();
25523 first->get_linkage_name();
25525 second->get_linkage_name();
25528 first->set_linkage_name(
"");
25530 second->set_linkage_name(
"");
25532 bool equal = *first == *second;
25534 first->set_symbol(saved_first_elf_symbol);
25535 first->set_linkage_name(saved_first_linkage_name);
25536 second->set_symbol(saved_second_elf_symbol);
25537 second->set_linkage_name(saved_second_linkage_name);
25558method_matches_at_least_one_in_vector(
const method_decl_sptr& method,
25561 for (class_decl::member_functions::const_iterator i = fns.begin();
25570 if (methods_equal_modulo_elf_symbol(method, *i))
25603 bool result =
false;
25604 if (l.
get_environment().priv_->is_type_comparison_cached(l, r, result))
25615 bool result =
true;
25629#define RETURN(value) CACHE_AND_RETURN_COMPARISON_RESULT(value)
25641 for (class_decl::base_specs::const_iterator
25653 (*b1)->get_base_class().get()))
25699 for (class_decl::virtual_mem_fn_map_type::const_iterator first_v_fn_entry =
25702 ++first_v_fn_entry)
25704 unsigned voffset = first_v_fn_entry->first;
25706 first_v_fn_entry->second;
25708 const class_decl::virtual_mem_fn_map_type::const_iterator
25720 second_v_fn_entry->second;
25722 bool matches =
false;
25723 for (class_decl::member_functions::const_iterator i =
25724 first_vfns.begin();
25725 i != first_vfns.end();
25727 if (method_matches_at_least_one_in_vector(*i, second_vfns))
25821 return *
this == *o;
25865 if (l.get() == r.get())
25897operator==(
const class_or_union_sptr& l,
const class_or_union_sptr& r)
25899 if (l.get() == r.get())
25916operator!=(
const class_or_union_sptr& l,
const class_or_union_sptr& r)
25936 if (v.visit_begin(
this))
25945 if (!(*i)->traverse(v))
25956 if (!(*i)->traverse(v))
25966 if (!(*i)->traverse(v))
25976 if (!(*i)->traverse(v))
25983 for (member_function_templates::const_iterator i =
25987 if (!(*i)->traverse(v))
25994 for (member_class_templates::const_iterator i =
25998 if (!(*i)->traverse(v))
26006 bool result = v.visit_end(
this);
26015context_rel::~context_rel()
26019member_base::operator==(
const member_base& o)
const
26039 if (l.get() == r.get())
26044 return *l ==
static_cast<const decl_base&
>(*r);
26083{
return dynamic_pointer_cast<class_decl::base_spec>(tod);}
26086member_function_template::operator==(
const member_base& other)
const
26093 if (!(is_constructor() == o.is_constructor()
26094 && is_const() == o.is_const()
26095 && member_base::operator==(o)))
26102 return ftdecl->function_tdecl::operator==(*other_ftdecl);
26121 const member_function_template_sptr& r)
26123 if (l.get() == r.get())
26142 const member_function_template_sptr& r)
26159 if (v.visit_begin(
this))
26166 return v.visit_end(
this);
26182 if (!member_base::operator==(o))
26185 return as_class_tdecl()->class_tdecl::operator==(o);
26199 if (!decl_base::operator==(other))
26201 return as_class_tdecl()->class_tdecl::operator==(other);
26215 return *
this == *o;
26228 const member_class_template_sptr& r)
26230 if (l.get() == r.get())
26248 const member_class_template_sptr& r)
26265 if (v.visit_begin(
this))
26272 return v.visit_end(
this);
26292 case private_access:
26295 case protected_access:
26298 case public_access:
26322 c->set_is_static(s);
26332 for (
const auto& dm : cl->get_data_members())
26333 if (dm->get_name() == v->get_name())
26344 for (class_decl::data_members::iterator i =
26345 cl->priv_->non_static_data_members_.begin();
26346 i != cl->priv_->non_static_data_members_.end();
26349 if ((*i)->get_name() == v->get_name())
26351 cl->priv_->non_static_data_members_.erase(i);
26358 bool already_in_static_dms =
false;
26359 for (
const auto& s_dm : cl->priv_->static_data_members_)
26360 if (s_dm->get_name() == v->get_name())
26362 already_in_static_dms =
true;
26365 if (!already_in_static_dms)
26366 cl->priv_->static_data_members_.push_back(var);
26371 for (class_or_union::data_members::iterator i =
26372 cl->priv_->static_data_members_.begin();
26373 i != cl->priv_->static_data_members_.end();
26375 if ((*i)->get_name() == v->get_name())
26377 cl->priv_->static_data_members_.erase(i);
26383 bool is_already_in_non_static_data_members =
false;
26384 for (
const auto& ns_dm : cl->priv_->non_static_data_members_)
26385 if (ns_dm->get_name() == v->get_name())
26387 is_already_in_non_static_data_members =
true;
26390 if (!is_already_in_non_static_data_members)
26391 cl->priv_->non_static_data_members_.push_back(var);
26431 size_t size_in_bits,
const location& locus,
26436 | ABSTRACT_TYPE_BASE
26437 | ABSTRACT_DECL_BASE),
26438 decl_base(env, name, locus, name, vis),
26441 locus, vis, mbr_types, data_mbrs, member_fns)
26467 size_t size_in_bits,
const location& locus,
26473 | ABSTRACT_TYPE_BASE
26474 | ABSTRACT_DECL_BASE),
26483 is_anonymous ? string() : name,
26487 locus, vis, mbr_types, data_mbrs, member_fns)
26505 size_t size_in_bits,
const location& locus,
26509 | ABSTRACT_TYPE_BASE
26510 | ABSTRACT_DECL_BASE
26511 | ABSTRACT_SCOPE_TYPE_DECL
26512 | ABSTRACT_SCOPE_DECL),
26513 decl_base(env, name, locus, name, vis),
26536 size_t size_in_bits,
const location& locus,
26540 | ABSTRACT_TYPE_BASE
26541 | ABSTRACT_DECL_BASE
26542 | ABSTRACT_SCOPE_TYPE_DECL
26543 | ABSTRACT_SCOPE_DECL),
26552 is_anonymous ? string() : name,
26571 const string& name,
26572 bool is_declaration_only)
26575 | ABSTRACT_TYPE_BASE
26576 | ABSTRACT_DECL_BASE
26577 | ABSTRACT_SCOPE_TYPE_DECL
26578 | ABSTRACT_SCOPE_DECL),
26619 bool qualified_name)
const
26624 if (internal && !
get_name().empty())
26625 repr = string(
"union ") +
26635 if (qualified_name)
26672 return *
this == *o;
26686 return *
this == *o;
26719 if (v.visit_begin(
this))
26728 if (!(*i)->traverse(v))
26738 if (!(*i)->traverse(v))
26748 if (!(*i)->traverse(v))
26755 for (member_function_templates::const_iterator i =
26759 if (!(*i)->traverse(v))
26766 for (member_class_templates::const_iterator i =
26770 if (!(*i)->traverse(v))
26778 bool result = v.visit_end(
this);
26817 bool result =
false;
26818 if (l.
get_environment().priv_->is_type_comparison_cached(l, r, result))
26839 const method_decl_sptr& f)
26854 const class_or_union_sptr t = union_type;
26869 if (l.get() == r.get())
26893class template_decl::priv
26897 std::list<template_parameter_sptr> parms_;
26910{priv_->parms_.push_back(p);}
26916const std::list<template_parameter_sptr>&
26918{
return priv_->parms_;}
26931 const string& name,
26956 return *
this == *other;
26969 list<shared_ptr<template_parameter> >::const_iterator t0, t1;
26995class template_parameter::priv
27001 mutable bool hashing_started_;
27002 mutable bool comparison_started_;
27010 template_decl_(enclosing_template_decl),
27011 hashing_started_(),
27012 comparison_started_()
27016template_parameter::template_parameter(
unsigned index,
27018 : priv_(new priv(index, enclosing_template))
27022template_parameter::get_index()
const
27023{
return priv_->index_;}
27026template_parameter::get_enclosing_template_decl()
const
27027{
return priv_->template_decl_.lock();}
27033 if (get_index() != o.get_index())
27036 if (priv_->comparison_started_)
27039 bool result =
false;
27044 priv_->comparison_started_ =
true;
27046 if (!!get_enclosing_template_decl() != !!o.get_enclosing_template_decl())
27048 else if (get_enclosing_template_decl()
27049 && (*get_enclosing_template_decl()
27050 != *o.get_enclosing_template_decl()))
27055 priv_->comparison_started_ =
false;
27075class type_tparameter::priv
27090type_tparameter::type_tparameter(
unsigned index,
27092 const string& name,
27096 | ABSTRACT_TYPE_BASE
27098 decl_base(enclosing_tdecl->get_environment(), name, locus),
27099 type_base(enclosing_tdecl->get_environment(), 0, 0),
27100 type_decl(enclosing_tdecl->get_environment(), name, 0, 0, locus),
27115 if (!type_decl::operator==(other))
27135 if (!type_decl::operator==(other))
27155 if (!decl_base::operator==(other))
27191{
return *
this ==
static_cast<const type_base&
>(other);}
27193type_tparameter::~type_tparameter()
27197class non_type_tparameter::priv
27207 priv(type_base_sptr type)
27225non_type_tparameter::non_type_tparameter(
unsigned index,
27227 const string& name,
27228 type_base_sptr type,
27231 decl_base(type->get_environment(), name, locus,
""),
27233 priv_(new priv(type))
27241const type_base_sptr
27243{
return priv_->type_.lock();}
27249 if (!decl_base::operator==(other))
27256 return (template_parameter::operator==(o)
27275non_type_tparameter::~non_type_tparameter()
27281class template_tparameter::priv
27295template_tparameter::template_tparameter(
unsigned index,
27297 const string& name,
27301 | ABSTRACT_TYPE_BASE
27303 decl_base(enclosing_tdecl->get_environment(), name, locus),
27304 type_base(enclosing_tdecl->get_environment(), 0, 0),
27305 type_decl(enclosing_tdecl->get_environment(), name,
27306 0, 0, locus, name, VISIBILITY_DEFAULT),
27308 template_decl(enclosing_tdecl->get_environment(), name, locus),
27326 return (type_tparameter::operator==(o)
27345 return (type_tparameter::operator==(o)
27359 return *
this ==
static_cast<const type_base&
>(other);
27378template_tparameter::~template_tparameter()
27386class type_composition::priv
27410type_composition::type_composition(
unsigned index,
27414 ABSTRACT_DECL_BASE),
27425const type_base_sptr
27427{
return priv_->type_.lock();}
27436type_composition::~type_composition()
27445class function_tdecl::priv
27457 : pattern_(pattern), binding_(bind)
27484 | ABSTRACT_SCOPE_DECL),
27488 priv_(new priv(bind))
27512 | ABSTRACT_SCOPE_DECL),
27517 priv_(new priv(pattern, bind))
27528 priv_->pattern_ = p;
27538{
return priv_->pattern_;}
27545{
return priv_->binding_;}
27557 return *
this == *o;
27571 return *
this == *o;
27584 && template_decl::operator==(o)
27585 && scope_decl::operator==(o)
27609 if (!v.visit_begin(
this))
27616 return v.visit_end(
this);
27619function_tdecl::~function_tdecl()
27627class class_tdecl::priv
27638 : pattern_(pattern)
27657 | ABSTRACT_SCOPE_DECL),
27682 | ABSTRACT_SCOPE_DECL),
27687 priv_(new priv(pattern))
27698 priv_->pattern_ = p;
27708{
return priv_->pattern_;}
27717 if (!(template_decl::operator==(o)
27718 && scope_decl::operator==(o)
27737 return *
this ==
static_cast<const decl_base&
>(o);
27745{
return *
this ==
static_cast<const decl_base&
>(o);}
27761 if (v.visit_begin(
this))
27765 pattern->traverse(v);
27768 return v.visit_end(
this);
27771class_tdecl::~class_tdecl()
27782 non_canonicalized_subtype_detector();
27785 non_canonicalized_subtype_detector(
type_base* type)
27787 has_non_canonical_type_()
27796 has_non_canonical_type()
const
27797 {
return has_non_canonical_type_;}
27802 visit_begin(function_decl* f)
27820 visit_begin(type_base* t)
27824 if (!t->get_canonical_type())
27828 has_non_canonical_type_ = t;
27843 visit_end(type_base* )
27845 if (has_non_canonical_type_)
27862 non_canonicalized_subtype_detector v(t.get());
27864 return v.has_non_canonical_type();
27880 const type_base_sptr t_v2)
27887 return (t1 != t2 && repr1 == repr2);
27898 env.priv_->extra_live_types_.push_back(t);
27933 result =
reinterpret_cast<size_t>(g);
27935 result =
reinterpret_cast<size_t>(s);
27941 string repr = v->get_pretty_representation(
true);
27942 std::hash<string> hash_string;
27950 string repr = f->get_pretty_representation(
true);
27951 std::hash<string> hash_string;
27957 type_base_sptr parm_type = p->get_type();
27959 std::hash<bool> hash_bool;
27960 std::hash<unsigned> hash_unsigned;
27969 std::hash<size_t> hash_size;
27970 std::hash<bool> hash_bool;
27971 type_base_sptr type = bs->get_base_class();
28008{
return hash_as_canonical_type_or_constant(t);}
28035 if (d->type_or_decl_base::priv_->get_hashing_state()
28037 return d->type_or_decl_base::priv_->hash_value_;
28040 return artefact.priv_->hash_value_;
28142 exemplar =
const_cast<type_base*
>(type);
28171hash_as_canonical_type_or_constant(
const type_base *t)
28178 if (!canonical_type)
28196 if (canonical_type)
28197 return reinterpret_cast<size_t>(canonical_type);
28272 const type_base_sptr& second,
28273 bool indirect_type)
28305 bool indirect_type)
28307 if (!!first != !!second)
28319 if (
typeid(*first) !=
typeid(*second))
28335 if (ty1->is_lvalue() != ty2->is_lvalue())
28338 ty2->get_pointed_to_type(),
28357 if (!indirect_type)
28361 return ty1->get_name() == ty2->
get_name();
28367 if (!indirect_type)
28371 return (
get_name(ty1->get_underlying_type())
28379 && ty1->get_name() != ty2->
get_name())
28382 if (!indirect_type)
28385 || (ty1->get_non_static_data_members().size()
28389 for (class_or_union::data_members::const_iterator
28390 i = ty1->get_non_static_data_members().begin(),
28392 (i != ty1->get_non_static_data_members().end()
28399 dm2->get_type().get(),
28412 && ty1->get_name() != ty2->
get_name())
28415 if (!indirect_type)
28425 if (!indirect_type)
28428 || ty1->get_dimension_count() != ty2->get_dimension_count())
28462 if (ty1->get_parameters().size() != ty2->
get_parameters().size())
28465 for (function_type::parameters::const_iterator
28466 i = ty1->get_parameters().begin(),
28468 (i != ty1->get_parameters().end()
28498 const char* dm_name)
28526 return cou->find_data_member(dm);
28541 unsigned parm_index)
28548 if (parms.size() <= parm_index)
28551 return parms[parm_index].get();
28566 std::ostringstream o;
28569 o <<
"unnamed-enum";
28573 o <<
"-underlying-type-" << size;
28593 return data_member;
28613 for (; d != e; ++d)
28634stream_pretty_representation_of_fn_parms(
const function_type& fn_type,
28635 ostream& o,
bool qualified,
28643 type_base_sptr type;
28650 if (i != first_parm)
28653 type = parm->get_type();
28710add_outer_pointer_to_fn_type_expr(
const type_base* p,
28711 const string& input,
28712 bool qualified,
bool internal)
28718 string star_or_ref;
28731 if (!pointed_to_fn)
28734 if (pointed_to_fn->priv_->is_pretty_printing())
28744 pointed_to_fn->priv_->set_is_pretty_printing();
28746 std::ostringstream left, right, inner;
28748 inner <<
"(" << star_or_ref << input <<
")";
28750 type_base_sptr type;
28751 stream_pretty_representation_of_fn_parms(*pointed_to_fn, right,
28752 qualified, internal);
28754 type_base_sptr return_type = pointed_to_fn->get_return_type();
28763 result = left.str() +
" " + inner.str() + right.str();
28767 string inner_string = inner.str() + right.str();
28768 result = add_outer_pointer_to_fn_type_expr(p, inner_string,
28769 qualified, internal);
28773 string inner_string = inner.str() + right.str();
28774 result = add_outer_pointer_to_array_type_expr(p, inner_string,
28775 qualified, internal);
28783 pointed_to_fn->priv_->unset_is_pretty_printing();
28834add_outer_pointer_to_fn_type_expr(
const type_base_sptr& p,
28835 const string& input,
28836 bool qualified,
bool internal)
28837{
return add_outer_pointer_to_fn_type_expr(p.get(), input, qualified, internal);}
28890add_outer_pointer_to_array_type_expr(
const type_base* p,
28891 const string& input,
bool qualified,
28897 string star_or_ref;
28898 type_base_sptr pointed_to_type;
28902 pointed_to_type = ptr->get_pointed_to_type();
28907 pointed_to_type = ref->get_pointed_to_type();
28915 std::ostringstream left, right, inner;
28916 inner <<
"(" << star_or_ref << input <<
")";
28917 right << array->get_subrange_representation();
28920 type_base_sptr array_element_type = array->get_element_type();
28926 left <<
get_type_name(array_element_type, qualified, internal);
28927 result = left.str() + inner.str() + right.str();
28932 string r = inner.str() + right.str();
28933 result = add_outer_pointer_to_fn_type_expr(p, r, qualified, internal);
28938 string inner_string = inner.str() + right.str();
28939 result = add_outer_pointer_to_array_type_expr(p, inner_string,
28940 qualified, internal);
28999add_outer_pointer_to_array_type_expr(
const type_base_sptr& pointer_to_ar,
29000 const string& input,
bool qualified,
29002{
return add_outer_pointer_to_array_type_expr(pointer_to_ar.get(),
29003 input, qualified, internal);}
29051add_outer_ptr_to_mbr_type_expr(
const ptr_to_mbr_type* p,
29052 const string& input,
bool qualified,
29058 std::ostringstream left, right, inner;
29059 type_base_sptr void_type = p->get_environment().get_void_type();
29060 string containing_type_name =
get_type_name(p->get_containing_type(),
29061 qualified, internal);
29062 type_base_sptr mbr_type = p->get_member_type();
29066 inner <<
"(" << containing_type_name <<
"::*" << input <<
")";
29067 stream_pretty_representation_of_fn_parms(*fn_type, right,
29068 qualified, internal);
29071 return_type = void_type;
29078 left <<
get_type_name(return_type, qualified, internal) <<
" ";;
29079 result = left.str() + inner.str() + right.str();
29083 string inner_str = inner.str() + right.str();
29084 result = pointer_declaration_name(p, inner_str, qualified, internal);
29088 string inner_str = inner.str() + right.str();
29089 result = add_outer_ptr_to_mbr_type_expr(p, inner_str,
29090 qualified, internal);
29097 inner <<
"(" << containing_type_name <<
"::*" << input <<
")";
29098 stream_pretty_representation_of_fn_parms(*fn_type, right,
29099 qualified, internal);
29100 string inner_str = inner.str() + right.str();
29101 result = add_outer_ptr_to_mbr_type_expr(ptr_mbr_type, inner_str,
29102 qualified, internal);
29106 left <<
get_type_name(p->get_member_type(), qualified, internal) <<
" ";
29107 inner << containing_type_name <<
"::*" << input;
29108 result = left.str()+ inner.str();
29161 const string& input,
bool qualified,
29163{
return add_outer_ptr_to_mbr_type_expr(p.get(), input, qualified, internal);}
29183add_outer_pointer_to_ptr_to_mbr_type_expr(
const type_base* p,
29184 const string& input,
bool qualified,
29190 string star_or_ref;
29191 type_base_sptr pointed_to_type;
29195 pointed_to_type = ptr->get_pointed_to_type();
29200 pointed_to_type= ref->get_pointed_to_type();
29204 if (!pointed_to_type)
29209 if (!pointed_to_ptr_to_mbr)
29212 std::ostringstream inner;
29213 inner << star_or_ref << input;
29214 string result = add_outer_ptr_to_mbr_type_expr(pointed_to_ptr_to_mbr,
29216 qualified, internal);
29233static interned_string
29234pointer_declaration_name(
const type_base* ptr,
29235 const string& idname,
29236 bool qualified,
bool internal)
29239 return interned_string();
29241 type_base_sptr pointed_to_type;
29242 string star_or_ref;
29245 pointed_to_type = p->get_pointed_to_type();
29250 pointed_to_type = p->get_pointed_to_type();
29254 if (!pointed_to_type)
29255 return interned_string();
29268 if (!idname.empty())
29275 result = add_outer_pointer_to_fn_type_expr(ptr, idname,
29276 qualified, internal);
29278 result = add_outer_pointer_to_array_type_expr(ptr, idname,
29279 qualified, internal);
29281 result = add_outer_pointer_to_ptr_to_mbr_type_expr(ptr, idname,
29282 qualified, internal);
29286 return ptr->get_environment().intern(result);
29303static interned_string
29304pointer_declaration_name(
const type_base_sptr& ptr,
29305 const string& variable_name,
29306 bool qualified,
bool internal)
29307{
return pointer_declaration_name(ptr.get(), variable_name,
29308 qualified, internal);}
29323static interned_string
29324array_declaration_name(
const array_type_def* array,
29325 const string& variable_name,
29326 bool qualified,
bool internal)
29329 return interned_string();
29331 type_base_sptr e_type = array->get_element_type();
29332 string e_type_repr =
29340 std::ostringstream o;
29341 if (!variable_name.empty())
29342 o << variable_name <<
" is ";
29344 << array->get_subrange_representation()
29345 <<
") of " << e_type_repr;
29356 result = e_type_repr;
29357 if (!variable_name.empty())
29358 result += variable_name;
29359 result += array->get_subrange_representation();
29363 string s = variable_name + array->get_subrange_representation();
29364 result = pointer_declaration_name(p, s, qualified, internal);
29368 string s = variable_name + array->get_subrange_representation();
29369 result = ptr_to_mbr_declaration_name(p, s, qualified, internal);
29374 return array->get_environment().intern(result);
29390static interned_string
29392 const string& variable_name,
29393 bool qualified,
bool internal)
29394{
return array_declaration_name(array.get(), variable_name,
29395 qualified, internal);}
29410static interned_string
29411ptr_to_mbr_declaration_name(
const ptr_to_mbr_type* ptr,
29412 const string& variable_name,
29413 bool qualified,
bool internal)
29416 return interned_string();
29418 string input = variable_name;
29419 string result = add_outer_ptr_to_mbr_type_expr(ptr, input,
29420 qualified, internal);
29421 return ptr->get_environment().intern(result);
29437static interned_string
29439 const string& variable_name,
29440 bool qualified,
bool internal)
29442 return ptr_to_mbr_declaration_name(ptr.get(), variable_name,
29443 qualified, internal);
29462struct ir_node_visitor::priv
29477ir_node_visitor::~ir_node_visitor() =
default;
29486{priv_->allow_visiting_already_visited_type_node = f;}
29495{
return priv_->allow_visiting_already_visited_type_node;}
29516 canonical_type = p;
29520 size_t canonical_ptr_value =
reinterpret_cast<size_t>(canonical_type);
29521 priv_->visited_ir_nodes.insert(canonical_ptr_value);
29534{priv_->visited_ir_nodes.clear();}
29555 canonical_type = p;
29559 size_t ptr_value =
reinterpret_cast<size_t>(canonical_type);
29560 pointer_set::iterator it = priv_->visited_ir_nodes.find(ptr_value);
29561 if (it == priv_->visited_ir_nodes.end())
29568ir_node_visitor::visit_begin(
decl_base*)
29576ir_node_visitor::visit_begin(scope_decl*)
29580ir_node_visitor::visit_end(scope_decl*)
29584ir_node_visitor::visit_begin(type_base*)
29588ir_node_visitor::visit_end(type_base*)
29592ir_node_visitor::visit_begin(scope_type_decl* t)
29593{
return visit_begin(
static_cast<type_base*
>(t));}
29596ir_node_visitor::visit_end(scope_type_decl* t)
29597{
return visit_end(
static_cast<type_base*
>(t));}
29600ir_node_visitor::visit_begin(type_decl* t)
29601{
return visit_begin(
static_cast<type_base*
>(t));}
29604ir_node_visitor::visit_end(type_decl* t)
29605{
return visit_end(
static_cast<type_base*
>(t));}
29608ir_node_visitor::visit_begin(namespace_decl* d)
29609{
return visit_begin(
static_cast<decl_base*
>(d));}
29612ir_node_visitor::visit_end(namespace_decl* d)
29613{
return visit_end(
static_cast<decl_base*
>(d));}
29616ir_node_visitor::visit_begin(qualified_type_def* t)
29617{
return visit_begin(
static_cast<type_base*
>(t));}
29620ir_node_visitor::visit_end(qualified_type_def* t)
29621{
return visit_end(
static_cast<type_base*
>(t));}
29624ir_node_visitor::visit_begin(pointer_type_def* t)
29625{
return visit_begin(
static_cast<type_base*
>(t));}
29628ir_node_visitor::visit_end(pointer_type_def* t)
29629{
return visit_end(
static_cast<type_base*
>(t));}
29632ir_node_visitor::visit_begin(reference_type_def* t)
29633{
return visit_begin(
static_cast<type_base*
>(t));}
29636ir_node_visitor::visit_end(reference_type_def* t)
29637{
return visit_end(
static_cast<type_base*
>(t));}
29640ir_node_visitor::visit_begin(ptr_to_mbr_type* t)
29641{
return visit_begin(
static_cast<type_base*
>(t));}
29644ir_node_visitor::visit_end(ptr_to_mbr_type* t)
29645{
return visit_end(
static_cast<type_base*
>(t));}
29648ir_node_visitor::visit_begin(array_type_def* t)
29649{
return visit_begin(
static_cast<type_base*
>(t));}
29652ir_node_visitor::visit_end(array_type_def* t)
29653{
return visit_end(
static_cast<type_base*
>(t));}
29656ir_node_visitor::visit_begin(array_type_def::subrange_type* t)
29657{
return visit_begin(
static_cast<type_base*
>(t));}
29660ir_node_visitor::visit_end(array_type_def::subrange_type* t)
29661{
return visit_end(
static_cast<type_base*
>(t));}
29664ir_node_visitor::visit_begin(enum_type_decl* t)
29665{
return visit_begin(
static_cast<type_base*
>(t));}
29668ir_node_visitor::visit_end(enum_type_decl* t)
29669{
return visit_end(
static_cast<type_base*
>(t));}
29672ir_node_visitor::visit_begin(typedef_decl* t)
29673{
return visit_begin(
static_cast<type_base*
>(t));}
29676ir_node_visitor::visit_end(typedef_decl* t)
29677{
return visit_end(
static_cast<type_base*
>(t));}
29680ir_node_visitor::visit_begin(function_type* t)
29681{
return visit_begin(
static_cast<type_base*
>(t));}
29684ir_node_visitor::visit_end(function_type* t)
29685{
return visit_end(
static_cast<type_base*
>(t));}
29688ir_node_visitor::visit_begin(var_decl* d)
29689{
return visit_begin(
static_cast<decl_base*
>(d));}
29692ir_node_visitor::visit_end(var_decl* d)
29693{
return visit_end(
static_cast<decl_base*
>(d));}
29696ir_node_visitor::visit_begin(function_decl* d)
29697{
return visit_begin(
static_cast<decl_base*
>(d));}
29700ir_node_visitor::visit_end(function_decl* d)
29701{
return visit_end(
static_cast<decl_base*
>(d));}
29704ir_node_visitor::visit_begin(function_decl::parameter* d)
29705{
return visit_begin(
static_cast<decl_base*
>(d));}
29708ir_node_visitor::visit_end(function_decl::parameter* d)
29709{
return visit_end(
static_cast<decl_base*
>(d));}
29712ir_node_visitor::visit_begin(function_tdecl* d)
29713{
return visit_begin(
static_cast<decl_base*
>(d));}
29716ir_node_visitor::visit_end(function_tdecl* d)
29717{
return visit_end(
static_cast<decl_base*
>(d));}
29720ir_node_visitor::visit_begin(class_tdecl* d)
29721{
return visit_begin(
static_cast<decl_base*
>(d));}
29724ir_node_visitor::visit_end(class_tdecl* d)
29725{
return visit_end(
static_cast<decl_base*
>(d));}
29728ir_node_visitor::visit_begin(class_or_union* t)
29729{
return visit_begin(
static_cast<type_base*
>(t));}
29732ir_node_visitor::visit_end(class_or_union* t)
29733{
return visit_end(
static_cast<type_base*
>(t));}
29736ir_node_visitor::visit_begin(class_decl* t)
29737{
return visit_begin(
static_cast<type_base*
>(t));}
29740ir_node_visitor::visit_end(class_decl* t)
29741{
return visit_end(
static_cast<type_base*
>(t));}
29744ir_node_visitor::visit_begin(union_decl* t)
29745{
return visit_begin(
static_cast<type_base*
>(t));}
29748ir_node_visitor::visit_end(union_decl* t)
29749{
return visit_end(
static_cast<type_base*
>(t));}
29752ir_node_visitor::visit_begin(class_decl::base_spec* d)
29753{
return visit_begin(
static_cast<decl_base*
>(d));}
29756ir_node_visitor::visit_end(class_decl::base_spec* d)
29757{
return visit_end(
static_cast<decl_base*
>(d));}
29760ir_node_visitor::visit_begin(member_function_template* d)
29761{
return visit_begin(
static_cast<decl_base*
>(d));}
29764ir_node_visitor::visit_end(member_function_template* d)
29765{
return visit_end(
static_cast<decl_base*
>(d));}
29768ir_node_visitor::visit_begin(member_class_template* d)
29769{
return visit_begin(
static_cast<decl_base*
>(d));}
29772ir_node_visitor::visit_end(member_class_template* d)
29773{
return visit_end(
static_cast<decl_base*
>(d));}
29785 static __thread
size_t counter;
29787 std::ostringstream o;
29793struct function_decl_hash
29795 size_t operator()(
const function_decl* f)
const
29796 {
return reinterpret_cast<size_t>(f);}
29799 {
return operator()(f.get());}
29804typedef unordered_map<
const function_decl*, string,
29805 function_decl_hash,
29824static const string&
29828 fns_to_str_map_type::const_iterator i = m.find(fn);
29831 string s = get_next_string();
29852fns_to_str(vector<function_decl*>::const_iterator begin,
29853 vector<function_decl*>::const_iterator end,
29857 vector<function_decl*>::const_iterator i;
29858 for (i = begin; i != end; ++i)
29859 o <<
"'" << fn_to_str(*i, m) <<
"' ";
29885fns_to_str(vector<function_decl*>::const_iterator a_begin,
29886 vector<function_decl*>::const_iterator a_end,
29887 vector<function_decl*>::const_iterator b_begin,
29888 vector<function_decl*>::const_iterator b_end,
29892 fns_to_str(a_begin, a_end, m, o);
29894 fns_to_str(b_begin, b_end, m, o);
29918fns_to_str(vector<function_decl*>::const_iterator a_begin,
29919 vector<function_decl*>::const_iterator a_end,
29920 vector<function_decl*>::const_iterator b_begin,
29921 vector<function_decl*>::const_iterator b_end,
29925 fns_to_str(a_begin, a_end, b_begin, b_end, m, o);
29947 std::string parent_qualified_name;
29956 if (!d->priv_->qualified_parent_name_.empty())
29962 d->priv_->qualified_name_ =
29963 env.
intern(d->priv_->qualified_parent_name_ +
"::" + d->
get_name());
29971 d->priv_->internal_qualified_name_ = d->priv_->qualified_name_;
29973 if (d->priv_->scoped_name_.empty())
29978 d->priv_->scoped_name_ =
29981 d->priv_->scoped_name_ =
29999{
return do_update(d);}
30011 return do_update(d);
This header declares filters for the diff trees resulting from comparing ABI Corpora.
The private data and functions of the abigail::ir::corpus type.
#define ABG_RETURN_FALSE
A macro used to return the "false" boolean from DIE comparison routines.
#define ABG_RETURN(value)
A macro used to return from DIE comparison routines.
#define ABG_ASSERT(cond)
This is a wrapper around the 'assert' glibc call. It allows for its argument to have side effects,...
Declaration of types pertaining to the interned string pool used throughout Libabigail,...
This contains the private implementation of the suppression engine of libabigail.
#define CACHE_COMPARISON_RESULT_AND_RETURN(value)
Cache the result of a comparison between too artifacts (l & r) and return immediately.
#define RETURN_TRUE_IF_COMPARISON_CYCLE_DETECTED(l, r)
This macro is to be used while comparing composite types that might recursively refer to themselves....
Types of the main internal representation of libabigail.
Wrappers around regex types and functions.
This type abstracts the configuration information of the library.
bool has_string(const char *s) const
Test if the interned string pool already contains a string with a given value.
const char * get_string(const char *s) const
Get a pointer to the interned string which has a given value.
interned_string create_string(const std::string &)
Create an interned string with a given value.
interned_string_pool()
Default constructor.
~interned_string_pool()
Destructor.
The abstraction of an interned string.
bool empty() const
Test if the current instance of interned_string is empty.
This class is to hold the value of the bound of a subrange. The value can be either signed or unsigne...
void set_signed(int64_t v)
Setter of the bound value as signed.
void set_signedness(enum signedness s)
Setter of the signedness (unsigned VS signed) of the bound value.
enum signedness get_signedness() const
Getter of the signedness (unsigned VS signed) of the bound value.
int64_t get_signed_value() const
Getter of the bound value as a signed value.
bool operator==(const bound_value &) const
Equality operator of the bound value.
uint64_t get_unsigned_value()
Getter of the bound value as an unsigned value.
bound_value()
Default constructor of the array_type_def::subrange_type::bound_value class.
void set_unsigned(uint64_t v)
Setter of the bound value as unsigned.
Abstraction for an array range type, like in Ada, or just for an array dimension like in C or C++.
void set_lower_bound(int64_t lb)
Setter of the lower bound.
bool is_non_finite() const
Test if the length of the subrange type is infinite.
void set_upper_bound(int64_t ub)
Setter of the upper bound of the subrange type.
void set_underlying_type(const type_base_sptr &)
Setter of the underlying type of the subrange, that is, the type that defines the range.
string as_string() const
Return a string representation of the sub range.
virtual 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.
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.
shared_ptr< subrange_type > subrange_sptr
Convenience typedef for a shared pointer on a function_decl::subrange.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
const std::vector< subrange_sptr > & get_subranges() const
Get the array's subranges.
virtual bool operator==(const decl_base &) const
Return true iff the two decls have the same name.
std::vector< subrange_sptr > subranges_type
Convenience typedef for a vector of subrange_sptr.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Get the pretty representation of the current instance of array_type_def.
translation_unit::language get_language() const
Get the language of the array.
virtual void append_subranges(const std::vector< subrange_sptr > &subs)
Append subranges from the vector.
Abstraction of a base specifier in a class declaration.
class_decl_sptr get_base_class() const
Get the base class referred to by the current base class specifier.
bool get_is_virtual() const
Getter of the "is-virtual" proprerty of the base class specifier.
long get_offset_in_bits() const
Getter of the offset of the base.
virtual 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.
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.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
shared_ptr< base_spec > base_spec_sptr
Convenience typedef.
void add_base_specifier(shared_ptr< base_spec > b)
Add a base specifier to this class.
const member_functions & get_virtual_mem_fns() const
Get the virtual member functions of this class.
void sort_virtual_mem_fns()
Sort the virtual member functions by their virtual index.
friend bool equals(const class_decl &, const class_decl &, change_kind *)
Compares two instances of class_decl.
virtual bool operator==(const decl_base &) const
Comparison operator for class_decl.
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.
vector< base_spec_sptr > base_specs
Convenience typedef.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Getter of the pretty representation of the current instance of class_decl.
The base type of class_decl and union_decl.
virtual size_t get_num_anonymous_member_classes() const
Get the number of anonymous member classes contained in this class.
void add_member_function(method_decl_sptr f, access_specifier a, bool is_static, bool is_ctor, bool is_dtor, bool is_const)
Add a member function.
const var_decl_sptr find_anonymous_data_member(const var_decl_sptr &) const
Find an anonymous data member in the class.
const member_functions & get_member_functions() const
Get the member functions of this class_or_union.
virtual void remove_member_decl(decl_base_sptr)
Remove a given decl from the current class_or_union scope.
const member_function_templates & get_member_function_templates() const
Get the member function templates of this class.
virtual size_t get_size_in_bits() const
Getter of the size of the class_or_union type.
virtual size_t get_num_anonymous_member_unions() const
Get the number of anonymous member unions contained in this class.
void add_member_function_template(member_function_template_sptr)
Append a member function template to the class_or_union.
unordered_map< ssize_t, member_functions > virtual_mem_fn_map_type
Convenience typedef.
vector< method_decl_sptr > member_functions
Convenience typedef.
const data_members & get_data_members() const
Get the data members of this class_or_union.
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.
vector< var_decl_sptr > data_members
Convenience typedef.
virtual ~class_or_union()
Destrcutor of the class_or_union type.
bool has_no_member() const
virtual bool operator==(const decl_base &) const
Equality operator.
friend void set_member_is_static(decl_base &d, bool s)
Sets the static-ness property of a class member.
virtual size_t get_alignment_in_bits() const
Getter of the alignment of the class_or_union type.
const member_class_templates & get_member_class_templates() const
Get the member class templates of this class.
virtual void set_alignment_in_bits(size_t)
Setter of the alignment of the class type.
vector< type_base_sptr > member_types
Convenience typedef.
virtual size_t get_num_anonymous_member_enums() const
Get the number of anonymous member enums contained in this class.
const var_decl_sptr find_data_member(const string &) const
Find a data member of a given name in the current class_or_union.
Abstract a class template.
shared_ptr< class_decl > get_pattern() const
Getter of the pattern of the template.
void set_pattern(class_decl_sptr p)
Setter of the pattern of the template.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
virtual bool operator==(const decl_base &) const
Return true iff both scopes have the same names and have the same member decls.
The abstraction of the relationship between an entity and its containing scope (its context)....
This is the abstraction of a set of translation units (themselves seen as bundles of unitary abi arte...
shared_ptr< exported_decls_builder > exported_decls_builder_sptr
Convenience typedef for shared_ptr<exported_decls_builder>.
const translation_units & get_translation_units() const
Return the list of translation units of the current corpus.
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.
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.
visibility get_visibility() const
Getter for the visibility of the decl.
visibility
ELF visibility.
bool get_is_declaration_only() const
Test if a decl_base is a declaration-only decl.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
void set_earlier_declaration(const decl_base_sptr &)
set the earlier declaration of this decl_base definition.
const interned_string & get_linkage_name() const
Getter for the mangled name.
friend enum access_specifier get_member_access_specifier(const decl_base &d)
Gets the access specifier for a class member.
friend bool get_member_function_is_virtual(const function_decl &f)
Test if a given member function is virtual.
virtual ~decl_base()
Destructor of the decl_base type.
virtual bool operator==(const decl_base &) const
Return true iff the two decls have the same name.
const interned_string & get_qualified_parent_name() const
Return a copy of the qualified name of the parent of the current decl.
bool get_is_anonymous_or_has_anonymous_parent() const
bool get_has_anonymous_parent() const
Get the "has_anonymous_parent" flag of the current declaration.
bool get_is_in_public_symbol_table() const
Test if the decl is defined in a ELF symbol table as a public symbol.
friend bool equals(const decl_base &, const decl_base &, change_kind *)
Compares two instances of decl_base.
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.
std::unordered_map< string, std::vector< type_base_sptr > > canonical_types_map_type
A convenience typedef for a map of canonical types. The key is the pretty representation string of a ...
bool user_set_analyze_exported_interfaces_only() const
Getter for a property that says if the user actually did set the analyze_exported_interfaces_only() p...
const vector< type_base_sptr > * get_canonical_types(const char *name) const
Get the vector of canonical types which have a given "string representation".
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 "string representation".
const type_base_sptr & get_variadic_parameter_type() const
Get a type_decl instance that represents a the type of a variadic function parameter....
bool is_void_type(const type_base_sptr &) const
Test if a given type is a void type as defined in the current environment.
virtual ~environment()
Destructor for the environment type.
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.
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.
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
void append_parameters(std::vector< parameter_sptr > &parms)
Append a vector of parameters to the type of this function.
bool is_variadic() const
Return true iff the function takes a variable number of parameters.
parameters::const_iterator get_first_non_implicit_parm() const
Getter for the first non-implicit parameter of a function decl.
const function_type_sptr get_type() const
Return the type of the current instance of function_decl.
function_decl(const string &name, function_type_sptr function_type, bool declared_inline, const location &locus, const string &mangled_name, visibility vis, binding bind)
Constructor of the function_decl.
const type_base_sptr get_return_type() const
function_decl_sptr clone() const
Create a new instance of function_decl that is a clone of the current one.
const std::vector< parameter_sptr > & get_parameters() const
void append_parameter(parameter_sptr parm)
Append a parameter to the type of this function.
void set_symbol(const elf_symbol_sptr &sym)
This sets the underlying ELF symbol for the current function decl.
virtual ~function_decl()
Destructor of the function_decl type.
const elf_symbol_sptr & get_symbol() const
Gets the the underlying ELF symbol for the current variable, that was set using function_decl::set_sy...
virtual bool operator==(const decl_base &o) const
Comparison operator for function_decl.
std::vector< parameter_sptr > parameters
Convenience typedef for a vector of parameter_sptr.
bool is_declared_inline() const
Test if the function was declared inline.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Get the pretty representation of the current instance of function_decl.
interned_string get_id() const
Return an ID that tries to uniquely identify the function inside a program or a library.
Abstract a function template declaration.
binding get_binding() const
Get the binding of the function template.
void set_pattern(shared_ptr< function_decl > p)
Set a new pattern to the function template.
shared_ptr< function_decl > get_pattern() const
Get the pattern of the function template.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
virtual bool operator==(const decl_base &) const
Comparison operator for the function_tdecl type.
Abstraction of a function type.
shared_ptr< function_decl::parameter > parameter_sptr
Convenience typedef for a shared pointer on a function_decl::parameter.
virtual 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.
bool is_variadic() const
Test if the current instance of function_type is for a variadic function.
parameters::const_iterator get_first_parm() const
Get the first parameter of the function.
virtual void on_canonical_type_set()
This function is automatically invoked whenever an instance of this type is canonicalized.
virtual bool operator==(const type_base &) const
Equality operator for function_type.
void append_parameter(parameter_sptr parm)
Append a new parameter to the vector of parameters of the current instance of function_type.
void set_parameters(const parameters &p)
Setter for the parameters of the current instance of function_type.
const interned_string & get_cached_name(bool internal=false) const
Get the name of the current function_type.
const parameter_sptr get_parm_at_index_from_first_non_implicit_parm(size_t) const
Get the Ith parameter of the vector of parameters of the current instance of function_type.
type_base_sptr get_return_type() const
Getter for the return type of the current instance of function_type.
void set_return_type(type_base_sptr t)
Setter of the return type of the current instance of function_type.
parameters::const_iterator get_first_non_implicit_parm() const
Get the first parameter of the function.
const parameters & get_parameters() const
Getter for the set of parameters of the current intance of function_type.
std::vector< parameter_sptr > parameters
Convenience typedef for a vector of parameter_sptr.
virtual string get_pretty_representation(bool internal=false, bool qualified_name=true) const
Return a copy of the pretty representation of the current function_type.
This abstracts the global scope of a given translation unit.
The base class for the visitor type hierarchy used for traversing a translation unit.
bool allow_visiting_already_visited_type_node() const
Get if the walker using this visitor is allowed to re-visit a type node that was previously visited o...
bool type_node_has_been_visited(type_base *) const
Test if a given type node has been marked as visited.
void forget_visited_type_nodes()
Un-mark all visited type nodes.
ir_node_visitor()
Default Constructor of the ir_node_visitor type.
void mark_type_node_as_visited(type_base *)
Mark a given type node as having been visited.
The entry point to manage locations.
location create_new_location(const std::string &fle, size_t lne, size_t col)
Insert the triplet representing a source locus into our internal vector of location triplet....
void expand_location(const location &location, std::string &path, unsigned &line, unsigned &column) const
Given an instance of location type, return the triplet {path,line,column} that represents the source ...
The source location of a token.
bool get_is_artificial() const
Test if the location is artificial.
unsigned get_value() const
Get the value of the location.
string expand(void) const
Expand the location into a string.
void expand(std::string &path, unsigned &line, unsigned &column) const
Expand the current location into a tripplet file path, line and column number.
Abstraction of a member function context relationship. This relates a member function to its parent c...
bool is_constructor() const
Getter for the 'is-constructor' property.
bool is_const() const
Getter for the 'is-const' property.
size_t vtable_offset() const
Getter for the vtable offset property.
bool is_destructor() const
Getter for the 'is-destructor' property.
The base class for member types, data members and member functions. Its purpose is mainly to carry th...
access_specifier get_access_specifier() const
Getter for the access specifier of this member.
bool get_is_static() const
Abstracts a member class template template.
virtual bool operator==(const member_base &o) const
Equality operator of the the member_class_template class.
virtual bool traverse(ir_node_visitor &v)
This implements the ir_traversable_base::traverse pure virtual function.
Abstract a member function template.
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
Abstraction of the declaration of a method.
friend void set_member_function_is_const(function_decl &, bool)
set the const-ness property of a member function.
virtual void set_linkage_name(const string &)
Set the linkage name of the method.
const method_type_sptr get_type() const
Abstracts the type of a class member function.
void set_class_type(const class_or_union_sptr &t)
Sets the class type of the current instance of method_type.
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.
void add_member_type(type_base_sptr t)
Add a member type to the current instance of class_or_union.
virtual size_t get_num_anonymous_member_unions() const
Getter for the number of anonymous unions contained in this scope.
scopes & get_member_scopes()
Getter for the scopes carried by the current scope.
std::vector< scope_decl_sptr > scopes
Convenience typedef for a vector of scope_decl_sptr.
bool is_empty() const
Test if the current scope is empty.
virtual bool traverse(ir_node_visitor &)
This implements the ir_traversable_base::traverse pure virtual function.
const type_base_sptrs_type & get_member_types() const
Get the member types of this scope_decl.
decl_base_sptr insert_member_decl(decl_base_sptr member, declarations::iterator before)
Insert a member decl to this scope, right before an element pointed to by a given iterator....
std::vector< decl_base_sptr > declarations
Convenience typedef for a vector of decl_base_sptr.
const type_base_sptrs_type & get_sorted_canonical_types() const
Return a vector of sorted canonical types of the current scope.
bool find_iterator_for_member(const decl_base *, declarations::iterator &)
Find a member of the current scope and return an iterator on it.
virtual void remove_member_decl(decl_base_sptr member)
Remove a declaration from the current scope.
virtual decl_base_sptr add_member_decl(const decl_base_sptr &member)
Add a member decl to this scope. Note that user code should not use this, but rather use add_decl_to_...
type_base_sptr find_member_type(const string &name) const
Find a member type of a given name, inside the current scope_decl.
const declarations & get_member_decls() const
Getter for the member declarations carried by the current scope_decl.
const canonical_type_sptr_set_type & get_canonical_types() const
@eturn the set of canonical types of the the current scope.
const type_base_sptrs_type & get_sorted_member_types() const
Get the sorted member types of this scope_decl.
friend decl_base_sptr add_decl_to_scope(decl_base_sptr decl, scope_decl *scope)
Appends a declaration to a given scope, if the declaration doesn't already belong to one and if the d...
virtual bool operator==(const decl_base &) const
Return true iff both scopes have the same names and have the same member decls.
const declarations & get_sorted_member_decls() const
Getter for the sorted member declarations carried by the current scope_decl.
virtual size_t get_num_anonymous_member_enums() const
Getter for the number of anonymous enums contained in this scope.
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.
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.
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.
friend class_decl * is_class_type(const type_or_decl_base *)
Test whether a type is a class.
friend hash_t peek_hash_value(const type_or_decl_base &)
Get the hash value associated to an IR node.
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...
hash_t combine_hashes(hash_t val1, hash_t val2)
Combine two hash values to produce a third hash value.
hash_t hash(uint64_t v, uint64_t seed)
Hash an integer value and combine it with a hash previously computed.
@ HASHING_FINISHED_STATE
Hashing of given IR node started and is now done.
const type_base * is_void_pointer_type_equivalent(const type_base &type)
Test if a type is equivalent to a pointer to void type.
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 is_declaration_only_class_or_union_type(const type_base_sptr &t, bool look_through_decl_only)
Test wheter a type is a declaration-only class.
bool enum_has_non_name_change(const enum_type_decl &l, const enum_type_decl &r, change_kind *k)
Test if two enums differ, but not by a name change.
const type_base_wptrs_type * lookup_class_types(const string &qualified_name, const corpus &corp)
Look into a given corpus to find the class type*s* that have a given qualified name.
const type_base_sptr lookup_type_in_scope(const string &fqn, const scope_decl_sptr &skope)
Lookup a type in a scope.
bool is_non_canonicalized_type(const type_base *t)
Test if a given type is allowed to be non canonicalized.
bool get_member_function_is_dtor(const function_decl &f)
Test whether a member function is a destructor.
const type_base * peel_qualified_type(const type_base *type)
Return the leaf underlying type of a qualified type.
hash_t peek_hash_value(const type_or_decl_base &artefact)
Get the hash value associated to an IR node.
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_typedef_of_maybe_qualified_class_or_union_type(const type_base_sptr &t)
Test if a type is a typedef of a class or union type, or a typedef of a qualified class or union type...
decl_base_sptr add_decl_to_scope(decl_base_sptr decl, const scope_decl_sptr &scope)
Appends a declaration to a given scope, if the declaration doesn't already belong to a scope.
function_decl_sptr is_function_decl(const type_or_decl_base_sptr &d)
Test whether a declaration is a function_decl.
class_decl_sptr is_class_type(const type_or_decl_base_sptr &d)
Test whether a type is a class.
bool is_template_parm_composition_type(const shared_ptr< decl_base > decl)
Tests whether a decl is a template parameter composition type.
type_base_sptr canonicalize(type_base_sptr t, bool do_log, bool show_stats)
Compute the canonical type of a given type.
bool get_member_is_static(const decl_base &d)
Gets a flag saying if a class member is static or not.
pointer_type_def_sptr is_pointer_to_npaf_type(const type_base_sptr &t)
Test if we are looking at a pointer to a neither-a-pointer-to-an-array-nor-a-function type.
bool debug_equals(const type_or_decl_base *l, const type_or_decl_base *r)
Test if two ABI artifacts are equal.
decl_base * debug(const decl_base *artifact)
Emit a textual representation of an artifact to std error stream for debugging purposes.
shared_ptr< function_decl > function_decl_sptr
Convenience typedef for a shared pointer on a function_decl.
access_specifier
Access specifier for class members.
size_t get_canonical_type_index(const type_base &t)
Getter of the canonical type index of a given type.
pointer_type_def_sptr lookup_pointer_type(const interned_string &qualified_name, const corpus &corp)
Look into a given corpus to find a pointer type which has a given qualified name.
class_decl_sptr lookup_class_type(const interned_string &qualified_name, const corpus &corp)
Look into a given corpus to find a class type which has a given qualified name.
interned_string get_type_name(const type_base &t, bool qualified, bool internal)
Get the name of a given type and return a copy of it.
bool function_decls_alias(const function_decl &f1, const function_decl &f2)
Test if two function declarations are aliases.
pointer_type_def_sptr is_pointer_to_array_type(const type_base_sptr &t)
Test if a type is a pointer to array type.
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.
reference_type_def_sptr lookup_reference_type(const interned_string &qualified_name, const corpus &corp)
Look into a given corpus to find a reference type which has a given qualified name.
type_decl_sptr lookup_basic_type_per_location(const string &loc, const corpus &corp)
Lookup a type_decl type from a given corpus, by its location.
ptr_to_mbr_type_sptr is_ptr_to_mbr_type(const type_or_decl_base_sptr &t, bool look_through_qualifiers)
Test whether a type is a ptr_to_mbr_type_sptr.
class_decl_sptr is_compatible_with_class_type(const decl_base_sptr &t)
Test if a type is a class. This function looks through typedefs.
corpus::origin operator|=(corpus::origin &l, corpus::origin r)
Bitwise |= operator for the corpus::origin type.
vector< type_base_wptr > type_base_wptrs_type
A convenience typedef for a vector of type_base_wptr.
const type_base_sptr is_void_pointer_type(const type_base_sptr &t)
Test if a type is a pointer to void type.
bool operator==(const union_decl_sptr &l, const union_decl_sptr &r)
Turn equality of shared_ptr of union_decl into a deep equality; that is, make it compare the pointed ...
void fixup_virtual_member_function(method_decl_sptr method)
When a virtual member function has seen its virtualness set by set_member_function_is_virtual(),...
void pop_composite_type_comparison_operands(const type_base &left, const type_base &right)
Pop a pair of operands from the stack of operands to the current type comparison.
bool equals_modulo_cv_qualifier(const array_type_def *l, const array_type_def *r)
Test if two variables are equals modulo CV qualifiers.
const type_base_wptrs_type * lookup_enum_types(const string &qualified_name, const corpus &corp)
Look into a given corpus to find the enum type*s* that have a given qualified name.
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.
string get_class_or_union_flat_representation(const class_or_union_sptr &cou, const string &indent, bool one_line, bool internal, bool qualified_names)
Get the flat representation of an instance of class_or_union type.
bool is_type(const type_or_decl_base &tod)
Test whether a declaration is a type.
union_decl_sptr lookup_union_type(const string &type_name, const corpus &corp)
Look into a given corpus to find a union type which has a given qualified name.
bool is_anonymous_data_member(const decl_base &d)
Test if a decl is an anonymous data member.
bool is_template_parameter(const shared_ptr< decl_base > decl)
Tests whether a decl is a template parameter.
translation_unit * get_translation_unit(const type_or_decl_base_sptr &decl)
Return the translation unit a declaration belongs to.
bool is_anonymous_data_member(const var_decl &d)
Test if a var_decl is an anonymous data member.
string translation_unit_language_to_string(translation_unit::language l)
Converts a translation_unit::language enumerator into a string.
weak_ptr< type_base > type_base_wptr
Convenience typedef for a weak pointer on a type_base.
type_decl_sptr is_integral_type(const type_or_decl_base_sptr &t)
Test if a type is an integral type.
type_base_sptr peel_reference_type(const type_base_sptr &type)
Return the leaf pointed-to type node of a reference_type_def node.
class_decl::base_spec * is_class_base_spec(const type_or_decl_base *tod)
Test if an ABI artifact is a class base specifier.
bool has_scope(const decl_base &d)
Tests if a declaration has got a scope.
scope_decl * get_type_scope(const type_base_sptr &t)
Get the scope of a given type.
array_type_def::subrange_type * is_subrange_type(const type_or_decl_base *type)
Test if a type is an array_type_def::subrange_type.
shared_ptr< elf_symbol > elf_symbol_sptr
A convenience typedef for a shared pointer to elf_symbol.
typedef_decl_sptr lookup_typedef_type(const interned_string &qualified_name, const corpus &corp)
Look into a given corpus to find a typedef type which has a given qualified name.
type_base_sptr lookup_type_from_translation_unit(const string &type_name, const string &tu_path, const corpus &corp)
Lookup a type from a given translation unit present in a give corpus.
var_decl_sptr get_data_member(type_base *clazz, const char *member_name)
Get a given data member, referred to by its name, of a class type.
type_base * get_exemplar_type(const type_base *type)
For a given type, return its exemplar type.
type_base_sptr lookup_type_through_scopes(const list< string > &fqn, const translation_unit &tu)
Lookup a type from a translation unit by walking its scopes in sequence and by looking into them.
location get_location(const decl_base_sptr &decl)
Get the location of a given declaration.
const typedef_decl * is_typedef(const type_or_decl_base *t)
Test whether a type is a typedef.
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.
type_base_sptr look_through_decl_only_type(const type_base_sptr &t)
If a type is is decl-only, then get its definition. Otherwise, just return the initial type.
void remove_decl_from_scope(decl_base_sptr decl)
Remove a given decl from its scope.
type_base_sptr peel_qualified_or_typedef_type(const type_base_sptr &t)
Return the leaf underlying type of a qualified or typedef type.
bool odr_is_relevant(const type_or_decl_base &artifact)
By looking at the language of the TU a given ABI artifact belongs to, test if the ONE Definition Rule...
array_type_def_sptr clone_array(const array_type_def_sptr &array)
Clone an array type.
enum_type_decl_sptr lookup_enum_type_per_location(const string &loc, const corpus &corp)
Look up an enum_type_decl from a given corpus, by its location.
change_kind
A bitfield that gives callers of abigail::ir::equals() some insight about how different two internal ...
@ LOCAL_TYPE_CHANGE_KIND
This means that a given IR artifact has a local type change.
@ SUBTYPE_CHANGE_KIND
This means that a given IR artifact has changes in some of its sub-types, with respect to the other a...
@ LOCAL_NON_TYPE_CHANGE_KIND
This means that a given IR artifact has a local non-type change. That is a change that is carried by ...
var_decl_sptr find_last_data_member_matching_regexp(const class_or_union &t, const regex::regex_t_sptr ®ex)
Find the last data member of a class or union which name matches a regular expression.
const ptr_to_mbr_type * is_ptr_to_mbr_type(const type_or_decl_base *t, bool look_through_qualifiers)
Test whether a type is a ptr_to_mbr_type.
const var_decl_sptr get_first_non_anonymous_data_member(const var_decl_sptr anon_dm)
Get the first non-anonymous data member of a given anonymous data member.
class_decl_sptr lookup_class_type_through_scopes(const list< string > &fqn, const translation_unit &tu)
Lookup a class type from a translation unit by walking its scopes in sequence and by looking into the...
shared_ptr< class_or_union > is_class_or_union_type(const shared_ptr< type_or_decl_base > &t)
Test if a type is a class_or_union.
string get_enum_flat_representation(const enum_type_decl &enum_type, const string &indent, bool one_line, bool qualified_names)
Get the flat representation of an instance of enum_type_decl type.
bool is_user_defined_type(const type_base *t)
Test if a type is user-defined.
bool operator==(const translation_unit_sptr &l, const translation_unit_sptr &r)
A deep comparison operator for pointers to translation units.
class_or_union_sptr anonymous_data_member_to_class_or_union(const var_decl_sptr &d)
Get the class_or_union type of a given anonymous data member.
weak_ptr< class_decl > class_decl_wptr
Convenience typedef for a weak pointer on a class_decl.
string components_to_type_name(const list< string > &comps)
Turn a set of qualified name components (that name a type) into a qualified name string.
void unmark_types_as_being_compared(T &l, T &r)
Mark a pair of types as being not compared anymore.
vector< type_base_sptr > type_base_sptrs_type
Helper typedef for a vector of shared pointer to a type_base.
void debug_comp_stack(const environment &env)
Emit a trace of the two comparison operands stack on the standard error stream.
bool collect_non_anonymous_data_members(const class_or_union *cou, string_decl_base_sptr_map &dms)
Collect all the non-anonymous data members of a class or union type.
union_decl_sptr is_union_type(const shared_ptr< type_or_decl_base > &t)
Test if a type is a union_decl.
bool is_class_type(const type_or_decl_base &t)
Test whether a type is a class.
type_base_sptr synthesize_type_from_translation_unit(const type_base_sptr &type, translation_unit &tu)
In a translation unit, lookup a given type or synthesize it if it's a qualified type.
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.
method_type * is_method_type(type_or_decl_base *t)
Test whether a type is a method_type.
function_type_sptr lookup_or_synthesize_fn_type(const function_type_sptr &fn_t, const corpus &corpus)
Look into an ABI corpus for a function type.
qualified_type_def_sptr lookup_qualified_type(const interned_string &qualified_name, const corpus &corp)
Look into a given corpus to find a qualified type which has a given qualified name.
bool is_declaration_only_class_or_union_type(const type_base *t, bool look_through_decl_only)
Test wheter a type is a declaration-only class.
type_base_sptr lookup_type(const type_base_sptr &t, const corpus &corp)
Look into a given corpus to find a type.
string get_pretty_representation(const type_or_decl_base *tod, bool internal)
Build and return a copy of the pretty representation of an ABI artifact that could be either a type o...
type_base_sptr lookup_class_typedef_or_enum_type(const string &qualified_name, const corpus &corp)
Look into a corpus to find a class, typedef or enum type which has a given qualified name.
const type_base_sptr peel_qualified_type(const type_base_sptr &type)
Return the leaf underlying type of a qualified type.
type_base_sptr peel_const_qualified_type(const qualified_type_def_sptr &q)
If a qualified type is const, then return its underlying type.
function_type_sptr lookup_function_type(const interned_string &qualified_name, const corpus &corp)
Look into a given corpus to find a function type which has a given qualified name.
const class_or_union_sptr data_member_has_anonymous_type(const var_decl &d)
Test if a data member has annonymous type or not.
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.
type_decl_sptr is_real_type(const type_or_decl_base_sptr &t)
Test if a type is a real type.
void set_member_function_is_dtor(function_decl &f, bool d)
Set the destructor-ness property of a member function.
const function_type * is_function_type(const type_or_decl_base *t)
Test whether a type is a function_type.
const type_base_sptr peel_array_type(const type_base_sptr &type)
Return the leaf element type of an array.
bool types_have_similar_structure(const type_base_sptr &first, const type_base_sptr &second, bool indirect_type)
Test if two types have similar structures, even though they are (or can be) different.
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.
enum_type_decl_sptr look_through_decl_only_enum(enum_type_decl_sptr enom)
If an enum is a decl-only enum, get its definition. Otherwise, just return the initial enum.
class_or_union * is_class_or_union_type(const type_or_decl_base *t)
Test if a type is a class_or_union.
type_base * 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.
string get_name(const type_or_decl_base_sptr &tod, bool qualified)
Build and return a copy of the name of an ABI artifact that is either a type of a decl.
bool is_anonymous_type(const type_base_sptr &t)
Test if a given type is anonymous.
decl_base_sptr strip_useless_const_qualification(const qualified_type_def_sptr t)
Strip qualification from a qualified type, when it makes sense.
bool is_comparison_cycle_detected(T &l, T &r)
Detect if a recursive comparison cycle is detected while structurally comparing two types (a....
bool string_to_elf_symbol_type(const string &s, elf_symbol::type &t)
Convert a string representing a symbol type into an elf_symbol::type.
namespace_decl_sptr is_namespace(const decl_base_sptr &d)
Tests if a declaration is a namespace declaration.
array_type_def_sptr is_array_of_qualified_element(const type_base_sptr &type)
Test if an array type is an array to a qualified element type.
const type_decl * is_type_decl(const type_or_decl_base *t)
Test whether a type is a type_decl (a builtin type).
decl_base * is_decl_slow(const type_or_decl_base *t)
Test if an ABI artifact is a declaration.
decl_base_sptr look_through_decl_only(const decl_base &d)
If a decl is decl-only get its definition. Otherwise, just return nil.
function_type_sptr is_function_type(const type_or_decl_base_sptr &t)
Test whether a type is a function_type.
scope_decl_sptr is_scope_decl(const decl_base_sptr &d)
Test if a declaration is a scope_decl.
string get_name(const type_or_decl_base *tod, bool qualified)
Build and return a copy of the name of an ABI artifact that is either a type or a decl.
void set_member_access_specifier(decl_base &d, access_specifier a)
Sets the access specifier for a class member.
decl_base_sptr look_through_decl_only(const decl_base_sptr &d)
If a decl is decl-only get its definition. Otherwise, just return nil.
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.
type_base_sptr is_type(const type_or_decl_base_sptr &tod)
Test whether a declaration is a type.
uint64_t get_var_size_in_bits(const var_decl_sptr &v)
Get the size of a given variable.
string get_debug_representation(const type_or_decl_base *artifact)
Get the textual representation of a type for debugging purposes.
shared_ptr< function_type > function_type_sptr
Convenience typedef for a shared pointer on a function_type.
shared_ptr< typedef_decl > typedef_decl_sptr
Convenience typedef for a shared pointer on a typedef_decl.
function_type_sptr synthesize_function_type_from_translation_unit(const function_type &fn_type, translation_unit &tu)
In a translation unit, lookup the sub-types that make up a given function type and if the sub-types a...
std::ostream & operator<<(std::ostream &o, elf_symbol::type t)
Serialize an instance of symbol_type and stream it to a given output stream.
type_base_sptr peel_pointer_type(const type_base_sptr &type)
Return the leaf pointed-to type node of a pointer_type_def node.
bool var_equals_modulo_types(const var_decl &l, const var_decl &r, change_kind *k)
Compares two instances of var_decl without taking their type into account.
type_base_sptr lookup_type_through_translation_units(const string &qn, const corpus &abi_corpus)
Lookup a type definition in all the translation units of a given ABI corpus.
void sort_types(const canonical_type_sptr_set_type &types, vector< type_base_sptr > &result)
Sort types in a hopefully stable manner.
type_base * peel_pointer_or_reference_type(const type_base *type, bool peel_qual_type)
Return the leaf underlying or pointed-to type node of a, pointer_type_def, reference_type_def or qual...
decl_base_sptr is_decl_slow(const type_or_decl_base_sptr &t)
Test if an ABI artifact is a declaration.
reference_type_def * is_reference_type(type_or_decl_base *t, bool look_through_qualifiers)
Test whether a type is a reference_type_def.
corpus::origin operator|(corpus::origin l, corpus::origin r)
Bitwise | operator for the corpus::origin type.
bool elf_symbol_is_function(elf_symbol::type t)
Test if the type of an ELF symbol denotes a function symbol.
bool is_cplus_plus_language(translation_unit::language l)
Test if a language enumerator designates the C++ language.
enum_type_decl_sptr is_compatible_with_enum_type(const decl_base_sptr &t)
Test if a type is an enum. This function looks through typedefs.
function_decl::parameter_sptr is_function_parameter(const type_or_decl_base_sptr tod)
Test whether an ABI artifact is a function_decl.
class_or_union_sptr look_through_decl_only_class(class_or_union_sptr klass)
If a class (or union) is a decl-only class, get its definition. Otherwise, just return the initial cl...
bool lookup_decl_only_class_types(const interned_string &qualified_name, const corpus &corp, type_base_wptrs_type &result)
Look into a given corpus to find the class type*s* that have a given qualified name and that are decl...
bool member_function_has_vtable_offset(const function_decl &f)
Test if a virtual member function has a vtable offset set.
const type_base * peel_typedef_type(const type_base *type)
Return the leaf underlying type node of a typedef_decl node.
decl_base_sptr insert_decl_into_scope(decl_base_sptr decl, scope_decl::declarations::iterator before, scope_decl *scope)
Inserts a declaration into a given scope, before a given IR child node of the scope.
unordered_map< interned_string, bool, hash_interned_string > interned_string_bool_map_type
Convenience typedef for a map of interned_string -> bool.
const enum_type_decl * is_enum_type(const type_or_decl_base *d)
Test if a decl is an enum_type_decl.
unordered_map< interned_string, type_base_wptrs_type, hash_interned_string > istring_type_base_wptrs_map_type
A convenience typedef for a map which key is an interned_string and which value is a vector of type_b...
bool function_decl_is_less_than(const function_decl &f, const function_decl &s)
Test if the pretty representation of a given function_decl is lexicographically less then the pretty ...
bool elf_symbols_alias(const elf_symbol &s1, const elf_symbol &s2)
Test if two symbols alias.
var_decl_sptr find_data_member_from_anonymous_data_member(const var_decl_sptr &anon_dm, const string &name)
Find a data member inside an anonymous data member.
shared_ptr< var_decl > var_decl_sptr
Convenience typedef for a shared pointer on a var_decl.
shared_ptr< ptr_to_mbr_type > ptr_to_mbr_type_sptr
Convenience typedef for a shared pointer to a ptr_to_mbr_type.
const location & get_natural_or_artificial_location(const decl_base *decl)
Get the non-artificial (natural) location of a decl.
string build_qualified_name(const scope_decl *scope, const type_base_sptr &type)
Build and return the qualified name of a type in its scope.
size_t hash_type_or_decl(const type_or_decl_base *tod)
Hash an ABI artifact that is either a type or a decl.
array_type_def_sptr is_array_type(const type_or_decl_base_sptr &type, bool look_through_qualifiers)
Test if a type is an array_type_def.
corpus::origin operator&(corpus::origin l, corpus::origin r)
Bitwise & operator for the corpus::origin type.
bool is_template_decl(const decl_base_sptr &decl)
Tests whether a decl is a template.
shared_ptr< scope_decl > scope_decl_sptr
Convenience typedef for a shared pointer on a scope_decl.
class_decl_sptr lookup_class_type_per_location(const string &loc, const corpus &corp)
Look up a class_decl from a given corpus by its location.
bool string_to_elf_symbol_binding(const string &s, elf_symbol::binding &b)
Convert a string representing a an elf symbol binding into an elf_symbol::binding.
shared_ptr< type_or_decl_base > type_or_decl_base_sptr
A convenience typedef for a shared_ptr to type_or_decl_base.
ssize_t get_member_function_vtable_offset(const function_decl_sptr &f)
Get the vtable offset of a member function.
shared_ptr< translation_unit > translation_unit_sptr
Convenience typedef for a shared pointer on a translation_unit type.
bool is_data_member_of_anonymous_class_or_union(const var_decl &d)
Test if a var_decl is a data member belonging to an anonymous type.
namespace_decl * is_namespace(const decl_base *d)
Tests if a declaration is a namespace declaration.
type_base * peel_typedef_pointer_or_reference_type(const type_base *type, bool peel_qual_type)
Return the leaf underlying or pointed-to type node of a typedef_decl, pointer_type_def or reference_t...
const type_base * is_void_pointer_type_equivalent(const type_base *type)
Test if a type is equivalent to a pointer to void type.
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.
type_base * type_has_non_canonicalized_subtype(type_base_sptr t)
Test if a type has sub-types that are non-canonicalized.
unordered_map< string, decl_base_sptr > string_decl_base_sptr_map
Convenience typedef for a map which key is a string and which value is a decl_base_sptr.
void push_composite_type_comparison_operands(const type_base &left, const type_base &right)
Push a pair of operands on the stack of operands of the current type comparison, during type canonica...
bool is_java_language(translation_unit::language l)
Test if a language enumerator designates the Java language.
function_decl::parameter * is_function_parameter(const type_or_decl_base *tod)
Test whether a declaration is a function_decl.
type_decl_sptr lookup_basic_type(const string &qualified_name, const corpus &corp)
Look into a given corpus to find a basic type which has a given qualified name.
class_or_union * is_at_class_scope(const decl_base &decl)
Tests whether a given decl is at class scope.
bool equals(const decl_base &l, const decl_base &r, change_kind *k)
Compares two instances of decl_base.
bool get_data_member_is_laid_out(const var_decl &m)
Test whether a data member is laid out.
const decl_base_sptr lookup_var_decl_in_scope(const std::list< string > &comps, const scope_decl_sptr &skope)
lookup a var_decl in a scope.
bool string_to_elf_symbol_visibility(const string &s, elf_symbol::visibility &v)
Convert a string representing a an elf symbol visibility into an elf_symbol::visibility.
union_decl_sptr lookup_union_type_per_location(const string &loc, const corpus &corp)
Lookup a union type in a given corpus, from its location.
weak_ptr< elf_symbol > elf_symbol_wptr
A convenience typedef for a weak pointer to elf_symbol.
bool get_member_function_is_const(const function_decl &f)
Test whether a member function is const.
interned_string get_name_of_reference_to_type(const type_base &pointed_to_type, bool lvalue_reference, bool qualified, bool internal)
Get the name of the reference to a given type.
shared_ptr< pointer_type_def > pointer_type_def_sptr
Convenience typedef for a shared pointer on a pointer_type_def.
void maybe_update_types_lookup_map(const type_decl_sptr &basic_type)
Update the map that associates the fully qualified name of a basic type with the type itself.
bool is_enumerator_present_in_enum(const enum_type_decl::enumerator &enr, const enum_type_decl &enom)
Test if a given enumerator is found present in an enum.
interned_string get_method_type_name(const method_type &fn_type, bool internal)
Get the name of a given method type and return a copy of it.
bool is_const_qualified_type(const qualified_type_def_sptr &t)
Test if a given qualified type is const.
translation_unit::language string_to_translation_unit_language(const string &l)
Parse a string representing a language into a translation_unit::language enumerator into a string.
enum_type_decl_sptr is_enum_type(const type_or_decl_base_sptr &d)
Test if a decl is an enum_type_decl.
var_decl_sptr has_fake_flexible_array_data_member(const class_decl_sptr &klass)
Test if the last data member of a class is an array with one element.
type_base_sptr lookup_type_per_location(const interned_string &loc, const corpus &corp)
Lookup a type from a corpus, by its location.
bool get_next_data_member_offset(const class_or_union *klass, const var_decl_sptr &dm, uint64_t &offset)
Get the offset of the non-static data member that comes after a given one.
uint64_t get_absolute_data_member_offset(const var_decl &m)
Get the absolute offset of a data member.
shared_ptr< ir_traversable_base > ir_traversable_base_sptr
Convenience typedef for a shared pointer to ir_traversable_base.
bool is_member_function(const function_decl &f)
Test whether a function_decl is a member function.
const function_decl::parameter * get_function_parameter(const decl_base *fun, unsigned parm_index)
Get the function parameter designated by its index.
var_decl * is_var_decl(const type_or_decl_base *tod)
Tests if a declaration is a variable declaration.
string get_pretty_representation(const method_type_sptr method, bool internal)
Get the pretty representation of a method type.
bool is_c_language(translation_unit::language l)
Test if a language enumerator designates the C language.
decl_base * is_decl(const type_or_decl_base *d)
Test if an ABI artifact is a declaration.
void keep_type_alive(type_base_sptr t)
Make sure that the life time of a given (smart pointer to a) type is the same as the life time of the...
method_decl * is_method_decl(const type_or_decl_base *d)
Test if a function_decl is actually a method_decl.
bool is_member_type(const type_base_sptr &t)
Tests if a type is a class member.
string get_class_or_union_flat_representation(const class_or_union &cou, const string &indent, bool one_line, bool internal, bool qualified_names)
Get the flat representation of an instance of class_or_union type.
array_type_def::subrange_sptr is_subrange_type(const type_or_decl_base_sptr &type)
Test if a type is an array_type_def::subrange_type.
decl_base_sptr add_decl_to_scope(decl_base_sptr decl, scope_decl *scope)
Appends a declaration to a given scope, if the declaration doesn't already belong to one and if the d...
string build_internal_underlying_enum_type_name(const string &base_name, bool is_anonymous, uint64_t size)
Build the internal name of the underlying type of an enum.
bool is_npaf_type(const type_base_sptr &t)
Test if a type is a neither a pointer, an array nor a function type.
access_specifier get_member_access_specifier(const decl_base &d)
Gets the access specifier for a class member.
shared_ptr< enum_type_decl > enum_type_decl_sptr
Convenience typedef for shared pointer to a enum_type_decl.
void set_data_member_offset(var_decl_sptr m, uint64_t o)
Set the offset of a data member into its containing class.
const interned_string & get_node_name(var_decl_sptr node)
Gets the name of a var_decl node.
type_base_sptr strip_typedef(const type_base_sptr type)
Recursively returns the the underlying type of a typedef. The return type should not be a typedef of ...
uint64_t get_data_member_offset(const var_decl &m)
Get the offset of a data member.
unordered_set< uintptr_t > pointer_set
A convenience typedef for an unordered set of pointer values.
type_decl_sptr is_type_decl(const type_or_decl_base_sptr &t)
Test whether a type is a type_decl (a builtin type).
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.
bool types_are_compatible(const decl_base_sptr d1, const decl_base_sptr d2)
Test if two types are equal modulo a typedef.
class_or_union * anonymous_data_member_to_class_or_union(const var_decl *d)
Get the class_or_union type of a given anonymous data member.
location get_location(const type_base_sptr &type)
Get the location of the declaration of a given type.
pointer_type_def_sptr is_pointer_to_function_type(const type_base_sptr &t)
Test if a type is a pointer to function type.
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.
interned_string get_function_type_name(const function_type_sptr &fn_type, bool internal)
Get the name of a given function type and return a copy of it.
bool is_function_template_pattern(const shared_ptr< decl_base > decl)
Test whether a decl is the pattern of a function template.
class_or_union * look_through_decl_only_class(class_or_union *the_class)
If a class (or union) is a decl-only class, get its definition. Otherwise, just return the initial cl...
bool is_union_type(const type_or_decl_base &t)
Test if a type is a union_decl.
const location & get_artificial_or_natural_location(const decl_base *decl)
Get the artificial location of a decl.
bool is_global_scope(const shared_ptr< scope_decl >scope)
Tests whether if a given scope is the global scope.
typedef_decl_sptr lookup_typedef_type_per_location(const string &loc, const corpus &corp)
Lookup a typedef_decl from a corpus, by its location.
type_base_sptr peel_typedef_type(const type_base_sptr &type)
Return the leaf underlying type node of a typedef_decl node.
interned_string get_name_of_qualified_type(const type_base_sptr &underlying_type, qualified_type_def::CV quals, bool qualified, bool internal)
Get the name of a qualified type, given the underlying type and its qualifiers.
shared_ptr< template_decl > template_decl_sptr
Convenience typedef for a shared pointer to template_decl.
array_type_def_sptr is_typedef_of_array(const type_base_sptr &t)
Test if a type is a typedef of an array.
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 decl_base * get_type_declaration(const type_base *t)
Get the declaration for a given type.
bool is_at_global_scope(const decl_base *decl)
Tests whether a given declaration is at global scope.
void set_member_is_static(decl_base &d, bool s)
Sets the static-ness property of a class member.
array_type_def * is_array_type(const type_or_decl_base *type, bool look_through_qualifiers)
Test if a type is an array_type_def.
weak_ptr< template_decl > template_decl_wptr
Convenience typedef for a weak pointer to template_decl.
const var_decl * lookup_data_member(const type_base *type, const char *dm_name)
Look for a data member of a given class, struct or union type and return it.
interned_string get_function_id_or_pretty_representation(const function_decl *fn)
Get the ID of a function, or, if the ID can designate several different functions,...
shared_ptr< type_decl > type_decl_sptr
Convenience typedef for a shared pointer on a type_decl.
const global_scope * get_global_scope(const shared_ptr< decl_base > decl)
Return the global scope as seen by a given declaration.
typedef_decl_sptr clone_typedef(const typedef_decl_sptr &t)
Clone a typedef type.
bool compare_using_locations(const decl_base *f, const decl_base *s)
Compare decls using their locations.
string get_enum_flat_representation(const enum_type_decl_sptr &enum_type, const string &indent, bool one_line, bool qualified_names)
Get the flat representation of an instance of enum_type_decl type.
unordered_set< type_base_sptr, canonical_type_hash > canonical_type_sptr_set_type
Helper typedef for an unordered set of type_base_sptr which uses pointer value to tell its members ap...
bool return_comparison_result(T &l, T &r, bool value)
Return the result of the comparison of two (sub) types.
array_type_def_sptr lookup_array_type(const interned_string &qualified_name, const corpus &corp)
Look into a given corpus to find an array type which has the same qualified name as a given array typ...
shared_ptr< namespace_decl > namespace_decl_sptr
Convenience typedef for a shared pointer on namespace_decl.
var_decl_sptr is_var_decl(const type_or_decl_base_sptr &decl)
Tests if a declaration is a variable declaration.
bool is_ada_language(translation_unit::language l)
Test if a language enumerator designates the Ada language.
string demangle_cplus_mangled_name(const string &mangled_name)
Demangle a C++ mangled name and return the resulting string.
bool is_unique_type(const type_base_sptr &t)
Test if a type is unique in the entire environment.
void maybe_update_types_lookup_map(const function_type_sptr &fn_type)
Update the map that associates the fully qualified name of a function type with the type itself.
void mark_types_as_being_compared(T &l, T &r)
Mark a pair of types as being compared.
interned_string get_type_name(const type_base_sptr &t, bool qualified, bool internal)
Get the name of a given type and return a copy of it.
corpus::origin operator&=(corpus::origin &l, corpus::origin r)
Bitwise &= operator for the corpus::origin type.
type_base_sptr clone_array_tree(const type_base_sptr t)
Clone a type tree made of an array or a typedef of array.
interned_string get_function_type_name(const function_type &fn_type, bool internal)
Get the name of a given function type and return a copy of it.
decl_base_sptr is_decl(const type_or_decl_base_sptr &d)
Test if an ABI artifact is a declaration.
bool operator!=(const translation_unit_sptr &l, const translation_unit_sptr &r)
A deep inequality operator for pointers to translation units.
interned_string get_name_of_pointer_to_type(const type_base &pointed_to_type, bool qualified, bool internal)
Get the name of the pointer to a given type.
bool is_at_template_scope(const shared_ptr< decl_base > decl)
Tests whether a given decl is at template scope.
function_decl * is_function_decl(const type_or_decl_base *d)
Test whether a declaration is a function_decl.
bool elf_symbol_is_variable(elf_symbol::type t)
Test if the type of an ELF symbol denotes a function symbol.
bool type_has_sub_type_changes(const type_base_sptr t_v1, const type_base_sptr t_v2)
Tests if the change of a given type effectively comes from just its sub-types. That is,...
bool maybe_update_types_lookup_map< class_decl >(const class_decl_sptr &class_type, istring_type_base_wptrs_map_type &map, bool use_type_name_as_key)
This is the specialization for type class_decl of the function template:
var_decl_sptr has_flexible_array_data_member(const class_decl_sptr &klass)
Test if the last data member of a class is an array with non-finite data member.
method_type_sptr is_method_type(const type_or_decl_base_sptr &t)
Test whether a type is a method_type.
qualified_type_def * is_qualified_type(const type_or_decl_base *t)
Test whether a type is a reference_type_def.
bool is_typedef_ptr_or_ref_to_decl_only_class_or_union_type(const type_base *t)
Test if a type is a typedef, pointer or reference to a decl-only class/union.
const scope_decl * get_top_most_scope_under(const decl_base_sptr decl, const scope_decl_sptr scope)
Return the a scope S containing a given declaration and that is right under a given scope P.
std::unordered_map< string, elf_symbols > string_elf_symbols_map_type
Convenience typedef for a map which key is a string and which value is a vector of elf_symbol.
string build_qualified_name(const scope_decl *scope, const string &name)
Build and return a qualified name from a name and its scope.
bool is_ptr_ref_or_qual_type(const type_base *t)
Helper to detect if a type is either a reference, a pointer, or a qualified type.
method_decl_sptr copy_member_function(const class_or_union_sptr &t, const method_decl_sptr &method)
Copy a method of a class_or_union into a new class_or_union.
decl_base_sptr get_type_declaration(const type_base_sptr t)
Get the declaration for a given type.
shared_ptr< function_tdecl > function_tdecl_sptr
Convenience typedef for a shared pointer on a function_tdecl.
type_base * peel_qualified_or_typedef_type(const type_base *type)
Return the leaf underlying type of a qualified or typedef type.
type_base_sptr type_or_void(const type_base_sptr t, const environment &env)
Return either the type given in parameter if it's non-null, or the void type.
pointer_type_def_sptr is_pointer_type(const type_or_decl_base_sptr &t, bool look_through_qualifiers)
Test whether a type is a pointer_type_def.
type_decl * is_real_type(const type_or_decl_base *t)
Test if a type is a real type.
const type_base_wptrs_type * lookup_union_types(const string &qualified_name, const corpus &corp)
Look into a given corpus to find the union types that have a given qualified name.
bool is_member_decl(const decl_base_sptr d)
Tests if a declaration is a class member.
bool maybe_compare_as_member_decls(const decl_base &l, const decl_base &r, change_kind *k)
Compare the properties that belong to the "is-a-member-relation" of a decl.
qualified_type_def_sptr is_qualified_type(const type_or_decl_base_sptr &t)
Test whether a type is a qualified_type_def.
bool class_or_union_types_of_same_kind(const class_or_union_sptr &first, const class_or_union_sptr &second)
Test if two class or union types are of the same kind.
reference_type_def_sptr is_reference_type(const type_or_decl_base_sptr &t, bool look_through_qualifiers)
Test whether a type is a reference_type_def.
bool get_member_function_is_ctor(const function_decl &f)
Test whether a member function is a constructor.
void set_member_function_is_ctor(function_decl &f, bool c)
Setter for the is_ctor property of the member function.
bool is_declaration_only_class_type(const type_base_sptr &t, bool look_through_decl_only)
Test wheter a type is a declaration-only class.
enum_type_decl_sptr lookup_enum_type(const interned_string &qualified_name, const corpus &corp)
Look into a given corpus to find an enum type which has a given qualified name.
bool match(const regex_t_sptr &r, const std::string &str)
See if a string matches a regex.
std::shared_ptr< regex_t > regex_t_sptr
A convenience typedef for a shared pointer of regex_t.
Toplevel namespace for libabigail.
bool operator==(const std::string &l, const interned_string &r)
Equality operator.
std::string operator+(const interned_string &s1, const std::string &s2)
Concatenation operator.
std::ostream & operator<<(std::ostream &o, const interned_string &s)
Streaming operator.
unordered_map< string, string * > pool_map_type
Convenience typedef for a map of string -> string*.
A functor to hash instances of interned_string.
size_t operator()(const type_base_sptr &l) const
Hash a type by returning the pointer value of its canonical type.
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 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.