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));
899 return dynamic_cast<T*
>(type);
916#if WITH_DEBUG_TYPE_CANONICALIZATION
936 if (env.priv_->use_canonical_type_comparison_)
940 ABG_RETURN_EQUAL(lc, rc);
949 if (l_hash != r_hash)
960 ABG_RETURN_EQUAL(lc, rc);
968 if (l_hash != r_hash)
991 bool result = l.priv_->comparison_started(l, r);
1031#define RETURN_TRUE_IF_COMPARISON_CYCLE_DETECTED(l, r) \
1034 if (is_comparison_cycle_detected(l, r)) \
1052 l.priv_->mark_as_being_compared(l, r);
1087 l.priv_->unmark_as_being_compared(l, r);
1133#define CACHE_AND_RETURN_COMPARISON_RESULT(value) \
1136 bool res = return_comparison_result(l, r, value); \
1137 l.get_environment().priv_->cache_type_comparison_result(l, r, res); \
1145#define CACHE_COMPARISON_RESULT_AND_RETURN(value) \
1148 l.get_environment().priv_->cache_type_comparison_result(l, r, value); \
1156const vector<type_base_wptr>&
1159 if (priv_->sorted_types_.empty())
1161 istring_type_base_wptrs_map_type::const_iterator i;
1162 vector<type_base_wptr>::const_iterator j;
1165 for (j = i->second.begin(); j != i->second.end(); ++j)
1166 priv_->sorted_types_.push_back(*j);
1169 for (j = i->second.begin(); j != i->second.end(); ++j)
1170 priv_->sorted_types_.push_back(*j);
1173 for (j = i->second.begin(); j != i->second.end(); ++j)
1174 priv_->sorted_types_.push_back(*j);
1177 for (j = i->second.begin(); j != i->second.end(); ++j)
1178 priv_->sorted_types_.push_back(*j);
1181 for (j = i->second.begin(); j != i->second.end(); ++j)
1182 priv_->sorted_types_.push_back(*j);
1184 type_name_comp comp;
1185 sort(priv_->sorted_types_.begin(), priv_->sorted_types_.end(), comp);
1188 return priv_->sorted_types_;
1207 const std::string& path,
1209 : priv_(new
priv(env))
1211 priv_->path_ = path;
1212 priv_->address_size_ = address_size;
1234 if (!priv_->global_scope_)
1236 priv_->global_scope_.reset
1238 priv_->global_scope_->set_translation_unit
1241 return priv_->global_scope_;
1249{
return priv_->types_;}
1256{
return priv_->types_;}
1263const vector<function_type_sptr>&
1265{
return priv_->live_fn_types_;}
1272{
return priv_->env_;}
1279{
return priv_->language_;}
1286{priv_->language_ = l;}
1299{
return priv_->path_;}
1310{priv_->path_ = a_path;}
1323{
return priv_->comp_dir_path_;}
1334{priv_->comp_dir_path_ = d;}
1343 if (priv_->abs_path_.empty())
1346 if (!priv_->path_.empty())
1348 if (!priv_->comp_dir_path_.empty())
1350 path = priv_->comp_dir_path_;
1353 path += priv_->path_;
1355 priv_->abs_path_ = path;
1358 return priv_->abs_path_;
1377{
return priv_->corp;}
1393{
return priv_->loc_mgr_;}
1401{
return priv_->loc_mgr_;}
1410 if (!priv_->global_scope_)
1420{
return priv_->address_size_;}
1427{priv_->address_size_= a;}
1443{
return priv_->is_constructed_;}
1459{priv_->is_constructed_ = f;}
1498 const_cast<translation_unit*
>(
this)->priv_->live_fn_types_.push_back(ftype);
1531translation_unit::~translation_unit()
1544 case translation_unit::LANG_UNKNOWN:
1545 return "LANG_UNKNOWN";
1546 case translation_unit::LANG_Cobol74:
1547 return "LANG_Cobol74";
1548 case translation_unit::LANG_Cobol85:
1549 return "LANG_Cobol85";
1550 case translation_unit::LANG_C89:
1552 case translation_unit::LANG_C99:
1554 case translation_unit::LANG_C11:
1556 case translation_unit::LANG_C17:
1558 case translation_unit::LANG_C23:
1560 case translation_unit::LANG_C:
1562 case translation_unit::LANG_C_plus_plus_03:
1563 return "LANG_C_plus_plus_03";
1564 case translation_unit::LANG_C_plus_plus_11:
1565 return "LANG_C_plus_plus_11";
1566 case translation_unit::LANG_C_plus_plus_14:
1567 return "LANG_C_plus_plus_14";
1568 case translation_unit::LANG_C_plus_plus_17:
1569 return "LANG_C_plus_plus_17";
1570 case translation_unit::LANG_C_plus_plus_20:
1571 return "LANG_C_plus_plus_20";
1572 case translation_unit::LANG_C_plus_plus_23:
1573 return "LANG_C_plus_plus_23";
1574 case translation_unit::LANG_C_plus_plus:
1575 return "LANG_C_plus_plus";
1576 case translation_unit::LANG_OCaml:
1577 return "LANG_OCaml";
1578 case translation_unit::LANG_Zig:
1580 case translation_unit::LANG_ObjC:
1582 case translation_unit::LANG_ObjC_plus_plus:
1583 return "LANG_ObjC_plus_plus";
1584 case translation_unit::LANG_D:
1586 case translation_unit::LANG_Go:
1588 case translation_unit::LANG_Rust:
1590 case translation_unit::LANG_Fortran77:
1591 return "LANG_Fortran77";
1592 case translation_unit::LANG_Fortran90:
1593 return "LANG_Fortran90";
1594 case translation_unit::LANG_Fortran95:
1595 return "LANG_Fortran95";
1596 case translation_unit::LANG_Fortran18:
1597 return "LANG_Fortran18";
1598 case translation_unit::LANG_Fortran23:
1599 return "LANG_Fortran23";
1600 case translation_unit::LANG_Ada83:
1601 return "LANG_Ada83";
1602 case translation_unit::LANG_Ada95:
1603 return "LANG_Ada95";
1604 case translation_unit::LANG_Ada2005:
1605 return "LANG_Ada2005";
1606 case translation_unit::LANG_Ada2012:
1607 return "LANG_Ada2012";
1608 case translation_unit::LANG_Pascal83:
1609 return "LANG_Pascal83";
1610 case translation_unit::LANG_Modula2:
1611 return "LANG_Modula2";
1612 case translation_unit::LANG_Java:
1614 case translation_unit::LANG_Kotlin:
1615 return "LANG_Kotlin";
1616 case translation_unit::LANG_C_sharp:
1617 return "LANG_C_sharp";
1618 case translation_unit::LANG_Python:
1619 return "LANG_Python";
1620 case translation_unit::LANG_Ruby:
1622 case translation_unit::LANG_PLI:
1624 case translation_unit::LANG_UPC:
1626 case translation_unit::LANG_Mips_Assembler:
1627 return "LANG_Mips_Assembler";
1628 case translation_unit::LANG_Assembly:
1629 return "LANG_Assembly";
1630 case translation_unit::LANG_Crystal:
1631 return "LANG_Crystal";
1632 case translation_unit::LANG_HIP:
1634 case translation_unit::LANG_Mojo:
1636 case translation_unit::LANG_GLSL:
1638 case translation_unit::LANG_GLSL_ES:
1639 return "LANG_GLSL_ES";
1640 case translation_unit::LANG_HLSL:
1642 case translation_unit::LANG_OpenCL_CPP:
1643 return "LANG_OpenCL_CPP";
1644 case translation_unit::LANG_CPP_for_OpenCL:
1645 return "LANG_CPP_for_OpenCL";
1646 case translation_unit::LANG_SYCL:
1648 case translation_unit::LANG_Odin:
1650 case translation_unit::LANG_P4:
1652 case translation_unit::LANG_Metal:
1653 return "LANG_Metal";
1654 case translation_unit::LANG_Move:
1656 case translation_unit::LANG_Hylo:
1660 return "LANG_UNKNOWN";
1672 if (l ==
"LANG_Cobol74")
1673 return translation_unit::LANG_Cobol74;
1674 else if (l ==
"LANG_Cobol85")
1675 return translation_unit::LANG_Cobol85;
1676 else if (l ==
"LANG_C89")
1677 return translation_unit::LANG_C89;
1678 else if (l ==
"LANG_C99")
1679 return translation_unit::LANG_C99;
1680 else if (l ==
"LANG_C11")
1681 return translation_unit::LANG_C11;
1682 else if (l ==
"LANG_C17")
1683 return translation_unit::LANG_C17;
1684 else if (l ==
"LANG_C23")
1685 return translation_unit::LANG_C23;
1686 else if (l ==
"LANG_C")
1687 return translation_unit::LANG_C;
1688 else if (l ==
"LANG_C_plus_plus_03")
1689 return translation_unit::LANG_C_plus_plus_03;
1690 else if (l ==
"LANG_C_plus_plus_11")
1691 return translation_unit::LANG_C_plus_plus_11;
1692 else if (l ==
"LANG_C_plus_plus_14")
1693 return translation_unit::LANG_C_plus_plus_14;
1694 else if (l ==
"LANG_C_plus_plus_17")
1695 return translation_unit::LANG_C_plus_plus_17;
1696 else if (l ==
"LANG_C_plus_plus_20")
1697 return translation_unit::LANG_C_plus_plus_20;
1698 else if (l ==
"LANG_C_plus_plus_23")
1699 return translation_unit::LANG_C_plus_plus_23;
1700 else if (l ==
"LANG_C_plus_plus")
1701 return translation_unit::LANG_C_plus_plus;
1702 else if (l ==
"LANG_OCaml")
1703 return translation_unit::LANG_OCaml;
1704 else if (l ==
"LANG_ObjC")
1705 return translation_unit::LANG_ObjC;
1706 else if (l ==
"LANG_ObjC_plus_plus")
1707 return translation_unit::LANG_ObjC_plus_plus;
1708 else if (l ==
"LANG_Zig")
1709 return translation_unit::LANG_Zig;
1710 else if (l ==
"LANG_Metal")
1711 return translation_unit::LANG_Metal;
1712 else if (l ==
"LANG_Fortran77")
1713 return translation_unit::LANG_Fortran77;
1714 else if (l ==
"LANG_Fortran90")
1715 return translation_unit::LANG_Fortran90;
1716 else if (l ==
"LANG_Fortran95")
1717 return translation_unit::LANG_Fortran95;
1718 else if (l ==
"LANG_Fortran18")
1719 return translation_unit::LANG_Fortran23;
1720 else if (l ==
"LANG_Ada83")
1721 return translation_unit::LANG_Ada83;
1722 else if (l ==
"LANG_Ada95")
1723 return translation_unit::LANG_Ada95;
1724 else if (l ==
"LANG_Ada2005")
1725 return translation_unit::LANG_Ada2005;
1726 else if (l ==
"LANG_Ada2012")
1727 return translation_unit::LANG_Ada2012;
1728 else if (l ==
"LANG_Pascal83")
1729 return translation_unit::LANG_Pascal83;
1730 else if (l ==
"LANG_Modula2")
1731 return translation_unit::LANG_Modula2;
1732 else if (l ==
"LANG_Java")
1733 return translation_unit::LANG_Java;
1734 else if (l ==
"LANG_Kotlin")
1735 return translation_unit::LANG_Kotlin;
1736 else if (l ==
"LANG_PLI")
1737 return translation_unit::LANG_PLI;
1738 else if (l ==
"LANG_UPC")
1739 return translation_unit::LANG_UPC;
1740 else if (l ==
"LANG_D")
1741 return translation_unit::LANG_D;
1742 else if (l ==
"LANG_Go")
1743 return translation_unit::LANG_Go;
1744 else if (l ==
"LANG_Rust")
1745 return translation_unit::LANG_Rust;
1746 else if (l ==
"LANG_Python")
1747 return translation_unit::LANG_Python;
1748 else if (l ==
"LANG_Ruby")
1749 return translation_unit::LANG_Ruby;
1750 else if (l ==
"LANG_Mips_Assembler")
1751 return translation_unit::LANG_Mips_Assembler;
1752 else if (l ==
"LANG_Assembly")
1753 return translation_unit::LANG_Assembly;
1754 else if (l ==
"LANG_Crystal")
1755 return translation_unit::LANG_Crystal;
1756 else if (l ==
"LANG_HIP")
1757 return translation_unit::LANG_HIP;
1758 else if (l ==
"LANG_C_sharp")
1759 return translation_unit::LANG_C_sharp;
1760 else if (l ==
"LANG_Mojo")
1761 return translation_unit::LANG_Mojo;
1762 else if (l ==
"LANG_GLSL")
1763 return translation_unit::LANG_GLSL;
1764 else if (l ==
"LANG_GLSL_ES")
1765 return translation_unit::LANG_GLSL_ES;
1766 else if (l ==
"LANG_HLSL")
1767 return translation_unit::LANG_HLSL;
1768 else if (l ==
"LANG_OpenCL_CPP")
1769 return translation_unit::LANG_OpenCL_CPP;
1770 else if (l ==
"LANG_CPP_for_OpenCL")
1771 return translation_unit::LANG_CPP_for_OpenCL;
1772 else if (l ==
"LANG_SYCL")
1773 return translation_unit::LANG_SYCL;
1774 else if (l ==
"LANG_Odin")
1775 return translation_unit::LANG_Odin;
1776 else if (l ==
"LANG_P4")
1777 return translation_unit::LANG_P4;
1778 else if (l ==
"LANG_Move")
1779 return translation_unit::LANG_Move;
1780 else if (l ==
"LANG_Hylo")
1781 return translation_unit::LANG_Hylo;
1783 return translation_unit::LANG_UNKNOWN;
1794 return (l == translation_unit::LANG_C89
1795 || l == translation_unit::LANG_C99
1796 || l == translation_unit::LANG_C11
1797 || l == translation_unit::LANG_C17
1798 || l == translation_unit::LANG_C23
1799 || l == translation_unit::LANG_C);
1810 return (l == translation_unit::LANG_C_plus_plus_03
1811 || l == translation_unit::LANG_C_plus_plus_11
1812 || l == translation_unit::LANG_C_plus_plus_14
1813 || l == translation_unit::LANG_C_plus_plus_20
1814 || l == translation_unit::LANG_C_plus_plus_23
1815 || l == translation_unit::LANG_C_plus_plus);
1825{
return l == translation_unit::LANG_Java;}
1835 return (l == translation_unit::LANG_Ada83
1836 || l == translation_unit::LANG_Ada95
1837 || l == translation_unit::LANG_Ada2005
1838 || l == translation_unit::LANG_Ada2012);
1851 if (l.get() == r.get())
1874struct elf_symbol::priv
1914 bool is_in_ksymtab_;
1917 bool is_suppressed_;
1932 is_in_ksymtab_(false),
1935 is_suppressed_(false)
1938 priv(
const environment& e,
1946 const elf_symbol::version& ve,
1968 is_common_ = type_ == COMMON_TYPE;
2002elf_symbol::elf_symbol(
const environment& e,
2078 elf_symbol_sptr sym(
new elf_symbol(e, i, s, n, t, b, d, c, ve, vi,
2080 sym->priv_->main_symbol_ = sym;
2139{
return priv_->env_;}
2146{
return priv_->index_;}
2160{
return priv_->name_;}
2169 priv_->id_string_.clear();
2177{
return priv_->type_;}
2191{
return priv_->size_;}
2198{priv_->size_ = size;}
2205{
return priv_->binding_;}
2212{priv_->binding_ = b;}
2219{
return priv_->version_;}
2227 priv_->version_ = v;
2228 priv_->id_string_.clear();
2237{priv_->visibility_ = v;}
2245{
return priv_->visibility_;}
2253{
return priv_->is_defined_;}
2261{priv_->is_defined_ = d;}
2314{
return priv_->is_in_ksymtab_;}
2329{
return priv_->crc_;}
2343{
return priv_->namespace_;}
2350{priv_->namespace_ = ns;}
2359{
return priv_->is_suppressed_;}
2398{
return priv_->main_symbol_.lock();}
2405{
return priv_->main_symbol_.lock();}
2419{
return priv_->next_alias_.lock();}
2439 a = a->get_next_alias())
2462 a && !a->is_main_symbol();
2463 a = a->get_next_alias())
2465 if (a->get_next_alias()->is_main_symbol())
2473 last_alias->priv_->next_alias_ = alias;
2476 priv_->next_alias_ = alias;
2506 a = a->get_next_alias())
2507 if (a->get_name() == name)
2517 priv_->main_symbol_ = new_main;
2519 a = a->get_next_alias())
2520 a->priv_->main_symbol_ = new_main;
2530{
return priv_->is_common_;}
2561{
return priv_->next_common_instance_.lock();}
2576 ABG_ASSERT(!common->has_other_common_instances());
2585 c = c->get_next_common_instance())
2590 last_common_instance = c;
2595 last_common_instance->priv_->next_common_instance_ = common;
2598 priv_->next_common_instance_ = common;
2618 if (priv_->id_string_.empty())
2630 priv_->id_string_ = s;
2633 return priv_->id_string_;
2650 a = a->get_next_alias())
2651 if (a->get_name() == name)
2668 a && a.get() != a->get_main_symbol().get();
2669 a = a->get_next_alias())
2670 if (textually_equals(*
this, *a))
2687 bool include_symbol_itself)
const
2691 if (include_symbol_itself)
2694 vector<elf_symbol_sptr> aliases;
2695 compute_aliases_for_elf_symbol(*
this, syms, aliases);
2696 if (!aliases.empty() && include_symbol_itself)
2699 for (vector<elf_symbol_sptr>::const_iterator i = aliases.begin();
2703 if (i != aliases.begin())
2705 result += (*i)->get_id_string();
2720 vector<elf_symbol_sptr> aliases;
2721 if (include_symbol_itself)
2726 a = a->get_next_alias())
2727 aliases.push_back(a);
2730 for (vector<elf_symbol_sptr>::const_iterator i = aliases.begin();
2734 if (i != aliases.begin())
2736 result += (*i)->get_id_string();
2756 name.clear(), ver.clear();
2758 string::size_type i =
id.find(
'@');
2759 if (i == string::npos)
2765 name =
id.substr(0, i);
2771 string::size_type j =
id.find(
'@', i);
2772 if (j == string::npos)
2799 bool are_equal = textually_equals(*
this, other);
2820 a && !a->is_main_symbol();
2821 a = a->get_next_alias())
2845 return *lhs == *rhs;
2871compute_aliases_for_elf_symbol(
const elf_symbol& sym,
2873 vector<elf_symbol_sptr>& aliases)
2877 for (; a && !a->is_main_symbol(); a = a->get_next_alias())
2878 aliases.push_back(a);
2880 for (string_elf_symbols_map_type::const_iterator i = symtab.begin();
2883 for (elf_symbols::const_iterator j = i->second.begin();
2884 j != i->second.end();
2889 s && !s->is_main_symbol();
2890 s = s->get_next_alias())
2891 aliases.push_back(s);
2894 s && !s->is_main_symbol();
2895 s = s->get_next_alias())
2897 aliases.push_back(*j);
2942 case elf_symbol::NOTYPE_TYPE:
2943 repr =
"unspecified symbol type";
2945 case elf_symbol::OBJECT_TYPE:
2946 repr =
"variable symbol type";
2948 case elf_symbol::FUNC_TYPE:
2949 repr =
"function symbol type";
2951 case elf_symbol::SECTION_TYPE:
2952 repr =
"section symbol type";
2954 case elf_symbol::FILE_TYPE:
2955 repr =
"file symbol type";
2957 case elf_symbol::COMMON_TYPE:
2958 repr =
"common data object symbol type";
2960 case elf_symbol::TLS_TYPE:
2961 repr =
"thread local data object symbol type";
2963 case elf_symbol::GNU_IFUNC_TYPE:
2964 repr =
"indirect function symbol type";
2968 std::ostringstream s;
2969 s <<
"unknown symbol type (" << (char)t <<
')';
2992 case elf_symbol::LOCAL_BINDING:
2993 repr =
"local binding";
2995 case elf_symbol::GLOBAL_BINDING:
2996 repr =
"global binding";
2998 case elf_symbol::WEAK_BINDING:
2999 repr =
"weak binding";
3001 case elf_symbol::GNU_UNIQUE_BINDING:
3002 repr =
"GNU unique binding";
3006 std::ostringstream s;
3007 s <<
"unknown binding (" << (
unsigned char) b <<
")";
3030 case elf_symbol::DEFAULT_VISIBILITY:
3031 repr =
"default visibility";
3033 case elf_symbol::PROTECTED_VISIBILITY:
3034 repr =
"protected visibility";
3036 case elf_symbol::HIDDEN_VISIBILITY:
3037 repr =
"hidden visibility";
3039 case elf_symbol::INTERNAL_VISIBILITY:
3040 repr =
"internal visibility";
3044 std::ostringstream s;
3045 s <<
"unknown visibility (" << (
unsigned char) v <<
")";
3067 t = elf_symbol::NOTYPE_TYPE;
3068 else if (s ==
"object-type")
3069 t = elf_symbol::OBJECT_TYPE;
3070 else if (s ==
"func-type")
3071 t = elf_symbol::FUNC_TYPE;
3072 else if (s ==
"section-type")
3073 t = elf_symbol::SECTION_TYPE;
3074 else if (s ==
"file-type")
3075 t = elf_symbol::FILE_TYPE;
3076 else if (s ==
"common-type")
3077 t = elf_symbol::COMMON_TYPE;
3078 else if (s ==
"tls-type")
3079 t = elf_symbol::TLS_TYPE;
3080 else if (s ==
"gnu-ifunc-type")
3081 t = elf_symbol::GNU_IFUNC_TYPE;
3099 if (s ==
"local-binding")
3100 b = elf_symbol::LOCAL_BINDING;
3101 else if (s ==
"global-binding")
3102 b = elf_symbol::GLOBAL_BINDING;
3103 else if (s ==
"weak-binding")
3104 b = elf_symbol::WEAK_BINDING;
3105 else if (s ==
"gnu-unique-binding")
3106 b = elf_symbol::GNU_UNIQUE_BINDING;
3124 if (s ==
"default-visibility")
3125 v = elf_symbol::DEFAULT_VISIBILITY;
3126 else if (s ==
"protected-visibility")
3127 v = elf_symbol::PROTECTED_VISIBILITY;
3128 else if (s ==
"hidden-visibility")
3129 v = elf_symbol::HIDDEN_VISIBILITY;
3130 else if (s ==
"internal-visibility")
3131 v = elf_symbol::INTERNAL_VISIBILITY;
3146{
return t == elf_symbol::FUNC_TYPE;}
3156{
return t == elf_symbol::OBJECT_TYPE;}
3160struct elf_symbol::version::priv
3166 : is_default_(false)
3169 priv(
const string& v,
3176elf_symbol::version::version()
3183elf_symbol::version::version(
const string& v,
3185 : priv_(new priv(v, is_default))
3189 : priv_(new priv(v.str(), v.is_default()))
3193elf_symbol::version::~version() =
default;
3198elf_symbol::version::operator
const string&()
const
3199{
return priv_->version_;}
3206{
return priv_->version_;}
3213{priv_->version_ = s;}
3220{
return priv_->is_default_;}
3227{priv_->is_default_ = f;}
3230elf_symbol::version::is_empty()
const
3231{
return str().empty();}
3240{
return str() == o.
str();}
3269struct dm_context_rel::priv
3272 size_t offset_in_bits_;
3275 priv(
bool is_static =
false)
3276 : is_laid_out_(!is_static),
3278 anonymous_data_member_()
3281 priv(
bool is_laid_out,
size_t offset_in_bits)
3282 : is_laid_out_(is_laid_out),
3283 offset_in_bits_(offset_in_bits),
3284 anonymous_data_member_()
3288dm_context_rel::dm_context_rel()
3293dm_context_rel::dm_context_rel(scope_decl* s,
3295 size_t offset_in_bits,
3298 : context_rel(s, a, is_static),
3299 priv_(new priv(is_laid_out, offset_in_bits))
3302dm_context_rel::dm_context_rel(scope_decl* s)
3308dm_context_rel::get_is_laid_out()
const
3309{
return priv_->is_laid_out_;}
3312dm_context_rel::set_is_laid_out(
bool f)
3313{priv_->is_laid_out_ = f;}
3316dm_context_rel::get_offset_in_bits()
const
3317{
return priv_->offset_in_bits_;}
3320dm_context_rel::set_offset_in_bits(
size_t o)
3321{priv_->offset_in_bits_ = o;}
3324dm_context_rel::operator==(
const dm_context_rel& o)
const
3326 if (!context_rel::operator==(o))
3329 return (priv_->is_laid_out_ == o.priv_->is_laid_out_
3330 && priv_->offset_in_bits_ == o.priv_->offset_in_bits_);
3334dm_context_rel::operator!=(
const dm_context_rel& o)
const
3345{
return priv_->anonymous_data_member_;}
3355{priv_->anonymous_data_member_ = anon_dm;}
3357dm_context_rel::~dm_context_rel()
3383{
return priv_->canonical_types_;}
3427 unsigned l1 = 0, l2 = 0, c1 = 0, c2 = 0;
3449 vector<type_base_sptr>& result)
3452 result.push_back(t);
3455 std::stable_sort(result.begin(), result.end(), comp);
3467const type_base_sptr&
3470 if (!priv_->void_type_)
3471 priv_->void_type_.reset(
new type_decl(*
this,
3474 return priv_->void_type_;
3486const type_base_sptr&
3489 if (!priv_->void_pointer_type_)
3492 return priv_->void_pointer_type_;
3505const type_base_sptr&
3508 if (!priv_->variadic_marker_type_)
3509 priv_->variadic_marker_type_.
3512 return priv_->variadic_marker_type_;
3521 static string variadic_parameter_type_name =
"variadic parameter type";
3522 return variadic_parameter_type_name;
3532{
return priv_->canonicalization_is_done_;}
3547 priv_->canonicalization_is_done_ = f;
3548 if (priv_->canonicalization_is_done_)
3559{
return priv_->canonicalization_started_;}
3568{priv_->canonicalization_started_ = f;}
3592{
return priv_->decl_only_class_equals_definition_;}
3617{priv_->decl_only_class_equals_definition_ = f;}
3722{
return const_cast<environment*
>(
this)->priv_->string_pool_.create_string(s);}
3729{
return priv_->config_;}
3739{
return priv_->analyze_exported_interfaces_only_.has_value();}
3752{priv_->analyze_exported_interfaces_only_ = f;}
3765{
return priv_->analyze_exported_interfaces_only_.value_or(
false);}
3767#ifdef WITH_DEBUG_SELF_COMPARISON
3780environment::set_self_comparison_debug_input(
const corpus_sptr& c)
3782 self_comparison_debug_is_on(
true);
3783 if (priv_->first_self_comparison_corpus_.expired())
3784 priv_->first_self_comparison_corpus_ = c;
3785 else if (priv_->second_self_comparison_corpus_.expired()
3786 && c.get() != corpus_sptr(priv_->first_self_comparison_corpus_).get())
3787 priv_->second_self_comparison_corpus_ = c;
3800environment::get_self_comparison_debug_inputs(corpus_sptr& first_corpus,
3801 corpus_sptr& second_corpus)
3803 first_corpus = priv_->first_self_comparison_corpus_.lock();
3804 second_corpus = priv_->second_self_comparison_corpus_.lock();
3811environment::self_comparison_debug_is_on(
bool f)
3812{priv_->self_comparison_debug_on_ = f;}
3819environment::self_comparison_debug_is_on()
const
3820{
return priv_->self_comparison_debug_on_;}
3823#ifdef WITH_DEBUG_TYPE_CANONICALIZATION
3830environment::debug_type_canonicalization_is_on(
bool flag)
3831{priv_->debug_type_canonicalization_ = flag;}
3839environment::debug_type_canonicalization_is_on()
const
3840{
return priv_->debug_type_canonicalization_;}
3848environment::debug_die_canonicalization_is_on(
bool flag)
3849{priv_->debug_die_canonicalization_ = flag;}
3857environment::debug_die_canonicalization_is_on()
const
3858{
return priv_->debug_die_canonicalization_;}
3874const vector<type_base_sptr>*
3901 if (!types ||index >= types->size())
3903 return (*types)[index].get();
3906#ifdef WITH_DEBUG_SELF_COMPARISON
3916const unordered_map<string, uintptr_t>&
3917environment::get_type_id_canonical_type_map()
const
3918{
return priv_->get_type_id_canonical_type_map();}
3929unordered_map<string, uintptr_t>&
3930environment::get_type_id_canonical_type_map()
3931{
return priv_->get_type_id_canonical_type_map();}
3946const unordered_map<uintptr_t, string>&
3947environment::get_pointer_type_id_map()
const
3948{
return priv_->get_pointer_type_id_map();}
3963unordered_map<uintptr_t, string>&
3964environment::get_pointer_type_id_map()
3965{
return priv_->get_pointer_type_id_map();}
3983environment::get_type_id_from_pointer(uintptr_t ptr)
const
3984{
return priv_->get_type_id_from_pointer(ptr);}
4002environment::get_type_id_from_type(
const type_base *t)
const
4003{
return priv_->get_type_id_from_type(t);}
4020environment::get_canonical_type_from_type_id(
const char* type_id)
const
4021{
return priv_->get_canonical_type_from_type_id(type_id);}
4035 (
static_cast<unsigned>(l) |
static_cast<unsigned>(r));
4055 (
static_cast<unsigned>(l) &
static_cast<unsigned>(r));
4076 :priv_(new
priv(e, k))
4092{
return priv_->is_artificial_;}
4104{priv_->is_artificial_ = f;}
4115{
return priv_->kind();}
4135{
return priv_->rtti_;}
4144{
return priv_->rtti_;}
4156 priv_->type_or_decl_ptr_ = t;
4158 priv_->type_or_decl_ptr_ = d;
4181{
return priv_->type_or_decl_ptr_;}
4192{
return priv_->hash_value_;}
4195type_or_decl_base::set_hash_value(
hash_t h)
const
4196{priv_->set_hash_value(h);}
4203{
return priv_->env_;}
4221{priv_->artificial_location_ = l;}
4239{
return priv_->artificial_location_;}
4247 return (priv_->artificial_location_
4248 && priv_->artificial_location_.get_is_artificial());
4279{priv_->translation_unit_ = tu;}
4288{
return priv_->translation_unit_;}
4320 *dr =
dynamic_cast<const decl_base*
>(r);
4329 *tr =
dynamic_cast<const type_base*
>(r);
4374struct decl_base::priv
4376 bool in_pub_sym_tab_;
4404 decl_base_sptr declaration_;
4406 decl_base* naked_definition_of_declaration_;
4407 bool is_declaration_only_;
4411 : in_pub_sym_tab_(false),
4412 is_anonymous_(true),
4414 visibility_(VISIBILITY_DEFAULT),
4415 naked_definition_of_declaration_(),
4416 is_declaration_only_(false)
4419 priv(interned_string name, interned_string linkage_name,
visibility vis)
4420 : in_pub_sym_tab_(false),
4423 qualified_name_(name),
4424 linkage_name_(linkage_name),
4426 naked_definition_of_declaration_(),
4427 is_declaration_only_(false)
4429 is_anonymous_ = name_.
empty();
4454 const string& linkage_name,
4457 priv_(new priv(e.intern(name), e.intern(linkage_name), vis))
4481 priv_(new priv(name, linkage_name, vis))
4508{
return priv_->qualified_name_;}
4517{priv_->qualified_name_.clear();}
4524{priv_->qualified_name_ = n;}
4537{
return priv_->temporary_qualified_name_;}
4551{priv_->temporary_qualified_name_ = n;}
4558{
return priv_->context_;}
4565{
return priv_->context_;}
4569{priv_->context_ = c;}
4578{
return priv_->in_pub_sym_tab_;}
4586{priv_->in_pub_sym_tab_ = f;}
4606{
return priv_->location_;}
4648 priv_->location_ = l;
4658 priv_->is_anonymous_ = n.empty();
4669{
return priv_->is_anonymous_;}
4679{priv_->is_anonymous_ = f;}
4716{
return priv_->naming_typedef_;}
4744 &&
is_type(
this)->get_naked_canonical_type() ==
nullptr);
4746 priv_->naming_typedef_ = t;
4753 update_qualified_name(
this);
4761{
return priv_->linkage_name_;}
4770 priv_->linkage_name_ = env.
intern(m);
4778{
return priv_->visibility_;}
4785{priv_->visibility_ = v;}
4794 if (priv_->context_)
4795 return priv_->context_->get_scope();
4805{
return priv_->qualified_parent_name_;}
4812{
return priv_->name_;}
4847 bool qualified_name)
const
4851 && has_generic_anonymous_internal_type_name(
this))
4862 string name = get_generic_anonymous_internal_type_name(
this);
4898 if (priv_->internal_cached_repr_.empty())
4903 return priv_->internal_cached_repr_;
4906 if (priv_->cached_repr_.empty())
4912 return priv_->cached_repr_;
4932{
return priv_->qualified_name_;}
4946{
return priv_->scoped_name_;}
4954{
return priv_->declaration_;}
4963 if (d && d->get_is_declaration_only())
4964 priv_->declaration_ = d;
4974{
return priv_->definition_of_declaration_.lock();}
4990{
return priv_->naked_definition_of_declaration_;}
4997{
return priv_->is_declaration_only_;}
5007 bool update_types_lookup_map = !f && priv_->is_declaration_only_;
5009 priv_->is_declaration_only_ = f;
5011 if (update_types_lookup_map)
5014 scope_decl::declarations::iterator i;
5015 if (s->find_iterator_for_member(
this, i))
5025 return static_cast<change_kind>(
static_cast<unsigned>(l)
5026 |
static_cast<unsigned>(r));
5032 return static_cast<change_kind>(
static_cast<unsigned>(l)
5033 &
static_cast<unsigned>(r));
5080 bool member_types_or_functions =
5084 if (member_types_or_functions)
5093 la = r1->get_access_specifier();
5094 ra = r2->get_access_specifier();
5095 r1->set_access_specifier(no_access);
5096 r2->set_access_specifier(no_access);
5099 bool rels_are_different = *r1 != *r2;
5101 if (member_types_or_functions)
5104 r1->set_access_specifier(la);
5105 r2->set_access_specifier(ra);
5108 if (rels_are_different)
5143 if (!l_linkage_name.
empty() && !r_linkage_name.
empty())
5145 if (l_linkage_name != r_linkage_name)
5185 bool decls_are_same = (ln == rn);
5187 if (!decls_are_same)
5210{
return equals(*
this, other, 0);}
5249 if (!priv_->context_)
5252 priv_->context_->set_scope(scope);
5270 case decl_base::VISIBILITY_NONE:
5273 case decl_base::VISIBILITY_DEFAULT:
5276 case decl_base::VISIBILITY_PROTECTED:
5279 case decl_base::VISIBILITY_HIDDEN:
5282 case decl_base::VISIBILITY_INTERNAL:
5302 case decl_base::BINDING_NONE:
5305 case decl_base::BINDING_LOCAL:
5308 case decl_base::BINDING_GLOBAL:
5311 case decl_base::BINDING_WEAK:
5334 if (l.get() == r.get())
5370 if (l.get() == r.get())
5456{
return dynamic_pointer_cast<scope_decl>(d);}
5522 return c->get_access_specifier();
5552 c->set_access_specifier(a);
5582 return c->get_is_static();
5724 var_decl_sptr first = *klass->get_non_static_data_members().begin();
5745 if (!klass ||!data_member)
5748 for (class_or_union::data_members::const_iterator it =
5752 if (**it == *data_member)
5821 bool result =
false;
5839 dms[member->get_name()] = member;
6048 return class_or_union_sptr();
6057const class_or_union_sptr
6062 if (cou->get_is_anonymous())
6065 return class_or_union_sptr();
6074const class_or_union_sptr
6079 return class_or_union_sptr();
6088const class_or_union_sptr
6103 return class_or_union_sptr();
6128 for (
auto anon_dm_m : cl->get_non_static_data_members())
6175 ctxt_rel->set_offset_in_bits(o);
6190 return ctxt_rel->get_offset_in_bits();
6280 const var_decl *containing_anonymous_data_member =
6283 uint64_t containing_anonymous_data_member_offset = 0;
6284 if (containing_anonymous_data_member)
6285 containing_anonymous_data_member_offset =
6288 return (ctxt_rel->get_offset_in_bits()
6290 containing_anonymous_data_member_offset);
6318 type_base_sptr t = v->get_type();
6321 return t->get_size_in_bits();
6335 ctxt_rel->set_is_laid_out(l);
6350 return ctxt_rel->get_is_laid_out();
6611set_member_function_vtable_offset(
function_decl& f, ssize_t s)
6633{
return set_member_function_vtable_offset(*f, s);}
6652 return ctxt->is_virtual();
6679set_member_function_is_virtual(
function_decl& f,
bool is_virtual)
6689 ctxt->is_virtual(is_virtual);
6702 set_member_function_is_virtual(*fn, is_virtual);
6721 set_member_function_vtable_offset(fn, voffset);
6722 set_member_function_is_virtual(fn, is_virtual);
6753 set_member_function_vtable_offset(fn, voffset);
6754 set_member_function_is_virtual(fn, is_virtual);
6791 if (!cl->get_canonical_type())
6797 type_base_sptr t = type;
6808 ty->get_size_in_bits(),
6809 ty->get_alignment_in_bits(),
6810 ty->get_location()));
6818 ty->get_size_in_bits(),
6819 ty->get_alignment_in_bits(),
6820 ty->get_location()));
6829 ty->get_location()));
6835 t.reset(
new array_type_def(p, ty->get_subranges(), ty->get_location()));
6840 for (function_decl::parameters::const_iterator i =
6841 ty->get_parameters().begin();
6842 i != ty->get_parameters().end();
6853 p->get_variadic_marker(),
6854 p->get_is_artificial()));
6855 parm.push_back(stripped);
6860 parm, ty->get_is_const(),
6861 ty->get_size_in_bits(),
6862 ty->get_alignment_in_bits()));
6867 for (function_decl::parameters::const_iterator i =
6868 ty->get_parameters().begin();
6869 i != ty->get_parameters().end();
6880 p->get_variadic_marker(),
6881 p->get_is_artificial()));
6882 parm.push_back(stripped);
6887 ty->get_size_in_bits(),
6888 ty->get_alignment_in_bits()));
6891 if (!t->get_translation_unit())
6892 t->set_translation_unit(type->get_translation_unit());
6897 return t->get_canonical_type() ? t->get_canonical_type() : t;
6920 decl_base_sptr result = t;
6921 type_base_sptr u = t->get_underlying_type();
6924 if ((t->get_cv_quals() & qualified_type_def::CV_CONST
6926 || (t->get_cv_quals() & qualified_type_def::CV_CONST
6928 || t->get_cv_quals() == qualified_type_def::CV_NONE)
6974static qualified_type_def_sptr
6975strip_redundant_quals_from_underyling_types(
const qualified_type_def_sptr& t,
6984 qualified_type_def_sptr underlying_qualified_type =
6992 currated_quals &= ~redundant_quals;
6993 t->set_cv_quals(currated_quals);
6997 redundant_quals |= currated_quals;
6999 qualified_type_def_sptr result = t;
7000 if (underlying_qualified_type)
7004 strip_redundant_quals_from_underyling_types(underlying_qualified_type,
7038strip_redundant_quals_from_underyling_types(
const qualified_type_def_sptr& t)
7044 strip_redundant_quals_from_underyling_types(t, redundant_quals);
7071 return t->get_underlying_type();
7125 return t->get_pointed_to_type();
7181 return t->get_pointed_to_type();
7306 if (t->get_cv_quals() == qualified_type_def::CV_CONST)
7339 return q->get_underlying_type();
7388 type_base_sptr type = t;
7411 type_base_sptr typ = type;
7473 bool peel_qual_type)
7512 bool peel_qual_type)
7550 vector<array_type_def::subrange_sptr> subranges;
7552 for (vector<array_type_def::subrange_sptr>::const_iterator i =
7553 array->get_subranges().begin();
7554 i != array->get_subranges().end();
7560 (*i)->get_lower_bound(),
7561 (*i)->get_upper_bound(),
7562 (*i)->get_underlying_type(),
7563 (*i)->get_location(),
7564 (*i)->get_language()));
7565 subrange->is_non_finite((*i)->is_non_finite());
7568 subranges.push_back(subrange);
7573 subranges, array->get_location()));
7596 (
new typedef_decl(t->get_name(), t->get_underlying_type(),
7597 t->get_location(), t->get_linkage_name(),
7598 t->get_visibility()));
7614qualified_type_def_sptr
7620 qualified_type_def_sptr result
7622 t->get_cv_quals(), t->get_location()));
7634static type_base_sptr
7635clone_typedef_array_qualified_type(type_base_sptr type)
7641 type_base_sptr result;
7650 return type_base_sptr();
7673 type_base_sptr result = clone_typedef_array_qualified_type(t);
7676 type_base_sptr subtree;
7680 clone_typedef_array_qualified_type(type->get_underlying_type());
7684 type->set_underlying_type(subtree);
7690 clone_typedef_array_qualified_type(type->get_element_type());
7694 type->set_element_type(subtree);
7704 clone_typedef_array_qualified_type(t->get_underlying_type());
7711 t->set_underlying_type (s);
7720 clone_typedef_array_qualified_type(t->get_underlying_type());
7727 t->set_underlying_type(s);
7735 type_base_sptr e = t->get_element_type();
7739 clone_typedef_array_qualified_type(e);
7745 t->set_element_type(s);
7764 ::qualified_name_setter setter;
7772update_qualified_name(decl_base_sptr d)
7773{
return update_qualified_name(d.get());}
7793{
return reinterpret_cast<size_t>(l);}
7795struct scope_decl::priv
7804 bool clear_sorted_member_types_cache_ =
false;
7841{
return priv_->canonical_types_;}
7859 if (priv_->sorted_canonical_types_.empty())
7861 for (canonical_type_sptr_set_type::const_iterator e =
7865 priv_->sorted_canonical_types_.push_back(*e);
7868 std::stable_sort(priv_->sorted_canonical_types_.begin(),
7869 priv_->sorted_canonical_types_.end(),
7872 return priv_->sorted_canonical_types_;
7882{
return priv_->members_;}
7891{
return priv_->members_;}
7902 if (priv_->sorted_members_.empty())
7907 priv_->sorted_members_.push_back(*i);
7909 std::stable_sort(priv_->sorted_members_.begin(),
7910 priv_->sorted_members_.end(),
7913 return priv_->sorted_members_;
7928 if (t->get_is_anonymous())
7946 if (t->get_is_anonymous())
7964 if (t->get_is_anonymous())
7975{
return priv_->member_scopes_;}
7982{
return priv_->member_scopes_;}
8004maybe_set_translation_unit(
const decl_base_sptr& decl,
8021 decl->set_translation_unit(tu);
8038 member->set_scope(
this);
8039 priv_->members_.push_back(member);
8042 priv_->member_types_.push_back(
is_type(member));
8043 priv_->clear_sorted_member_types_cache_ =
true;
8047 priv_->member_scopes_.push_back(m);
8049 update_qualified_name(member);
8052 maybe_set_translation_unit(member, tu);
8064{
return priv_->member_types_;}
8079 return type_base_sptr();
8089 declarations::iterator before)
8095 priv_->member_types_.push_back(t);
8096 priv_->clear_sorted_member_types_cache_=
true;
8132 for (
auto i = priv_->member_types_.begin();
8133 i != priv_->member_types_.end();
8138 priv_->member_types_.erase(i);
8151 if (priv_->clear_sorted_member_types_cache_)
8153 priv_->sorted_member_types_.clear();
8154 priv_->clear_sorted_member_types_cache_ =
false;
8157 if (priv_->sorted_member_types_.empty())
8159 unordered_set<type_base_sptr> canonical_pointer_types;
8163 priv_->sorted_member_types_.push_back(t);
8164 else if (
auto c = t->get_canonical_type())
8165 canonical_pointer_types.insert(c);
8167 canonical_pointer_types.insert(t);
8170 for (
auto t : canonical_pointer_types)
8171 priv_->sorted_member_types_.push_back(t);
8174 std::stable_sort(priv_->sorted_member_types_.begin(),
8175 priv_->sorted_member_types_.end(),
8181 priv_->clear_sorted_member_types_cache_ =
true;
8183 return priv_->sorted_member_types_;
8199 declarations::iterator before)
8203 member->set_scope(
this);
8204 priv_->members_.insert(before, member);
8207 priv_-> member_scopes_.push_back(m);
8209 update_qualified_name(member);
8212 maybe_set_translation_unit(member, tu);
8225 for (declarations::iterator i = priv_->members_.begin();
8226 i != priv_->members_.end();
8231 priv_->members_.erase(i);
8241 for (scopes::iterator i = priv_->member_scopes_.begin();
8242 i != priv_->member_scopes_.end();
8247 priv_->member_scopes_.erase(i);
8253 member->set_scope(
nullptr);
8254 member->set_translation_unit(
nullptr);
8281 if (!l.decl_base::operator==(r))
8290 scope_decl::declarations::const_iterator i, j;
8332 return equals(*
this, *other, 0);
8347 if (l.get() == r.get())
8373 declarations::iterator& i)
8388 if ((*it).get() == decl)
8408 declarations::iterator& i)
8425 if (v.visit_begin(
this))
8428 for (scope_decl::declarations::const_iterator i =
8432 if (!(*i)->traverse(v))
8436 return v.visit_end(
this);
8439scope_decl::~scope_decl()
8455 if (scope && decl && !decl->
get_scope())
8495 scope_decl::declarations::iterator before,
8498 if (scope && decl && !decl->
get_scope())
8517 scope_decl::declarations::iterator before,
8527 | ABSTRACT_DECL_BASE
8528 | ABSTRACT_SCOPE_DECL),
8531 translation_unit_(tu)
8533 runtime_type_instance(
this);
8552 return scope ?
dynamic_cast<global_scope*
> (scope) : 0;
8659 if (cv_quals & qualified_type_def::CV_RESTRICT)
8661 if (cv_quals & qualified_type_def::CV_CONST)
8667 if (cv_quals & qualified_type_def::CV_VOLATILE)
8719{
return get_name(tod.get(), qualified);}
8737 string qualified_name;
8741 if (qualified_name.empty())
8742 qualified_name = name;
8744 qualified_name = qualified_name +
"::" + name;
8746 return qualified_name;
8781 location loc = decl->get_location();
8785 if (c->get_is_declaration_only() && c->get_definition_of_declaration())
8788 loc = c->get_location();
8846has_generic_anonymous_internal_type_name(
const decl_base *d)
8863static interned_string
8864get_generic_anonymous_internal_type_name(
const decl_base *d)
8866 ABG_ASSERT(has_generic_anonymous_internal_type_name(d));
8868 const environment&env = d->get_environment();
8870 interned_string result;
8903get_internal_real_type_name(
const type_base* t)
8913 name = int_type.to_string(
true);
8938 return empty_string;
8945 return empty_string;
8962 r += get_generic_anonymous_internal_type_name(d);
8972 return env.
intern(get_internal_real_type_name(t));
8981 internal, qualified));
9020 bool qualified,
bool internal)
9023 string tn =
get_type_name(pointed_to_type, qualified, internal);
9042 bool lvalue_reference,
9043 bool qualified,
bool internal)
9047 string name =
get_type_name(pointed_to_type, qualified, internal);
9048 if (lvalue_reference)
9073 bool qualified,
bool internal)
9075 const environment& env = underlying_type->get_environment();
9078 string name =
get_type_name(underlying_type, qualified, internal);
9080 if (quals_repr.empty() && internal)
9092 if (!quals_repr.empty())
9101 name = quals_repr +
" " + name;
9158 std::ostringstream o;
9167 stream_pretty_representation_of_fn_parms(fn_type, o,
9170 return env.
intern(o.str());
9189 c->get_exported_decls_builder();
9190 if (b->fn_id_maps_to_several_fns(fn))
9246 std::ostringstream o;
9265 o <<
" (" << class_type->get_qualified_name(internal) <<
"::*) ";
9266 stream_pretty_representation_of_fn_parms(fn_type, o,
9270 return env.
intern(o.str());
9436 std::ostringstream o;
9454 std::ostringstream o;
9509 const string& indent,
9512 bool qualified_names)
9515 string local_indent =
" ";
9520 if (!internal && clazz->is_struct())
9526 repr = indent +
"union";
9559 for (class_or_union::data_members::const_iterator dm = dmems.begin();
9563 if (dm != dmems.begin())
9568 real_indent =
"\n" + indent + local_indent;
9575 real_indent, one_line, internal, qualified_names);
9580 if (dm != dmems.begin())
9581 repr += real_indent;
9582 repr += (*dm)->get_pretty_representation(internal,
9587 real_indent+ (*dm)->get_pretty_representation(internal,
9596 repr += indent +
"}";
9624 const string& indent,
9627 bool qualified_names)
9631 internal, qualified_names);
9653 const string& indent,
9656 bool qualified_names)
9685 const string& indent,
bool one_line,
9686 bool qualified_names)
9689 std::ostringstream o;
9690 string local_indent =
" ";
9692 repr = indent +
"enum ";
9695 o << (qualified_names
9709 o << enumerator.get_name() +
"=" << enumerator.get_value() <<
", ";
9713 o <<
"\n" + indent <<
"}";
9744 const string& indent,
bool one_line,
9745 bool qualified_names)
9751 one_line, qualified_names);
9776 const string& indent,
bool one_line,
9777 bool qualified_names)
9806 const string& indent,
9809 bool qualified_name)
9815 internal, qualified_name);
9844 std::ostringstream o;
9859 o <<
" :" << std::endl;
9863 if (b->get_is_virtual())
9865 o << b->get_base_class()->get_qualified_name()
9869 o << std::hex << *h << std::dec;
9880 <<
" // translation unit: "
9885 <<
" // @: " << std::hex <<
is_type(c)
9891 o << std::hex << *h << std::dec;
9901 << member_type->get_pretty_representation(
false,
9904 if (member_type->get_canonical_type())
9906 o <<
" // uses canonical type: '@"
9907 << std::hex << member_type->get_canonical_type().get() <<
"'";
9910 o << std::hex << *h << std::dec;
9930 if (t && t->get_canonical_type())
9931 o <<
" // uses canonical type '@"
9932 << std::hex << t->get_canonical_type().get() <<
"'";
9937 o << std::hex << *h << std::dec;
9948 o <<
" // virtual member functions\n\n";
9957 o << std::hex << *h << std::dec;
9960 o <<
";" << std::endl;
9964 o <<
"};" << std::endl;
9970 string name = e->get_qualified_name();
9971 std::ostringstream o;
9972 o <<
"enum " << name
9974 << e->get_underlying_type()->get_pretty_representation(
false,
9978 <<
" // size in bits: " << e->get_size_in_bits() <<
"\n"
9979 <<
" // is-declaration-only: " << e->get_is_declaration_only() <<
"\n"
9981 <<
" // translation unit: "
9982 << e->get_translation_unit()->get_absolute_path() <<
"\n"
9983 <<
" // @: " << std::hex <<
is_type(e)
9984 <<
", @canonical: " << e->get_canonical_type().get() << std::dec <<
"\n"
9989 o << std::hex << *h << std::dec;
9995 for (
const auto &enom : e->get_enumerators())
9996 o <<
" " << enom.get_name() <<
" = " << enom.get_value() <<
",\n";
10004 std::ostringstream o;
10005 o << t->get_pretty_representation(
true,
10012 return artifact->get_pretty_representation(
true,
10111 return const_cast<type_base*
>(artifact);
10128 return const_cast<decl_base*
>(artifact);
10158debug_comp_vec(
const vector<const type_base*>& vect, std::ostringstream& o)
10160 for (
auto t : vect)
10162 o <<
"|" << t->get_pretty_representation()
10163 <<
"@" << std::hex << t << std::dec;
10175print_comp_stack(
const environment& env)
10177 std::ostringstream o;
10178 o <<
"left-operands: ";
10179 debug_comp_vec(env.priv_->left_type_comp_operands_, o);
10180 o <<
"\n" <<
"right-operands: ";
10181 debug_comp_vec(env.priv_->right_type_comp_operands_, o);
10194 std::cerr << print_comp_stack(env);
10195 std::cerr << std::endl;
10230{
return dynamic_cast<const decl_base*
>(t);}
10248{
return dynamic_pointer_cast<decl_base>(t);}
10264#ifdef RETURN_FROM_CLASSES_HAVE_SAME_LAYOUT
10265#undef RETURN_FROM_CLASSES_HAVE_SAME_LAYOUT
10268#ifdef ENSURE_NO_ENDLESS_LOOP
10269#undef ENSURE_NO_ENDLESS_LOOP
10272#define RETURN_FROM_CLASSES_HAVE_SAME_LAYOUT(VALUE) \
10275 auto t1 = is_class_or_union_type(f); \
10276 auto t2 = is_class_or_union_type(s); \
10277 t1->priv_->comparing_class_layouts_.erase(t2.get()); \
10278 t2->priv_->comparing_class_layouts_.erase(t1.get()); \
10282#define ENSURE_NO_ENDLESS_LOOP \
10285 auto t1 = is_class_or_union_type(f); \
10286 auto t2 = is_class_or_union_type(s); \
10287 const auto& END = t1->priv_->comparing_class_layouts_.end(); \
10288 if (t1->priv_->comparing_class_layouts_.find(t2.get()) != END \
10289 || t2->priv_->comparing_class_layouts_.find(t1.get()) != END) \
10291 t1->priv_->comparing_class_layouts_.insert(t2.get()); \
10292 t2->priv_->comparing_class_layouts_.insert(t1.get()); \
10300 || (fc->get_qualified_name() != sc->get_qualified_name())
10301 || (fc->get_size_in_bits() != sc->get_size_in_bits())
10302 || (fc->get_data_members().size() != sc->get_data_members().size()))
10306 RETURN_FROM_CLASSES_HAVE_SAME_LAYOUT(
true);
10309 for (
auto f_decl_it = fc->get_data_members().begin(),
10310 s_decl_it = sc->get_data_members().begin();
10311 (f_decl_it != fc->get_data_members().end()
10312 && s_decl_it != sc->get_data_members().end());
10313 ++f_decl_it, ++s_decl_it)
10316 type_base_sptr dm1_type = dm1->get_type(), dm2_type = dm2->get_type();
10318 if (*dm1_type != *dm2_type
10320 RETURN_FROM_CLASSES_HAVE_SAME_LAYOUT(
false);
10324 for (
auto f_bs_it = fc->get_base_specifiers().begin(),
10325 s_bs_it = sc->get_base_specifiers().end();
10326 (f_bs_it != fc->get_base_specifiers().end()
10327 && s_bs_it != sc->get_base_specifiers().end());
10328 ++f_bs_it, ++s_bs_it)
10331 if ((f_bs->get_is_virtual() != s_bs->get_is_virtual())
10332 || (f_bs->get_offset_in_bits() != s_bs->get_offset_in_bits()))
10333 RETURN_FROM_CLASSES_HAVE_SAME_LAYOUT(
false);
10335 class_decl_sptr fb = f_bs->get_base_class(), sb = s_bs->get_base_class();
10337 RETURN_FROM_CLASSES_HAVE_SAME_LAYOUT(
false);
10340 if (fc->has_vtable() != sc->has_vtable())
10341 RETURN_FROM_CLASSES_HAVE_SAME_LAYOUT(
false);
10344 ENSURE_NO_ENDLESS_LOOP;
10345 if (fc->has_vtable())
10347 if (fc->get_virtual_mem_fns().size() > sc->get_virtual_mem_fns().size())
10349 RETURN_FROM_CLASSES_HAVE_SAME_LAYOUT(
false);
10351 for (
auto it1 = fc->get_virtual_mem_fns().begin(),
10352 it2 = sc->get_virtual_mem_fns().begin();
10353 (it1 != fc->get_virtual_mem_fns().end()
10354 && it2 != sc->get_virtual_mem_fns().end());
10357 method_decl_sptr method1 = *it1;
10358 method_decl_sptr method2 = *it2;
10363 method2->get_type()))
10364 RETURN_FROM_CLASSES_HAVE_SAME_LAYOUT(
false);
10368 RETURN_FROM_CLASSES_HAVE_SAME_LAYOUT(
true);
10370#ifdef RETURN_FROM_CLASSES_HAVE_SAME_LAYOUT
10371#undef RETURN_FROM_CLASSES_HAVE_SAME_LAYOUT
10374#ifdef ENSURE_NO_ENDLESS_LOOP
10375#undef ENSURE_NO_ENDLESS_LOOP
10399 if (!type1 || !type2)
10402 if (type1 == type2 || *type1 == *type2)
10408 if (t1 && t2 && *t1 == *t2)
10432 type_base_sptr e1 = a1->get_element_type();
10433 type_base_sptr e2 = a2->get_element_type();
10437 if ((a1->get_size_in_bits() != a2->get_size_in_bits())
10438 || (a1->get_dimension_count() != a2->get_dimension_count())
10450 fn_type2->get_return_type()))
10457 if (fn_type1->get_parameters().size()
10458 != fn_type2->get_parameters().size())
10461 for (
auto p1 = fn_type1->get_first_non_implicit_parm(),
10462 p2 = fn_type2->get_first_non_implicit_parm();
10463 (p1 != fn_type1->get_parameters().end()
10464 && p2 != fn_type2->get_parameters().end());
10467 (*p2)->get_type()))
10493 const decl_base_sptr d2)
10651 const string& name)
10656 if (!containing_class_or_union)
10673{
return (decl &&
dynamic_cast<template_decl*
>(decl->get_scope()));}
10683 return (decl && (dynamic_pointer_cast<type_tparameter>(decl)
10684 || dynamic_pointer_cast<non_type_tparameter>(decl)
10685 || dynamic_pointer_cast<template_tparameter>(decl)));
10715{
return dynamic_pointer_cast<function_decl>(d);}
10738{
return dynamic_pointer_cast<function_decl::parameter>(tod);}
10749 if (d && (d->
kind() & type_or_decl_base::ABSTRACT_DECL_BASE))
10751 if (!(d->
kind() & type_or_decl_base::ABSTRACT_TYPE_BASE))
10777{
return dynamic_pointer_cast<decl_base>(d);}
10799{
return dynamic_pointer_cast<decl_base>(t);}
10809 if (
dynamic_cast<const type_base*
>(&tod))
10822 if (t && (t->
kind() & type_or_decl_base::ABSTRACT_TYPE_BASE))
10836{
return dynamic_pointer_cast<type_base>(tod);}
10868 if (!cou->get_naming_typedef())
10910{
return dynamic_cast<const type_decl*
>(t);}
10918{
return dynamic_pointer_cast<type_decl>(t);}
11012{
return dynamic_pointer_cast<typedef_decl>(t);}
11110{
return dynamic_pointer_cast<enum_type_decl>(d);}
11179 if (t->
kind() & type_or_decl_base::CLASS_TYPE)
11193{
return dynamic_pointer_cast<class_decl>(d);}
11215 if (array->is_non_finite())
11285 if (array->get_subranges().size() == 1
11286 && array->get_subranges()[0]->get_length() == 1)
11356 return klass->get_is_declaration_only();
11405shared_ptr<class_or_union>
11407{
return dynamic_pointer_cast<class_or_union>(t);}
11436 const class_or_union_sptr& second)
11466{
return dynamic_pointer_cast<union_decl>(t);}
11480 bool look_through_qualifiers)
11486 if (look_through_qualifiers)
11504 bool look_through_qualifiers)
11506 type_base_sptr type =
is_type(t);
11507 if (look_through_qualifiers)
11509 return dynamic_pointer_cast<pointer_type_def>(type);
11652 bool look_through_qualifiers)
11658 if (look_through_qualifiers)
11675 bool look_through_qualifiers)
11679 if (look_through_qualifiers)
11696 bool look_through_qualifiers)
11698 type_base_sptr type =
is_type(t);
11699 if (look_through_qualifiers)
11701 return dynamic_pointer_cast<reference_type_def>(type);
11712 bool look_through_qualifiers)
11715 if (look_through_qualifiers)
11732 bool look_through_qualifiers)
11734 type_base_sptr type =
is_type(t);
11735 if (look_through_qualifiers)
11737 return dynamic_pointer_cast<ptr_to_mbr_type>(type);
11811const type_base_sptr
11814 type_base_sptr nil;
11818 if (t->get_environment().get_void_pointer_type().get() == t.get())
11847qualified_type_def_sptr
11849{
return dynamic_pointer_cast<qualified_type_def>(t);}
11859{
return dynamic_pointer_cast<function_type>(t);}
11889{
return dynamic_pointer_cast<method_type>(t);}
11969 decl_base_sptr decl;
11976 while (decl->get_is_declaration_only()
11977 && decl->get_definition_of_declaration())
11978 decl = decl->get_definition_of_declaration();
12045 decl_base_sptr d =
is_decl(t);
12070{
return dynamic_pointer_cast<var_decl>(decl);}
12079{
return dynamic_pointer_cast<namespace_decl>(d);}
12113 && dynamic_pointer_cast<function_decl>(decl)
12124 bool look_through_qualifiers)
12128 if (look_through_qualifiers)
12140 bool look_through_qualifiers)
12142 type_base_sptr t =
is_type(type);
12144 if (look_through_qualifiers)
12146 return dynamic_pointer_cast<array_type_def>(t);
12155qualified_type_def_sptr
12159 return qualified_type_def_sptr();
12229{
return dynamic_pointer_cast<array_type_def::subrange_type>(type);}
12239{
return decl && dynamic_pointer_cast<template_decl>(decl);}
12245 LOOKUP_ENTITY_TYPE,
12277find_next_delim_in_cplus_type(
const string& fqn,
12281 int angle_count = 0;
12282 bool found =
false;
12284 for (; i < fqn.size(); ++i)
12288 else if (fqn[i] ==
'>')
12290 else if (i + 1 < fqn.size()
12293 && fqn[i+1] ==
':')
12310 list<string>& comps)
12312 string::size_type fqn_size = fqn.size(), comp_begin = 0, comp_end = fqn_size;
12315 if (!find_next_delim_in_cplus_type(fqn, comp_begin, comp_end))
12316 comp_end = fqn_size;
12318 string comp = fqn.substr(comp_begin, comp_end - comp_begin);
12319 comps.push_back(comp);
12321 comp_begin = comp_end + 2;
12322 if (comp_begin >= fqn_size)
12338 for (list<string>::const_iterator c = comps.begin();
12341 if (c == comps.begin())
12344 result +=
"::" + *c;
12359template<
typename T>
12361iterator_is_last(T& container,
12362 typename T::const_iterator i)
12364 typename T::const_iterator next = i;
12366 return (next == container.end());
12383lookup_types_in_map(
const interned_string& type_name,
12386 istring_type_base_wptrs_map_type::const_iterator i = type_map.find(type_name);
12387 if (i != type_map.end())
12408template <
class TypeKind>
12409static shared_ptr<TypeKind>
12410lookup_type_in_map(
const interned_string& type_name,
12413 istring_type_base_wptrs_map_type::const_iterator i = type_map.find(type_name);
12414 if (i != type_map.end())
12418 for (
auto j : i->second)
12420 type_base_sptr t(j);
12421 decl_base_sptr d =
is_decl(t);
12422 if (d && !d->get_is_declaration_only())
12423 return dynamic_pointer_cast<TypeKind>(type_base_sptr(j));
12428 return dynamic_pointer_cast<TypeKind>(type_base_sptr(i->second.back()));
12430 return shared_ptr<TypeKind>();
12447 return lookup_type_in_map<type_decl>(type_name,
12506 return lookup_type_in_map<class_decl>(type_name,
12524 return lookup_type_in_map<union_decl>(type_name,
12559 union_decl_sptr result = lookup_type_in_map<union_decl>(loc, m);
12592 return lookup_type_in_map<enum_type_decl>(type_name,
12631 return lookup_type_in_map<typedef_decl>(type_name,
12667qualified_type_def_sptr
12672 return lookup_type_in_map<qualified_type_def>(type_name,
12691qualified_type_def_sptr
12718 return lookup_type_in_map<pointer_type_def>(type_name,
12780 return lookup_type_in_map<reference_type_def>(type_name,
12799 bool lvalue_reference,
12824 return lookup_type_in_map<array_type_def>(type_name,
12844 return lookup_type_in_map<function_type>(type_name,
12890const type_base_sptr
12894 type_base_sptr result;
12933const type_base_sptr
12957const type_base_sptr
12961 list<string> comps;
12974const decl_base_sptr
12978 list<string> comps;
12994template<
typename NodeKind>
13006{
return node->get_name();}
13026{
return node->get_name();}
13035template<
typename NodeKind>
13036static decl_base_sptr
13037convert_node_to_decl(shared_ptr<NodeKind> node);
13050template<
typename NodeKind>
13052lookup_node_in_scope(
const list<string>& fqn,
13056 shared_ptr<NodeKind> node;
13057 bool it_is_last =
false;
13060 for (list<string>::const_iterator c = fqn.begin(); c != fqn.end(); ++c)
13063 it_is_last = iterator_is_last(fqn, c);
13064 for (scope_decl::declarations::const_iterator m =
13065 cur_scope->get_member_decls().begin();
13066 m != cur_scope->get_member_decls().end();
13072 scope = dynamic_pointer_cast<scope_decl>(*m);
13073 if (scope && scope->get_name() == *c)
13082 node = dynamic_pointer_cast<NodeKind>(*m);
13086 dynamic_pointer_cast<class_decl>(node))
13087 if (cl->get_is_declaration_only()
13088 && !cl->get_definition_of_declaration())
13090 resulting_decl = node;
13095 if (!new_scope && !resulting_decl)
13096 return decl_base_sptr();
13097 cur_scope = new_scope;
13100 return resulting_decl;
13121const type_base_sptr
13124{
return is_type(lookup_node_in_scope<type_base>(comps, scope));}
13148static const type_base_sptr
13150 const vector<scope_decl*>& access_path,
13153 vector<scope_decl*> a = access_path;
13154 type_base_sptr result;
13159 first_scope = a.back();
13167 for (scope_decl::declarations::const_iterator i =
13171 if (
is_type(*i) && (*i)->get_name() == n)
13179 first_scope = a.back();
13180 interned_string scope_name, cur_scope_name = first_scope->
get_name();
13181 for (scope_decl::scopes::const_iterator i =
13186 scope_name = (*i)->get_name();
13187 if (scope_name == cur_scope_name)
13213static const type_base_sptr
13215 const scope_decl* scope)
13218 return type_base_sptr();
13222 vector<scope_decl*> access_path;
13223 for (scope_decl* s = type_decl->get_scope(); s != 0; s = s->get_scope())
13225 access_path.push_back(s);
13251const type_base_sptr
13266const decl_base_sptr
13269{
return is_var_decl(lookup_node_in_scope<var_decl>(comps, skope));}
13282template<
typename NodeKind>
13284lookup_node_in_translation_unit(
const list<string>& fqn,
13302{
return is_type(lookup_node_in_translation_unit<type_base>(fqn, tu));}
13322{
return is_class_type(lookup_node_in_translation_unit<class_decl>(fqn, tu));}
13335lookup_basic_type_through_translation_units(
const interned_string& type_name,
13336 const corpus& abi_corpus)
13340 for (translation_units::const_iterator tu =
13360static union_decl_sptr
13361lookup_union_type_through_translation_units(
const interned_string& type_name,
13362 const corpus & abi_corpus)
13364 union_decl_sptr result;
13366 for (translation_units::const_iterator tu =
13367 abi_corpus.get_translation_units().begin();
13368 tu != abi_corpus.get_translation_units().end();
13387lookup_enum_type_through_translation_units(
const interned_string& type_name,
13388 const corpus & abi_corpus)
13392 for (translation_units::const_iterator tu =
13393 abi_corpus.get_translation_units().begin();
13394 tu != abi_corpus.get_translation_units().end();
13411lookup_typedef_type_through_translation_units(
const interned_string& type_name,
13412 const corpus & abi_corpus)
13416 for (translation_units::const_iterator tu =
13417 abi_corpus.get_translation_units().begin();
13418 tu != abi_corpus.get_translation_units().end();
13435static qualified_type_def_sptr
13436lookup_qualified_type_through_translation_units(
const interned_string& t_name,
13437 const corpus & abi_corpus)
13439 qualified_type_def_sptr result;
13441 for (translation_units::const_iterator tu =
13442 abi_corpus.get_translation_units().begin();
13443 tu != abi_corpus.get_translation_units().end();
13461lookup_pointer_type_through_translation_units(
const interned_string& type_name,
13462 const corpus & abi_corpus)
13466 for (translation_units::const_iterator tu =
13467 abi_corpus.get_translation_units().begin();
13468 tu != abi_corpus.get_translation_units().end();
13486lookup_reference_type_through_translation_units(
const interned_string& t_name,
13487 const corpus & abi_corpus)
13491 for (translation_units::const_iterator tu =
13492 abi_corpus.get_translation_units().begin();
13493 tu != abi_corpus.get_translation_units().end();
13511lookup_array_type_through_translation_units(
const interned_string& type_name,
13512 const corpus & abi_corpus)
13516 for (translation_units::const_iterator tu =
13517 abi_corpus.get_translation_units().begin();
13518 tu != abi_corpus.get_translation_units().end();
13536lookup_function_type_through_translation_units(
const interned_string& type_name,
13537 const corpus & abi_corpus)
13541 for (translation_units::const_iterator tu =
13542 abi_corpus.get_translation_units().begin();
13543 tu != abi_corpus.get_translation_units().end();
13561 const corpus& abi_corpus)
13563 type_base_sptr result;
13565 for (translation_units::const_iterator tu =
13586 const string& tu_path,
13589 string_tu_map_type::const_iterator i = corp.priv_->path_tu_map.find(tu_path);
13590 if (i == corp.priv_->path_tu_map.end())
13591 return type_base_sptr();
13620 for (translation_units::const_iterator i =
13666 result = lookup_type_in_map<type_decl>(qualified_name, m);
13668 result = lookup_basic_type_through_translation_units(qualified_name, corp);
13688 result = lookup_type_in_map<type_decl>(loc, m);
13779 class_decl_sptr result = lookup_type_in_map<class_decl>(qualified_name, m);
13797 return lookup_types_in_map(qualified_name, m);
13823 for (
auto type : *v)
13825 type_base_sptr t(type);
13827 if (c->get_is_declaration_only()
13828 && !c->get_definition_of_declaration())
13829 result.push_back(type);
13832 return !result.empty();
13848 return lookup_types_in_map(qualified_name, m);
13929 union_decl_sptr result = lookup_type_in_map<union_decl>(type_name, m);
13931 result = lookup_union_type_through_translation_units(type_name, corp);
14010 lookup_type_in_map<enum_type_decl>(qualified_name, m);
14012 result = lookup_enum_type_through_translation_units(qualified_name, corp);
14030 return lookup_types_in_map(qualified_name, m);
14135 lookup_type_in_map<typedef_decl>(qualified_name, m);
14137 result = lookup_typedef_type_through_translation_units(qualified_name,
14232qualified_type_def_sptr
14247qualified_type_def_sptr
14253 qualified_type_def_sptr result =
14254 lookup_type_in_map<qualified_type_def>(qualified_name, m);
14257 result = lookup_qualified_type_through_translation_units(qualified_name,
14299 lookup_type_in_map<pointer_type_def>(qualified_name, m);
14301 result = lookup_pointer_type_through_translation_units(qualified_name,
14349 lookup_type_in_map<reference_type_def>(qualified_name, m);
14351 result = lookup_reference_type_through_translation_units(qualified_name,
14398 lookup_type_in_map<array_type_def>(qualified_name, m);
14400 result = lookup_array_type_through_translation_units(qualified_name, corp);
14469 lookup_type_in_map<function_type>(qualified_name, m);
14471 result = lookup_function_type_through_translation_units(qualified_name,
14494 type_base_sptr result;
14527 type_base_sptr result;
14575 return type_base_sptr();
14592template<
typename TypeKind>
14596 bool use_type_name_as_key =
true)
14600 if (use_type_name_as_key)
14602 else if (
location l = type->get_location())
14604 string str = l.expand();
14605 s = type->get_environment().intern(str);
14608 istring_type_base_wptrs_map_type::iterator i = types_map.find(s);
14609 bool result =
false;
14611 if (i == types_map.end())
14613 types_map[s].push_back(type);
14617 i->second.push_back(type);
14638 bool use_type_name_as_key)
14642 bool update_qname_map =
true;
14643 if (type->get_is_declaration_only())
14649 is_class_type(class_type->get_definition_of_declaration()))
14653 if (!update_qname_map)
14657 if (use_type_name_as_key)
14659 string qname = type->get_qualified_name();
14660 s = type->get_environment().intern(qname);
14662 else if (
location l = type->get_location())
14664 string str = l.expand();
14665 s = type->get_environment().intern(str);
14668 bool result =
false;
14669 istring_type_base_wptrs_map_type::iterator i = map.find(s);
14670 if (i == map.end())
14672 map[s].push_back(type);
14676 i->second.push_back(type);
14702 bool result =
false;
14704 istring_type_base_wptrs_map_type::iterator i = types_map.find(s);
14705 if (i == types_map.end())
14707 types_map[s].push_back(type);
14711 i->second.push_back(type);
14731 maybe_update_types_lookup_map<type_decl>
14734 if (
corpus *type_corpus = basic_type->get_corpus())
14736 maybe_update_types_lookup_map<type_decl>
14738 type_corpus->priv_->get_types().basic_types());
14740 maybe_update_types_lookup_map<type_decl>
14742 type_corpus->get_type_per_loc_map().basic_types(),
14747 maybe_update_types_lookup_map<type_decl>
14749 group->priv_->get_types().basic_types());
14751 maybe_update_types_lookup_map<type_decl>
14753 group->get_type_per_loc_map().basic_types(),
14778 if (
corpus *type_corpus = class_type->get_corpus())
14782 type_corpus->priv_->get_types().class_types());
14786 type_corpus->get_type_per_loc_map().class_types(),
14793 group->priv_->get_types().class_types());
14797 group->get_type_per_loc_map().class_types(),
14818 maybe_update_types_lookup_map<union_decl>
14821 if (
corpus *type_corpus = union_type->get_corpus())
14823 maybe_update_types_lookup_map<union_decl>
14825 type_corpus->priv_->get_types().union_types());
14827 maybe_update_types_lookup_map<union_decl>
14829 type_corpus->get_type_per_loc_map().union_types(),
14834 maybe_update_types_lookup_map<union_decl>
14836 group->priv_->get_types().union_types());
14838 maybe_update_types_lookup_map<union_decl>
14840 group->get_type_per_loc_map().union_types(),
14861 maybe_update_types_lookup_map<enum_type_decl>
14864 if (
corpus *type_corpus = enum_type->get_corpus())
14866 maybe_update_types_lookup_map<enum_type_decl>
14868 type_corpus->priv_->get_types().enum_types());
14870 maybe_update_types_lookup_map<enum_type_decl>
14872 type_corpus->get_type_per_loc_map().enum_types(),
14877 maybe_update_types_lookup_map<enum_type_decl>
14879 group->priv_->get_types().enum_types());
14881 maybe_update_types_lookup_map<enum_type_decl>
14883 group->get_type_per_loc_map().enum_types(),
14905 maybe_update_types_lookup_map<typedef_decl>
14908 if (
corpus *type_corpus = typedef_type->get_corpus())
14910 maybe_update_types_lookup_map<typedef_decl>
14912 type_corpus->priv_->get_types().typedef_types());
14914 maybe_update_types_lookup_map<typedef_decl>
14916 type_corpus->get_type_per_loc_map().typedef_types(),
14921 maybe_update_types_lookup_map<typedef_decl>
14923 group->priv_->get_types().typedef_types());
14925 maybe_update_types_lookup_map<typedef_decl>
14927 group->get_type_per_loc_map().typedef_types(),
14948 maybe_update_types_lookup_map<qualified_type_def>
14951 if (
corpus *type_corpus = qualified_type->get_corpus())
14953 maybe_update_types_lookup_map<qualified_type_def>
14955 type_corpus->priv_->get_types().qualified_types());
14959 maybe_update_types_lookup_map<qualified_type_def>
14961 group->priv_->get_types().qualified_types());
14981 maybe_update_types_lookup_map<pointer_type_def>
14984 if (
corpus *type_corpus = pointer_type->get_corpus())
14986 maybe_update_types_lookup_map<pointer_type_def>
14988 type_corpus->priv_->get_types().pointer_types());
14992 maybe_update_types_lookup_map<pointer_type_def>
14994 group->priv_->get_types().pointer_types());
15014 maybe_update_types_lookup_map<ptr_to_mbr_type>
15017 if (
corpus *type_corpus = ptr_to_member->get_corpus())
15019 maybe_update_types_lookup_map<ptr_to_mbr_type>
15021 type_corpus->priv_->get_types().ptr_to_mbr_types());
15025 maybe_update_types_lookup_map<ptr_to_mbr_type>
15027 group->priv_->get_types().ptr_to_mbr_types());
15047 maybe_update_types_lookup_map<reference_type_def>
15050 if (
corpus *type_corpus = reference_type->get_corpus())
15052 maybe_update_types_lookup_map<reference_type_def>
15054 type_corpus->priv_->get_types().reference_types());
15058 maybe_update_types_lookup_map<reference_type_def>
15060 group->priv_->get_types().reference_types());
15080 maybe_update_types_lookup_map<array_type_def>
15083 if (
corpus *type_corpus = array_type->get_corpus())
15085 maybe_update_types_lookup_map<array_type_def>
15087 type_corpus->priv_->get_types().array_types());
15089 maybe_update_types_lookup_map<array_type_def>
15091 type_corpus->get_type_per_loc_map().array_types(),
15096 maybe_update_types_lookup_map<array_type_def>
15098 group->priv_->get_types().array_types());
15100 maybe_update_types_lookup_map<array_type_def>
15102 group->get_type_per_loc_map().array_types(),
15124 maybe_update_types_lookup_map<array_type_def::subrange_type>
15127 if (
corpus *type_corpus = subrange_type->get_corpus())
15129 maybe_update_types_lookup_map<array_type_def::subrange_type>
15131 type_corpus->priv_->get_types().subrange_types());
15133 maybe_update_types_lookup_map<array_type_def::subrange_type>
15135 type_corpus->get_type_per_loc_map().subrange_types(),
15138 if (
corpus *group = subrange_type->get_corpus())
15140 maybe_update_types_lookup_map<array_type_def::subrange_type>
15142 group->priv_->get_types().subrange_types());
15144 maybe_update_types_lookup_map<array_type_def::subrange_type>
15146 group->get_type_per_loc_map().subrange_types(),
15171 if (
corpus *type_corpus = fn_type->get_corpus())
15175 type_corpus->priv_->get_types().function_types());
15177 if (
corpus *group = fn_type->get_corpus())
15181 group->priv_->get_types().function_types());
15274 type_base_sptr result;
15282 type_base_sptr underlying_type =
15285 if (underlying_type)
15288 qual->get_cv_quals(),
15289 qual->get_location()));
15294 type_base_sptr pointed_to_type =
15297 if (pointed_to_type)
15300 p->get_size_in_bits(),
15301 p->get_alignment_in_bits(),
15302 p->get_location()));
15307 type_base_sptr pointed_to_type =
15309 if (pointed_to_type)
15313 r->get_size_in_bits(),
15314 r->get_alignment_in_bits(),
15315 r->get_location()));
15329 tu.priv_->synthesized_types_.push_back(result);
15362 type_base_sptr result_return_type;
15367 if (!result_return_type)
15371 type_base_sptr parm_type;
15373 for (function_type::parameters::const_iterator i =
15378 type_base_sptr t = (*i)->get_type();
15385 (*i)->get_location(),
15386 (*i)->get_variadic_marker(),
15387 (*i)->get_is_artificial()));
15388 parms.push_back(parm);
15391 class_or_union_sptr class_type;
15403 result_fn_type.reset(
new method_type(result_return_type,
15415 tu.priv_->synthesized_types_.push_back(result_fn_type);
15419 return result_fn_type;
15430 if (mangled_name.empty())
15435 char * str = abi::__cxa_demangle(mangled_name.c_str(),
15436 NULL, &l, &status);
15437 string demangled_name = mangled_name;
15441 demangled_name = str;
15445 return demangled_name;
15470global_scope::~global_scope()
15491types_defined_same_linux_kernel_corpus_public(
const type_base& t1,
15492 const type_base& t2)
15494 const corpus *t1_corpus = t1.get_corpus(), *t2_corpus = t2.get_corpus();
15495 string t1_file_path, t2_file_path;
15499 if (!(t1_corpus && t2_corpus
15500 && t1_corpus == t2_corpus
15501 && (t1_corpus->get_origin() & corpus::LINUX_KERNEL_BINARY_ORIGIN)
15506 class_or_union *c1 = 0, *c2 = 0;
15512 if ((c1 && c1->get_is_anonymous() && !c1->get_naming_typedef())
15513 || (c2 && c2->get_is_anonymous() && !c2->get_naming_typedef()))
15520 && c1->get_is_anonymous() && c1->get_naming_typedef()
15521 && c2->get_is_anonymous() && c2->get_naming_typedef())
15522 if (c1->get_naming_typedef()->get_name()
15523 != c2->get_naming_typedef()->get_name())
15529 if (e1->get_is_anonymous() || e2->get_is_anonymous())
15539 if (c1->get_is_declaration_only() != c2->get_is_declaration_only())
15541 if (c1->get_environment().decl_only_class_equals_definition())
15551 if (t1.get_size_in_bits() != t2.get_size_in_bits())
15560 l = c1->get_location();
15562 l =
dynamic_cast<const decl_base&
>(t1).
get_location();
15564 unsigned line = 0, col = 0;
15566 l.
expand(t1_file_path, line, col);
15568 l = c2->get_location();
15570 l =
dynamic_cast<const decl_base&
>(t2).
get_location();
15572 l.
expand(t2_file_path, line, col);
15575 if (t1_file_path.empty() || t2_file_path.empty())
15578 if (t1_file_path == t2_file_path)
15614compare_types_during_canonicalization(
const type_base& canonical_type,
15615 const type_base& candidate_type)
15617#ifdef WITH_DEBUG_TYPE_CANONICALIZATION
15618 const environment& env = canonical_type.get_environment();
15619 if (env.debug_type_canonicalization_is_on())
15621 bool canonical_equality =
false, structural_equality =
false;
15622 env.priv_->allow_type_comparison_results_caching(
false);
15623 env.priv_->use_canonical_type_comparison_ =
false;
15624 structural_equality = canonical_type == candidate_type;
15625 env.priv_->use_canonical_type_comparison_ =
true;
15626 canonical_equality = canonical_type == candidate_type;
15627 env.priv_->allow_type_comparison_results_caching(
true);
15628 if (canonical_equality != structural_equality)
15630 std::cerr <<
"structural & canonical equality different for type: "
15631 << canonical_type.get_pretty_representation(
true,
true)
15635 return structural_equality;
15638 return canonical_type == candidate_type;
15662compare_canonical_type_against_candidate(
const type_base& canonical_type,
15663 const type_base& candidate_type)
15665 environment& env =
const_cast<environment&
>(canonical_type.get_environment());
15683 bool saved_decl_only_class_equals_definition =
15684 env.decl_only_class_equals_definition();
15688 env.decl_only_class_equals_definition(
false);
15689 env.priv_->allow_type_comparison_results_caching(
true);
15690 bool equal = (types_defined_same_linux_kernel_corpus_public(canonical_type,
15692 || compare_types_during_canonicalization(canonical_type,
15697 env.priv_->clear_type_comparison_results_cache();
15698 env.priv_->allow_type_comparison_results_caching(
false);
15699 env.decl_only_class_equals_definition
15700 (saved_decl_only_class_equals_definition);
15725compare_canonical_type_against_candidate(
const type_base* canonical_type,
15726 const type_base* candidate_type)
15728 return compare_canonical_type_against_candidate(*canonical_type,
15753compare_canonical_type_against_candidate(
const type_base_sptr& canonical_type,
15754 const type_base_sptr& candidate_type)
15756 return compare_canonical_type_against_candidate(canonical_type.get(),
15757 candidate_type.get());
15777static type_base_sptr
15778candidate_matches_a_canonical_type_hash(
const vector<type_base_sptr>& cncls,
15781 if (type.get_corpus()
15782 && type.get_corpus()->get_origin() == corpus::NATIVE_XML_ORIGIN
15791 for (
const auto& c : cncls)
15797 if (compare_canonical_type_against_candidate(*c, type))
15801 for (
const auto& c : cncls)
15806 if (compare_canonical_type_against_candidate(*c, type))
15856type_base::get_canonical_type_for(type_base_sptr t)
15865 return type_base_sptr();
15871 bool decl_only_class_equals_definition =
15884 if (decl_only_class_equals_definition)
15887 return type_base_sptr();
15890 if (t->get_canonical_type())
15891 return t->get_canonical_type();
15912 string repr = t->get_cached_pretty_representation(
true);
15917 type_base_sptr canonical_type_present_in_corpus;
15921 type_base_sptr result;
15922 environment::canonical_types_map_type::iterator i = types.find(repr);
15924 if (i == types.end())
15926 vector<type_base_sptr> v;
15933 vector<type_base_sptr> &v = i->second;
15938 result = candidate_matches_a_canonical_type_hash(v, *t);
15946 for (vector<type_base_sptr>::const_reverse_iterator it = v.rbegin();
15947 !result && it != v.rend();
15950 bool equal = compare_canonical_type_against_candidate(*it, t);
15957#ifdef WITH_DEBUG_SELF_COMPARISON
15958 if (env.self_comparison_debug_is_on())
15962 corpus_sptr corp1, corp2;
15963 env.get_self_comparison_debug_inputs(corp1, corp2);
15965 && corp1->get_origin() != corp2->get_origin()
15966 && corp2->get_origin() & corpus::NATIVE_XML_ORIGIN)
15977 check_canonical_type_from_abixml_during_self_comp(t,
15983 uintptr_t should_have_canonical_type = 0;
15984 string type_id = env.get_type_id_from_type(t.get());
15985 if (type_id.empty())
15986 type_id =
"type-id-<not-found>";
15988 should_have_canonical_type =
15989 env.get_canonical_type_from_type_id(type_id.c_str());
15990 std::cerr <<
"error: wrong canonical type for '"
15999 <<
"'. Should have had canonical type: "
16001 << should_have_canonical_type
16008 uintptr_t ptr_val =
reinterpret_cast<uintptr_t
>(t.get());
16009 string type_id = env.get_type_id_from_pointer(ptr_val);
16010 if (type_id.empty())
16011 type_id =
"type-id-<not-found>";
16028 std::cerr <<
"error: wrong induced canonical type for '"
16030 <<
"' from second corpus"
16031 <<
", ptr: " << std::hex << t.get()
16032 <<
" type-id: " << type_id
16034 << *t->hash_value()
16044 if (t_hash != result_hash)
16046 std::cerr <<
"error: type hash mismatch"
16047 <<
" between type: '"
16053 << *t->hash_value()
16054 <<
" and its computed canonical type @"
16059 << *result->hash_value()
16074 t->priv_->canonical_type_index = v.size();
16103maybe_adjust_canonical_type(
const type_base_sptr& canonical,
16104 const type_base_sptr& type)
16106 if (type->get_naked_canonical_type())
16114 if (canonical_class
16115 && canonical_class.get() != cl.get())
16119 for (class_decl::member_functions::const_iterator i =
16120 cl->get_member_functions().begin();
16121 i != cl->get_member_functions().end();
16123 if ((*i)->get_symbol())
16126 find_member_function((*i)->get_linkage_name()))
16136 if (canonical_class->get_corpus()
16137 && cl->get_corpus()
16138 && (cl->get_corpus() == canonical_class->get_corpus()))
16152 for (
const auto& data_member : cl->get_data_members())
16159 const auto& canonical_data_member =
16160 canonical_class->find_data_member(data_member->get_name());
16161 if (!canonical_data_member)
16170 if (!canonical_data_member->get_symbol())
16171 canonical_data_member->set_symbol(sym);
16187 canonical_class = cl;
16190 if (canonical_class)
16192 if (
auto abi_corpus = canonical_class->get_corpus())
16194 for (
auto& fn : canonical_class->get_member_functions())
16198 if (sym->is_defined() && sym->is_public())
16200 fn->set_is_in_public_symbol_table(
true);
16201 auto b = abi_corpus->get_exported_decls_builder();
16202 b->maybe_add_fn_to_exported_fns(fn.get());
16204 else if (!sym->is_defined())
16205 abi_corpus->get_undefined_functions().insert(fn.get());
16217 if (type->get_is_artificial() != canonical->get_is_artificial())
16218 canonical->set_is_artificial(
false);
16248 if (t->get_canonical_type())
16249 return t->get_canonical_type();
16251 if (do_log && show_stats)
16252 std::cerr <<
"Canonicalization of type '"
16253 << t->get_pretty_representation(
true,
true)
16254 <<
"/@#" << std::hex << t.get() <<
": ";
16258 if (do_log && show_stats)
16260 type_base_sptr canonical = type_base::get_canonical_type_for(t);
16262 if (do_log && show_stats)
16265 if (do_log && show_stats)
16266 std::cerr << tmr <<
"\n";
16268 maybe_adjust_canonical_type(canonical, t);
16270 t->priv_->canonical_type = canonical;
16271 t->priv_->naked_canonical_type = canonical.get();
16274 if (!t->priv_->canonical_type_index)
16275 t->priv_->canonical_type_index = canonical->priv_->canonical_type_index;
16278 if (type_base_sptr d =
is_type(cl->get_earlier_declaration()))
16279 if ((canonical = d->get_canonical_type()))
16281 d->priv_->canonical_type = canonical;
16282 d->priv_->naked_canonical_type = canonical.get();
16299 if (type_base_sptr c =
is_type(scope)->get_canonical_type())
16314 t->on_canonical_type_set();
16325 priv_->definition_of_declaration_ = d;
16327 if (type_base_sptr canonical_type =
is_type(d)->get_canonical_type())
16328 t->priv_->canonical_type = canonical_type;
16330 priv_->naked_definition_of_declaration_ =
const_cast<decl_base*
>(d.get());
16340 priv_(new
priv(s, a))
16354 return do_hash(
this);
16366{
return priv_->canonical_type.lock();}
16382{
return priv_->naked_canonical_type;}
16409 if (priv_->internal_cached_repr_.
empty())
16414 return priv_->internal_cached_repr_;
16417 if (priv_->cached_repr_.
empty())
16423 return priv_->cached_repr_;
16461{
return equals(*
this, other, 0);}
16478{priv_->size_in_bits = s;}
16485{
return priv_->size_in_bits;}
16492{priv_->alignment_in_bits = a;}
16499{
return priv_->alignment_in_bits;}
16515 v.visit_begin(
this);
16516 bool result = v.visit_end(
this);
16522type_base::~type_base()
16541 static_cast<unsigned>(r));
16556 static_cast<unsigned>(r));
16613parse_real_type_modifier(
const string& word,
16616 if (word ==
"signed")
16618 else if (word ==
"unsigned")
16620 else if (word ==
"short")
16622 else if (word ==
"long")
16624 else if (word ==
"long long")
16642parse_base_real_type(
const string& type_name,
16645 if (type_name ==
"int")
16647 else if (type_name ==
"char")
16649 else if (type_name ==
"bool" || type_name ==
"_Bool")
16651 else if (type_name ==
"double")
16653 else if (type_name ==
"float")
16655 else if (type_name ==
"char16_t")
16657 else if (type_name ==
"char32_t")
16659 else if (type_name ==
"wchar_t")
16661 else if (type_name ==
"__ARRAY_SIZE_TYPE__")
16663 else if (type_name ==
"sizetype")
16664 base = real_type::SIZE_BASE_TYPE;
16665 else if (type_name ==
"ssizetype")
16666 base = real_type::SSIZE_BASE_TYPE;
16667 else if (type_name ==
"bitsizetype")
16668 base = real_type::BIT_SIZE_BASE_TYPE;
16669 else if (type_name ==
"sbitsizetype")
16670 base = real_type::SBIT_SIZE_BASE_TYPE;
16694 string input = type_name;
16695 string::size_type len = input.length();
16696 string::size_type cur_pos = 0, prev_pos = 0;
16697 string cur_word, prev_word;
16700 while (cur_pos < len)
16702 if (cur_pos < len && isspace(input[cur_pos]))
16705 while (cur_pos < len && isspace(input[cur_pos]));
16707 prev_pos = cur_pos;
16708 cur_pos = input.find(
' ', prev_pos);
16709 prev_word = cur_word;
16710 cur_word = input.substr(prev_pos, cur_pos - prev_pos);
16713 && cur_word ==
"long"
16714 && prev_word !=
"long")
16716 if (cur_pos < len && isspace(input[cur_pos]))
16719 while (cur_pos < len && isspace(input[cur_pos]));
16720 prev_pos = cur_pos;
16722 cur_pos = input.find(
' ', prev_pos);
16723 string saved_prev_word = prev_word;
16724 prev_word = cur_word;
16725 cur_word = input.substr(prev_pos, cur_pos - prev_pos);
16726 if (cur_word ==
"long")
16727 cur_word =
"long long";
16730 cur_pos = prev_pos;
16731 cur_word = prev_word;
16732 prev_word = saved_prev_word;
16736 if (!parse_real_type_modifier(cur_word, modifiers))
16738 if (!parse_base_real_type(cur_word, base))
16769 real_type int_type(base_type, modifiers);
16776 : base_(INT_BASE_TYPE),
16777 modifiers_(NO_MODIFIER)
16786 : base_(b), modifiers_(m)
16794 : base_(INT_BASE_TYPE),
16795 modifiers_(NO_MODIFIER)
16813{
return modifiers_;}
16830{
return base_ == other.base_ && modifiers_ == other.modifiers_;}
16848 result +=
"signed ";
16850 result +=
"unsigned ";
16861 result +=
"short ";
16865 result +=
"long long ";
16876 result +=
"double";
16880 result +=
"char16_t";
16882 result +=
"char32_t";
16884 result +=
"wchar_t";
16886 result +=
"__ARRAY_SIZE_TYPE__";
16887 else if (base_ == SIZE_BASE_TYPE)
16888 result +=
"sizetype";
16889 else if (base_ == SSIZE_BASE_TYPE)
16890 result +=
"ssizetype";
16891 else if (base_ == BIT_SIZE_BASE_TYPE)
16892 result +=
"bitsizetype";
16893 else if (base_ == SBIT_SIZE_BASE_TYPE)
16894 result +=
"sbitsizetype";
16903real_type::operator string()
const
16904{
return to_string();}
16927 const string& name,
16928 size_t size_in_bits,
16929 size_t alignment_in_bits,
16931 const string& linkage_name,
16936 | ABSTRACT_TYPE_BASE
16937 | ABSTRACT_DECL_BASE),
16938 decl_base(env, name, locus, linkage_name, vis),
16939 type_base(env, size_in_bits, alignment_in_bits)
16945 real_type int_type(base_type, modifiers);
16950 string real_type_name = int_type;
16998 bool result =
false;
17029 return *
this == *other;
17057 return *
this == other;
17103 if (l.get() == r.get())
17131 bool internal)
const
17155 if (decl_base::priv_->internal_qualified_name_.
empty())
17156 decl_base::priv_->internal_qualified_name_ =
17157 env.
intern(get_internal_real_type_name(
this));
17158 return decl_base::priv_->internal_qualified_name_;
17162 decl_base::priv_->temporary_internal_qualified_name_ =
17163 env.
intern(get_internal_real_type_name(
this));
17164 return decl_base::priv_->temporary_internal_qualified_name_;
17190 bool qualified_name)
const
17194 return get_internal_real_type_name(
this);
17196 if (qualified_name)
17214 v.visit_begin(
this);
17215 bool result = v.visit_end(
this);
17221type_decl::~type_decl()
17241 const string& name,
17242 size_t size_in_bits,
17243 size_t alignment_in_bits,
17247 ABSTRACT_SCOPE_TYPE_DECL
17248 | ABSTRACT_TYPE_BASE
17249 | ABSTRACT_DECL_BASE),
17251 type_base(env, size_in_bits, alignment_in_bits),
17320 return *
this == *other;
17344 if (v.visit_begin(
this))
17347 for (scope_decl::declarations::const_iterator i =
17351 if (!(*i)->traverse(v))
17356 bool result = v.visit_end(
this);
17362scope_type_decl::~scope_type_decl()
17378 const string& name,
17389 | ABSTRACT_DECL_BASE
17390 | ABSTRACT_SCOPE_DECL),
17416 bool qualified_name)
const
17458 if (!ns->is_empty_or_has_empty_sub_namespaces())
17479 if (v.visit_begin(
this))
17482 scope_decl::declarations::const_iterator i;
17488 dynamic_pointer_cast<ir_traversable_base>(*i);
17490 if (!t->traverse (v))
17495 return v.visit_end(
this);
17498namespace_decl::~namespace_decl()
17507class qualified_type_def::priv
17518 weak_ptr<type_base> underlying_type_;
17521 : cv_quals_(CV_NONE)
17526 : cv_quals_(quals),
17527 underlying_type_(t)
17579qualified_type_def::qualified_type_def(type_base_sptr type,
17584 | ABSTRACT_TYPE_BASE
17585 | ABSTRACT_DECL_BASE),
17586 type_base(type->get_environment(), type->get_size_in_bits(),
17587 type->get_alignment_in_bits()),
17588 decl_base(type->get_environment(),
"", locus,
"",
17589 dynamic_pointer_cast<
decl_base>(type)->get_visibility()),
17590 priv_(new priv(quals, type))
17609 | ABSTRACT_TYPE_BASE
17610 | ABSTRACT_DECL_BASE),
17614 priv_(new priv(quals))
17651 s = ut->get_size_in_bits();
17680 bool result =
true;
17747 return *
this == *other;
17765 return *
this == *other;
17780 bool internal)
const
17808 if (priv_->temporary_internal_name_.empty())
17809 priv_->temporary_internal_name_ =
17811 return priv_->temporary_internal_name_;
17827 if (priv_->internal_name_.empty())
17828 priv_->internal_name_ =
17831 return priv_->internal_name_;
17860 if (v.visit_begin(
this))
17867 bool result = v.visit_end(
this);
17872qualified_type_def::~qualified_type_def()
17879{
return priv_->cv_quals_;}
17884{priv_->cv_quals_ = cv_quals;}
17898{
return priv_->underlying_type_.lock();}
17907 priv_->underlying_type_ = t;
17917 scope_decl::declarations::iterator i;
17918 if (s->find_iterator_for_member(
this, i))
17933operator==(
const qualified_type_def_sptr& l,
const qualified_type_def_sptr& r)
17935 if (l.get() == r.get())
17951operator!=(
const qualified_type_def_sptr& l,
const qualified_type_def_sptr& r)
17959 (
static_cast<unsigned>(lhs) |
static_cast<unsigned>(rhs));
17983 (
static_cast<unsigned>(lhs) &
static_cast<unsigned>(rhs));
18005 case qualified_type_def::CV_NONE:
18008 case qualified_type_def::CV_CONST:
18011 case qualified_type_def::CV_VOLATILE:
18014 case qualified_type_def::CV_RESTRICT:
18028struct pointer_type_def::priv
18035 priv(
const type_base_sptr& t)
18037 naked_pointed_to_type_(t.get())
18041 : naked_pointed_to_type_()
18066pointer_type_def::pointer_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))
18082 const environment& env = pointed_to->get_environment();
18083 decl_base_sptr pto = dynamic_pointer_cast<decl_base>(pointed_to);
18084 string name = (pto ? pto->get_name() : string(
"void")) +
"*";
18102pointer_type_def::pointer_type_def(
const environment& env,
size_t size_in_bits,
18103 size_t alignment_in_bits,
18107 | ABSTRACT_TYPE_BASE
18108 | ABSTRACT_DECL_BASE),
18109 type_base(env, size_in_bits, alignment_in_bits),
18114 string name = string(
"void") +
"*";
18139 priv_->pointed_to_type_ = t;
18140 priv_->naked_pointed_to_type_ = t.get();
18145 decl_base_sptr pto = dynamic_pointer_cast<decl_base>(t);
18146 string name = (pto ? pto->get_name() : string(
"void")) +
"*";
18178 bool result = p1 == p2;
18220 return *
this == *o;
18241const type_base_sptr
18243{
return priv_->pointed_to_type_.lock();}
18250{
return priv_->naked_pointed_to_type_;}
18288 if (priv_->internal_qualified_name_.empty())
18289 if (pointed_to_type)
18290 priv_->internal_qualified_name_ =
18291 pointer_declaration_name(
this,
18298 return priv_->internal_qualified_name_;
18306 if (pointed_to_type)
18307 if (priv_->temp_internal_qualified_name_.empty())
18308 priv_->temp_internal_qualified_name_ =
18309 pointer_declaration_name(
this,
18316 return priv_->temp_internal_qualified_name_;
18325 (pointer_declaration_name(
this,
18337 if (pointed_to_type)
18339 (pointer_declaration_name(
this,
18364 if (v.visit_begin(
this))
18372 bool result = v.visit_end(
this);
18377pointer_type_def::~pointer_type_def()
18394 if (l.get() == r.get())
18422struct reference_type_def::priv
18430 priv(
const type_base_sptr& t,
bool is_lvalue)
18432 is_lvalue_(is_lvalue)
18435 priv(
bool is_lvalue)
18436 : is_lvalue_(is_lvalue)
18465reference_type_def::reference_type_def(
const type_base_sptr pointed_to,
18467 size_t size_in_bits,
18468 size_t align_in_bits,
18472 | ABSTRACT_TYPE_BASE
18473 | ABSTRACT_DECL_BASE),
18474 type_base(pointed_to->get_environment(), size_in_bits, align_in_bits),
18475 decl_base(pointed_to->get_environment(),
"", locus,
""),
18476 priv_(new priv(pointed_to, lvalue))
18482 decl_base_sptr pto = dynamic_pointer_cast<decl_base>(pointed_to);
18487 name = string(pto->get_name()) +
"&";
18495 const environment& env = pointed_to->get_environment();
18519reference_type_def::reference_type_def(
const environment& env,
bool lvalue,
18520 size_t size_in_bits,
18521 size_t alignment_in_bits,
18525 | ABSTRACT_TYPE_BASE
18526 | ABSTRACT_DECL_BASE),
18527 type_base(env, size_in_bits, alignment_in_bits),
18529 priv_(new priv(lvalue))
18532 string name =
"void&";
18561 priv_->pointed_to_type_ = pointed_to_type;
18563 decl_base_sptr pto;
18565 {pto = dynamic_pointer_cast<decl_base>(pointed_to_type);}
18572 string name = string(pto->get_name()) +
"&";
18602 if (l.is_lvalue() != r.is_lvalue())
18608 type_base_sptr p1 = l.get_pointed_to_type(), p2 = r.get_pointed_to_type();
18609 bool result = p1 == p2;
18648 return *
this == *other;
18663 return *
this == *other;
18667reference_type_def::get_pointed_to_type()
const
18668{
return priv_->pointed_to_type_.lock();}
18671reference_type_def::is_lvalue()
const
18672{
return priv_->is_lvalue_;}
18702 type_base_sptr pointed_to_type = get_pointed_to_type();
18709 if (priv_->internal_qualified_name_.empty())
18710 if (pointed_to_type)
18711 priv_->internal_qualified_name_ =
18719 return priv_->internal_qualified_name_;
18727 if (pointed_to_type)
18728 if (priv_->temp_internal_qualified_name_.empty())
18729 priv_->temp_internal_qualified_name_ =
18737 return priv_->temp_internal_qualified_name_;
18757 if (pointed_to_type)
18787 bool qualified_name)
const
18791 (get_pointed_to_type()),
18815 if (v.visit_begin(
this))
18818 if (type_base_sptr t = get_pointed_to_type())
18823 bool result = v.visit_end(
this);
18828reference_type_def::~reference_type_def()
18845 if (l.get() == r.get())
18873struct ptr_to_mbr_type::priv
18877 type_base_sptr dm_type_;
18880 type_base_sptr containing_type_;
18887 priv(
const type_base_sptr& dm_type,
const type_base_sptr& containing_type)
18888 : dm_type_(dm_type),
18889 containing_type_(containing_type)
18911 const type_base_sptr& member_type,
18912 const type_base_sptr& containing_type,
18913 size_t size_in_bits,
18914 size_t alignment_in_bits,
18917 POINTER_TO_MEMBER_TYPE
18918 | ABSTRACT_TYPE_BASE
18919 | ABSTRACT_DECL_BASE),
18920 type_base(env, size_in_bits, alignment_in_bits),
18922 priv_(new priv(member_type, containing_type))
18959const type_base_sptr&
18961{
return priv_->dm_type_;}
18968const type_base_sptr&
18970{
return priv_->containing_type_;}
19000 return *
this == *other;
19015 return *
this == *other;
19027 bool internal)
const
19046 if (priv_->internal_qualified_name_.empty())
19047 priv_->internal_qualified_name_ =
19048 ptr_to_mbr_declaration_name(
this,
"",
19051 return priv_->internal_qualified_name_;
19055 priv_->temp_internal_qualified_name_ =
19056 ptr_to_mbr_declaration_name(
this,
"",
true, internal);
19057 return priv_->temp_internal_qualified_name_;
19063 (ptr_to_mbr_declaration_name(
this,
"",
true,
19085 if (v.visit_begin(
this))
19096 bool result = v.visit_end(
this);
19128 bool result =
true;
19130 if (!(l.decl_base::operator==(r)))
19169array_type_def::subrange_type::~subrange_type() =
default;
19178 : s_(UNSIGNED_SIGNEDNESS)
19187 : s_(UNSIGNED_SIGNEDNESS)
19196 : s_(SIGNED_SIGNEDNESS)
19204enum array_type_def::subrange_type::bound_value::signedness
19228{
return v_.unsigned_;}
19236 s_ = UNSIGNED_SIGNEDNESS;
19246 s_ = SIGNED_SIGNEDNESS;
19258 return s_ == v.s_ && v_.unsigned_ == v.v_.unsigned_;
19263struct array_type_def::subrange_type::priv
19273 : upper_bound_(ub), language_(l), infinite_(false)
19276 priv(bound_value lb, bound_value ub,
19278 : lower_bound_(lb), upper_bound_(ub),
19279 language_(l), infinite_(false)
19282 priv(bound_value lb, bound_value ub,
const type_base_sptr &u,
19284 : lower_bound_(lb), upper_bound_(ub), underlying_type_(u),
19285 language_(l), infinite_(false)
19304 const string& name,
19307 const type_base_sptr& utype,
19310 :
type_or_decl_base(env, SUBRANGE_TYPE | ABSTRACT_TYPE_BASE | ABSTRACT_DECL_BASE),
19317 priv_(new priv(lower_bound, upper_bound, utype, l))
19337 const string& name,
19342 :
type_or_decl_base(env, SUBRANGE_TYPE | ABSTRACT_TYPE_BASE | ABSTRACT_DECL_BASE),
19345 priv_(new priv(lower_bound, upper_bound, l))
19363 const string& name,
19367 :
type_or_decl_base(env, SUBRANGE_TYPE | ABSTRACT_TYPE_BASE | ABSTRACT_DECL_BASE),
19368 type_base(env, upper_bound.get_unsigned_value(), 0),
19370 priv_(new priv(upper_bound, l))
19395{
return priv_->underlying_type_.lock();}
19404 ABG_ASSERT(priv_->underlying_type_.expired());
19405 priv_->underlying_type_ = u;
19415{
return priv_->upper_bound_.get_signed_value();}
19422{
return priv_->lower_bound_.get_signed_value();}
19429{priv_->upper_bound_ = ub;}
19436{priv_->lower_bound_ = lb;}
19453 if (get_upper_bound() >= get_lower_bound())
19454 return get_upper_bound() - get_lower_bound() + 1;
19463{
return priv_->infinite_;}
19471{priv_->infinite_ = f;}
19478{
return priv_->language_;}
19486 std::ostringstream o;
19490 type_base_sptr underlying_type = get_underlying_type();
19491 if (underlying_type)
19493 o <<
"range "<< get_lower_bound() <<
" .. " << get_upper_bound();
19498 o <<
"[" << get_length() <<
"]";
19513 for (vector<subrange_sptr>::const_iterator i = v.begin();
19516 r += (*i)->as_string();
19545 bool result =
true;
19600 return *
this == *other;
19668 repr +=
"<anonymous range>";
19670 repr +=
"<range " +
get_name() +
">";
19671 repr += as_string();
19689 if (v.visit_begin(
this))
19692 if (type_base_sptr u = get_underlying_type())
19697 bool result = v.visit_end(
this);
19704struct array_type_def::priv
19711 priv(type_base_sptr t)
19716 : element_type_(t), subranges_(subs)
19736array_type_def::array_type_def(
const type_base_sptr e_type,
19737 const std::vector<subrange_sptr>& subs,
19741 | ABSTRACT_TYPE_BASE
19742 | ABSTRACT_DECL_BASE),
19745 priv_(new priv(e_type))
19769 const std::vector<subrange_sptr>& subs,
19773 | ABSTRACT_TYPE_BASE
19774 | ABSTRACT_DECL_BASE),
19802array_type_def::update_size()
19804 type_base_sptr e = priv_->element_type_.lock();
19807 size_t s = e->get_size_in_bits();
19811 s *= sub->get_length();
19819array_type_def::get_subrange_representation()
const
19845 bool qualified_name)
const
19847 return array_declaration_name(
this,
"",
19848 qualified_name, internal);
19873 std::vector<array_type_def::subrange_sptr > this_subs = l.
get_subranges();
19874 std::vector<array_type_def::subrange_sptr > other_subs = r.
get_subranges();
19876 bool result =
true;
19877 if (this_subs.size() != other_subs.size())
19886 std::vector<array_type_def::subrange_sptr >::const_iterator i,j;
19887 for (i = this_subs.begin(), j = other_subs.begin();
19888 i != this_subs.end() && j != other_subs.end();
19935 std::vector<array_type_def::subrange_sptr > this_subs = l->
get_subranges();
19936 std::vector<array_type_def::subrange_sptr > other_subs = r->
get_subranges();
19938 if (this_subs.size() != other_subs.size())
19941 std::vector<array_type_def::subrange_sptr >::const_iterator i,j;
19942 for (i = this_subs.begin(), j = other_subs.begin();
19943 i != this_subs.end() && j != other_subs.end();
19953 if (*first_element_type != *second_element_type)
20009 return *l_ptt == *r_ptt;
20031 const std::vector<subrange_sptr>& subranges =
20034 if (subranges.empty())
20035 return translation_unit::LANG_C11;
20036 return subranges.front()->get_language();
20055 return *
this == *other;
20061const type_base_sptr
20063{
return priv_->element_type_.lock();}
20079 priv_->element_type_ = element_type;
20090 for (
const auto &sub : subs)
20091 priv_->subranges_.push_back(sub);
20103 if (priv_->subranges_.empty())
20106 for (std::vector<shared_ptr<subrange_type> >::const_iterator i =
20107 priv_->subranges_.begin();
20108 i != priv_->subranges_.end();
20110 if ((*i)->is_non_finite())
20117array_type_def::get_dimension_count()
const
20118{
return priv_->subranges_.size();}
20149 if (priv_->internal_qualified_name_.empty())
20150 priv_->internal_qualified_name_ =
20151 array_declaration_name(
this,
"",
20154 return priv_->internal_qualified_name_;
20158 priv_->temp_internal_qualified_name_ =
20159 array_declaration_name(
this,
"",
20161 return priv_->temp_internal_qualified_name_;
20178 (array_declaration_name(
this,
"",
20202 if (v.visit_begin(
this))
20210 bool result = v.visit_end(
this);
20216array_type_def::get_location()
const
20220const std::vector<array_type_def::subrange_sptr>&
20222{
return priv_->subranges_;}
20224array_type_def::~array_type_def()
20231class enum_type_decl::priv
20233 type_base_sptr underlying_type_;
20242 priv(type_base_sptr underlying_type,
20244 : underlying_type_(underlying_type),
20262enum_type_decl::enum_type_decl(
const string& name,
20264 type_base_sptr underlying_type,
20266 const string& linkage_name,
20270 | ABSTRACT_TYPE_BASE
20271 | ABSTRACT_DECL_BASE),
20272 type_base(underlying_type->get_environment(),
20273 underlying_type->get_size_in_bits(),
20274 underlying_type->get_alignment_in_bits()),
20275 decl_base(underlying_type->get_environment(),
20276 name, locus, linkage_name, vis),
20277 priv_(new priv(underlying_type, enums))
20283 e->set_enum_type(
this);
20303{
return priv_->underlying_type_;}
20308{
return priv_->enumerators_;}
20313{
return priv_->enumerators_;}
20321 if (priv_->sorted_enumerators_.empty())
20326 priv_->sorted_enumerators_.push_back(*e);
20328 std::sort(priv_->sorted_enumerators_.begin(),
20329 priv_->sorted_enumerators_.end(),
20333 if (l.get_name() == r.get_name())
20334 return l.get_value() < r.get_value();
20335 return (l.get_name() < r.get_name());
20339 return priv_->sorted_enumerators_;
20357 if (e.get_value() == value)
20381 if (e.get_name() == name)
20409 bool qualified_name)
const
20411 string r =
"enum ";
20441 if (v.visit_begin(
this))
20449 bool result = v.visit_end(
this);
20471 bool result =
false;
20481 enum_type_decl::enumerators::const_iterator i, j;
20514 if (!(l.decl_base::operator==(r) && l.type_base::operator==(r)))
20519 if (!l.decl_base::operator==(r))
20521 if (!l.type_base::operator==(r))
20593is_enumerator_value_present_in_enum(
const enum_type_decl::enumerator &enr,
20594 const enum_type_decl &enom,
20595 vector<enum_type_decl::enumerator>& redundant_enrs)
20597 bool found =
false;
20598 for (
const auto &e : enom.get_enumerators())
20599 if (enumerators_values_are_equal(e, enr))
20603 redundant_enrs.push_back(e);
20621is_enumerator_value_redundant(
const enum_type_decl::enumerator &enr,
20622 const enum_type_decl &enom)
20624 vector<enum_type_decl::enumerator> redundant_enrs;
20625 if (is_enumerator_value_present_in_enum(enr, enom, redundant_enrs))
20627 if (!redundant_enrs.empty())
20655 bool result =
true;
20671 if (!!def1 != !!def2)
20701 if (!(def1->decl_base::operator==(*def2)
20702 && def1->type_base::operator==(*def2)))
20707 if (!def1->decl_base::operator==(*def2))
20709 if (!def1->type_base::operator==(*def2))
20787 && (!is_enumerator_value_redundant(e, *def2)
20788 || !is_enumerator_value_redundant(e, *def1)))
20802 && (!is_enumerator_value_redundant(e, *def1)
20803 || !is_enumerator_value_redundant(e, *def2)))
20845 return *
this == *other;
20860 if (l.get() == r.get())
20862 decl_base_sptr o = r;
20879class enum_type_decl::enumerator::priv
20883 string qualified_name_;
20894 priv(
const string& name,
20896 enum_type_decl* e = 0)
20908enum_type_decl::enumerator::~enumerator() =
default;
20919 : priv_(new priv(name, value))
20926 : priv_(new priv(other.
get_name(),
20928 other.get_enum_type()))
20953 bool names_equal =
true;
20955 return names_equal && (get_value() == other.
get_value());
20974{
return priv_->name_;}
20992 if (priv_->qualified_name_.empty())
20994 priv_->qualified_name_ =
20995 get_enum_type()->get_qualified_name(internal)
20999 return priv_->qualified_name_;
21015{
return priv_->value_;}
21029{
return priv_->enum_type_;}
21036{priv_->enum_type_ = e;}
21042struct typedef_decl::priv
21046 priv(
const type_base_sptr& t)
21047 : underlying_type_(t)
21062typedef_decl::typedef_decl(
const string& name,
21063 const type_base_sptr underlying_type,
21065 const string& linkage_name,
21069 | ABSTRACT_TYPE_BASE
21070 | ABSTRACT_DECL_BASE),
21075 name, locus, linkage_name, vis),
21076 priv_(new priv(underlying_type))
21092typedef_decl::typedef_decl(
const string& name,
21095 const string& mangled_name,
21099 | ABSTRACT_TYPE_BASE
21100 | ABSTRACT_DECL_BASE),
21103 decl_base(env, name, locus, mangled_name, vis),
21104 priv_(new priv(nullptr))
21179 bool result =
true;
21183 if (!(l.decl_base::operator==(r)))
21230 return *
this == *other;
21252 bool qualified_name)
const
21255 string result =
"typedef ";
21256 if (qualified_name)
21269{
return priv_->underlying_type_.lock();}
21277 priv_->underlying_type_ = t;
21291 bool internal)
const
21309 return decl_base::priv_->internal_qualified_name_;
21311 return decl_base::priv_->qualified_name_;
21330 if (v.visit_begin(
this))
21338 bool result = v.visit_end(
this);
21343typedef_decl::~typedef_decl()
21349struct var_decl::priv
21362 priv(type_base_sptr t,
21365 naked_type_(t.get()),
21376 naked_type_ = t.get();
21393var_decl::var_decl(
const string& name,
21394 type_base_sptr type,
21396 const string& linkage_name,
21400 VAR_DECL | ABSTRACT_DECL_BASE),
21401 decl_base(type->get_environment(), name, locus, linkage_name, vis),
21402 priv_(new priv(type, bind))
21410const type_base_sptr
21412{
return priv_->type_.lock();}
21419{priv_->set_type(t);}
21430{
return priv_->naked_type_;}
21437{
return priv_->binding_;}
21444{priv_->binding_ = b;}
21460 priv_->symbol_ = sym;
21475{
return priv_->symbol_;}
21544 bool result =
true;
21557 else if (s0 && !textually_equals(*s0, *s1, k))
21563 bool symbols_are_equal = (s0 && s1 && result);
21565 if (symbols_are_equal)
21574 bool decl_bases_different = !l.decl_base::operator==(r);
21575 const_cast<var_decl&
>(l).set_qualified_name(n1);
21576 const_cast<var_decl&
>(r).set_qualified_name(n2);
21578 if (decl_bases_different)
21588 if (!l.decl_base::operator==(r))
21637 bool result =
true;
21673 return equals(*
this, *other, 0);
21688 if (priv_->id_.empty())
21693 sym_str = s->get_id_string();
21698 priv_->id_ = env.
intern(repr);
21699 if (!sym_str.empty())
21700 priv_->id_ = env.
intern(priv_->id_ +
"{" + sym_str +
"}");
21767 result =
"static ";
21771 bool member_of_anonymous_class =
false;
21774 member_of_anonymous_class =
true;
21783 if (member_of_anonymous_class || !qualified_name)
21790 string quals_repr =
21792 if (!quals_repr.empty())
21793 name = quals_repr +
" " + name;
21797 name = string(
" ") + name;
21799 result += array_declaration_name(t, name, qualified_name, internal);
21801 result += pointer_declaration_name(t, name, qualified_name, internal);
21803 result += pointer_declaration_name(t, name, qualified_name, internal);
21805 result += ptr_to_mbr_declaration_name(t, name,
21820 "",
true, internal);
21826 "",
true, internal);
21829 && (member_of_anonymous_class || !qualified_name))
21845 && (member_of_anonymous_class || !qualified_name))
21899 if (v.visit_begin(
this))
21902 if (type_base_sptr t =
get_type())
21906 return v.visit_end(
this);
21909var_decl::~var_decl()
21924 priv_->cached_name_.clear();
21925 priv_->internal_cached_name_.clear();
21945function_type::function_type(type_base_sptr return_type,
21947 size_t size_in_bits,
21948 size_t alignment_in_bits)
21950 FUNCTION_TYPE | ABSTRACT_TYPE_BASE),
21951 type_base(return_type->get_environment(), size_in_bits, alignment_in_bits),
21952 priv_(new
priv(parms, return_type))
21956 for (parameters::size_type i = 0, j = 1;
21957 i < priv_->parms_.size();
21960 if (i == 0 && priv_->parms_[i]->get_is_artificial())
21967 priv_->parms_[i]->set_index(j);
21978function_type::function_type(type_base_sptr return_type,
21979 size_t size_in_bits,
size_t alignment_in_bits)
21981 FUNCTION_TYPE | ABSTRACT_TYPE_BASE),
21982 type_base(return_type->get_environment(), size_in_bits, alignment_in_bits),
21983 priv_(new
priv(return_type))
21998 size_t size_in_bits,
21999 size_t alignment_in_bits)
22001 type_base(env, size_in_bits, alignment_in_bits),
22027{
return priv_->return_type_.lock();}
22035{priv_->return_type_ = t;}
22044{
return priv_->parms_;}
22087 for (parameters::size_type i = 0, j = 1;
22088 i < priv_->parms_.size();
22091 if (i == 0 && priv_->parms_[i]->get_is_artificial())
22098 priv_->parms_[i]->set_index(j);
22109 parm->set_index(priv_->parms_.size());
22110 priv_->parms_.push_back(parm);
22124 return (!priv_->parms_.empty()
22125 && priv_->parms_.back()->get_variadic_marker());
22157#define RETURN(value) CACHE_AND_RETURN_COMPARISON_RESULT(value)
22166 bool cached_result =
false;
22174 bool result =
true;
22176 if (!l.type_base::operator==(r))
22187 l_class = m->get_class_type().get();
22190 r_class = m->get_class_type().get();
22194 if (!!l_class != !!r_class)
22204 != r_class->get_qualified_name()))
22221 bool compare_result_types =
true;
22222 string l_rt_name = l_return_type_decl
22225 string r_rt_name = r_return_type_decl
22231 (r_class && (r_class->get_qualified_name() == r_rt_name)))
22232 compare_result_types =
false;
22234 if (compare_result_types)
22258 if (l_rt_name != r_rt_name)
22267 vector<shared_ptr<function_decl::parameter> >::const_iterator i,j;
22308function_type::parameters::const_iterator
22314 bool is_method =
dynamic_cast<const method_type*
>(
this);
22318 if (is_method && (*i)->get_is_artificial())
22330function_type::parameters::const_iterator
22357 if (priv_->internal_cached_name_.empty())
22358 priv_->internal_cached_name_ =
22360 return priv_->internal_cached_name_;
22364 priv_->temp_internal_cached_name_ =
22366 return priv_->temp_internal_cached_name_;
22373 if (priv_->cached_name_.empty())
22374 priv_->cached_name_ =
22376 return priv_->cached_name_;
22380 priv_->cached_name_ =
22382 return priv_->cached_name_;
22443 if (v.visit_begin(
this))
22446 bool keep_going =
true;
22450 if (!t->traverse(v))
22451 keep_going =
false;
22458 if (type_base_sptr parm_type = (*i)->get_type())
22459 if (!parm_type->traverse(v))
22464 return v.visit_end(
this);
22467function_type::~function_type()
22473struct method_type::priv
22475 class_or_union_wptr class_type_;
22503method_type::method_type (type_base_sptr return_type,
22504 class_or_union_sptr class_type,
22505 const std::vector<function_decl::parameter_sptr>& p,
22507 size_t size_in_bits,
22508 size_t alignment_in_bits)
22510 METHOD_TYPE | ABSTRACT_TYPE_BASE | FUNCTION_TYPE),
22511 type_base(class_type->get_environment(), size_in_bits, alignment_in_bits),
22512 function_type(return_type, p, size_in_bits, alignment_in_bits),
22543method_type::method_type(type_base_sptr return_type,
22544 type_base_sptr class_type,
22545 const std::vector<function_decl::parameter_sptr>& p,
22547 size_t size_in_bits,
22548 size_t alignment_in_bits)
22550 METHOD_TYPE | ABSTRACT_TYPE_BASE | FUNCTION_TYPE),
22551 type_base(class_type->get_environment(), size_in_bits, alignment_in_bits),
22552 function_type(return_type, p, size_in_bits, alignment_in_bits),
22568 size_t size_in_bits,
22569 size_t alignment_in_bits)
22571 type_base(env, size_in_bits, alignment_in_bits),
22591method_type::method_type(class_or_union_sptr class_type,
22593 size_t size_in_bits,
22594 size_t alignment_in_bits)
22596 METHOD_TYPE | ABSTRACT_TYPE_BASE | FUNCTION_TYPE),
22597 type_base(class_type->get_environment(), size_in_bits, alignment_in_bits),
22600 alignment_in_bits),
22627{
return class_or_union_sptr(priv_->class_type_);}
22640 priv_->class_type_ = t;
22668{priv_->is_const = f;}
22675{
return priv_->is_const;}
22691 if (!first_parm->get_is_artificial())
22694 type_base_sptr this_ptr_type = first_parm->get_type();
22702 type_base_sptr candidate_class_type =
22722struct function_decl::priv
22724 bool declared_inline_;
22732 : declared_inline_(false),
22738 bool declared_inline,
22740 : declared_inline_(declared_inline),
22743 naked_type_(t.get())
22747 bool declared_inline,
22750 : declared_inline_(declared_inline),
22753 naked_type_(t.get()),
22775 bool declared_inline,
22777 const string& mangled_name,
22781 FUNCTION_DECL | ABSTRACT_DECL_BASE),
22812 type_base_sptr fn_type,
22813 bool declared_inline,
22815 const string& linkage_name,
22819 FUNCTION_DECL | ABSTRACT_DECL_BASE),
22820 decl_base(fn_type->get_environment(), name, locus, linkage_name, vis),
22821 priv_(new priv(dynamic_pointer_cast<
function_type>(fn_type),
22843 bool qualified_name)
const
22848 string fn_prefix = mem_fn ?
"method ":
"function ";
22854 fn_prefix +=
"virtual ";
22856 decl_base_sptr return_type;
22863 return_type = mem_fn
22874 internal) +
" " + result;
22877 result = add_outer_pointer_to_fn_type_expr(p, result,
22882 result = add_outer_pointer_to_array_type_expr(p, result,
22889 return fn_prefix + result;
22919 result += mem_fn->
get_type()->get_class_type()->get_qualified_name()
22925 std::ostringstream fn_parms;
22926 stream_pretty_representation_of_fn_parms(*
get_type(),
22930 result += fn_parms.str();
22935 result +=
" const";
22946function_decl::parameters::const_iterator
22952 bool is_method =
dynamic_cast<const method_decl*
>(
this);
22965const shared_ptr<function_type>
22967{
return priv_->type_.lock();}
22982{
return priv_->naked_type_;}
22987 priv_->type_ = fn_type;
22988 priv_->naked_type_ = fn_type.get();
23005 priv_->symbol_ = sym;
23020{
return priv_->symbol_;}
23027{
return priv_->declared_inline_;}
23034{priv_->declared_inline_ = value;}
23037function_decl::get_binding()
const
23038{
return priv_->binding_;}
23041const shared_ptr<type_base>
23043{
return get_type()->get_return_type();}
23046const std::vector<shared_ptr<function_decl::parameter> >&
23048{
return get_type()->get_parameters();}
23055{
get_type()->append_parameter(parm);}
23063 for (std::vector<shared_ptr<parameter> >::const_iterator i = parms.begin();
23136 bool result =
true;
23140 if (t0 == t1 || *t0 == *t1)
23166 else if (s0 && s0 != s1)
23177 bool symbols_are_equal = (s0 && s1 && result);
23179 if (symbols_are_equal)
23191 bool decl_bases_different = !l.decl_base::operator==(r);
23198 if (decl_bases_different)
23208 if (!l.decl_base::operator==(r))
23220 if (l.get_binding() != r.get_binding())
23277 return equals(*
this, *o, 0);
23304 if (priv_->id_.empty())
23309 string virtual_member_suffix;
23319 virtual_member_suffix +=
"/o";
23322 if (s->has_aliases())
23329 priv_->id_ = env.
intern(s->get_id_string());
23331 if (!virtual_member_suffix.empty())
23332 priv_->id_ = env.
intern(priv_->id_ + virtual_member_suffix);
23376 if (v.visit_begin(
this))
23379 if (type_base_sptr t =
get_type())
23383 return v.visit_end(
this);
23405 if (l.get() == r.get())
23428struct function_decl::parameter::priv
23432 bool variadic_marker_;
23439 priv(type_base_sptr type,
23441 bool variadic_marker)
23444 variadic_marker_(variadic_marker)
23448function_decl::parameter::parameter(
const type_base_sptr type,
23450 const string& name,
23451 const location& loc,
23453 : type_or_decl_base(type->get_environment(),
23454 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
23455 decl_base(type->get_environment(), name, loc),
23456 priv_(new priv(type, index, is_variadic))
23458 runtime_type_instance(
this);
23461function_decl::parameter::parameter(
const type_base_sptr type,
23463 const string& name,
23464 const location& loc,
23466 bool is_artificial)
23467 : type_or_decl_base(type->get_environment(),
23468 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
23469 decl_base(type->get_environment(), name, loc),
23470 priv_(new priv(type, index, is_variadic))
23472 runtime_type_instance(
this);
23473 set_is_artificial(is_artificial);
23476function_decl::parameter::parameter(
const type_base_sptr type,
23477 const string& name,
23478 const location& loc,
23480 bool is_artificial)
23481 : type_or_decl_base(type->get_environment(),
23482 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
23483 decl_base(type->get_environment(), name, loc),
23484 priv_(new priv(type, 0, is_variadic))
23486 runtime_type_instance(
this);
23487 set_is_artificial(is_artificial);
23490function_decl::parameter::parameter(
const type_base_sptr type,
23493 : type_or_decl_base(type->get_environment(),
23494 FUNCTION_PARAMETER_DECL | ABSTRACT_DECL_BASE),
23495 decl_base(type->get_environment(),
"", location()),
23496 priv_(new priv(type, index, variad))
23498 runtime_type_instance(
this);
23501function_decl::parameter::~parameter() =
default;
23503const type_base_sptr
23504function_decl::parameter::get_type()
const
23505{
return priv_->type_.lock();}
23532 if (get_variadic_marker()
23552 std::ostringstream o;
23553 o <<
"parameter-" << get_index();
23555 return env.
intern(o.str());
23559function_decl::parameter::get_index()
const
23560{
return priv_->index_;}
23563function_decl::parameter::set_index(
unsigned i)
23564{priv_->index_ = i;}
23568function_decl::parameter::get_variadic_marker()
const
23569{
return priv_->variadic_marker_;}
23595 bool result =
true;
23597 if ((l.get_variadic_marker() != r.get_variadic_marker())
23598 || (l.get_index() != r.get_index())
23599 || (!!l.get_type() != !!r.get_type()))
23604 if (l.get_index() != r.get_index())
23606 if (l.get_variadic_marker() != r.get_variadic_marker()
23607 || !!l.get_type() != !!r.get_type())
23614 type_base_sptr l_type = l.get_type();
23615 type_base_sptr r_type = r.get_type();
23617 if (l_type != r_type)
23635function_decl::parameter::operator==(
const parameter& o)
const
23636{
return equals(*
this, o, 0);}
23645 return function_decl::parameter::operator==(*p);
23691 if (v.visit_begin(
this))
23694 if (type_base_sptr t =
get_type())
23698 return v.visit_end(
this);
23731 bool qualified_name)
const
23738 type_repr =
"void";
23744 string result = type_repr;
23745 string parm_name = get_name_id();
23747 if (!parm_name.empty())
23748 result +=
" " + parm_name;
23782 size_t size_in_bits,
size_t align_in_bits,
23789 | ABSTRACT_DECL_BASE
23790 | ABSTRACT_SCOPE_TYPE_DECL
23791 | ABSTRACT_SCOPE_DECL),
23792 decl_base(env, name, locus, name, vis),
23793 type_base(env, size_in_bits, align_in_bits),
23797 for (member_types::iterator i = mem_types.begin();
23798 i != mem_types.end();
23809 for (member_functions::iterator i = member_fns.begin();
23810 i != member_fns.end();
23812 if (!
has_scope(static_pointer_cast<decl_base>(*i)))
23832 size_t size_in_bits,
size_t align_in_bits,
23836 | ABSTRACT_DECL_BASE
23837 | ABSTRACT_SCOPE_TYPE_DECL
23838 | ABSTRACT_SCOPE_DECL),
23839 decl_base(env, name, locus, name, vis),
23840 type_base(env, size_in_bits, align_in_bits),
23854 bool is_declaration_only)
23857 | ABSTRACT_DECL_BASE
23858 | ABSTRACT_SCOPE_TYPE_DECL
23859 | ABSTRACT_SCOPE_DECL),
23879 hash_t h = do_hash(
this);
23900 if (v.visit_begin(
this))
23909 if (!(*i)->traverse(v))
23919 if (!(*i)->traverse(v))
23929 if (!(*i)->traverse(v))
23936 for (member_function_templates::const_iterator i =
23940 if (!(*i)->traverse(v))
23947 for (member_class_templates::const_iterator i =
23951 if (!(*i)->traverse(v))
23959 bool result = v.visit_end(
this);
23988 type_base_sptr t =
is_type(decl);
24018 for (class_or_union::data_members::const_iterator it =
24107 if (t->get_is_anonymous())
24125 if (t->get_is_anonymous())
24143 if (t->get_is_anonymous())
24168 bool is_laid_out,
bool is_static,
24169 size_t offset_in_bits)
24173 priv_->data_members_.push_back(v);
24182 bool is_already_in =
false;
24185 for (
const auto& s_dm: priv_->static_data_members_)
24189 is_already_in =
true;
24193 if (!is_already_in)
24194 priv_->static_data_members_.push_back(v);
24200 for (data_members::const_iterator i =
24201 priv_->non_static_data_members_.begin();
24202 i != priv_->non_static_data_members_.end();
24206 is_already_in =
true;
24209 if (!is_already_in)
24210 priv_->non_static_data_members_.push_back(v);
24226{
return priv_->data_members_;}
24241 if ((*i)->get_name() == name)
24253 if (
var_decl_sptr data_member = type->find_data_member(name))
24254 return data_member;
24268 if (!v->get_name().empty())
24276 if ((*it)->get_pretty_representation(
false,
true)
24277 == v->get_pretty_representation(
false,
true))
24304 if (v->get_name().empty())
24317{
return priv_->non_static_data_members_;}
24325{
return priv_->static_data_members_;}
24343 bool is_static,
bool is_ctor,
24344 bool is_dtor,
bool is_const)
24356 priv_->member_functions_.push_back(f);
24360 if (!f->get_linkage_name().empty())
24361 priv_->mem_fns_map_[f->get_linkage_name()] = f;
24370{
return priv_->member_functions_;}
24391 string_mem_fn_sptr_map_type::const_iterator i =
24392 priv_->mem_fns_map_.find(linkage_name);
24393 if (i == priv_->mem_fns_map_.end())
24395 return i->second.get();
24406 string_mem_fn_sptr_map_type::const_iterator i =
24407 priv_->mem_fns_map_.find(linkage_name);
24408 if (i == priv_->mem_fns_map_.end())
24434 string_mem_fn_ptr_map_type::const_iterator i =
24435 priv_->signature_2_mem_fn_map_.find(s);
24436 if (i == priv_->signature_2_mem_fn_map_.end())
24444const member_function_templates&
24446{
return priv_->member_function_templates_;}
24451const member_class_templates&
24453{
return priv_->member_class_templates_;}
24464 priv_->member_function_templates_.push_back(m);
24479 priv_->member_class_templates_.push_back(m);
24489 && priv_->data_members_.empty()
24490 && priv_->member_functions_.empty()
24491 && priv_->member_function_templates_.empty()
24492 && priv_->member_class_templates_.empty());
24511 else if (method_decl_sptr f = dynamic_pointer_cast<method_decl>(d))
24517 else if (member_function_template_sptr f =
24518 dynamic_pointer_cast<member_function_template>(d))
24520 else if (member_class_template_sptr c =
24521 dynamic_pointer_cast<member_class_template>(d))
24570 return *
this == *o;
24611 if (l_is_decl_only || r_is_decl_only)
24621 if (!def1 || !def2)
24625 && l_is_decl_only && r_is_decl_only
24664 if (!!def1 != !!def2)
24672 if (!(l.decl_base::operator==(r)
24673 && l.type_base::operator==(r)))
24684 bool val = *def1 == *def2;
24693 if (!(l.decl_base::operator==(r) && l.type_base::operator==(r)))
24700 if (types_defined_same_linux_kernel_corpus_public(l, r))
24708#define RETURN(value) \
24709 return return_comparison_result(l, r, value);
24715 bool result =
true;
24729 for (class_or_union::data_members::const_iterator
24743 || (*d0)->get_type() == (*d1)->get_type())
24770 for (member_function_templates::const_iterator
24775 ++fn_tmpl_it0, ++fn_tmpl_it1)
24776 if (**fn_tmpl_it0 != **fn_tmpl_it1)
24801 for (member_class_templates::const_iterator
24806 ++cl_tmpl_it0, ++cl_tmpl_it1)
24807 if (**cl_tmpl_it0 != **cl_tmpl_it1)
24835 const method_decl_sptr& method)
24857 old_type->get_parameters(),
24858 old_type->get_is_const(),
24859 old_type->get_size_in_bits(),
24860 old_type->get_alignment_in_bits()));
24861 t->get_translation_unit()->bind_function_type_life_time(new_type);
24870 method->get_binding()));
24871 new_method->set_symbol(method->
get_symbol());
24874 class_type->add_member_function(new_method,
24883 t->add_member_function(new_method,
24900struct class_decl::priv
24903 unordered_map<string, base_spec_sptr> bases_map_;
24909 : is_struct_(false)
24950 size_t size_in_bits,
size_t align_in_bits,
24951 bool is_struct,
const location& locus,
24958 | ABSTRACT_TYPE_BASE
24959 | ABSTRACT_DECL_BASE
24960 | ABSTRACT_SCOPE_TYPE_DECL
24961 | ABSTRACT_SCOPE_DECL),
24962 decl_base(env, name, locus, name, vis),
24963 type_base(env, size_in_bits, align_in_bits),
24965 locus, vis, mbr_types, data_mbrs, mbr_fns),
24966 priv_(new priv(is_struct, bases))
25001 size_t size_in_bits,
size_t align_in_bits,
25002 bool is_struct,
const location& locus,
25008 | ABSTRACT_TYPE_BASE
25009 | ABSTRACT_DECL_BASE
25010 | ABSTRACT_SCOPE_TYPE_DECL
25011 | ABSTRACT_SCOPE_DECL),
25020 is_anonymous ? string() : name,
25022 type_base(env, size_in_bits, align_in_bits),
25024 locus, vis, mbr_types, data_mbrs, mbr_fns),
25025 priv_(new priv(is_struct, bases))
25047 size_t size_in_bits,
size_t align_in_bits,
25048 bool is_struct,
const location& locus,
25052 | ABSTRACT_TYPE_BASE
25053 | ABSTRACT_DECL_BASE
25054 | ABSTRACT_SCOPE_TYPE_DECL
25055 | ABSTRACT_SCOPE_DECL),
25056 decl_base(env, name, locus, name, vis),
25057 type_base(env, size_in_bits, align_in_bits),
25060 priv_(new priv(is_struct))
25084 size_t size_in_bits,
size_t align_in_bits,
25085 bool is_struct,
const location& locus,
25089 | ABSTRACT_TYPE_BASE
25090 | ABSTRACT_DECL_BASE
25091 | ABSTRACT_SCOPE_TYPE_DECL
25092 | ABSTRACT_SCOPE_DECL),
25101 is_anonymous ? string() : name,
25103 type_base(env, size_in_bits, align_in_bits),
25106 priv_(new priv(is_struct))
25122 bool is_struct,
bool is_declaration_only)
25125 | ABSTRACT_TYPE_BASE
25126 | ABSTRACT_DECL_BASE
25127 | ABSTRACT_SCOPE_TYPE_DECL
25128 | ABSTRACT_SCOPE_DECL),
25132 priv_(new priv(is_struct))
25147 for (class_decl::virtual_mem_fn_map_type::iterator i =
25148 priv_->virtual_mem_fns_map_.begin();
25149 i != priv_->virtual_mem_fns_map_.end();
25151 sort_virtual_member_functions(i->second);
25159{priv_->is_struct_ = f;}
25166{
return priv_->is_struct_;}
25174 priv_->bases_.push_back(b);
25175 priv_->bases_map_[b->get_base_class()->get_qualified_name()] = b;
25183{
return priv_->bases_;}
25194 unordered_map<string, base_spec_sptr>::iterator i =
25195 priv_->bases_map_.find(qualified_name);
25197 if (i != priv_->bases_map_.end())
25198 return i->second->get_base_class();
25209{
return priv_->virtual_mem_fns_;}
25228{
return priv_->virtual_mem_fns_map_;}
25233{sort_virtual_member_functions(priv_->virtual_mem_fns_);}
25254 bool qualified_name)
const
25256 string cl =
"class ";
25265 if (internal && !
get_name().empty())
25273 string result = cl;
25274 if (qualified_name)
25283class_decl::insert_member_decl(decl_base_sptr d)
25285 if (method_decl_sptr f = dynamic_pointer_cast<method_decl>(d))
25300struct class_decl::base_spec::priv
25303 long offset_in_bits_;
25307 long offset_in_bits,
25310 offset_in_bits_(offset_in_bits),
25311 is_virtual_(is_virtual)
25329 long offset_in_bits,
25332 ABSTRACT_DECL_BASE),
25334 base->get_linkage_name(), base->get_visibility()),
25336 priv_(new priv(base, offset_in_bits, is_virtual))
25362{
return priv_->base_class_.lock();}
25369{
return priv_->is_virtual_;}
25376{
return priv_->offset_in_bits_;}
25396 if (v.visit_begin(
this))
25399 get_base_class()->traverse(v);
25403 return v.visit_end(
this);
25423class_decl::base_spec::base_spec(
const type_base_sptr& base,
25425 long offset_in_bits,
25428 ABSTRACT_DECL_BASE),
25434 priv_(new priv(dynamic_pointer_cast<
class_decl>(base),
25441class_decl::base_spec::~base_spec() =
default;
25467 if (!l.member_base::operator==(r))
25493 return equals(*
this, *o, 0);
25514mem_fn_context_rel::~mem_fn_context_rel()
25534method_decl::method_decl(
const string& name,
25536 bool declared_inline,
25538 const string& linkage_name,
25543 | ABSTRACT_DECL_BASE
25547 declared_inline, locus, linkage_name, vis, bind)
25571method_decl::method_decl(
const string& name,
25573 bool declared_inline,
25575 const string& linkage_name,
25580 | ABSTRACT_DECL_BASE
25582 decl_base(type->get_environment(), name, locus, linkage_name, vis),
25585 declared_inline, locus, linkage_name, vis, bind)
25608method_decl::method_decl(
const string& name,
25609 type_base_sptr type,
25610 bool declared_inline,
25612 const string& linkage_name,
25617 | ABSTRACT_DECL_BASE
25619 decl_base(type->get_environment(), name, locus, linkage_name, vis),
25622 declared_inline, locus, linkage_name, vis, bind)
25641 class_or_union_sptr cl = t->get_class_type();
25643 cl->priv_->mem_fns_map_[l] = m;
25644 if (!old_lname.empty() && l != old_lname)
25646 if (method_decl_sptr m = cl->find_member_function_sptr(old_lname))
25649 cl->priv_->mem_fns_map_.erase(old_lname);
25655method_decl::~method_decl()
25692 if (l.get() == r.get())
25745{
return dynamic_pointer_cast<method_decl>(d);}
25749struct virtual_member_function_less_than
25773 if (f_offset != s_offset)
return f_offset < s_offset;
25779 if (fn != sn)
return fn < sn;
25785 if ((!f_sym) != (!s_sym))
return !f_sym;
25786 if (f_sym && s_sym)
25788 fn = f_sym->get_id_string();
25789 sn = s_sym->get_id_string();
25790 if (fn != sn)
return fn < sn;
25797 if (fn != sn)
return fn < sn;
25801 string fn_filepath, sn_filepath;
25802 unsigned line = 0, column = 0;
25805 fn_loc.
expand(fn_filepath, line, column);
25807 sn_loc.expand(sn_filepath, line, column);
25808 return fn_filepath < sn_filepath;
25823 operator()(
const method_decl_sptr f,
25824 const method_decl_sptr s)
25825 {
return operator()(*f, *s);}
25834 virtual_member_function_less_than lt;
25835 std::stable_sort(mem_fns.begin(), mem_fns.end(), lt);
25864 size_t vtable_offset,
25865 bool is_static,
bool is_ctor,
25866 bool is_dtor,
bool is_const)
25869 is_dtor, is_const);
25876 sort_virtual_member_functions(klass->priv_->virtual_mem_fns_);
25895 class_decl::member_functions::const_iterator m;
25896 for (m = klass->priv_->virtual_mem_fns_.begin();
25897 m != klass->priv_->virtual_mem_fns_.end();
25899 if (m->get() == method.get()
25900 || (*m)->get_linkage_name() == method->get_linkage_name())
25902 if (m == klass->priv_->virtual_mem_fns_.end())
25903 klass->priv_->virtual_mem_fns_.push_back(method);
25911 class_decl::virtual_mem_fn_map_type::iterator i =
25912 klass->priv_->virtual_mem_fns_map_.find(voffset);
25913 if (i == klass->priv_->virtual_mem_fns_map_.end())
25916 virtual_mem_fns_at_voffset.push_back(method);
25917 klass->priv_->virtual_mem_fns_map_[voffset] = virtual_mem_fns_at_voffset;
25921 for (m = i->second.begin() ; m != i->second.end(); ++m)
25922 if (m->get() == method.get()
25923 || (*m)->get_linkage_name() == method->get_linkage_name())
25925 if (m == i->second.end())
25926 i->second.push_back(method);
25955 if ((*b)->get_is_virtual()
25956 || (*b)->get_base_class()->has_virtual_bases())
25985 ssize_t offset = -1;
25986 for (class_decl::virtual_mem_fn_map_type::const_iterator e =
25990 if (e->first > offset)
26020methods_equal_modulo_elf_symbol(
const method_decl_sptr& f,
26021 const method_decl_sptr& s)
26023 method_decl_sptr first = f, second = s;
26025 first->get_symbol();
26027 second->get_symbol();
26029 first->get_linkage_name();
26031 second->get_linkage_name();
26034 first->set_linkage_name(
"");
26036 second->set_linkage_name(
"");
26038 bool equal = *first == *second;
26040 first->set_symbol(saved_first_elf_symbol);
26041 first->set_linkage_name(saved_first_linkage_name);
26042 second->set_symbol(saved_second_elf_symbol);
26043 second->set_linkage_name(saved_second_linkage_name);
26064method_matches_at_least_one_in_vector(
const method_decl_sptr& method,
26067 for (class_decl::member_functions::const_iterator i = fns.begin();
26076 if (methods_equal_modulo_elf_symbol(method, *i))
26109 bool result =
false;
26110 if (l.
get_environment().priv_->is_type_comparison_cached(l, r, result))
26121 bool result =
true;
26135#define RETURN(value) CACHE_AND_RETURN_COMPARISON_RESULT(value)
26147 for (class_decl::base_specs::const_iterator
26159 (*b1)->get_base_class().get()))
26205 for (class_decl::virtual_mem_fn_map_type::const_iterator first_v_fn_entry =
26208 ++first_v_fn_entry)
26210 unsigned voffset = first_v_fn_entry->first;
26212 first_v_fn_entry->second;
26214 const class_decl::virtual_mem_fn_map_type::const_iterator
26226 second_v_fn_entry->second;
26228 bool matches =
false;
26229 for (class_decl::member_functions::const_iterator i =
26230 first_vfns.begin();
26231 i != first_vfns.end();
26233 if (method_matches_at_least_one_in_vector(*i, second_vfns))
26327 return *
this == *o;
26371 if (l.get() == r.get())
26403operator==(
const class_or_union_sptr& l,
const class_or_union_sptr& r)
26405 if (l.get() == r.get())
26422operator!=(
const class_or_union_sptr& l,
const class_or_union_sptr& r)
26442 if (v.visit_begin(
this))
26451 if (!(*i)->traverse(v))
26462 if (!(*i)->traverse(v))
26472 if (!(*i)->traverse(v))
26482 if (!(*i)->traverse(v))
26489 for (member_function_templates::const_iterator i =
26493 if (!(*i)->traverse(v))
26500 for (member_class_templates::const_iterator i =
26504 if (!(*i)->traverse(v))
26512 bool result = v.visit_end(
this);
26521context_rel::~context_rel()
26525member_base::operator==(
const member_base& o)
const
26545 if (l.get() == r.get())
26550 return *l ==
static_cast<const decl_base&
>(*r);
26589{
return dynamic_pointer_cast<class_decl::base_spec>(tod);}
26592member_function_template::operator==(
const member_base& other)
const
26599 if (!(is_constructor() == o.is_constructor()
26600 && is_const() == o.is_const()
26601 && member_base::operator==(o)))
26608 return ftdecl->function_tdecl::operator==(*other_ftdecl);
26627 const member_function_template_sptr& r)
26629 if (l.get() == r.get())
26648 const member_function_template_sptr& r)
26665 if (v.visit_begin(
this))
26672 return v.visit_end(
this);
26688 if (!member_base::operator==(o))
26691 return as_class_tdecl()->class_tdecl::operator==(o);
26705 if (!decl_base::operator==(other))
26707 return as_class_tdecl()->class_tdecl::operator==(other);
26721 return *
this == *o;
26734 const member_class_template_sptr& r)
26736 if (l.get() == r.get())
26754 const member_class_template_sptr& r)
26771 if (v.visit_begin(
this))
26778 return v.visit_end(
this);
26798 case private_access:
26801 case protected_access:
26804 case public_access:
26828 c->set_is_static(s);
26838 for (
const auto& dm : cl->get_data_members())
26839 if (dm->get_name() == v->get_name())
26850 for (class_decl::data_members::iterator i =
26851 cl->priv_->non_static_data_members_.begin();
26852 i != cl->priv_->non_static_data_members_.end();
26855 if ((*i)->get_name() == v->get_name())
26857 cl->priv_->non_static_data_members_.erase(i);
26864 bool already_in_static_dms =
false;
26865 for (
const auto& s_dm : cl->priv_->static_data_members_)
26866 if (s_dm->get_name() == v->get_name())
26868 already_in_static_dms =
true;
26871 if (!already_in_static_dms)
26872 cl->priv_->static_data_members_.push_back(var);
26877 for (class_or_union::data_members::iterator i =
26878 cl->priv_->static_data_members_.begin();
26879 i != cl->priv_->static_data_members_.end();
26881 if ((*i)->get_name() == v->get_name())
26883 cl->priv_->static_data_members_.erase(i);
26889 bool is_already_in_non_static_data_members =
false;
26890 for (
const auto& ns_dm : cl->priv_->non_static_data_members_)
26891 if (ns_dm->get_name() == v->get_name())
26893 is_already_in_non_static_data_members =
true;
26896 if (!is_already_in_non_static_data_members)
26897 cl->priv_->non_static_data_members_.push_back(var);
26937 size_t size_in_bits,
const location& locus,
26942 | ABSTRACT_TYPE_BASE
26943 | ABSTRACT_DECL_BASE),
26944 decl_base(env, name, locus, name, vis),
26947 locus, vis, mbr_types, data_mbrs, member_fns)
26973 size_t size_in_bits,
const location& locus,
26979 | ABSTRACT_TYPE_BASE
26980 | ABSTRACT_DECL_BASE),
26989 is_anonymous ? string() : name,
26993 locus, vis, mbr_types, data_mbrs, member_fns)
27011 size_t size_in_bits,
const location& locus,
27015 | ABSTRACT_TYPE_BASE
27016 | ABSTRACT_DECL_BASE
27017 | ABSTRACT_SCOPE_TYPE_DECL
27018 | ABSTRACT_SCOPE_DECL),
27019 decl_base(env, name, locus, name, vis),
27042 size_t size_in_bits,
const location& locus,
27046 | ABSTRACT_TYPE_BASE
27047 | ABSTRACT_DECL_BASE
27048 | ABSTRACT_SCOPE_TYPE_DECL
27049 | ABSTRACT_SCOPE_DECL),
27058 is_anonymous ? string() : name,
27077 const string& name,
27078 bool is_declaration_only)
27081 | ABSTRACT_TYPE_BASE
27082 | ABSTRACT_DECL_BASE
27083 | ABSTRACT_SCOPE_TYPE_DECL
27084 | ABSTRACT_SCOPE_DECL),
27125 bool qualified_name)
const
27130 if (internal && !
get_name().empty())
27131 repr = string(
"union ") +
27141 if (qualified_name)
27178 return *
this == *o;
27192 return *
this == *o;
27225 if (v.visit_begin(
this))
27234 if (!(*i)->traverse(v))
27244 if (!(*i)->traverse(v))
27254 if (!(*i)->traverse(v))
27261 for (member_function_templates::const_iterator i =
27265 if (!(*i)->traverse(v))
27272 for (member_class_templates::const_iterator i =
27276 if (!(*i)->traverse(v))
27284 bool result = v.visit_end(
this);
27323 bool result =
false;
27324 if (l.
get_environment().priv_->is_type_comparison_cached(l, r, result))
27345 const method_decl_sptr& f)
27360 const class_or_union_sptr t = union_type;
27375 if (l.get() == r.get())
27399class template_decl::priv
27403 std::list<template_parameter_sptr> parms_;
27416{priv_->parms_.push_back(p);}
27422const std::list<template_parameter_sptr>&
27424{
return priv_->parms_;}
27437 const string& name,
27462 return *
this == *other;
27475 list<shared_ptr<template_parameter> >::const_iterator t0, t1;
27501class template_parameter::priv
27507 mutable bool hashing_started_;
27508 mutable bool comparison_started_;
27516 template_decl_(enclosing_template_decl),
27517 hashing_started_(),
27518 comparison_started_()
27522template_parameter::template_parameter(
unsigned index,
27524 : priv_(new priv(index, enclosing_template))
27528template_parameter::get_index()
const
27529{
return priv_->index_;}
27532template_parameter::get_enclosing_template_decl()
const
27533{
return priv_->template_decl_.lock();}
27539 if (get_index() != o.get_index())
27542 if (priv_->comparison_started_)
27545 bool result =
false;
27550 priv_->comparison_started_ =
true;
27552 if (!!get_enclosing_template_decl() != !!o.get_enclosing_template_decl())
27554 else if (get_enclosing_template_decl()
27555 && (*get_enclosing_template_decl()
27556 != *o.get_enclosing_template_decl()))
27561 priv_->comparison_started_ =
false;
27581class type_tparameter::priv
27596type_tparameter::type_tparameter(
unsigned index,
27598 const string& name,
27602 | ABSTRACT_TYPE_BASE
27604 decl_base(enclosing_tdecl->get_environment(), name, locus),
27605 type_base(enclosing_tdecl->get_environment(), 0, 0),
27606 type_decl(enclosing_tdecl->get_environment(), name, 0, 0, locus),
27621 if (!type_decl::operator==(other))
27641 if (!type_decl::operator==(other))
27661 if (!decl_base::operator==(other))
27697{
return *
this ==
static_cast<const type_base&
>(other);}
27699type_tparameter::~type_tparameter()
27703class non_type_tparameter::priv
27713 priv(type_base_sptr type)
27731non_type_tparameter::non_type_tparameter(
unsigned index,
27733 const string& name,
27734 type_base_sptr type,
27737 decl_base(type->get_environment(), name, locus,
""),
27739 priv_(new priv(type))
27747const type_base_sptr
27749{
return priv_->type_.lock();}
27755 if (!decl_base::operator==(other))
27762 return (template_parameter::operator==(o)
27781non_type_tparameter::~non_type_tparameter()
27787class template_tparameter::priv
27801template_tparameter::template_tparameter(
unsigned index,
27803 const string& name,
27807 | ABSTRACT_TYPE_BASE
27809 decl_base(enclosing_tdecl->get_environment(), name, locus),
27810 type_base(enclosing_tdecl->get_environment(), 0, 0),
27811 type_decl(enclosing_tdecl->get_environment(), name,
27812 0, 0, locus, name, VISIBILITY_DEFAULT),
27814 template_decl(enclosing_tdecl->get_environment(), name, locus),
27832 return (type_tparameter::operator==(o)
27851 return (type_tparameter::operator==(o)
27865 return *
this ==
static_cast<const type_base&
>(other);
27884template_tparameter::~template_tparameter()
27892class type_composition::priv
27916type_composition::type_composition(
unsigned index,
27920 ABSTRACT_DECL_BASE),
27931const type_base_sptr
27933{
return priv_->type_.lock();}
27942type_composition::~type_composition()
27951class function_tdecl::priv
27963 : pattern_(pattern), binding_(bind)
27990 | ABSTRACT_SCOPE_DECL),
27994 priv_(new priv(bind))
28018 | ABSTRACT_SCOPE_DECL),
28023 priv_(new priv(pattern, bind))
28034 priv_->pattern_ = p;
28044{
return priv_->pattern_;}
28051{
return priv_->binding_;}
28063 return *
this == *o;
28077 return *
this == *o;
28090 && template_decl::operator==(o)
28091 && scope_decl::operator==(o)
28115 if (!v.visit_begin(
this))
28122 return v.visit_end(
this);
28125function_tdecl::~function_tdecl()
28133class class_tdecl::priv
28144 : pattern_(pattern)
28163 | ABSTRACT_SCOPE_DECL),
28188 | ABSTRACT_SCOPE_DECL),
28193 priv_(new priv(pattern))
28204 priv_->pattern_ = p;
28214{
return priv_->pattern_;}
28223 if (!(template_decl::operator==(o)
28224 && scope_decl::operator==(o)
28243 return *
this ==
static_cast<const decl_base&
>(o);
28251{
return *
this ==
static_cast<const decl_base&
>(o);}
28267 if (v.visit_begin(
this))
28271 pattern->traverse(v);
28274 return v.visit_end(
this);
28277class_tdecl::~class_tdecl()
28288 non_canonicalized_subtype_detector();
28291 non_canonicalized_subtype_detector(
type_base* type)
28293 has_non_canonical_type_()
28302 has_non_canonical_type()
const
28303 {
return has_non_canonical_type_;}
28308 visit_begin(function_decl* f)
28326 visit_begin(type_base* t)
28330 if (!t->get_canonical_type())
28334 has_non_canonical_type_ = t;
28349 visit_end(type_base* )
28351 if (has_non_canonical_type_)
28368 non_canonicalized_subtype_detector v(t.get());
28370 return v.has_non_canonical_type();
28386 const type_base_sptr t_v2)
28393 return (t1 != t2 && repr1 == repr2);
28404 env.priv_->extra_live_types_.push_back(t);
28439 result =
reinterpret_cast<size_t>(g);
28441 result =
reinterpret_cast<size_t>(s);
28447 string repr = v->get_pretty_representation(
true);
28448 std::hash<string> hash_string;
28456 string repr = f->get_pretty_representation(
true);
28457 std::hash<string> hash_string;
28463 type_base_sptr parm_type = p->get_type();
28465 std::hash<bool> hash_bool;
28466 std::hash<unsigned> hash_unsigned;
28475 std::hash<size_t> hash_size;
28476 std::hash<bool> hash_bool;
28477 type_base_sptr type = bs->get_base_class();
28514{
return hash_as_canonical_type_or_constant(t);}
28541 if (d->type_or_decl_base::priv_->get_hashing_state()
28543 return d->type_or_decl_base::priv_->hash_value_;
28546 return artefact.priv_->hash_value_;
28648 exemplar =
const_cast<type_base*
>(type);
28677hash_as_canonical_type_or_constant(
const type_base *t)
28684 if (!canonical_type)
28702 if (canonical_type)
28703 return reinterpret_cast<size_t>(canonical_type);
28778 const type_base_sptr& second,
28779 bool indirect_type)
28811 bool indirect_type)
28813 if (!!first != !!second)
28825 if (
typeid(*first) !=
typeid(*second))
28841 if (ty1->is_lvalue() != ty2->is_lvalue())
28844 ty2->get_pointed_to_type(),
28863 if (!indirect_type)
28867 return ty1->get_name() == ty2->
get_name();
28873 if (!indirect_type)
28877 return (
get_name(ty1->get_underlying_type())
28885 && ty1->get_name() != ty2->
get_name())
28888 if (!indirect_type)
28891 || (ty1->get_non_static_data_members().size()
28895 for (class_or_union::data_members::const_iterator
28896 i = ty1->get_non_static_data_members().begin(),
28898 (i != ty1->get_non_static_data_members().end()
28905 dm2->get_type().get(),
28918 && ty1->get_name() != ty2->
get_name())
28921 if (!indirect_type)
28930 if (!indirect_type)
28933 || ty1->get_dimension_count() != ty2->get_dimension_count())
28953 for (
auto r1 = ty1->get_subranges().begin(),
28954 r2 = ty1->get_subranges().begin();
28955 (r1 != ty1->get_subranges().end()
28958 if ((*r1)->get_length() != (*r2)->get_length())
28993 if (ty1->get_parameters().size() != ty2->
get_parameters().size())
28996 for (function_type::parameters::const_iterator
28997 i = ty1->get_parameters().begin(),
28999 (i != ty1->get_parameters().end()
29029 const char* dm_name)
29057 return cou->find_data_member(dm);
29072 unsigned parm_index)
29079 if (parms.size() <= parm_index)
29082 return parms[parm_index].get();
29097 std::ostringstream o;
29100 o <<
"unnamed-enum";
29104 o <<
"-underlying-type-" << size;
29124 return data_member;
29144 for (; d != e; ++d)
29165stream_pretty_representation_of_fn_parms(
const function_type& fn_type,
29166 ostream& o,
bool qualified,
29174 type_base_sptr type;
29181 if (i != first_parm)
29184 type = parm->get_type();
29247add_outer_pointer_to_fn_type_expr(
const type_base* p,
29248 const string& input,
29249 bool qualified,
bool internal)
29255 string star_or_ref;
29268 if (!pointed_to_fn)
29271 if (pointed_to_fn->priv_->is_pretty_printing())
29281 pointed_to_fn->priv_->set_is_pretty_printing();
29283 std::ostringstream left, right, inner;
29285 inner <<
"(" << star_or_ref << input <<
")";
29287 type_base_sptr type;
29288 stream_pretty_representation_of_fn_parms(*pointed_to_fn, right,
29289 qualified, internal);
29291 type_base_sptr return_type = pointed_to_fn->get_return_type();
29300 result = left.str() +
" " + inner.str() + right.str();
29304 string inner_string = inner.str() + right.str();
29305 result = add_outer_pointer_to_fn_type_expr(p, inner_string,
29306 qualified, internal);
29310 string inner_string = inner.str() + right.str();
29311 result = add_outer_pointer_to_array_type_expr(p, inner_string,
29312 qualified, internal);
29320 pointed_to_fn->priv_->unset_is_pretty_printing();
29371add_outer_pointer_to_fn_type_expr(
const type_base_sptr& p,
29372 const string& input,
29373 bool qualified,
bool internal)
29374{
return add_outer_pointer_to_fn_type_expr(p.get(), input, qualified, internal);}
29427add_outer_pointer_to_array_type_expr(
const type_base* p,
29428 const string& input,
bool qualified,
29434 string star_or_ref;
29435 type_base_sptr pointed_to_type;
29439 pointed_to_type = ptr->get_pointed_to_type();
29444 pointed_to_type = ref->get_pointed_to_type();
29452 std::ostringstream left, right, inner;
29453 inner <<
"(" << star_or_ref << input <<
")";
29454 right << array->get_subrange_representation();
29457 type_base_sptr array_element_type = array->get_element_type();
29463 left <<
get_type_name(array_element_type, qualified, internal);
29464 result = left.str() + inner.str() + right.str();
29469 string r = inner.str() + right.str();
29470 result = add_outer_pointer_to_fn_type_expr(p, r, qualified, internal);
29475 string inner_string = inner.str() + right.str();
29476 result = add_outer_pointer_to_array_type_expr(p, inner_string,
29477 qualified, internal);
29536add_outer_pointer_to_array_type_expr(
const type_base_sptr& pointer_to_ar,
29537 const string& input,
bool qualified,
29539{
return add_outer_pointer_to_array_type_expr(pointer_to_ar.get(),
29540 input, qualified, internal);}
29588add_outer_ptr_to_mbr_type_expr(
const ptr_to_mbr_type* p,
29589 const string& input,
bool qualified,
29595 std::ostringstream left, right, inner;
29596 type_base_sptr void_type = p->get_environment().get_void_type();
29597 string containing_type_name =
get_type_name(p->get_containing_type(),
29598 qualified, internal);
29599 type_base_sptr mbr_type = p->get_member_type();
29603 inner <<
"(" << containing_type_name <<
"::*" << input <<
")";
29604 stream_pretty_representation_of_fn_parms(*fn_type, right,
29605 qualified, internal);
29608 return_type = void_type;
29615 left <<
get_type_name(return_type, qualified, internal) <<
" ";;
29616 result = left.str() + inner.str() + right.str();
29620 string inner_str = inner.str() + right.str();
29621 result = pointer_declaration_name(p, inner_str, qualified, internal);
29625 string inner_str = inner.str() + right.str();
29626 result = add_outer_ptr_to_mbr_type_expr(p, inner_str,
29627 qualified, internal);
29634 inner <<
"(" << containing_type_name <<
"::*" << input <<
")";
29635 stream_pretty_representation_of_fn_parms(*fn_type, right,
29636 qualified, internal);
29637 string inner_str = inner.str() + right.str();
29638 result = add_outer_ptr_to_mbr_type_expr(ptr_mbr_type, inner_str,
29639 qualified, internal);
29643 left <<
get_type_name(p->get_member_type(), qualified, internal) <<
" ";
29644 inner << containing_type_name <<
"::*" << input;
29645 result = left.str()+ inner.str();
29665 string d1_name, d2_name;
29682 return d1_name != d2_name;
29705 const type_base_sptr& s)
29717 && (f->get_size_in_bits() == s->get_size_in_bits())
29718 && (f->get_alignment_in_bits() == s->get_alignment_in_bits()))
29732 const decl_base_sptr& s)
29783 const string& input,
bool qualified,
29785{
return add_outer_ptr_to_mbr_type_expr(p.get(), input, qualified, internal);}
29805add_outer_pointer_to_ptr_to_mbr_type_expr(
const type_base* p,
29806 const string& input,
bool qualified,
29812 string star_or_ref;
29813 type_base_sptr pointed_to_type;
29817 pointed_to_type = ptr->get_pointed_to_type();
29822 pointed_to_type= ref->get_pointed_to_type();
29826 if (!pointed_to_type)
29831 if (!pointed_to_ptr_to_mbr)
29834 std::ostringstream inner;
29835 inner << star_or_ref << input;
29836 string result = add_outer_ptr_to_mbr_type_expr(pointed_to_ptr_to_mbr,
29838 qualified, internal);
29855static interned_string
29856pointer_declaration_name(
const type_base* ptr,
29857 const string& idname,
29858 bool qualified,
bool internal)
29861 return interned_string();
29863 type_base_sptr pointed_to_type;
29864 string star_or_ref;
29867 pointed_to_type = p->get_pointed_to_type();
29872 pointed_to_type = p->get_pointed_to_type();
29876 if (!pointed_to_type)
29877 return interned_string();
29890 if (!idname.empty())
29897 result = add_outer_pointer_to_fn_type_expr(ptr, idname,
29898 qualified, internal);
29900 result = add_outer_pointer_to_array_type_expr(ptr, idname,
29901 qualified, internal);
29903 result = add_outer_pointer_to_ptr_to_mbr_type_expr(ptr, idname,
29904 qualified, internal);
29908 return ptr->get_environment().intern(result);
29925static interned_string
29926pointer_declaration_name(
const type_base_sptr& ptr,
29927 const string& variable_name,
29928 bool qualified,
bool internal)
29929{
return pointer_declaration_name(ptr.get(), variable_name,
29930 qualified, internal);}
29945static interned_string
29946array_declaration_name(
const array_type_def* array,
29947 const string& variable_name,
29948 bool qualified,
bool internal)
29951 return interned_string();
29953 type_base_sptr e_type = array->get_element_type();
29954 string e_type_repr =
29962 std::ostringstream o;
29963 if (!variable_name.empty())
29964 o << variable_name <<
" is ";
29966 << array->get_subrange_representation()
29967 <<
") of " << e_type_repr;
29978 result = e_type_repr;
29979 if (!variable_name.empty())
29980 result += variable_name;
29981 result += array->get_subrange_representation();
29985 string s = variable_name + array->get_subrange_representation();
29986 result = pointer_declaration_name(p, s, qualified, internal);
29990 string s = variable_name + array->get_subrange_representation();
29991 result = ptr_to_mbr_declaration_name(p, s, qualified, internal);
29996 return array->get_environment().intern(result);
30012static interned_string
30014 const string& variable_name,
30015 bool qualified,
bool internal)
30016{
return array_declaration_name(array.get(), variable_name,
30017 qualified, internal);}
30032static interned_string
30033ptr_to_mbr_declaration_name(
const ptr_to_mbr_type* ptr,
30034 const string& variable_name,
30035 bool qualified,
bool internal)
30038 return interned_string();
30040 string input = variable_name;
30041 string result = add_outer_ptr_to_mbr_type_expr(ptr, input,
30042 qualified, internal);
30043 return ptr->get_environment().intern(result);
30059static interned_string
30061 const string& variable_name,
30062 bool qualified,
bool internal)
30064 return ptr_to_mbr_declaration_name(ptr.get(), variable_name,
30065 qualified, internal);
30084struct ir_node_visitor::priv
30099ir_node_visitor::~ir_node_visitor() =
default;
30108{priv_->allow_visiting_already_visited_type_node = f;}
30117{
return priv_->allow_visiting_already_visited_type_node;}
30138 canonical_type = p;
30142 size_t canonical_ptr_value =
reinterpret_cast<size_t>(canonical_type);
30143 priv_->visited_ir_nodes.insert(canonical_ptr_value);
30156{priv_->visited_ir_nodes.clear();}
30177 canonical_type = p;
30181 size_t ptr_value =
reinterpret_cast<size_t>(canonical_type);
30182 pointer_set::iterator it = priv_->visited_ir_nodes.find(ptr_value);
30183 if (it == priv_->visited_ir_nodes.end())
30190ir_node_visitor::visit_begin(
decl_base*)
30198ir_node_visitor::visit_begin(scope_decl*)
30202ir_node_visitor::visit_end(scope_decl*)
30206ir_node_visitor::visit_begin(type_base*)
30210ir_node_visitor::visit_end(type_base*)
30214ir_node_visitor::visit_begin(scope_type_decl* t)
30215{
return visit_begin(
static_cast<type_base*
>(t));}
30218ir_node_visitor::visit_end(scope_type_decl* t)
30219{
return visit_end(
static_cast<type_base*
>(t));}
30222ir_node_visitor::visit_begin(type_decl* t)
30223{
return visit_begin(
static_cast<type_base*
>(t));}
30226ir_node_visitor::visit_end(type_decl* t)
30227{
return visit_end(
static_cast<type_base*
>(t));}
30230ir_node_visitor::visit_begin(namespace_decl* d)
30231{
return visit_begin(
static_cast<decl_base*
>(d));}
30234ir_node_visitor::visit_end(namespace_decl* d)
30235{
return visit_end(
static_cast<decl_base*
>(d));}
30238ir_node_visitor::visit_begin(qualified_type_def* t)
30239{
return visit_begin(
static_cast<type_base*
>(t));}
30242ir_node_visitor::visit_end(qualified_type_def* t)
30243{
return visit_end(
static_cast<type_base*
>(t));}
30246ir_node_visitor::visit_begin(pointer_type_def* t)
30247{
return visit_begin(
static_cast<type_base*
>(t));}
30250ir_node_visitor::visit_end(pointer_type_def* t)
30251{
return visit_end(
static_cast<type_base*
>(t));}
30254ir_node_visitor::visit_begin(reference_type_def* t)
30255{
return visit_begin(
static_cast<type_base*
>(t));}
30258ir_node_visitor::visit_end(reference_type_def* t)
30259{
return visit_end(
static_cast<type_base*
>(t));}
30262ir_node_visitor::visit_begin(ptr_to_mbr_type* t)
30263{
return visit_begin(
static_cast<type_base*
>(t));}
30266ir_node_visitor::visit_end(ptr_to_mbr_type* t)
30267{
return visit_end(
static_cast<type_base*
>(t));}
30270ir_node_visitor::visit_begin(array_type_def* t)
30271{
return visit_begin(
static_cast<type_base*
>(t));}
30274ir_node_visitor::visit_end(array_type_def* t)
30275{
return visit_end(
static_cast<type_base*
>(t));}
30278ir_node_visitor::visit_begin(array_type_def::subrange_type* t)
30279{
return visit_begin(
static_cast<type_base*
>(t));}
30282ir_node_visitor::visit_end(array_type_def::subrange_type* t)
30283{
return visit_end(
static_cast<type_base*
>(t));}
30286ir_node_visitor::visit_begin(enum_type_decl* t)
30287{
return visit_begin(
static_cast<type_base*
>(t));}
30290ir_node_visitor::visit_end(enum_type_decl* t)
30291{
return visit_end(
static_cast<type_base*
>(t));}
30294ir_node_visitor::visit_begin(typedef_decl* t)
30295{
return visit_begin(
static_cast<type_base*
>(t));}
30298ir_node_visitor::visit_end(typedef_decl* t)
30299{
return visit_end(
static_cast<type_base*
>(t));}
30302ir_node_visitor::visit_begin(function_type* t)
30303{
return visit_begin(
static_cast<type_base*
>(t));}
30306ir_node_visitor::visit_end(function_type* t)
30307{
return visit_end(
static_cast<type_base*
>(t));}
30310ir_node_visitor::visit_begin(var_decl* d)
30311{
return visit_begin(
static_cast<decl_base*
>(d));}
30314ir_node_visitor::visit_end(var_decl* d)
30315{
return visit_end(
static_cast<decl_base*
>(d));}
30318ir_node_visitor::visit_begin(function_decl* d)
30319{
return visit_begin(
static_cast<decl_base*
>(d));}
30322ir_node_visitor::visit_end(function_decl* d)
30323{
return visit_end(
static_cast<decl_base*
>(d));}
30326ir_node_visitor::visit_begin(function_decl::parameter* d)
30327{
return visit_begin(
static_cast<decl_base*
>(d));}
30330ir_node_visitor::visit_end(function_decl::parameter* d)
30331{
return visit_end(
static_cast<decl_base*
>(d));}
30334ir_node_visitor::visit_begin(function_tdecl* d)
30335{
return visit_begin(
static_cast<decl_base*
>(d));}
30338ir_node_visitor::visit_end(function_tdecl* d)
30339{
return visit_end(
static_cast<decl_base*
>(d));}
30342ir_node_visitor::visit_begin(class_tdecl* d)
30343{
return visit_begin(
static_cast<decl_base*
>(d));}
30346ir_node_visitor::visit_end(class_tdecl* d)
30347{
return visit_end(
static_cast<decl_base*
>(d));}
30350ir_node_visitor::visit_begin(class_or_union* t)
30351{
return visit_begin(
static_cast<type_base*
>(t));}
30354ir_node_visitor::visit_end(class_or_union* t)
30355{
return visit_end(
static_cast<type_base*
>(t));}
30358ir_node_visitor::visit_begin(class_decl* t)
30359{
return visit_begin(
static_cast<type_base*
>(t));}
30362ir_node_visitor::visit_end(class_decl* t)
30363{
return visit_end(
static_cast<type_base*
>(t));}
30366ir_node_visitor::visit_begin(union_decl* t)
30367{
return visit_begin(
static_cast<type_base*
>(t));}
30370ir_node_visitor::visit_end(union_decl* t)
30371{
return visit_end(
static_cast<type_base*
>(t));}
30374ir_node_visitor::visit_begin(class_decl::base_spec* d)
30375{
return visit_begin(
static_cast<decl_base*
>(d));}
30378ir_node_visitor::visit_end(class_decl::base_spec* d)
30379{
return visit_end(
static_cast<decl_base*
>(d));}
30382ir_node_visitor::visit_begin(member_function_template* d)
30383{
return visit_begin(
static_cast<decl_base*
>(d));}
30386ir_node_visitor::visit_end(member_function_template* d)
30387{
return visit_end(
static_cast<decl_base*
>(d));}
30390ir_node_visitor::visit_begin(member_class_template* d)
30391{
return visit_begin(
static_cast<decl_base*
>(d));}
30394ir_node_visitor::visit_end(member_class_template* d)
30395{
return visit_end(
static_cast<decl_base*
>(d));}
30407 static __thread
size_t counter;
30409 std::ostringstream o;
30415struct function_decl_hash
30417 size_t operator()(
const function_decl* f)
const
30418 {
return reinterpret_cast<size_t>(f);}
30421 {
return operator()(f.get());}
30426typedef unordered_map<
const function_decl*, string,
30427 function_decl_hash,
30446static const string&
30450 fns_to_str_map_type::const_iterator i = m.find(fn);
30453 string s = get_next_string();
30474fns_to_str(vector<function_decl*>::const_iterator begin,
30475 vector<function_decl*>::const_iterator end,
30479 vector<function_decl*>::const_iterator i;
30480 for (i = begin; i != end; ++i)
30481 o <<
"'" << fn_to_str(*i, m) <<
"' ";
30507fns_to_str(vector<function_decl*>::const_iterator a_begin,
30508 vector<function_decl*>::const_iterator a_end,
30509 vector<function_decl*>::const_iterator b_begin,
30510 vector<function_decl*>::const_iterator b_end,
30514 fns_to_str(a_begin, a_end, m, o);
30516 fns_to_str(b_begin, b_end, m, o);
30540fns_to_str(vector<function_decl*>::const_iterator a_begin,
30541 vector<function_decl*>::const_iterator a_end,
30542 vector<function_decl*>::const_iterator b_begin,
30543 vector<function_decl*>::const_iterator b_end,
30547 fns_to_str(a_begin, a_end, b_begin, b_end, m, o);
30569 std::string parent_qualified_name;
30578 if (!d->priv_->qualified_parent_name_.empty())
30584 d->priv_->qualified_name_ =
30585 env.
intern(d->priv_->qualified_parent_name_ +
"::" + d->
get_name());
30593 d->priv_->internal_qualified_name_ = d->priv_->qualified_name_;
30595 if (d->priv_->scoped_name_.empty())
30600 d->priv_->scoped_name_ =
30603 d->priv_->scoped_name_ =
30621{
return do_update(d);}
30633 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
bool find_enumerator_by_value(int64_t value, enum_type_decl::enumerator &result)
Find an enumerator by its value.
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.
bool find_enumerator_by_name(const string &name, enum_type_decl::enumerator &result)
Find an enumerator by its name.
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. If an ABI artifact is in this state,...
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 array types 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.
T * maybe_get_canonical_type(T *t)
Get the canonical type of a given type T* as a T*.
shared_ptr< elf_symbol > elf_symbol_sptr
A convenience typedef for a shared pointer to elf_symbol.
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.
type_decl * is_integral_type(const type_or_decl_base *t)
Test if a type is an integral type.
bool anonymous_data_member_exists_in_class(const var_decl &anon_dm, const class_or_union &clazz)
Test if a given anonymous data member exists in a class or union.
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.
bool integral_type_has_harmless_name_change(const decl_base_sptr &f, const decl_base_sptr &s)
Test if a diff node carries a change whereby two integral types have different names in a harmless wa...
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.
bool integral_type_has_harmless_name_change(const type_base_sptr &f, const type_base_sptr &s)
Test if a diff node carries a change whereby two integral types have different names in a harmless wa...
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.
uint64_t get_data_member_offset(const decl_base_sptr d)
Get the offset of a data member.
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.
bool classes_have_same_layout(const type_base_sptr &f, const type_base_sptr &s)
Test if two classes have the same layout.
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 decl_name_changed(const type_or_decl_base *a1, const type_or_decl_base *a2)
Test if two decls have different names.
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.