11 #include "abg-reporter-priv.h"
42 out << std::hex << std::showbase ;
45 out << value << std::dec << std::noshowbase;
101 bool show_bits_or_byte)
103 bool can_convert_bits_to_bytes = (old_bits % 8 == 0 && new_bits % 8 == 0);
104 uint64_t o = can_convert_bits_to_bytes
107 uint64_t n = can_convert_bits_to_bytes
110 string bits_or_bytes =
115 out << what <<
" changed from ";
119 if (show_bits_or_byte)
122 out << bits_or_bytes;
145 bool can_convert_bits_to_bytes = (value % 8 == 0);
146 if (can_convert_bits_to_bytes)
148 string bits_or_bytes =
156 out <<
" (in " << bits_or_bytes <<
")";
183 method_decl_sptr mem_fn,
189 method_decl_sptr meth =
190 dynamic_pointer_cast<method_decl>(mem_fn);
193 out <<
"'" << mem_fn->get_pretty_representation() <<
"'";
199 ssize_t biggest_voffset =
201 get_biggest_vtable_offset();
204 out <<
", virtual at voffset ";
212 if (ctxt.show_linkage_names()
213 && (mem_fn->get_symbol()))
216 << mem_fn->get_symbol()->get_id_string()
235 const string& indent)
243 << d->get_pretty_representation(
false,
294 if (first_offset < second_offset)
297 change = second_offset - first_offset;
299 else if (first_offset > second_offset)
302 change = first_offset - second_offset;
314 out <<
" (by " << sign;
316 out <<
" " << bits_or_bytes <<
")";
353 if (first_size < second_size)
356 change = second_size - first_size;
358 else if (first_size > second_size)
361 change = first_size - second_size;
373 out <<
" (by " << sign;
375 out <<
" " << bits_or_bytes <<
")";
394 const string& indent,
397 if (!ctxt->get_reporter()->diff_to_be_reported(
diff.get()))
404 const bool is_strict_anonymous_data_member_change = o_anon && n_anon;
405 const string o_name = o->get_qualified_name();
406 const string n_name = n->get_qualified_name();
411 const string o_pretty_representation =
412 o->get_pretty_representation(
false,
false);
414 const bool show_size_offset_changes = ctxt->get_allowed_category()
418 bool emitted =
false;
420 bool begin_with_and =
false;
422 bool size_reported =
false;
437 if (is_strict_anonymous_data_member_change)
439 const string n_pretty_representation =
440 n->get_pretty_representation(
false,
442 const type_base_sptr o_type = o->get_type(), n_type = n->get_type();
443 if (o_pretty_representation != n_pretty_representation)
446 o_offset, *ctxt, out);
448 out <<
" changed from:\n"
449 << indent <<
" " << o_pretty_representation <<
"\n"
451 << indent <<
" " << n_pretty_representation <<
"\n";
453 begin_with_and =
true;
458 &&
is_decl(o_type)->get_is_anonymous()
459 &&
is_decl(n_type)->get_is_anonymous())
461 out << indent <<
"while looking at anonymous data member '"
462 << o_pretty_representation <<
"':\n"
463 << indent <<
"the internal name of that anonymous data member"
468 << indent <<
" This is usually due to "
469 <<
"an anonymous member type being added or removed from "
470 <<
"the containing type\n";
472 begin_with_and =
true;
481 const string n_pretty_representation =
482 n->get_pretty_representation(
false,
484 out << indent << (o_anon ?
"anonymous " :
"")
485 <<
"data member " << o_pretty_representation;
487 out <<
" became " << (n_anon ?
"anonymous " :
"")
488 <<
"data member '" << n_pretty_representation <<
"'\n";
490 begin_with_and =
true;
505 if (ctxt->get_reporter()->diff_to_be_reported(d.get()))
508 out << indent <<
"type '"
512 string(
"anonymous data member")
513 : o->get_qualified_name())
517 <<
"type of '"<< (o_anon ?
"anonymous data member ":
"")
518 << o_pretty_representation <<
"' changed";
520 if (d->currently_reporting())
521 out <<
", as being reported\n";
522 else if (d->reported_once())
523 out <<
", as reported earlier\n";
527 d->report(out, indent +
" ");
530 begin_with_and =
true;
532 size_reported =
true;
544 && !(ctxt->get_allowed_category()
551 out << indent <<
"and ";
552 begin_with_and =
false;
558 out <<
"name of '" << o_name <<
"' changed to '" << n_name <<
"'";
569 out << indent <<
"and ";
570 begin_with_and =
false;
573 out << indent <<
"'" << o_pretty_representation <<
"' ";
577 out <<
"is no more laid out";
579 out <<
"now becomes laid out";
582 if (show_size_offset_changes)
584 if (o_offset != n_offset)
588 out << indent <<
"and ";
589 begin_with_and =
false;
594 if (is_strict_anonymous_data_member_change)
595 out <<
"anonymous data member ";
596 out <<
"'" << o_pretty_representation <<
"' ";
606 if (!size_reported && o_size != n_size)
610 out << indent <<
"and ";
611 begin_with_and =
false;
616 if (is_strict_anonymous_data_member_change)
617 out <<
"anonymous data member ";
618 out <<
"'" << o_pretty_representation <<
"' ";
628 if (o->get_binding() != n->get_binding())
632 out << indent <<
"and ";
633 begin_with_and =
false;
636 out << indent <<
"'" << o_pretty_representation <<
"' ";
639 out <<
"elf binding changed from " << o->get_binding()
640 <<
" to " << n->get_binding();
643 if (o->get_visibility() != n->get_visibility())
647 out << indent <<
"and ";
648 begin_with_and =
false;
651 out << indent <<
"'" << o_pretty_representation <<
"' ";
654 out <<
"visibility changed from " << o->get_visibility()
655 <<
" to " << n->get_visibility();
664 out << indent <<
"and ";
665 begin_with_and =
false;
668 out << indent <<
"'" << o_pretty_representation <<
"' ";
672 out <<
"access changed from '"
683 out << indent <<
"and ";
684 begin_with_and =
false;
687 out << indent <<
"'" << o_pretty_representation <<
"' ";
692 out <<
"is no more static";
694 out <<
"now becomes static";
703 out << indent <<
"'" << o_pretty_representation
704 <<
"' has *some* difference - please report as a bug";
731 const string& indent,
736 string oor = o->get_pretty_representation();
737 string nr = n->get_pretty_representation();
738 string on = o->get_name();
739 string nn = n->get_name();
740 int64_t olb = o->get_lower_bound();
741 int64_t nlb = n->get_lower_bound();
742 int64_t oub = o->get_upper_bound();
743 int64_t nub = n->get_upper_bound();
747 out << indent <<
"name of range changed from '"
748 << on <<
"' to '" << nn <<
"'\n";
753 out << indent <<
"lower bound of range '"
755 <<
"' change from '";
764 out << indent <<
"upper bound of range '"
766 <<
"' change from '";
776 if (dif && dif->to_be_reported())
779 out << indent <<
"underlying type of range '"
780 << oor <<
"' changed:\n";
781 dif->report(out, indent +
" ");
802 const string& indent)
804 type_base_sptr f = dynamic_pointer_cast<type_base>(first),
805 s = dynamic_pointer_cast<type_base>(second);
820 unsigned fs = f->get_size_in_bits(), ss = s->get_size_in_bits(),
821 fa = f->get_alignment_in_bits(), sa = s->get_alignment_in_bits();
824 unsigned fdc = first_array ? first_array->get_dimension_count(): 0,
825 sdc = second_array ? second_array->get_dimension_count(): 0;
829 if (fs != ss || fdc != sdc)
831 if (first_array && second_array)
835 out << indent <<
"array type size changed from ";
836 if (first_array->is_infinite())
837 out <<
"\'unknown\'";
841 if (second_array->is_infinite())
842 out <<
"\'unknown\'";
850 <<
"number of dimensions changed from "
856 array_type_def::subranges_type::const_iterator i, j;
857 for (i = first_array->get_subranges().begin(),
858 j = second_array->get_subranges().begin();
859 (i != first_array->get_subranges().end()
860 && j != second_array->get_subranges().end());
863 if ((*i)->get_length() != (*j)->get_length())
866 <<
"array type subrange "
867 << i - first_array->get_subranges().begin() + 1
868 <<
" changed length from ";
870 if ((*i)->is_infinite())
871 out <<
"\'unknown\'";
873 out << (*i)->get_length();
877 if ((*j)->is_infinite())
878 out <<
"\'unknown\'";
880 out << (*j)->get_length();
893 if (ctxt->show_relative_offset_changes())
895 out << indent <<
"type size hasn't changed\n";
923 decl_base_sptr decl =
is_decl(tod);
931 if (tu && (loc = decl->get_location()))
934 unsigned line, column;
936 loc.
expand(path, line, column);
938 path = basename(
const_cast<char*
>(path.c_str()));
940 out <<
" at " << path <<
":" << line <<
":" << column;
960 decl_base_sptr second,
963 const string& indent)
965 string fn = first->get_qualified_name(),
966 sn = second->get_qualified_name();
981 out <<
"declaration";
982 out <<
" name changed from '" << fn <<
"' to '" << sn <<
"'";
1012 size_t num_filtered,
1014 const string& section_name,
1015 const string& indent)
1017 size_t net_number = number - num_filtered;
1019 char colon_or_semi_colon =
':';
1024 change = (number > 1) ?
"deletions" :
"deletion";
1027 change = (number > 1) ?
"insertions" :
"insertion";
1029 case subtype_change_kind:
1031 change = (number > 1) ?
"changes" :
"change";
1035 if (net_number == 0)
1037 out << indent <<
"no " << section_name <<
" " << change;
1038 colon_or_semi_colon =
';';
1040 else if (net_number == 1)
1041 out << indent <<
"1 " << section_name <<
" " << change;
1043 out << indent << net_number <<
" " << section_name
1047 out <<
" (" << num_filtered <<
" filtered)";
1048 out << colon_or_semi_colon <<
"\n";
1068 const string& section_name,
1069 const string& indent)
1076 change =
"deletions";
1079 change =
"insertions";
1081 case subtype_change_kind:
1087 out << indent <<
"there are " << section_name <<
" " << change <<
":\n";
1104 const decl_base_sptr& decl2,
1107 const string& indent)
1110 bool reported =
false;
1114 string decl1_repr = decl1->get_pretty_representation(),
1115 decl2_repr = decl2->get_pretty_representation();
1120 out << indent <<
"'" << decl1_repr <<
"' ";
1124 out <<
"became non-static";
1126 out <<
"became static";
1134 out << indent <<
"'" << decl1_repr <<
"' access changed from '"
1159 const decl_base_sptr& decl2,
1162 const string& indent)
1164 bool reported =
false;
1174 uint64_t var_size_in_bits = var1->get_symbol()->get_size() * 8;
1178 var_size_in_bits, *ctxt, out);
1179 out <<
") hasn't changed\n"
1180 << indent <<
"but it does have a harmless type change\n";
1203 const string& indent)
1205 if (!symbol1 || !symbol2 || symbol1 == symbol2)
1208 if (symbol1->get_size() != symbol2->get_size())
1212 symbol1->get_size(),
1213 symbol2->get_size(),
1219 if (symbol1->get_name() != symbol2->get_name())
1221 out << indent <<
"symbol name changed from "
1222 << symbol1->get_name()
1224 << symbol2->get_name()
1228 if (symbol1->get_type() != symbol2->get_type())
1230 out << indent <<
"symbol type changed from '"
1231 << symbol1->get_type()
1233 << symbol2->get_type()
1237 if (symbol1->is_public() != symbol2->is_public())
1239 out << indent <<
"symbol became ";
1240 if (symbol2->is_public())
1243 out <<
"non-exported";
1247 if (symbol1->is_defined() != symbol2->is_defined())
1249 out << indent <<
"symbol became ";
1250 if (symbol2->is_defined())
1257 if (symbol1->get_version() != symbol2->get_version())
1259 out << indent <<
"symbol version changed from "
1260 << symbol1->get_version().str()
1262 << symbol2->get_version().str()
1270 const std::string none =
"(none)";
1271 out << indent <<
"CRC (modversions) changed from "
1272 << std::showbase << std::hex;
1273 if (crc1.has_value())
1274 out << crc1.value();
1278 if (crc2.has_value())
1279 out << crc2.value();
1282 out << std::noshowbase << std::dec
1290 const std::string none =
"(none)";
1291 out << indent <<
"namespace changed from ";
1292 if (ns1.has_value())
1293 out <<
"'" << ns1.value() <<
"'";
1297 if (ns2.has_value())
1298 out <<
"'" << ns2.value() <<
"'";
1319 const string& indent,
1327 if (!aliases.empty())
1328 out <<
", aliases " << aliases;
1347 const string& indent,
1352 if (!(ctxt->show_unreachable_types()
1353 && (!d.priv_->deleted_unreachable_types_.empty()
1354 || !d.priv_->added_unreachable_types_.empty()
1355 || !d.priv_->changed_unreachable_types_.empty())))
1363 <<
"1 removed type unreachable from any public interface:\n\n";
1367 <<
" removed types unreachable from any public interface:\n\n";
1369 vector<type_base_sptr> sorted_removed_unreachable_types;
1371 sorted_removed_unreachable_types);
1372 bool emitted =
false;
1373 for (vector<type_base_sptr>::const_iterator i =
1374 sorted_removed_unreachable_types.begin();
1375 i != sorted_removed_unreachable_types.end();
1378 if (d.priv_->deleted_unreachable_type_is_suppressed((*i).get()))
1392 <<
"1 changed type unreachable from any public interface:\n\n";
1396 <<
" changed types unreachable from any public interface:\n\n";
1401 for (diff_sptrs_type::const_iterator i = sorted_diff_sptrs.begin();
1402 i != sorted_diff_sptrs.end();
1411 out << indent <<
" [C] '" << repr <<
"' changed:\n";
1421 <<
"1 added type unreachable from any public interface:\n\n";
1425 <<
" added types unreachable from any public interface:\n\n";
1427 vector<type_base_sptr> sorted_added_unreachable_types;
1429 sorted_added_unreachable_types);
1431 for (vector<type_base_sptr>::const_iterator i =
1432 sorted_added_unreachable_types.begin();
1433 i != sorted_added_unreachable_types.end();
1436 if (d.priv_->added_unreachable_type_is_suppressed((*i).get()))
1459 const string &indent)
1466 if (!ctxt->show_impacted_interfaces())
1469 const diff_maps &maps = corp_diff->get_leaf_diffs();
1472 if (impacted_artifacts == 0)
1475 if (impacted_artifacts->empty())
1478 vector<type_or_decl_base_sptr> sorted_impacted_interfaces;
1481 size_t num_impacted_interfaces = impacted_artifacts->size();
1482 if (num_impacted_interfaces == 1)
1483 out << indent <<
"one impacted interface:\n";
1485 out << indent << num_impacted_interfaces <<
" impacted interfaces:\n";
1487 string cur_indent = indent +
" ";
1488 vector<type_or_decl_base_sptr>::const_iterator it;
1489 for (it = sorted_impacted_interfaces.begin();
1490 it != sorted_impacted_interfaces.end();
1508 const string &indent)
1532 const string &indent)
1542 for (changed_var_sptrs_type::const_iterator i =
1548 vector<var_decl_sptr> dms_replaced_by_same_anon_dm;
1549 dms_replaced_by_same_anon_dm.push_back(i->first);
1558 && *i->second == *anonymous_data_member;
1560 dms_replaced_by_same_anon_dm.push_back(i->first);
1562 bool several_data_members_replaced =
1563 dms_replaced_by_same_anon_dm.size() > 1;
1565 out << indent <<
"data member";
1566 if (several_data_members_replaced)
1569 bool first_data_member =
true;
1570 for (vector<var_decl_sptr>::const_iterator it =
1571 dms_replaced_by_same_anon_dm.begin();
1572 it != dms_replaced_by_same_anon_dm.end();
1575 string name = (*it)->get_qualified_name();
1576 if (!first_data_member)
1578 out <<
" '" << name <<
"'";
1579 first_data_member =
false;
1582 if (several_data_members_replaced)
1587 out <<
"replaced by anonymous data member:\n"
1590 << anonymous_data_member->get_pretty_representation()
1606 const string &indent)
1614 ABG_ASSERT(!first->get_base_specifiers().empty());
1615 ABG_ASSERT(!second->get_base_specifiers().empty());
1617 out << indent <<
"base classes of '"
1618 << first->get_pretty_representation()
1619 <<
"' are re-ordered from: ";
1621 vector<class_decl_sptr> classes = {first, second};
1622 unsigned nb_classes_seen = 0;
1623 for (
auto &klass : classes)
1625 if (nb_classes_seen >= 1)
1628 bool needs_comma =
false;
1629 for (
auto &b : klass->get_base_specifiers())
1633 if (b->get_is_virtual())
1635 out << b->get_base_class()->get_qualified_name();
1641 if (nb_classes_seen)
The private data and functions of the abigail::ir::comparison types.
#define ABG_ASSERT(cond)
This is a wrapper around the 'assert' glibc call. It allows for its argument to have side effects,...
This type abstracts changes for a class_decl.
class_decl_sptr first_class_decl() const
const vector< class_decl::base_spec_sptr > & moved_bases() const
Getter for the vector of bases that "moved". That is, the vector of base types which position changed...
class_decl_sptr second_class_decl() const
Getter of the second class involved in the diff.
This is the base class of class_diff and union_diff.
const string_decl_base_sptr_map & data_members_replaced_by_adms() const
Get the map of data members that got replaced by anonymous data members.
const changed_var_sptrs_type & ordered_data_members_replaced_by_adms() const
Get an ordered vector of of data members that got replaced by anonymous data members.
This is a document class that aims to capture statistics about the changes carried by a corpus_diff t...
size_t net_num_added_unreachable_types() const
Getter of the number of added types that are unreachable from public interfaces and that are *NOT* fi...
size_t net_num_removed_unreachable_types() const
Getter of the number of removed types that are not reachable from public interfaces and that have *NO...
size_t net_num_changed_unreachable_types() const
Getter of the number of changed types that are unreachable from public interfaces and that have *NOT*...
An abstraction of a diff between between two abi corpus.
const diff_context_sptr context() const
Getter of the diff context of this diff.
The context of the diff. This type holds various bits of information that is going to be used through...
bool show_offsets_sizes_in_bits() const
Get the flag that indicates if diff reports using this context should show sizes and offsets in bits,...
void show_relative_offset_changes(bool f)
Set a flag saying if offset changes should be reported in a relative way. That is,...
bool show_hex_values() const
Get the flag that indicates if the diff reports using this context should show sizes and offsets in a...
This type contains maps. Each map associates a type name to a diff of that type. Not all kinds of dif...
artifact_sptr_set_type * lookup_impacted_interfaces(const diff *d) const
Lookup the interfaces that are impacted by a given leaf diff node.
The abstraction of a change between two ABI artifacts, a.k.a an artifact change.
type_or_decl_base_sptr first_subject() const
Getter of the first subject of the diff.
virtual void report(ostream &out, const string &indent="") const =0
Pure interface to report the diff in a serialized form that is legible for the user.
const diff_context_sptr context() const
Getter of the context of the current diff.
bool to_be_reported() const
Test if this diff tree node should be reported.
virtual bool diff_to_be_reported(const diff *d) const
Tests if the diff node is to be reported.
The abstraction of the diff between two subrange types.
const array_type_def::subrange_sptr second_subrange() const
Getter of the second subrange of the current instance subrange_diff.
const array_type_def::subrange_sptr first_subrange() const
Getter of the first subrange of the current instance subrange_diff.
const diff_sptr underlying_type_diff() const
Getter of the diff node of the underlying types of the current subrange_diff diff node.
shared_ptr< subrange_type > subrange_sptr
Convenience typedef for a shared pointer on a function_decl::subrange.
Abstraction of an 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...
const string & get_id_string() const
Get a string that is representative of a given elf_symbol.
The source location of a token.
void expand(std::string &path, unsigned &line, unsigned &column) const
Expand the current location into a tripplet file path, line and column number.
This is the abstraction of the set of relevant artefacts (types, variable declarations,...
bool has_class_decl_only_def_change(const class_or_union_sptr &first, const class_or_union_sptr &second)
Test if two class_or_union_sptr are different just by the fact that one is decl-only and the other on...
bool has_harmless_name_change(const decl_base_sptr &f, const decl_base_sptr &s)
Test if two decls represents a harmless name change.
bool is_var_1_dim_unknown_size_array_change(const var_decl_sptr &var1, const var_decl_sptr &var2)
Test if we are looking at two variables which types are both one dimension array, with one of them be...
bool has_anonymous_data_member_change(const diff *d)
Test if a diff node carries a non-anonymous data member to anonymous data member change,...
shared_ptr< diff > diff_sptr
Convenience typedef for a shared_ptr for the diff class.
void show_linkage_name_and_aliases(ostream &out, const string &indent, const elf_symbol &symbol, const string_elf_symbols_map_type &sym_map)
For a given symbol, emit a string made of its name and version. The string also contains the list of ...
void maybe_report_interfaces_impacted_by_diff(const diff *d, ostream &out, const string &indent)
If a given diff node impacts some public interfaces, then report about those impacted interfaces on a...
@ ACCESS_CHANGE_CATEGORY
This means the diff node (or at least one of its descendant nodes) carries access related changes,...
@ HARMLESS_DATA_MEMBER_CHANGE_CATEGORY
This means that a diff node in the sub-tree carries a harmless data member change....
@ SIZE_OR_OFFSET_CHANGE_CATEGORY
This means the diff node (or at least one of its descendant nodes) carries a change that modifies the...
@ HARMLESS_DECL_NAME_CHANGE_CATEGORY
This means that a diff node in the sub-tree carries a harmless declaration name change....
void maybe_report_diff_for_symbol(const elf_symbol_sptr &symbol1, const elf_symbol_sptr &symbol2, const diff_context_sptr &ctxt, ostream &out, const string &indent)
Report the difference between two ELF symbols, if there is any.
void maybe_show_relative_offset_change(const var_diff_sptr &diff, diff_context &ctxt, ostream &out)
If a given var_diff node carries a data member change in which the offset of the data member actually...
uint64_t convert_bits_to_bytes(size_t bits)
Convert a number in bits into a number in bytes.
vector< diff_sptr > diff_sptrs_type
Convenience typedef for a vector of diff_sptr.
void maybe_report_unreachable_type_changes(const corpus_diff &d, const corpus_diff::diff_stats &s, const string &indent, ostream &out)
Report changes about types that are not reachable from global functions and variables,...
shared_ptr< diff_context > diff_context_sptr
Convenience typedef for a shared pointer of diff_context.
void report_size_and_alignment_changes(type_or_decl_base_sptr first, type_or_decl_base_sptr second, diff_context_sptr ctxt, ostream &out, const string &indent)
Report the size and alignment changes of a type.
bool report_loc_info(const type_or_decl_base_sptr &tod, const diff_context &ctxt, ostream &out)
shared_ptr< var_diff > var_diff_sptr
Convenience typedef for a shared pointer to a var_diff type.
void show_numerical_change(const string &what, uint64_t old_bits, uint64_t new_bits, const diff_context &ctxt, ostream &out, bool show_bits_or_byte)
Emit a message showing the numerical change between two values, to a given output stream.
bool maybe_report_diff_for_variable(const decl_base_sptr &decl1, const decl_base_sptr &decl2, const diff_context_sptr &ctxt, ostream &out, const string &indent)
Report the differences between two generic variables.
void maybe_report_base_class_reordering(const class_diff &d, ostream &out, const string &indent)
Report about the base classes of a class having been re-ordered.
void represent_data_member(var_decl_sptr d, const diff_context_sptr &ctxt, ostream &out, const string &indent)
Stream a string representation for a data member.
void maybe_show_relative_size_change(const var_diff_sptr &diff, diff_context &ctxt, ostream &out)
If a given var_diff node carries a hange in which the size of the variable actually changed,...
string get_pretty_representation(diff *d)
Get a copy of the pretty representation of a diff node.
diff_kind
Represent the kind of difference we want report_mem_header() to report.
void sort_artifacts_set(const artifact_sptr_set_type &set, vector< type_or_decl_base_sptr > &sorted)
Sort the set of ABI artifacts contained in a artifact_sptr_set_type.
void maybe_report_data_members_replaced_by_anon_dm(const class_or_union_diff &d, ostream &out, const string &indent)
Report about data members replaced by an anonymous data member without changing the overall bit-layou...
bool maybe_report_diff_for_member(const decl_base_sptr &decl1, const decl_base_sptr &decl2, const diff_context_sptr &ctxt, ostream &out, const string &indent)
Report the differences in access specifiers and static-ness for class members.
void report_mem_header(ostream &out, size_t number, size_t num_filtered, diff_kind k, const string §ion_name, const string &indent)
Output the header preceding the the report for insertion/deletion/change of a part of a class....
void sort_string_type_base_sptr_map(string_type_base_sptr_map &map, vector< type_base_sptr > &sorted)
Sort a map of string to type_base_sptr entities.
void show_offset_or_size(const string &what, uint64_t value, const diff_context &ctxt, ostream &out)
Emit a message showing the value of a numerical value representing a size or an offset,...
void emit_num_value(uint64_t value, const diff_context &ctxt, ostream &out)
Emit a numerical value to an output stream.
void report_name_size_and_alignment_changes(decl_base_sptr first, decl_base_sptr second, diff_context_sptr ctxt, ostream &out, const string &indent)
Report the name, size and alignment changes of a type.
void sort_string_diff_sptr_map(const string_diff_sptr_map &map, diff_sptrs_type &sorted)
Sort a map ofg string -> diff_sptr into a vector of diff_sptr. The diff_sptr are sorted lexicographic...
shared_ptr< corpus_diff > corpus_diff_sptr
A convenience typedef for a shared pointer to corpus_diff.
void represent(const diff_context &ctxt, method_decl_sptr mem_fn, ostream &out)
Stream a string representation for a member function.
uint64_t maybe_convert_bits_to_bytes(uint64_t bits, const diff_context &ctxt)
Convert a bits value into a byte value if the current diff context instructs us to do so.
bool get_member_is_static(const decl_base &d)
Gets a flag saying if a class member is static or not.
ssize_t get_member_function_vtable_offset(const function_decl &f)
Get the vtable offset of a member function.
unordered_set< type_or_decl_base_sptr, type_or_decl_hash, type_or_decl_equal > artifact_sptr_set_type
A convenience typedef for a hash set of type_or_decl_base_sptr.
bool is_type(const type_or_decl_base &tod)
Test whether a declaration is a type.
bool is_anonymous_data_member(const decl_base &d)
Test if a decl is an anonymous data member.
shared_ptr< elf_symbol > elf_symbol_sptr
A convenience typedef for a shared pointer to elf_symbol.
change_kind
A bitfield that gives callers of abigail::ir::equals() some insight about how different two internal ...
bool is_class_type(const type_or_decl_base &t)
Test whether a type is a class.
shared_ptr< array_type_def > array_type_def_sptr
Convenience typedef for a shared pointer on a array_type_def.
array_type_def * is_array_type(const type_or_decl_base *type)
Test if a type is an array_type_def.
class_or_union * is_class_or_union_type(const type_or_decl_base *t)
Test if a type is a class_or_union.
shared_ptr< class_decl > class_decl_sptr
Convenience typedef for a shared pointer on a class_decl.
uint64_t get_var_size_in_bits(const var_decl_sptr &v)
Get the size of a given variable.
shared_ptr< var_decl > var_decl_sptr
Convenience typedef for a shared pointer on a var_decl.
shared_ptr< type_or_decl_base > type_or_decl_base_sptr
A convenience typedef for a shared_ptr to type_or_decl_base.
bool get_data_member_is_laid_out(const var_decl &m)
Test whether a data member is laid out.
bool is_member_function(const function_decl &f)
Test whether a function_decl is a member function.
var_decl * is_var_decl(const type_or_decl_base *tod)
Tests if a declaration is a variable declaration.
decl_base * is_decl(const type_or_decl_base *d)
Test if an ABI artifact is a declaration.
access_specifier get_member_access_specifier(const decl_base &d)
Gets the access specifier for a class member.
uint64_t get_data_member_offset(const var_decl &m)
Get the offset of a data member.
bool get_member_function_is_virtual(const function_decl &f)
Test if a given member function is virtual.
bool is_union_type(const type_or_decl_base &t)
Test if a type is a union_decl.
bool is_data_member(const var_decl &v)
Test if a var_decl is a data member.
translation_unit * get_translation_unit(const decl_base &decl)
Return the translation unit a declaration belongs to.
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.
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.
bool is_member_decl(const decl_base_sptr d)
Tests if a declaration is a class member.
Toplevel namespace for libabigail.