57using std::unordered_map;
58using std::dynamic_pointer_cast;
69static bool read_is_declaration_only(xmlNodePtr,
bool&);
70static bool read_is_artificial(xmlNodePtr,
bool&);
71static bool read_tracking_non_reachable_types(xmlNodePtr,
bool&);
72static bool read_is_non_reachable_type(xmlNodePtr,
bool&);
73static bool read_naming_typedef_id_string(xmlNodePtr, vector<string>&);
74static bool read_type_id_string(xmlNodePtr,
string&);
75static bool read_name(xmlNodePtr,
string&);
76#ifdef WITH_DEBUG_SELF_COMPARISON
77static bool maybe_map_type_with_type_id(
const type_base_sptr&,
79static bool maybe_map_type_with_type_id(
const type_base_sptr&,
82#define MAYBE_MAP_TYPE_WITH_TYPE_ID(type, xml_node) \
83 maybe_map_type_with_type_id(type, xml_node)
85#define MAYBE_MAP_TYPE_WITH_TYPE_ID(type, xml_node)
88static void maybe_set_naming_typedefs(reader& rdr,
90 const decl_base_sptr &);
92static int advance_cursor(reader& rdr);
98walk_xml_node_to_map_type_ids(reader& rdr, xmlNodePtr node);
101read_elf_needed_from_input(reader& rdr, vector<string>& needed);
104read_symbol_db_from_input(reader& rdr,
111read_translation_unit_from_input(
fe_iface& rdr);
114go_to_abi_types_node_from_input(
fe_iface& rdr);
117build_ir_node_for_void_type(reader& rdr);
120build_ir_node_for_void_pointer_type(reader& rdr);
123build_ir_node_for_variadic_parameter_type(reader& rdr);
131read_type_hash_and_cti(xmlNodePtr, uint64_t& hash, uint64_t& cti);
134read_artifact_native_offset(xmlNodePtr, uint64_t& offset);
140read_common_type_info(reader& rdr, xmlNodePtr node, type_base_sptr type);
143node_is_member_function(xmlNodePtr node,
144 xmlNodePtr& parent_class_node);
157 typedef unordered_map<string, vector<type_base_sptr> >
160 typedef unordered_map<string,
161 vector<type_base_sptr> >::const_iterator
164 typedef unordered_map<string,
165 vector<type_base_sptr> >::iterator
168 typedef unordered_map<string,
169 shared_ptr<function_tdecl> >::const_iterator
170 const_fn_tmpl_map_it;
172 typedef unordered_map<string,
173 shared_ptr<class_tdecl> >::const_iterator
174 const_class_tmpl_map_it;
176 typedef unordered_map<string, xmlNodePtr> string_xml_node_map;
178 typedef unordered_map<xmlNodePtr, decl_base_sptr> xml_node_decl_base_sptr_map;
180 friend vector<type_base_sptr>* get_types_from_type_id(reader&,
183 friend unordered_map<type_or_decl_base*, vector<type_or_decl_base*>>*
184 get_artifact_used_by_relation_map(reader& rdr);
186 types_map_type m_types_map;
187 unordered_map<string, shared_ptr<function_tdecl> > m_fn_tmpl_map;
188 unordered_map<string, shared_ptr<class_tdecl> > m_class_tmpl_map;
190 string_xml_node_map m_id_xml_node_map;
191 xml_node_decl_base_sptr_map m_xml_node_decl_map;
193 xmlNodePtr m_corp_node;
194 xmlNodePtr m_abi_types_node;
195 deque<shared_ptr<decl_base> > m_decls_stack;
197 bool m_tracking_non_reachable_types;
198 bool m_drop_undefined_syms;
199 bool m_drop_hash_value;
200#ifdef WITH_SHOW_TYPE_USE_IN_ABILINT
202 vector<type_or_decl_base*>> m_artifact_used_by_map;
214 m_translation_unit(),
215 m_tracking_non_reachable_types(),
216 m_drop_undefined_syms(),
236 clear_types_to_canonicalize();
252 tracking_non_reachable_types()
const
253 {
return m_tracking_non_reachable_types;}
261 tracking_non_reachable_types(
bool f)
262 {m_tracking_non_reachable_types = f;}
270 drop_undefined_syms()
const
271 {
return m_drop_undefined_syms;}
278 drop_undefined_syms(
bool f)
279 {m_drop_undefined_syms = f;}
292 set_path(
const string& s)
308 get_environment()
const
309 {
return const_cast<reader*
>(
this)->get_environment();}
312 get_libxml_reader()
const
321 get_corpus_node()
const
322 {
return m_corp_node;}
330 set_corpus_node(xmlNodePtr node)
331 {m_corp_node = node;}
334 get_abi_types_node()
const
335 {
return m_abi_types_node;}
338 set_abi_types_node(xmlNodePtr node)
339 {m_abi_types_node = node;}
341 const string_xml_node_map&
342 get_id_xml_node_map()
const
343 {
return m_id_xml_node_map;}
346 get_id_xml_node_map()
347 {
return m_id_xml_node_map;}
350 clear_id_xml_node_map()
351 {get_id_xml_node_map().clear();}
353 const xml_node_decl_base_sptr_map&
354 get_xml_node_decl_map()
const
355 {
return m_xml_node_decl_map;}
357 xml_node_decl_base_sptr_map&
358 get_xml_node_decl_map()
359 {
return m_xml_node_decl_map;}
362 map_xml_node_to_decl(xmlNodePtr node,
366 get_xml_node_decl_map()[node]= decl;
370 get_decl_for_xml_node(xmlNodePtr node)
const
372 xml_node_decl_base_sptr_map::const_iterator i =
373 get_xml_node_decl_map().find(node);
375 if (i != get_xml_node_decl_map().end())
378 return decl_base_sptr();
382 clear_xml_node_decl_map()
383 {get_xml_node_decl_map().clear();}
386 map_id_and_node (
const string&
id,
392 string_xml_node_map::iterator i = get_id_xml_node_map().find(
id);
393 if (i != get_id_xml_node_map().end())
395 bool is_declaration =
false;
396 read_is_declaration_only(node, is_declaration);
401 get_id_xml_node_map()[id] = node;
405 get_xml_node_from_id(
const string&
id)
const
407 string_xml_node_map::const_iterator i = get_id_xml_node_map().find(
id);
408 if (i != get_id_xml_node_map().end())
414 get_scope_for_node(xmlNodePtr node,
418 get_scope_for_node(xmlNodePtr node);
421 get_scope_ptr_for_node(xmlNodePtr node);
426 build_or_get_type_decl(
const string&
id,
441 get_type_decl(
const string&
id)
const
443 const_types_map_it i = m_types_map.find(
id);
444 if (i == m_types_map.end())
445 return type_base_sptr();
446 type_base_sptr result = i->second[0];
462 const vector<type_base_sptr>*
463 get_all_type_decls(
const string&
id)
const
465 const_types_map_it i = m_types_map.find(
id);
466 if (i == m_types_map.end())
483 shared_ptr<function_tdecl>
484 get_fn_tmpl_decl(
const string&
id)
const
486 const_fn_tmpl_map_it i = m_fn_tmpl_map.find(
id);
487 if (i == m_fn_tmpl_map.end())
488 return shared_ptr<function_tdecl>();
502 shared_ptr<class_tdecl>
503 get_class_tmpl_decl(
const string&
id)
const
505 const_class_tmpl_map_it i = m_class_tmpl_map.find(
id);
506 if (i == m_class_tmpl_map.end())
507 return shared_ptr<class_tdecl>();
513 get_cur_scope()
const
515 shared_ptr<decl_base> cur_decl = get_cur_decl();
517 if (
dynamic_cast<scope_decl*
>(cur_decl.get()))
519 return dynamic_pointer_cast<scope_decl>(cur_decl);
523 return cur_decl->get_scope();
532 if (m_decls_stack.empty())
533 return shared_ptr<decl_base>(
static_cast<decl_base*
>(0));
534 return m_decls_stack.back();
538 set_translation_unit(translation_unit* tu)
539 {m_translation_unit = tu;}
544 return m_translation_unit;
553 type_is_from_translation_unit(type_base_sptr type)
565 push_decl(decl_base_sptr d)
567 m_decls_stack.push_back(d);
573 if (m_decls_stack.empty())
574 return decl_base_sptr();
576 shared_ptr<decl_base> t = get_cur_decl();
577 m_decls_stack.pop_back();
604 return dynamic_pointer_cast<scope_decl>(d) == scope;
617 {m_decls_stack.clear();}
621 {m_types_map.clear();}
626 clear_types_to_canonicalize()
627 {m_types_to_canonicalize.clear();}
643 types_equal(type_base_sptr t1, type_base_sptr t2)
645 if (t1.get() == t2.get())
664 key_type_decl(
const type_base_sptr& type,
const string&
id)
669 m_types_map[id].push_back(type);
684 key_fn_tmpl_decl(shared_ptr<function_tdecl> fn_tmpl_decl,
689 const_fn_tmpl_map_it i = m_fn_tmpl_map.find(
id);
690 if (i != m_fn_tmpl_map.end())
693 m_fn_tmpl_map[id] = fn_tmpl_decl;
707 key_class_tmpl_decl(shared_ptr<class_tdecl> class_tmpl_decl,
712 const_class_tmpl_map_it i = m_class_tmpl_map.find(
id);
713 if (i != m_class_tmpl_map.end())
716 m_class_tmpl_map[id] = class_tmpl_decl;
720#ifdef WITH_SHOW_TYPE_USE_IN_ABILINT
730 record_artifact_as_used_by(type_or_decl_base* used,
731 type_or_decl_base* user)
733 if (m_artifact_used_by_map.find(used) == m_artifact_used_by_map.end())
735 vector<type_or_decl_base*> v;
736 m_artifact_used_by_map[used] = v;
738 m_artifact_used_by_map[used].push_back(user);
752 {record_artifact_as_used_by(used.get(), user.get());}
758 record_artifacts_as_used_in_fn_decl(
const function_decl *fn)
763 type_base_sptr t = fn->get_return_type();
764 record_artifact_as_used_by(t.get(),
const_cast<function_decl*
>(fn));
766 for (
auto pit : fn->get_parameters())
768 type_base_sptr t = pit->get_type();
769 record_artifact_as_used_by(t.get(),
const_cast<function_decl*
>(fn));
778 {record_artifacts_as_used_in_fn_decl(fn.get());}
784 record_artifacts_as_used_in_fn_type(
const function_type *fn_type)
789 type_base_sptr t = fn_type->get_return_type();
790 record_artifact_as_used_by(t.get(),
const_cast<function_type*
>(fn_type));
792 for (
auto pit : fn_type->get_parameters())
794 type_base_sptr t = pit->get_type();
795 record_artifact_as_used_by(t.get(),
796 const_cast<function_type*
>(fn_type));
805 {record_artifacts_as_used_in_fn_type(fn_type.get());}
817 push_decl_to_scope(
const decl_base_sptr& decl, xmlNodePtr node)
820 scope = get_scope_ptr_for_node(node);
821 return push_decl_to_scope(decl, scope);
830 push_decl_to_scope(
const decl_base_sptr& decl,
837 if (!decl->get_translation_unit())
857 push_and_key_type_decl(
const type_base_sptr& t,
864 push_decl_to_scope(decl, scope);
865 if (!t->get_translation_unit())
868 key_type_decl(t,
id);
883 push_and_key_type_decl(
const type_base_sptr& t,
884 const xmlNodePtr node,
885 bool add_to_current_scope)
888 if (!read_type_id_string(node,
id))
893 scope = get_scope_ptr_for_node(node);
894 return push_and_key_type_decl(t,
id, scope);
902 corpus::exported_decls_builder*
903 get_exported_decls_builder()
904 {
return corpus()->get_exported_decls_builder().get();}
917 corpus_is_suppressed_by_soname_or_filename(
const string& soname,
918 const string& filename)
924 for (suppressions_type::const_iterator s =
suppressions().begin();
935#ifdef WITH_DEBUG_SELF_COMPARISON
955 maybe_check_abixml_canonical_type_stability(type_base_sptr& t)
957 if (!get_environment().self_comparison_debug_is_on()
958 || get_environment().get_type_id_canonical_type_map().empty())
970 get_environment().get_type_id_from_pointer(
reinterpret_cast<uintptr_t
>(t.get()));
972 if (!type_id.empty())
977 auto j = get_environment().get_type_id_canonical_type_map().find(type_id);
978 if (j == get_environment().get_type_id_canonical_type_map().end())
980 if (t->get_naked_canonical_type())
981 std::cerr <<
"error: no type with type-id: '"
983 <<
"' could be read back from the typeid file\n";
986 !=
reinterpret_cast<uintptr_t
>(t->get_canonical_type().get()))
991 std::cerr <<
"error: canonical type for type '"
992 << t->get_pretty_representation(
true,
994 <<
"' of type-id '" << type_id
995 <<
"' changed from '" << std::hex
996 << j->second <<
"' to '" << std::hex
997 <<
reinterpret_cast<uintptr_t
>(t->get_canonical_type().get())
1009 schedule_type_for_canonicalization(type_base_sptr t)
1012 m_types_to_canonicalize.insert(t);
1021 tools_utils::timer cn_timer;
1024 std::cerr <<
"ABIXML Reader is going to canonicalize "
1025 << m_types_to_canonicalize.size()
1027 corpus_sptr c =
corpus();
1029 std::cerr <<
" of corpus " <<
corpus()->get_path() <<
"\n";
1033 vector<type_base_sptr> types;
1034 types.reserve(m_types_to_canonicalize.size());
1038 type_base_sptr t = wt.lock();
1044 corpus()->priv_->types_are_canonicalized(
true);
1049 std::cerr <<
"ABIXML Reader: canonicalized all types in: " << cn_timer <<
"\n";
1066 const string& fn_name)
const
1070 return suppression_matches_function_name(*s, fn_name);
1083 corpus_sptr corp =
corpus();
1085 if (!s.priv_->matches_soname(corp->get_soname()))
1086 if (s.has_soname_related_property())
1092 if (!s.priv_->matches_binary_name(corp->get_path()))
1093 if (s.has_file_name_related_property())
1114 suppression_matches_function_name(
const suppr::function_suppression& s,
1115 const string& fn_name)
const
1117 if (!s.get_drops_artifact_from_ir()
1121 return suppr::suppression_matches_function_name(s, fn_name);
1137 const string& type_name,
1138 const location& type_location)
const
1147 virtual ir::corpus_sptr
1150 tools_utils::timer global_timer;
1151 global_timer.start();
1161 bool call_reader_next =
false;
1163 xmlNodePtr node = get_corpus_node();
1170 status = advance_cursor (*
this);
1173 BAD_CAST(
"abi-corpus")))
1176#ifdef WITH_DEBUG_SELF_COMPARISON
1177 if (get_environment().self_comparison_debug_is_on())
1178 get_environment().set_self_comparison_debug_input(
corpus());
1181 ir::corpus& corp = *
corpus();
1183 corp.set_origin(corpus::NATIVE_XML_ORIGIN);
1185 handle_version_attribute(xml_reader, corp);
1187 maybe_drop_hash_values();
1194 path =
reinterpret_cast<char*
>(path_str.get());
1196 corp.set_path(path);
1201 if (architecture_str)
1202 corp.set_architecture_name
1203 (
reinterpret_cast<char*
>(architecture_str.get()));
1211 soname =
reinterpret_cast<char*
>(soname_str.get());
1213 corp.set_soname(soname);
1223 if ((!soname.empty() || !path.empty())
1224 && corpus_is_suppressed_by_soname_or_filename(soname, path))
1227 node = xmlTextReaderExpand(xml_reader.get());
1231 call_reader_next =
true;
1235#ifdef WITH_DEBUG_SELF_COMPARISON
1236 if (get_environment().self_comparison_debug_is_on())
1237 get_environment().set_self_comparison_debug_input(
corpus());
1240 ir::corpus& corp = *
corpus();
1241 corp.set_origin(corpus::NATIVE_XML_ORIGIN);
1245 corp.set_path(
reinterpret_cast<char*
>(path_str.get()));
1249 if (architecture_str)
1250 corp.set_architecture_name
1251 (
reinterpret_cast<char*
>(architecture_str.get()));
1256 corp.set_soname(
reinterpret_cast<char*
>(soname_str.get()));
1260 get_environment().load_all_types(
true);
1262 get_environment().load_all_types(
false);
1264 if (
options().load_undefined_interfaces)
1265 get_environment().analyze_exported_interfaces_only(
false);
1267 get_environment().analyze_exported_interfaces_only(
true);
1274 xmlNodePtr n = xmlFirstElementChild(node);
1278 ir::corpus& corp = *
corpus();
1280 tools_utils::timer t;
1284 std::cerr <<
"ABIXML Reader: mapping XML nodes to type ID "
1285 <<
"for corpus " << corp.get_path()
1290 walk_xml_node_to_map_type_ids(*
this, node);
1295 std::cerr <<
"ABIXML Reader: mapped XML nodes to type ID "
1296 <<
"for corpus " << corp.get_path()
1303 vector<string> needed;
1304 read_elf_needed_from_input(*
this, needed);
1305 if (!needed.empty())
1306 corp.set_needed(needed);
1313 std::cerr <<
"ABIXML Reader: reading symbols information "
1314 <<
"for corpus " << corp.get_path()
1321 read_symbol_db_from_input(*
this, fn_sym_db, var_sym_db,
1322 non_resolved_fn_syms_aliases,
1323 non_resolved_var_syms_aliases);
1324 resolve_symbol_aliases(fn_sym_db, var_sym_db,
1325 non_resolved_fn_syms_aliases,
1326 non_resolved_var_syms_aliases);
1335 std::cerr <<
"ABIXML Reader: read symbols information "
1336 <<
"for corpus " << corp.get_path()
1344 std::cerr <<
"ABIXML Reader: building IR "
1345 <<
"for corpus " << corp.get_path()
1352 m_abi_types_node = go_to_abi_types_node_from_input(*
this);
1355 while (read_translation_unit_from_input(*
this))
1361 std::cerr <<
"ABIXML Reader: built IR "
1362 <<
"for corpus " << corp.get_path()
1363 <<
" in: " << t <<
"\n";
1366 if (tracking_non_reachable_types())
1368 bool is_tracking_non_reachable_types =
false;
1370 read_tracking_non_reachable_types(node, is_tracking_non_reachable_types);
1371 tracking_non_reachable_types(is_tracking_non_reachable_types);
1376 std::cerr <<
"ABIXML Reader: canonicalizing types "
1377 <<
"for corpus " << corp.get_path()
1387 std::cerr <<
"ABIXML Reader: canonicalized types for corpus "
1389 <<
" in :" << t <<
"\n";
1392 if (call_reader_next)
1396 xmlTextReaderNext(xml_reader.get());
1404 node = get_corpus_node();
1405 node = xmlNextElementSibling(node);
1408 node = get_corpus_node();
1410 node = xmlNextElementSibling(node->parent);
1412 set_corpus_node(node);
1417 std::cerr <<
"ABIXML Reader: sorting functions and variables for corpus "
1423 corpus()->sort_functions();
1424 corpus()->sort_variables();
1430 corpus()->mark_non_reachable_types();
1435 std::cerr <<
"ABIXML Reader: sorted functions and variables for corpus "
1443 global_timer.stop();
1444 std::cerr <<
"ABIXML Reader: Analyzed corpus " <<
corpus()->get_path()
1445 <<
" in " << global_timer <<
"\n";
1446 std::cerr <<
"======================================================\n";
1461 maybe_drop_hash_values()
1463 string current_major, current_minor;
1466 if (current_major.empty() || current_minor.empty())
1469 ir::corpus& corp = *
corpus();
1470 bool drop_hash_values_from_abixml =
false;
1471 if (current_major > corp.get_format_major_version_number()
1472 || current_minor > corp.get_format_minor_version_number())
1473 drop_hash_values_from_abixml =
true;
1475 if (drop_hash_values_from_abixml)
1476 m_drop_hash_value =
true;
1486 read_hash_and_stash(
const xmlNodePtr node,
1489 uint64_t
hash = 0, cti = 0;
1490 if (!m_drop_hash_value
1491 && read_type_hash_and_cti(node, hash, cti))
1493 ir_node->priv_->force_set_hash_value(hash);
1494 type_base_sptr type;
1496 type = fn->get_type();
1502 type->type_or_decl_base::priv_->force_set_hash_value(hash);
1503 type->priv_->canonical_type_index = cti;
1516{
return dynamic_pointer_cast<reader>(iface);}
1518static int advance_cursor(reader&);
1522static bool read_symbol_db_from_input(reader&,
1527static bool read_location(
const reader&, xmlNodePtr,
location&);
1528static bool read_artificial_location(
const reader&,
1530static bool maybe_set_artificial_location(
const reader&,
1536static bool read_size_and_alignment(xmlNodePtr,
size_t&,
size_t&);
1537static bool read_static(xmlNodePtr,
bool&);
1538static bool read_offset_in_bits(xmlNodePtr,
size_t&);
1539static bool read_cdtor_const(xmlNodePtr,
bool&,
bool&,
bool&);
1540static bool read_is_virtual(xmlNodePtr,
bool&);
1541static bool read_vtable_offset(xmlNodePtr, ssize_t&);
1542static bool read_is_struct(xmlNodePtr,
bool&);
1543static bool read_is_anonymous(xmlNodePtr,
bool&);
1546static bool read_elf_symbol_visibility(xmlNodePtr,
1549build_namespace_decl(reader&,
const xmlNodePtr,
bool);
1559build_elf_symbol(reader&,
const xmlNodePtr,
bool);
1562build_elf_symbol_from_reference(reader&,
const xmlNodePtr);
1565build_elf_symbol_db(reader&,
const xmlNodePtr,
bool,
1570build_function_parameter (reader&,
const xmlNodePtr);
1573build_function_decl(reader&,
const xmlNodePtr,
1574 class_or_union_sptr,
bool,
bool);
1576static method_decl_sptr
1577build_member_function_decl(reader&,
const xmlNodePtr,
1578 class_or_union_sptr,
bool,
bool);
1581build_function_decl_if_not_suppressed(reader&,
const xmlNodePtr,
1582 class_or_union_sptr,
bool,
bool);
1585function_is_suppressed(
const reader& rdr,
1589build_var_decl_if_not_suppressed(reader&,
const xmlNodePtr,
bool);
1592build_var_decl(reader&,
const xmlNodePtr,
bool);
1595variable_is_suppressed(
const reader& rdr,
1598static shared_ptr<type_decl>
1599build_type_decl(reader&,
const xmlNodePtr,
bool);
1601static qualified_type_def_sptr
1602build_qualified_type_decl(reader&,
const xmlNodePtr,
bool);
1604static shared_ptr<pointer_type_def>
1605build_pointer_type_def(reader&,
const xmlNodePtr,
bool);
1607static shared_ptr<reference_type_def>
1608build_reference_type_def(reader&,
const xmlNodePtr,
bool);
1611build_ptr_to_mbr_type(reader&,
const xmlNodePtr,
bool);
1613static shared_ptr<function_type>
1614build_function_type(reader&,
const xmlNodePtr, class_or_union_sptr,
bool);
1616static shared_ptr<function_type>
1617build_function_type(reader&,
const xmlNodePtr,
1618 class_or_union_sptr,
1619 vector<decl_base_sptr>&,
bool);
1622build_subrange_type(reader&,
const xmlNodePtr,
bool);
1625build_array_type_def(reader&,
const xmlNodePtr,
bool);
1628build_enum_type_decl(reader&,
const xmlNodePtr,
bool);
1630static shared_ptr<typedef_decl>
1631build_typedef_decl(reader&,
const xmlNodePtr,
bool);
1634build_class_decl(reader&,
const xmlNodePtr,
bool);
1636static union_decl_sptr
1637build_union_decl(reader&,
const xmlNodePtr,
bool);
1639static shared_ptr<function_tdecl>
1640build_function_tdecl(reader&,
const xmlNodePtr,
bool);
1642static shared_ptr<class_tdecl>
1643build_class_tdecl(reader&,
const xmlNodePtr,
bool);
1646build_type_tparameter(reader&,
const xmlNodePtr,
1650build_type_composition(reader&,
const xmlNodePtr,
1654build_non_type_tparameter(reader&,
const xmlNodePtr,
1658build_template_tparameter(reader&,
const xmlNodePtr,
1662build_template_parameter(reader&,
const xmlNodePtr,
1669static shared_ptr<type_base>
1670build_type(reader&,
const xmlNodePtr,
bool);
1674static decl_base_sptr handle_type_decl(reader&, xmlNodePtr,
bool);
1675static decl_base_sptr handle_namespace_decl(reader&, xmlNodePtr,
bool);
1676static decl_base_sptr handle_qualified_type_decl(reader&,
1678static decl_base_sptr handle_pointer_type_def(reader&,
1680static decl_base_sptr handle_reference_type_def(reader&,
1682static type_base_sptr handle_function_type(reader&,
1684static decl_base_sptr handle_array_type_def(reader&,
1686static decl_base_sptr handle_enum_type_decl(reader&, xmlNodePtr,
bool);
1687static decl_base_sptr handle_typedef_decl(reader&, xmlNodePtr,
bool);
1688static decl_base_sptr handle_var_decl(reader&, xmlNodePtr,
bool);
1689static decl_base_sptr handle_function_decl(reader&, xmlNodePtr,
bool);
1690static decl_base_sptr handle_class_decl(reader&, xmlNodePtr,
bool);
1691static decl_base_sptr handle_union_decl(reader&, xmlNodePtr,
bool);
1692static decl_base_sptr handle_function_tdecl(reader&, xmlNodePtr,
bool);
1693static decl_base_sptr handle_class_tdecl(reader&, xmlNodePtr,
bool);
1695#ifdef WITH_SHOW_TYPE_USE_IN_ABILINT
1696#define RECORD_ARTIFACT_AS_USED_BY(rdr, used, user) \
1697 rdr.record_artifact_as_used_by(used,user)
1698#define RECORD_ARTIFACTS_AS_USED_IN_FN_DECL(rdr, fn) \
1699 rdr.record_artifacts_as_used_in_fn_decl(fn)
1700#define RECORD_ARTIFACTS_AS_USED_IN_FN_TYPE(rdr, fn_type)\
1701 rdr.record_artifacts_as_used_in_fn_type(fn_type)
1703#define RECORD_ARTIFACT_AS_USED_BY(rdr, used, user)
1704#define RECORD_ARTIFACTS_AS_USED_IN_FN_DECL(rdr, fn)
1705#define RECORD_ARTIFACTS_AS_USED_IN_FN_TYPE(rdr, fn_type)
1727maybe_look_through_decorating_member_element(xmlNodePtr& node,
1731 && (xmlStrEqual(node->name, BAD_CAST(
"data-member"))
1732 || xmlStrEqual(node->name, BAD_CAST(
"member-type"))
1733 || xmlStrEqual(node->name, BAD_CAST(
"member-function"))
1734 || xmlStrEqual(node->name, BAD_CAST(
"member-template"))
1735 || xmlStrEqual(node->name, BAD_CAST(
"template-parameter-type-composition"))
1736 || xmlStrEqual(node->name, BAD_CAST(
"array-type-def"))))
1738 read_access(node, access);
1739 node = node->parent;
1761 keep_going = maybe_look_through_decorating_member_element(node, access);
1785 xmlNodePtr parent = node->parent;
1787 maybe_get_enclosing_scope(parent, access);
1789 xml_node_decl_base_sptr_map::const_iterator i =
1790 get_xml_node_decl_map().find(parent);
1791 if (i == get_xml_node_decl_map().end())
1793 if (xmlStrEqual(parent->name, BAD_CAST(
"abi-instr")))
1796 get_or_read_and_add_translation_unit(*
this, parent);
1797 return tu->get_global_scope();
1799 else if (xmlStrEqual(parent->name, BAD_CAST(
"abi-types")))
1802 return tu->get_global_scope();
1807 push_decl(parent_scope);
1815 && xmlStrEqual(parent->name, BAD_CAST(
"function-decl"))
1816 && xmlStrEqual(parent->parent->name, BAD_CAST(
"member-function")))
1820 scope = build_member_function_decl(*
this, parent->parent, klass,
1831 pop_scope_or_abort(parent_scope);
1834 scope = dynamic_pointer_cast<scope_decl>(i->second);
1849reader::get_scope_for_node(xmlNodePtr node)
1852 return get_scope_for_node(node, access);
1865reader::get_scope_ptr_for_node(xmlNodePtr node)
1885 type_base_sptr t = get_type_decl(
id);
1889 xmlNodePtr n = get_xml_node_from_id(
id);
1896 scope = get_scope_for_node(n, access);
1904 if ((t = get_type_decl(
id)))
1922 pop_scope_or_abort(scope);
1924 schedule_type_for_canonicalization(t);
1936advance_cursor(reader& rdr)
1939 return xmlTextReaderRead(reader.get());
1951walk_xml_node_to_map_type_ids(reader& rdr,
1954 xmlNodePtr n = node;
1956 if (!n || n->type != XML_ELEMENT_NODE)
1961 string id = CHAR_STR(s);
1962 rdr.map_id_and_node(
id, n);
1965 for (n = xmlFirstElementChild(n); n; n = xmlNextElementSibling(n))
1966 walk_xml_node_to_map_type_ids(rdr, n);
1970read_translation_unit(fe_iface& iface, translation_unit& tu, xmlNodePtr node)
1972 abixml::reader& rdr =
dynamic_cast<abixml::reader&
>(iface);
1974 if (!rdr.corpus()->is_empty())
1975 tu.set_corpus(rdr.corpus().get());
1981 char address_size = atoi(
reinterpret_cast<char*
>(addrsize_str.get()));
1982 tu.set_address_size(address_size);
1987 tu.set_path(
reinterpret_cast<char*
>(path_str.get()));
1991 if (comp_dir_path_str)
1992 tu.set_compilation_dir_path(
reinterpret_cast<char*
>
1993 (comp_dir_path_str.get()));
1998 (
reinterpret_cast<char*
>(language_str.get())));
2003 rdr.push_decl(tu.get_global_scope());
2004 rdr.map_xml_node_to_decl(node, tu.get_global_scope());
2006 if (rdr.get_id_xml_node_map().empty()
2008 walk_xml_node_to_map_type_ids(rdr, node);
2010 if (rdr.get_abi_types_node())
2012 for (xmlNodePtr n = xmlFirstElementChild(rdr.get_abi_types_node());
2014 n = xmlNextElementSibling(n))
2015 handle_element_node(rdr, n,
true);
2017 rdr.set_abi_types_node(
nullptr);
2020 for (xmlNodePtr n = xmlFirstElementChild(node);
2022 n = xmlNextElementSibling(n))
2023 handle_element_node(rdr, n,
true);
2025 rdr.pop_scope_or_abort(tu.get_global_scope());
2048get_or_read_and_add_translation_unit(reader& rdr, xmlNodePtr node)
2050 corpus_sptr corp = rdr.corpus();
2056 if (corp && !corp->is_empty())
2059 tu_path =
reinterpret_cast<char*
>(path_str.get());
2060 tu = corp->find_translation_unit(tu_path);
2065 tu.reset(
new translation_unit(rdr.get_environment(), tu_path));
2066 if (corp && !corp->is_empty())
2068 rdr.set_translation_unit(tu.get());
2070 if (read_translation_unit(rdr, *tu, node))
2082go_to_abi_types_node_from_input(fe_iface& iface)
2084 abixml::reader& rdr =
dynamic_cast<abixml::reader&
>(iface);
2086 xmlNodePtr node =
nullptr;
2088 for (xmlNodePtr n = rdr.get_corpus_node();
2090 n = xmlNextElementSibling(n))
2092 if (!xmlStrEqual(n->name, BAD_CAST(
"abi-types")))
2110read_translation_unit_from_input(fe_iface& iface)
2114 abixml::reader& rdr =
dynamic_cast<abixml::reader&
>(iface);
2116 xmlNodePtr node = rdr.get_corpus_node();
2127 status = advance_cursor (rdr);
2130 BAD_CAST(
"abi-instr")))
2133 node = xmlTextReaderExpand(reader.get());
2140 for (xmlNodePtr n = rdr.get_corpus_node();
2142 n = xmlNextElementSibling(n))
2144 if (!xmlStrEqual(n->name, BAD_CAST(
"abi-instr")))
2154 tu = get_or_read_and_add_translation_unit(rdr, node);
2156 if (rdr.get_corpus_node())
2162 node = xmlNextElementSibling(node);
2163 rdr.set_corpus_node(node);
2216read_symbol_db_from_input(reader& rdr,
2226 if (!rdr.get_corpus_node())
2232 status = advance_cursor (rdr);
2237 bool has_fn_syms =
false, has_undefined_fn_syms =
false,
2238 has_var_syms =
false, has_undefined_var_syms =
false;
2240 BAD_CAST(
"elf-function-symbols")))
2243 BAD_CAST(
"elf-variable-symbols")))
2244 has_var_syms =
true;
2246 BAD_CAST(
"undefined-elf-function-symbols")))
2247 has_undefined_fn_syms =
true;
2249 BAD_CAST(
"undefined-elf-variable-symbols")))
2250 has_undefined_var_syms =
true;
2254 xmlNodePtr node = xmlTextReaderExpand(reader.get());
2259 build_elf_symbol_db(rdr, node,
true, fn_symdb,
2260 non_resolved_fn_syms_aliases);
2261 else if (has_undefined_fn_syms)
2262 build_elf_symbol_db(rdr, node,
true, fn_symdb,
2263 non_resolved_fn_syms_aliases);
2264 else if (has_var_syms)
2265 build_elf_symbol_db(rdr, node,
false, var_symdb,
2266 non_resolved_var_syms_aliases);
2267 else if (has_undefined_var_syms)
2268 build_elf_symbol_db(rdr, node,
false, var_symdb,
2269 non_resolved_var_syms_aliases);
2271 xmlTextReaderNext(reader.get());
2274 for (xmlNodePtr n = rdr.get_corpus_node(); n; n = xmlNextElementSibling(n))
2276 bool has_fn_syms =
false, has_undefined_fn_syms =
false,
2277 has_var_syms =
false, has_undefined_var_syms =
false;
2278 if (xmlStrEqual(n->name, BAD_CAST(
"elf-function-symbols")))
2280 else if (xmlStrEqual(n->name, BAD_CAST(
"undefined-elf-function-symbols")))
2281 has_undefined_fn_syms =
true;
2282 else if (xmlStrEqual(n->name, BAD_CAST(
"elf-variable-symbols")))
2283 has_var_syms =
true;
2284 else if (xmlStrEqual(n->name,
2285 BAD_CAST(
"undefined-elf-variable-symbols")))
2286 has_undefined_var_syms =
true;
2289 rdr.set_corpus_node(n);
2294 build_elf_symbol_db(rdr, n,
true, fn_symdb,
2295 non_resolved_fn_syms_aliases);
2296 else if (has_undefined_fn_syms)
2297 build_elf_symbol_db(rdr, n,
true, fn_symdb,
2298 non_resolved_fn_syms_aliases);
2299 else if (has_var_syms)
2300 build_elf_symbol_db(rdr, n,
false, var_symdb,
2301 non_resolved_var_syms_aliases);
2302 else if (has_undefined_var_syms)
2303 build_elf_symbol_db(rdr, n,
false, var_symdb,
2304 non_resolved_var_syms_aliases);
2323build_needed(xmlNode* node, vector<string>& needed)
2325 if (!node || !xmlStrEqual(node->name,BAD_CAST(
"elf-needed")))
2328 for (xmlNodePtr n = xmlFirstElementChild(node);
2330 n = xmlNextElementSibling(n))
2332 if (!xmlStrEqual(n->name, BAD_CAST(
"dependency")))
2340 needed.push_back(name);
2356read_elf_needed_from_input(reader& rdr,
2357 vector<string>& needed)
2363 xmlNodePtr node = 0;
2365 if (rdr.get_corpus_node() == 0)
2370 status = advance_cursor (rdr);
2376 BAD_CAST(
"elf-needed")))
2379 node = xmlTextReaderExpand(reader.get());
2385 for (xmlNodePtr n = rdr.get_corpus_node();
2387 n = xmlNextElementSibling(n))
2389 if (!xmlStrEqual(n->name, BAD_CAST(
"elf-needed")))
2396 bool result =
false;
2399 result = build_needed(node, needed);
2400 node = xmlNextElementSibling(node);
2401 rdr.set_corpus_node(node);
2436 for (suppr::suppressions_type::const_iterator i = supprs.begin();
2439 if ((*i)->get_drops_artifact_from_ir())
2440 rdr.suppressions().push_back(*i);
2454 abixml::reader& rdr =
dynamic_cast<abixml::reader&
>(iface);
2455 rdr.tracking_non_reachable_types(flag);
2458#ifdef WITH_SHOW_TYPE_USE_IN_ABILINT
2467vector<type_base_sptr>*
2468get_types_from_type_id(
fe_iface& iface,
const string& type_id)
2470 reader& rdr =
dynamic_cast<reader&
>(iface);
2471 auto it = rdr.m_types_map.find(type_id);
2472 if (it == rdr.m_types_map.end())
2483unordered_map<type_or_decl_base*, vector<type_or_decl_base*>>*
2484get_artifact_used_by_relation_map(fe_iface& iface)
2486 reader& rdr =
dynamic_cast<reader&
>(iface);
2487 return &rdr.m_artifact_used_by_map;
2507 string version_string;
2512 if (version_string.empty())
2519 corp.set_format_major_version_number(v[0]);
2520 corp.set_format_minor_version_number(v[1]);
2533 corpus_group_sptr nil;
2535 abixml::reader& rdr =
dynamic_cast<abixml::reader&
>(iface);
2544 status = advance_cursor (rdr);
2547 BAD_CAST(
"abi-corpus-group")))
2552 if (!rdr.corpus_group())
2554 corpus_group_sptr g(
new corpus_group(rdr.get_environment(),
2556 g->set_origin(corpus::NATIVE_XML_ORIGIN);
2557 rdr.corpus_group(g);
2560 corpus_group_sptr group = rdr.corpus_group();
2562 handle_version_attribute(reader, *group);
2566 group->set_path(
reinterpret_cast<char*
>(path_str.get()));
2570 std::cerr <<
"ABIXML Reader: reading corpus group : '"
2571 << group->get_path()
2576 xmlNodePtr node = xmlTextReaderExpand(reader.get());
2580 node = xmlFirstElementChild(node);
2581 rdr.set_corpus_node(node);
2585 while ((corp = rdr.read_corpus(sts)))
2587 rdr.corpus_group()->add_corpus(corp);
2588 node = xmlNextElementSibling(node);
2589 if (!node || !xmlStrEqual(node->name, BAD_CAST(
"abi-corpus")))
2592 rdr.set_corpus_node(node);
2595 xmlTextReaderNext(reader.get());
2600 std::cerr <<
"ABIXML Reader: Read corpus group : "
2601 << group->get_path()
2602 <<
" in: " << t <<
"\n";
2605 return rdr.corpus_group();
2716 rdr.options() = opts;
2718 rdr.perform_type_canonicalization();
2759 rdr.options() = opts;
2761 rdr.perform_type_canonicalization();
2775 abixml::reader& rdr =
dynamic_cast<abixml::reader&
>(iface);
2777 rdr.perform_type_canonicalization();
2790handle_element_node(reader& rdr, xmlNodePtr node,
2791 bool add_to_current_scope)
2797 ((decl = handle_namespace_decl(rdr, node, add_to_current_scope))
2798 ||(decl = handle_type_decl(rdr, node, add_to_current_scope))
2799 ||(decl = handle_qualified_type_decl(rdr, node,
2800 add_to_current_scope))
2801 ||(decl = handle_pointer_type_def(rdr, node,
2802 add_to_current_scope))
2803 || (decl = handle_reference_type_def(rdr, node, add_to_current_scope))
2804 || (decl = handle_function_decl(rdr, node, add_to_current_scope))
2805 || (decl = handle_function_type(rdr, node, add_to_current_scope))
2806 || (decl = handle_array_type_def(rdr, node, add_to_current_scope))
2807 || (decl = handle_enum_type_decl(rdr, node,
2808 add_to_current_scope))
2809 || (decl = handle_typedef_decl(rdr, node,
2810 add_to_current_scope))
2811 || (decl = handle_var_decl(rdr, node,
2812 add_to_current_scope))
2813 || (decl = handle_class_decl(rdr, node,
2814 add_to_current_scope))
2815 || (decl = handle_union_decl(rdr, node,
2816 add_to_current_scope))
2817 || (decl = handle_function_tdecl(rdr, node,
2818 add_to_current_scope))
2819 || (decl = handle_class_tdecl(rdr, node,
2820 add_to_current_scope)));
2825 if (rdr.tracking_non_reachable_types())
2827 if (type_base_sptr t =
is_type(decl))
2829 corpus_sptr abi = rdr.corpus();
2831 bool is_non_reachable_type =
false;
2833 read_is_non_reachable_type(node, is_non_reachable_type);
2848read_location(
const reader& rdr,
2853 size_t line = 0, column = 0;
2855 if (xml_char_sptr f = xml::build_sptr(xmlGetProp(node, BAD_CAST(
"filepath"))))
2856 file_path = CHAR_STR(f);
2858 if (file_path.empty())
2859 return read_artificial_location(rdr, node, loc);
2861 if (xml_char_sptr l = xml::build_sptr(xmlGetProp(node, BAD_CAST(
"line"))))
2862 line = atoi(CHAR_STR(l));
2864 return read_artificial_location(rdr, node, loc);
2866 if (xml_char_sptr c = xml::build_sptr(xmlGetProp(node, BAD_CAST(
"column"))))
2867 column = atoi(CHAR_STR(c));
2869 reader& c =
const_cast<reader&
>(rdr);
2870 loc = c.get_translation_unit()->get_loc_mgr().create_new_location(file_path,
2889read_artificial_location(
const reader& rdr, xmlNodePtr node, location& loc)
2895 size_t line = 0, column = 0;
2897 line = xmlGetLineNo(node);
2899 if (line == (
size_t) -1)
2904 file_path =
reinterpret_cast<const char*
>(node->doc->URL);
2906 reader& c =
const_cast<reader&
>(rdr);
2908 c.get_translation_unit()->get_loc_mgr().create_new_location(file_path,
2910 loc.set_artificial(line);
2931maybe_set_artificial_location(
const reader& rdr,
2935 if (artefact && !artefact->has_artificial_location())
2938 if (read_artificial_location(rdr, node, l))
2940 artefact->set_artificial_location(l);
2959 string v = CHAR_STR(s);
2962 vis = decl_base::VISIBILITY_DEFAULT;
2963 else if (v ==
"hidden")
2964 vis = decl_base::VISIBILITY_HIDDEN;
2965 else if (v ==
"internal")
2966 vis = decl_base::VISIBILITY_INTERNAL;
2967 else if (v ==
"protected")
2968 vis = decl_base::VISIBILITY_PROTECTED;
2970 vis = decl_base::VISIBILITY_DEFAULT;
2988 string b = CHAR_STR(s);
2991 bind = decl_base::BINDING_GLOBAL;
2992 else if (b ==
"local")
2993 bind = decl_base::BINDING_LOCAL;
2994 else if (b ==
"weak")
2995 bind = decl_base::BINDING_WEAK;
2997 bind = decl_base::BINDING_GLOBAL;
3016 string a = CHAR_STR(s);
3019 access = private_access;
3020 else if (a ==
"protected")
3021 access = protected_access;
3022 else if (a ==
"public")
3023 access = public_access;
3051read_size_and_alignment(xmlNodePtr node,
3052 size_t& size_in_bits,
3053 size_t& align_in_bits)
3056 bool got_something =
false;
3059 size_in_bits = atoll(CHAR_STR(s));
3060 got_something =
true;
3065 align_in_bits = atoll(CHAR_STR(s));
3066 got_something =
true;
3068 return got_something;
3081read_static(xmlNodePtr node,
bool& is_static)
3085 string b = CHAR_STR(s);
3086 is_static = b ==
"yes";
3099read_offset_in_bits(xmlNodePtr node,
3100 size_t& offset_in_bits)
3104 offset_in_bits = strtoull(CHAR_STR(s), 0, 0);
3132read_cdtor_const(xmlNodePtr node,
3133 bool& is_constructor,
3134 bool& is_destructor,
3139 string b = CHAR_STR(s);
3141 is_constructor =
true;
3143 is_constructor =
false;
3150 string b = CHAR_STR(s);
3152 is_destructor =
true;
3154 is_destructor =
false;
3161 string b = CHAR_STR(s);
3182read_is_declaration_only(xmlNodePtr node,
bool& is_decl_only)
3186 string str = CHAR_STR(s);
3188 is_decl_only =
true;
3190 is_decl_only =
false;
3206read_is_artificial(xmlNodePtr node,
bool& is_artificial)
3210 string is_artificial_str = CHAR_STR(s) ? CHAR_STR(s) :
"";
3211 is_artificial = is_artificial_str ==
"yes";
3230read_tracking_non_reachable_types(xmlNodePtr node,
3231 bool& tracking_non_reachable_types)
3233 if (xml_char_sptr s =
3236 string tracking_non_reachable_types_str = CHAR_STR(s) ? CHAR_STR(s) :
"";
3237 tracking_non_reachable_types =
3238 (tracking_non_reachable_types_str ==
"yes")
3257read_is_non_reachable_type(xmlNodePtr node,
bool& is_non_reachable_type)
3259 if (xml_char_sptr s =
3262 string is_non_reachable_type_str = CHAR_STR(s) ? CHAR_STR(s) :
"";
3263 is_non_reachable_type =
3264 (is_non_reachable_type_str ==
"yes")
3282read_naming_typedef_id_string(xmlNodePtr node,
3283 vector<string>& naming_typedef_ids)
3288 vector<string> parts;
3290 for (
auto s : parts)
3291 naming_typedef_ids.push_back(s);
3306read_is_virtual(xmlNodePtr node,
bool& is_virtual)
3310 string str = CHAR_STR(s);
3330read_vtable_offset(xmlNodePtr node, ssize_t& vtable_offset)
3332 if (xml_char_sptr s =
3335 vtable_offset = atoi(CHAR_STR(s));
3350read_is_struct(xmlNodePtr node,
bool& is_struct)
3354 string str = CHAR_STR(s);
3373read_is_anonymous(xmlNodePtr node,
bool& is_anonymous)
3377 string str = CHAR_STR(s);
3378 is_anonymous = (str ==
"yes");
3455read_type_id_string(xmlNodePtr node,
string& type_id)
3459 type_id = CHAR_STR(s);
3478node_is_member_function(xmlNodePtr node,
3479 xmlNodePtr& parent_class_node)
3481 if (!node || xmlStrcmp(node->name, (xmlChar*)
"function-decl"))
3484 xmlNodePtr parent = node->parent;
3485 if (!parent || xmlStrcmp(parent->name, (xmlChar*)
"member-function"))
3488 parent = parent->parent;
3490 || (xmlStrcmp(parent->name, (xmlChar*)
"class-decl")
3491 && xmlStrcmp(parent->name, (xmlChar*)
"union-decl")))
3494 parent_class_node = parent;
3511 if (read_type_id_string(node, s))
3527read_name(xmlNodePtr node,
string& name)
3553read_type_hash_and_cti(xmlNodePtr node, uint64_t& hash, uint64_t& cti)
3557 string str = CHAR_STR(s);
3558 vector<string> parts;
3560 if (!parts.empty() && !parts.front().empty())
3563 if (parts.size() > 1)
3564 cti = atoll(parts[1].c_str());
3579read_artifact_native_offset(xmlNodePtr node, uint64_t& offset)
3583 string str = CHAR_STR(s);
3584 char *endptr =
nullptr;
3585 uint64_t off = strtoull(str.c_str(), &endptr, 16);
3586 if (*endptr ==
'\0')
3607 if (read_artifact_native_offset(node, o))
3609 artifact->set_native_offset(o);
3610 return artifact->get_native_offset();
3625read_common_type_info(reader& rdr, xmlNodePtr node, type_base_sptr type)
3630 rdr.read_hash_and_stash(node, type);
3631 read_artifact_native_offset(node, type);
3632 maybe_set_artificial_location(rdr, node, type);
3634#ifdef WITH_DEBUG_SELF_COMPARISON
3649maybe_map_type_with_type_id(
const type_base_sptr& t,
3650 const string& type_id)
3655 const environment& env = t->get_environment();
3656 if (!env.self_comparison_debug_is_on()
3660 const_cast<environment&
>(env).
3661 get_pointer_type_id_map()[
reinterpret_cast<uintptr_t
>(t.get())] = type_id;
3680maybe_map_type_with_type_id(
const type_base_sptr& t,
3686 const environment&env = t->get_environment();
3687 if (!env.self_comparison_debug_is_on()
3692 if (!read_type_id_string(node, type_id) || type_id.empty())
3695 return maybe_map_type_with_type_id(t, type_id);
3709maybe_set_naming_typedefs(reader& rdr,
3711 const decl_base_sptr& decl)
3713 vector<string> naming_typedef_ids;
3714 read_naming_typedef_id_string(node, naming_typedef_ids);
3715 for (
auto naming_typedef_id : naming_typedef_ids)
3718 is_typedef(rdr.build_or_get_type_decl(naming_typedef_id,
true));
3720 decl->add_naming_typedef(naming_typedef);
3740build_namespace_decl(reader& rdr,
3741 const xmlNodePtr node,
3742 bool add_to_current_scope)
3745 if (!node || !xmlStrEqual(node->name, BAD_CAST(
"namespace-decl")))
3748 if (decl_base_sptr d = rdr.get_decl_for_xml_node(node))
3760 read_location(rdr, node, loc);
3762 const environment& env = rdr.get_environment();
3764 maybe_set_artificial_location(rdr, node, decl);
3765 rdr.push_decl_to_scope(decl,
3766 add_to_current_scope
3767 ? rdr.get_scope_ptr_for_node(node)
3769 rdr.map_xml_node_to_decl(node, decl);
3771 for (xmlNodePtr n = xmlFirstElementChild(node);
3773 n = xmlNextElementSibling(n))
3774 handle_element_node(rdr, n,
true);
3776 rdr.pop_scope_or_abort(decl);
3793build_elf_symbol(reader& rdr,
const xmlNodePtr node,
3794 bool drop_if_suppressed)
3799 || node->type != XML_ELEMENT_NODE
3800 || !xmlStrEqual(node->name, BAD_CAST(
"elf-symbol")))
3809 size = strtol(CHAR_STR(s), NULL, 0);
3811 bool is_defined =
true;
3816 if (value ==
"true" || value ==
"yes")
3822 bool is_common =
false;
3827 if (value ==
"true" || value ==
"yes")
3833 string version_string;
3837 bool is_default_version =
false;
3842 if (value ==
"true" || value ==
"yes")
3843 is_default_version =
true;
3847 read_elf_symbol_type(node, type);
3850 read_elf_symbol_binding(node, binding);
3853 read_elf_symbol_visibility(node, visibility);
3855 elf_symbol::version version(version_string, is_default_version);
3858 if (drop_if_suppressed && is_suppressed)
3861 const environment& env = rdr.get_environment();
3863 size, name, type, binding,
3864 is_defined, is_common,
3865 version, visibility);
3867 e->set_is_suppressed(is_suppressed);
3870 e->set_crc(strtoull(CHAR_STR(s), NULL, 0));
3876 e->set_namespace(ns);
3896build_elf_symbol_from_reference(reader& rdr,
const xmlNodePtr node)
3915 if (rdr.corpus()->get_symtab())
3918 rdr.corpus()->get_symtab()->lookup_symbol(name);
3920 for (
const auto& symbol : symbols)
3921 if (symbol->get_id_string() == sym_id)
3954build_elf_symbol_db(reader& rdr,
3955 const xmlNodePtr node,
3966 && !xmlStrEqual(node->name, BAD_CAST(
"elf-function-symbols"))
3967 && !xmlStrEqual(node->name, BAD_CAST(
"undefined-elf-function-symbols")))
3971 && !xmlStrEqual(node->name, BAD_CAST(
"elf-variable-symbols"))
3972 && !xmlStrEqual(node->name, BAD_CAST(
"undefined-elf-variable-symbols")))
3975 rdr.set_corpus_node(node);
3977 typedef std::unordered_map<xmlNodePtr, elf_symbol_sptr>
3978 xml_node_ptr_elf_symbol_sptr_map_type;
3979 xml_node_ptr_elf_symbol_sptr_map_type xml_node_ptr_elf_symbol_map;
3982 for (xmlNodePtr n = xmlFirstElementChild(node);
3984 n = xmlNextElementSibling(n))
3985 if ((sym = build_elf_symbol(rdr, n,
false)))
3987 id_sym_map[sym->get_id_string()] = sym;
3988 xml_node_ptr_elf_symbol_map[n] = sym;
3991 if (id_sym_map.empty())
3994 string_elf_symbols_map_type::iterator it;
3995 for (string_elf_symbol_sptr_map_type::const_iterator i = id_sym_map.begin();
3996 i != id_sym_map.end();
3998 (*map)[i->second->get_name()].push_back(i->second);
4001 for (xml_node_ptr_elf_symbol_sptr_map_type::const_iterator x =
4002 xml_node_ptr_elf_symbol_map.begin();
4003 x != xml_node_ptr_elf_symbol_map.end();
4008 string alias_id = CHAR_STR(s);
4011 std::vector<std::string> elems;
4012 std::stringstream aliases(alias_id);
4014 while (std::getline(aliases, item,
','))
4015 elems.push_back(item);
4016 for (std::vector<string>::iterator alias = elems.begin();
4017 alias != elems.end(); ++alias)
4019 string_elf_symbol_sptr_map_type::const_iterator i =
4020 id_sym_map.find(*alias);
4021 if (i == id_sym_map.end())
4027 non_resolved_aliases[x->second->get_name()].push_back(*alias);
4031 x->second->get_main_symbol()->add_alias(i->second);
4069 for (
auto& entry : non_resolved_fn_sym_aliases)
4071 auto i = fn_syms->find(entry.first);
4076 sym = sym->get_main_symbol();
4078 for (
string& alias : entry.second)
4080 auto fn_a = fn_syms->find(alias);
4081 if (fn_a == fn_syms->end())
4085 auto var_a = var_syms->find(alias);
4087 alias_sym = var_a->second.front();
4092 alias_sym = fn_a->second.front();
4095 sym->add_alias(alias_sym);
4099 for (
auto& entry : non_resolved_var_sym_aliases)
4101 auto i = var_syms->find(entry.first);
4106 sym = sym->get_main_symbol();
4108 for (
string& alias : entry.second)
4110 auto var_a = var_syms->find(alias);
4111 if (var_a == var_syms->end())
4115 auto fn_a = fn_syms->find(alias);
4117 alias_sym = fn_a->second.front();
4122 alias_sym = var_a->second.front();
4125 sym->add_alias(alias_sym);
4135static shared_ptr<function_decl::parameter>
4136build_function_parameter(reader& rdr,
const xmlNodePtr node)
4138 shared_ptr<function_decl::parameter> nil;
4140 if (!node || !xmlStrEqual(node->name, BAD_CAST(
"parameter")))
4143 bool is_variadic =
false;
4144 string is_variadic_str;
4145 if (xml_char_sptr s =
4146 xml::build_sptr(xmlGetProp(node, BAD_CAST(
"is-variadic"))))
4148 is_variadic_str = CHAR_STR(s) ? CHAR_STR(s) :
"";
4149 is_variadic = is_variadic_str ==
"yes";
4152 bool is_artificial =
false;
4153 read_is_artificial(node, is_artificial);
4156 if (xml_char_sptr a = xml::build_sptr(xmlGetProp(node, BAD_CAST(
"type-id"))))
4157 type_id = CHAR_STR(a);
4159 type_base_sptr type;
4161 type =
is_type(build_ir_node_for_variadic_parameter_type(rdr));
4165 type = rdr.build_or_get_type_decl(type_id,
true);
4170 if (xml_char_sptr a = xml::build_sptr(xmlGetProp(node, BAD_CAST(
"name"))))
4174 read_location(rdr, node, loc);
4177 (
new function_decl::parameter(type, name, loc,
4178 is_variadic, is_artificial));
4206build_function_decl(reader& rdr,
4207 const xmlNodePtr node,
4208 class_or_union_sptr as_method_decl,
4209 bool add_to_current_scope,
4210 bool add_to_exported_decls)
4214 if (!xmlStrEqual(node->name, BAD_CAST(
"function-decl")))
4217 xmlNodePtr parent_class_node;
4218 string parent_class_id;
4219 if (!as_method_decl && node_is_member_function(node, parent_class_node))
4223 read_type_id_string(parent_class_node, parent_class_id);
4229 string mangled_name;
4233 if (!as_method_decl && add_to_exported_decls)
4237 as_method_decl = class_scope;
4240 if (!as_method_decl && !parent_class_id.empty())
4247 && !mangled_name.empty()
4248 && as_method_decl->find_member_function_sptr(mangled_name))
4251 as_method_decl->find_member_function_sptr(mangled_name);
4258 inline_prop = CHAR_STR(s);
4259 bool declared_inline = inline_prop ==
"yes";
4262 read_visibility(node, vis);
4265 read_binding(node, bind);
4267 size_t size = rdr.get_translation_unit()->get_address_size(), align = 0;
4268 read_size_and_alignment(node, size, align);
4271 read_location(rdr, node, loc);
4273 vector<decl_base_sptr> member_decls;
4276 type_id = CHAR_STR(s);
4279 if (!type_id.empty())
4287 fn_type = build_function_type(rdr, node, as_method_decl, member_decls,
4291 fn_type->set_is_artificial(
true);
4292 read_common_type_info(rdr, node, fn_type);
4296 ?
new method_decl (name, fn_type,
4297 declared_inline, loc,
4298 mangled_name, vis, bind)
4299 : new function_decl(name, fn_type,
4300 declared_inline, loc,
4304 maybe_set_artificial_location(rdr, node, fn_decl);
4305 if (add_to_current_scope)
4308 rdr.push_decl_to_scope(fn_decl, as_method_decl);
4310 rdr.push_decl_to_scope(fn_decl, node);
4313 RECORD_ARTIFACTS_AS_USED_IN_FN_DECL(rdr, fn_decl);
4314 for (
const auto& member_decl : member_decls)
4319 fn_decl->set_symbol(sym);
4321 if (fn_decl->get_symbol() && fn_decl->get_symbol()->is_public())
4322 fn_decl->set_is_in_public_symbol_table(
true);
4324 rdr.schedule_type_for_canonicalization(fn_type);
4326 if (add_to_exported_decls)
4327 rdr.add_fn_to_exported_or_undefined_decls(fn_decl.get(),
4349static method_decl_sptr
4350build_member_function_decl(reader& rdr,
4351 const xmlNodePtr node,
4352 class_or_union_sptr klass,
4353 bool add_to_current_scope,
4354 bool add_to_exported_decls)
4356 method_decl_sptr result;
4358 if (!node || !klass)
4361 if (!xmlStrEqual(node->name, BAD_CAST(
"member-function")))
4373 read_access(node, access);
4375 bool is_virtual =
false;
4376 ssize_t vtable_offset = -1;
4377 if (xml_char_sptr s =
4381 vtable_offset = atoi(CHAR_STR(s));
4384 bool is_static =
false;
4385 read_static(node, is_static);
4387 bool is_ctor =
false, is_dtor =
false, is_const =
false;
4388 read_cdtor_const(node, is_ctor, is_dtor, is_const);
4390 for (xmlNodePtr p = xmlFirstElementChild(node);
4392 p = xmlNextElementSibling(p))
4395 build_function_decl_if_not_suppressed(rdr, p, klass,
4396 add_to_current_scope,
4397 add_to_exported_decls))
4401 if (add_to_current_scope)
4411 rdr.map_xml_node_to_decl(p, m);
4446build_function_decl_if_not_suppressed(reader& rdr,
4447 const xmlNodePtr node,
4448 class_or_union_sptr as_method_decl,
4449 bool add_to_current_scope,
4450 bool add_to_exported_decls)
4454 if (function_is_suppressed(rdr, node))
4460 fn = build_function_decl(rdr, node, as_method_decl,
4461 add_to_current_scope,
4462 add_to_exported_decls);
4478function_is_suppressed(
const reader& rdr, xmlNodePtr node)
4484 string flinkage_name;
4488 auto scope = rdr.get_cur_scope();
4507type_is_suppressed(
const reader& rdr, xmlNodePtr node)
4513 location type_location;
4514 read_location(rdr, node, type_location);
4516 auto scope = rdr.get_cur_scope();
4520 bool type_is_private =
false;
4539build_var_decl_if_not_suppressed(reader& rdr,
4540 const xmlNodePtr node,
4541 bool add_to_current_scope)
4544 if (!variable_is_suppressed(rdr, node))
4545 var = build_var_decl(rdr, node, add_to_current_scope);
4558variable_is_suppressed(
const reader& rdr, xmlNodePtr node)
4564 string linkage_name;
4568 auto scope = rdr.get_cur_scope();
4586variable_is_suppressed(
const reader& rdr,
4592 v.get_linkage_name());
4604build_var_decl(reader& rdr,
4605 const xmlNodePtr node,
4606 bool add_to_current_scope)
4610 if (!xmlStrEqual(node->name, BAD_CAST(
"var-decl")))
4619 type_id = CHAR_STR(s);
4620 type_base_sptr underlying_type = rdr.build_or_get_type_decl(type_id,
4624 string mangled_name;
4629 read_visibility(node, vis);
4632 read_binding(node, bind);
4635 read_location(rdr, node, locus);
4638 locus, mangled_name,
4640 maybe_set_artificial_location(rdr, node, decl);
4644 decl->set_symbol(sym);
4646 rdr.push_decl_to_scope(decl,
4647 add_to_current_scope
4648 ? rdr.get_scope_ptr_for_node(node)
4650 if (add_to_current_scope)
4654 RECORD_ARTIFACT_AS_USED_BY(rdr, underlying_type, decl);
4657 if (decl->get_symbol() && decl->get_symbol()->is_public())
4658 decl->set_is_in_public_symbol_table(
true);
4668static decl_base_sptr
4669build_ir_node_for_void_type(reader& rdr)
4671 const environment& env = rdr.get_environment();
4673 type_base_sptr t = env.get_void_type();
4677 rdr.get_translation_unit()->get_global_scope());
4678 rdr.schedule_type_for_canonicalization(t);
4681 return type_declaration;
4695static decl_base_sptr
4696build_ir_node_for_void_pointer_type(reader& rdr)
4698 const environment& env = rdr.get_environment();
4700 type_base_sptr t = env.get_void_pointer_type();
4704 rdr.get_translation_unit()->get_global_scope());
4705 rdr.schedule_type_for_canonicalization(t);
4708 return type_declaration;
4716static decl_base_sptr
4717build_ir_node_for_variadic_parameter_type(reader& rdr)
4719 const environment& env = rdr.get_environment();
4721 type_base_sptr t = env.get_variadic_parameter_type();
4725 rdr.get_translation_unit()->get_global_scope());
4726 rdr.schedule_type_for_canonicalization(t);
4729 return type_declaration;
4744build_type_decl(reader& rdr,
4745 const xmlNodePtr node,
4746 bool add_to_current_scope)
4748 shared_ptr<type_decl> nil;
4750 if (!xmlStrEqual(node->name, BAD_CAST(
"type-decl")))
4753 if (decl_base_sptr d = rdr.get_decl_for_xml_node(node))
4769 size_t size_in_bits= 0;
4771 size_in_bits = atoi(CHAR_STR(s));
4773 size_t alignment_in_bits = 0;
4775 alignment_in_bits = atoi(CHAR_STR(s));
4777 bool is_decl_only =
false;
4778 read_is_declaration_only(node, is_decl_only);
4781 read_location(rdr, node, loc);
4783 bool is_anonymous =
false;
4784 read_is_anonymous(node, is_anonymous);
4786 if (type_base_sptr d = rdr.get_type_decl(
id))
4794 ABG_ASSERT(ty->get_size_in_bits() == size_in_bits);
4795 ABG_ASSERT(ty->get_alignment_in_bits() == alignment_in_bits);
4799 const environment& env = rdr.get_environment();
4801 if (name == env.get_variadic_parameter_type_name())
4802 decl =
is_type_decl(build_ir_node_for_variadic_parameter_type(rdr));
4803 else if (name ==
"void")
4806 decl.reset(
new type_decl(env, name, size_in_bits,
4807 alignment_in_bits, loc));
4809 decl->set_is_anonymous(is_anonymous);
4810 decl->set_is_declaration_only(is_decl_only);
4812 read_common_type_info(rdr, node,
is_type(decl));
4814 if (rdr.push_and_key_type_decl(decl, node, add_to_current_scope))
4816 rdr.map_xml_node_to_decl(node, decl);
4834static qualified_type_def_sptr
4835build_qualified_type_decl(reader& rdr,
4836 const xmlNodePtr node,
4837 bool add_to_current_scope)
4839 qualified_type_def_sptr nil;
4840 if (!xmlStrEqual(node->name, BAD_CAST(
"qualified-type-def")))
4843 if (decl_base_sptr d = rdr.get_decl_for_xml_node(node))
4845 qualified_type_def_sptr result =
4846 dynamic_pointer_cast<qualified_type_def>(d);
4858 read_location(rdr, node, loc);
4863 const_str = CHAR_STR(s);
4864 bool const_cv = const_str ==
"yes";
4866 string volatile_str;
4868 volatile_str = CHAR_STR(s);
4869 bool volatile_cv = volatile_str ==
"yes";
4871 string restrict_str;
4873 restrict_str = CHAR_STR(s);
4874 bool restrict_cv = restrict_str ==
"yes";
4877 cv = cv | qualified_type_def::CV_CONST;
4879 cv = cv | qualified_type_def::CV_VOLATILE;
4881 cv = cv | qualified_type_def::CV_RESTRICT;
4885 type_id = CHAR_STR(s);
4888 shared_ptr<type_base> underlying_type =
4889 rdr.build_or_get_type_decl(type_id,
true);
4892 if (type_base_sptr t = rdr.get_type_decl(
id))
4899 qualified_type_def_sptr decl;
4900 if (type_base_sptr t = rdr.get_type_decl(
id))
4907 decl.reset(
new qualified_type_def(underlying_type, cv, loc));
4909 rdr.push_and_key_type_decl(decl, node, add_to_current_scope);
4910 RECORD_ARTIFACT_AS_USED_BY(rdr, underlying_type, decl);
4913 read_common_type_info(rdr, node, decl);
4915 rdr.map_xml_node_to_decl(node, decl);
4932build_pointer_type_def(reader& rdr,
4933 const xmlNodePtr node,
4934 bool add_to_current_scope)
4937 shared_ptr<pointer_type_def> nil;
4939 if (!xmlStrEqual(node->name, BAD_CAST(
"pointer-type-def")))
4942 if (decl_base_sptr d = rdr.get_decl_for_xml_node(node))
4945 dynamic_pointer_cast<pointer_type_def>(d);
4955 if (type_base_sptr t = rdr.get_type_decl(
id))
4964 type_id = CHAR_STR(s);
4966 size_t size_in_bits = rdr.get_translation_unit()->get_address_size();
4967 size_t alignment_in_bits = 0;
4968 read_size_and_alignment(node, size_in_bits, alignment_in_bits);
4970 read_location(rdr, node, loc);
4972 type_base_sptr pointed_to_type =
4973 rdr.build_or_get_type_decl(type_id,
true);
4977 if (type_base_sptr t = rdr.get_type_decl(
id))
4985 if (rdr.get_environment().is_void_type(pointed_to_type))
4993 t.reset(
new pointer_type_def(pointed_to_type,
4998 rdr.push_and_key_type_decl(t, node, add_to_current_scope);
4999 rdr.map_xml_node_to_decl(node, t);
5001 read_common_type_info(rdr, node, t);
5003 RECORD_ARTIFACT_AS_USED_BY(rdr, pointed_to_type, t);
5019static shared_ptr<reference_type_def>
5020build_reference_type_def(reader& rdr,
5021 const xmlNodePtr node,
5022 bool add_to_current_scope)
5024 shared_ptr<reference_type_def> nil;
5026 if (!xmlStrEqual(node->name, BAD_CAST(
"reference-type-def")))
5029 if (decl_base_sptr d = rdr.get_decl_for_xml_node(node))
5032 dynamic_pointer_cast<reference_type_def>(d);
5042 if (type_base_sptr d = rdr.get_type_decl(
id))
5050 read_location(rdr, node, loc);
5054 bool is_lvalue = kind ==
"lvalue";
5056 size_t size_in_bits = rdr.get_translation_unit()->get_address_size();
5057 size_t alignment_in_bits = 0;
5058 read_size_and_alignment(node, size_in_bits, alignment_in_bits);
5062 type_id = CHAR_STR(s);
5066 type_base_sptr pointed_to_type =
5067 rdr.build_or_get_type_decl(type_id,
true);
5072 if (type_base_sptr t = rdr.get_type_decl(
id))
5086 is_lvalue, size_in_bits,
5087 alignment_in_bits, loc));
5089 ABG_ASSERT(rdr.push_and_key_type_decl(t, node, add_to_current_scope));
5090 rdr.map_xml_node_to_decl(node, t);
5092 read_common_type_info(rdr, node, t);
5094 RECORD_ARTIFACT_AS_USED_BY(rdr, pointed_to_type, t);
5112build_ptr_to_mbr_type(reader& rdr,
5113 const xmlNodePtr node,
5114 bool add_to_current_scope)
5118 if (!xmlStrEqual(node->name, BAD_CAST(
"pointer-to-member-type")))
5121 if (decl_base_sptr d = rdr.get_decl_for_xml_node(node))
5135 if (type_base_sptr d = rdr.get_type_decl(
id))
5142 size_t size_in_bits = rdr.get_translation_unit()->get_address_size();
5143 size_t alignment_in_bits = 0;
5144 read_size_and_alignment(node, size_in_bits, alignment_in_bits);
5147 read_location(rdr, node, loc);
5149 string member_type_id;
5151 member_type_id = CHAR_STR(s);
5152 if (member_type_id.empty())
5154 type_base_sptr member_type =
5155 is_type(rdr.build_or_get_type_decl(member_type_id,
true));
5159 if (type_base_sptr t = rdr.get_type_decl(
id))
5166 string containing_type_id;
5168 containing_type_id = CHAR_STR(s);
5169 if (containing_type_id.empty())
5171 type_base_sptr containing_type =
5172 rdr.build_or_get_type_decl(containing_type_id,
true);
5176 if (type_base_sptr t = rdr.get_type_decl(
id))
5183 result.reset(
new ptr_to_mbr_type(rdr.get_environment(),
5184 member_type, containing_type,
5185 size_in_bits, alignment_in_bits,
5188 read_common_type_info(rdr, node, result);
5190 if (rdr.push_and_key_type_decl(result, node, add_to_current_scope))
5191 rdr.map_xml_node_to_decl(node, result);
5212build_function_type(reader& rdr,
5213 const xmlNodePtr node,
5214 class_or_union_sptr as_method_decl,
5215 vector<decl_base_sptr>& member_decls,
5216 bool consider_function_decl)
5219 xmlNodePtr parent_class_node =
nullptr;
5221 if (!xmlStrEqual(node->name, BAD_CAST(
"function-type")))
5223 if (consider_function_decl)
5225 if (!xmlStrEqual(node->name, BAD_CAST(
"function-decl")))
5231 node_is_member_function(node, parent_class_node);
5248 string method_class_id;
5249 bool is_method_t =
false;
5251 if (!as_method_decl)
5254 if (!s && parent_class_node)
5260 method_class_id = CHAR_STR(s);
5261 is_method_t = !method_class_id.empty();
5267 size_t size = rdr.get_translation_unit()->get_address_size(), align = 0;
5268 read_size_and_alignment(node, size, align);
5270 bool is_static =
false;
5272 read_static(node, is_static);
5274 const environment& env = rdr.get_environment();
5275 std::vector<shared_ptr<function_decl::parameter> > parms;
5276 type_base_sptr return_type = env.get_void_type();
5278 class_or_union_sptr method_class_type;
5279 if (is_method_t && !method_class_id.empty())
5287 method_class_type = as_method_decl;
5290 ?
new method_type(method_class_type,
5293 : new function_type(return_type,
5294 parms, size, align));
5296 read_common_type_info(rdr, node, fn_type);
5299 fn_type->set_translation_unit(rdr.get_translation_unit());
5304 m->set_is_static(is_static);
5309 MAYBE_MAP_TYPE_WITH_TYPE_ID(fn_type, node);
5310 rdr.key_type_decl(fn_type,
id);
5312 RECORD_ARTIFACTS_AS_USED_IN_FN_TYPE(rdr, fn_type);
5314 for (xmlNodePtr n = xmlFirstElementChild(node);
5316 n = xmlNextElementSibling(n))
5318 if (xmlStrEqual(n->name, BAD_CAST(
"parameter")))
5321 build_function_parameter(rdr, n))
5324 else if (xmlStrEqual(n->name, BAD_CAST(
"return")))
5327 if (xml_char_sptr s =
5328 xml::build_sptr(xmlGetProp(n, BAD_CAST(
"type-id"))))
5329 type_id = CHAR_STR(s);
5330 type_base_sptr ret_type;
5331 if (!type_id.empty())
5332 ret_type = rdr.build_or_get_type_decl (type_id,
true);
5334 ret_type = return_type;
5335 fn_type->set_return_type(ret_type);
5340 if (decl_base_sptr member_type_decl =
5341 is_decl(handle_element_node(rdr, n,
5343 member_decls.push_back(member_type_decl);
5346 if (!fn_type->get_return_type())
5347 fn_type->set_return_type(return_type);
5349 fn_type->set_parameters(parms);
5351 read_common_type_info(rdr, node, fn_type);
5366build_function_type(reader& rdr,
const xmlNodePtr node,
5367 class_or_union_sptr as_method_decl,
5368 bool consider_function_decl)
5370 vector<decl_base_sptr> member_decls;
5371 return build_function_type(rdr, node, as_method_decl, member_decls,
5372 consider_function_decl);
5386build_subrange_type(reader& rdr,
5387 const xmlNodePtr node,
5388 bool add_to_current_scope)
5392 if (!node || !xmlStrEqual(node->name, BAD_CAST(
"subrange")))
5395 if (decl_base_sptr d = rdr.get_decl_for_xml_node(node))
5398 dynamic_pointer_cast<array_type_def::subrange_type>(d);
5412 if (type_base_sptr d = rdr.get_type_decl(
id))
5423 uint64_t length = 0;
5425 bool is_non_finite =
false;
5428 if (
string(CHAR_STR(s)) ==
"infinite" ||
string(CHAR_STR(s)) ==
"unknown")
5429 is_non_finite =
true;
5431 length = strtoull(CHAR_STR(s), NULL, 0);
5434 uint64_t size_in_bits = 0;
5437 char *endptr =
nullptr;
5438 size_in_bits = strtoull(CHAR_STR(s), &endptr, 0);
5439 if (*endptr !=
'\0')
5441 if (!strcmp(CHAR_STR(s),
"infinite")
5442 ||!strcmp(CHAR_STR(s),
"unknown"))
5443 size_in_bits = (size_t) -1;
5449 int64_t lower_bound = 0, upper_bound = 0;
5450 bool bounds_present =
false;
5453 lower_bound = strtoll(CHAR_STR(s), NULL, 0);
5455 if (!
string(CHAR_STR(s)).empty())
5456 upper_bound = strtoll(CHAR_STR(s), NULL, 0);
5457 bounds_present =
true;
5459 || (length == (uint64_t) upper_bound - lower_bound + 1));
5462 string underlying_type_id;
5464 underlying_type_id = CHAR_STR(s);
5466 type_base_sptr underlying_type;
5467 if (!underlying_type_id.empty())
5469 underlying_type = rdr.build_or_get_type_decl(underlying_type_id,
true);
5473 if (type_base_sptr t = rdr.get_type_decl(
id))
5481 read_location(rdr, node, loc);
5486 array_type_def::subrange_type::bound_value max_bound;
5487 array_type_def::subrange_type::bound_value min_bound;
5493 max_bound.set_signed(length - 1);
5499 min_bound.set_signed(lower_bound);
5500 max_bound.set_signed(upper_bound);
5504 (
new array_type_def::subrange_type(rdr.get_environment(),
5505 name, min_bound, max_bound,
5506 underlying_type, loc));
5508 p->is_non_finite(is_non_finite);
5510 p->set_size_in_bits(size_in_bits);
5512 read_common_type_info(rdr, node, p);
5514 if (rdr.push_and_key_type_decl(p, node, add_to_current_scope))
5515 rdr.map_xml_node_to_decl(node, p);
5532build_array_type_def(reader& rdr,
5533 const xmlNodePtr node,
5534 bool add_to_current_scope)
5539 if (!xmlStrEqual(node->name, BAD_CAST(
"array-type-def")))
5542 if (decl_base_sptr d = rdr.get_decl_for_xml_node(node))
5545 dynamic_pointer_cast<array_type_def>(d);
5555 if (type_base_sptr d = rdr.get_type_decl(
id))
5564 dimensions = atoi(CHAR_STR(s));
5568 type_id = CHAR_STR(s);
5570 size_t size_in_bits = 0, alignment_in_bits = 0;
5571 bool has_size_in_bits =
false;
5576 size_in_bits = strtoull(CHAR_STR(s), &endptr, 0);
5577 if (*endptr !=
'\0')
5579 if (!strcmp(CHAR_STR(s),
"infinite")
5580 ||!strcmp(CHAR_STR(s),
"unknown"))
5581 size_in_bits = (size_t) -1;
5585 has_size_in_bits =
true;
5590 alignment_in_bits = strtoull(CHAR_STR(s), &endptr, 0);
5591 if (*endptr !=
'\0')
5596 read_location(rdr, node, loc);
5599 for (xmlNodePtr n = xmlFirstElementChild(node);
5601 n = xmlNextElementSibling(n))
5602 if (xmlStrEqual(n->name, BAD_CAST(
"subrange")))
5605 build_subrange_type(rdr, n,
true))
5607 MAYBE_MAP_TYPE_WITH_TYPE_ID(s, n);
5608 if (add_to_current_scope)
5611 rdr.schedule_type_for_canonicalization(s);
5613 subranges.push_back(s);
5618 type_base_sptr type =
5619 rdr.build_or_get_type_decl(type_id,
true);
5624 if (type_base_sptr t = rdr.get_type_decl(
id))
5632 read_common_type_info(rdr, node, ar_type);
5634 if (rdr.push_and_key_type_decl(ar_type, node, add_to_current_scope))
5635 rdr.map_xml_node_to_decl(node, ar_type);
5636 RECORD_ARTIFACT_AS_USED_BY(rdr, type, ar_type);
5638 if (dimensions != ar_type->get_dimension_count()
5639 || (alignment_in_bits
5640 != ar_type->get_element_type()->get_alignment_in_bits()))
5643 if (has_size_in_bits && size_in_bits != (
size_t) -1
5644 && size_in_bits != ar_type->get_size_in_bits())
5647 size_t element_size = ar_type->get_element_type()->get_size_in_bits();
5648 if (element_size && element_size != (
size_t)-1)
5651 size_t bad_count = 0;
5652 for (vector<array_type_def::subrange_sptr>::const_iterator i =
5654 i != subranges.end();
5656 bad_count += (*i)->get_length();
5657 if (size_in_bits == bad_count * element_size)
5659 static bool reported =
false;
5662 std::cerr <<
"notice: Found incorrectly calculated array "
5663 <<
"sizes in XML - this is benign.\nOlder versions "
5664 <<
"of libabigail miscalculated multidimensional "
5665 <<
"array sizes." << std::endl;
5671 std::cerr <<
"error: Found incorrectly calculated array size in "
5672 <<
"XML (id=\"" <<
id <<
"\")." << std::endl;
5696build_enum_type_decl_if_not_suppressed(reader& rdr,
5697 const xmlNodePtr node,
5698 bool add_to_current_scope)
5701 if (!type_is_suppressed(rdr, node))
5702 enum_type = build_enum_type_decl(rdr, node, add_to_current_scope);
5718build_enum_type_decl(reader& rdr,
5719 const xmlNodePtr node,
5720 bool add_to_current_scope)
5724 if (!xmlStrEqual(node->name, BAD_CAST(
"enum-decl")))
5727 if (decl_base_sptr d = rdr.get_decl_for_xml_node(node))
5730 dynamic_pointer_cast<enum_type_decl>(d);
5739 bool is_anonymous =
false;
5740 read_is_anonymous(node, is_anonymous);
5742 if (is_anonymous && !name.empty())
5745 string linkage_name;
5750 read_location(rdr, node, loc);
5752 bool is_decl_only =
false;
5753 read_is_declaration_only(node, is_decl_only);
5755 bool is_artificial =
false;
5756 read_is_artificial(node, is_artificial);
5764 if (type_base_sptr t = rdr.get_type_decl(
id))
5771 string base_type_id;
5773 for (xmlNodePtr n = xmlFirstElementChild(node);
5775 n = xmlNextElementSibling(n))
5777 if (xmlStrEqual(n->name, BAD_CAST(
"underlying-type")))
5779 xml_char_sptr a = xml::build_sptr(xmlGetProp(n, BAD_CAST(
"type-id")));
5781 base_type_id = CHAR_STR(a);
5784 else if (xmlStrEqual(n->name, BAD_CAST(
"enumerator")))
5789 xml_char_sptr a = xml::build_sptr(xmlGetProp(n, BAD_CAST(
"name")));
5793 a = xml::build_sptr(xmlGetProp(n, BAD_CAST(
"value")));
5796 value = strtoll(CHAR_STR(a), NULL, 0);
5800 if ((errno == ERANGE)
5801 && (value == LLONG_MIN || value == LLONG_MAX))
5805 enums.push_back(enum_type_decl::enumerator(name, value));
5809 type_base_sptr underlying_type =
5810 rdr.build_or_get_type_decl(base_type_id,
true);
5813 if (type_base_sptr t = rdr.get_type_decl(
id))
5822 enums, linkage_name));
5824 t->set_is_anonymous(is_anonymous);
5825 t->set_is_artificial(is_artificial);
5826 t->set_is_declaration_only(is_decl_only);
5828 read_common_type_info(rdr, node, t);
5830 if (rdr.push_and_key_type_decl(t, node, add_to_current_scope))
5832 maybe_set_naming_typedefs(rdr, node, t);
5833 rdr.map_xml_node_to_decl(node, t);
5834 RECORD_ARTIFACT_AS_USED_BY(rdr, underlying_type, t);
5849static shared_ptr<typedef_decl>
5850build_typedef_decl(reader& rdr,
5851 const xmlNodePtr node,
5852 bool add_to_current_scope)
5854 shared_ptr<typedef_decl> nil;
5856 if (!xmlStrEqual(node->name, BAD_CAST(
"typedef-decl")))
5859 if (decl_base_sptr d = rdr.get_decl_for_xml_node(node))
5871 if (type_base_sptr t = rdr.get_type_decl(
id))
5883 read_location(rdr, node, loc);
5887 type_id = CHAR_STR(s);
5890 type_base_sptr underlying_type;
5891 underlying_type = rdr.build_or_get_type_decl(type_id,
true);
5894 if (type_base_sptr t = rdr.get_type_decl(
id))
5903 rdr.push_and_key_type_decl(typedef_type, node, add_to_current_scope);
5904 rdr.map_xml_node_to_decl(node, typedef_type);
5906 read_common_type_info(rdr, node, typedef_type);
5908 RECORD_ARTIFACT_AS_USED_BY(rdr, underlying_type, typedef_type);
5912 auto decl =
is_decl(underlying_type);
5913 decl->add_naming_typedef(typedef_type);
5916 return typedef_type;
5931build_class_decl_if_not_suppressed(reader& rdr,
5932 const xmlNodePtr node,
5933 bool add_to_current_scope)
5936 if (!type_is_suppressed(rdr, node))
5937 class_type = build_class_decl(rdr, node, add_to_current_scope);
5953static union_decl_sptr
5954build_union_decl_if_not_suppressed(reader& rdr,
5955 const xmlNodePtr node,
5956 bool add_to_current_scope)
5958 union_decl_sptr union_type;
5959 if (!type_is_suppressed(rdr, node))
5960 union_type = build_union_decl(rdr, node, add_to_current_scope);
5977build_class_decl(reader& rdr,
5978 const xmlNodePtr node,
5979 bool add_to_current_scope)
5983 if (!xmlStrEqual(node->name, BAD_CAST(
"class-decl")))
5986 if (decl_base_sptr d = rdr.get_decl_for_xml_node(node))
5997 bool is_anonymous =
false;
5998 read_is_anonymous(node, is_anonymous);
6000 if (is_anonymous && !name.empty())
6003 size_t size_in_bits = 0, alignment_in_bits = 0;
6004 read_size_and_alignment(node, size_in_bits, alignment_in_bits);
6007 read_visibility(node, vis);
6009 bool is_artificial =
false;
6010 read_is_artificial(node, is_artificial);
6017 read_location(rdr, node, loc);
6019 class_decl::member_types mbrs;
6020 class_decl::data_members data_mbrs;
6021 class_decl::member_functions mbr_functions;
6026 bool is_decl_only =
false;
6027 read_is_declaration_only(node, is_decl_only);
6029 bool is_struct =
false;
6030 read_is_struct(node, is_struct);
6036 if (type_base_sptr t = rdr.get_type_decl(
id))
6042 const vector<type_base_sptr> *types_ptr = 0;
6043 if (!is_anonymous && !previous_definition)
6044 types_ptr = rdr.get_all_type_decls(
id);
6050 for (vector<type_base_sptr>::const_iterator i = types_ptr->begin();
6051 i != types_ptr->end();
6056 if (klass->get_is_declaration_only()
6057 && !klass->get_definition_of_declaration())
6058 previous_declaration = klass;
6059 else if (!klass->get_is_declaration_only()
6060 && !previous_definition)
6061 previous_definition = klass;
6062 if (previous_definition && previous_declaration)
6066 if (previous_declaration)
6067 ABG_ASSERT(previous_declaration->get_name() == name);
6069 if (previous_definition)
6070 ABG_ASSERT(previous_definition->get_name() == name);
6072 if (is_decl_only && previous_declaration)
6073 return previous_declaration;
6076 const environment& env = rdr.get_environment();
6078 if (!is_decl_only && previous_definition)
6084 decl = previous_definition;
6089 decl.reset(
new class_decl(env, name, is_struct));
6091 decl->set_size_in_bits(size_in_bits);
6093 decl->set_is_anonymous(is_anonymous);
6094 decl->set_location(loc);
6097 decl.reset(
new class_decl(env, name, size_in_bits, alignment_in_bits,
6098 is_struct, loc, vis, is_anonymous));
6101 decl->set_is_artificial(is_artificial);
6103 read_common_type_info(rdr, node, decl);
6106 bool is_def_of_decl =
false;
6108 def_id = CHAR_STR(s);
6110 if (!def_id.empty())
6112 decl_base_sptr d =
is_decl(rdr.get_type_decl(def_id));
6113 if (d && d->get_is_declaration_only())
6115 is_def_of_decl =
true;
6116 decl->set_earlier_declaration(d);
6117 d->set_definition_of_declaration(decl);
6123 && !decl->get_is_declaration_only()
6124 && previous_declaration)
6130 decl->set_earlier_declaration(
is_decl(previous_declaration));
6131 for (vector<type_base_sptr>::const_iterator i = types_ptr->begin();
6132 i != types_ptr->end();
6137 if (d->get_is_declaration_only()
6138 && !d->get_definition_of_declaration())
6140 previous_declaration->set_definition_of_declaration(decl);
6141 is_def_of_decl =
true;
6146 if (is_decl_only && previous_definition)
6151 && !decl->get_definition_of_declaration());
6152 decl->set_definition_of_declaration(previous_definition);
6155 ABG_ASSERT(!is_decl_only || !is_def_of_decl);
6157 rdr.push_decl_to_scope(decl,
6158 add_to_current_scope
6159 ? rdr.get_scope_ptr_for_node(node)
6162 rdr.map_xml_node_to_decl(node, decl);
6163 rdr.key_type_decl(decl,
id);
6166 maybe_set_naming_typedefs(rdr, node, decl);
6168 for (xmlNodePtr n = xmlFirstElementChild(node);
6170 n = xmlNextElementSibling(n))
6172 if (xmlStrEqual(n->name, BAD_CAST(
"base-class")))
6178 read_access(n, access);
6182 type_id = CHAR_STR(s);
6183 shared_ptr<class_decl> b =
6184 dynamic_pointer_cast<class_decl>
6185 (rdr.build_or_get_type_decl(type_id,
true));
6188 if (decl->find_base_class(b->get_qualified_name()))
6194 size_t offset_in_bits = 0;
6195 bool offset_present = read_offset_in_bits (n, offset_in_bits);
6197 bool is_virtual =
false;
6198 read_is_virtual (n, is_virtual);
6200 shared_ptr<class_decl::base_spec> base (
new class_decl::base_spec
6203 ? (
long) offset_in_bits
6206 decl->add_base_specifier(base);
6208 else if (xmlStrEqual(n->name, BAD_CAST(
"member-type")))
6211 read_access(n, access);
6213 rdr.map_xml_node_to_decl(n, decl);
6215 for (xmlNodePtr p = xmlFirstElementChild(n);
6217 p = xmlNextElementSibling(p))
6220 string member_type_name;
6221 read_name(p, member_type_name);
6224 if ((t = build_type(rdr, p,
true)))
6228 if (!td->get_scope())
6231 rdr.schedule_type_for_canonicalization(t);
6233 string id = CHAR_STR(i);
6235 rdr.key_type_decl(t,
id);
6236 rdr.map_xml_node_to_decl(p, td);
6240 else if (xmlStrEqual(n->name, BAD_CAST(
"data-member")))
6242 rdr.map_xml_node_to_decl(n, decl);
6248 read_access(n, access);
6250 bool is_laid_out =
false;
6251 size_t offset_in_bits = 0;
6252 if (read_offset_in_bits(n, offset_in_bits))
6255 bool is_static =
false;
6256 read_static(n, is_static);
6258 for (xmlNodePtr p = xmlFirstElementChild(n);
6260 p = xmlNextElementSibling(p))
6263 build_var_decl(rdr, p,
false))
6265 if (decl->find_data_member(v))
6273 decl_base_sptr d = rdr.pop_decl();
6278 if (!variable_is_suppressed(rdr, decl, *v))
6285 rdr.add_var_to_exported_or_undefined_decls(v);
6295 RECORD_ARTIFACT_AS_USED_BY(rdr, v->get_type(), decl);
6298 RECORD_ARTIFACT_AS_USED_BY(rdr, v->get_type(), v);
6299 RECORD_ARTIFACT_AS_USED_BY(rdr, v, decl);
6305 else if (xmlStrEqual(n->name, BAD_CAST(
"member-function")))
6307 bool is_constructor =
false;
6308 bool is_destructor =
false;
6309 bool is_const =
false;
6310 bool is_static =
false;
6311 ssize_t vtable_offset = -1;
6312 bool is_virtual =
false;
6315 read_cdtor_const(n, is_constructor, is_destructor, is_const);
6316 if (read_vtable_offset(n, vtable_offset))
6318 read_access(n, access);
6319 read_static(n, is_static);
6321 method_decl_sptr method =
6322 build_member_function_decl(rdr, n, decl,
6327 string linkage_name = method->get_linkage_name();
6328 if (decl->find_member_function(linkage_name))
6338 is_virtual, vtable_offset,
6339 is_static, is_constructor,
6340 is_destructor, is_const);
6341 rdr.add_fn_to_exported_or_undefined_decls(method.get(),
6345 else if (xmlStrEqual(n->name, BAD_CAST(
"member-template")))
6347 rdr.map_xml_node_to_decl(n, decl);
6353 read_access(n, access);
6355 bool is_static =
false;
6356 read_static(n, is_static);
6358 bool is_ctor =
false, is_dtor =
false, is_const =
false;
6359 read_cdtor_const(n, is_ctor, is_dtor, is_const);
6361 for (xmlNodePtr p = xmlFirstElementChild(n);
6363 p = xmlNextElementSibling(p))
6366 build_function_tdecl(rdr, p,
6369 member_function_template_sptr m
6370 (
new member_function_template(f, access, is_static,
6371 is_ctor, is_const));
6375 build_class_tdecl(rdr, p,
6378 member_class_template_sptr m(
new member_class_template(c,
6387 rdr.pop_scope_or_abort(decl);
6404static union_decl_sptr
6405build_union_decl(reader& rdr,
6406 const xmlNodePtr node,
6407 bool add_to_current_scope)
6409 union_decl_sptr nil;
6411 if (!xmlStrEqual(node->name, BAD_CAST(
"union-decl")))
6414 if (decl_base_sptr d = rdr.get_decl_for_xml_node(node))
6416 union_decl_sptr result = dynamic_pointer_cast<union_decl>(d);
6425 bool is_anonymous =
false;
6426 read_is_anonymous(node, is_anonymous);
6428 if (is_anonymous && !name.empty())
6431 size_t size_in_bits = 0, alignment_in_bits = 0;
6432 read_size_and_alignment(node, size_in_bits, alignment_in_bits);
6435 read_visibility(node, vis);
6437 bool is_artificial =
false;
6438 read_is_artificial(node, is_artificial);
6445 read_location(rdr, node, loc);
6447 union_decl::member_types mbrs;
6448 union_decl::data_members data_mbrs;
6449 union_decl::member_functions mbr_functions;
6451 union_decl_sptr decl;
6453 bool is_decl_only =
false;
6454 read_is_declaration_only(node, is_decl_only);
6457 union_decl_sptr previous_definition, previous_declaration;
6458 const vector<type_base_sptr> *types_ptr = 0;
6460 types_ptr = rdr.get_all_type_decls(
id);
6466 for (vector<type_base_sptr>::const_iterator i = types_ptr->begin();
6467 i != types_ptr->end();
6472 if (onion->get_is_declaration_only()
6473 && !onion->get_definition_of_declaration())
6474 previous_declaration = onion;
6475 else if (!onion->get_is_declaration_only()
6476 && !previous_definition)
6477 previous_definition = onion;
6478 if (previous_definition && previous_declaration)
6482 if (previous_declaration)
6483 ABG_ASSERT(previous_declaration->get_name() == name);
6485 if (previous_definition)
6486 ABG_ASSERT(previous_definition->get_name() == name);
6488 if (is_decl_only && previous_declaration)
6489 return previous_declaration;
6492 const environment& env = rdr.get_environment();
6494 if (!is_decl_only && previous_definition)
6500 decl = previous_definition;
6504 decl.reset(
new union_decl(env, name));
6506 decl.reset(
new union_decl(env, name, size_in_bits,
6507 loc, vis, is_anonymous));
6510 read_common_type_info(rdr, node, decl);
6512 decl->set_is_artificial(is_artificial);
6515 bool is_def_of_decl =
false;
6517 def_id = CHAR_STR(s);
6519 if (!def_id.empty())
6522 dynamic_pointer_cast<class_decl>(rdr.get_type_decl(def_id));
6523 if (d && d->get_is_declaration_only())
6525 is_def_of_decl =
true;
6526 decl->set_earlier_declaration(d);
6527 d->set_definition_of_declaration(decl);
6533 && !decl->get_is_declaration_only()
6534 && previous_declaration)
6540 decl->set_earlier_declaration(previous_declaration);
6541 for (vector<type_base_sptr>::const_iterator i = types_ptr->begin();
6542 i != types_ptr->end();
6547 if (d->get_is_declaration_only()
6548 && !d->get_definition_of_declaration())
6550 previous_declaration->set_definition_of_declaration(decl);
6551 is_def_of_decl =
true;
6556 if (is_decl_only && previous_definition)
6561 && !decl->get_definition_of_declaration());
6562 decl->set_definition_of_declaration(previous_definition);
6565 ABG_ASSERT(!is_decl_only || !is_def_of_decl);
6567 rdr.push_decl_to_scope(decl,
6568 add_to_current_scope
6569 ? rdr.get_scope_ptr_for_node(node)
6572 rdr.map_xml_node_to_decl(node, decl);
6573 rdr.key_type_decl(decl,
id);
6575 maybe_set_naming_typedefs(rdr, node, decl);
6577 for (xmlNodePtr n = xmlFirstElementChild(node);
6579 n = xmlNextElementSibling(n))
6581 if (xmlStrEqual(n->name, BAD_CAST(
"member-type")))
6584 read_access(n, access);
6586 rdr.map_xml_node_to_decl(n, decl);
6588 for (xmlNodePtr p = xmlFirstElementChild(n);
6590 p = xmlNextElementSibling(p))
6592 string member_type_name;
6593 read_name(p, member_type_name);
6595 if (!member_type_name.empty())
6596 t = decl->find_member_type(member_type_name);
6599 if ((t = build_type(rdr, p,
true)))
6603 if (!td->get_scope())
6606 rdr.schedule_type_for_canonicalization(t);
6609 string id = CHAR_STR(i);
6614 else if (xmlStrEqual(n->name, BAD_CAST(
"data-member")))
6616 rdr.map_xml_node_to_decl(n, decl);
6619 read_access(n, access);
6621 bool is_laid_out =
true;
6622 size_t offset_in_bits = 0;
6623 bool is_static =
false;
6624 read_static(n, is_static);
6626 for (xmlNodePtr p = xmlFirstElementChild(n);
6628 p = xmlNextElementSibling(p))
6631 build_var_decl(rdr, p,
false))
6633 if (decl->find_data_member(v))
6641 decl_base_sptr d = rdr.pop_decl();
6646 || !variable_is_suppressed(rdr, decl, *v))
6661 RECORD_ARTIFACT_AS_USED_BY(rdr, v->get_type(), decl);
6664 RECORD_ARTIFACT_AS_USED_BY(rdr, v->get_type(), v);
6665 RECORD_ARTIFACT_AS_USED_BY(rdr, v, decl);
6671 else if (xmlStrEqual(n->name, BAD_CAST(
"member-function")))
6672 build_member_function_decl(rdr, n, decl,
6673 add_to_current_scope,
6675 else if (xmlStrEqual(n->name, BAD_CAST(
"member-template")))
6677 rdr.map_xml_node_to_decl(n, decl);
6680 read_access(n, access);
6682 bool is_static =
false;
6683 read_static(n, is_static);
6685 bool is_ctor =
false, is_dtor =
false, is_const =
false;
6686 read_cdtor_const(n, is_ctor, is_dtor, is_const);
6688 for (xmlNodePtr p = xmlFirstElementChild(n);
6690 p = xmlNextElementSibling(p))
6693 build_function_tdecl(rdr, p,
6696 member_function_template_sptr m
6697 (
new member_function_template(f, access, is_static,
6698 is_ctor, is_const));
6703 build_class_tdecl(rdr, p,
6706 member_class_template_sptr m(
new member_class_template(c,
6716 rdr.pop_scope_or_abort(decl);
6733static shared_ptr<function_tdecl>
6734build_function_tdecl(reader& rdr,
6735 const xmlNodePtr node,
6736 bool add_to_current_scope)
6738 shared_ptr<function_tdecl> nil, result;
6740 if (!xmlStrEqual(node->name, BAD_CAST(
"function-template-decl")))
6746 if (
id.empty() || rdr.get_fn_tmpl_decl(
id))
6750 read_location(rdr, node, loc);
6753 read_visibility(node, vis);
6756 read_binding(node, bind);
6758 const environment& env = rdr.get_environment();
6761 maybe_set_artificial_location(rdr, node, fn_tmpl_decl);
6763 rdr.push_decl_to_scope(fn_tmpl_decl,
6764 add_to_current_scope
6765 ? rdr.get_scope_ptr_for_node(node)
6767 rdr.key_fn_tmpl_decl(fn_tmpl_decl,
id);
6768 rdr.map_xml_node_to_decl(node, fn_tmpl_decl);
6770 unsigned parm_index = 0;
6771 for (xmlNodePtr n = xmlFirstElementChild(node);
6773 n = xmlNextElementSibling(n))
6776 build_template_parameter(rdr, n, parm_index, fn_tmpl_decl))
6778 fn_tmpl_decl->add_template_parameter(parm);
6788 rdr.key_fn_tmpl_decl(fn_tmpl_decl,
id);
6790 return fn_tmpl_decl;
6806build_class_tdecl(reader& rdr,
6807 const xmlNodePtr node,
6808 bool add_to_current_scope)
6812 if (!xmlStrEqual(node->name, BAD_CAST(
"class-template-decl")))
6818 if (
id.empty() || rdr.get_class_tmpl_decl(
id))
6822 read_location(rdr, node, loc);
6825 read_visibility(node, vis);
6827 const environment& env = rdr.get_environment();
6830 maybe_set_artificial_location(rdr, node, class_tmpl);
6832 if (add_to_current_scope)
6833 rdr.push_decl_to_scope(class_tmpl, node);
6834 rdr.key_class_tmpl_decl(class_tmpl,
id);
6835 rdr.map_xml_node_to_decl(node, class_tmpl);
6837 unsigned parm_index = 0;
6838 for (xmlNodePtr n = xmlFirstElementChild(node);
6840 n = xmlNextElementSibling(n))
6843 build_template_parameter(rdr, n, parm_index, class_tmpl))
6845 class_tmpl->add_template_parameter(parm);
6849 build_class_decl_if_not_suppressed(rdr, n,
6850 add_to_current_scope))
6852 rdr.schedule_type_for_canonicalization(c);
6857 rdr.key_class_tmpl_decl(class_tmpl,
id);
6878build_type_tparameter(reader& rdr,
6879 const xmlNodePtr node,
6885 if (!xmlStrEqual(node->name, BAD_CAST(
"template-type-parameter")))
6896 type_id = CHAR_STR(s);
6897 if (!type_id.empty()
6898 && !(result = dynamic_pointer_cast<type_tparameter>
6899 (rdr.build_or_get_type_decl(type_id,
true))))
6907 read_location(rdr, node,loc);
6909 result.reset(
new type_tparameter(index, tdecl, name, loc));
6910 maybe_set_artificial_location(rdr, node, result);
6913 rdr.push_decl_to_scope(
is_decl(result), node);
6915 rdr.push_and_key_type_decl(result, node,
true);
6917 rdr.schedule_type_for_canonicalization(result);
6937build_type_composition(reader& rdr,
6938 const xmlNodePtr node,
6944 if (!xmlStrEqual(node->name, BAD_CAST(
"template-parameter-type-composition")))
6947 type_base_sptr composed_type;
6948 result.reset(
new type_composition(index, tdecl, composed_type));
6949 rdr.push_decl_to_scope(
is_decl(result), node);
6951 for (xmlNodePtr n = xmlFirstElementChild(node);
6953 n = xmlNextElementSibling(n))
6955 if ((composed_type =
6956 build_pointer_type_def(rdr, n,
6959 build_reference_type_def(rdr, n,
6962 build_array_type_def(rdr, n,
6965 build_qualified_type_decl(rdr, n,
6968 rdr.schedule_type_for_canonicalization(composed_type);
6969 result->set_composed_type(composed_type);
6993build_non_type_tparameter(reader& rdr,
6994 const xmlNodePtr node,
7000 if (!xmlStrEqual(node->name, BAD_CAST(
"template-non-type-parameter")))
7005 type_id = CHAR_STR(s);
7006 type_base_sptr type;
7008 || !(type = rdr.build_or_get_type_decl(type_id,
true)))
7016 read_location(rdr, node,loc);
7018 r.reset(
new non_type_tparameter(index, tdecl, name, type, loc));
7019 maybe_set_artificial_location(rdr, node, r);
7020 rdr.push_decl_to_scope(
is_decl(r), node);
7040build_template_tparameter(reader& rdr,
7041 const xmlNodePtr node,
7047 if (!xmlStrEqual(node->name, BAD_CAST(
"template-template-parameter")))
7058 type_id = CHAR_STR(s);
7060 if (!type_id.empty()
7061 && !(dynamic_pointer_cast<template_tparameter>
7062 (rdr.build_or_get_type_decl(type_id,
true))))
7070 read_location(rdr, node, loc);
7074 maybe_set_artificial_location(rdr, node, result);
7075 rdr.push_decl_to_scope(result, node);
7079 for (xmlNodePtr n = xmlFirstElementChild(node);
7081 n = xmlNextElementSibling(n))
7082 if (shared_ptr<template_parameter> p =
7083 build_template_parameter(rdr, n, parm_index, result))
7085 result->add_template_parameter(p);
7091 rdr.key_type_decl(result,
id);
7092 rdr.schedule_type_for_canonicalization(result);
7114build_template_parameter(reader& rdr,
7115 const xmlNodePtr node,
7119 shared_ptr<template_parameter> r;
7120 ((r = build_type_tparameter(rdr, node, index, tdecl))
7121 || (r = build_non_type_tparameter(rdr, node, index, tdecl))
7122 || (r = build_template_tparameter(rdr, node, index, tdecl))
7123 || (r = build_type_composition(rdr, node, index, tdecl)));
7136static type_base_sptr
7137build_type(reader& rdr,
7138 const xmlNodePtr node,
7139 bool add_to_current_scope)
7143 ((t = build_type_decl(rdr, node, add_to_current_scope))
7144 || (t = build_qualified_type_decl(rdr, node, add_to_current_scope))
7145 || (t = build_pointer_type_def(rdr, node, add_to_current_scope))
7146 || (t = build_reference_type_def(rdr, node , add_to_current_scope))
7147 || (t = build_ptr_to_mbr_type(rdr, node , add_to_current_scope))
7148 || (t = build_function_type(rdr, node,
nullptr,
7150 || (t = build_array_type_def(rdr, node, add_to_current_scope))
7151 || (t = build_subrange_type(rdr, node, add_to_current_scope))
7152 || (t = build_enum_type_decl_if_not_suppressed(rdr, node,
7153 add_to_current_scope))
7154 || (t = build_typedef_decl(rdr, node, add_to_current_scope))
7155 || (t = build_class_decl_if_not_suppressed(rdr, node,
7156 add_to_current_scope))
7157 || (t = build_union_decl_if_not_suppressed(rdr, node,
7158 add_to_current_scope)));
7160 if (rdr.tracking_non_reachable_types() && t)
7162 corpus_sptr abi = rdr.corpus();
7164 bool is_non_reachable_type =
false;
7165 read_is_non_reachable_type(node, is_non_reachable_type);
7168 MAYBE_MAP_TYPE_WITH_TYPE_ID(t, node);
7171 rdr.schedule_type_for_canonicalization(t);
7180static decl_base_sptr
7181handle_type_decl(reader& rdr,
7183 bool add_to_current_scope)
7185 type_decl_sptr decl = build_type_decl(rdr, node, add_to_current_scope);
7186 MAYBE_MAP_TYPE_WITH_TYPE_ID(decl, node);
7187 if (decl && decl->get_scope())
7188 rdr.schedule_type_for_canonicalization(decl);
7197static decl_base_sptr
7198handle_namespace_decl(reader& rdr,
7200 bool add_to_current_scope)
7203 add_to_current_scope);
7212static decl_base_sptr
7213handle_qualified_type_decl(reader& rdr,
7215 bool add_to_current_scope)
7217 qualified_type_def_sptr decl =
7218 build_qualified_type_decl(rdr, node,
7219 add_to_current_scope);
7220 MAYBE_MAP_TYPE_WITH_TYPE_ID(decl, node);
7221 if (decl && decl->get_scope())
7222 rdr.schedule_type_for_canonicalization(decl);
7231static decl_base_sptr
7232handle_pointer_type_def(reader& rdr,
7234 bool add_to_current_scope)
7237 add_to_current_scope);
7238 MAYBE_MAP_TYPE_WITH_TYPE_ID(decl, node);
7239 if (decl && decl->get_scope())
7240 rdr.schedule_type_for_canonicalization(decl);
7249static decl_base_sptr
7250handle_reference_type_def(reader& rdr,
7252 bool add_to_current_scope)
7255 add_to_current_scope);
7256 MAYBE_MAP_TYPE_WITH_TYPE_ID(decl, node);
7257 if (decl && decl->get_scope())
7258 rdr.schedule_type_for_canonicalization(decl);
7267static type_base_sptr
7268handle_function_type(reader& rdr,
7275 MAYBE_MAP_TYPE_WITH_TYPE_ID(type, node);
7276 rdr.schedule_type_for_canonicalization(type);
7285static decl_base_sptr
7286handle_array_type_def(reader& rdr,
7288 bool add_to_current_scope)
7291 add_to_current_scope);
7292 MAYBE_MAP_TYPE_WITH_TYPE_ID(decl, node);
7293 rdr.schedule_type_for_canonicalization(decl);
7300static decl_base_sptr
7301handle_enum_type_decl(reader& rdr,
7303 bool add_to_current_scope)
7306 build_enum_type_decl_if_not_suppressed(rdr, node,
7307 add_to_current_scope);
7308 MAYBE_MAP_TYPE_WITH_TYPE_ID(decl, node);
7309 if (decl && decl->get_scope())
7310 rdr.schedule_type_for_canonicalization(decl);
7317static decl_base_sptr
7318handle_typedef_decl(reader& rdr,
7320 bool add_to_current_scope)
7323 add_to_current_scope);
7324 MAYBE_MAP_TYPE_WITH_TYPE_ID(decl, node);
7325 if (decl && decl->get_scope())
7326 rdr.schedule_type_for_canonicalization(decl);
7338static decl_base_sptr
7339handle_var_decl(reader& rdr,
7341 bool add_to_current_scope)
7343 decl_base_sptr decl = build_var_decl_if_not_suppressed(rdr, node,
7344 add_to_current_scope);
7345 rdr.add_var_to_exported_or_undefined_decls(
is_var_decl(decl));
7355static decl_base_sptr
7356handle_function_decl(reader& rdr,
7358 bool add_to_current_scope)
7360 return build_function_decl_if_not_suppressed(rdr, node,
class_decl_sptr(),
7361 add_to_current_scope,
7371static decl_base_sptr
7372handle_class_decl(reader& rdr,
7374 bool add_to_current_scope)
7377 build_class_decl_if_not_suppressed(rdr, node, add_to_current_scope);
7378 MAYBE_MAP_TYPE_WITH_TYPE_ID(
is_type(decl), node);
7379 if (decl && decl->get_scope())
7380 rdr.schedule_type_for_canonicalization(decl);
7390static decl_base_sptr
7391handle_union_decl(reader& rdr,
7393 bool add_to_current_scope)
7395 union_decl_sptr decl =
7396 build_union_decl_if_not_suppressed(rdr, node, add_to_current_scope);
7397 MAYBE_MAP_TYPE_WITH_TYPE_ID(
is_type(decl), node);
7398 if (decl && decl->get_scope())
7399 rdr.schedule_type_for_canonicalization(decl);
7409static decl_base_sptr
7410handle_function_tdecl(reader& rdr,
7412 bool add_to_current_scope)
7415 add_to_current_scope);
7424static decl_base_sptr
7425handle_class_tdecl(reader& rdr,
7427 bool add_to_current_scope)
7430 add_to_current_scope);
7452 read_rdr.options() = opts;
7453 return read_translation_unit_from_input(read_rdr);
7500 result->options() = opts;
7502 corpus_sptr corp = result->corpus();
7503 corp->set_origin(corpus::NATIVE_XML_ORIGIN);
7504#ifdef WITH_DEBUG_SELF_COMPARISON
7505 if (env.self_comparison_debug_is_on())
7506 env.set_self_comparison_debug_input(result->corpus());
7508 result->set_path(path);
7519abigail::fe_iface_sptr
7544 result->options() = opts;
7546 corpus_sptr corp = result->corpus();
7547 corp->set_origin(corpus::NATIVE_XML_ORIGIN);
7548#ifdef WITH_DEBUG_SELF_COMPARISON
7549 if (env.self_comparison_debug_is_on())
7550 env.set_self_comparison_debug_input(result->corpus());
7592 return rdr->read_corpus(sts);
7637 corpus_sptr corp = rdr->read_corpus(sts);