Drop suppressed ABI artifacts from the IR
authorDodji Seketeli <dodji@redhat.com>
Mon, 19 Sep 2016 16:03:19 +0000 (18:03 +0200)
committerDodji Seketeli <dodji@redhat.com>
Wed, 21 Sep 2016 16:35:08 +0000 (18:35 +0200)
This patch allows dropping suppressed ABI artifacts from the in-memory
internal representation right during the DWARF or abixml reading.

In practise, this means that abidw and abilint now have a
--suppressions options to give them suppression specifications.  If a
suppression specification that has the "drop" property matches an ABI
artifact (type, function or variable) then that artifact is dropped
from the internal representation.  This also applies to abidiff.

Note that now, by default, ABI artifacts (types) that are suppressed
due to the --headers-dir{1,2} option of abidiff are now also dropped
from the IR as well.  Incidentally, abidw and abilint tools now have a
--header-dir option too.

* doc/manuals/abidw.rst: Document the new --suppressions and
--headers-dir options off the abidw tool.
* doc/manuals/abilint.rst: Document the new --suppressions and
--headers-dir options on the abilint tool.
* doc/manuals/libabigail-concepts.rst: Document the new "drop" and
"name_not_regexp" properties on suppression directives.
* include/abg-corpus.h (corpus::corpus): Add a default argument to
the path parameter.
* src/abg-suppression-priv.h: New private header file.
* src/Makefile.am: Add the new abg-suppression-priv.h file to
source distribution.
* include/abg-suppression.h ({suppression_base, type_suppression,
function_suppression, variable_suppression}::priv): Make these
public.
(suppression_base::{g,s}et_drops_artifact_from_ir): Declare new
member functions.
(type_suppression::{suppressed_type}): Likewise.
(suppression_base::{names,sonames}_of_binaries_match): Remove
member functions.
(function_suppression::{get_name, set_name, get_name_regex_str,
set_name_regex_str}): Renamed get_function_name,
set_function_name, get_function_name_regex_str,
set_function_name_regex_str into these.
({variable,function}_suppression::{g,s}et_name_not_regex_str):
Declare new member functions.
* src/abg-suppression.cc: Include the new abg-suppression-priv.h
private header.
(class suppression_base::priv, class type_suppression::priv, class
function_suppression::parameter_spec::priv, class
function_suppression::priv, class variable_suppression::priv):
Move these types to that new private header.
(suppression_base::{g,s}et_drops_artifact_from_ir)
(function_suppression::{g,s}et_name_not_regex_str)
(variable_suppression::{g,s}et_name_not_regex_str): New member
functions.
(sonames_of_binaries_match): New static function, taken from
suppression_base::sonames_of_binaries_match.
(names_of_binaries_match): New static function, taken from
suppression_base::names_of_binaries_match.
(suppression_matches_type_no_name): New static function.
(type_suppression::suppresses_type): Adjust
(function_suppression::suppresses_function)
(variable_suppression::suppresses_variable): Adjust.  Evaluate the
new "name_not_regexp" property.
(suppression_matches_type_name)
(suppression_matches_type_location)
(suppression_matches_type_name_or_location)
(suppression_matches_function_name)
(suppression_matches_function_sym_name)
(suppression_matches_variable_name)
(suppression_matches_variable_sym_name, suppression_matches_type):
New functions.
(read_type_suppression): Support the new "drop_artifacts" and
"drop" properties.
(read_function_suppression, read_variable_suppression): Support
the new "drop_artifacts", "drop", and "name_not_regexp"
properties.
(function_suppression::{g,s}et_name): Renamed
{g,s}et_function_name into these.
(function_suppression::set_name_not_regex_str): Renamed
{g,s}et_name_regex_str into this.
(function_suppression::suppresses_function_symbol): Adjust.
* include/abg-dwarf-reader.h (add_read_context_suppressions):
Declare new function.
* src/abg-dwarf-reader.cc: Use the new private
abg-suppression-priv.h header file.
(read_context::supprs_): New data member.
(read_context::get_suppressions): New member function.
(read_context::get_die_source): Make this const.
(read_context::tu_die_imported_unit_points_map): Add a const
overload.
(read_context::cur_transl_unit): Renamed current_translation_unit
unit into this;
(read_context::cur_tu): Remove or rename into cur_transl_unit.
(get_scope_for_die, build_translation_unit_and_add_to_ir)
(build_enum_type, build_pointer_type_def, build_reference_type)
(build_function_type, build_array_type, build_function_decl):
Adjust.
(read_context::{suppression_can_match,
suppression_matches_function_sym_name,
suppression_matches_function_name,
suppression_matches_variable_sym_name,
suppression_matches_variable_name,
suppression_matches_type_name_or_location,
suppression_matches_type_name}): Add member functions.
(die_signed_constant_attribute): Remove this as dead code.
(die_location, die_loc_and_name)
(find_import_unit_point_between_dies)
(find_import_unit_point_before_die, get_parent_die): Make the
read_context& parameter be const and adjust as required.
(build_var_decl_if_not_suppressed, function_is_suppressed)
(variable_is_suppressed, type_is_suppressed): Define new static
functions.
(add_read_context_suppressions): Define new function.
(build_class_type_and_add_to_ir): Do not add suppressed static
data members to the IR.
(build_ir_node_from_die): Do not add suppressed enum types, class
types, variables or functions to the IR.  Adjust for the
read_context::cur_tu -> read_context::cur_transl_unit rename.
* include/abg-reader.h (read_context_sptr): Declare new type.
(create_native_xml_read_context, read_corpus_from_input)
(add_read_context_suppressions): Declare new functions.
* src/abg-reader.cc: Include the new private
abg-suppression-priv.h header file.
(read_context::m_exported_decls_builder): Renamed
m_exported_decls_builder_ into this.
(read_context::get_exported_decls_builder): Adjust.
(read_context::get_cur_scope): Make this const.
(read_location): Take a const read_context and adjust.
(read_corpus_from_input): Make this non-static.
(build_namespace_decl): Don't abort if trying to add an artifact
to the IR doesn't succeed.  It might be suppressed now.
(read_context::{m_path, m_supprs}): New data members.
(read_context::{g,s}et_path): New member functions.
(read_context::{get_suppressions,
suppression_matches_function_name, suppression_can_match,
suppression_matches_function_name,
suppression_matches_function_sym_name,
suppression_matches_variable_name,
suppression_matches_variable_sym_name,
suppression_matches_type_name_or_location}): Likewise.
(add_read_context_suppressions, create_native_xml_read_context)
(read_corpus_from_native_xml): New functions.
(build_function_decl_if_not_suppressed, function_is_suppressed)
(type_is_suppressed, build_var_decl_if_not_suppressed)
(variable_is_suppressed, build_enum_type_decl_if_not_suppressed)
(build_class_decl_if_not_suppressed): New static functions.
(build_class_decl): Add member types that are being built early,
so that their sub-types can be evaluated for suppression.  Do not
add suppressed static data members or suppressed member functions
to the IR.
(build_type): Do not add an enum type or a class type to the IR if
they are suppressed.
(handle_enum_type_decl): Do not add an enum type to the IR if its
suppressed.
(handle_var_decl): Likewise for a variable decl.
(handle_function_decl): Likewise for a function decl.
(handle_class_decl): Likewise for a class decl.
* src/abg-tools-utils.cc (handle_fts_entry): Drop suppressed ABI
from the IR.
* tools/abidiff.cc (display_usage): Fix help strings for
--headers-dirs{1,2}.
(set_suppressions): New static function.
(main): Adjust.  Release the memory used by read_context early.
* tools/abidw.cc (options::{headers_dir, suppression_paths}):
(display_usage): New help strings for the new --header-dir and
--suppressions options.
(parse_command_line): Parse the new --header-dir and
--suppressions options.
(maybe_check_suppression_files, set_suppressions): New static
functions.
(main): Use the two new functions above.  Free the memory used by
the read context before working with the corpus.
* tools/abilint.cc (options::suppression_paths):
(display_usage): New help strings for the new --header-dir and
--suppressions options.
(parse_command_line): Parse the new --header-dir and
--suppressions options.
(maybe_check_suppression_files, set_suppressions): New static
functions.
(main): Use the two new functions above.  Free the memory used by
the read context before working with the corpus.
* tests/data/test-diff-suppr/test24-soname-suppr-{2,3].txt:
Adjust.
* tests/data/test-diff-suppr/test29-suppr-6.txt: Likewise.
* tests/data/test-diff-suppr/test29-suppr-8.txt: Likewise.
* tests/data/test-diff-suppr/libtest31-v{0,1}.so: New test input.
* tests/data/test-diff-suppr/libtest31.suppr: Likewise
* tests/data/test-diff-suppr/libtest32-v{0,1}.so: Likewise.
* tests/data/test-diff-suppr/libtest32-0.suppr: Likewise.
* tests/data/test-diff-suppr/libtest33-v{0,1}.so: Likewise.
* tests/data/test-diff-suppr/test31-report-{0,1}.txt: Likewise.
* tests/data/test-diff-suppr/test31-v{0,1}.cc: Likewise.
* tests/data/test-diff-suppr/test32-report-{0,1}.txt: Likewise.
* tests/data/test-diff-suppr/test32-v{0,1}.c: Likewise.
* tests/data/test-diff-suppr/test33-suppr-1.txt: Likewise.
* tests/data/test-diff-suppr/test33-v{0,1}.cc: Likewise.
* tests/data/test-diff-suppr/test33-v{0,1}.h: Likewise.
* tests/data/test-read-dwarf/libtest24-drop-fns-2.so.abi:
Likewise.
* tests/data/test-read-dwarf/libtest24-drop-fns.so: Likewise.
* tests/data/test-read-dwarf/libtest24-drop-fns.so.abi: Likewise.
* tests/data/test-read-dwarf/test24-drop-fns-0.suppr: Likewise.
* tests/data/test-read-dwarf/test24-drop-fns.cc: Likewise.
* tests/data/test-read-write/test28-drop-std-fns.abignore:
Likewise.
* tests/data/test-read-write/test28-drop-std-vars.abignore:
Likewise.
* tests/data/test-read-write/test28-without-std-fns-ref.xml:
Likewise.
* tests/data/test-read-write/test28-without-std-fns.xml: Likewise.
* tests/data/test-read-write/test28-without-std-vars-ref.xml:
Likewise.
* tests/data/test-read-write/test28-without-std-vars.xml:
Likewise.
* tests/data/test-read-write/test28.xml: Likewise.
* tests/data/Makefile.am: Add the new test artifacts to source
distribution.
* tests/test-diff-suppr.cc (in_out_spec): Take the new test inputs
into account.
* tests/test-read-dwarf.cc (Inoutspec::in_suppr_spec_path): New
data member.
(in_out_spec): Adjust.  The new test inputs into account.
(set_suppressions): New static function.
(handle_in_out_spec): Adjust.
* tests/test-read-write.cc (Inoutspec::{in_suppr_spec_path,
ref_out_path}): New data members.
(in_out_spec): Adjust.  Take new test inputs into account.
(main): Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
58 files changed:
doc/manuals/abidw.rst
doc/manuals/abilint.rst
doc/manuals/libabigail-concepts.rst
include/abg-corpus.h
include/abg-dwarf-reader.h
include/abg-reader.h
include/abg-suppression.h
src/Makefile.am
src/abg-dwarf-reader.cc
src/abg-reader.cc
src/abg-suppression-priv.h [new file with mode: 0644]
src/abg-suppression.cc
src/abg-tools-utils.cc
src/abg-writer.cc
tests/data/Makefile.am
tests/data/test-diff-suppr/libtest31-v0.so [new file with mode: 0755]
tests/data/test-diff-suppr/libtest31-v1.so [new file with mode: 0755]
tests/data/test-diff-suppr/libtest31.suppr [new file with mode: 0644]
tests/data/test-diff-suppr/libtest32-0.suppr [new file with mode: 0644]
tests/data/test-diff-suppr/libtest32-v0.so [new file with mode: 0755]
tests/data/test-diff-suppr/libtest32-v1.so [new file with mode: 0755]
tests/data/test-diff-suppr/libtest33-v0.so [new file with mode: 0755]
tests/data/test-diff-suppr/libtest33-v1.so [new file with mode: 0755]
tests/data/test-diff-suppr/test24-soname-suppr-2.txt
tests/data/test-diff-suppr/test24-soname-suppr-3.txt
tests/data/test-diff-suppr/test29-suppr-6.txt
tests/data/test-diff-suppr/test29-suppr-8.txt
tests/data/test-diff-suppr/test31-report-0.txt [new file with mode: 0644]
tests/data/test-diff-suppr/test31-report-1.txt [new file with mode: 0644]
tests/data/test-diff-suppr/test31-v0.cc [new file with mode: 0644]
tests/data/test-diff-suppr/test31-v1.cc [new file with mode: 0644]
tests/data/test-diff-suppr/test32-report-0.txt [new file with mode: 0644]
tests/data/test-diff-suppr/test32-report-1.txt [new file with mode: 0644]
tests/data/test-diff-suppr/test32-v0.c [new file with mode: 0644]
tests/data/test-diff-suppr/test32-v1.c [new file with mode: 0644]
tests/data/test-diff-suppr/test33-suppr-1.txt [new file with mode: 0644]
tests/data/test-diff-suppr/test33-v0.cc [new file with mode: 0644]
tests/data/test-diff-suppr/test33-v0.h [new file with mode: 0644]
tests/data/test-diff-suppr/test33-v1.cc [new file with mode: 0644]
tests/data/test-diff-suppr/test33-v1.h [new file with mode: 0644]
tests/data/test-read-dwarf/libtest24-drop-fns-2.so.abi [new file with mode: 0644]
tests/data/test-read-dwarf/libtest24-drop-fns.so [new file with mode: 0755]
tests/data/test-read-dwarf/libtest24-drop-fns.so.abi [new file with mode: 0644]
tests/data/test-read-dwarf/test24-drop-fns-0.suppr [new file with mode: 0644]
tests/data/test-read-dwarf/test24-drop-fns.cc [new file with mode: 0644]
tests/data/test-read-write/test28-drop-std-fns.abignore [new file with mode: 0644]
tests/data/test-read-write/test28-drop-std-vars.abignore [new file with mode: 0644]
tests/data/test-read-write/test28-without-std-fns-ref.xml [new file with mode: 0644]
tests/data/test-read-write/test28-without-std-fns.xml [new file with mode: 0644]
tests/data/test-read-write/test28-without-std-vars-ref.xml [new file with mode: 0644]
tests/data/test-read-write/test28-without-std-vars.xml [new file with mode: 0644]
tests/data/test-read-write/test28.xml [new file with mode: 0644]
tests/test-diff-suppr.cc
tests/test-read-dwarf.cc
tests/test-read-write.cc
tools/abidiff.cc
tools/abidw.cc
tools/abilint.cc

index 5405ae9f62001c27ace9fc3be96413d27ef3b7f2..6172dd5fffa086b14c6c59233cf3a13a1392d625 100644 (file)
@@ -56,6 +56,21 @@ Options
     builds the internal representation of the ABI and exits.  This
     option is usually useful for debugging purposes.
 
+  * ``--suppressions | suppr`` <*path-to-suppression-specifications-file*>
+
+    Use a :ref:`suppression specification <suppr_spec_label>` file
+    located at *path-to-suppression-specifications-file*.  Note that
+    this option can appear multiple times on the command line.  In
+    that case, all of the provided suppression specification files are
+    taken into account.  ABI artifacts matched by the suppression
+    specifications are suppressed from the output of this tool.
+
+  * ``--headers-dir | --hd`` <headers-directory-path-1>
+
+    Specifies where to find the public headers of the first shared
+    library that the tool has to consider.  The tool will thus filter
+    out types that are not defined in public headers.
+
   * ``--check-alternate-debug-info`` <*elf-path*>
 
     If the debug info for the file *elf-path* contains a reference to
index ca89eb0100b4e2f860eaf6890b8ac3fe1253f27b..9e07f47ffcddc694a086f88ca54a03aa0c2e05a6 100644 (file)
@@ -61,6 +61,21 @@ Options
     Do not display anything on standard output.  The return code of
     the command is the only way to know if the command succeeded.
 
+  * ``--suppressions | suppr`` <*path-to-suppression-specifications-file*>
+
+    Use a :ref:`suppression specification <suppr_spec_label>` file
+    located at *path-to-suppression-specifications-file*.  Note that
+    this option can appear multiple times on the command line.  In
+    that case, all of the provided suppression specification files are
+    taken into account.  ABI artifacts matched by the suppression
+    specifications are suppressed from the output of this tool.
+
+  * ``--headers-dir | --hd`` <headers-directory-path-1>
+
+    Specifies where to find the public headers of the first shared
+    library that the tool has to consider.  The tool will thus filter
+    out types that are not defined in public headers.
+
   * ``--stdin | --``
 
     Read the input content from standard input.
index 8170fe6869039595aaefb8d5427d156038087784..9befae486db19acb3a0e27cd5b27add593b4f534 100644 (file)
@@ -11,6 +11,8 @@ An ABI artifact is a relevant part of the ABI of a shared library or
 program.  Examples of ABI artifacts are exported types, variables,
 functions, or `ELF`_ symbols exported by a shared library.
 
+The set of ABI artifact for a binary is called an ABI Corpus.
+
 .. _harmfulchangeconcept_label:
 
 Harmful changes
@@ -134,6 +136,40 @@ targeted at the Ini File parser.
 So, in short, to escape a character in a regular expression, always
 prefix the character with the ``\\`` sequence.
 
+Modus operandi
+^^^^^^^^^^^^^^
+
+
+Suppression specifications can be applied at two different points of
+the processing pipeline of libabigail.
+
+.. _late_suppression_mode_label:
+
+In the default operating mode called "late suppression mode",
+suppression specifications are applied to the result of comparing the
+in-memory internal representations of two ABIs.  In this mode, if an
+ABI artifact matches a suppression specification, its changes are not
+mentioned in the ABI change report.  The internal representation of
+the "suppressed" changed ABI artifact is still present in memory; it
+is just not mentioned in the ABI change report.  The change report can
+still mention statistics about the number of changed ABI artifacts
+that were suppressed.
+
+.. _early_suppression_mode_label:
+
+There is another operating mode called the "early suppression mode"
+where suppression specifications are applied during the construction
+of the in-memory internal representation of a given ABI.  In that
+mode, if an ABI artifact matches a suppression specification, no
+in-memory internal representation is built for it.  As a result, no
+change about the matched ABI artifact is going to be mentioned in the
+ABI change report and no statistic about the number of suppressed ABI
+changes is available.  Also, please note that because suppressed ABI
+artifacts are removed from the in-memory internal representation in
+this mode, the amount memory used by the internal representation is
+potentially smaller than the memory consumption in the late
+suppression mode.
+
 Sections
 ^^^^^^^^
 
@@ -492,6 +528,26 @@ The potential properties of this sections are listed below:
  types accessed either directly or through pointers
  <example_accessed_through_label>`.
 
+* ``drop``
+
+ Usage:
+
+   ``drop`` ``=`` yes | no
+
+ If a type is matched by a suppression specification which contains
+ the "drop" property set to "yes" (or to "true") then the type is not
+ even going to be represented in the internal representation of the
+ ABI being analyzed.  This property makes its enclosing suppression
+ specification to be applied in the :ref:`early suppression
+ specification mode <early_suppression_mode_label>`.  The net effect
+ is that it potentially reduces the memory used to represent the ABI
+ being analyzed.
+
+ Please note that for this property to be effective, the enclosing
+ suppression specification must have at least one of the following
+ properties specified: ``name_regexp``, ``name``, ``name_regexp``,
+ ``source_location_not_in`` or ``source_location_not_regexp``.
+
  .. _suppr_label_property_label:
 
 * ``label``
@@ -515,8 +571,8 @@ one of the following properties must be provided:
 
   ``label``, ``file_name_regexp``, ``file_name_not_regexp``,
   ``soname_regexp``, ``soname_not_regexp``, ``name``, ``name_regexp``,
-  ``parameter``, ``return_type_name``, ``symbol_name``,
-  ``symbol_name_regexp``, ``symbol_version``,
+  ``name_not_regexp``, ``parameter``, ``return_type_name``,
+   ``symbol_name``, ``symbol_name_regexp``, ``symbol_version``,
   ``symbol_version_regexp``.
 
 If none of the following properties are provided, then the
@@ -603,6 +659,19 @@ The potential properties of this sections are:
  all of the aliases of the function for the directive to actually
  suppress the diff reports for said function.
 
+
+* ``name_not_regexp``
+
+ Usage:
+
+   ``name_not_regexp`` ``=`` <:ref:`regular-expression <suppr_regexp_label>`>
+
+ Suppresses change reports involving functions whose names don't match
+ the regular expression specified as value of this property.
+
+ The rules for functions that have several symbol names are the same
+ rules as for the ``name_regexp`` property above.
+
   .. _suppr_change_kind_property_label:
 
 
@@ -750,6 +819,26 @@ The potential properties of this sections are:
  Suppresses change reports involving functions whose symbol version
  matches the regular expression specified as value of this property.
 
+* ``drop``
+
+ Usage:
+
+   ``drop`` ``=`` yes | no
+
+ If a function is matched by a suppression specification which
+ contains the "drop" property set to "yes" (or to "true") then the
+ function is not even going to be represented in the internal
+ representation of the ABI being analyzed.  This property makes its
+ enclosing suppression specification to be applied in the :ref:`early
+ suppression specification mode <early_suppression_mode_label>`.  The
+ net effect is that it potentially reduces the memory used to
+ represent the ABI being analyzed.
+
+ Please note that for this property to be effective, the enclosing
+ suppression specification must have at least one of the following
+ properties specified: ``name_regexp``, ``name``, ``name_regexp``,
+ ``source_location_not_in`` or ``source_location_not_regexp``.
+
 ``[suppress_variable]``
 $$$$$$$$$$$$$$$$$$$$$$$$
 
index 54cb534a616a71ec4b55834d4bd779987986cc9a..4520e4d4e72ca0a6c5aab69a206a4b2a6f534e96 100644 (file)
@@ -81,7 +81,7 @@ private:
 
 public:
 
-  corpus(ir::environment*, const string&);
+  corpus(ir::environment*, const string& path= "");
 
   const environment*
   get_environment() const;
index 757cc17e86d0f9d35612301cedc434ea0a4ad5b3..9a1d1c4408df45fab185537355267c98bf8ad9e5 100644 (file)
@@ -29,6 +29,7 @@
 #include <ostream>
 #include <elfutils/libdwfl.h>
 #include "abg-corpus.h"
+#include "abg-suppression.h"
 
 #ifndef __ABG_DWARF_READER_H__
 #define __ABG_DWARF_READER_H__
@@ -98,9 +99,12 @@ create_read_context(const std::string&       elf_path,
                    ir::environment*    environment,
                    bool                read_all_types = false);
 
+void
+add_read_context_suppressions(read_context& ctxt,
+                             const suppr::suppressions_type& supprs);
+
 corpus_sptr
-read_corpus_from_elf(read_context&     ctxt,
-                    status&);
+read_corpus_from_elf(read_context& ctxt, status& stat);
 
 corpus_sptr
 read_corpus_from_elf(const std::string& elf_path,
index eda20b8d2acc50949e3a7834826ca4ebb3d6e772..e7d23f3f1e3ee7c95e4a7c60195c98a208379fa1 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <istream>
 #include "abg-corpus.h"
+#include "abg-suppression.h"
 
 namespace abigail
 {
@@ -52,6 +53,17 @@ translation_unit_sptr
 read_translation_unit_from_istream(std::istream*       in,
                                   environment* env);
 
+class read_context;
+
+/// A convenience typedef for a shared pointer to read_context.
+typedef shared_ptr<read_context> read_context_sptr;
+
+read_context_sptr
+create_native_xml_read_context(const string& path, environment *env);
+
+read_context_sptr
+create_native_xml_read_context(std::istream* in, environment* env);
+
 abigail::corpus_sptr
 read_corpus_from_file(const string& path);
 
@@ -70,6 +82,13 @@ corpus_sptr
 read_corpus_from_native_xml_file(const string& path,
                                 environment*  env);
 
+corpus_sptr
+read_corpus_from_input(read_context& ctxt);
+
+void
+add_read_context_suppressions(read_context& ctxt,
+                             const suppr::suppressions_type& supprs);
+
 }//end xml_reader
 }//end namespace abigail
 
index 02e49dda6e777c69195c3b0f3fa249e6cdef69fa..6c354799ff688fdb264f897ae5f5f0c60f9f407d 100644 (file)
@@ -58,15 +58,20 @@ class suppression_base
   // Forbid default constructor
   suppression_base();
 
-protected:
+public:
   priv_sptr priv_;
 
-public:
   suppression_base(const string& label);
 
   suppression_base(const string& label,
-                 const string& file_name_regex_str,
-                 const string& file_name_not_regex_str);
+                  const string& file_name_regex_str,
+                  const string& file_name_not_regex_str);
+
+  bool
+  get_drops_artifact_from_ir() const;
+
+  void
+  set_drops_artifact_from_ir(bool) const;
 
   bool
   get_is_artificial() const;
@@ -104,10 +109,6 @@ public:
   const string&
   get_soname_not_regex_str() const;
 
-  bool names_of_binaries_match(const diff_context& context) const;
-
-  bool sonames_of_binaries_match(const diff_context& context) const;
-
   virtual bool
   suppresses_diff(const diff*) const = 0;
 
@@ -139,13 +140,13 @@ class type_suppression : public suppression_base
   class priv;
   typedef shared_ptr<priv> priv_sptr;
 
-  priv_sptr priv_;
-
   // Forbid this;
   type_suppression();
 
 public:
 
+  priv_sptr priv_;
+
   /// The kind of the type the current type suppression is supposed to
   /// be about.
   enum type_kind
@@ -259,6 +260,13 @@ public:
   bool
   suppresses_type(const type_base_sptr& type,
                  const diff_context_sptr& ctxt) const;
+
+  bool
+  suppresses_type(const type_base_sptr& type) const;
+
+  bool
+  suppresses_type(const type_base_sptr& type,
+                 const scope_decl* type_scope) const;
 }; // end type_suppression
 
 type_suppression_sptr
@@ -390,16 +398,15 @@ typedef vector<function_suppression_sptr> function_suppressions_type;
 /// the purpose of reporting.
 class function_suppression : public suppression_base
 {
-  class priv;
+  struct priv;
   typedef shared_ptr<priv> priv_sptr;
 
-  priv_sptr priv_;
-
   // Forbid this.
   function_suppression();
 
 public:
 
+  priv_sptr priv_;
   class parameter_spec;
 
   /// Convenience typedef for shared_ptr of @ref parameter_spec.
@@ -451,16 +458,22 @@ public:
   set_change_kind(change_kind k);
 
   const string&
-  get_function_name() const;
+  get_name() const;
+
+  void
+  set_name(const string&);
+
+  const string&
+  get_name_regex_str() const;
 
   void
-  set_function_name(const string&);
+  set_name_regex_str(const string&);
 
   const string&
-  get_function_name_regex_str() const;
+  get_name_not_regex_str() const;
 
   void
-  set_function_name_regex_str(const string&);
+  set_name_not_regex_str(const string&);
 
   const string&
   get_return_type_name() const;
@@ -605,7 +618,6 @@ class variable_suppression : public suppression_base
 {
 public:
 
-
   /// The kind of change the current variable suppression should apply
   /// to.
   enum change_kind
@@ -627,12 +639,13 @@ public:
   };
 
 private:
-  class priv;
+  struct priv;
   typedef shared_ptr<priv> priv_sptr;
 
+public:
+
   priv_sptr priv_;
 
-public:
   variable_suppression(const string& label,
                       const string& name,
                       const string& name_regex_str,
@@ -666,6 +679,12 @@ public:
   void
   set_name_regex_str(const string&);
 
+  const string&
+  get_name_not_regex_str() const;
+
+  void
+  set_name_not_regex_str(const string&);
+
   const string&
   get_symbol_name() const;
 
index 7b5156ca0229b54cd137680ef5585f76c9a0e9c8..bcd69663e4fcc200f979daa41538079aef567caf 100644 (file)
@@ -19,6 +19,7 @@ abg-ir.cc                             \
 abg-corpus.cc                          \
 abg-diff-utils.cc                      \
 abg-comparison.cc                      \
+abg-suppression-priv.h                 \
 abg-suppression.cc                     \
 abg-comp-filter.cc                     \
 abg-reader.cc                          \
index 5e8ee0d4bc37775922a09b41fb1fcb957865f41e..279291b02de68be20763ee41c6b9b7236d40fc31 100644 (file)
@@ -47,6 +47,8 @@
 #include <ostream>
 #include <sstream>
 
+#include "abg-suppression-priv.h"
+
 #include "abg-internal.h"
 // <headers defining libabigail's API go under here>
 ABG_BEGIN_EXPORT_DECLARATIONS
@@ -2091,6 +2093,7 @@ elf_file_type(Elf* elf)
 class read_context
 {
   environment*                 env_;
+  suppr::suppressions_type     supprs_;
   unsigned short               dwarf_version_;
   Dwfl_Callbacks               offline_callbacks_;
   dwfl_sptr                    handle_;
@@ -2271,6 +2274,22 @@ public:
   env(ir::environment* env)
   {env_ = env;}
 
+  /// Getter of the suppression specifications to be used during
+  /// ELF/DWARF parsing.
+  ///
+  /// @return the suppression specifications.
+  const suppr::suppressions_type&
+  get_suppressions() const
+  {return supprs_;}
+
+  /// Getter of the suppression specifications to be used during
+  /// ELF/DWARF parsing.
+  ///
+  /// @return the suppression specifications.
+  suppr::suppressions_type&
+  get_suppressions()
+  {return supprs_;}
+
   /// Getter for the callbacks of the Dwarf Front End library of
   /// elfutils that is used by this reader to read dwarf.
   ///
@@ -2479,7 +2498,7 @@ public:
   /// @return true iff the source of the DIE could be determined and
   /// returned.
   bool
-  get_die_source(Dwarf_Die *die, die_source &source)
+  get_die_source(Dwarf_Die *die, die_source &source) const
   {
     assert(die);
     return get_die_source(*die, source);
@@ -2500,7 +2519,7 @@ public:
   /// @return true iff the source of the DIE could be determined and
   /// returned.
   bool
-  get_die_source(Dwarf_Die &die, die_source &source)
+  get_die_source(Dwarf_Die &die, die_source &source) const
   {
     Dwarf_Die cu_die;
     Dwarf_Die cu_kind;
@@ -3348,6 +3367,16 @@ public:
   die_tu_map()
   {return die_tu_map_;}
 
+  /// Getter for the map that associates a translation unit DIE to the
+  /// vector of imported unit points that it contains.
+  ///
+  /// @param source where the DIEs are from.
+  ///
+  /// @return the map.
+  const tu_die_imported_unit_points_map_type&
+  tu_die_imported_unit_points_map(die_source source) const
+  {return const_cast<read_context*>(this)->tu_die_imported_unit_points_map(source);}
+
   /// Getter for the map that associates a translation unit DIE to the
   /// vector of imported unit points that it contains.
   ///
@@ -3434,16 +3463,25 @@ public:
   type_section_die_parent_map()
   {return type_section_die_parent_map_;}
 
+  /// Getter of the current translation unit.
+  ///
+  /// @return the current translation unit being constructed.
   const translation_unit_sptr
-  current_translation_unit() const
+  cur_transl_unit() const
   {return cur_tu_;}
 
-  translation_unit_sptr
-  cur_tu()
+  /// Getter of the current translation unit.
+  ///
+  /// @return the current translation unit being constructed.
+  translation_unit_sptr&
+  cur_transl_unit()
   {return cur_tu_;}
 
+  /// Setter of the current translation unit.
+  ///
+  /// @param tu the current translation unit being constructed.
   void
-  cur_tu(translation_unit_sptr tu)
+  cur_transl_unit(translation_unit_sptr tu)
   {
     if (tu)
       cur_tu_ = tu;
@@ -3462,9 +3500,8 @@ public:
   {
     if (scope_stack().empty())
       {
-       if (cur_tu())
-         scope_stack().push
-           (cur_tu()->get_global_scope().get());
+       if (cur_transl_unit())
+         scope_stack().push(cur_transl_unit()->get_global_scope().get());
       }
     return scope_stack().top();
   }
@@ -4737,6 +4774,186 @@ public:
     return true;
   }
 
+  /// Tests if a suppression specification can match ABI artifacts
+  /// coming from the binary being analyzed.
+  ///
+  /// This tests if the suppression matches the soname of and binary
+  /// name of the ELF binary being analyzed.
+  ///
+  /// @param s the suppression specification to consider.
+  bool
+  suppression_can_match(const suppr::suppression_base& s) const
+  {
+    if (s.priv_->matches_soname(dt_soname())
+       && s.priv_->matches_binary_name(elf_path()))
+      return true;
+    return false;
+  }
+
+  /// Test whether if a given function suppression matches a function
+  /// designated by a regular expression that describes its linkage
+  /// name (symbol name).
+  ///
+  /// @param s the suppression specification to evaluate to see if it
+  /// matches a given function linkage name
+  ///
+  /// @param fn_linkage_name the linkage name of the function of interest.
+  ///
+  /// @return true iff the suppression specification @p s matches the
+  /// function whose linkage name is @p fn_linkage_name.
+  bool
+  suppression_matches_function_sym_name(const suppr::function_suppression_sptr& s,
+                                       const string& fn_linkage_name) const
+  {
+    if (!s)
+      return false;
+    return suppression_matches_function_sym_name(*s,fn_linkage_name);
+  }
+
+  /// Test whether if a given function suppression matches a function
+  /// designated by a regular expression that describes its linkage
+  /// name (symbol name).
+  ///
+  /// @param s the suppression specification to evaluate to see if it
+  /// matches a given function linkage name
+  ///
+  /// @param fn_linkage_name the linkage name of the function of interest.
+  ///
+  /// @return true iff the suppression specification @p s matches the
+  /// function whose linkage name is @p fn_linkage_name.
+  bool
+  suppression_matches_function_sym_name(const suppr::function_suppression& s,
+                                       const string& fn_linkage_name) const
+  {
+    if (!suppression_can_match(s))
+      return false;
+
+    return suppr::suppression_matches_function_sym_name(s, fn_linkage_name);
+  }
+
+  /// Test whether if a given function suppression matches a function
+  /// designated by a regular expression that describes its name.
+  ///
+  /// @param s the suppression specification to evaluate to see if it
+  /// matches a given function name.
+  ///
+  /// @param fn_name the name of the function of interest.  Note that
+  /// this name must be *non* qualified.
+  ///
+  /// @return true iff the suppression specification @p s matches the
+  /// function whose name is @p fn_name.
+  bool
+  suppression_matches_function_name(const suppr::function_suppression_sptr& s,
+                                   const string& fn_name) const
+  {
+    if (!s)
+      return false;
+    return suppression_matches_function_name(*s, fn_name);
+  }
+
+  /// Test whether if a given function suppression matches a function
+  /// designated by a regular expression that describes its name.
+  ///
+  /// @param s the suppression specification to evaluate to see if it
+  /// matches a given function name.
+  ///
+  /// @param fn_name the name of the function of interest.  Note that
+  /// this name must be *non* qualified.
+  ///
+  /// @return true iff the suppression specification @p s matches the
+  /// function whose name is @p fn_name.
+  bool
+  suppression_matches_function_name(const suppr::function_suppression& s,
+                                   const string& fn_name) const
+  {
+    if (!suppression_can_match(s))
+      return false;
+
+    return suppr::suppression_matches_function_name(s, fn_name);
+  }
+
+  /// Test whether if a given variable suppression specification
+  /// matches a variable denoted by its name.
+  ///
+  /// @param s the variable suppression specification to consider.
+  ///
+  /// @param var_name the name of the variable to consider.
+  ///
+  /// @return true iff the suppression specification @p s matches the
+  /// variable whose name is @p var_name.
+  bool
+  suppression_matches_variable_name(const suppr::variable_suppression& s,
+                                   const string& var_name) const
+  {
+    if (!suppression_can_match(s))
+      return false;
+
+    return suppr::suppression_matches_variable_name(s, var_name);
+  }
+
+  /// Test whether if a given variable suppression specification
+  /// matches a variable denoted by its linkage name.
+  ///
+  /// @param s the variable suppression specification to consider.
+  ///
+  /// @param var_linkage_name the linkage name of the variable to consider.
+  ///
+  /// @return true iff variable suppression specification @p s matches
+  /// the variable denoted by linkage name @p var_linkage_name.
+  bool
+  suppression_matches_variable_sym_name(const suppr::variable_suppression& s,
+                                       const string& var_linkage_name) const
+  {
+    if (!suppression_can_match(s))
+      return false;
+
+    return suppr::suppression_matches_variable_sym_name(s, var_linkage_name);
+  }
+
+  /// Test if a given type suppression specification matches a type
+  /// designated by its name and location.
+  ///
+  /// @param s the suppression specification to consider.
+  ///
+  /// @param type_name the fully qualified type name to consider.
+  ///
+  /// @param type_location the type location to consider.
+  ///
+  /// @return true iff the type suppression specification matches a
+  /// type of a given name and location.
+  bool
+  suppression_matches_type_name_or_location(const suppr::type_suppression& s,
+                                           const string& type_name,
+                                           const location& type_location) const
+  {
+    if (!suppression_can_match(s))
+      return false;
+
+    return suppr::suppression_matches_type_name_or_location(s, type_name,
+                                                           type_location);
+  }
+
+  /// Test if a type suppression specification matches the name of a
+  /// type within a given scope.
+  ///
+  /// @param s the type suppression specification to consider.
+  ///
+  /// @param type_scope the type scope to consider.
+  ///
+  /// @param type the type to consider.
+  ///
+  /// @return true iff the type suppression specification matches a
+  /// the name of type @p type.
+  bool
+  suppression_matches_type_name(const suppr::type_suppression& s,
+                               const scope_decl*               type_scope,
+                               const type_base_sptr&           type) const
+  {
+    if (!suppression_can_match(s))
+      return false;
+    return suppr::suppression_matches_type_name(s, type_scope, type);
+  }
+
   /// Getter of the exported decls builder object.
   ///
   /// @return the exported decls builder.
@@ -4991,6 +5208,17 @@ build_function_decl(read_context&        ctxt,
                    size_t              where_offset,
                    function_decl_sptr  fn);
 
+static var_decl_sptr
+build_var_decl(read_context&   ctxt,
+              Dwarf_Die        *die,
+              size_t           where_offset,
+              var_decl_sptr    result = var_decl_sptr());
+
+static bool
+variable_is_suppressed(const read_context& ctxt,
+                      const scope_decl* scope,
+                      Dwarf_Die *variable_die);
+
 static void
 finish_member_function_reading(Dwarf_Die*              die,
                               function_decl_sptr       f,
@@ -5112,41 +5340,6 @@ die_unsigned_constant_attribute(Dwarf_Die*       die,
   return true;
 }
 
-#if 0
-/// Get the value of an attribute that is supposed to be a signed
-/// constant.
-///
-///@param die the DIE to read the information from.
-///
-/// @param attr_name the DW_AT_* name of the attribute.  Must come
-/// from dwarf.h and be an enumerator representing an attribute like,
-/// e.g, DW_AT_decl_line.
-///
-///@param cst the output parameter that is set to the value of the
-/// attribute @p attr_name.  This parameter is set iff the function
-/// return true.
-///
-/// @return true if there was an attribute of the name @p attr_name
-/// and with a value that is a constant, false otherwise.
-static bool
-die_signed_constant_attribute(Dwarf_Die*       die,
-                             unsigned          attr_name,
-                             int64_t&          cst)
-{
-    if (!die)
-    return false;
-
-  Dwarf_Attribute attr;
-  Dwarf_Sword result = 0;
-  if (!dwarf_attr_integrate(die, attr_name, &attr)
-      || dwarf_formsdata(&attr, &result))
-    return false;
-
-  cst = result;
-  return true;
-}
-#endif
-
 /// Get the value of a DIE attribute; that value is meant to be a
 /// flag.
 ///
@@ -5279,8 +5472,10 @@ die_address_attribute(Dwarf_Die* die, unsigned attr_name, Dwarf_Addr& result)
 /// @param ctxt the @ref read_context to use.
 ///
 /// @param die the DIE the read the source location from.
+///
+/// @return the location associated with @p die.
 static location
-die_location(read_context& ctxt, Dwarf_Die* die)
+die_location(const read_context& ctxt, Dwarf_Die* die)
 {
   if (!die)
     return location();
@@ -5291,7 +5486,7 @@ die_location(read_context& ctxt, Dwarf_Die* die)
 
   if (!file.empty() && line != 0)
     {
-      translation_unit_sptr tu = ctxt.cur_tu();
+      translation_unit_sptr tu = ctxt.cur_transl_unit();
       location l = tu->get_loc_mgr().create_new_location(file, line, 1);
       return l;
     }
@@ -5310,11 +5505,11 @@ die_location(read_context& ctxt, Dwarf_Die* die)
 ///
 /// @param linkage_name the linkage_name output parameter to set.
 static void
-die_loc_and_name(read_context& ctxt,
-                Dwarf_Die*     die,
-                location&      loc,
-                string&        name,
-                string&        linkage_name)
+die_loc_and_name(const read_context&   ctxt,
+                Dwarf_Die*             die,
+                location&              loc,
+                string&                name,
+                string&                linkage_name)
 {
   loc = die_location(ctxt, die);
   name = die_string_attribute(die, DW_AT_name);
@@ -6706,7 +6901,7 @@ die_virtual_function_index(Dwarf_Die* die,
 /// @return true iff an imported unit is found between @p
 /// first_die_offset and @p last_die_offset.
 static bool
-find_import_unit_point_between_dies(read_context&      ctxt,
+find_import_unit_point_between_dies(const read_context& ctxt,
                                    size_t              partial_unit_offset,
                                    Dwarf_Off           first_die_offset,
                                    Dwarf_Off           first_die_cu_offset,
@@ -6714,15 +6909,15 @@ find_import_unit_point_between_dies(read_context&       ctxt,
                                    size_t              last_die_offset,
                                    size_t&             imported_point_offset)
 {
-  tu_die_imported_unit_points_map_type& tu_die_imported_unit_points_map =
+  const tu_die_imported_unit_points_map_type& tu_die_imported_unit_points_map =
     ctxt.tu_die_imported_unit_points_map(source);
 
-  tu_die_imported_unit_points_map_type::iterator iter =
+  tu_die_imported_unit_points_map_type::const_iterator iter =
     tu_die_imported_unit_points_map.find(first_die_cu_offset);
 
   assert(iter != tu_die_imported_unit_points_map.end());
 
-  imported_unit_points_type& imported_unit_points = iter->second;
+  const imported_unit_points_type& imported_unit_points = iter->second;
   if (imported_unit_points.empty())
     return false;
 
@@ -6809,7 +7004,7 @@ find_import_unit_point_between_dies(read_context& ctxt,
 /// Note that if an imported unit is found after @p die_offset then @p
 /// imported_point_offset is set and the function return false.
 static bool
-find_import_unit_point_before_die(read_context&        ctxt,
+find_import_unit_point_before_die(const read_context&  ctxt,
                                  size_t                partial_unit_offset,
                                  size_t                where_offset,
                                  size_t&               imported_point_offset)
@@ -6868,10 +7063,10 @@ find_import_unit_point_before_die(read_context& ctxt,
 /// @return true if the function could get a parent DIE, false
 /// otherwise.
 static bool
-get_parent_die(read_context&   ctxt,
-              Dwarf_Die*       die,
-              Dwarf_Die&       parent_die,
-              size_t           where_offset)
+get_parent_die(const read_context&     ctxt,
+              Dwarf_Die*               die,
+              Dwarf_Die&               parent_die,
+              size_t                   where_offset)
 {
   assert(ctxt.dwarf());
 
@@ -6978,7 +7173,7 @@ get_scope_for_die(read_context& ctxt,
        {
          assert(source_of_die == ALT_DEBUG_INFO_DIE_SOURCE
                 || source_of_die == TYPE_UNIT_DIE_SOURCE);
-         return ctxt.cur_tu()->get_global_scope();
+         return ctxt.cur_transl_unit()->get_global_scope();
        }
 
       // For top level DIEs like DW_TAG_compile_unit, we just want to
@@ -7247,7 +7442,7 @@ build_translation_unit_and_add_to_ir(read_context&        ctxt,
   result->set_language(dwarf_language_to_tu_language(l));
 
   ctxt.current_corpus()->add(result);
-  ctxt.cur_tu(result);
+  ctxt.cur_transl_unit(result);
   ctxt.die_tu_map()[dwarf_dieoffset(die)] = result;
 
   Dwarf_Die child;
@@ -7283,8 +7478,9 @@ build_translation_unit_and_add_to_ir(read_context&        ctxt,
            if (!fqn_comps.empty())
              {
                ty_name = components_to_type_name(fqn_comps);
-               ty_decl = lookup_type_in_translation_unit(ty_name,
-                                                         *ctxt.cur_tu());
+               ty_decl =
+                 lookup_type_in_translation_unit(ty_name,
+                                                 *ctxt.cur_transl_unit());
              }
            if (class_decl_sptr cl = dynamic_pointer_cast<class_decl>(ty_decl))
              {
@@ -7513,7 +7709,7 @@ build_enum_type(read_context& ctxt, Dwarf_Die* die)
   type_decl_sptr t(new type_decl(ctxt.env(), underlying_type_name,
                                 size, size, location()));
   t->set_is_anonymous(enum_underlying_type_is_anonymous);
-  translation_unit_sptr tu = ctxt.cur_tu();
+  translation_unit_sptr tu = ctxt.cur_transl_unit();
   decl_base_sptr d =
     add_decl_to_scope(t, tu->get_global_scope().get());
   canonicalize(t);
@@ -7825,14 +8021,6 @@ build_class_type_and_add_to_ir(read_context&     ctxt,
              if (lookup_var_decl_in_scope(n, result))
                continue;
 
-             decl_base_sptr ty = is_decl(
-               build_ir_node_from_die(ctxt, &type_die,
-                                      called_from_public_decl,
-                                      where_offset));
-             type_base_sptr t = is_type(ty);
-             if (!t)
-               continue;
-
              ssize_t offset_in_bits = 0;
              bool is_laid_out = false;
              is_laid_out = die_member_offset(&child, offset_in_bits);
@@ -7841,6 +8029,20 @@ build_class_type_and_add_to_ir(read_context&     ctxt,
              // templates, we'll try to be more specific.  For now,
              // this approximation should do OK.
              bool is_static = !is_laid_out;
+
+             if (is_static && variable_is_suppressed(ctxt,
+                                                     result.get(),
+                                                     &child))
+               continue;
+
+             decl_base_sptr ty = is_decl(
+               build_ir_node_from_die(ctxt, &type_die,
+                                      called_from_public_decl,
+                                      where_offset));
+             type_base_sptr t = is_type(ty);
+             if (!t)
+               continue;
+
              if (!is_static)
                // We have a non-static data member.  So this class
                // cannot be a declaration-only class anymore, even if
@@ -8095,7 +8297,7 @@ build_pointer_type_def(read_context&      ctxt,
   // if the DIE for the pointer type doesn't have a byte_size
   // attribute then we assume the size of the pointer is the address
   // size of the current translation unit.
-  uint64_t size = ctxt.cur_tu()->get_address_size();
+  uint64_t size = ctxt.cur_transl_unit()->get_address_size();
   if (die_unsigned_constant_attribute(die, DW_AT_byte_size, size))
     // The size as expressed by DW_AT_byte_size is in byte, so let's
     // convert it to bits.
@@ -8103,7 +8305,7 @@ build_pointer_type_def(read_context&      ctxt,
 
   // And the size of the pointer must be the same as the address size
   // of the current translation unit.
-  assert((size_t) ctxt.cur_tu()->get_address_size() == size);
+  assert((size_t) ctxt.cur_transl_unit()->get_address_size() == size);
 
   result.reset(new pointer_type_def(utype, size, /*alignment=*/0, location()));
   assert(result->get_pointed_to_type());
@@ -8174,13 +8376,13 @@ build_reference_type(read_context&      ctxt,
   // if the DIE for the reference type doesn't have a byte_size
   // attribute then we assume the size of the reference is the address
   // size of the current translation unit.
-  uint64_t size = ctxt.cur_tu()->get_address_size();
+  uint64_t size = ctxt.cur_transl_unit()->get_address_size();
   if (die_unsigned_constant_attribute(die, DW_AT_byte_size, size))
     size *= 8;
 
   // And the size of the pointer must be the same as the address size
   // of the current translation unit.
-  assert((size_t) ctxt.cur_tu()->get_address_size() == size);
+  assert((size_t) ctxt.cur_transl_unit()->get_address_size() == size);
 
   bool is_lvalue = (tag == DW_TAG_reference_type) ? true : false;
 
@@ -8225,7 +8427,7 @@ build_function_type(read_context& ctxt,
 
   decl_base_sptr type_decl;
 
-  translation_unit_sptr tu = ctxt.cur_tu();
+  translation_unit_sptr tu = ctxt.cur_transl_unit();
   assert(tu);
 
   // The call to build_ir_node_from_die() could have triggered the
@@ -8396,7 +8598,7 @@ build_array_type(read_context&    ctxt,
   Dwarf_Die child;
   array_type_def::subranges_type subranges;
   translation_unit::language language =
-    ctxt.current_translation_unit()->get_language();
+    ctxt.cur_transl_unit()->get_language();
   uint64_t upper_bound = 0;
   uint64_t lower_bound = get_default_array_lower_bound(language);
   uint64_t count = 0;
@@ -8533,6 +8735,39 @@ build_typedef_type(read_context& ctxt,
   return result;
 }
 
+/// Build a @ref var_decl out of a DW_TAG_variable DIE iff the
+/// variable denoted by the DIE is not suppressed by a suppression
+/// specification associated to the current read context.
+///
+/// @param ctxt the read context to use.
+///
+/// @param die the DIE representing the variable we are looking at.
+///
+/// @param where_offset the offset of the DIE where we are "logically"
+/// positionned at, in the DIE tree.  This is useful when @p die is
+/// e.g, DW_TAG_partial_unit that can be included in several places in
+/// the DIE tree.
+///
+/// @param result if this is set to an existing var_decl, this means
+/// that the function will append the new properties it sees on @p die
+/// to that exising var_decl.  Otherwise, if this parameter is NULL, a
+/// new var_decl is going to be allocated and returned.
+///
+/// @return a pointer to the newly created var_decl.  If the var_decl
+/// could not be built, this function returns NULL.
+static var_decl_sptr
+build_var_decl_if_not_suppressed(read_context& ctxt,
+                                scope_decl     *scope,
+                                Dwarf_Die      *die,
+                                size_t where_offset,
+                                var_decl_sptr  result = var_decl_sptr())
+{
+  var_decl_sptr var;
+  if (!variable_is_suppressed(ctxt, scope, die))
+    var = build_var_decl(ctxt, die, where_offset, result);
+  return var;
+}
+
 /// Build a @ref var_decl out of a DW_TAG_variable DIE.
 ///
 /// @param ctxt the read context to use.
@@ -8555,7 +8790,7 @@ static var_decl_sptr
 build_var_decl(read_context&   ctxt,
               Dwarf_Die        *die,
               size_t           where_offset,
-              var_decl_sptr    result = var_decl_sptr())
+              var_decl_sptr    result)
 {
   if (!die)
     return result;
@@ -8625,6 +8860,101 @@ build_var_decl(read_context&    ctxt,
   return result;
 }
 
+/// Test if a given function denoted by its DIE and its scope is
+/// suppressed by any of the suppression specifications associated to
+/// a given context of ELF/DWARF reading.
+///
+/// @param ctxt the ELF/DWARF reading content of interest.
+///
+/// @param scope of the scope of the function.
+///
+/// @param function_die the DIE representing the function.
+///
+/// @return true iff @p function_die is suppressed by at least one
+/// suppression specification attached to the @p ctxt.
+static bool
+function_is_suppressed(const read_context& ctxt,
+                      const scope_decl* scope,
+                      Dwarf_Die *function_die)
+{
+  if (function_die == 0
+      || dwarf_tag(function_die) != DW_TAG_subprogram)
+    return false;
+
+  string fname = die_string_attribute(function_die, DW_AT_name);
+  string flinkage_name = die_linkage_name(function_die);
+  string qualified_name = build_qualified_name(scope, fname);
+
+  return suppr::function_is_suppressed(ctxt, qualified_name,
+                                      flinkage_name,
+                                      /*require_drop_property=*/true);
+}
+
+/// Test if a given variable denoted by its DIE and its scope is
+/// suppressed by any of the suppression specifications associated to
+/// a given context of ELF/DWARF reading.
+///
+/// @param ctxt the ELF/DWARF reading content of interest.
+///
+/// @param scope of the scope of the variable.
+///
+/// @param variable_die the DIE representing the variable.
+///
+/// @return true iff @p variable_die is suppressed by at least one
+/// suppression specification attached to the @p ctxt.
+static bool
+variable_is_suppressed(const read_context& ctxt,
+                      const scope_decl* scope,
+                      Dwarf_Die *variable_die)
+{
+  if (variable_die == 0
+      || (dwarf_tag(variable_die) != DW_TAG_variable
+         && dwarf_tag(variable_die) != DW_TAG_member))
+    return false;
+
+  string name = die_string_attribute(variable_die, DW_AT_name);
+  string linkage_name = die_linkage_name(variable_die);
+  string qualified_name = build_qualified_name(scope, name);
+
+  return suppr::variable_is_suppressed(ctxt, qualified_name,
+                                      linkage_name,
+                                      /*require_drop_property=*/true);
+}
+
+/// Test if a type (designated by a given DIE) in a given scope is
+/// suppressed by the suppression specifications that are associated
+/// to a given read context.
+///
+/// @param ctxt the read context to consider.
+///
+/// @param scope of the scope of the type DIE to consider.
+///
+/// @param type_die the DIE that designates the type to consider.
+///
+/// @return true iff the type designated by the DIE @p type_die, in
+/// the scope @p scope is suppressed by at the suppression
+/// specifications associated to the current read context.
+static bool
+type_is_suppressed(const read_context& ctxt,
+                  const scope_decl* scope,
+                  Dwarf_Die *type_die)
+{
+  if (type_die == 0
+      || (dwarf_tag(type_die) != DW_TAG_enumeration_type
+         && dwarf_tag(type_die) != DW_TAG_class_type
+         && dwarf_tag(type_die) != DW_TAG_structure_type))
+    return false;
+
+  string type_name, linkage_name;
+  location type_location;
+  die_loc_and_name(ctxt, type_die, type_location, type_name, linkage_name);
+  string qualified_name = build_qualified_name(scope, type_name);
+
+  return suppr::type_is_suppressed(ctxt, qualified_name,
+                                  type_location,
+                                  /*require_drop_property=*/true);
+}
+
 /// Build a @ref function_decl our of a DW_TAG_subprogram DIE.
 ///
 /// @param ctxt the read context to use
@@ -8655,7 +8985,7 @@ build_function_decl(read_context& ctxt,
  if (!die_is_public_decl(die))
    return result;
 
- translation_unit_sptr tu = ctxt.cur_tu();
+ translation_unit_sptr tu = ctxt.cur_transl_unit();
   assert(tu);
 
   string fname, flinkage_name;
@@ -8993,7 +9323,8 @@ build_ir_node_from_die(read_context&      ctxt,
     case DW_TAG_base_type:
       if (type_decl_sptr t = build_type_decl(ctxt, die))
          {
-           result = add_decl_to_scope(t, ctxt.cur_tu()->get_global_scope());
+           result =
+             add_decl_to_scope(t, ctxt.cur_transl_unit()->get_global_scope());
            canonicalize(t);
          }
       break;
@@ -9020,7 +9351,8 @@ build_ir_node_from_die(read_context&      ctxt,
                                 where_offset);
        if (p)
          {
-           result = add_decl_to_scope(p, ctxt.cur_tu()->get_global_scope());
+           result =
+             add_decl_to_scope(p, ctxt.cur_transl_unit()->get_global_scope());
            assert(result->get_translation_unit());
            maybe_canonicalize_type(dwarf_dieoffset(die), source_of_die, ctxt);
          }
@@ -9036,7 +9368,8 @@ build_ir_node_from_die(read_context&      ctxt,
                               where_offset);
        if (r)
          {
-           result = add_decl_to_scope(r, ctxt.cur_tu()->get_global_scope());
+           result =
+             add_decl_to_scope(r, ctxt.cur_transl_unit()->get_global_scope());
            ctxt.associate_die_to_type(dwarf_dieoffset(die), source_of_die, r);
            maybe_canonicalize_type(dwarf_dieoffset(die), source_of_die, ctxt);
          }
@@ -9061,7 +9394,8 @@ build_ir_node_from_die(read_context&      ctxt,
            // different from 'q', because 'ty' is 'q' possibly
            // stripped from some redundant type qualifier.
            ctxt.associate_die_to_type(dwarf_dieoffset(die), source_of_die, ty);
-           result = add_decl_to_scope(d, ctxt.cur_tu()->get_global_scope());
+           result =
+             add_decl_to_scope(d, ctxt.cur_transl_unit()->get_global_scope());
            maybe_canonicalize_type(dwarf_dieoffset(die), source_of_die, ctxt);
          }
       }
@@ -9069,12 +9403,16 @@ build_ir_node_from_die(read_context&    ctxt,
 
     case DW_TAG_enumeration_type:
       {
-       enum_type_decl_sptr e = build_enum_type(ctxt, die);
-       result = add_decl_to_scope(e, scope);
-       if (result)
+       if (!type_is_suppressed(ctxt, scope, die))
          {
-           maybe_set_member_type_access_specifier(is_decl(result), die);
-           maybe_canonicalize_type(dwarf_dieoffset(die), source_of_die, ctxt);
+           enum_type_decl_sptr e = build_enum_type(ctxt, die);
+           result = add_decl_to_scope(e, scope);
+           if (result)
+             {
+               maybe_set_member_type_access_specifier(is_decl(result), die);
+               maybe_canonicalize_type(dwarf_dieoffset(die),
+                                       source_of_die, ctxt);
+             }
          }
       }
       break;
@@ -9082,44 +9420,49 @@ build_ir_node_from_die(read_context&    ctxt,
     case DW_TAG_class_type:
     case DW_TAG_structure_type:
       {
-       Dwarf_Die spec_die;
-       scope_decl_sptr scop;
-       class_decl_sptr klass;
-       if (die_die_attribute(die, DW_AT_specification, spec_die))
+       if (!type_is_suppressed(ctxt, scope, die))
          {
-           scope_decl_sptr skope = get_scope_for_die(ctxt, &spec_die,
-                                                     called_from_public_decl,
-                                                     where_offset);
-           assert(skope);
-           decl_base_sptr cl =
-             is_decl(build_ir_node_from_die(ctxt, &spec_die,
-                                            skope.get(),
-                                            called_from_public_decl,
-                                            where_offset));
-           assert(cl);
-           klass = dynamic_pointer_cast<class_decl>(cl);
-           assert(klass);
-
-           klass =
-             build_class_type_and_add_to_ir(ctxt, die,
-                                            skope.get(),
-                                            tag == DW_TAG_structure_type,
-                                            klass,
-                                            called_from_public_decl,
-                                            where_offset);
-         }
-       else
-         klass =
-           build_class_type_and_add_to_ir(ctxt, die,
-                                          scope, tag == DW_TAG_structure_type,
-                                          class_decl_sptr(),
-                                          called_from_public_decl,
-                                          where_offset);
-       result = klass;
-       if (klass)
-         {
-           maybe_set_member_type_access_specifier(klass, die);
-           maybe_canonicalize_type(dwarf_dieoffset(die), source_of_die, ctxt);
+           Dwarf_Die spec_die;
+           scope_decl_sptr scop;
+           class_decl_sptr klass;
+           if (die_die_attribute(die, DW_AT_specification, spec_die))
+             {
+               scope_decl_sptr skope =
+                 get_scope_for_die(ctxt, &spec_die,
+                                   called_from_public_decl,
+                                   where_offset);
+               assert(skope);
+               decl_base_sptr cl =
+                 is_decl(build_ir_node_from_die(ctxt, &spec_die,
+                                                skope.get(),
+                                                called_from_public_decl,
+                                                where_offset));
+               assert(cl);
+               klass = dynamic_pointer_cast<class_decl>(cl);
+               assert(klass);
+
+               klass =
+                 build_class_type_and_add_to_ir(ctxt, die,
+                                                skope.get(),
+                                                tag == DW_TAG_structure_type,
+                                                klass,
+                                                called_from_public_decl,
+                                                where_offset);
+             }
+           else
+             klass =
+               build_class_type_and_add_to_ir(ctxt, die, scope,
+                                              tag == DW_TAG_structure_type,
+                                              class_decl_sptr(),
+                                              called_from_public_decl,
+                                              where_offset);
+           result = klass;
+           if (klass)
+             {
+               maybe_set_member_type_access_specifier(klass, die);
+               maybe_canonicalize_type(dwarf_dieoffset(die),
+                                       source_of_die, ctxt);
+             }
          }
       }
       break;
@@ -9149,7 +9492,8 @@ build_ir_node_from_die(read_context&      ctxt,
                                                 where_offset);
        if (a)
          {
-           result = add_decl_to_scope(a, ctxt.cur_tu()->get_global_scope());
+           result =
+             add_decl_to_scope(a, ctxt.cur_transl_unit()->get_global_scope());
            ctxt.associate_die_to_type(dwarf_dieoffset(die), source_of_die, a);
            maybe_canonicalize_type(dwarf_dieoffset(die), source_of_die, ctxt);
          }
@@ -9195,14 +9539,14 @@ build_ir_node_from_die(read_context&    ctxt,
            || (var_is_cloned = die_die_attribute(die, DW_AT_abstract_origin,
                                                  spec_die, false)))
          {
-           scope_decl_sptr scop = get_scope_for_die(ctxt, &spec_die,
-                                                    called_from_public_decl,
-                                                    where_offset);
-           if (scop)
+           scope_decl_sptr spec_scope = get_scope_for_die(ctxt, &spec_die,
+                                                          called_from_public_decl,
+                                                          where_offset);
+           if (spec_scope)
              {
                decl_base_sptr d =
                  is_decl(build_ir_node_from_die(ctxt, &spec_die,
-                                                scop.get(),
+                                                spec_scope.get(),
                                                 called_from_public_decl,
                                                 where_offset));
                if (d)
@@ -9229,7 +9573,9 @@ build_ir_node_from_die(read_context&      ctxt,
                  }
              }
          }
-       else if (var_decl_sptr v = build_var_decl(ctxt, die, where_offset))
+       else if (var_decl_sptr v =
+                build_var_decl_if_not_suppressed(ctxt, scope, die,
+                                                 where_offset))
          {
            result = add_decl_to_scope(v, scope);
            assert(is_decl(result)->get_scope());
@@ -9247,7 +9593,7 @@ build_ir_node_from_die(read_context&      ctxt,
          Dwarf_Die spec_die;
          Dwarf_Die abstract_origin_die;
          Dwarf_Die *interface_die = 0, *origin_die = 0;
-         scope_decl_sptr scop;
+         scope_decl_sptr interface_scope;
          if (die_is_artificial(die))
            break;
 
@@ -9271,15 +9617,15 @@ build_ir_node_from_die(read_context&    ctxt,
              string linkage_name = die_linkage_name(die);
              string spec_linkage_name = die_linkage_name(interface_die);
 
-             scop = get_scope_for_die(ctxt, interface_die,
-                                      called_from_public_decl,
-                                      where_offset);
-             if (scop)
+             interface_scope = get_scope_for_die(ctxt, interface_die,
+                                                 called_from_public_decl,
+                                                 where_offset);
+             if (interface_scope)
                {
                  decl_base_sptr d =
                    is_decl(build_ir_node_from_die(ctxt,
                                                   origin_die,
-                                                  scop.get(),
+                                                  interface_scope.get(),
                                                   called_from_public_decl,
                                                   where_offset));
                  if (d)
@@ -9300,7 +9646,19 @@ build_ir_node_from_die(read_context&     ctxt,
            }
        ctxt.scope_stack().push(scope);
 
-       result = build_function_decl(ctxt, die, where_offset, fn);
+       scope_decl* logical_scope =
+         interface_scope
+         ? interface_scope.get()
+         : scope;
+
+       if (function_is_suppressed(ctxt, logical_scope, die))
+         // The function has been suppressed by a suppression
+         // specification, Do not try to build an internal
+         // representation for it.
+         ;
+       else
+         result = build_function_decl(ctxt, die, where_offset, fn);
+
        if (result && !fn)
          result = add_decl_to_scope(is_decl(result), scope);
 
@@ -9405,7 +9763,7 @@ build_ir_node_for_void_type(read_context& ctxt)
   assert(env);
   decl_base_sptr t = env->get_void_type_decl();
   if (!has_scope(t))
-    add_decl_to_scope(t, ctxt.cur_tu()->get_global_scope());
+    add_decl_to_scope(t, ctxt.cur_transl_unit()->get_global_scope());
   canonicalize(is_type(t));
   return t;
 }
@@ -9517,6 +9875,41 @@ create_read_context(const std::string&           elf_path,
   return result;
 }
 
+/// Add suppressions specifications to the set of suppressions to be
+/// used during the construction of the ABI internal representation
+/// (the ABI corpus) from ELF and DWARF.
+///
+/// During the construction of the ABI corpus, ABI artifacts that
+/// match the a given suppression specification are dropped on the
+/// floor; that is, they are discarded and won't be part of the final
+/// ABI corpus.  This is a way to reduce the amount of data held by
+/// the final ABI corpus.
+///
+/// Note that the suppression specifications provided to this function
+/// are only considered during the construction of the ABI corpus.
+/// For instance, they are not taken into account during e.g
+/// comparisons of two ABI corpora that might happen later.  If you
+/// want to apply suppression specificatins to the comparison (or
+/// reporting) of ABI corpora please refer to the documentation of the
+/// @ref diff_context type to learn how to set suppressions that are
+/// to be used in that context.
+///
+/// @param ctxt the context that is going to be used by functions that
+/// read ELF and DWARF information to construct and ABI corpus.
+///
+/// @param supprs the suppression specifications to be applied during
+/// the construction of the ABI corpus.
+void
+add_read_context_suppressions(read_context& ctxt,
+                             const suppr::suppressions_type& supprs)
+{
+  for (suppr::suppressions_type::const_iterator i = supprs.begin();
+       i != supprs.end();
+       ++i)
+    if ((*i)->get_drops_artifact_from_ir())
+      ctxt.get_suppressions().push_back(*i);
+}
+
 /// Read all @ref abigail::translation_unit possible from the debug info
 /// accessible from an elf file, stuff them into a libabigail ABI
 /// Corpus and return it.
index 61118d4cafc5c5fa0c1bde71b92485c8bf42a6db..6ec5dc5534230641cae687e278459a2b6374c3ff 100644 (file)
@@ -36,6 +36,8 @@
 #include <libxml/xmlstring.h>
 #include <libxml/xmlreader.h>
 
+#include "abg-suppression-priv.h"
+
 #include "abg-internal.h"
 // <headers defining libabigail's API go under here>
 ABG_BEGIN_EXPORT_DECLARATIONS
@@ -107,6 +109,7 @@ public:
   typedef unordered_map<xmlNodePtr, decl_base_sptr> xml_node_decl_base_sptr_map;
 
 private:
+  string                                               m_path;
   environment*                                         m_env;
   unordered_map<string, vector<type_base_sptr> >       m_types_map;
   unordered_map<string, shared_ptr<function_tdecl> >   m_fn_tmpl_map;
@@ -119,7 +122,8 @@ private:
   xmlNodePtr                                           m_corp_node;
   deque<shared_ptr<decl_base> >                        m_decls_stack;
   corpus_sptr                                          m_corpus;
-  corpus::exported_decls_builder*                      m_exported_decls_builder_;
+  corpus::exported_decls_builder*                      m_exported_decls_builder;
+  suppr::suppressions_type                             m_supprs;
 
   read_context();
 
@@ -129,9 +133,23 @@ public:
     : m_env(env),
       m_reader(reader),
       m_corp_node(),
-      m_exported_decls_builder_()
+      m_exported_decls_builder()
   {}
 
+  /// Getter of the path to the ABI file.
+  ///
+  /// @return the path to the native xml abi file.
+  const string&
+  get_path() const
+  {return m_path;}
+
+  /// Setter of the path to the ABI file.
+  ///
+  /// @param the new path to the native ABI file.
+  void
+  set_path(const string& s)
+  {m_path = s;}
+
   /// Getter for the environment of this reader.
   ///
   /// @return the environment of this reader.
@@ -331,7 +349,7 @@ public:
 
   /// Return the current lexical scope.
   scope_decl*
-  get_cur_scope()
+  get_cur_scope() const
   {
     shared_ptr<decl_base> cur_decl = get_cur_decl();
 
@@ -703,7 +721,7 @@ public:
   /// @return the exported decls builder.
   corpus::exported_decls_builder*
   get_exported_decls_builder()
-  {return m_exported_decls_builder_;}
+  {return m_exported_decls_builder;}
 
   /// Setter for the object that determines if a given declaration
   /// ought to be put in the set of exported decls of the current
@@ -714,7 +732,23 @@ public:
   /// @return the exported decls builder.
   void
   set_exported_decls_builder(corpus::exported_decls_builder* d)
-  {m_exported_decls_builder_ = d;}
+  {m_exported_decls_builder = d;}
+
+  /// Getter of the vector of the suppression specifications
+  /// associated to the current read context.
+  ///
+  /// @return the vector of suppression specifications.
+  suppr::suppressions_type&
+  get_suppressions()
+  {return m_supprs;}
+
+  /// Getter of the vector of the suppression specifications
+  /// associated to the current read context.
+  ///
+  /// @return the vector of suppression specifications.
+  const suppr::suppressions_type&
+  get_suppressions() const
+  {return const_cast<read_context*>(this)->get_suppressions();}
 
   /// Add a given function to the set of exported functions of the
   /// current corpus, if the function satisfies the different
@@ -836,6 +870,170 @@ public:
         ++i)
       canonicalize(*i);
   }
+
+  /// Test whether if a given function suppression matches a function
+  /// designated by a regular expression that describes its name.
+  ///
+  /// @param s the suppression specification to evaluate to see if it
+  /// matches a given function name.
+  ///
+  /// @param fn_name the name of the function of interest.  Note that
+  /// this name must be *non* qualified.
+  ///
+  /// @return true iff the suppression specification @p s matches the
+  /// function whose name is @p fn_name.
+  bool
+  suppression_matches_function_name(const suppr::function_suppression_sptr& s,
+                                   const string& fn_name) const
+  {
+    if (!s)
+      return false;
+    return suppression_matches_function_name(*s, fn_name);
+  }
+
+  /// Tests if a suppression specification can match ABI artifacts
+  /// coming from the ABI corpus being analyzed.
+  ///
+  /// This tests if the suppression matches the soname of and binary
+  /// name of the corpus being analyzed.
+  ///
+  /// @param s the suppression specification to consider.
+  bool
+  suppression_can_match(const suppr::suppression_base& s) const
+  {
+    corpus_sptr corp = get_corpus();
+    if (s.priv_->matches_soname(corp->get_soname())
+       && s.priv_->matches_binary_name(corp->get_path()))
+      return true;
+    return false;
+  }
+
+  /// Test whether if a given function suppression matches a function
+  /// designated by a regular expression that describes its name.
+  ///
+  /// @param s the suppression specification to evaluate to see if it
+  /// matches a given function name.
+  ///
+  /// @param fn_name the name of the function of interest.  Note that
+  /// this name must be *non* qualified.
+  ///
+  /// @return true iff the suppression specification @p s matches the
+  /// function whose name is @p fn_name.
+  bool
+  suppression_matches_function_name(const suppr::function_suppression& s,
+                                   const string& fn_name) const
+  {
+    if (!s.get_drops_artifact_from_ir()
+       || !suppression_can_match(s))
+      return false;
+
+    return suppr::suppression_matches_function_name(s, fn_name);
+  }
+
+  /// Test whether if a given function suppression matches a function
+  /// designated by a regular expression that describes its linkage
+  /// name (symbol name).
+  ///
+  /// @param s the suppression specification to evaluate to see if it
+  /// matches a given function linkage name
+  ///
+  /// @param fn_linkage_name the linkage name of the function of interest.
+  ///
+  /// @return true iff the suppression specification @p s matches the
+  /// function whose linkage name is @p fn_linkage_name.
+  bool
+  suppression_matches_function_sym_name(const suppr::function_suppression_sptr& s,
+                                       const string& fn_linkage_name) const
+  {
+    if (!s)
+      return false;
+    return suppression_matches_function_sym_name(*s, fn_linkage_name);
+  }
+
+  /// Test whether if a given function suppression matches a function
+  /// designated by a regular expression that describes its linkage
+  /// name (symbol name).
+  ///
+  /// @param s the suppression specification to evaluate to see if it
+  /// matches a given function linkage name
+  ///
+  /// @param fn_linkage_name the linkage name of the function of interest.
+  ///
+  /// @return true iff the suppression specification @p s matches the
+  /// function whose linkage name is @p fn_linkage_name.
+  bool
+  suppression_matches_function_sym_name(const suppr::function_suppression& s,
+                                       const string& fn_linkage_name) const
+  {
+    if (!s.get_drops_artifact_from_ir()
+       || !suppression_can_match(s))
+      return false;
+
+    return suppr::suppression_matches_function_sym_name(s, fn_linkage_name);
+  }
+
+  /// Test whether if a given variable suppression specification
+  /// matches a variable denoted by its name.
+  ///
+  /// @param s the variable suppression specification to consider.
+  ///
+  /// @param var_name the name of the variable to consider.
+  ///
+  /// @return true iff the suppression specification @p s matches the
+  /// variable whose name is @p var_name.
+  bool
+  suppression_matches_variable_name(const suppr::variable_suppression& s,
+                                   const string& var_name) const
+  {
+    if (!s.get_drops_artifact_from_ir()
+       || !suppression_can_match(s))
+      return false;
+
+    return suppr::suppression_matches_variable_name(s, var_name);
+  }
+
+  /// Test whether if a given variable suppression specification
+  /// matches a variable denoted by its linkage name.
+  ///
+  /// @param s the variable suppression specification to consider.
+  ///
+  /// @param var_linkage_name the linkage name of the variable to consider.
+  ///
+  /// @return true iff variable suppression specification @p s matches
+  /// the variable denoted by linkage name @p var_linkage_name.
+  bool
+  suppression_matches_variable_sym_name(const suppr::variable_suppression& s,
+                                       const string& var_linkage_name) const
+  {
+    if (!s.get_drops_artifact_from_ir()
+       || !suppression_can_match(s))
+      return false;
+
+    return suppr::suppression_matches_variable_sym_name(s, var_linkage_name);
+  }
+
+  /// Test if a given type suppression specification matches a type
+  /// designated by its name and location.
+  ///
+  /// @param s the suppression specification to consider.
+  ///
+  /// @param type_name the fully qualified type name to consider.
+  ///
+  /// @param type_location the type location to consider.
+  ///
+  /// @return true iff the type suppression specification matches a
+  /// type of a given name and location.
+  bool
+  suppression_matches_type_name_or_location(const suppr::type_suppression& s,
+                                           const string& type_name,
+                                           const location& type_location) const
+  {
+    if (!suppression_can_match(s))
+      return false;
+
+    return suppr::suppression_matches_type_name_or_location(s, type_name,
+                                                           type_location);
+  }
 };// end class read_context
 
 static int     advance_cursor(read_context&);
@@ -845,7 +1043,7 @@ static translation_unit_sptr read_translation_unit_from_input(read_context&);
 static bool    read_symbol_db_from_input(read_context&,
                                          string_elf_symbols_map_sptr&,
                                          string_elf_symbols_map_sptr&);
-static bool    read_location(read_context&, xmlNodePtr, location&);
+static bool    read_location(const read_context&, xmlNodePtr, location&);
 static bool    read_visibility(xmlNodePtr, decl_base::visibility&);
 static bool    read_binding(xmlNodePtr, decl_base::binding&);
 static bool    read_access(xmlNodePtr, access_specifier&);
@@ -879,16 +1077,31 @@ build_elf_symbol_from_reference(read_context&, const xmlNodePtr,
 static string_elf_symbols_map_sptr
 build_elf_symbol_db(read_context&, const xmlNodePtr, bool);
 
-static shared_ptr<function_decl::parameter>
+static function_decl::parameter_sptr
 build_function_parameter (read_context&, const xmlNodePtr);
 
-static shared_ptr<function_decl>
+static function_decl_sptr
 build_function_decl(read_context&, const xmlNodePtr,
                    shared_ptr<class_decl>, bool);
 
-static shared_ptr<var_decl>
+static function_decl_sptr
+build_function_decl_if_not_suppressed(read_context&, const xmlNodePtr,
+                                     class_decl_sptr, bool);
+
+static bool
+function_is_suppressed(const read_context& ctxt,
+                      xmlNodePtr node);
+
+static var_decl_sptr
+build_var_decl_if_not_suppressed(read_context&, const xmlNodePtr, bool);
+
+static var_decl_sptr
 build_var_decl(read_context&, const xmlNodePtr, bool);
 
+static bool
+variable_is_suppressed(const read_context& ctxt,
+                      xmlNodePtr node);
+
 static shared_ptr<type_decl>
 build_type_decl(read_context&, const xmlNodePtr, bool);
 
@@ -1176,8 +1389,7 @@ read_translation_unit(read_context& ctxt, xmlNodePtr node)
     {
       if (n->type != XML_ELEMENT_NODE)
        continue;
-      assert(handle_element_node(ctxt, n,
-                                /*add_decl_to_scope=*/true));
+      handle_element_node(ctxt, n, /*add_decl_to_scope=*/true);
     }
 
   ctxt.pop_scope_or_abort(tu->get_global_scope());
@@ -1452,6 +1664,42 @@ read_elf_needed_from_input(read_context& ctxt,
   return result;
 }
 
+/// Add suppressions specifications to the set of suppressions to be
+/// used during the construction of the ABI internal representation
+/// (the ABI corpus) from ELF and DWARF.
+///
+/// During the construction of the ABI corpus, ABI artifacts that
+/// match the a given suppression specification are dropped on the
+/// floor; that is, they are discarded and won't be part of the final
+/// ABI corpus.  This is a way to reduce the amount of data held by
+/// the final ABI corpus.
+///
+/// Note that the suppression specifications provided to this function
+/// are only considered during the construction of the ABI corpus.
+/// For instance, they are not taken into account during e.g
+/// comparisons of two ABI corpora that might happen later.  If you
+/// want to apply suppression specificatins to the comparison (or
+/// reporting) of ABI corpora please refer to the documentation of the
+/// @ref diff_context type to learn how to set suppressions that are
+/// to be used in that context.
+///
+/// @param ctxt the context that is going to be used by functions that
+/// read types and declarations information to construct and ABI
+/// corpus.
+///
+/// @param supprs the suppression specifications to be applied during
+/// the construction of the ABI corpus.
+void
+add_read_context_suppressions(read_context& ctxt,
+                             const suppr::suppressions_type& supprs)
+{
+  for (suppr::suppressions_type::const_iterator i = supprs.begin();
+       i != supprs.end();
+       ++i)
+    if ((*i)->get_drops_artifact_from_ir())
+      ctxt.get_suppressions().push_back(*i);
+}
+
 /// Parse the input XML document containing an ABI corpus, represented
 /// by an 'abi-corpus' element node, associated to the current
 /// context.
@@ -1459,7 +1707,7 @@ read_elf_needed_from_input(read_context&  ctxt,
 /// @param ctxt the current input context.
 ///
 /// @return the corpus resulting from the parsing
-static corpus_sptr
+corpus_sptr
 read_corpus_from_input(read_context& ctxt)
 {
   corpus_sptr nil;
@@ -1653,9 +1901,9 @@ handle_element_node(read_context& ctxt, xmlNodePtr node,
 ///
 /// @return true upon sucessful parsing, false otherwise.
 static bool
-read_location(read_context&    ctxt,
-             xmlNodePtr        node,
-             location& loc)
+read_location(const read_context&      ctxt,
+             xmlNodePtr                node,
+             location&         loc)
 {
   string file_path;
   size_t line = 0, column = 0;
@@ -1672,10 +1920,10 @@ read_location(read_context&     ctxt,
   if (xml_char_sptr c = xml::build_sptr(xmlGetProp(node, BAD_CAST("column"))))
     column = atoi(CHAR_STR(c));
 
-  loc =
-    ctxt.get_translation_unit()->get_loc_mgr().create_new_location(file_path,
-                                                                  line,
-                                                                  column);
+  read_context& c = const_cast<read_context&>(ctxt);
+  loc = c.get_translation_unit()->get_loc_mgr().create_new_location(file_path,
+                                                                   line,
+                                                                   column);
   return true;
 }
 
@@ -2083,7 +2331,7 @@ build_namespace_decl(read_context&        ctxt,
     {
       if (n->type != XML_ELEMENT_NODE)
        continue;
-      assert(handle_element_node(ctxt, n, /*add_to_current_scope=*/true));
+      handle_element_node(ctxt, n, /*add_to_current_scope=*/true);
     }
 
   ctxt.pop_scope_or_abort(decl);
@@ -2400,8 +2648,8 @@ build_function_parameter(read_context& ctxt, const xmlNodePtr node)
 static function_decl_sptr
 build_function_decl(read_context&      ctxt,
                    const xmlNodePtr    node,
-                   shared_ptr<class_decl> as_method_decl,
-                   bool add_to_current_scope)
+                   class_decl_sptr     as_method_decl,
+                   bool                add_to_current_scope)
 {
   shared_ptr<function_decl> nil;
 
@@ -2498,6 +2746,173 @@ build_function_decl(read_context&       ctxt,
   return fn_decl;
 }
 
+/// Build a function_decl from a 'function-decl' xml node if it's not
+/// been suppressed by a suppression specification that is in the
+/// context.
+///
+/// @param ctxt the context of the parsing.
+///
+/// @param node the xml node to build the function_decl from.
+///
+/// @param as_method_decl if this is set to a class_decl pointer, it
+/// means that the 'function-decl' xml node should be parsed as a
+/// method_decl.  The class_decl pointer is the class decl to which
+/// the resulting method_decl is a member function of.  The resulting
+/// shared_ptr<function_decl> that is returned is then really a
+/// shared_ptr<class_decl::method_decl>.
+///
+/// @param add_to_current_scope if set to yes, the resulting of
+/// this function is added to its current scope.
+///
+/// @return a pointer to a newly created function_decl upon successful
+/// completion.  If the function was suppressed by a suppression
+/// specification then returns nil.
+static function_decl_sptr
+build_function_decl_if_not_suppressed(read_context&    ctxt,
+                                     const xmlNodePtr  node,
+                                     class_decl_sptr   as_method_decl,
+                                     bool              add_to_current_scope)
+{
+    function_decl_sptr fn;
+
+  if (function_is_suppressed(ctxt, node))
+    // The function was suppressed by at least one suppression
+    // specification associated to the current read context.  So
+    // don't build any IR for it.
+    ;
+  else
+    fn = build_function_decl(ctxt, node, as_method_decl,
+                            add_to_current_scope);
+  return fn;
+}
+
+/// Test if a given function denoted by its name and linkage name is
+/// suppressed by any of the suppression specifications associated to
+/// a given context of native xml reading.
+///
+/// @param ctxt the native xml reading context of interest.
+///
+/// @param note the XML node that represents the fucntion.
+/// match.
+///
+/// @return true iff at least one function specification matches the
+/// function denoted by the node @p node.
+static bool
+function_is_suppressed(const read_context& ctxt, xmlNodePtr node)
+{
+  string fname;
+  if (xml_char_sptr s = XML_NODE_GET_ATTRIBUTE(node, "name"))
+    fname = xml::unescape_xml_string(CHAR_STR(s));
+
+  string flinkage_name;
+  if (xml_char_sptr s = XML_NODE_GET_ATTRIBUTE(node, "mangled-name"))
+    flinkage_name = xml::unescape_xml_string(CHAR_STR(s));
+
+  scope_decl* scope = ctxt.get_cur_scope();
+
+  string qualified_name = build_qualified_name(scope, fname);
+
+  return suppr::function_is_suppressed(ctxt, qualified_name, flinkage_name);
+}
+
+/// Test if a type denoted by its name, context and location is
+/// suppressed by the suppression specifications that are associated
+/// to a given read context.
+///
+/// @param ctxt the read context to consider.
+///
+/// @param note the XML node that represents the type.
+///
+/// @return true iff the type designated by @p node is suppressed by
+///  at least of suppression specifications associated to the current
+///  read context.
+static bool
+type_is_suppressed(const read_context& ctxt, xmlNodePtr node)
+{
+  string type_name;
+  if (xml_char_sptr s = XML_NODE_GET_ATTRIBUTE(node, "name"))
+    type_name = xml::unescape_xml_string(CHAR_STR(s));
+
+  location type_location;
+  read_location(ctxt, node, type_location);
+
+  scope_decl* scope = ctxt.get_cur_scope();
+
+  string qualified_name = build_qualified_name(scope, type_name);
+
+  return suppr::type_is_suppressed(ctxt, qualified_name, type_location,
+                                  /*require_drop_property=*/true);
+}
+
+/// Build a @ref var_decl out of a an XML node that describes it iff
+/// the variable denoted by the XML node is not suppressed by a
+/// suppression specification associated to the current read context.
+///
+/// @param ctxt the read context to use.
+///
+/// @param node the XML node for the variable to consider.
+///
+/// @parm add_to_current_scope whether to add the built @ref var_decl
+/// to the current scope or not.
+///
+/// @return true iff the @ref var_decl was built.
+static var_decl_sptr
+build_var_decl_if_not_suppressed(read_context&         ctxt,
+                                const xmlNodePtr       node,
+                                bool                   add_to_current_scope)
+{
+  var_decl_sptr var;
+  if (!variable_is_suppressed(ctxt, node))
+    var = build_var_decl(ctxt, node, add_to_current_scope);
+  return var;
+}
+
+/// Test if a variable denoted by its XML node is suppressed by a
+/// suppression specification that is present in a given read context.
+///
+/// @param ctxt the read context to consider.
+///
+/// @param node the XML node of the variable to consider.
+///
+/// @return true iff the variable denoted by @p node is suppressed.
+static bool
+variable_is_suppressed(const read_context& ctxt, xmlNodePtr node)
+{
+  string name;
+  if (xml_char_sptr s = XML_NODE_GET_ATTRIBUTE(node, "name"))
+    name = xml::unescape_xml_string(CHAR_STR(s));
+
+  string linkage_name;
+  if (xml_char_sptr s = XML_NODE_GET_ATTRIBUTE(node, "mangled-name"))
+    linkage_name = xml::unescape_xml_string(CHAR_STR(s));
+
+  scope_decl* scope = ctxt.get_cur_scope();
+
+  string qualified_name = build_qualified_name(scope, name);
+
+  return suppr::variable_is_suppressed(ctxt, qualified_name, linkage_name);
+}
+
+/// Test if a variable in a particular scope is suppressed by a
+/// suppression specification that is present in a given read context.
+///
+/// @parm ctxt the read context to consider.
+///
+/// @param scope the scope of the variable to consider.
+///
+/// @param v the variable to consider.
+///
+/// @return true iff the variable @p v is suppressed.
+static bool
+variable_is_suppressed(const read_context& ctxt,
+                      const scope_decl* scope,
+                      const var_decl& v)
+{
+  string qualified_name = build_qualified_name(scope, v.get_name());
+  return suppr::variable_is_suppressed(ctxt, qualified_name,
+                                      v.get_linkage_name());
+}
+
 /// Build pointer to var_decl from a 'var-decl' xml Node
 ///
 /// @param ctxt the context of the parsing.
@@ -3148,6 +3563,31 @@ build_array_type_def(read_context&       ctxt,
   return nil;
 }
 
+/// Build an @ref enum_type_decl from the XML node that represents it,
+/// if it was not suppressed by a supression specification present in
+/// the current read_context.
+///
+/// @param ctxt the read_context to take into account.
+///
+/// @param node the XML node representing the @ref enum_type_decl to
+/// build.
+///
+/// @param add_to_current_scope whether to add the built @ref
+/// enum_type_decl to the current scope.
+///
+/// @return the newly built @ref enum_type_decl iff it was effectively
+/// built.
+static enum_type_decl_sptr
+build_enum_type_decl_if_not_suppressed(read_context&   ctxt,
+                                      const xmlNodePtr node,
+                                      bool             add_to_current_scope)
+{
+  enum_type_decl_sptr enum_type;
+  if (!type_is_suppressed(ctxt, node))
+    enum_type = build_enum_type_decl(ctxt, node, add_to_current_scope);
+  return enum_type;
+}
+
 /// Build an enum_type_decl from an 'enum-type-decl' xml node.
 ///
 /// @param ctxt the context of the parsing.
@@ -3164,7 +3604,7 @@ build_enum_type_decl(read_context&        ctxt,
                     const xmlNodePtr   node,
                     bool               add_to_current_scope)
 {
-  shared_ptr<enum_type_decl> nil;
+  enum_type_decl_sptr nil;
 
   if (!xmlStrEqual(node->name, BAD_CAST("enum-decl")))
     return nil;
@@ -3325,6 +3765,28 @@ build_typedef_decl(read_context& ctxt,
   return nil;
 }
 
+/// Build a class from its XML node if it is not suppressed by a
+/// suppression specification that is present in the read context.
+///
+/// @param ctxt the read context to consider.
+///
+/// @param node the XML node to consider.
+///
+/// @param add_to_current_scope whether to add the built class to the
+/// current context or not.
+///
+/// @return true iff the class was built.
+static class_decl_sptr
+build_class_decl_if_not_suppressed(read_context&       ctxt,
+                                  const xmlNodePtr     node,
+                                  bool         add_to_current_scope)
+{
+  class_decl_sptr class_type;
+  if (!type_is_suppressed(ctxt, node))
+    class_type = build_class_decl(ctxt, node, add_to_current_scope);
+  return class_type;
+}
+
 /// Build a class_decl from a 'class-decl' xml node.
 ///
 /// @param ctxt the context of the parsing.
@@ -3342,7 +3804,7 @@ build_class_decl(read_context&            ctxt,
                 const xmlNodePtr       node,
                 bool                   add_to_current_scope)
 {
-  shared_ptr<class_decl> nil;
+  class_decl_sptr nil;
 
   if (!xmlStrEqual(node->name, BAD_CAST("class-decl")))
     return nil;
@@ -3558,19 +4020,17 @@ build_class_decl(read_context&          ctxt,
                continue;
 
              if (type_base_sptr t =
-                 build_type(ctxt, p, /*add_to_current_scope=*/false))
+                 build_type(ctxt, p, /*add_to_current_scope=*/true))
                {
-                 if (!get_type_declaration(t)->get_scope())
-                   {
-                     type_base_sptr m =
-                       decl->add_member_type(t, access);
-                     ctxt.maybe_canonicalize_type(m, !add_to_current_scope);
-                     xml_char_sptr i= XML_NODE_GET_ATTRIBUTE(p, "id");
-                     string id = CHAR_STR(i);
-                     assert(!id.empty());
-                     ctxt.key_type_decl(m, id);
-                     ctxt.map_xml_node_to_decl(p, get_type_declaration(m));
-                   }
+                 decl_base_sptr td = get_type_declaration(t);
+                 assert(td);
+                 set_member_access_specifier(td, access);
+                 ctxt.maybe_canonicalize_type(t, !add_to_current_scope);
+                 xml_char_sptr i= XML_NODE_GET_ATTRIBUTE(p, "id");
+                 string id = CHAR_STR(i);
+                 assert(!id.empty());
+                 ctxt.key_type_decl(t, id);
+                 ctxt.map_xml_node_to_decl(p, td);
                }
            }
        }
@@ -3597,8 +4057,8 @@ build_class_decl(read_context&            ctxt,
              if (p->type != XML_ELEMENT_NODE)
                continue;
 
-             if (shared_ptr<var_decl> v =
-                 build_var_decl(ctxt, p, /*add_to_current_scope=*/false))
+             if (var_decl_sptr v =
+                 build_var_decl(ctxt, p, /*add_to_cur_scope=*/false))
                {
                  if (decl->find_data_member(v->get_name()))
                    {
@@ -3612,10 +4072,12 @@ build_class_decl(read_context&          ctxt,
                      assert(is_var_decl(d));
                      continue;
                    }
-                 decl->add_data_member(v, access,
-                                       is_laid_out,
-                                       is_static,
-                                       offset_in_bits);
+                 if (!is_static
+                     || !variable_is_suppressed(ctxt, decl.get(), *v))
+                   decl->add_data_member(v, access,
+                                         is_laid_out,
+                                         is_static,
+                                         offset_in_bits);
                }
            }
        }
@@ -3650,11 +4112,10 @@ build_class_decl(read_context&          ctxt,
                continue;
 
              if (function_decl_sptr f =
-                 build_function_decl(ctxt, p, decl,
-                                     /*add_to_current_scope=*/true))
+                 build_function_decl_if_not_suppressed(ctxt, p, decl,
+                                                       /*add_to_cur_sc=*/true))
                {
-                 class_decl::method_decl_sptr m =
-                   dynamic_pointer_cast<class_decl::method_decl>(f);
+                 class_decl::method_decl_sptr m = is_method_decl(f);
                  assert(m);
                  set_member_access_specifier(m, access);
                  set_member_is_static(m, is_static);
@@ -3776,9 +4237,9 @@ build_function_tdecl(read_context& ctxt,
          fn_tmpl_decl->add_template_parameter(parm);
          ++parm_index;
        }
-      else if (shared_ptr<function_decl> f =
-              build_function_decl(ctxt, n, shared_ptr<class_decl>(),
-                                  /*add_to_current_scope=*/true))
+      else if (function_decl_sptr f =
+              build_function_decl_if_not_suppressed(ctxt, n, class_decl_sptr(),
+                                        /*add_to_current_scope=*/true))
        fn_tmpl_decl->set_pattern(f);
     }
 
@@ -3840,8 +4301,9 @@ build_class_tdecl(read_context&   ctxt,
          class_tmpl->add_template_parameter(parm);
          ++parm_index;
        }
-      else if (shared_ptr<class_decl> c =
-              build_class_decl(ctxt, n, add_to_current_scope))
+      else if (class_decl_sptr c =
+              build_class_decl_if_not_suppressed(ctxt, n,
+                                                 add_to_current_scope))
        {
          if (c->get_scope())
            ctxt.maybe_canonicalize_type(c, /*force_delay=*/false);
@@ -4137,12 +4599,12 @@ build_template_parameter(read_context&          ctxt,
 ///
 /// @return a pointer to the newly built type_base upon successful
 /// completion, a null pointer otherwise.
-static shared_ptr<type_base>
+static type_base_sptr
 build_type(read_context&       ctxt,
           const xmlNodePtr     node,
           bool         add_to_current_scope)
 {
-  shared_ptr<type_base> t;
+  type_base_sptr t;
 
   ((t = build_type_decl(ctxt, node, add_to_current_scope))
    || (t = build_qualified_type_decl(ctxt, node, add_to_current_scope))
@@ -4150,9 +4612,11 @@ build_type(read_context& ctxt,
    || (t = build_reference_type_def(ctxt, node , add_to_current_scope))
    || (t = build_function_type(ctxt, node, add_to_current_scope))
    || (t = build_array_type_def(ctxt, node, add_to_current_scope))
-   || (t = build_enum_type_decl(ctxt, node, add_to_current_scope))
+   || (t = build_enum_type_decl_if_not_suppressed(ctxt, node,
+                                                 add_to_current_scope))
    || (t = build_typedef_decl(ctxt, node, add_to_current_scope))
-   || (t = build_class_decl(ctxt, node, add_to_current_scope)));
+   || (t = build_class_decl_if_not_suppressed(ctxt, node,
+                                             add_to_current_scope)));
 
   return t;
 }
@@ -4280,8 +4744,9 @@ handle_enum_type_decl(read_context&       ctxt,
                      xmlNodePtr        node,
                      bool              add_to_current_scope)
 {
-  enum_type_decl_sptr decl = build_enum_type_decl(ctxt, node,
-                                                 add_to_current_scope);
+  enum_type_decl_sptr decl =
+    build_enum_type_decl_if_not_suppressed(ctxt, node,
+                                          add_to_current_scope);
   if (decl && decl->get_scope())
     ctxt.maybe_canonicalize_type(decl, /*force_delay=*/false);
   return decl;
@@ -4315,8 +4780,8 @@ handle_var_decl(read_context&     ctxt,
                xmlNodePtr      node,
                bool            add_to_current_scope)
 {
-  decl_base_sptr decl = build_var_decl(ctxt, node,
-                                      add_to_current_scope);
+  decl_base_sptr decl = build_var_decl_if_not_suppressed(ctxt, node,
+                                                        add_to_current_scope);
   return decl;
 }
 
@@ -4331,10 +4796,8 @@ handle_function_decl(read_context&       ctxt,
                     xmlNodePtr node,
                     bool               add_to_current_scope)
 {
-  function_decl_sptr fn = build_function_decl(ctxt, node,
-                                             class_decl_sptr(),
-                                             add_to_current_scope);
-  return fn;
+  return build_function_decl_if_not_suppressed(ctxt, node, class_decl_sptr(),
+                                              add_to_current_scope);
 }
 
 /// Parse a 'class-decl' xml element.
@@ -4348,8 +4811,8 @@ handle_class_decl(read_context& ctxt,
                  xmlNodePtr    node,
                  bool          add_to_current_scope)
 {
-  class_decl_sptr decl = build_class_decl(ctxt, node,
-                                         add_to_current_scope);
+  class_decl_sptr decl =
+    build_class_decl_if_not_suppressed(ctxt, node, add_to_current_scope);
   if (decl && decl->get_scope())
     ctxt.maybe_canonicalize_type(decl, /*force_delay=*/false);
   return decl;
@@ -4556,6 +5019,49 @@ read_corpus_from_file(const string& path)
 
 #endif //WITH_ZIP_ARCHIVE
 
+/// Create an xml_reader::read_context to read a native XML ABI file.
+///
+/// @param path the path to the native XML file to read.
+///
+/// @param env the environment to use.
+///
+/// @return the created context.
+read_context_sptr
+create_native_xml_read_context(const string& path, environment *env)
+{
+  read_context_sptr result(new read_context(xml::new_reader_from_file(path),
+                                           env));
+  corpus_sptr corp(new corpus(env));
+  result->set_corpus(corp);
+  result->set_path(path);
+  return result;
+}
+
+/// Create an xml_reader::read_context to read a native XML ABI from
+/// an input stream..
+///
+/// @param in the input stream that contains the native XML file to read.
+///
+/// @param env the environment to use.
+///
+/// @return the created context.
+read_context_sptr
+create_native_xml_read_context(std::istream* in, environment* env)
+{
+  read_context_sptr result(new read_context(xml::new_reader_from_istream(in),
+                                           env));
+  corpus_sptr corp(new corpus(env, ""));
+  result->set_corpus(corp);
+  return result;
+}
+
+/// Read an ABI corpus from a given reading context.
+///
+/// @return the resulting ABI corpus.
+corpus_sptr
+read_corpus_from_native_xml(read_context& ctxt)
+{return read_corpus_from_input(ctxt);}
+
 /// De-serialize an ABI corpus from an input XML document which root
 /// node is 'abi-corpus'.
 ///
@@ -4572,10 +5078,8 @@ corpus_sptr
 read_corpus_from_native_xml(std::istream* in,
                            environment* env)
 {
-  read_context read_ctxt(xml::new_reader_from_istream(in), env);
-  corpus_sptr corp(new corpus(env, ""));
-  read_ctxt.set_corpus(corp);
-  return read_corpus_from_input(read_ctxt);
+  read_context_sptr read_ctxt = create_native_xml_read_context(in, env);
+  return read_corpus_from_input(*read_ctxt);
 }
 
 /// De-serialize an ABI corpus from an XML document file which root
@@ -4595,13 +5099,8 @@ corpus_sptr
 read_corpus_from_native_xml_file(const string& path,
                                 environment* env)
 {
-  read_context read_ctxt(xml::new_reader_from_file(path), env);
-  corpus_sptr corp = read_corpus_from_input(read_ctxt);
-  if (corp)
-    {
-      if (corp->get_path().empty())
-       corp->set_path(path);
-    }
+  read_context_sptr read_ctxt = create_native_xml_read_context(path, env);
+  corpus_sptr corp = read_corpus_from_input(*read_ctxt);
   return corp;
 }
 
diff --git a/src/abg-suppression-priv.h b/src/abg-suppression-priv.h
new file mode 100644 (file)
index 0000000..34379c1
--- /dev/null
@@ -0,0 +1,827 @@
+// -*- Mode: C++ -*-
+//
+// Copyright (C) 2016 Red Hat, Inc.
+//
+// This file is part of the GNU Application Binary Interface Generic
+// Analysis and Instrumentation Library (libabigail).  This library is
+// free software; you can redistribute it and/or modify it under the
+// terms of the GNU Lesser General Public License as published by the
+// Free Software Foundation; either version 3, or (at your option) any
+// later version.
+
+// This library is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// General Lesser Public License for more details.
+
+// You should have received a copy of the GNU Lesser General Public
+// License along with this program; see the file COPYING-LGPLV3.  If
+// not, see <http://www.gnu.org/licenses/>.
+//
+// Author: Dodji Seketeli
+
+/// @file
+///
+/// This contains the private implementation of the suppression engine
+/// of libabigail.
+
+#ifndef __ABG_SUPPRESSION_PRIV_H__
+#define __ABG_SUPPRESSION_PRIV_H__
+
+#include "abg-fwd.h"
+#include "abg-suppression.h"
+#include "abg-sptr-utils.h"
+
+namespace abigail
+{
+
+namespace suppr
+{
+
+// <suppression_base stuff>
+
+/// The private data of @ref suppression_base.
+class suppression_base::priv
+{
+  bool                                 is_artificial_;
+  bool                                 drops_artifact_;
+  string                               label_;
+  string                               file_name_regex_str_;
+  mutable sptr_utils::regex_t_sptr     file_name_regex_;
+  string                               file_name_not_regex_str_;
+  mutable sptr_utils::regex_t_sptr     file_name_not_regex_;
+  string                               soname_regex_str_;
+  mutable sptr_utils::regex_t_sptr     soname_regex_;
+  string                               soname_not_regex_str_;
+  mutable sptr_utils::regex_t_sptr     soname_not_regex_;
+
+public:
+  priv()
+    : is_artificial_(),
+      drops_artifact_()
+  {}
+
+  priv(const string& label)
+    : is_artificial_(),
+      drops_artifact_(),
+      label_(label)
+  {}
+
+  priv(const string& label,
+       const string& file_name_regex_str,
+       const string& file_name_not_regex_str)
+    : is_artificial_(),
+      drops_artifact_(),
+      label_(label),
+      file_name_regex_str_(file_name_regex_str),
+      file_name_not_regex_str_(file_name_not_regex_str)
+  {}
+
+  friend class suppression_base;
+
+  /// Get the regular expression object associated to the 'file_name_regex'
+  /// property of @ref suppression_base.
+  ///
+  /// If the regular expression object is not created, this method
+  /// creates it and returns it.
+  ///
+  /// If the 'file_name_regex' property of @ref suppression_base is
+  /// empty then this method returns nil.
+  const sptr_utils::regex_t_sptr&
+  get_file_name_regex() const
+  {
+    if (!file_name_regex_)
+      {
+       if (!file_name_regex_str_.empty())
+         {
+           sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
+           if (regcomp(r.get(),
+                       file_name_regex_str_.c_str(),
+                       REG_EXTENDED) == 0)
+             file_name_regex_ = r;
+         }
+      }
+    return file_name_regex_;
+  }
+
+  /// Get the regular expression object associated to the
+  /// 'file_name_not_regex' property of @ref suppression_base.
+  ///
+  /// If the regular expression object is not created, this method
+  /// creates it and returns it.
+  ///
+  /// If the 'file_name_not_regex' property of @ref suppression_base
+  /// is empty then this method returns nil.
+  const sptr_utils::regex_t_sptr&
+  get_file_name_not_regex() const
+  {
+    if (!file_name_not_regex_)
+      {
+       if (!file_name_not_regex_str_.empty())
+         {
+           sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
+           if (regcomp(r.get(),
+                       file_name_not_regex_str_.c_str(),
+                       REG_EXTENDED) == 0)
+             file_name_not_regex_ = r;
+         }
+      }
+    return file_name_not_regex_;
+  }
+
+  /// Get the regular expression object associated to the
+  /// 'soname_regex' property of @ref suppression_base.
+  ///
+  /// If the regular expression object is not created, this method
+  /// creates it and returns it.
+  ///
+  /// If the 'soname_regex' property of @ref suppression_base is empty
+  /// then this method returns nil.
+  const sptr_utils::regex_t_sptr&
+  get_soname_regex() const
+  {
+    if (!soname_regex_)
+      {
+       if (!soname_regex_str_.empty())
+         {
+           sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
+           if (regcomp(r.get(),
+                       soname_regex_str_.c_str(),
+                       REG_EXTENDED) == 0)
+             soname_regex_ = r;
+         }
+      }
+    return soname_regex_;
+  }
+
+  /// Get the regular expression object associated to the
+  /// 'soname_not_regex' property of @ref suppression_base.
+  ///
+  /// If the regular expression object is not created, this method
+  /// creates it and returns it.
+  ///
+  /// If the 'soname_not_regex' property of @ref suppression_base is
+  /// empty then this method returns nil.
+  const sptr_utils::regex_t_sptr&
+  get_soname_not_regex() const
+  {
+    if (!soname_not_regex_)
+      {
+       if (!soname_not_regex_str_.empty())
+         {
+           sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
+           if (regcomp(r.get(),
+                       soname_not_regex_str_.c_str(),
+                       REG_EXTENDED) == 0)
+             soname_not_regex_ = r;
+         }
+      }
+    return soname_not_regex_;
+  }
+
+  bool
+  matches_soname(const string& soname) const
+  {
+    if (sptr_utils::regex_t_sptr regexp = get_soname_regex())
+      if (regexec(regexp.get(), soname.c_str(), 0, NULL, 0) != 0)
+       return false;
+
+    if (sptr_utils::regex_t_sptr regexp = get_soname_not_regex())
+      if (regexec(regexp.get(), soname.c_str(), 0, NULL, 0) == 0)
+       return false;
+
+    return true;
+  }
+
+  bool
+  matches_binary_name(const string& binary_name) const
+  {
+    if (sptr_utils::regex_t_sptr regexp = get_file_name_regex())
+      if (regexec(regexp.get(), binary_name.c_str(),
+                 0, NULL, 0) != 0)
+       return false;
+
+    if (sptr_utils::regex_t_sptr regexp = get_file_name_not_regex())
+      if (regexec(regexp.get(), binary_name.c_str(),
+                 0, NULL, 0) == 0)
+       return false;
+
+    return true;
+  }
+
+}; // end clas suppression_base::priv
+
+// </suppression_base stuff>
+
+// <function_suppression stuff>
+
+class function_suppression::parameter_spec::priv
+{
+  friend class function_suppression::parameter_spec;
+  friend class function_suppression;
+
+  size_t                               index_;
+  string                               type_name_;
+  string                               type_name_regex_str_;
+  mutable sptr_utils::regex_t_sptr     type_name_regex_;
+
+  priv()
+    : index_()
+  {}
+
+  priv(size_t i, const string& tn)
+    : index_(i), type_name_(tn)
+  {}
+
+  priv(size_t i, const string& tn, const string& tn_regex)
+    : index_(i), type_name_(tn), type_name_regex_str_(tn_regex)
+  {}
+
+  const sptr_utils::regex_t_sptr
+  get_type_name_regex() const
+  {
+    if (!type_name_regex_ && !type_name_regex_str_.empty())
+      {
+       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
+       if (regcomp(r.get(),
+                   type_name_regex_str_.c_str(),
+                   REG_EXTENDED) == 0)
+         type_name_regex_ = r;
+      }
+    return type_name_regex_;
+  }
+}; // end class function_suppression::parameter_spec::priv
+
+
+/// The type of the private data of the @ref function_suppression
+/// type.
+struct function_suppression::priv
+{
+  friend class function_suppression;
+
+  change_kind                          change_kind_;
+  string                               name_;
+  string                               name_regex_str_;
+  mutable sptr_utils::regex_t_sptr     name_regex_;
+  string                               name_not_regex_str_;
+  mutable sptr_utils::regex_t_sptr     name_not_regex_;
+  string                               return_type_name_;
+  string                               return_type_regex_str_;
+  mutable sptr_utils::regex_t_sptr     return_type_regex_;
+  parameter_specs_type                 parm_specs_;
+  string                               symbol_name_;
+  string                               symbol_name_regex_str_;
+  mutable sptr_utils::regex_t_sptr     symbol_name_regex_;
+  string                               symbol_version_;
+  string                               symbol_version_regex_str_;
+  mutable sptr_utils::regex_t_sptr     symbol_version_regex_;
+  bool                                 allow_other_aliases_;
+
+  priv(const string&                   name,
+       const string&                   name_regex_str,
+       const string&                   return_type_name,
+       const string&                   return_type_regex_str,
+       const parameter_specs_type&     parm_specs,
+       const string&                   symbol_name,
+       const string&                   symbol_name_regex_str,
+       const string&                   symbol_version,
+       const string&                   symbol_version_regex_str)
+    : change_kind_(ALL_CHANGE_KIND),
+      name_(name),
+      name_regex_str_(name_regex_str),
+      return_type_name_(return_type_name),
+      return_type_regex_str_(return_type_regex_str),
+      parm_specs_(parm_specs),
+      symbol_name_(symbol_name),
+      symbol_name_regex_str_(symbol_name_regex_str),
+      symbol_version_(symbol_version),
+      symbol_version_regex_str_(symbol_version_regex_str),
+      allow_other_aliases_(true)
+  {}
+
+
+  /// Getter for a pointer to a regular expression object built from
+  /// the regular expression string
+  /// function_suppression::priv::name_regex_str_.
+  ///
+  /// If that string is empty, then an empty regular expression object
+  /// pointer is returned.
+  ///
+  /// @return a pointer to the regular expression object of
+  /// function_suppression::priv::name_regex_str_..
+  const sptr_utils::regex_t_sptr
+  get_name_regex() const
+  {
+    if (!name_regex_ && !name_regex_str_.empty())
+      {
+       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
+       if (regcomp(r.get(),
+                   name_regex_str_.c_str(),
+                   REG_EXTENDED) == 0)
+         name_regex_ = r;
+      }
+    return name_regex_;
+  }
+
+  /// Getter for a pointer to a regular expression object built from
+  /// the regular expression string
+  /// function_suppression::priv::name_not_regex_str_.
+  ///
+  /// If that string is empty, then an empty regular expression object
+  /// pointer is returned.
+  ///
+  /// @return a pointer to the regular expression object of
+  /// function_suppression::priv::name_not_regex_str_..
+  const sptr_utils::regex_t_sptr
+  get_name_not_regex() const
+  {
+    if (!name_not_regex_ && !name_not_regex_str_.empty())
+      {
+       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
+       if (regcomp(r.get(),
+                   name_not_regex_str_.c_str(),
+                   REG_EXTENDED) == 0)
+         name_not_regex_ = r;
+      }
+    return name_not_regex_;
+  }
+
+  /// Getter for a pointer to a regular expression object built from
+  /// the regular expression string
+  /// function_suppression::priv::return_type_regex_str_.
+  ///
+  /// If that string is empty, then an empty regular expression object
+  /// pointer is returned.
+  ///
+  /// @return a pointer to the regular expression object of
+  /// function_suppression::priv::return_type_regex_str_.
+  const sptr_utils::regex_t_sptr
+  get_return_type_regex() const
+  {
+    if (!return_type_regex_ && !return_type_regex_str_.empty())
+      {
+       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
+       if (regcomp(r.get(),
+                   return_type_regex_str_.c_str(),
+                   REG_EXTENDED) == 0)
+         return_type_regex_ = r;
+      }
+    return return_type_regex_;
+  }
+
+  /// Getter for a pointer to a regular expression object built from
+  /// the regular expression string
+  /// function_suppression::priv::symbol_name_regex_str_.
+  ///
+  /// If that string is empty, then an empty regular expression object
+  /// pointer is returned.
+  ///
+  /// @return a pointer to the regular expression object of
+  /// function_suppression::priv::symbol_name_regex_str_.
+  const sptr_utils::regex_t_sptr
+  get_symbol_name_regex() const
+  {
+    if (!symbol_name_regex_ && !symbol_name_regex_str_.empty())
+      {
+       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
+       if (regcomp(r.get(),
+                   symbol_name_regex_str_.c_str(),
+                   REG_EXTENDED) == 0)
+         symbol_name_regex_ = r;
+      }
+    return symbol_name_regex_;
+  }
+
+  /// Getter for a pointer to a regular expression object built from
+  /// the regular expression string
+  /// function_suppression::priv::symbol_version_regex_str_.
+  ///
+  /// If that string is empty, then an empty regular expression object
+  /// pointer is returned.
+  ///
+  /// @return a pointer to the regular expression object of
+  /// function_suppression::priv::symbol_version_regex_str_.
+  const sptr_utils::regex_t_sptr
+  get_symbol_version_regex() const
+  {
+    if (!symbol_version_regex_ && ! symbol_version_regex_str_.empty())
+      {
+       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
+       if (regcomp(r.get(),
+                   symbol_version_regex_str_.c_str(),
+                   REG_EXTENDED) == 0)
+         symbol_version_regex_ = r;
+      }
+    return symbol_version_regex_;
+  }
+}; // end class function_suppression::priv
+
+bool
+suppression_matches_function_name(const suppr::function_suppression& s,
+                                 const string& fn_name);
+
+bool
+suppression_matches_function_sym_name(const suppr::function_suppression& s,
+                                     const string& fn_linkage_name);
+
+bool
+suppression_matches_variable_name(const suppr::variable_suppression& s,
+                                 const string& var_name);
+
+
+bool
+suppression_matches_variable_sym_name(const suppr::variable_suppression& s,
+                                     const string& var_linkage_name);
+
+/// Test if a given function denoted by its name and linkage name is
+/// suppressed by any of the suppression specifications associated to
+/// a given read context used to build the current internal
+/// representation of ABI corpus.
+///
+/// @param ctxt the reading context of interest.
+///
+/// @param fn_name the name of the function that a specification can
+/// match.
+///
+/// @param fn_linkage_name the linkage name of the function that a
+/// specification can match.
+///
+/// @param require_drop_property if set to "true", tests if the
+/// function is suppressed and if its representation is dropped from
+/// the ABI corpus being built.  Otherwise, if set to "false", only
+/// test if the function is suppressed.
+///
+/// @return true iff at least one function specification matches a
+/// function with name @p fn_name or with linkage name @p
+/// fn_linkage_name.
+template <typename ReadContextType>
+bool
+function_is_suppressed(const ReadContextType&  ctxt,
+                      const string&            fn_name,
+                      const string&            fn_linkage_name,
+                      bool                     require_drop_property = false)
+{
+  for (suppr::suppressions_type::const_iterator i =
+        ctxt.get_suppressions().begin();
+       i != ctxt.get_suppressions().end();
+       ++i)
+    if (suppr::function_suppression_sptr suppr = is_function_suppression(*i))
+      {
+       if (require_drop_property && !(*i)->get_drops_artifact_from_ir())
+         continue;
+       if (ctxt.suppression_matches_function_name(*suppr, fn_name))
+         return true;
+       if (ctxt.suppression_matches_function_sym_name(*suppr,
+                                                      fn_linkage_name))
+         return true;
+      }
+  return false;
+}
+// </function_suppression stuff>
+
+// <variable_suppression stuff>
+/// The type of the private data of the @ref variable_suppression
+/// type.
+struct variable_suppression::priv
+{
+  friend class variable_suppression;
+
+  change_kind                          change_kind_;
+  string                               name_;
+  string                               name_regex_str_;
+  mutable sptr_utils::regex_t_sptr     name_regex_;
+  string                               name_not_regex_str_;
+  mutable sptr_utils::regex_t_sptr     name_not_regex_;
+  string                               symbol_name_;
+  string                               symbol_name_regex_str_;
+  mutable sptr_utils::regex_t_sptr     symbol_name_regex_;
+  string                               symbol_version_;
+  string                               symbol_version_regex_str_;
+  mutable sptr_utils::regex_t_sptr     symbol_version_regex_;
+  string                               type_name_;
+  string                               type_name_regex_str_;
+  mutable sptr_utils::regex_t_sptr     type_name_regex_;
+
+  priv(const string& name,
+       const string& name_regex_str,
+       const string& symbol_name,
+       const string& symbol_name_regex_str,
+       const string& symbol_version,
+       const string& symbol_version_regex_str,
+       const string& type_name,
+       const string& type_name_regex_str)
+    : change_kind_(ALL_CHANGE_KIND),
+      name_(name),
+      name_regex_str_(name_regex_str),
+      symbol_name_(symbol_name),
+      symbol_name_regex_str_(symbol_name_regex_str),
+      symbol_version_(symbol_version),
+      symbol_version_regex_str_(symbol_version_regex_str),
+      type_name_(type_name),
+      type_name_regex_str_(type_name_regex_str)
+  {}
+
+  /// Getter for a pointer to a regular expression object built from
+  /// the regular expression string
+  /// variable_suppression::priv::name_regex_str_.
+  ///
+  /// If that string is empty, then an empty regular expression object
+  /// pointer is returned.
+  ///
+  /// @return a pointer to the regular expression object of
+  /// variable_suppression::priv::name_regex_str_.
+  const sptr_utils::regex_t_sptr
+  get_name_regex() const
+  {
+    if (!name_regex_ && !name_regex_str_.empty())
+      {
+       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
+       if (regcomp(r.get(),
+                   name_regex_str_.c_str(),
+                   REG_EXTENDED) == 0)
+         name_regex_ = r;
+      }
+    return name_regex_;
+  }
+
+  /// Getter for a pointer to a regular expression object built from
+  /// the regular expression string
+  /// variable_suppression::priv::name_not_regex_str_.
+  ///
+  /// If that string is empty, then an empty regular expression object
+  /// pointer is returned.
+  ///
+  /// @return a pointer to the regular expression object of
+  /// variable_suppression::priv::name_not_regex_str_..
+  const sptr_utils::regex_t_sptr
+  get_name_not_regex() const
+  {
+    if (!name_not_regex_ && !name_not_regex_str_.empty())
+      {
+       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
+       if (regcomp(r.get(),
+                   name_not_regex_str_.c_str(),
+                   REG_EXTENDED) == 0)
+         name_not_regex_ = r;
+      }
+    return name_not_regex_;
+  }
+
+  /// Getter for a pointer to a regular expression object built from
+  /// the regular expression string
+  /// variable_suppression::priv::symbol_name_regex_str_.
+  ///
+  /// If that string is empty, then an empty regular expression object
+  /// pointer is returned.
+  ///
+  /// @return a pointer to the regular expression object of
+  /// variable_suppression::priv::symbol_name_regex_str_.
+  const sptr_utils::regex_t_sptr
+  get_symbol_name_regex() const
+  {
+    if (!symbol_name_regex_ && !symbol_name_regex_str_.empty())
+      {
+       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
+       if (regcomp(r.get(),
+                   symbol_name_regex_str_.c_str(),
+                   REG_EXTENDED) == 0)
+         symbol_name_regex_ = r;
+      }
+    return symbol_name_regex_;
+  }
+
+  /// Getter for a pointer to a regular expression object built from
+  /// the regular expression string
+  /// variable_suppression::priv::symbol_version_regex_str_.
+  ///
+  /// If that string is empty, then an empty regular expression object
+  /// pointer is returned.
+  ///
+  /// @return a pointer to the regular expression object of
+  /// variable_suppression::priv::symbol_version_regex_str_.
+  const sptr_utils::regex_t_sptr
+  get_symbol_version_regex()  const
+  {
+    if (!symbol_version_regex_ && !symbol_version_regex_str_.empty())
+      {
+       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
+       if (regcomp(r.get(),
+                   symbol_version_regex_str_.c_str(),
+                   REG_EXTENDED) == 0)
+         symbol_version_regex_ = r;
+      }
+    return symbol_version_regex_;
+  }
+
+  /// Getter for a pointer to a regular expression object built from
+  /// the regular expression string
+  /// variable_suppression::priv::type_name_regex_str_.
+  ///
+  /// If that string is empty, then an empty regular expression object
+  /// pointer is returned.
+  ///
+  /// @return a pointer to the regular expression object of
+  /// variable_suppression::priv::type_name_regex_str_.
+  const sptr_utils::regex_t_sptr
+  get_type_name_regex() const
+  {
+    if (!type_name_regex_ && !type_name_regex_str_.empty())
+      {
+       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
+       if (regcomp(r.get(),
+                   type_name_regex_str_.c_str(),
+                   REG_EXTENDED) == 0)
+         type_name_regex_ = r;
+      }
+    return type_name_regex_;
+  }
+};// end class variable_supppression::priv
+
+template <typename ReadContextType>
+bool
+variable_is_suppressed(const ReadContextType&  ctxt,
+                      const string&            var_name,
+                      const string&            var_linkage_name,
+                      bool                     require_drop_property = false)
+{
+  for (suppr::suppressions_type::const_iterator i =
+        ctxt.get_suppressions().begin();
+       i != ctxt.get_suppressions().end();
+       ++i)
+    if (suppr::variable_suppression_sptr suppr = is_variable_suppression(*i))
+      {
+       if (require_drop_property && !(*i)->get_drops_artifact_from_ir())
+         continue;
+       if (ctxt.suppression_matches_variable_name(*suppr, var_name))
+         return true;
+       if (ctxt.suppression_matches_variable_sym_name(*suppr,
+                                                      var_linkage_name))
+         return true;
+      }
+  return false;
+}
+
+// </variable_suppression stuff>
+
+// <type_suppression stuff>
+/// The private data for @ref type_suppression.
+class type_suppression::priv
+{
+  string                               type_name_regex_str_;
+  mutable sptr_utils::regex_t_sptr     type_name_regex_;
+  string                               type_name_;
+  bool                                 consider_type_kind_;
+  type_suppression::type_kind          type_kind_;
+  bool                                 consider_reach_kind_;
+  type_suppression::reach_kind         reach_kind_;
+  type_suppression::insertion_ranges   insertion_ranges_;
+  unordered_set<string>                source_locations_to_keep_;
+  string                               source_location_to_keep_regex_str_;
+  mutable sptr_utils::regex_t_sptr     source_location_to_keep_regex_;
+
+  priv();
+
+public:
+  priv(const string&                   type_name_regexp,
+       const string&                   type_name,
+       bool                            consider_type_kind,
+       type_suppression::type_kind     type_kind,
+       bool                            consider_reach_kind,
+       type_suppression::reach_kind    reach_kind)
+    : type_name_regex_str_(type_name_regexp),
+      type_name_(type_name),
+      consider_type_kind_(consider_type_kind),
+      type_kind_(type_kind),
+      consider_reach_kind_(consider_reach_kind),
+      reach_kind_(reach_kind)
+  {}
+
+  /// Get the regular expression object associated to the 'type_name_regex'
+  /// property of @ref type_suppression.
+  ///
+  /// If the regular expression object is not created, this method
+  /// creates it and returns it.
+  ///
+  /// If the 'type_name_regex' property of @ref type_suppression is
+  /// empty then this method returns nil.
+  const sptr_utils::regex_t_sptr
+  get_type_name_regex() const
+  {
+    if (!type_name_regex_)
+      {
+       if (!type_name_regex_str_.empty())
+         {
+           sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
+           if (regcomp(r.get(),
+                       type_name_regex_str_.c_str(),
+                       REG_EXTENDED) == 0)
+             type_name_regex_ = r;
+         }
+      }
+    return type_name_regex_;
+  }
+
+  /// Setter for the type_name_regex object.
+  ///
+  /// @param r the new type_name_regex object.
+  void
+  set_type_name_regex(sptr_utils::regex_t_sptr r)
+  {type_name_regex_ = r;}
+
+  /// Getter for the source_location_to_keep_regex object.
+  ///
+  /// This function builds the regex if it's not yet built.
+  const sptr_utils::regex_t_sptr
+  get_source_location_to_keep_regex() const
+  {
+    if (!source_location_to_keep_regex_)
+      {
+       if (!source_location_to_keep_regex_str_.empty())
+         {
+           sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
+           if (regcomp(r.get(),
+                       source_location_to_keep_regex_str_.c_str(),
+                       REG_EXTENDED) == 0)
+             source_location_to_keep_regex_ = r;
+         }
+      }
+    return source_location_to_keep_regex_;
+  }
+
+  /// Setter for the source_location_to_keep_regex object.
+  ///
+  /// @param r the new regex object.
+  void
+  set_source_location_to_keep_regex(sptr_utils::regex_t_sptr r)
+  {source_location_to_keep_regex_ = r;}
+
+  friend class type_suppression;
+}; // class type_suppression::priv
+
+bool
+suppression_matches_type_name(const suppr::type_suppression&   s,
+                             const string&                     type_name);
+
+bool
+suppression_matches_type_name(const suppr::type_suppression&   s,
+                             const scope_decl*         scope,
+                             const type_base_sptr&             type);
+
+bool
+suppression_matches_type_location(const type_suppression&      s,
+                                 const location                loc);
+
+bool
+suppression_matches_type_location(const type_suppression&      s,
+                                 const type_base_sptr& type);
+
+bool
+suppression_matches_type_name_or_location(const type_suppression& s,
+                                         const string& type_name,
+                                         const location& type_location);
+
+/// Test if a type (designated by its name and location) is suppressed
+/// by at least one suppression specification associated with a given
+/// read context.
+///
+/// @param ctxt the read context to consider.
+///
+/// @param type_name the name of the type to consider.
+///
+/// @param type_location the location of the type to consider.
+///
+/// @param require_drop_property if set to "true", tests if the type
+/// is suppressed and if its representation is dropped from the ABI
+/// corpus being built.  Otherwise, if set to "false", only test if
+/// the type is suppressed.
+///
+/// @return true iff at least one type specification matches a type
+/// with name @p type_name and with location @p type_location.
+template <typename ReadContextType>
+bool
+type_is_suppressed(const ReadContextType&      ctxt,
+                  const string&                type_name,
+                  const location&              type_location,
+                  bool require_drop_property = false)
+{
+  for (suppr::suppressions_type::const_iterator i =
+        ctxt.get_suppressions().begin();
+       i != ctxt.get_suppressions().end();
+       ++i)
+    if (suppr::type_suppression_sptr suppr = is_type_suppression(*i))
+      {
+       if (require_drop_property && !(*i)->get_drops_artifact_from_ir())
+         continue;
+       if (ctxt.suppression_matches_type_name_or_location(*suppr, type_name,
+                                                          type_location))
+         return true;
+      }
+
+  return false;
+}
+// </type_suppression stuff>
+
+}// end namespace suppr
+} // end namespace abigail
+
+#endif // __ABG_SUPPRESSION_PRIV_H__
index 4e1a7ee6eb59faee1469867fa364657cfdf12750..e9bee010c963465a691636bc218ffc41b97f9c53 100644 (file)
 /// This contains the implementation of the suppression engine of
 /// libabigail.
 
+#include "abg-suppression-priv.h"
+
 #include "abg-internal.h"
 // <headers defining libabigail's API go under here>
 ABG_BEGIN_EXPORT_DECLARATIONS
 
-#include "abg-suppression.h"
 #include "abg-ini.h"
-#include "abg-sptr-utils.h"
 #include "abg-comp-filter.h"
 #include "abg-tools-utils.h"
 
@@ -48,143 +48,6 @@ using std::tr1::dynamic_pointer_cast;
 
 // <suppression_base stuff>
 
-/// The private data of @ref suppression_base.
-class suppression_base::priv
-{
-  bool                                 is_artificial_;
-  string                               label_;
-  string                               file_name_regex_str_;
-  mutable sptr_utils::regex_t_sptr     file_name_regex_;
-  string                               file_name_not_regex_str_;
-  mutable sptr_utils::regex_t_sptr     file_name_not_regex_;
-  string                               soname_regex_str_;
-  mutable sptr_utils::regex_t_sptr     soname_regex_;
-  string                               soname_not_regex_str_;
-  mutable sptr_utils::regex_t_sptr     soname_not_regex_;
-
-public:
-  priv()
-    : is_artificial_()
-  {}
-
-  priv(const string& label)
-    : is_artificial_(),
-      label_(label)
-  {}
-
-  priv(const string& label,
-       const string& file_name_regex_str,
-       const string& file_name_not_regex_str)
-    : is_artificial_(),
-      label_(label),
-      file_name_regex_str_(file_name_regex_str),
-      file_name_not_regex_str_(file_name_not_regex_str)
-  {}
-
-  friend class suppression_base;
-
-  /// Get the regular expression object associated to the 'file_name_regex'
-  /// property of @ref suppression_base.
-  ///
-  /// If the regular expression object is not created, this method
-  /// creates it and returns it.
-  ///
-  /// If the 'file_name_regex' property of @ref suppression_base is
-  /// empty then this method returns nil.
-  const sptr_utils::regex_t_sptr&
-  get_file_name_regex() const
-  {
-    if (!file_name_regex_)
-      {
-       if (!file_name_regex_str_.empty())
-         {
-           sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
-           if (regcomp(r.get(),
-                       file_name_regex_str_.c_str(),
-                       REG_EXTENDED) == 0)
-             file_name_regex_ = r;
-         }
-      }
-    return file_name_regex_;
-  }
-
-  /// Get the regular expression object associated to the
-  /// 'file_name_not_regex' property of @ref suppression_base.
-  ///
-  /// If the regular expression object is not created, this method
-  /// creates it and returns it.
-  ///
-  /// If the 'file_name_not_regex' property of @ref suppression_base
-  /// is empty then this method returns nil.
-  const sptr_utils::regex_t_sptr&
-  get_file_name_not_regex() const
-  {
-    if (!file_name_not_regex_)
-      {
-       if (!file_name_not_regex_str_.empty())
-         {
-           sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
-           if (regcomp(r.get(),
-                       file_name_not_regex_str_.c_str(),
-                       REG_EXTENDED) == 0)
-             file_name_not_regex_ = r;
-         }
-      }
-    return file_name_not_regex_;
-  }
-
-  /// Get the regular expression object associated to the
-  /// 'soname_regex' property of @ref suppression_base.
-  ///
-  /// If the regular expression object is not created, this method
-  /// creates it and returns it.
-  ///
-  /// If the 'soname_regex' property of @ref suppression_base is empty
-  /// then this method returns nil.
-  const sptr_utils::regex_t_sptr&
-  get_soname_regex() const
-  {
-    if (!soname_regex_)
-      {
-       if (!soname_regex_str_.empty())
-         {
-           sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
-           if (regcomp(r.get(),
-                       soname_regex_str_.c_str(),
-                       REG_EXTENDED) == 0)
-             soname_regex_ = r;
-         }
-      }
-    return soname_regex_;
-  }
-
-  /// Get the regular expression object associated to the
-  /// 'soname_not_regex' property of @ref suppression_base.
-  ///
-  /// If the regular expression object is not created, this method
-  /// creates it and returns it.
-  ///
-  /// If the 'soname_not_regex' property of @ref suppression_base is
-  /// empty then this method returns nil.
-  const sptr_utils::regex_t_sptr&
-  get_soname_not_regex() const
-  {
-    if (!soname_not_regex_)
-      {
-       if (!soname_not_regex_str_.empty())
-         {
-           sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
-           if (regcomp(r.get(),
-                       soname_not_regex_str_.c_str(),
-                       REG_EXTENDED) == 0)
-             soname_not_regex_ = r;
-         }
-      }
-    return soname_not_regex_;
-  }
-
-}; // end clas suppression_base::priv
-
 /// Constructor for @ref suppression_base
 ///
 /// @param a label for the suppression.  This represents just a
@@ -193,6 +56,16 @@ suppression_base::suppression_base(const string& label)
   : priv_(new priv(label))
 {}
 
+/// Constructor for @ref suppression_base
+///
+/// @param a label for the suppression.  This represents just a
+/// comment.
+///
+/// @param file_name_regex_str the regular expression that denotes the
+/// file name to match.
+///
+/// @param file_name_not_regex_str the regular expression that denotes
+/// the file name to *NOT* match.
 suppression_base::suppression_base(const string& label,
                                   const string& file_name_regex_str,
                                   const string& file_name_not_regex_str)
@@ -202,6 +75,26 @@ suppression_base::suppression_base(const string& label,
 {
 }
 
+/// Tests if the current suppression specification is to avoid adding
+/// the matched ABI artifact to the internal representation or not.
+///
+/// @return true iff the current suppression specification is to avoid
+/// adding the matched ABI artifact to the internal representation.
+bool
+suppression_base::get_drops_artifact_from_ir() const
+{return priv_->drops_artifact_;}
+
+/// Set the flag that says whether the current suppression
+/// specification is to avoid adding the matched ABI artifact to the
+/// internal representation or not.
+///
+/// @param f the flag to set to true iff the current suppression
+/// specification is to avoid adding the matched ABI artifact to the
+/// internal representation.
+void
+suppression_base::set_drops_artifact_from_ir(bool f) const
+{priv_->drops_artifact_ = f;}
+
 /// Test is the suppression specification is artificial.
 ///
 /// Artificial means that the suppression was automatically generated
@@ -337,97 +230,56 @@ const string&
 suppression_base::get_soname_not_regex_str() const
 {return priv_->soname_not_regex_str_;}
 
-/// Check if the names of the two binaries being compared match the
-/// content of the properties "file_name_regexp" and
-/// "file_name_not_regexp".
+/// Check if the SONAMEs of the two binaries being compared match the
+/// content of the properties "soname_regexp" and "soname_not_regexp"
+/// of the current suppression specification.
+///
+/// @param suppr the suppression specification
 ///
 /// @param ctxt the context of the comparison.
 ///
 /// @return false if the regular expression contained in the property
-/// file_name_regexp or in the property "file_name_not_regexp" does
-/// *NOT* match at least one of the names of the two binaries being
+/// soname_regexp or in the property "soname_not_regexp" does *NOT*
+/// match at least one of the SONAMEs of the two binaries being
 /// compared.  Return true otherwise.
-bool
-suppression_base::names_of_binaries_match(const diff_context& ctxt) const
+static bool
+sonames_of_binaries_match(const suppression_base& suppr,
+                         const diff_context& ctxt)
 {
-  // Check if the names of the binaries match
-  if (sptr_utils::regex_t_sptr regexp =
-      suppression_base::priv_->get_file_name_regex())
-    {
-      string first_binary_path = ctxt.get_first_corpus()->get_path(),
-       second_binary_path = ctxt.get_second_corpus()->get_path();
-
-      string first_binary_name, second_binary_name;
-
-      tools_utils::base_name(first_binary_path, first_binary_name);
-      tools_utils::base_name(second_binary_path, second_binary_name);
-
-      if ((regexec(regexp.get(), first_binary_name.c_str(),
-                  0, NULL, 0) != 0)
-         && (regexec(regexp.get(), second_binary_name.c_str(),
-                     0, NULL, 0) != 0))
-       return false;
-    }
-
-  if (sptr_utils::regex_t_sptr regexp =
-      suppression_base::priv_->get_file_name_not_regex())
-    {
-      string first_binary_path = ctxt.get_first_corpus()->get_path(),
-       second_binary_path = ctxt.get_second_corpus()->get_path();
-
-      string first_binary_name, second_binary_name;
-
-      tools_utils::base_name(first_binary_path, first_binary_name);
-      tools_utils::base_name(second_binary_path, second_binary_name);
+  // Check if the sonames of the binaries match
+  string first_soname = ctxt.get_first_corpus()->get_soname(),
+    second_soname = ctxt.get_second_corpus()->get_soname();
 
-      if ((regexec(regexp.get(), first_binary_name.c_str(),
-                  0, NULL, 0) == 0)
-         || (regexec(regexp.get(), second_binary_name.c_str(),
-                     0, NULL, 0) == 0))
-       return false;
-    }
+  if (!suppr.priv_->matches_soname(first_soname)
+      && !suppr.priv_->matches_soname(second_soname))
+    return false;
 
   return true;
 }
 
-/// Check if the SONAMEs of the two binaries being compared match the
-/// content of the properties "soname_regexp" and "soname_not_regexp".
+/// Check if the names of the two binaries being compared match the
+/// content of the properties "file_name_regexp" and
+/// "file_name_not_regexp".
+///
+/// @param suppr the current suppression specification.
 ///
 /// @param ctxt the context of the comparison.
 ///
 /// @return false if the regular expression contained in the property
-/// soname_regexp or in the property "soname_not_regexp" does *NOT*
-/// match at least one of the SONAMEs of the two binaries being
+/// file_name_regexp or in the property "file_name_not_regexp" does
+/// *NOT* match at least one of the names of the two binaries being
 /// compared.  Return true otherwise.
-bool
-suppression_base::sonames_of_binaries_match(const diff_context& ctxt) const
+static bool
+names_of_binaries_match(const suppression_base& suppr,
+                       const diff_context &ctxt)
 {
-  // Check if the sonames of the binaries match
-  if (sptr_utils::regex_t_sptr regexp =
-      suppression_base::priv_->get_soname_regex())
-    {
-      string first_soname = ctxt.get_first_corpus()->get_soname(),
-       second_soname = ctxt.get_second_corpus()->get_soname();
-
-      if ((regexec(regexp.get(), first_soname.c_str(),
-                  0, NULL, 0) != 0)
-         && (regexec(regexp.get(), second_soname.c_str(),
-                     0, NULL, 0) != 0))
-       return false;
-    }
+   // Check if the file names of the binaries match
+  string first_binary_path = ctxt.get_first_corpus()->get_path(),
+    second_binary_path = ctxt.get_second_corpus()->get_path();
 
-  if (sptr_utils::regex_t_sptr regexp =
-      suppression_base::priv_->get_soname_not_regex())
-    {
-      string first_soname = ctxt.get_first_corpus()->get_soname(),
-       second_soname = ctxt.get_second_corpus()->get_soname();
-
-      if ((regexec(regexp.get(), first_soname.c_str(),
-                  0, NULL, 0) == 0)
-         || (regexec(regexp.get(), second_soname.c_str(),
-                     0, NULL, 0) == 0))
-       return false;
-    }
+  if (!suppr.priv_->matches_binary_name(first_binary_path)
+      && !suppr.priv_->matches_binary_name(second_binary_path))
+    return false;
 
   return true;
 }
@@ -505,100 +357,6 @@ read_suppressions(const string& file_path,
 
 // <type_suppression stuff>
 
-/// The private data for @ref type_suppression.
-class type_suppression::priv
-{
-  string                               type_name_regex_str_;
-  mutable sptr_utils::regex_t_sptr     type_name_regex_;
-  string                               type_name_;
-  bool                                 consider_type_kind_;
-  type_suppression::type_kind          type_kind_;
-  bool                                 consider_reach_kind_;
-  type_suppression::reach_kind         reach_kind_;
-  type_suppression::insertion_ranges   insertion_ranges_;
-  unordered_set<string>                source_locations_to_keep_;
-  string                               source_location_to_keep_regex_str_;
-  mutable sptr_utils::regex_t_sptr     source_location_to_keep_regex_;
-
-  priv();
-
-public:
-  priv(const string&                   type_name_regexp,
-       const string&                   type_name,
-       bool                            consider_type_kind,
-       type_suppression::type_kind     type_kind,
-       bool                            consider_reach_kind,
-       type_suppression::reach_kind    reach_kind)
-    : type_name_regex_str_(type_name_regexp),
-      type_name_(type_name),
-      consider_type_kind_(consider_type_kind),
-      type_kind_(type_kind),
-      consider_reach_kind_(consider_reach_kind),
-      reach_kind_(reach_kind)
-  {}
-
-  /// Get the regular expression object associated to the 'type_name_regex'
-  /// property of @ref type_suppression.
-  ///
-  /// If the regular expression object is not created, this method
-  /// creates it and returns it.
-  ///
-  /// If the 'type_name_regex' property of @ref type_suppression is
-  /// empty then this method returns nil.
-  const sptr_utils::regex_t_sptr
-  get_type_name_regex() const
-  {
-    if (!type_name_regex_)
-      {
-       if (!type_name_regex_str_.empty())
-         {
-           sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
-           if (regcomp(r.get(),
-                       type_name_regex_str_.c_str(),
-                       REG_EXTENDED) == 0)
-             type_name_regex_ = r;
-         }
-      }
-    return type_name_regex_;
-  }
-
-  /// Setter for the type_name_regex object.
-  ///
-  /// @param r the new type_name_regex object.
-  void
-  set_type_name_regex(sptr_utils::regex_t_sptr r)
-  {type_name_regex_ = r;}
-
-  /// Getter for the source_location_to_keep_regex object.
-  ///
-  /// This function builds the regex if it's not yet built.
-  const sptr_utils::regex_t_sptr
-  get_source_location_to_keep_regex() const
-  {
-    if (!source_location_to_keep_regex_)
-      {
-       if (!source_location_to_keep_regex_str_.empty())
-         {
-           sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
-           if (regcomp(r.get(),
-                       source_location_to_keep_regex_str_.c_str(),
-                       REG_EXTENDED) == 0)
-             source_location_to_keep_regex_ = r;
-         }
-      }
-    return source_location_to_keep_regex_;
-  }
-
-  /// Setter for the source_location_to_keep_regex object.
-  ///
-  /// @param r the new regex object.
-  void
-  set_source_location_to_keep_regex(sptr_utils::regex_t_sptr r)
-  {source_location_to_keep_regex_ = r;}
-
-  friend class type_suppression;
-}; // class type_suppression::priv
-
 /// Constructor for @ref type_suppression.
 ///
 /// @param label the label of the suppression.  This is just a free
@@ -1006,19 +764,38 @@ type_suppression::suppresses_type(const type_base_sptr& type,
   if (ctxt)
     {
       // Check if the names of the binaries match
-      if (!names_of_binaries_match(*ctxt))
+      if (!names_of_binaries_match(*this, *ctxt))
        return false;
 
       // Check if the sonames of the binaries match
-      if (!sonames_of_binaries_match(*ctxt))
+      if (!sonames_of_binaries_match(*this, *ctxt))
        return false;
     }
 
+  return suppresses_type(type);
+
+}
+
+/// Test if an instance of @ref type_suppression matches a given type.
+///
+/// This function does not take the name of the type into account
+/// while testing if the type matches the type_suppression.
+///
+/// @param s the suppression to evaluate.
+///
+/// @param type the type to consider.
+///
+/// @return true iff the suppression specification matches type @p
+/// type without taking its name into account.
+static bool
+suppression_matches_type_no_name(const type_suppression&        s,
+                                const type_base_sptr           &type)
+{
   // If the suppression should consider type kind then, well, check
   // for that.
-  if (get_consider_type_kind())
+  if (s.get_consider_type_kind())
     {
-      type_kind tk = get_type_kind();
+      type_suppression::type_kind tk = s.get_type_kind();
       bool matches = true;
       switch (tk)
        {
@@ -1061,92 +838,105 @@ type_suppression::suppresses_type(const type_base_sptr& type,
     }
 
   // Check if there is a source location related match.
-  if (decl_base_sptr d = get_type_declaration(type))
-    {
-      location loc = d->get_location();
-      if (!loc)
-       {
-         if (class_decl_sptr c = is_class_type(d))
-           if (c->get_is_declaration_only()
-               && c->get_definition_of_declaration())
-             {
-               c = c->get_definition_of_declaration();
-               loc = c->get_location();
-             }
-       }
+  if (!suppression_matches_type_location(s, type))
+    return false;
 
-      if (loc)
-       {
-         translation_unit* tu = get_translation_unit(d);
-         if (tu)
-           {
-             string loc_path, loc_path_base;
-             unsigned loc_line = 0, loc_column = 0;
-             tu->get_loc_mgr().expand_location(loc, loc_path,
-                                               loc_line, loc_column);
-
-             if (sptr_utils::regex_t_sptr regexp =
-                 priv_->get_source_location_to_keep_regex())
-               if (regexec(regexp.get(), loc_path.c_str(), 0, NULL, 0) == 0)
-                 return false;
+  return true;
+}
 
-             tools_utils::base_name(loc_path, loc_path_base);
-             if (get_source_locations_to_keep().find(loc_path_base)
-                 != get_source_locations_to_keep().end())
-               return false;
-             if (get_source_locations_to_keep().find(loc_path)
-                 != get_source_locations_to_keep().end())
-               return false;
-           }
-         else
-           {
-             if (!get_source_locations_to_keep().empty()
-                 || priv_->get_source_location_to_keep_regex())
-               // The user provided a "source_location_not_regexp" or
-               // a "source_location_not_in" property that was not
-               // triggered.  This means the current type suppression
-               // doesn't suppress the type given.
-               return false;
-           }
+/// Test if a type suppression specification matches a type name.
+///
+/// @param s the type suppression to consider.
+///
+/// @param type_name the type name to consider.
+///
+/// @return true iff the type designated by its name @p type_name is
+/// matched by the type suppression specification @p s.
+bool
+suppression_matches_type_name(const type_suppression&  s,
+                             const string&             type_name)
+{
+  if (!s.get_type_name().empty() || s.priv_->get_type_name_regex())
+    {
+      // Check if there is an exact type name match.
+      if (!s.get_type_name().empty())
+       {
+         if (s.get_type_name() != type_name)
+           return false;
        }
       else
        {
-         // So the type had no source location.
+         // Now check if there is a regular expression match.
          //
-         // In the case where this type suppression was automatically
-         // generated to suppress types not defined in public
-         // headers, then this might mean that the type is not
-         // defined in the public headers.  Otherwise, why does it
-         // not have a source location?
-         if (get_is_artificial())
-           {
-             if (class_decl_sptr cl = is_class_type(d))
-               {
-                 if (cl->get_is_declaration_only())
-                   // We tried hard above to get the definition of
-                   // the declaration.  If we reach this place, it
-                   // means the class has no definition at this point.
-                   assert(!cl->get_definition_of_declaration());
-                 if (get_label() == tools_utils::PRIVATE_TYPES_SUPPR_SPEC_NAME)
-                   // So this looks like what really amounts to an
-                   // opaque type.  So it's not defined in the public
-                   // headers.  So we want to filter it out.
-                   return true;
-               }
-           }
-         if (!get_source_locations_to_keep().empty()
-             || priv_->get_source_location_to_keep_regex())
-           // The user provided a "source_location_not_regexp" or
-           // a "source_location_not_in" property that was not
-           // triggered.  This means the current type suppression
-           // doesn't suppress the type given.
+         // If the qualified name of the considered type doesn't match
+         // the regular expression of the type name, then this
+         // suppression doesn't apply.
+         const sptr_utils::regex_t_sptr& type_name_regex =
+           s.priv_->get_type_name_regex();
+         if (type_name_regex && (regexec(type_name_regex.get(),
+                                         type_name.c_str(),
+                                         0, NULL, 0) != 0))
            return false;
        }
     }
+
+  return true;
+}
+
+/// Test if a type suppression matches a type in a particular scope.
+///
+/// @param s the type suppression to consider.
+///
+/// @param type_scope the scope of the type to consider.
+///
+/// @param type the type to consider.
+///
+/// @return true iff the supression @p s matches type @p type in scope
+/// @p type_scope.
+bool
+suppression_matches_type_name(const suppr::type_suppression&   s,
+                             const scope_decl*         type_scope,
+                             const type_base_sptr&             type)
+{
+  string type_name = build_qualified_name(type_scope, type);
+  return suppression_matches_type_name(s, type_name);
+}
+
+/// Test if a type suppression matches a source location.
+///
+/// @param s the type suppression to consider.
+///
+/// @param loc the location to consider.
+///
+/// @return true iff the suppression @p s matches location @p loc.
+bool
+suppression_matches_type_location(const type_suppression&      s,
+                                 const location                loc)
+{
+  if (loc)
+    {
+      // Check if there is a source location related match.
+      string loc_path, loc_path_base;
+      unsigned loc_line = 0, loc_column = 0;
+      loc.expand(loc_path, loc_line, loc_column);
+
+      if (sptr_utils::regex_t_sptr regexp =
+         s.priv_->get_source_location_to_keep_regex())
+       if (regexec(regexp.get(), loc_path.c_str(), 0, NULL, 0) == 0)
+         return false;
+
+      tools_utils::base_name(loc_path, loc_path_base);
+      if (s.get_source_locations_to_keep().find(loc_path_base)
+         != s.get_source_locations_to_keep().end())
+       return false;
+      if (s.get_source_locations_to_keep().find(loc_path)
+         != s.get_source_locations_to_keep().end())
+       return false;
+    }
   else
     {
-      if (!get_source_locations_to_keep().empty()
-         || priv_->get_source_location_to_keep_regex())
+      if (!s.get_source_locations_to_keep().empty()
+         || s.priv_->get_source_location_to_keep_regex())
        // The user provided a "source_location_not_regexp" or
        // a "source_location_not_in" property that was not
        // triggered.  This means the current type suppression
@@ -1154,31 +944,120 @@ type_suppression::suppresses_type(const type_base_sptr& type,
        return false;
     }
 
-  if (!get_type_name().empty() || priv_->get_type_name_regex())
-  {
-    string name = get_name(type);
+  return true;
+}
+
+/// Test if a type suppression matches a type.
+///
+/// @param s the type suppression to consider.
+///
+/// @param type the type to consider.
+///
+/// @return true iff the suppression @p s matches type @p type.
+bool
+suppression_matches_type_location(const type_suppression&      s,
+                                 const type_base_sptr& type)
+{
+  location loc = get_location(type);
+  if (loc)
+    return suppression_matches_type_location(s, loc);
+  else
+    {
+      // The type had no source location.
+      //
+      // In the case where this type suppression was automatically
+      // generated to suppress types not defined in public
+      // headers, then this might mean that the type is not
+      // defined in the public headers.  Otherwise, why does it
+      // not have a source location?
+      if (s.get_is_artificial())
+       {
+         if (class_decl_sptr cl = is_class_type(type))
+           {
+             if (cl->get_is_declaration_only())
+               // We tried hard above to get the definition of
+               // the declaration.  If we reach this place, it
+               // means the class has no definition at this point.
+               assert(!cl->get_definition_of_declaration());
+             if (s.get_label() == tools_utils::PRIVATE_TYPES_SUPPR_SPEC_NAME)
+               // So this looks like what really amounts to an
+               // opaque type.  So it's not defined in the public
+               // headers.  So we want to filter it out.
+               return true;
+           }
+       }
+      if (!s.get_source_locations_to_keep().empty()
+         || s.priv_->get_source_location_to_keep_regex())
+       // The user provided a "source_location_not_regexp" or
+       // a "source_location_not_in" property that was not
+       // triggered.  This means the current type suppression
+       // doesn't suppress the type given.
+       return false;
+    }
+
+  return true;
+}
+
+/// Test if a type suppression matches a type name and location.
+///
+/// @param s the type suppression to consider.
+///
+/// @param type_name the name of the type to consider.
+///
+/// @param type_location the location of the type to consider.
+///
+/// @return true iff suppression @p s matches a type named @p
+/// type_name with a location @p type_location.
+bool
+suppression_matches_type_name_or_location(const type_suppression& s,
+                                         const string& type_name,
+                                         const location& type_location)
+{
+  if (!suppression_matches_type_name(s, type_name))
+    return false;
+  if (!suppression_matches_type_location(s, type_location))
+    return false;
+  return true;
+}
+
+/// Test if the current instance of @ref type_suppression matches a
+/// given type.
+///
+/// @param type the type to consider.
+///
+/// @return true iff the suppression specification suppresses type @p
+/// type.
+bool
+type_suppression::suppresses_type(const type_base_sptr& type) const
+{
+  if (!suppression_matches_type_no_name(*this, type))
+    return false;;
+
+  if (!suppression_matches_type_name(*this, get_name(type)))
+    return false;;
+
+  return true;
+}
+
+/// Test if the current instance of @ref type_suppression matches a
+/// given type in a given scope.
+///
+/// @param type the type to consider.
+///
+/// @param type_scope the scope of type @p type.
+///
+/// @return true iff the suppression specification suppresses type @p
+/// type from scope @p type_scope.
+bool
+type_suppression::suppresses_type(const type_base_sptr& type,
+                                 const scope_decl* type_scope) const
+{
+  if (!suppression_matches_type_no_name(*this, type))
+    return false;
+
+  if (!suppression_matches_type_name(*this, type_scope, type))
+    return false;
 
-    // Check if there is an exact type name match.
-    if (!get_type_name().empty())
-      {
-       if (get_type_name() != name)
-         return false;
-      }
-    else
-      {
-       // So now check if there is a regular expression match.
-       //
-       // If the qualified name of the considered type doesn't match
-       // the regular expression of the type name, then this
-       // suppression doesn't apply.
-       const sptr_utils::regex_t_sptr& type_name_regex =
-         priv_->get_type_name_regex();
-       if (type_name_regex && (regexec(type_name_regex.get(),
-                                       name.c_str(),
-                                       0, NULL, 0) != 0))
-         return false;
-      }
-  }
   return true;
 }
 
@@ -1543,6 +1422,15 @@ read_type_suppression(const ini::config::section& section)
   if (section.get_name() != "suppress_type")
     return nil;
 
+  ini::simple_property_sptr drop_artifact =
+    is_simple_property(section.find_property("drop_artifact"));
+  if (!drop_artifact)
+    drop_artifact = is_simple_property(section.find_property("drop"));
+
+  string drop_artifact_str = drop_artifact
+    ? drop_artifact->get_value()->as_string()
+    : "";
+
   ini::simple_property_sptr label =
     is_simple_property(section.find_property("label"));
   string label_str = label ? label->get_value()->as_string() : "";
@@ -1839,46 +1727,17 @@ read_type_suppression(const ini::config::section& section)
   if (!srcloc_not_regexp_str.empty())
     suppr->set_source_location_to_keep_regex_str(srcloc_not_regexp_str);
 
+  if ((drop_artifact_str == "yes" || drop_artifact_str == "true")
+      && ((!name_regex_str.empty()
+          || !name_str.empty()
+          || !srcloc_not_regexp_str.empty()
+          || !srcloc_not_in.empty())))
+    suppr->set_drops_artifact_from_ir(true);
+
   return suppr;
 }
 
 // <function_suppression stuff>
-class function_suppression::parameter_spec::priv
-{
-  friend class function_suppression::parameter_spec;
-  friend class function_suppression;
-
-  size_t                               index_;
-  string                               type_name_;
-  string                               type_name_regex_str_;
-  mutable sptr_utils::regex_t_sptr     type_name_regex_;
-
-  priv()
-    : index_()
-  {}
-
-  priv(size_t i, const string& tn)
-    : index_(i), type_name_(tn)
-  {}
-
-  priv(size_t i, const string& tn, const string& tn_regex)
-    : index_(i), type_name_(tn), type_name_regex_str_(tn_regex)
-  {}
-
-  const sptr_utils::regex_t_sptr
-  get_type_name_regex() const
-  {
-    if (!type_name_regex_ && !type_name_regex_str_.empty())
-      {
-       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
-       if (regcomp(r.get(),
-                   type_name_regex_str_.c_str(),
-                   REG_EXTENDED) == 0)
-         type_name_regex_ = r;
-      }
-    return type_name_regex_;
-  }
-}; // end class function_suppression::parameter_spec::priv
 
 /// Constructor for the @ref the function_suppression::parameter_spec
 /// type.
@@ -1957,144 +1816,6 @@ function_suppression::parameter_spec::set_parameter_type_name_regex_str
 (const string& type_name_regex_str)
 {priv_->type_name_regex_str_ = type_name_regex_str;}
 
-/// The type of the private data of the @ref function_suppression
-/// type.
-class function_suppression::priv
-{
-  friend class function_suppression;
-
-  change_kind                          change_kind_;
-  string                               name_;
-  string                               name_regex_str_;
-  mutable sptr_utils::regex_t_sptr     name_regex_;
-  string                               return_type_name_;
-  string                               return_type_regex_str_;
-  mutable sptr_utils::regex_t_sptr     return_type_regex_;
-  parameter_specs_type                 parm_specs_;
-  string                               symbol_name_;
-  string                               symbol_name_regex_str_;
-  mutable sptr_utils::regex_t_sptr     symbol_name_regex_;
-  string                               symbol_version_;
-  string                               symbol_version_regex_str_;
-  mutable sptr_utils::regex_t_sptr     symbol_version_regex_;
-  bool                                 allow_other_aliases_;
-
-  priv(const string&                   name,
-       const string&                   name_regex_str,
-       const string&                   return_type_name,
-       const string&                   return_type_regex_str,
-       const parameter_specs_type&     parm_specs,
-       const string&                   symbol_name,
-       const string&                   symbol_name_regex_str,
-       const string&                   symbol_version,
-       const string&                   symbol_version_regex_str)
-    : change_kind_(ALL_CHANGE_KIND),
-      name_(name),
-      name_regex_str_(name_regex_str),
-      return_type_name_(return_type_name),
-      return_type_regex_str_(return_type_regex_str),
-      parm_specs_(parm_specs),
-      symbol_name_(symbol_name),
-      symbol_name_regex_str_(symbol_name_regex_str),
-      symbol_version_(symbol_version),
-      symbol_version_regex_str_(symbol_version_regex_str),
-      allow_other_aliases_(true)
-  {}
-
-
-  /// Getter for a pointer to a regular expression object built from
-  /// the regular expression string
-  /// function_suppression::priv::name_regex_str_.
-  ///
-  /// If that string is empty, then an empty regular expression object
-  /// pointer is returned.
-  ///
-  /// @return a pointer to the regular expression object of
-  /// function_suppression::priv::name_regex_str_..
-  const sptr_utils::regex_t_sptr
-  get_name_regex() const
-  {
-    if (!name_regex_ && !name_regex_str_.empty())
-      {
-       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
-       if (regcomp(r.get(),
-                   name_regex_str_.c_str(),
-                   REG_EXTENDED) == 0)
-         name_regex_ = r;
-      }
-    return name_regex_;
-  }
-
-  /// Getter for a pointer to a regular expression object built from
-  /// the regular expression string
-  /// function_suppression::priv::return_type_regex_str_.
-  ///
-  /// If that string is empty, then an empty regular expression object
-  /// pointer is returned.
-  ///
-  /// @return a pointer to the regular expression object of
-  /// function_suppression::priv::return_type_regex_str_.
-  const sptr_utils::regex_t_sptr
-  get_return_type_regex() const
-  {
-    if (!return_type_regex_ && !return_type_regex_str_.empty())
-      {
-       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
-       if (regcomp(r.get(),
-                   return_type_regex_str_.c_str(),
-                   REG_EXTENDED) == 0)
-         return_type_regex_ = r;
-      }
-    return return_type_regex_;
-  }
-
-  /// Getter for a pointer to a regular expression object built from
-  /// the regular expression string
-  /// function_suppression::priv::symbol_name_regex_str_.
-  ///
-  /// If that string is empty, then an empty regular expression object
-  /// pointer is returned.
-  ///
-  /// @return a pointer to the regular expression object of
-  /// function_suppression::priv::symbol_name_regex_str_.
-  const sptr_utils::regex_t_sptr
-  get_symbol_name_regex() const
-  {
-    if (!symbol_name_regex_ && !symbol_name_regex_str_.empty())
-      {
-       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
-       if (regcomp(r.get(),
-                   symbol_name_regex_str_.c_str(),
-                   REG_EXTENDED) == 0)
-         symbol_name_regex_ = r;
-      }
-    return symbol_name_regex_;
-  }
-
-  /// Getter for a pointer to a regular expression object built from
-  /// the regular expression string
-  /// function_suppression::priv::symbol_version_regex_str_.
-  ///
-  /// If that string is empty, then an empty regular expression object
-  /// pointer is returned.
-  ///
-  /// @return a pointer to the regular expression object of
-  /// function_suppression::priv::symbol_version_regex_str_.
-  const sptr_utils::regex_t_sptr
-  get_symbol_version_regex() const
-  {
-    if (!symbol_version_regex_ && ! symbol_version_regex_str_.empty())
-      {
-       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
-       if (regcomp(r.get(),
-                   symbol_version_regex_str_.c_str(),
-                   REG_EXTENDED) == 0)
-         symbol_version_regex_ = r;
-      }
-    return symbol_version_regex_;
-  }
-}; // end class function_suppression::priv
-
 /// Constructor for the @ref function_suppression type.
 ///
 /// @param label an informative text string that the evalution code
@@ -2210,7 +1931,7 @@ function_suppression::set_change_kind(change_kind k)
 ///
 /// @return the name of the function.
 const string&
-function_suppression::get_function_name() const
+function_suppression::get_name() const
 {return priv_->name_;}
 
 /// Setter for the name of the function the user wants the current
@@ -2219,39 +1940,47 @@ function_suppression::get_function_name() const
 ///
 /// @param n the new function name to set.
 void
-function_suppression::set_function_name(const string& n)
+function_suppression::set_name(const string& n)
 {priv_->name_ = n;}
 
 /// Getter for a regular expression for a family of names of functions
 /// the user wants the current specification to designate.
 ///
-/// If the function name as returned by
-/// function_suppression::get_function_name() is not empty, this
-/// property is ignored at specification evaluation time.  This
-/// property might be empty, in which case it's ignored at evaluation
-/// time.
-///
 /// @return the regular expression for the possible names of the
 /// function(s).
 const string&
-function_suppression::get_function_name_regex_str() const
+function_suppression::get_name_regex_str() const
 {return priv_->name_regex_str_;}
 
 /// Setter for a regular expression for a family of names of functions
 /// the user wants the current specification to designate.
 ///
-/// If the function name as returned by
-/// function_suppression::get_function_name() is not empty, this
-/// property is ignored at specification evaluation time.  This
-/// property might be empty, in which case it's ignored at evaluation
-/// time.
-///
 /// @param r the new the regular expression for the possible names of
 /// the function(s).
 void
-function_suppression::set_function_name_regex_str(const string& r)
+function_suppression::set_name_regex_str(const string& r)
 {priv_->name_regex_str_ = r;}
 
+/// Getter for a regular expression of a family of names of functions
+/// the user wants the current specification to designate the negation
+/// of.
+///
+/// @return the regular expression for the possible names of the
+/// function(s).
+const string&
+function_suppression::get_name_not_regex_str() const
+{return priv_->name_not_regex_str_;}
+
+/// Setter for a regular expression for a family of names of functions
+/// the user wants the current specification to designate the negation
+/// of.
+///
+/// @param r the new the regular expression for the possible names of
+/// the function(s).
+void
+function_suppression::set_name_not_regex_str(const string& r)
+{priv_->name_not_regex_str_ = r;}
+
 /// Getter for the name of the return type of the function the user
 /// wants this specification to designate.  This property might be
 /// empty, in which case it's ignored at evaluation time.
@@ -2507,20 +2236,20 @@ function_suppression::suppresses_function(const function_decl* fn,
   if (ctxt)
     {
       // Check if the name of the binaries match
-      if (!names_of_binaries_match(*ctxt))
+      if (!names_of_binaries_match(*this, *ctxt))
        return false;
 
       // Check if the soname of the binaries match
-      if (!sonames_of_binaries_match(*ctxt))
+      if (!sonames_of_binaries_match(*this, *ctxt))
        return false;
     }
 
   string fname = fn->get_qualified_name();
 
   // Check if the "name" property matches.
-  if (!get_function_name().empty())
+  if (!get_name().empty())
     {
-      if (get_function_name() != fn->get_qualified_name())
+      if (get_name() != fn->get_qualified_name())
        return false;
 
       if (get_allow_other_aliases()
@@ -2585,6 +2314,41 @@ function_suppression::suppresses_function(const function_decl* fn,
        }
     }
 
+  // check if the "name_not_regexp" property matches.
+  const sptr_utils::regex_t_sptr name_not_regex = priv_->get_name_not_regex();
+  if (name_not_regex)
+    {
+      if (regexec(name_not_regex.get(),
+                 fname.c_str(),
+                 0, NULL, 0) == 0)
+       return false;
+
+      if (get_allow_other_aliases()
+         && fn->get_symbol()
+         && fn->get_symbol()->get_alias_from_name(fname))
+       {
+         // So we are in a case of a languages in which the symbol
+         // name is the same as the function name and we want to
+         // allow the removal of change reports on an aliased
+         // function only if the suppression condition matches *all*
+         // the aliases.
+         string symbol_name;
+         elf_symbol_sptr sym = fn->get_symbol();
+         assert(sym);
+         symbol_name = sym->get_name();
+         if (sym->has_aliases())
+           {
+             for (elf_symbol_sptr a = sym->get_next_alias();
+                  a && !a->is_main_symbol();
+                  a = a->get_next_alias())
+               if (regexec(name_regex.get(),
+                           a->get_name().c_str(),
+                           0, NULL, 0) == 0)
+                 return false;
+           }
+       }
+    }
+
   // Check if the "return_type_name" or "return_type_regexp"
   // properties matches.
 
@@ -2789,11 +2553,11 @@ function_suppression::suppresses_function_symbol(const elf_symbol* sym,
   if (ctxt)
     {
       // Check if the name of the binaries match
-      if (!names_of_binaries_match(*ctxt))
+      if (!names_of_binaries_match(*this, *ctxt))
        return false;
 
       // Check if the soname of the binaries match
-      if (!sonames_of_binaries_match(*ctxt))
+      if (!sonames_of_binaries_match(*this, *ctxt))
        return false;
     }
 
@@ -2907,6 +2671,164 @@ operator|(function_suppression::change_kind l,
       (static_cast<unsigned>(l) | static_cast<unsigned>(r));
 }
 
+  /// Test whether if a given function suppression matches a function
+  /// designated by a regular expression that describes its name.
+  ///
+  /// @param s the suppression specification to evaluate to see if it
+  /// matches a given function name.
+  ///
+  /// @param fn_name the name of the function of interest.  Note that
+  /// this name must be *non* qualified.
+  ///
+  /// @return true iff the suppression specification @p s matches the
+  /// function whose name is @p fn_name.
+bool
+suppression_matches_function_name(const suppr::function_suppression& s,
+                                 const string& fn_name)
+{
+  if (sptr_utils::regex_t_sptr regexp = s.priv_->get_name_regex())
+    {
+      if (regexec(regexp.get(), fn_name.c_str(), 0, NULL, 0) != 0)
+       return false;
+    }
+  else if (sptr_utils::regex_t_sptr regexp = s.priv_->get_name_not_regex())
+    {
+      if (regexec(regexp.get(), fn_name.c_str(), 0, NULL, 0) == 0)
+       return false;
+    }
+  else if (s.priv_->name_.empty())
+    return false;
+  else // if (!s.priv_->name_.empty())
+    {
+      if (s.priv_->name_ != fn_name)
+       return false;
+    }
+
+  return true;
+}
+
+/// Test whether if a given function suppression matches a function
+/// designated by a regular expression that describes its linkage
+/// name (symbol name).
+///
+/// @param s the suppression specification to evaluate to see if it
+/// matches a given function linkage name
+///
+/// @param fn_linkage_name the linkage name of the function of interest.
+///
+/// @return true iff the suppression specification @p s matches the
+/// function whose linkage name is @p fn_linkage_name.
+bool
+suppression_matches_function_sym_name(const suppr::function_suppression& s,
+                                     const string& fn_linkage_name)
+{
+  if (sptr_utils::regex_t_sptr regexp = s.priv_->get_symbol_name_regex())
+    {
+      if (regexec(regexp.get(), fn_linkage_name.c_str(), 0, NULL, 0) != 0)
+       return false;
+    }
+  else if (s.priv_->symbol_name_.empty())
+    return false;
+  else // if (!s.priv_->symbol_name_.empty())
+    {
+      if (s.priv_->symbol_name_ != fn_linkage_name)
+       return false;
+    }
+
+  return true;
+}
+
+/// Test if a variable suppression matches a variable denoted by its name.
+///
+/// @param s the variable suppression to consider.
+///
+/// @param var_name the name of the variable to consider.
+///
+/// @return true if the variable is matches by the suppression
+/// specification.
+bool
+suppression_matches_variable_name(const suppr::variable_suppression& s,
+                                 const string& var_name)
+{
+  if (sptr_utils::regex_t_sptr regexp = s.priv_->get_name_regex())
+    {
+      if (regexec(regexp.get(), var_name.c_str(), 0, NULL, 0) != 0)
+       return false;
+    }
+  else if (sptr_utils::regex_t_sptr regexp = s.priv_->get_name_not_regex())
+    {
+      if (regexec(regexp.get(), var_name.c_str(), 0, NULL, 0) == 0)
+       return false;
+    }
+  else if (s.priv_->name_.empty())
+    return false;
+  else // if (!s.priv_->name_.empty())
+    {
+      if (s.priv_->name_ != var_name)
+       return false;
+    }
+
+  return true;
+}
+
+/// Test if a variable suppression matches a variable denoted by its
+/// symbol name.
+///
+/// @param s the variable suppression to consider.
+///
+/// @param var_linkage_name the name of the variable to consider.
+///
+/// @return true if the variable is matches by the suppression
+/// specification.
+bool
+suppression_matches_variable_sym_name(const suppr::variable_suppression& s,
+                                     const string& var_linkage_name)
+{
+  if (sptr_utils::regex_t_sptr regexp = s.priv_->get_symbol_name_regex())
+    {
+      if (regexec(regexp.get(), var_linkage_name.c_str(), 0, NULL, 0) != 0)
+       return false;
+    }
+  else if (s.priv_->symbol_name_.empty())
+    return false;
+  else // if (!s.priv_->symbol_name_.empty())
+    {
+      if (s.priv_->symbol_name_ != var_linkage_name)
+       return false;
+    }
+
+  return true;
+}
+
+/// Test if a type suppression matches a type designated by its fully
+/// qualified name.
+///
+/// @param s the type suppression to consider.
+///
+/// @param type_name the name of the type to consider.
+///
+/// @return true iff the suppression s matches the type denoted by
+/// name @p type_name.
+bool
+suppression_matches_type(const suppr::type_suppression& s,
+                        const string& type_name)
+{
+  if (sptr_utils::regex_t_sptr regexp = s.priv_->get_type_name_regex())
+    {
+      if (regexec(regexp.get(), type_name.c_str(), 0, NULL, 0) != 0)
+       return false;
+    }
+  else if (!s.get_type_name().empty())
+    {
+      if (s.get_type_name() != type_name)
+       return false;
+    }
+  else
+    return false;
+
+  return true;
+}
+
 /// Parse a string containing a parameter spec, build an instance of
 /// function_suppression::parameter_spec from it and return a pointer
 /// to that object.
@@ -2992,6 +2914,15 @@ read_function_suppression(const ini::config::section& section)
   if (section.get_name() != "suppress_function")
     return nil;
 
+  ini::simple_property_sptr drop_artifact =
+    is_simple_property(section.find_property("drop_artifact"));
+  if (!drop_artifact)
+    drop_artifact = is_simple_property(section.find_property("drop"));
+
+  string drop_artifact_str = drop_artifact
+    ? drop_artifact->get_value()->as_string()
+    : "";
+
   ini::simple_property_sptr change_kind_prop =
     is_simple_property(section.find_property("change_kind"));
   string change_kind_str = change_kind_prop
@@ -3040,6 +2971,12 @@ read_function_suppression(const ini::config::section& section)
     ? name_regex_prop->get_value()->as_string()
     : "";
 
+  ini::simple_property_sptr name_not_regex_prop =
+    is_simple_property(section.find_property("name_not_regexp"));
+  string name_not_regex_str = name_not_regex_prop
+    ? name_not_regex_prop->get_value()->as_string()
+    : "";
+
   ini::simple_property_sptr return_type_name_prop =
     is_simple_property(section.find_property("return_type_name"));
   string return_type_name = return_type_name_prop
@@ -3101,6 +3038,7 @@ read_function_suppression(const ini::config::section& section)
   if (!label_str.empty()
       || !name.empty()
       || !name_regex_str.empty()
+      || !name_not_regex_str.empty()
       || !file_name_regex_str.empty()
       || !file_name_not_regex_str.empty()
       || !soname_regex_str.empty()
@@ -3121,6 +3059,15 @@ read_function_suppression(const ini::config::section& section)
                                          sym_name_regex_str,
                                          sym_version,
                                          sym_ver_regex_str));
+
+  if ((drop_artifact_str == "yes" || drop_artifact_str == "true")
+      && (!name.empty()
+         || !name_regex_str.empty()
+         || !name_not_regex_str.empty()
+         || !sym_name.empty()
+         || !sym_name_regex_str.empty()))
+    result->set_drops_artifact_from_ir(true);
+
   if (result && !change_kind_str.empty())
     result->set_change_kind
       (function_suppression::parse_change_kind(change_kind_str));
@@ -3129,6 +3076,9 @@ read_function_suppression(const ini::config::section& section)
     result->set_allow_other_aliases(allow_other_aliases == "yes"
                                    || allow_other_aliases == "true");
 
+  if (!name_not_regex_str.empty())
+    result->set_name_not_regex_str(name_not_regex_str);
+
   if (!file_name_regex_str.empty())
     result->set_file_name_regex_str(file_name_regex_str);
 
@@ -3148,138 +3098,6 @@ read_function_suppression(const ini::config::section& section)
 
 // <variable_suppression stuff>
 
-/// The type of the private data of the @ref variable_suppression
-/// type.
-class variable_suppression::priv
-{
-  friend class variable_suppression;
-
-  change_kind                          change_kind_;
-  string                               name_;
-  string                               name_regex_str_;
-  mutable sptr_utils::regex_t_sptr     name_regex_;
-  string                               symbol_name_;
-  string                               symbol_name_regex_str_;
-  mutable sptr_utils::regex_t_sptr     symbol_name_regex_;
-  string                               symbol_version_;
-  string                               symbol_version_regex_str_;
-  mutable sptr_utils::regex_t_sptr     symbol_version_regex_;
-  string                               type_name_;
-  string                               type_name_regex_str_;
-  mutable sptr_utils::regex_t_sptr     type_name_regex_;
-
-  priv(const string& name,
-       const string& name_regex_str,
-       const string& symbol_name,
-       const string& symbol_name_regex_str,
-       const string& symbol_version,
-       const string& symbol_version_regex_str,
-       const string& type_name,
-       const string& type_name_regex_str)
-    : change_kind_(ALL_CHANGE_KIND),
-      name_(name),
-      name_regex_str_(name_regex_str),
-      symbol_name_(symbol_name),
-      symbol_name_regex_str_(symbol_name_regex_str),
-      symbol_version_(symbol_version),
-      symbol_version_regex_str_(symbol_version_regex_str),
-      type_name_(type_name),
-      type_name_regex_str_(type_name_regex_str)
-  {}
-
-  /// Getter for a pointer to a regular expression object built from
-  /// the regular expression string
-  /// variable_suppression::priv::name_regex_str_.
-  ///
-  /// If that string is empty, then an empty regular expression object
-  /// pointer is returned.
-  ///
-  /// @return a pointer to the regular expression object of
-  /// variable_suppression::priv::name_regex_str_.
-  const sptr_utils::regex_t_sptr
-  get_name_regex() const
-  {
-    if (!name_regex_ && !name_regex_str_.empty())
-      {
-       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
-       if (regcomp(r.get(),
-                   name_regex_str_.c_str(),
-                   REG_EXTENDED) == 0)
-         name_regex_ = r;
-      }
-    return name_regex_;
-  }
-
-  /// Getter for a pointer to a regular expression object built from
-  /// the regular expression string
-  /// variable_suppression::priv::symbol_name_regex_str_.
-  ///
-  /// If that string is empty, then an empty regular expression object
-  /// pointer is returned.
-  ///
-  /// @return a pointer to the regular expression object of
-  /// variable_suppression::priv::symbol_name_regex_str_.
-  const sptr_utils::regex_t_sptr
-  get_symbol_name_regex() const
-  {
-    if (!symbol_name_regex_ && !symbol_name_regex_str_.empty())
-      {
-       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
-       if (regcomp(r.get(),
-                   symbol_name_regex_str_.c_str(),
-                   REG_EXTENDED) == 0)
-         symbol_name_regex_ = r;
-      }
-    return symbol_name_regex_;
-  }
-
-  /// Getter for a pointer to a regular expression object built from
-  /// the regular expression string
-  /// variable_suppression::priv::symbol_version_regex_str_.
-  ///
-  /// If that string is empty, then an empty regular expression object
-  /// pointer is returned.
-  ///
-  /// @return a pointer to the regular expression object of
-  /// variable_suppression::priv::symbol_version_regex_str_.
-  const sptr_utils::regex_t_sptr
-  get_symbol_version_regex()  const
-  {
-    if (!symbol_version_regex_ && !symbol_version_regex_str_.empty())
-      {
-       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
-       if (regcomp(r.get(),
-                   symbol_version_regex_str_.c_str(),
-                   REG_EXTENDED) == 0)
-         symbol_version_regex_ = r;
-      }
-    return symbol_version_regex_;
-  }
-
-  /// Getter for a pointer to a regular expression object built from
-  /// the regular expression string
-  /// variable_suppression::priv::type_name_regex_str_.
-  ///
-  /// If that string is empty, then an empty regular expression object
-  /// pointer is returned.
-  ///
-  /// @return a pointer to the regular expression object of
-  /// variable_suppression::priv::type_name_regex_str_.
-  const sptr_utils::regex_t_sptr
-  get_type_name_regex() const
-  {
-    if (!type_name_regex_ && !type_name_regex_str_.empty())
-      {
-       sptr_utils::regex_t_sptr r = sptr_utils::build_sptr<regex_t>();
-       if (regcomp(r.get(),
-                   type_name_regex_str_.c_str(),
-                   REG_EXTENDED) == 0)
-         type_name_regex_ = r;
-      }
-    return type_name_regex_;
-  }
-};// end class variable_supppression::priv
-
 /// Constructor for the @ref variable_suppression type.
 ///
 /// @param label an informative text string that the evalution code
@@ -3430,6 +3248,20 @@ void
 variable_suppression::set_name_regex_str(const string& r)
 {priv_->name_regex_str_ = r;}
 
+/// Getter for the "name_not_regexp" property of the specification.
+///
+/// @return the value of the "name_not_regexp" property.
+const string&
+variable_suppression::get_name_not_regex_str() const
+{return priv_->name_not_regex_str_;}
+
+/// Setter for the "name_not_regexp" property of the specification.
+///
+/// @param r the new value of the "name_not_regexp" property.
+void
+variable_suppression::set_name_not_regex_str(const string& r)
+{priv_->name_not_regex_str_ = r;}
+
 /// Getter for the name of the symbol of the variable the user wants
 /// the current specification to designate.
 ///
@@ -3620,17 +3452,17 @@ variable_suppression::suppresses_variable(const var_decl* var,
   if (ctxt)
     {
       // Check if the name of the binaries match
-      if (!names_of_binaries_match(*ctxt))
+      if (!names_of_binaries_match(*this, *ctxt))
        return false;
 
       // Check if the soname of the binaries match
-      if (!sonames_of_binaries_match(*ctxt))
+      if (!sonames_of_binaries_match(*this, *ctxt))
        return false;
     }
 
   string var_name = var->get_qualified_name();
 
-    // Check for "name" property match.
+  // Check for "name" property match.
   if (!get_name().empty())
     {
       if (get_name() != var_name)
@@ -3639,7 +3471,7 @@ variable_suppression::suppresses_variable(const var_decl* var,
   else
     {
       // If the "name" property is empty, then consider checking for the
-      // "name_regex" property match
+      // "name_regex" and "name_not_regex" properties match
       if (get_name().empty())
        {
          const sptr_utils::regex_t_sptr name_regex = priv_->get_name_regex();
@@ -3647,6 +3479,13 @@ variable_suppression::suppresses_variable(const var_decl* var,
              && (regexec(name_regex.get(), var_name.c_str(),
                          0, NULL, 0) != 0))
            return false;
+
+         const sptr_utils::regex_t_sptr name_not_regex =
+           priv_->get_name_not_regex();
+         if (name_not_regex
+             && (regexec(name_not_regex.get(), var_name.c_str(),
+                         0, NULL, 0) == 0))
+           return false;
        }
     }
 
@@ -3764,11 +3603,11 @@ variable_suppression::suppresses_variable_symbol(const elf_symbol* sym,
   if (ctxt)
     {
       // Check if the name of the binaries match
-      if (!names_of_binaries_match(*ctxt))
+      if (!names_of_binaries_match(*this, *ctxt))
        return false;
 
       // Check if the soname of the binaries match
-      if (!sonames_of_binaries_match(*ctxt))
+      if (!sonames_of_binaries_match(*this, *ctxt))
        return false;
     }
 
@@ -3903,6 +3742,15 @@ read_variable_suppression(const ini::config::section& section)
   if (section.get_name() != "suppress_variable")
     return result;
 
+  ini::simple_property_sptr drop_artifact =
+    is_simple_property(section.find_property("drop_artifact"));
+  if (!drop_artifact)
+    drop_artifact = is_simple_property(section.find_property("drop"));
+
+  string drop_artifact_str = drop_artifact
+    ? drop_artifact->get_value()->as_string()
+    : "";
+
   ini::simple_property_sptr change_kind_prop =
     is_simple_property(section.find_property("change_kind"));
   string change_kind_str = change_kind_prop
@@ -3951,6 +3799,12 @@ read_variable_suppression(const ini::config::section& section)
                           ? name_regex_prop->get_value()->as_string()
                           : "");
 
+  ini::simple_property_sptr name_not_regex_prop =
+    is_simple_property(section.find_property("name_not_regexp"));
+  string name_not_regex_str = name_not_regex_prop
+    ? name_not_regex_prop->get_value()->as_string()
+    : "";
+
   ini::simple_property_sptr sym_name_prop =
     is_simple_property(section.find_property("symbol_name"));
   string symbol_name = (sym_name_prop
@@ -3990,6 +3844,7 @@ read_variable_suppression(const ini::config::section& section)
   if (label_str.empty()
       && name_str.empty()
       && name_regex_str.empty()
+      && name_not_regex_str.empty()
       && file_name_regex_str.empty()
       && file_name_not_regex_str.empty()
       && soname_regex_str.empty()
@@ -4007,6 +3862,17 @@ read_variable_suppression(const ini::config::section& section)
                                        symbol_version, symbol_version_regex_str,
                                        type_name_str, type_name_regex_str));
 
+  if ((drop_artifact_str == "yes" || drop_artifact_str == "true")
+      && (!name_str.empty()
+         || !name_regex_str.empty()
+         || !name_not_regex_str.empty()
+         || !symbol_name.empty()
+         || !symbol_name_regex_str.empty()))
+    result->set_drops_artifact_from_ir(true);
+
+  if (!name_not_regex_str.empty())
+    result->set_name_not_regex_str(name_not_regex_str);
+
   if (result && !change_kind_str.empty())
     result->set_change_kind
       (variable_suppression::parse_change_kind(change_kind_str));
index 480155b08c869246e1d4cd774b328b7b01c88634..defc72e3fffdc5f4e0ff13d307d746abdcd6736f 100644 (file)
@@ -856,6 +856,7 @@ handle_fts_entry(const FTSENT *entry,
                                             /*type_name_regexp=*/"",
                                             /*type_name=*/""));
          suppr->set_is_artificial(true);
+         suppr->set_drops_artifact_from_ir(true);
          suppr->get_source_locations_to_keep().insert(fname);
        }
     }
index b0702ee5f2733e7d941cf58016112dadcc80b06d..debc3f7e762c61dd4996afd370224feafdf1fa41 100644 (file)
@@ -526,7 +526,7 @@ static void write_decl_in_scope(const decl_base_sptr,
                                unsigned);
 static bool write_type_decl(const shared_ptr<type_decl>,
                            write_context&, unsigned);
-static bool write_namespace_decl(const shared_ptr<namespace_decl>,
+static bool write_namespace_decl(const namespace_decl_sptr&,
                                 write_context&, unsigned);
 static bool write_qualified_type_def(const shared_ptr<qualified_type_def>,
                                     write_context&, unsigned);
@@ -1498,7 +1498,7 @@ write_type_decl(const type_decl_sptr d,
 ///
 /// @return true upon successful completion, false otherwise.
 static bool
-write_namespace_decl(const shared_ptr<namespace_decl> decl,
+write_namespace_decl(const namespace_decl_sptr& decl,
                     write_context& ctxt, unsigned indent)
 {
   if (!decl || decl->is_empty_or_has_empty_sub_namespaces())
index 8a6b07fbbcb6f5de5a41ec057b63f00bb6498d39..b8fa5a3debbc5f44ea260ff7ca7b732c8750385d 100644 (file)
@@ -28,6 +28,13 @@ test-read-write/test24.xml \
 test-read-write/test25.xml \
 test-read-write/test26.xml \
 test-read-write/test27.xml \
+test-read-write/test28.xml \
+test-read-write/test28-drop-std-fns.abignore \
+test-read-write/test28-without-std-fns.xml \
+test-read-write/test28-without-std-fns-ref.xml \
+test-read-write/test28-drop-std-vars.abignore \
+test-read-write/test28-without-std-vars-ref.xml \
+test-read-write/test28-without-std-vars.xml \
 \
 test-write-read-archive/test0.xml \
 test-write-read-archive/test1.xml \
@@ -336,7 +343,11 @@ test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi \
 test-read-dwarf/libtest23.so \
 test-read-dwarf/libtest23.so.abi \
 test-read-dwarf/test23-first-tu.cc \
-test-read-dwarf/test23-first-tu.cc \
+test-read-dwarf/libtest24-drop-fns-2.so.abi \
+test-read-dwarf/libtest24-drop-fns.so \
+test-read-dwarf/libtest24-drop-fns.so.abi \
+test-read-dwarf/test24-drop-fns-0.suppr \
+test-read-dwarf/test24-drop-fns.cc \
 \
 test-types-stability/pr19434-elf0 \
 test-types-stability/pr19139-DomainNeighborMapInst.o \
@@ -952,6 +963,27 @@ test-diff-suppr/test30-pub-lib-v1.cc  \
 test-diff-suppr/test30-pub-lib-v1.so  \
 test-diff-suppr/test30-report-0.txt   \
 test-diff-suppr/test30-report-1.txt   \
+test-diff-suppr/libtest31-v0.so \
+test-diff-suppr/libtest31-v1.so \
+test-diff-suppr/libtest31.suppr \
+test-diff-suppr/test31-report-0.txt \
+test-diff-suppr/test31-report-1.txt \
+test-diff-suppr/test31-v0.cc \
+test-diff-suppr/test31-v1.cc \
+test-diff-suppr/libtest32-v0.so \
+test-diff-suppr/libtest32-v1.so \
+test-diff-suppr/libtest32-0.suppr \
+test-diff-suppr/test32-report-0.txt \
+test-diff-suppr/test32-report-1.txt \
+test-diff-suppr/test32-v0.c \
+test-diff-suppr/test32-v1.c \
+test-diff-suppr/libtest33-v0.so \
+test-diff-suppr/libtest33-v1.so \
+test-diff-suppr/test33-suppr-1.txt \
+test-diff-suppr/test33-v0.cc \
+test-diff-suppr/test33-v0.h \
+test-diff-suppr/test33-v1.cc \
+test-diff-suppr/test33-v1.h \
 \
 test-diff-dwarf-abixml/test0-pr19026-libvtkIOSQL-6.1.so.1 \
 test-diff-dwarf-abixml/test0-pr19026-libvtkIOSQL-6.1.so.1.abi \
diff --git a/tests/data/test-diff-suppr/libtest31-v0.so b/tests/data/test-diff-suppr/libtest31-v0.so
new file mode 100755 (executable)
index 0000000..565965b
Binary files /dev/null and b/tests/data/test-diff-suppr/libtest31-v0.so differ
diff --git a/tests/data/test-diff-suppr/libtest31-v1.so b/tests/data/test-diff-suppr/libtest31-v1.so
new file mode 100755 (executable)
index 0000000..22efe37
Binary files /dev/null and b/tests/data/test-diff-suppr/libtest31-v1.so differ
diff --git a/tests/data/test-diff-suppr/libtest31.suppr b/tests/data/test-diff-suppr/libtest31.suppr
new file mode 100644 (file)
index 0000000..57929ec
--- /dev/null
@@ -0,0 +1,3 @@
+[suppress_function]
+  drop = yes
+  name_regexp = hidden::.*
diff --git a/tests/data/test-diff-suppr/libtest32-0.suppr b/tests/data/test-diff-suppr/libtest32-0.suppr
new file mode 100644 (file)
index 0000000..b79bb96
--- /dev/null
@@ -0,0 +1,3 @@
+[suppress_function]
+  name_not_regexp = ^pub::.*
+  drop_artifact = true
diff --git a/tests/data/test-diff-suppr/libtest32-v0.so b/tests/data/test-diff-suppr/libtest32-v0.so
new file mode 100755 (executable)
index 0000000..4d6c84e
Binary files /dev/null and b/tests/data/test-diff-suppr/libtest32-v0.so differ
diff --git a/tests/data/test-diff-suppr/libtest32-v1.so b/tests/data/test-diff-suppr/libtest32-v1.so
new file mode 100755 (executable)
index 0000000..38f954c
Binary files /dev/null and b/tests/data/test-diff-suppr/libtest32-v1.so differ
diff --git a/tests/data/test-diff-suppr/libtest33-v0.so b/tests/data/test-diff-suppr/libtest33-v0.so
new file mode 100755 (executable)
index 0000000..fe5b0e7
Binary files /dev/null and b/tests/data/test-diff-suppr/libtest33-v0.so differ
diff --git a/tests/data/test-diff-suppr/libtest33-v1.so b/tests/data/test-diff-suppr/libtest33-v1.so
new file mode 100755 (executable)
index 0000000..d9e5d37
Binary files /dev/null and b/tests/data/test-diff-suppr/libtest33-v1.so differ
index d095a63233a4c641bf58d285df3204d76efbe3ea..439321d8b3a34d0676692142d7b57dad2e48e953 100644 (file)
@@ -1,4 +1,4 @@
 [suppress_type]
-  file_name_regexp = ^libtest24-soname-v0.so$
+  file_name_regexp = .*/libtest24-soname-v0.so$
   name = S
   reached_through = reference_or_pointer
index 86aad9fbe096f3b154801c2874724b8dfbf0ddb4..1e23370e9efe9a72d06bf93389cef6bb6116163e 100644 (file)
@@ -1,4 +1,4 @@
 [suppress_type]
-  file_name_regexp = ^libtest24-soname-v1.so$
+  file_name_regexp = .*/libtest24-soname-v1.so$
   name = S
   reached_through = reference_or_pointer
index c45efe7d47e0bd705dbc49f4343a0fd7c848dbb3..55cfbc769d23733e915a329755c8e101f28515e8 100644 (file)
@@ -1,3 +1,3 @@
 [suppress_variable]
-  file_name_not_regexp = ^libtest29-soname.*\\.so$
+  file_name_not_regexp = .*libtest29-soname.*\\.so$
 
index ab3739e84d0c82779d2bb1c92fc54ab62c538020..6c86f5b8ae914af11371c988ab18e2594c2ccfe3 100644 (file)
@@ -1,2 +1,2 @@
 [suppress_type]
-  file_name_not_regexp = ^libtest29-soname.*\\.so$
+  file_name_not_regexp = .*libtest29-soname.*\\.so$
diff --git a/tests/data/test-diff-suppr/test31-report-0.txt b/tests/data/test-diff-suppr/test31-report-0.txt
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/data/test-diff-suppr/test31-report-1.txt b/tests/data/test-diff-suppr/test31-report-1.txt
new file mode 100644 (file)
index 0000000..0d97c28
--- /dev/null
@@ -0,0 +1,13 @@
+Functions changes summary: 0 Removed, 1 Changed, 0 Added function
+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
+
+1 function with some indirect sub-type change:
+
+  [C]'function void hidden::foo(hidden::S0&)' has some indirect sub-type changes:
+    parameter 1 of type 'hidden::S0&' has sub-type changes:
+      in referenced type 'struct hidden::S0':
+        type size changed from 32 to 64 bits
+        1 data member insertion:
+          'char hidden::S0::m1', at offset 32 (in bits)
+
+
diff --git a/tests/data/test-diff-suppr/test31-v0.cc b/tests/data/test-diff-suppr/test31-v0.cc
new file mode 100644 (file)
index 0000000..4370d69
--- /dev/null
@@ -0,0 +1,35 @@
+// Compile with:
+// g++ -g -Wall -fPIC -shared -o libtest31-v0.so test31-v0.cc
+
+namespace hidden
+{
+
+struct S0
+{
+  int m0;
+
+  S0() {}
+
+  S0(int v)
+    : m0(v)
+  {}
+};
+
+void
+foo(S0& s)
+{
+  s.m0 = 2;
+}
+
+} // end namespace hidden
+
+namespace visible
+{
+void
+bar(int v)
+{
+  hidden::S0 s(v);
+  hidden::foo(s);
+}
+
+} // end namespace visible
diff --git a/tests/data/test-diff-suppr/test31-v1.cc b/tests/data/test-diff-suppr/test31-v1.cc
new file mode 100644 (file)
index 0000000..1b8ca18
--- /dev/null
@@ -0,0 +1,40 @@
+// Compile with:
+// g++ -g -Wall -fPIC -shared -o libtest31-v1.so test31-v1.cc
+
+namespace hidden
+{
+
+struct S0
+{
+  int m0;
+  char m1;
+
+  S0()
+    : m0(), m1()
+  {}
+
+  S0(int v)
+    : m0(v),
+      m1()
+  {}
+};
+
+void
+foo(S0& s)
+{
+  s.m0 = 2;
+  s.m1 = 1;
+}
+
+} // end namespace hidden
+
+namespace visible
+{
+void
+bar(int v)
+{
+  hidden::S0 s(v);
+  hidden::foo(s);
+}
+
+} // end namespace visible
diff --git a/tests/data/test-diff-suppr/test32-report-0.txt b/tests/data/test-diff-suppr/test32-report-0.txt
new file mode 100644 (file)
index 0000000..9407bb9
--- /dev/null
@@ -0,0 +1,16 @@
+Functions changes summary: 0 Removed, 2 Changed, 0 Added functions
+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
+
+2 functions with some indirect sub-type change:
+
+  [C]'function void priv::foo()' has some indirect sub-type changes:
+    return type changed:
+      type name changed from 'void' to 'int'
+      type size changed from 0 to 32 bits
+
+  [C]'function void pub::bar()' has some indirect sub-type changes:
+    return type changed:
+      type name changed from 'void' to 'char'
+      type size changed from 0 to 8 bits
+
+
diff --git a/tests/data/test-diff-suppr/test32-report-1.txt b/tests/data/test-diff-suppr/test32-report-1.txt
new file mode 100644 (file)
index 0000000..88f8c2d
--- /dev/null
@@ -0,0 +1,11 @@
+Functions changes summary: 0 Removed, 1 Changed, 0 Added function
+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
+
+1 function with some indirect sub-type change:
+
+  [C]'function void pub::bar()' has some indirect sub-type changes:
+    return type changed:
+      type name changed from 'void' to 'char'
+      type size changed from 0 to 8 bits
+
+
diff --git a/tests/data/test-diff-suppr/test32-v0.c b/tests/data/test-diff-suppr/test32-v0.c
new file mode 100644 (file)
index 0000000..3c6f685
--- /dev/null
@@ -0,0 +1,12 @@
+// Compile with:
+// g++ -g -fPIC -shared -o libtest32-v0.so test32-v0.c
+
+namespace priv
+{
+  void foo() {}
+}
+
+namespace pub
+{
+  void bar() {}
+}
diff --git a/tests/data/test-diff-suppr/test32-v1.c b/tests/data/test-diff-suppr/test32-v1.c
new file mode 100644 (file)
index 0000000..824b4f5
--- /dev/null
@@ -0,0 +1,12 @@
+// Compile with:
+// g++ -g -fPIC -shared -o libtest32-v1.so test32-v1.c
+
+namespace priv
+{
+  int foo() {return 0;}
+}
+
+namespace pub
+{
+  char bar() {return 0;}
+}
diff --git a/tests/data/test-diff-suppr/test33-suppr-1.txt b/tests/data/test-diff-suppr/test33-suppr-1.txt
new file mode 100644 (file)
index 0000000..32d4679
--- /dev/null
@@ -0,0 +1,4 @@
+[suppress_type]
+  type_kind = class
+  source_location_not_regexp = test33-v\[0-9\]*\\.h
+  drop = true
diff --git a/tests/data/test-diff-suppr/test33-v0.cc b/tests/data/test-diff-suppr/test33-v0.cc
new file mode 100644 (file)
index 0000000..cac369c
--- /dev/null
@@ -0,0 +1,34 @@
+/// to compile this:
+/// g++ -g -fPIC -shared -o libtest33-v0.so test33-v0.cc
+
+#include "test33-v0.h"
+
+class to_suppress
+{
+  int method1();
+  char method2();
+};
+
+int
+to_suppress::method1()
+{return 0;}
+
+char
+to_suppress::method2()
+{return 0;}
+
+void
+to_keep::method1()
+{}
+
+void
+to_keep::method2()
+{}
+
+void
+foo(to_suppress&)
+{}
+
+void
+bar(to_keep&)
+{}
diff --git a/tests/data/test-diff-suppr/test33-v0.h b/tests/data/test-diff-suppr/test33-v0.h
new file mode 100644 (file)
index 0000000..3785a17
--- /dev/null
@@ -0,0 +1,7 @@
+class to_keep
+{
+  void method1();
+  void method2();
+};
+
+void bar(to_keep&);
diff --git a/tests/data/test-diff-suppr/test33-v1.cc b/tests/data/test-diff-suppr/test33-v1.cc
new file mode 100644 (file)
index 0000000..5f0505f
--- /dev/null
@@ -0,0 +1,36 @@
+/// to compile this:
+/// g++ -g -fPIC -shared -o libtest33-v1.so test33-v1.cc
+
+#include "test33-v1.h"
+
+class to_suppress
+{
+  int member1;
+
+  void method1();
+  char method2();
+};
+
+void
+to_suppress::method1()
+{}
+
+char
+to_suppress::method2()
+{return 0;}
+
+void
+to_keep::method1()
+{}
+
+void
+to_keep::method2()
+{}
+
+void
+foo(to_suppress&)
+{}
+
+void
+bar(to_keep&)
+{}
diff --git a/tests/data/test-diff-suppr/test33-v1.h b/tests/data/test-diff-suppr/test33-v1.h
new file mode 100644 (file)
index 0000000..90d48e1
--- /dev/null
@@ -0,0 +1,9 @@
+class to_keep
+{
+  int member1;
+
+  void method1();
+  void method2();
+};
+
+void bar(to_keep&);
diff --git a/tests/data/test-read-dwarf/libtest24-drop-fns-2.so.abi b/tests/data/test-read-dwarf/libtest24-drop-fns-2.so.abi
new file mode 100644 (file)
index 0000000..8b7596f
--- /dev/null
@@ -0,0 +1,2079 @@
+<abi-corpus path='data/test-read-dwarf/libtest24-drop-fns.so'>
+  <elf-needed>
+    <dependency name='libgcc_s.so.1'/>
+    <dependency name='libc.so.6'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <elf-symbol name='_Z3barRKSs' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_Z3fooRKSs' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_ZNSt11char_traitsIcE6lengthEPKc' type='func-type' binding='weak-binding' is-defined='yes'/>
+    <elf-symbol name='_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_' type='func-type' binding='weak-binding' is-defined='yes'/>
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_init' type='func-type' binding='global-binding' is-defined='yes'/>
+  </elf-function-symbols>
+  <abi-instr version='1.0' address-size='64' path='test24-drop-fns.cc' language='LANG_C_plus_plus'>
+    <namespace-decl name='std'>
+
+      <class-decl name='basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-1'/>
+      <typedef-decl name='ostream' type-id='type-id-1' filepath='/usr/include/c++/5.3.1/iosfwd' line='141' column='1' id='type-id-2'/>
+      <var-decl name='cout' type-id='type-id-2' mangled-name='_ZSt4cout' visibility='default' filepath='/usr/include/c++/5.3.1/iostream' line='61' column='1'/>
+      <class-decl name='basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;' size-in-bits='64' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2510' column='1' id='type-id-3'>
+        <member-type access='private'>
+          <class-decl name='_Alloc_hider' size-in-bits='64' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2670' column='1' id='type-id-4'>
+            <base-class access='public' layout-offset-in-bits='0' type-id='type-id-5'/>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='_M_p' type-id='type-id-6' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2675' column='1'/>
+            </data-member>
+            <member-function access='public' constructor='yes'>
+              <function-decl name='_Alloc_hider' mangled-name='_ZNSs12_Alloc_hiderC4EPcRKSaIcE' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2672' column='1' visibility='default' binding='global' size-in-bits='64'>
+                <parameter type-id='type-id-7' is-artificial='yes'/>
+                <parameter type-id='type-id-6'/>
+                <parameter type-id='type-id-8'/>
+                <return type-id='type-id-9'/>
+              </function-decl>
+            </member-function>
+          </class-decl>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-11' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2519' column='1' id='type-id-10'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='allocator_type' type-id='type-id-5' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2518' column='1' id='type-id-12'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-14' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2521' column='1' id='type-id-13'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-16' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2522' column='1' id='type-id-15'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='iterator' type-id='type-id-18' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2525' column='1' id='type-id-17'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_iterator' type-id='type-id-20' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2527' column='1' id='type-id-19'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reverse_iterator' type-id='type-id-22' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2528' column='1' id='type-id-21'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reverse_iterator' type-id='type-id-24' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2529' column='1' id='type-id-23'/>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='_Rep_base' size-in-bits='192' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2546' column='1' id='type-id-25'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='_M_length' type-id='type-id-10' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2548' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='_M_capacity' type-id='type-id-10' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2549' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='_M_refcount' type-id='type-id-26' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2550' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='_Rep' size-in-bits='192' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2553' column='1' id='type-id-27'>
+            <base-class access='public' layout-offset-in-bits='0' type-id='type-id-25'/>
+            <data-member access='public' static='yes'>
+              <var-decl name='_S_max_size' type-id='type-id-28' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='494' column='1'/>
+            </data-member>
+            <data-member access='public' static='yes'>
+              <var-decl name='_S_terminal' type-id='type-id-29' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='499' column='1'/>
+            </data-member>
+            <member-function access='public' static='yes'>
+              <function-decl name='_S_empty_rep' mangled-name='_ZNSs4_Rep12_S_empty_repEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2579' column='1' visibility='default' binding='global' size-in-bits='64'>
+                <return type-id='type-id-30'/>
+              </function-decl>
+            </member-function>
+            <member-function access='public'>
+              <function-decl name='_M_is_leaked' mangled-name='_ZNKSs4_Rep12_M_is_leakedEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2589' column='1' visibility='default' binding='global' size-in-bits='64'>
+                <parameter type-id='type-id-31' is-artificial='yes'/>
+                <return type-id='type-id-32'/>
+              </function-decl>
+            </member-function>
+            <member-function access='public'>
+              <function-decl name='_M_is_shared' mangled-name='_ZNKSs4_Rep12_M_is_sharedEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2593' column='1' visibility='default' binding='global' size-in-bits='64'>
+                <parameter type-id='type-id-31' is-artificial='yes'/>
+                <return type-id='type-id-32'/>
+              </function-decl>
+            </member-function>
+            <member-function access='public'>
+              <function-decl name='_M_set_leaked' mangled-name='_ZNSs4_Rep13_M_set_leakedEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2597' column='1' visibility='default' binding='global' size-in-bits='64'>
+                <parameter type-id='type-id-33' is-artificial='yes'/>
+                <return type-id='type-id-9'/>
+              </function-decl>
+            </member-function>
+            <member-function access='public'>
+              <function-decl name='_M_set_sharable' mangled-name='_ZNSs4_Rep15_M_set_sharableEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2601' column='1' visibility='default' binding='global' size-in-bits='64'>
+                <parameter type-id='type-id-33' is-artificial='yes'/>
+                <return type-id='type-id-9'/>
+              </function-decl>
+            </member-function>
+            <member-function access='public'>
+              <function-decl name='_M_set_length_and_sharable' mangled-name='_ZNSs4_Rep26_M_set_length_and_sharableEm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2605' column='1' visibility='default' binding='global' size-in-bits='64'>
+                <parameter type-id='type-id-33' is-artificial='yes'/>
+                <parameter type-id='type-id-10'/>
+                <return type-id='type-id-9'/>
+              </function-decl>
+            </member-function>
+            <member-function access='public'>
+              <function-decl name='_M_refdata' mangled-name='_ZNSs4_Rep10_M_refdataEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2620' column='1' visibility='default' binding='global' size-in-bits='64'>
+                <parameter type-id='type-id-33' is-artificial='yes'/>
+                <return type-id='type-id-6'/>
+              </function-decl>
+            </member-function>
+            <member-function access='public'>
+              <function-decl name='_M_grab' mangled-name='_ZNSs4_Rep7_M_grabERKSaIcES2_' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2624' column='1' visibility='default' binding='global' size-in-bits='64'>
+                <parameter type-id='type-id-33' is-artificial='yes'/>
+                <parameter type-id='type-id-8'/>
+                <parameter type-id='type-id-8'/>
+                <return type-id='type-id-6'/>
+              </function-decl>
+            </member-function>
+            <member-function access='public' static='yes'>
+              <function-decl name='_S_create' mangled-name='_ZNSs4_Rep9_S_createEmmRKSaIcE' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='989' column='1' visibility='default' binding='global' size-in-bits='64'>
+                <parameter type-id='type-id-10'/>
+                <parameter type-id='type-id-10'/>
+                <parameter type-id='type-id-8'/>
+                <return type-id='type-id-33'/>
+              </function-decl>
+            </member-function>
+            <member-function access='public'>
+              <function-decl name='_M_dispose' mangled-name='_ZNSs4_Rep10_M_disposeERKSaIcE' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2635' column='1' visibility='default' binding='global' size-in-bits='64'>
+                <parameter type-id='type-id-33' is-artificial='yes'/>
+                <parameter type-id='type-id-8'/>
+                <return type-id='type-id-9'/>
+              </function-decl>
+            </member-function>
+            <member-function access='public'>
+              <function-decl name='_M_destroy' mangled-name='_ZNSs4_Rep10_M_destroyERKSaIcE' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='888' column='1' visibility='default' binding='global' size-in-bits='64'>
+                <parameter type-id='type-id-33' is-artificial='yes'/>
+                <parameter type-id='type-id-8'/>
+                <return type-id='type-id-9'/>
+              </function-decl>
+            </member-function>
+            <member-function access='public'>
+              <function-decl name='_M_refcopy' mangled-name='_ZNSs4_Rep10_M_refcopyEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2656' column='1' visibility='default' binding='global' size-in-bits='64'>
+                <parameter type-id='type-id-33' is-artificial='yes'/>
+                <return type-id='type-id-6'/>
+              </function-decl>
+            </member-function>
+            <member-function access='public'>
+              <function-decl name='_M_clone' mangled-name='_ZNSs4_Rep8_M_cloneERKSaIcEm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1067' column='1' visibility='default' binding='global' size-in-bits='64'>
+                <parameter type-id='type-id-33' is-artificial='yes'/>
+                <parameter type-id='type-id-8'/>
+                <parameter type-id='type-id-10'/>
+                <return type-id='type-id-6'/>
+              </function-decl>
+            </member-function>
+          </class-decl>
+        </member-type>
+        <data-member access='public' static='yes'>
+          <var-decl name='npos' type-id='type-id-28' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2683' column='1'/>
+        </data-member>
+        <data-member access='private' layout-offset-in-bits='0'>
+          <var-decl name='_M_dataplus' type-id='type-id-4' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2687' column='1'/>
+        </data-member>
+        <member-function access='private'>
+          <function-decl name='_M_data' mangled-name='_ZNKSs7_M_dataEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2690' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <return type-id='type-id-6'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private'>
+          <function-decl name='_M_data' mangled-name='_ZNSs7_M_dataEPc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2694' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-6'/>
+            <return type-id='type-id-6'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private'>
+          <function-decl name='_M_rep' mangled-name='_ZNKSs6_M_repEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2698' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <return type-id='type-id-33'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private'>
+          <function-decl name='_M_ibegin' mangled-name='_ZNKSs9_M_ibeginEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2704' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <return type-id='type-id-17'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private'>
+          <function-decl name='_M_iend' mangled-name='_ZNKSs7_M_iendEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2708' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <return type-id='type-id-17'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private'>
+          <function-decl name='_M_leak' mangled-name='_ZNSs7_M_leakEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2712' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private'>
+          <function-decl name='_M_check' mangled-name='_ZNKSs8_M_checkEmPKc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2719' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-36'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private'>
+          <function-decl name='_M_check_length' mangled-name='_ZNKSs15_M_check_lengthEmmPKc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2729' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-36'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private'>
+          <function-decl name='_M_limit' mangled-name='_ZNKSs8_M_limitEmm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2737' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private'>
+          <function-decl name='_M_disjunct' mangled-name='_ZNKSs11_M_disjunctEPKc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2745' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <return type-id='type-id-32'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private' static='yes'>
+          <function-decl name='_M_copy' mangled-name='_ZNSs7_M_copyEPcPKcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2754' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-6'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private' static='yes'>
+          <function-decl name='_M_move' mangled-name='_ZNSs7_M_moveEPcPKcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2763' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-6'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private' static='yes'>
+          <function-decl name='_M_assign' mangled-name='_ZNSs9_M_assignEPcmc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2772' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-6'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-37'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private' static='yes'>
+          <function-decl name='_S_copy_chars' mangled-name='_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIS_SsEES2_' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2792' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-6'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-17'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private' static='yes'>
+          <function-decl name='_S_copy_chars' mangled-name='_ZNSs13_S_copy_charsEPcN9__gnu_cxx17__normal_iteratorIPKcSsEES4_' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2796' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-6'/>
+            <parameter type-id='type-id-19'/>
+            <parameter type-id='type-id-19'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private' static='yes'>
+          <function-decl name='_S_copy_chars' mangled-name='_ZNSs13_S_copy_charsEPcS_S_' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2801' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-6'/>
+            <parameter type-id='type-id-6'/>
+            <parameter type-id='type-id-6'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private' static='yes'>
+          <function-decl name='_S_copy_chars' mangled-name='_ZNSs13_S_copy_charsEPcPKcS1_' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2805' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-6'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-36'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private' static='yes'>
+          <function-decl name='_S_compare' mangled-name='_ZNSs10_S_compareEmm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2810' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-38'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private'>
+          <function-decl name='_M_mutate' mangled-name='_ZNSs9_M_mutateEmmm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='912' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private'>
+          <function-decl name='_M_leak_hard' mangled-name='_ZNSs12_M_leak_hardEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='898' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private' static='yes'>
+          <function-decl name='_S_empty_rep' mangled-name='_ZNSs12_S_empty_repEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2829' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <return type-id='type-id-30'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='basic_string' mangled-name='_ZNSsC4Ev' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2840' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='basic_string' mangled-name='_ZNSsC4ERKSaIcE' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='621' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-8'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='basic_string' mangled-name='_ZNSsC4ERKSs' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='613' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='basic_string' mangled-name='_ZNSsC4ERKSsmm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='627' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='basic_string' mangled-name='_ZNSsC4ERKSsmmRKSaIcE' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='637' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-8'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='basic_string' mangled-name='_ZNSsC4EPKcmRKSaIcE' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='649' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-8'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='basic_string' mangled-name='_ZNSsC4EPKcRKSaIcE' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='656' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-8'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='basic_string' mangled-name='_ZNSsC4EmcRKSaIcE' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='663' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-37'/>
+            <parameter type-id='type-id-8'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' destructor='yes'>
+          <function-decl name='~basic_string' mangled-name='_ZNSsD4Ev' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2944' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-38' is-artificial='yes'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='operator=' mangled-name='_ZNSsaSERKSs' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2952' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='operator=' mangled-name='_ZNSsaSEPKc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2960' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='operator=' mangled-name='_ZNSsaSEc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2971' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-37'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='begin' mangled-name='_ZNSs5beginEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3012' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <return type-id='type-id-17'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='begin' mangled-name='_ZNKSs5beginEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3023' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <return type-id='type-id-19'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='end' mangled-name='_ZNSs3endEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3031' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <return type-id='type-id-17'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='end' mangled-name='_ZNKSs3endEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3042' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <return type-id='type-id-19'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='rbegin' mangled-name='_ZNSs6rbeginEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3051' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <return type-id='type-id-23'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='rbegin' mangled-name='_ZNKSs6rbeginEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3060' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <return type-id='type-id-21'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='rend' mangled-name='_ZNSs4rendEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3069' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <return type-id='type-id-23'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='rend' mangled-name='_ZNKSs4rendEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3078' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <return type-id='type-id-21'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='size' mangled-name='_ZNKSs4sizeEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3122' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='length' mangled-name='_ZNKSs6lengthEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3128' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='max_size' mangled-name='_ZNKSs8max_sizeEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3133' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='resize' mangled-name='_ZNSs6resizeEmc' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1083' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-37'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='resize' mangled-name='_ZNSs6resizeEm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3160' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='capacity' mangled-name='_ZNKSs8capacityEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3185' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='reserve' mangled-name='_ZNSs7reserveEm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='945' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='clear' mangled-name='_ZNSs5clearEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3213' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='empty' mangled-name='_ZNKSs5emptyEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3221' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <return type-id='type-id-32'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='operator[]' mangled-name='_ZNKSsixEm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3236' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-15'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='operator[]' mangled-name='_ZNSsixEm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3253' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-13'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='at' mangled-name='_ZNKSs2atEm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3275' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-15'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='at' mangled-name='_ZNSs2atEm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3297' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-13'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='operator+=' mangled-name='_ZNSspLERKSs' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3349' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='operator+=' mangled-name='_ZNSspLEPKc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3358' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='operator+=' mangled-name='_ZNSspLEc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3367' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-37'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='append' mangled-name='_ZNSs6appendERKSs' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='768' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='append' mangled-name='_ZNSs6appendERKSsmm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='785' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='append' mangled-name='_ZNSs6appendEPKcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='741' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='append' mangled-name='_ZNSs6appendEPKc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3423' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='append' mangled-name='_ZNSs6appendEmc' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='724' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-37'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='push_back' mangled-name='_ZNSs9push_backEc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3469' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-37'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='assign' mangled-name='_ZNSs6assignERKSs' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='686' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='assign' mangled-name='_ZNSs6assignERKSsmm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3518' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='assign' mangled-name='_ZNSs6assignEPKcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='702' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='assign' mangled-name='_ZNSs6assignEPKc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3546' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='assign' mangled-name='_ZNSs6assignEmc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3562' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-37'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='insert' mangled-name='_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEmc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3603' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-37'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='insert' mangled-name='_ZNSs6insertEmRKSs' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3651' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-39'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='insert' mangled-name='_ZNSs6insertEmRKSsmm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3673' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='insert' mangled-name='_ZNSs6insertEmPKcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='803' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='insert' mangled-name='_ZNSs6insertEmPKc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3714' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-36'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='insert' mangled-name='_ZNSs6insertEmmc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3737' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-37'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='insert' mangled-name='_ZNSs6insertEN9__gnu_cxx17__normal_iteratorIPcSsEEc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3755' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-37'/>
+            <return type-id='type-id-17'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='erase' mangled-name='_ZNSs5eraseEmm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3780' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='erase' mangled-name='_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEE' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3796' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-17'/>
+            <return type-id='type-id-17'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='erase' mangled-name='_ZNSs5eraseEN9__gnu_cxx17__normal_iteratorIPcSsEES2_' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='834' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-17'/>
+            <return type-id='type-id-17'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='replace' mangled-name='_ZNSs7replaceEmmRKSs' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3847' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-39'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='replace' mangled-name='_ZNSs7replaceEmmRKSsmm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3869' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='replace' mangled-name='_ZNSs7replaceEmmPKcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='857' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='replace' mangled-name='_ZNSs7replaceEmmPKc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3914' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-36'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='replace' mangled-name='_ZNSs7replaceEmmmc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3938' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-37'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='replace' mangled-name='_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_RKSs' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3956' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-39'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='replace' mangled-name='_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3975' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='replace' mangled-name='_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='3996' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-36'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='replace' mangled-name='_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_mc' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4017' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-37'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='replace' mangled-name='_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S1_S1_' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4054' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-6'/>
+            <parameter type-id='type-id-6'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='replace' mangled-name='_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_PKcS4_' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4064' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-36'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='replace' mangled-name='_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_S2_S2_' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4075' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-17'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='replace' mangled-name='_ZNSs7replaceEN9__gnu_cxx17__normal_iteratorIPcSsEES2_NS0_IPKcSsEES5_' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4085' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-17'/>
+            <parameter type-id='type-id-19'/>
+            <parameter type-id='type-id-19'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private'>
+          <function-decl name='_M_replace_aux' mangled-name='_ZNSs14_M_replace_auxEmmmc' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1111' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-37'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private'>
+          <function-decl name='_M_replace_safe' mangled-name='_ZNSs15_M_replace_safeEmmPKcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1124' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private' static='yes'>
+          <function-decl name='_S_construct_aux_2' mangled-name='_ZNSs18_S_construct_aux_2EmcRKSaIcE' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4156' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-37'/>
+            <parameter type-id='type-id-8'/>
+            <return type-id='type-id-6'/>
+          </function-decl>
+        </member-function>
+        <member-function access='private' static='yes'>
+          <function-decl name='_S_construct' mangled-name='_ZNSs12_S_constructEmcRKSaIcE' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='596' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-37'/>
+            <parameter type-id='type-id-8'/>
+            <return type-id='type-id-6'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='copy' mangled-name='_ZNKSs4copyEPcmm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1136' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-6'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='swap' mangled-name='_ZNSs4swapERSs' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='962' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-35' is-artificial='yes'/>
+            <parameter type-id='type-id-40'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='c_str' mangled-name='_ZNKSs5c_strEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4219' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <return type-id='type-id-36'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='data' mangled-name='_ZNKSs4dataEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4229' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <return type-id='type-id-36'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='get_allocator' mangled-name='_ZNKSs13get_allocatorEv' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4236' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <return type-id='type-id-12'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find' mangled-name='_ZNKSs4findEPKcmm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1181' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find' mangled-name='_ZNKSs4findERKSsm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4265' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find' mangled-name='_ZNKSs4findEPKcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4280' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find' mangled-name='_ZNKSs4findEcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1204' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-37'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='rfind' mangled-name='_ZNKSs5rfindERKSsm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4310' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='rfind' mangled-name='_ZNKSs5rfindEPKcmm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1222' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='rfind' mangled-name='_ZNKSs5rfindEPKcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4340' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='rfind' mangled-name='_ZNKSs5rfindEcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1243' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-37'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find_first_of' mangled-name='_ZNKSs13find_first_ofERKSsm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4371' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find_first_of' mangled-name='_ZNKSs13find_first_ofEPKcmm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1260' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find_first_of' mangled-name='_ZNKSs13find_first_ofEPKcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4401' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find_first_of' mangled-name='_ZNKSs13find_first_ofEcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4420' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-37'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find_last_of' mangled-name='_ZNKSs12find_last_ofERKSsm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4435' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find_last_of' mangled-name='_ZNKSs12find_last_ofEPKcmm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1275' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find_last_of' mangled-name='_ZNKSs12find_last_ofEPKcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4465' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find_last_of' mangled-name='_ZNKSs12find_last_ofEcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4484' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-37'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find_first_not_of' mangled-name='_ZNKSs17find_first_not_ofERKSsm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4498' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find_first_not_of' mangled-name='_ZNKSs17find_first_not_ofEPKcmm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1296' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find_first_not_of' mangled-name='_ZNKSs17find_first_not_ofEPKcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4529' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find_first_not_of' mangled-name='_ZNKSs17find_first_not_ofEcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1308' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-37'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find_last_not_of' mangled-name='_ZNKSs16find_last_not_ofERKSsm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4561' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find_last_not_of' mangled-name='_ZNKSs16find_last_not_ofEPKcmm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1319' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find_last_not_of' mangled-name='_ZNKSs16find_last_not_ofEPKcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4592' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='find_last_not_of' mangled-name='_ZNKSs16find_last_not_ofEcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1340' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-37'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-10'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='substr' mangled-name='_ZNKSs6substrEmm' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4625' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-3'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='compare' mangled-name='_ZNKSs7compareERKSs' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='4644' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <return type-id='type-id-38'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='compare' mangled-name='_ZNKSs7compareEmmRKSs' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1360' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-39'/>
+            <return type-id='type-id-38'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='compare' mangled-name='_ZNKSs7compareEmmRKSsmm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1375' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-38'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='compare' mangled-name='_ZNKSs7compareEPKc' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1393' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <return type-id='type-id-38'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='compare' mangled-name='_ZNKSs7compareEmmPKc' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1408' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-36'/>
+            <return type-id='type-id-38'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='compare' mangled-name='_ZNKSs7compareEmmPKcm' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1424' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-10'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-10'/>
+            <return type-id='type-id-38'/>
+          </function-decl>
+        </member-function>
+      </class-decl>
+      <class-decl name='allocator&lt;char&gt;' size-in-bits='8' visibility='default' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='92' column='1' id='type-id-5'>
+        <base-class access='public' layout-offset-in-bits='0' type-id='type-id-41'/>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-42' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='95' column='1' id='type-id-11'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-43' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='99' column='1' id='type-id-14'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-44' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='100' column='1' id='type-id-16'/>
+        </member-type>
+        <member-function access='public'>
+          <function-decl name='allocator' mangled-name='_ZNSaIcEC4Ev' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='113' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-45' is-artificial='yes'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='allocator' mangled-name='_ZNSaIcEC4ERKS_' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='115' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-45' is-artificial='yes'/>
+            <parameter type-id='type-id-8'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' destructor='yes'>
+          <function-decl name='~allocator' mangled-name='_ZNSaIcED4Ev' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='121' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-45' is-artificial='yes'/>
+            <parameter type-id='type-id-38' is-artificial='yes'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+      </class-decl>
+      <typedef-decl name='size_t' type-id='type-id-46' filepath='/usr/include/c++/5.3.1/x86_64-redhat-linux/bits/c++config.h' line='1969' column='1' id='type-id-42'/>
+      <class-decl name='reverse_iterator&lt;__gnu_cxx::__normal_iterator&lt;char const*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-22'/>
+      <class-decl name='reverse_iterator&lt;__gnu_cxx::__normal_iterator&lt;char*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-24'/>
+      <function-decl name='operator+&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;' mangled-name='_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='1151' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_'>
+        <parameter type-id='type-id-36'/>
+        <parameter type-id='type-id-39'/>
+        <return type-id='type-id-3'/>
+      </function-decl>
+      <class-decl name='char_traits&lt;char&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='233' column='1' id='type-id-47'>
+        <member-type access='public'>
+          <typedef-decl name='char_type' type-id='type-id-37' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='235' column='1' id='type-id-48'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='int_type' type-id='type-id-38' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='236' column='1' id='type-id-49'/>
+        </member-type>
+        <member-function access='public' static='yes'>
+          <function-decl name='assign' mangled-name='_ZNSt11char_traitsIcE6assignERcRKc' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='242' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-50'/>
+            <parameter type-id='type-id-51'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' static='yes'>
+          <function-decl name='eq' mangled-name='_ZNSt11char_traitsIcE2eqERKcS2_' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='246' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-51'/>
+            <parameter type-id='type-id-51'/>
+            <return type-id='type-id-32'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' static='yes'>
+          <function-decl name='lt' mangled-name='_ZNSt11char_traitsIcE2ltERKcS2_' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='250' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-51'/>
+            <parameter type-id='type-id-51'/>
+            <return type-id='type-id-32'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' static='yes'>
+          <function-decl name='compare' mangled-name='_ZNSt11char_traitsIcE7compareEPKcS2_m' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='258' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-52'/>
+            <parameter type-id='type-id-52'/>
+            <parameter type-id='type-id-42'/>
+            <return type-id='type-id-38'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' static='yes'>
+          <function-decl name='length' mangled-name='_ZNSt11char_traitsIcE6lengthEPKc' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='266' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNSt11char_traitsIcE6lengthEPKc'>
+            <parameter type-id='type-id-52'/>
+            <return type-id='type-id-42'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' static='yes'>
+          <function-decl name='find' mangled-name='_ZNSt11char_traitsIcE4findEPKcmRS1_' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='270' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-52'/>
+            <parameter type-id='type-id-42'/>
+            <parameter type-id='type-id-51'/>
+            <return type-id='type-id-52'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' static='yes'>
+          <function-decl name='move' mangled-name='_ZNSt11char_traitsIcE4moveEPcPKcm' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='278' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-53'/>
+            <parameter type-id='type-id-52'/>
+            <parameter type-id='type-id-42'/>
+            <return type-id='type-id-53'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' static='yes'>
+          <function-decl name='copy' mangled-name='_ZNSt11char_traitsIcE4copyEPcPKcm' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='286' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-53'/>
+            <parameter type-id='type-id-52'/>
+            <parameter type-id='type-id-42'/>
+            <return type-id='type-id-53'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' static='yes'>
+          <function-decl name='assign' mangled-name='_ZNSt11char_traitsIcE6assignEPcmc' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='294' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-53'/>
+            <parameter type-id='type-id-42'/>
+            <parameter type-id='type-id-48'/>
+            <return type-id='type-id-53'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' static='yes'>
+          <function-decl name='to_char_type' mangled-name='_ZNSt11char_traitsIcE12to_char_typeERKi' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='302' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-54'/>
+            <return type-id='type-id-48'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' static='yes'>
+          <function-decl name='to_int_type' mangled-name='_ZNSt11char_traitsIcE11to_int_typeERKc' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='308' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-51'/>
+            <return type-id='type-id-49'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' static='yes'>
+          <function-decl name='eq_int_type' mangled-name='_ZNSt11char_traitsIcE11eq_int_typeERKiS2_' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='312' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-54'/>
+            <parameter type-id='type-id-54'/>
+            <return type-id='type-id-32'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' static='yes'>
+          <function-decl name='eof' mangled-name='_ZNSt11char_traitsIcE3eofEv' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='316' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <return type-id='type-id-49'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' static='yes'>
+          <function-decl name='not_eof' mangled-name='_ZNSt11char_traitsIcE7not_eofERKi' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='320' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-54'/>
+            <return type-id='type-id-49'/>
+          </function-decl>
+        </member-function>
+      </class-decl>
+      <typedef-decl name='string' type-id='type-id-3' filepath='/usr/include/c++/5.3.1/bits/stringfwd.h' line='74' column='1' id='type-id-55'/>
+    </namespace-decl>
+    <namespace-decl name='__gnu_cxx'>
+
+      <class-decl name='new_allocator&lt;char&gt;' size-in-bits='8' visibility='default' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='58' column='1' id='type-id-41'>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-42' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='61' column='1' id='type-id-56'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='pointer' type-id='type-id-6' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='63' column='1' id='type-id-57'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_pointer' type-id='type-id-36' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='64' column='1' id='type-id-58'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-43' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='65' column='1' id='type-id-59'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-44' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='66' column='1' id='type-id-60'/>
+        </member-type>
+        <member-function access='public'>
+          <function-decl name='new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcEC4Ev' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='79' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-61' is-artificial='yes'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcEC4ERKS1_' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-61' is-artificial='yes'/>
+            <parameter type-id='type-id-62'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' destructor='yes'>
+          <function-decl name='~new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcED4Ev' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-61' is-artificial='yes'/>
+            <parameter type-id='type-id-38' is-artificial='yes'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='address' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE7addressERc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='89' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-63' is-artificial='yes'/>
+            <parameter type-id='type-id-59'/>
+            <return type-id='type-id-57'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='address' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE7addressERKc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='93' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-63' is-artificial='yes'/>
+            <parameter type-id='type-id-60'/>
+            <return type-id='type-id-58'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='allocate' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='99' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-61' is-artificial='yes'/>
+            <parameter type-id='type-id-56'/>
+            <parameter type-id='type-id-64'/>
+            <return type-id='type-id-57'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='deallocate' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE10deallocateEPcm' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='109' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-61' is-artificial='yes'/>
+            <parameter type-id='type-id-57'/>
+            <parameter type-id='type-id-56'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='max_size' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE8max_sizeEv' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='113' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-63' is-artificial='yes'/>
+            <return type-id='type-id-56'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='construct' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE9constructEPcRKc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='129' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-61' is-artificial='yes'/>
+            <parameter type-id='type-id-57'/>
+            <parameter type-id='type-id-44'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='destroy' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE7destroyEPc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-61' is-artificial='yes'/>
+            <parameter type-id='type-id-57'/>
+            <return type-id='type-id-9'/>
+          </function-decl>
+        </member-function>
+      </class-decl>
+      <class-decl name='__normal_iterator&lt;char*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-18'/>
+      <class-decl name='__normal_iterator&lt;char const*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-20'/>
+      <class-decl name='__numeric_traits_integer&lt;int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-65'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-66' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIiE5__minE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-66' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIiE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-67' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-66' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;long unsigned int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-68'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-69' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-69' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-67' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-66' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerImE8__digitsE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;char&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-70'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-29' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-29' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIcE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-67' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-66' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;short int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-71'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-72' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIsE5__minE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-72' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIsE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-67' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-66' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;long int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-73'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-74' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIlE5__minE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-74' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIlE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-67' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-66' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+    </namespace-decl>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-46'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-37'/>
+    <pointer-type-def type-id='type-id-37' size-in-bits='64' id='type-id-6'/>
+    <qualified-type-def type-id='type-id-37' const='yes' id='type-id-29'/>
+    <pointer-type-def type-id='type-id-29' size-in-bits='64' id='type-id-36'/>
+    <reference-type-def kind='lvalue' type-id='type-id-37' size-in-bits='64' id='type-id-43'/>
+    <reference-type-def kind='lvalue' type-id='type-id-29' size-in-bits='64' id='type-id-44'/>
+    <type-decl name='void' id='type-id-9'/>
+    <pointer-type-def type-id='type-id-41' size-in-bits='64' id='type-id-61'/>
+    <qualified-type-def type-id='type-id-41' const='yes' id='type-id-75'/>
+    <reference-type-def kind='lvalue' type-id='type-id-75' size-in-bits='64' id='type-id-62'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-38'/>
+    <pointer-type-def type-id='type-id-75' size-in-bits='64' id='type-id-63'/>
+    <pointer-type-def type-id='type-id-9' size-in-bits='64' id='type-id-64'/>
+    <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-45'/>
+    <qualified-type-def type-id='type-id-5' const='yes' id='type-id-76'/>
+    <reference-type-def kind='lvalue' type-id='type-id-76' size-in-bits='64' id='type-id-8'/>
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-7'/>
+    <qualified-type-def type-id='type-id-10' const='yes' id='type-id-28'/>
+    <typedef-decl name='_Atomic_word' type-id='type-id-38' filepath='/usr/include/c++/5.3.1/x86_64-redhat-linux/bits/atomic_word.h' line='32' column='1' id='type-id-26'/>
+    <reference-type-def kind='lvalue' type-id='type-id-27' size-in-bits='64' id='type-id-30'/>
+    <type-decl name='bool' size-in-bits='8' id='type-id-32'/>
+    <qualified-type-def type-id='type-id-27' const='yes' id='type-id-77'/>
+    <pointer-type-def type-id='type-id-77' size-in-bits='64' id='type-id-31'/>
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-33'/>
+    <qualified-type-def type-id='type-id-3' const='yes' id='type-id-78'/>
+    <pointer-type-def type-id='type-id-78' size-in-bits='64' id='type-id-34'/>
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-35'/>
+    <reference-type-def kind='lvalue' type-id='type-id-78' size-in-bits='64' id='type-id-39'/>
+    <reference-type-def kind='lvalue' type-id='type-id-3' size-in-bits='64' id='type-id-40'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-79'/>
+    <typedef-decl name='wint_t' type-id='type-id-79' filepath='/usr/lib/gcc/x86_64-redhat-linux/5.3.1/include/stddef.h' line='357' column='1' id='type-id-80'/>
+    <function-decl name='btowc' filepath='/usr/include/wchar.h' line='353' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-38'/>
+      <return type-id='type-id-80'/>
+    </function-decl>
+    <class-decl name='_IO_FILE' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-81'/>
+    <typedef-decl name='__FILE' type-id='type-id-81' filepath='/usr/include/stdio.h' line='64' column='1' id='type-id-82'/>
+    <pointer-type-def type-id='type-id-82' size-in-bits='64' id='type-id-83'/>
+    <function-decl name='fgetwc' filepath='/usr/include/wchar.h' line='745' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-83'/>
+      <return type-id='type-id-80'/>
+    </function-decl>
+    <type-decl name='wchar_t' size-in-bits='32' id='type-id-84'/>
+    <pointer-type-def type-id='type-id-84' size-in-bits='64' id='type-id-85'/>
+    <function-decl name='fgetws' filepath='/usr/include/wchar.h' line='774' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-38'/>
+      <parameter type-id='type-id-83'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='fputwc' filepath='/usr/include/wchar.h' line='759' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-83'/>
+      <return type-id='type-id-80'/>
+    </function-decl>
+    <qualified-type-def type-id='type-id-84' const='yes' id='type-id-86'/>
+    <pointer-type-def type-id='type-id-86' size-in-bits='64' id='type-id-87'/>
+    <function-decl name='fputws' filepath='/usr/include/wchar.h' line='781' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-83'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <function-decl name='fwide' filepath='/usr/include/wchar.h' line='587' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-83'/>
+      <parameter type-id='type-id-38'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <function-decl name='fwprintf' filepath='/usr/include/wchar.h' line='594' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-83'/>
+      <parameter type-id='type-id-87'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <function-decl name='fwscanf' filepath='/usr/include/wchar.h' line='635' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-83'/>
+      <parameter type-id='type-id-87'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <function-decl name='getwc' filepath='/usr/include/wchar.h' line='746' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-83'/>
+      <return type-id='type-id-80'/>
+    </function-decl>
+    <function-decl name='getwchar' filepath='/usr/include/wchar.h' line='752' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <return type-id='type-id-80'/>
+    </function-decl>
+    <typedef-decl name='size_t' type-id='type-id-46' filepath='/usr/lib/gcc/x86_64-redhat-linux/5.3.1/include/stddef.h' line='216' column='1' id='type-id-88'/>
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/wchar.h' line='83' column='1' id='type-id-89'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='__count' type-id='type-id-38' visibility='default' filepath='/usr/include/wchar.h' line='84' column='1'/>
+      </data-member>
+    </class-decl>
+    <typedef-decl name='__mbstate_t' type-id='type-id-89' filepath='/usr/include/wchar.h' line='94' column='1' id='type-id-90'/>
+    <typedef-decl name='mbstate_t' type-id='type-id-90' filepath='/usr/include/wchar.h' line='106' column='1' id='type-id-91'/>
+    <pointer-type-def type-id='type-id-91' size-in-bits='64' id='type-id-92'/>
+    <function-decl name='mbrlen' filepath='/usr/include/wchar.h' line='376' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-36'/>
+      <parameter type-id='type-id-88'/>
+      <parameter type-id='type-id-92'/>
+      <return type-id='type-id-88'/>
+    </function-decl>
+    <function-decl name='mbrtowc' filepath='/usr/include/wchar.h' line='365' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-36'/>
+      <parameter type-id='type-id-88'/>
+      <parameter type-id='type-id-92'/>
+      <return type-id='type-id-88'/>
+    </function-decl>
+    <qualified-type-def type-id='type-id-91' const='yes' id='type-id-93'/>
+    <pointer-type-def type-id='type-id-93' size-in-bits='64' id='type-id-94'/>
+    <function-decl name='mbsinit' filepath='/usr/include/wchar.h' line='361' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-36' size-in-bits='64' id='type-id-95'/>
+    <function-decl name='mbsrtowcs' filepath='/usr/include/wchar.h' line='408' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-95'/>
+      <parameter type-id='type-id-88'/>
+      <parameter type-id='type-id-92'/>
+      <return type-id='type-id-88'/>
+    </function-decl>
+    <function-decl name='putwc' filepath='/usr/include/wchar.h' line='760' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-83'/>
+      <return type-id='type-id-80'/>
+    </function-decl>
+    <function-decl name='putwchar' filepath='/usr/include/wchar.h' line='766' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-80'/>
+    </function-decl>
+    <function-decl name='swprintf' filepath='/usr/include/wchar.h' line='604' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-88'/>
+      <parameter type-id='type-id-87'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <function-decl name='swscanf' filepath='/usr/include/wchar.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-87'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <function-decl name='ungetwc' filepath='/usr/include/wchar.h' line='789' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-83'/>
+      <return type-id='type-id-80'/>
+    </function-decl>
+    <class-decl name='typedef __va_list_tag __va_list_tag' size-in-bits='192' is-struct='yes' visibility='default' id='type-id-96'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='gp_offset' type-id='type-id-79' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <var-decl name='fp_offset' type-id='type-id-79' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='overflow_arg_area' type-id='type-id-64' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='reg_save_area' type-id='type-id-64' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <pointer-type-def type-id='type-id-96' size-in-bits='64' id='type-id-97'/>
+    <function-decl name='vfwprintf' filepath='/usr/include/wchar.h' line='612' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-83'/>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-97'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <function-decl name='vfwscanf' filepath='/usr/include/wchar.h' line='689' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-83'/>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-97'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <function-decl name='vswprintf' filepath='/usr/include/wchar.h' line='625' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-88'/>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-97'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <function-decl name='vswscanf' filepath='/usr/include/wchar.h' line='701' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-97'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <function-decl name='vwprintf' filepath='/usr/include/wchar.h' line='620' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-97'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <function-decl name='vwscanf' filepath='/usr/include/wchar.h' line='697' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-97'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <function-decl name='wcrtomb' filepath='/usr/include/wchar.h' line='370' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-6'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-92'/>
+      <return type-id='type-id-88'/>
+    </function-decl>
+    <function-decl name='wcscat' filepath='/usr/include/wchar.h' line='155' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-87'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcscmp' filepath='/usr/include/wchar.h' line='163' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-87'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <function-decl name='wcscoll' filepath='/usr/include/wchar.h' line='192' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-87'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <function-decl name='wcscpy' filepath='/usr/include/wchar.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-87'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcscspn' filepath='/usr/include/wchar.h' line='252' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-87'/>
+      <return type-id='type-id-88'/>
+    </function-decl>
+    <class-decl name='tm' size-in-bits='448' is-struct='yes' visibility='default' filepath='/usr/include/time.h' line='133' column='1' id='type-id-98'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='tm_sec' type-id='type-id-38' visibility='default' filepath='/usr/include/time.h' line='135' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <var-decl name='tm_min' type-id='type-id-38' visibility='default' filepath='/usr/include/time.h' line='136' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='tm_hour' type-id='type-id-38' visibility='default' filepath='/usr/include/time.h' line='137' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <var-decl name='tm_mday' type-id='type-id-38' visibility='default' filepath='/usr/include/time.h' line='138' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='tm_mon' type-id='type-id-38' visibility='default' filepath='/usr/include/time.h' line='139' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <var-decl name='tm_year' type-id='type-id-38' visibility='default' filepath='/usr/include/time.h' line='140' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <var-decl name='tm_wday' type-id='type-id-38' visibility='default' filepath='/usr/include/time.h' line='141' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='224'>
+        <var-decl name='tm_yday' type-id='type-id-38' visibility='default' filepath='/usr/include/time.h' line='142' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <var-decl name='tm_isdst' type-id='type-id-38' visibility='default' filepath='/usr/include/time.h' line='143' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <var-decl name='tm_gmtoff' type-id='type-id-99' visibility='default' filepath='/usr/include/time.h' line='146' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <var-decl name='tm_zone' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='147' column='1'/>
+      </data-member>
+    </class-decl>
+    <type-decl name='long int' size-in-bits='64' id='type-id-99'/>
+    <qualified-type-def type-id='type-id-98' const='yes' id='type-id-100'/>
+    <pointer-type-def type-id='type-id-100' size-in-bits='64' id='type-id-101'/>
+    <function-decl name='wcsftime' filepath='/usr/include/wchar.h' line='855' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-88'/>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-101'/>
+      <return type-id='type-id-88'/>
+    </function-decl>
+    <function-decl name='wcslen' filepath='/usr/include/wchar.h' line='287' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <return type-id='type-id-88'/>
+    </function-decl>
+    <function-decl name='wcsncat' filepath='/usr/include/wchar.h' line='158' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-88'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcsncmp' filepath='/usr/include/wchar.h' line='166' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-88'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <function-decl name='wcsncpy' filepath='/usr/include/wchar.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-88'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-87' size-in-bits='64' id='type-id-102'/>
+    <function-decl name='wcsrtombs' filepath='/usr/include/wchar.h' line='414' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-6'/>
+      <parameter type-id='type-id-102'/>
+      <parameter type-id='type-id-88'/>
+      <parameter type-id='type-id-92'/>
+      <return type-id='type-id-88'/>
+    </function-decl>
+    <function-decl name='wcsspn' filepath='/usr/include/wchar.h' line='256' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-87'/>
+      <return type-id='type-id-88'/>
+    </function-decl>
+    <type-decl name='double' size-in-bits='64' id='type-id-103'/>
+    <pointer-type-def type-id='type-id-85' size-in-bits='64' id='type-id-104'/>
+    <function-decl name='wcstod' filepath='/usr/include/wchar.h' line='450' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-104'/>
+      <return type-id='type-id-103'/>
+    </function-decl>
+    <type-decl name='float' size-in-bits='32' id='type-id-105'/>
+    <function-decl name='wcstof' filepath='/usr/include/wchar.h' line='457' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-104'/>
+      <return type-id='type-id-105'/>
+    </function-decl>
+    <function-decl name='wcstok' filepath='/usr/include/wchar.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-104'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcstol' filepath='/usr/include/wchar.h' line='468' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-104'/>
+      <parameter type-id='type-id-38'/>
+      <return type-id='type-id-99'/>
+    </function-decl>
+    <function-decl name='wcstoul' filepath='/usr/include/wchar.h' line='473' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-104'/>
+      <parameter type-id='type-id-38'/>
+      <return type-id='type-id-46'/>
+    </function-decl>
+    <function-decl name='wcsxfrm' filepath='/usr/include/wchar.h' line='196' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-88'/>
+      <return type-id='type-id-88'/>
+    </function-decl>
+    <function-decl name='wctob' filepath='/usr/include/wchar.h' line='357' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <function-decl name='wmemcmp' filepath='/usr/include/wchar.h' line='325' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-88'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <function-decl name='wmemcpy' filepath='/usr/include/wchar.h' line='329' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-88'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wmemmove' filepath='/usr/include/wchar.h' line='334' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-88'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wmemset' filepath='/usr/include/wchar.h' line='338' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-88'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wprintf' filepath='/usr/include/wchar.h' line='601' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <function-decl name='wscanf' filepath='/usr/include/wchar.h' line='642' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <function-decl name='wcschr' mangled-name='wcschr' filepath='/usr/include/wchar.h' line='224' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-87'/>
+    </function-decl>
+    <function-decl name='wcspbrk' mangled-name='wcspbrk' filepath='/usr/include/wchar.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-87'/>
+      <return type-id='type-id-87'/>
+    </function-decl>
+    <function-decl name='wcsrchr' mangled-name='wcsrchr' filepath='/usr/include/wchar.h' line='234' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-87'/>
+    </function-decl>
+    <function-decl name='wcsstr' mangled-name='wcsstr' filepath='/usr/include/wchar.h' line='273' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-87'/>
+      <return type-id='type-id-87'/>
+    </function-decl>
+    <function-decl name='wmemchr' mangled-name='wmemchr' filepath='/usr/include/wchar.h' line='316' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-88'/>
+      <return type-id='type-id-87'/>
+    </function-decl>
+    <type-decl name='long double' size-in-bits='128' id='type-id-106'/>
+    <function-decl name='wcstold' filepath='/usr/include/wchar.h' line='459' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-104'/>
+      <return type-id='type-id-106'/>
+    </function-decl>
+    <type-decl name='long long int' size-in-bits='64' id='type-id-107'/>
+    <function-decl name='wcstoll' filepath='/usr/include/wchar.h' line='483' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-104'/>
+      <parameter type-id='type-id-38'/>
+      <return type-id='type-id-107'/>
+    </function-decl>
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-108'/>
+    <function-decl name='wcstoull' filepath='/usr/include/wchar.h' line='490' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-87'/>
+      <parameter type-id='type-id-104'/>
+      <parameter type-id='type-id-38'/>
+      <return type-id='type-id-108'/>
+    </function-decl>
+
+    <function-decl name='setlocale' filepath='/usr/include/locale.h' line='124' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-38'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <class-decl name='lconv' size-in-bits='768' is-struct='yes' visibility='default' filepath='/usr/include/locale.h' line='53' column='1' id='type-id-109'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='decimal_point' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='thousands_sep' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='grouping' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <var-decl name='int_curr_symbol' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <var-decl name='currency_symbol' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='71' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <var-decl name='mon_decimal_point' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <var-decl name='mon_thousands_sep' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <var-decl name='mon_grouping' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <var-decl name='positive_sign' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <var-decl name='negative_sign' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='76' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <var-decl name='int_frac_digits' type-id='type-id-37' visibility='default' filepath='/usr/include/locale.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='648'>
+        <var-decl name='frac_digits' type-id='type-id-37' visibility='default' filepath='/usr/include/locale.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='656'>
+        <var-decl name='p_cs_precedes' type-id='type-id-37' visibility='default' filepath='/usr/include/locale.h' line='80' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='664'>
+        <var-decl name='p_sep_by_space' type-id='type-id-37' visibility='default' filepath='/usr/include/locale.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='672'>
+        <var-decl name='n_cs_precedes' type-id='type-id-37' visibility='default' filepath='/usr/include/locale.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='680'>
+        <var-decl name='n_sep_by_space' type-id='type-id-37' visibility='default' filepath='/usr/include/locale.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='688'>
+        <var-decl name='p_sign_posn' type-id='type-id-37' visibility='default' filepath='/usr/include/locale.h' line='93' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='696'>
+        <var-decl name='n_sign_posn' type-id='type-id-37' visibility='default' filepath='/usr/include/locale.h' line='94' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <var-decl name='int_p_cs_precedes' type-id='type-id-37' visibility='default' filepath='/usr/include/locale.h' line='97' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='712'>
+        <var-decl name='int_p_sep_by_space' type-id='type-id-37' visibility='default' filepath='/usr/include/locale.h' line='99' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='720'>
+        <var-decl name='int_n_cs_precedes' type-id='type-id-37' visibility='default' filepath='/usr/include/locale.h' line='101' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='728'>
+        <var-decl name='int_n_sep_by_space' type-id='type-id-37' visibility='default' filepath='/usr/include/locale.h' line='103' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='736'>
+        <var-decl name='int_p_sign_posn' type-id='type-id-37' visibility='default' filepath='/usr/include/locale.h' line='110' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='744'>
+        <var-decl name='int_n_sign_posn' type-id='type-id-37' visibility='default' filepath='/usr/include/locale.h' line='111' column='1'/>
+      </data-member>
+    </class-decl>
+    <pointer-type-def type-id='type-id-109' size-in-bits='64' id='type-id-110'/>
+    <function-decl name='localeconv' filepath='/usr/include/locale.h' line='127' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <return type-id='type-id-110'/>
+    </function-decl>
+    <typedef-decl name='wctype_t' type-id='type-id-46' filepath='/usr/include/wctype.h' line='52' column='1' id='type-id-111'/>
+    <function-decl name='iswctype' filepath='/usr/include/wctype.h' line='175' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-111'/>
+      <return type-id='type-id-38'/>
+    </function-decl>
+    <typedef-decl name='__int32_t' type-id='type-id-38' filepath='/usr/include/bits/types.h' line='40' column='1' id='type-id-112'/>
+    <qualified-type-def type-id='type-id-112' const='yes' id='type-id-113'/>
+    <pointer-type-def type-id='type-id-113' size-in-bits='64' id='type-id-114'/>
+    <typedef-decl name='wctrans_t' type-id='type-id-114' filepath='/usr/include/wctype.h' line='186' column='1' id='type-id-115'/>
+    <function-decl name='towctrans' filepath='/usr/include/wctype.h' line='221' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-115'/>
+      <return type-id='type-id-80'/>
+    </function-decl>
+    <function-decl name='wctrans' filepath='/usr/include/wctype.h' line='218' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-115'/>
+    </function-decl>
+    <function-decl name='wctype' filepath='/usr/include/wctype.h' line='171' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-111'/>
+    </function-decl>
+    <reference-type-def kind='lvalue' type-id='type-id-48' size-in-bits='64' id='type-id-50'/>
+    <qualified-type-def type-id='type-id-48' const='yes' id='type-id-116'/>
+    <reference-type-def kind='lvalue' type-id='type-id-116' size-in-bits='64' id='type-id-51'/>
+    <pointer-type-def type-id='type-id-116' size-in-bits='64' id='type-id-52'/>
+    <pointer-type-def type-id='type-id-48' size-in-bits='64' id='type-id-53'/>
+    <qualified-type-def type-id='type-id-49' const='yes' id='type-id-117'/>
+    <reference-type-def kind='lvalue' type-id='type-id-117' size-in-bits='64' id='type-id-54'/>
+    <qualified-type-def type-id='type-id-55' const='yes' id='type-id-118'/>
+    <reference-type-def kind='lvalue' type-id='type-id-118' size-in-bits='64' id='type-id-119'/>
+    <qualified-type-def type-id='type-id-119' id='type-id-120'/>
+    <function-decl name='foo' mangled-name='_Z3fooRKSs' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='14' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Z3fooRKSs'>
+      <parameter type-id='type-id-120' name='s' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='14' column='1'/>
+      <return type-id='type-id-55'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-2' size-in-bits='64' id='type-id-121'/>
+    <function-decl name='bar' mangled-name='_Z3barRKSs' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Z3barRKSs'>
+      <parameter type-id='type-id-120' name='str' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='21' column='1'/>
+      <return type-id='type-id-121'/>
+    </function-decl>
+    <var-decl name='__dso_handle' type-id='type-id-64' visibility='default'/>
+    <qualified-type-def type-id='type-id-38' const='yes' id='type-id-66'/>
+    <qualified-type-def type-id='type-id-32' const='yes' id='type-id-67'/>
+    <qualified-type-def type-id='type-id-46' const='yes' id='type-id-69'/>
+    <type-decl name='short int' size-in-bits='16' id='type-id-122'/>
+    <qualified-type-def type-id='type-id-122' const='yes' id='type-id-72'/>
+    <qualified-type-def type-id='type-id-99' const='yes' id='type-id-74'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-dwarf/libtest24-drop-fns.so b/tests/data/test-read-dwarf/libtest24-drop-fns.so
new file mode 100755 (executable)
index 0000000..ad2d450
Binary files /dev/null and b/tests/data/test-read-dwarf/libtest24-drop-fns.so differ
diff --git a/tests/data/test-read-dwarf/libtest24-drop-fns.so.abi b/tests/data/test-read-dwarf/libtest24-drop-fns.so.abi
new file mode 100644 (file)
index 0000000..60dc4ed
--- /dev/null
@@ -0,0 +1,821 @@
+<abi-corpus path='data/test-read-dwarf/libtest24-drop-fns.so'>
+  <elf-needed>
+    <dependency name='libgcc_s.so.1'/>
+    <dependency name='libc.so.6'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <elf-symbol name='_Z3barRKSs' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_Z3fooRKSs' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_ZNSt11char_traitsIcE6lengthEPKc' type='func-type' binding='weak-binding' is-defined='yes'/>
+    <elf-symbol name='_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_' type='func-type' binding='weak-binding' is-defined='yes'/>
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_init' type='func-type' binding='global-binding' is-defined='yes'/>
+  </elf-function-symbols>
+  <abi-instr version='1.0' address-size='64' path='test24-drop-fns.cc' language='LANG_C_plus_plus'>
+    <namespace-decl name='std'>
+
+      <class-decl name='basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-1'/>
+      <typedef-decl name='ostream' type-id='type-id-1' filepath='/usr/include/c++/5.3.1/iosfwd' line='141' column='1' id='type-id-2'/>
+      <var-decl name='cout' type-id='type-id-2' mangled-name='_ZSt4cout' visibility='default' filepath='/usr/include/c++/5.3.1/iostream' line='61' column='1'/>
+      <class-decl name='char_traits&lt;char&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='233' column='1' id='type-id-3'>
+        <member-type access='public'>
+          <typedef-decl name='char_type' type-id='type-id-5' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='235' column='1' id='type-id-4'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='int_type' type-id='type-id-7' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='236' column='1' id='type-id-6'/>
+        </member-type>
+      </class-decl>
+      <class-decl name='basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;' size-in-bits='64' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2510' column='1' id='type-id-8'>
+        <member-type access='private'>
+          <class-decl name='_Alloc_hider' size-in-bits='64' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2670' column='1' id='type-id-9'>
+            <base-class access='public' layout-offset-in-bits='0' type-id='type-id-10'/>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='_M_p' type-id='type-id-11' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2675' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-13' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2519' column='1' id='type-id-12'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='allocator_type' type-id='type-id-10' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2518' column='1' id='type-id-14'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-16' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2521' column='1' id='type-id-15'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-18' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2522' column='1' id='type-id-17'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='iterator' type-id='type-id-20' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2525' column='1' id='type-id-19'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_iterator' type-id='type-id-22' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2527' column='1' id='type-id-21'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reverse_iterator' type-id='type-id-24' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2528' column='1' id='type-id-23'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reverse_iterator' type-id='type-id-26' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2529' column='1' id='type-id-25'/>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='_Rep_base' size-in-bits='192' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2546' column='1' id='type-id-27'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='_M_length' type-id='type-id-12' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2548' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='_M_capacity' type-id='type-id-12' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2549' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='_M_refcount' type-id='type-id-28' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2550' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='_Rep' size-in-bits='192' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2553' column='1' id='type-id-29'>
+            <base-class access='public' layout-offset-in-bits='0' type-id='type-id-27'/>
+            <data-member access='public' static='yes'>
+              <var-decl name='_S_max_size' type-id='type-id-30' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='494' column='1'/>
+            </data-member>
+            <data-member access='public' static='yes'>
+              <var-decl name='_S_terminal' type-id='type-id-31' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='499' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <data-member access='public' static='yes'>
+          <var-decl name='npos' type-id='type-id-30' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2683' column='1'/>
+        </data-member>
+        <data-member access='private' layout-offset-in-bits='0'>
+          <var-decl name='_M_dataplus' type-id='type-id-9' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2687' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='allocator&lt;char&gt;' size-in-bits='8' visibility='default' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='92' column='1' id='type-id-10'>
+        <base-class access='public' layout-offset-in-bits='0' type-id='type-id-32'/>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-33' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='95' column='1' id='type-id-13'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-34' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='99' column='1' id='type-id-16'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-35' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='100' column='1' id='type-id-18'/>
+        </member-type>
+      </class-decl>
+      <typedef-decl name='size_t' type-id='type-id-36' filepath='/usr/include/c++/5.3.1/x86_64-redhat-linux/bits/c++config.h' line='1969' column='1' id='type-id-33'/>
+      <class-decl name='reverse_iterator&lt;__gnu_cxx::__normal_iterator&lt;char const*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-24'/>
+      <class-decl name='reverse_iterator&lt;__gnu_cxx::__normal_iterator&lt;char*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-26'/>
+      <typedef-decl name='string' type-id='type-id-8' filepath='/usr/include/c++/5.3.1/bits/stringfwd.h' line='74' column='1' id='type-id-37'/>
+    </namespace-decl>
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-38'/>
+    <typedef-decl name='wint_t' type-id='type-id-38' filepath='/usr/lib/gcc/x86_64-redhat-linux/5.3.1/include/stddef.h' line='357' column='1' id='type-id-39'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-7'/>
+    <function-decl name='btowc' filepath='/usr/include/wchar.h' line='353' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-7'/>
+      <return type-id='type-id-39'/>
+    </function-decl>
+    <class-decl name='_IO_FILE' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-40'/>
+    <typedef-decl name='__FILE' type-id='type-id-40' filepath='/usr/include/stdio.h' line='64' column='1' id='type-id-41'/>
+    <pointer-type-def type-id='type-id-41' size-in-bits='64' id='type-id-42'/>
+    <function-decl name='fgetwc' filepath='/usr/include/wchar.h' line='745' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-42'/>
+      <return type-id='type-id-39'/>
+    </function-decl>
+    <type-decl name='wchar_t' size-in-bits='32' id='type-id-43'/>
+    <pointer-type-def type-id='type-id-43' size-in-bits='64' id='type-id-44'/>
+    <function-decl name='fgetws' filepath='/usr/include/wchar.h' line='774' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-44'/>
+      <parameter type-id='type-id-7'/>
+      <parameter type-id='type-id-42'/>
+      <return type-id='type-id-44'/>
+    </function-decl>
+    <function-decl name='fputwc' filepath='/usr/include/wchar.h' line='759' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-43'/>
+      <parameter type-id='type-id-42'/>
+      <return type-id='type-id-39'/>
+    </function-decl>
+    <qualified-type-def type-id='type-id-43' const='yes' id='type-id-45'/>
+    <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-46'/>
+    <function-decl name='fputws' filepath='/usr/include/wchar.h' line='781' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-42'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <function-decl name='fwide' filepath='/usr/include/wchar.h' line='587' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-42'/>
+      <parameter type-id='type-id-7'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <function-decl name='fwprintf' filepath='/usr/include/wchar.h' line='594' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-42'/>
+      <parameter type-id='type-id-46'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <function-decl name='fwscanf' filepath='/usr/include/wchar.h' line='635' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-42'/>
+      <parameter type-id='type-id-46'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <function-decl name='getwc' filepath='/usr/include/wchar.h' line='746' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-42'/>
+      <return type-id='type-id-39'/>
+    </function-decl>
+    <function-decl name='getwchar' filepath='/usr/include/wchar.h' line='752' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <return type-id='type-id-39'/>
+    </function-decl>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-36'/>
+    <typedef-decl name='size_t' type-id='type-id-36' filepath='/usr/lib/gcc/x86_64-redhat-linux/5.3.1/include/stddef.h' line='216' column='1' id='type-id-47'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-5'/>
+    <qualified-type-def type-id='type-id-5' const='yes' id='type-id-31'/>
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-48'/>
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/wchar.h' line='83' column='1' id='type-id-49'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='__count' type-id='type-id-7' visibility='default' filepath='/usr/include/wchar.h' line='84' column='1'/>
+      </data-member>
+    </class-decl>
+    <typedef-decl name='__mbstate_t' type-id='type-id-49' filepath='/usr/include/wchar.h' line='94' column='1' id='type-id-50'/>
+    <typedef-decl name='mbstate_t' type-id='type-id-50' filepath='/usr/include/wchar.h' line='106' column='1' id='type-id-51'/>
+    <pointer-type-def type-id='type-id-51' size-in-bits='64' id='type-id-52'/>
+    <function-decl name='mbrlen' filepath='/usr/include/wchar.h' line='376' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-48'/>
+      <parameter type-id='type-id-47'/>
+      <parameter type-id='type-id-52'/>
+      <return type-id='type-id-47'/>
+    </function-decl>
+    <function-decl name='mbrtowc' filepath='/usr/include/wchar.h' line='365' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-44'/>
+      <parameter type-id='type-id-48'/>
+      <parameter type-id='type-id-47'/>
+      <parameter type-id='type-id-52'/>
+      <return type-id='type-id-47'/>
+    </function-decl>
+    <qualified-type-def type-id='type-id-51' const='yes' id='type-id-53'/>
+    <pointer-type-def type-id='type-id-53' size-in-bits='64' id='type-id-54'/>
+    <function-decl name='mbsinit' filepath='/usr/include/wchar.h' line='361' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-54'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-48' size-in-bits='64' id='type-id-55'/>
+    <function-decl name='mbsrtowcs' filepath='/usr/include/wchar.h' line='408' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-44'/>
+      <parameter type-id='type-id-55'/>
+      <parameter type-id='type-id-47'/>
+      <parameter type-id='type-id-52'/>
+      <return type-id='type-id-47'/>
+    </function-decl>
+    <function-decl name='putwc' filepath='/usr/include/wchar.h' line='760' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-43'/>
+      <parameter type-id='type-id-42'/>
+      <return type-id='type-id-39'/>
+    </function-decl>
+    <function-decl name='putwchar' filepath='/usr/include/wchar.h' line='766' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-43'/>
+      <return type-id='type-id-39'/>
+    </function-decl>
+    <function-decl name='swprintf' filepath='/usr/include/wchar.h' line='604' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-44'/>
+      <parameter type-id='type-id-47'/>
+      <parameter type-id='type-id-46'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <function-decl name='swscanf' filepath='/usr/include/wchar.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-46'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <function-decl name='ungetwc' filepath='/usr/include/wchar.h' line='789' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-39'/>
+      <parameter type-id='type-id-42'/>
+      <return type-id='type-id-39'/>
+    </function-decl>
+    <class-decl name='typedef __va_list_tag __va_list_tag' size-in-bits='192' is-struct='yes' visibility='default' id='type-id-56'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='gp_offset' type-id='type-id-38' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <var-decl name='fp_offset' type-id='type-id-38' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='overflow_arg_area' type-id='type-id-57' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='reg_save_area' type-id='type-id-57' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <type-decl name='void' id='type-id-58'/>
+    <pointer-type-def type-id='type-id-58' size-in-bits='64' id='type-id-57'/>
+    <pointer-type-def type-id='type-id-56' size-in-bits='64' id='type-id-59'/>
+    <function-decl name='vfwprintf' filepath='/usr/include/wchar.h' line='612' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-42'/>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-59'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <function-decl name='vfwscanf' filepath='/usr/include/wchar.h' line='689' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-42'/>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-59'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <function-decl name='vswprintf' filepath='/usr/include/wchar.h' line='625' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-44'/>
+      <parameter type-id='type-id-47'/>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-59'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <function-decl name='vswscanf' filepath='/usr/include/wchar.h' line='701' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-59'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <function-decl name='vwprintf' filepath='/usr/include/wchar.h' line='620' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-59'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <function-decl name='vwscanf' filepath='/usr/include/wchar.h' line='697' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-59'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-11'/>
+    <function-decl name='wcrtomb' filepath='/usr/include/wchar.h' line='370' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-11'/>
+      <parameter type-id='type-id-43'/>
+      <parameter type-id='type-id-52'/>
+      <return type-id='type-id-47'/>
+    </function-decl>
+    <function-decl name='wcscat' filepath='/usr/include/wchar.h' line='155' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-44'/>
+      <parameter type-id='type-id-46'/>
+      <return type-id='type-id-44'/>
+    </function-decl>
+    <function-decl name='wcscmp' filepath='/usr/include/wchar.h' line='163' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-46'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <function-decl name='wcscoll' filepath='/usr/include/wchar.h' line='192' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-46'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <function-decl name='wcscpy' filepath='/usr/include/wchar.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-44'/>
+      <parameter type-id='type-id-46'/>
+      <return type-id='type-id-44'/>
+    </function-decl>
+    <function-decl name='wcscspn' filepath='/usr/include/wchar.h' line='252' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-46'/>
+      <return type-id='type-id-47'/>
+    </function-decl>
+    <class-decl name='tm' size-in-bits='448' is-struct='yes' visibility='default' filepath='/usr/include/time.h' line='133' column='1' id='type-id-60'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='tm_sec' type-id='type-id-7' visibility='default' filepath='/usr/include/time.h' line='135' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <var-decl name='tm_min' type-id='type-id-7' visibility='default' filepath='/usr/include/time.h' line='136' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='tm_hour' type-id='type-id-7' visibility='default' filepath='/usr/include/time.h' line='137' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <var-decl name='tm_mday' type-id='type-id-7' visibility='default' filepath='/usr/include/time.h' line='138' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='tm_mon' type-id='type-id-7' visibility='default' filepath='/usr/include/time.h' line='139' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <var-decl name='tm_year' type-id='type-id-7' visibility='default' filepath='/usr/include/time.h' line='140' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <var-decl name='tm_wday' type-id='type-id-7' visibility='default' filepath='/usr/include/time.h' line='141' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='224'>
+        <var-decl name='tm_yday' type-id='type-id-7' visibility='default' filepath='/usr/include/time.h' line='142' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <var-decl name='tm_isdst' type-id='type-id-7' visibility='default' filepath='/usr/include/time.h' line='143' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <var-decl name='tm_gmtoff' type-id='type-id-61' visibility='default' filepath='/usr/include/time.h' line='146' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <var-decl name='tm_zone' type-id='type-id-48' visibility='default' filepath='/usr/include/time.h' line='147' column='1'/>
+      </data-member>
+    </class-decl>
+    <type-decl name='long int' size-in-bits='64' id='type-id-61'/>
+    <qualified-type-def type-id='type-id-60' const='yes' id='type-id-62'/>
+    <pointer-type-def type-id='type-id-62' size-in-bits='64' id='type-id-63'/>
+    <function-decl name='wcsftime' filepath='/usr/include/wchar.h' line='855' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-44'/>
+      <parameter type-id='type-id-47'/>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-63'/>
+      <return type-id='type-id-47'/>
+    </function-decl>
+    <function-decl name='wcslen' filepath='/usr/include/wchar.h' line='287' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <return type-id='type-id-47'/>
+    </function-decl>
+    <function-decl name='wcsncat' filepath='/usr/include/wchar.h' line='158' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-44'/>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-47'/>
+      <return type-id='type-id-44'/>
+    </function-decl>
+    <function-decl name='wcsncmp' filepath='/usr/include/wchar.h' line='166' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-47'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <function-decl name='wcsncpy' filepath='/usr/include/wchar.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-44'/>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-47'/>
+      <return type-id='type-id-44'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-46' size-in-bits='64' id='type-id-64'/>
+    <function-decl name='wcsrtombs' filepath='/usr/include/wchar.h' line='414' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-11'/>
+      <parameter type-id='type-id-64'/>
+      <parameter type-id='type-id-47'/>
+      <parameter type-id='type-id-52'/>
+      <return type-id='type-id-47'/>
+    </function-decl>
+    <function-decl name='wcsspn' filepath='/usr/include/wchar.h' line='256' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-46'/>
+      <return type-id='type-id-47'/>
+    </function-decl>
+    <type-decl name='double' size-in-bits='64' id='type-id-65'/>
+    <pointer-type-def type-id='type-id-44' size-in-bits='64' id='type-id-66'/>
+    <function-decl name='wcstod' filepath='/usr/include/wchar.h' line='450' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-66'/>
+      <return type-id='type-id-65'/>
+    </function-decl>
+    <type-decl name='float' size-in-bits='32' id='type-id-67'/>
+    <function-decl name='wcstof' filepath='/usr/include/wchar.h' line='457' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-66'/>
+      <return type-id='type-id-67'/>
+    </function-decl>
+    <function-decl name='wcstok' filepath='/usr/include/wchar.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-44'/>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-66'/>
+      <return type-id='type-id-44'/>
+    </function-decl>
+    <function-decl name='wcstol' filepath='/usr/include/wchar.h' line='468' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-66'/>
+      <parameter type-id='type-id-7'/>
+      <return type-id='type-id-61'/>
+    </function-decl>
+    <function-decl name='wcstoul' filepath='/usr/include/wchar.h' line='473' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-66'/>
+      <parameter type-id='type-id-7'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcsxfrm' filepath='/usr/include/wchar.h' line='196' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-44'/>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-47'/>
+      <return type-id='type-id-47'/>
+    </function-decl>
+    <function-decl name='wctob' filepath='/usr/include/wchar.h' line='357' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-39'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <function-decl name='wmemcmp' filepath='/usr/include/wchar.h' line='325' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-47'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <function-decl name='wmemcpy' filepath='/usr/include/wchar.h' line='329' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-44'/>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-47'/>
+      <return type-id='type-id-44'/>
+    </function-decl>
+    <function-decl name='wmemmove' filepath='/usr/include/wchar.h' line='334' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-44'/>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-47'/>
+      <return type-id='type-id-44'/>
+    </function-decl>
+    <function-decl name='wmemset' filepath='/usr/include/wchar.h' line='338' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-44'/>
+      <parameter type-id='type-id-43'/>
+      <parameter type-id='type-id-47'/>
+      <return type-id='type-id-44'/>
+    </function-decl>
+    <function-decl name='wprintf' filepath='/usr/include/wchar.h' line='601' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <function-decl name='wscanf' filepath='/usr/include/wchar.h' line='642' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <function-decl name='wcschr' mangled-name='wcschr' filepath='/usr/include/wchar.h' line='224' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-43'/>
+      <return type-id='type-id-46'/>
+    </function-decl>
+    <function-decl name='wcspbrk' mangled-name='wcspbrk' filepath='/usr/include/wchar.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-46'/>
+      <return type-id='type-id-46'/>
+    </function-decl>
+    <function-decl name='wcsrchr' mangled-name='wcsrchr' filepath='/usr/include/wchar.h' line='234' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-43'/>
+      <return type-id='type-id-46'/>
+    </function-decl>
+    <function-decl name='wcsstr' mangled-name='wcsstr' filepath='/usr/include/wchar.h' line='273' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-46'/>
+      <return type-id='type-id-46'/>
+    </function-decl>
+    <function-decl name='wmemchr' mangled-name='wmemchr' filepath='/usr/include/wchar.h' line='316' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-43'/>
+      <parameter type-id='type-id-47'/>
+      <return type-id='type-id-46'/>
+    </function-decl>
+    <namespace-decl name='__gnu_cxx'>
+
+      <class-decl name='new_allocator&lt;char&gt;' size-in-bits='8' visibility='default' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='58' column='1' id='type-id-32'>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-33' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='61' column='1' id='type-id-68'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='pointer' type-id='type-id-11' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='63' column='1' id='type-id-69'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_pointer' type-id='type-id-48' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='64' column='1' id='type-id-70'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-34' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='65' column='1' id='type-id-71'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-35' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='66' column='1' id='type-id-72'/>
+        </member-type>
+        <member-function access='public'>
+          <function-decl name='new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcEC4Ev' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='79' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-73' is-artificial='yes'/>
+            <return type-id='type-id-58'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcEC4ERKS1_' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-73' is-artificial='yes'/>
+            <parameter type-id='type-id-74'/>
+            <return type-id='type-id-58'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' destructor='yes'>
+          <function-decl name='~new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcED4Ev' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-73' is-artificial='yes'/>
+            <parameter type-id='type-id-7' is-artificial='yes'/>
+            <return type-id='type-id-58'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='address' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE7addressERc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='89' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-75' is-artificial='yes'/>
+            <parameter type-id='type-id-71'/>
+            <return type-id='type-id-69'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='address' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE7addressERKc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='93' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-75' is-artificial='yes'/>
+            <parameter type-id='type-id-72'/>
+            <return type-id='type-id-70'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='allocate' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='99' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-73' is-artificial='yes'/>
+            <parameter type-id='type-id-68'/>
+            <parameter type-id='type-id-57'/>
+            <return type-id='type-id-69'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='deallocate' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE10deallocateEPcm' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='109' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-73' is-artificial='yes'/>
+            <parameter type-id='type-id-69'/>
+            <parameter type-id='type-id-68'/>
+            <return type-id='type-id-58'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='max_size' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE8max_sizeEv' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='113' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-75' is-artificial='yes'/>
+            <return type-id='type-id-68'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='construct' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE9constructEPcRKc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='129' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-73' is-artificial='yes'/>
+            <parameter type-id='type-id-69'/>
+            <parameter type-id='type-id-35'/>
+            <return type-id='type-id-58'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='destroy' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE7destroyEPc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-73' is-artificial='yes'/>
+            <parameter type-id='type-id-69'/>
+            <return type-id='type-id-58'/>
+          </function-decl>
+        </member-function>
+      </class-decl>
+      <class-decl name='__normal_iterator&lt;char*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-20'/>
+      <class-decl name='__normal_iterator&lt;char const*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-22'/>
+      <class-decl name='__numeric_traits_integer&lt;int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-76'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-77' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIiE5__minE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-77' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIiE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-78' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-77' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;long unsigned int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-79'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-80' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-80' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-78' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-77' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerImE8__digitsE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;char&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-81'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-31' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-31' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIcE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-78' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-77' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;short int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-82'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-83' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIsE5__minE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-83' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIsE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-78' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-77' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;long int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-84'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-85' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIlE5__minE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-85' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIlE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-78' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-77' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+    </namespace-decl>
+    <type-decl name='long double' size-in-bits='128' id='type-id-86'/>
+    <function-decl name='wcstold' filepath='/usr/include/wchar.h' line='459' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-66'/>
+      <return type-id='type-id-86'/>
+    </function-decl>
+    <type-decl name='long long int' size-in-bits='64' id='type-id-87'/>
+    <function-decl name='wcstoll' filepath='/usr/include/wchar.h' line='483' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-66'/>
+      <parameter type-id='type-id-7'/>
+      <return type-id='type-id-87'/>
+    </function-decl>
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-88'/>
+    <function-decl name='wcstoull' filepath='/usr/include/wchar.h' line='490' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-46'/>
+      <parameter type-id='type-id-66'/>
+      <parameter type-id='type-id-7'/>
+      <return type-id='type-id-88'/>
+    </function-decl>
+
+    <function-decl name='setlocale' filepath='/usr/include/locale.h' line='124' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-7'/>
+      <parameter type-id='type-id-48'/>
+      <return type-id='type-id-11'/>
+    </function-decl>
+    <class-decl name='lconv' size-in-bits='768' is-struct='yes' visibility='default' filepath='/usr/include/locale.h' line='53' column='1' id='type-id-89'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='decimal_point' type-id='type-id-11' visibility='default' filepath='/usr/include/locale.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='thousands_sep' type-id='type-id-11' visibility='default' filepath='/usr/include/locale.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='grouping' type-id='type-id-11' visibility='default' filepath='/usr/include/locale.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <var-decl name='int_curr_symbol' type-id='type-id-11' visibility='default' filepath='/usr/include/locale.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <var-decl name='currency_symbol' type-id='type-id-11' visibility='default' filepath='/usr/include/locale.h' line='71' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <var-decl name='mon_decimal_point' type-id='type-id-11' visibility='default' filepath='/usr/include/locale.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <var-decl name='mon_thousands_sep' type-id='type-id-11' visibility='default' filepath='/usr/include/locale.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <var-decl name='mon_grouping' type-id='type-id-11' visibility='default' filepath='/usr/include/locale.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <var-decl name='positive_sign' type-id='type-id-11' visibility='default' filepath='/usr/include/locale.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <var-decl name='negative_sign' type-id='type-id-11' visibility='default' filepath='/usr/include/locale.h' line='76' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <var-decl name='int_frac_digits' type-id='type-id-5' visibility='default' filepath='/usr/include/locale.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='648'>
+        <var-decl name='frac_digits' type-id='type-id-5' visibility='default' filepath='/usr/include/locale.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='656'>
+        <var-decl name='p_cs_precedes' type-id='type-id-5' visibility='default' filepath='/usr/include/locale.h' line='80' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='664'>
+        <var-decl name='p_sep_by_space' type-id='type-id-5' visibility='default' filepath='/usr/include/locale.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='672'>
+        <var-decl name='n_cs_precedes' type-id='type-id-5' visibility='default' filepath='/usr/include/locale.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='680'>
+        <var-decl name='n_sep_by_space' type-id='type-id-5' visibility='default' filepath='/usr/include/locale.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='688'>
+        <var-decl name='p_sign_posn' type-id='type-id-5' visibility='default' filepath='/usr/include/locale.h' line='93' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='696'>
+        <var-decl name='n_sign_posn' type-id='type-id-5' visibility='default' filepath='/usr/include/locale.h' line='94' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <var-decl name='int_p_cs_precedes' type-id='type-id-5' visibility='default' filepath='/usr/include/locale.h' line='97' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='712'>
+        <var-decl name='int_p_sep_by_space' type-id='type-id-5' visibility='default' filepath='/usr/include/locale.h' line='99' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='720'>
+        <var-decl name='int_n_cs_precedes' type-id='type-id-5' visibility='default' filepath='/usr/include/locale.h' line='101' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='728'>
+        <var-decl name='int_n_sep_by_space' type-id='type-id-5' visibility='default' filepath='/usr/include/locale.h' line='103' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='736'>
+        <var-decl name='int_p_sign_posn' type-id='type-id-5' visibility='default' filepath='/usr/include/locale.h' line='110' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='744'>
+        <var-decl name='int_n_sign_posn' type-id='type-id-5' visibility='default' filepath='/usr/include/locale.h' line='111' column='1'/>
+      </data-member>
+    </class-decl>
+    <pointer-type-def type-id='type-id-89' size-in-bits='64' id='type-id-90'/>
+    <function-decl name='localeconv' filepath='/usr/include/locale.h' line='127' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <return type-id='type-id-90'/>
+    </function-decl>
+    <typedef-decl name='wctype_t' type-id='type-id-36' filepath='/usr/include/wctype.h' line='52' column='1' id='type-id-91'/>
+    <function-decl name='iswctype' filepath='/usr/include/wctype.h' line='175' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-39'/>
+      <parameter type-id='type-id-91'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <typedef-decl name='__int32_t' type-id='type-id-7' filepath='/usr/include/bits/types.h' line='40' column='1' id='type-id-92'/>
+    <qualified-type-def type-id='type-id-92' const='yes' id='type-id-93'/>
+    <pointer-type-def type-id='type-id-93' size-in-bits='64' id='type-id-94'/>
+    <typedef-decl name='wctrans_t' type-id='type-id-94' filepath='/usr/include/wctype.h' line='186' column='1' id='type-id-95'/>
+    <function-decl name='towctrans' filepath='/usr/include/wctype.h' line='221' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-39'/>
+      <parameter type-id='type-id-95'/>
+      <return type-id='type-id-39'/>
+    </function-decl>
+    <function-decl name='wctrans' filepath='/usr/include/wctype.h' line='218' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-48'/>
+      <return type-id='type-id-95'/>
+    </function-decl>
+    <function-decl name='wctype' filepath='/usr/include/wctype.h' line='171' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-48'/>
+      <return type-id='type-id-91'/>
+    </function-decl>
+    <qualified-type-def type-id='type-id-4' const='yes' id='type-id-96'/>
+    <qualified-type-def type-id='type-id-6' const='yes' id='type-id-97'/>
+    <reference-type-def kind='lvalue' type-id='type-id-5' size-in-bits='64' id='type-id-34'/>
+    <reference-type-def kind='lvalue' type-id='type-id-31' size-in-bits='64' id='type-id-35'/>
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-73'/>
+    <qualified-type-def type-id='type-id-32' const='yes' id='type-id-98'/>
+    <reference-type-def kind='lvalue' type-id='type-id-98' size-in-bits='64' id='type-id-74'/>
+    <pointer-type-def type-id='type-id-98' size-in-bits='64' id='type-id-75'/>
+    <qualified-type-def type-id='type-id-12' const='yes' id='type-id-30'/>
+    <typedef-decl name='_Atomic_word' type-id='type-id-7' filepath='/usr/include/c++/5.3.1/x86_64-redhat-linux/bits/atomic_word.h' line='32' column='1' id='type-id-28'/>
+    <qualified-type-def type-id='type-id-29' const='yes' id='type-id-99'/>
+    <qualified-type-def type-id='type-id-37' const='yes' id='type-id-100'/>
+    <reference-type-def kind='lvalue' type-id='type-id-100' size-in-bits='64' id='type-id-101'/>
+    <qualified-type-def type-id='type-id-101' id='type-id-102'/>
+    <function-decl name='foo' mangled-name='_Z3fooRKSs' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='14' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Z3fooRKSs'>
+      <parameter type-id='type-id-102' name='s' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='14' column='1'/>
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-2' size-in-bits='64' id='type-id-103'/>
+    <function-decl name='bar' mangled-name='_Z3barRKSs' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Z3barRKSs'>
+      <parameter type-id='type-id-102' name='str' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='21' column='1'/>
+      <return type-id='type-id-103'/>
+    </function-decl>
+    <var-decl name='__dso_handle' type-id='type-id-57' visibility='default'/>
+    <qualified-type-def type-id='type-id-7' const='yes' id='type-id-77'/>
+    <type-decl name='bool' size-in-bits='8' id='type-id-104'/>
+    <qualified-type-def type-id='type-id-104' const='yes' id='type-id-78'/>
+    <qualified-type-def type-id='type-id-36' const='yes' id='type-id-80'/>
+    <type-decl name='short int' size-in-bits='16' id='type-id-105'/>
+    <qualified-type-def type-id='type-id-105' const='yes' id='type-id-83'/>
+    <qualified-type-def type-id='type-id-61' const='yes' id='type-id-85'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-dwarf/test24-drop-fns-0.suppr b/tests/data/test-read-dwarf/test24-drop-fns-0.suppr
new file mode 100644 (file)
index 0000000..734331e
--- /dev/null
@@ -0,0 +1,8 @@
+[suppress_function]
+ #
+ # Remove functions from the C++ standard library if we are not
+ # looking at the standard library itself.
+ #
+ file_name_not_regexp = libstdc++.*
+ name_regexp = std::.*
+ drop = yes
diff --git a/tests/data/test-read-dwarf/test24-drop-fns.cc b/tests/data/test-read-dwarf/test24-drop-fns.cc
new file mode 100644 (file)
index 0000000..072835a
--- /dev/null
@@ -0,0 +1,26 @@
+// Compile this with:
+// gcc -g -Wall -fPIC -shared -o libtest24-drop-fns.so test24-drop-fns.cc
+
+#include <iostream>
+#include <sstream>
+#include <string>
+
+using std::string;
+using std::cout;
+using std::ostringstream;
+using std::ostream;
+
+string
+foo(const string& s)
+{
+  string str = "The input string was: '" + s;
+  return str;
+}
+
+ostream*
+bar(const string& str)
+{
+  ostringstream *o = new ostringstream;
+  *o << str << foo(str);
+  return o;
+}
diff --git a/tests/data/test-read-write/test28-drop-std-fns.abignore b/tests/data/test-read-write/test28-drop-std-fns.abignore
new file mode 100644 (file)
index 0000000..6379e2b
--- /dev/null
@@ -0,0 +1,3 @@
+[suppress_function]
+  name_regexp = std::.*
+  drop = true
diff --git a/tests/data/test-read-write/test28-drop-std-vars.abignore b/tests/data/test-read-write/test28-drop-std-vars.abignore
new file mode 100644 (file)
index 0000000..c576392
--- /dev/null
@@ -0,0 +1,7 @@
+[suppress_variable]
+  name_regexp = std::.*
+  drop = true
+
+[suppress_variable]
+  name_regexp = __gnu_cxx::.*
+  drop = true
diff --git a/tests/data/test-read-write/test28-without-std-fns-ref.xml b/tests/data/test-read-write/test28-without-std-fns-ref.xml
new file mode 100644 (file)
index 0000000..0a8c6ce
--- /dev/null
@@ -0,0 +1,838 @@
+<abi-corpus path='tests/data/test-read-dwarf/libtest24-drop-fns.so'>
+  <elf-needed>
+    <dependency name='libgcc_s.so.1'/>
+    <dependency name='libc.so.6'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <elf-symbol name='_Z3barRKSs' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_Z3fooRKSs' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_ZNSt11char_traitsIcE6lengthEPKc' type='func-type' binding='weak-binding' is-defined='yes'/>
+    <elf-symbol name='_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_' type='func-type' binding='weak-binding' is-defined='yes'/>
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_init' type='func-type' binding='global-binding' is-defined='yes'/>
+  </elf-function-symbols>
+  <abi-instr version='1.0' address-size='64' path='test24-drop-fns.cc' language='LANG_C_plus_plus'>
+    <namespace-decl name='std'>
+
+      <class-decl name='basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-1'/>
+      <typedef-decl name='ostream' type-id='type-id-1' filepath='/usr/include/c++/5.3.1/iosfwd' line='141' column='1' id='type-id-2'/>
+      <var-decl name='cout' type-id='type-id-2' mangled-name='_ZSt4cout' visibility='default' filepath='/usr/include/c++/5.3.1/iostream' line='61' column='1'/>
+      <class-decl name='basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;' size-in-bits='64' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2510' column='1' id='type-id-3'>
+        <member-type access='private'>
+          <class-decl name='_Alloc_hider' size-in-bits='64' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2670' column='1' id='type-id-4'>
+            <base-class access='public' layout-offset-in-bits='0' type-id='type-id-5'/>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='_M_p' type-id='type-id-6' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2675' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-8' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2519' column='1' id='type-id-7'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='allocator_type' type-id='type-id-5' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2518' column='1' id='type-id-9'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-11' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2521' column='1' id='type-id-10'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-13' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2522' column='1' id='type-id-12'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='iterator' type-id='type-id-15' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2525' column='1' id='type-id-14'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_iterator' type-id='type-id-17' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2527' column='1' id='type-id-16'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reverse_iterator' type-id='type-id-19' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2528' column='1' id='type-id-18'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reverse_iterator' type-id='type-id-21' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2529' column='1' id='type-id-20'/>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='_Rep_base' size-in-bits='192' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2546' column='1' id='type-id-22'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='_M_length' type-id='type-id-7' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2548' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='_M_capacity' type-id='type-id-7' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2549' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='_M_refcount' type-id='type-id-23' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2550' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='_Rep' size-in-bits='192' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2553' column='1' id='type-id-24'>
+            <base-class access='public' layout-offset-in-bits='0' type-id='type-id-22'/>
+            <data-member access='public' static='yes'>
+              <var-decl name='_S_max_size' type-id='type-id-25' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='494' column='1'/>
+            </data-member>
+            <data-member access='public' static='yes'>
+              <var-decl name='_S_terminal' type-id='type-id-26' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='499' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <data-member access='public' static='yes'>
+          <var-decl name='npos' type-id='type-id-25' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2683' column='1'/>
+        </data-member>
+        <data-member access='private' layout-offset-in-bits='0'>
+          <var-decl name='_M_dataplus' type-id='type-id-4' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2687' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='allocator&lt;char&gt;' size-in-bits='8' visibility='default' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='92' column='1' id='type-id-5'>
+        <base-class access='public' layout-offset-in-bits='0' type-id='type-id-27'/>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-28' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='95' column='1' id='type-id-8'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-29' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='99' column='1' id='type-id-11'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-30' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='100' column='1' id='type-id-13'/>
+        </member-type>
+      </class-decl>
+      <typedef-decl name='size_t' type-id='type-id-31' filepath='/usr/include/c++/5.3.1/x86_64-redhat-linux/bits/c++config.h' line='1969' column='1' id='type-id-28'/>
+      <class-decl name='reverse_iterator&lt;__gnu_cxx::__normal_iterator&lt;char const*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-19'/>
+      <class-decl name='reverse_iterator&lt;__gnu_cxx::__normal_iterator&lt;char*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-21'/>
+      <class-decl name='char_traits&lt;char&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='233' column='1' id='type-id-32'>
+        <member-type access='public'>
+          <typedef-decl name='char_type' type-id='type-id-34' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='235' column='1' id='type-id-33'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='int_type' type-id='type-id-36' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='236' column='1' id='type-id-35'/>
+        </member-type>
+      </class-decl>
+      <typedef-decl name='string' type-id='type-id-3' filepath='/usr/include/c++/5.3.1/bits/stringfwd.h' line='74' column='1' id='type-id-37'/>
+    </namespace-decl>
+    <namespace-decl name='__gnu_cxx'>
+
+      <class-decl name='new_allocator&lt;char&gt;' size-in-bits='8' visibility='default' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='58' column='1' id='type-id-27'>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-28' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='61' column='1' id='type-id-38'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='pointer' type-id='type-id-6' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='63' column='1' id='type-id-39'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_pointer' type-id='type-id-41' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='64' column='1' id='type-id-40'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-29' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='65' column='1' id='type-id-42'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-30' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='66' column='1' id='type-id-43'/>
+        </member-type>
+        <member-function access='public'>
+          <function-decl name='new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcEC4Ev' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='79' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcEC4ERKS1_' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-46'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' destructor='yes'>
+          <function-decl name='~new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcED4Ev' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-36' is-artificial='yes'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='address' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE7addressERc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='89' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-47' is-artificial='yes'/>
+            <parameter type-id='type-id-42'/>
+            <return type-id='type-id-39'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='address' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE7addressERKc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='93' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-47' is-artificial='yes'/>
+            <parameter type-id='type-id-43'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='allocate' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='99' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-38'/>
+            <parameter type-id='type-id-48'/>
+            <return type-id='type-id-39'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='deallocate' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE10deallocateEPcm' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='109' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-38'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='max_size' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE8max_sizeEv' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='113' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-47' is-artificial='yes'/>
+            <return type-id='type-id-38'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='construct' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE9constructEPcRKc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='129' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-30'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='destroy' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE7destroyEPc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+      </class-decl>
+      <class-decl name='__normal_iterator&lt;char*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-15'/>
+      <class-decl name='__normal_iterator&lt;char const*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-17'/>
+      <class-decl name='__numeric_traits_integer&lt;int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-49'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-50' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIiE5__minE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-50' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIiE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;long unsigned int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-52'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-53' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-53' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerImE8__digitsE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;char&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-54'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-26' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-26' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIcE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;short int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-55'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-56' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIsE5__minE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-56' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIsE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;long int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-57'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-58' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIlE5__minE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-58' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIlE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+    </namespace-decl>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-31'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-34'/>
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-6'/>
+    <qualified-type-def type-id='type-id-34' const='yes' id='type-id-26'/>
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-41'/>
+    <reference-type-def kind='lvalue' type-id='type-id-34' size-in-bits='64' id='type-id-29'/>
+    <reference-type-def kind='lvalue' type-id='type-id-26' size-in-bits='64' id='type-id-30'/>
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-44'/>
+    <type-decl name='void' id='type-id-45'/>
+    <qualified-type-def type-id='type-id-27' const='yes' id='type-id-59'/>
+    <reference-type-def kind='lvalue' type-id='type-id-59' size-in-bits='64' id='type-id-46'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-36'/>
+    <pointer-type-def type-id='type-id-59' size-in-bits='64' id='type-id-47'/>
+    <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-48'/>
+    <qualified-type-def type-id='type-id-36' const='yes' id='type-id-50'/>
+    <type-decl name='bool' size-in-bits='8' id='type-id-60'/>
+    <qualified-type-def type-id='type-id-60' const='yes' id='type-id-51'/>
+    <qualified-type-def type-id='type-id-31' const='yes' id='type-id-53'/>
+    <type-decl name='short int' size-in-bits='16' id='type-id-61'/>
+    <qualified-type-def type-id='type-id-61' const='yes' id='type-id-56'/>
+    <type-decl name='long int' size-in-bits='64' id='type-id-62'/>
+    <qualified-type-def type-id='type-id-62' const='yes' id='type-id-58'/>
+    <typedef-decl name='_Atomic_word' type-id='type-id-36' filepath='/usr/include/c++/5.3.1/x86_64-redhat-linux/bits/atomic_word.h' line='32' column='1' id='type-id-23'/>
+    <qualified-type-def type-id='type-id-7' const='yes' id='type-id-25'/>
+    <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-63'/>
+    <qualified-type-def type-id='type-id-5' const='yes' id='type-id-64'/>
+    <reference-type-def kind='lvalue' type-id='type-id-64' size-in-bits='64' id='type-id-65'/>
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-66'/>
+    <reference-type-def kind='lvalue' type-id='type-id-24' size-in-bits='64' id='type-id-67'/>
+    <qualified-type-def type-id='type-id-24' const='yes' id='type-id-68'/>
+    <pointer-type-def type-id='type-id-68' size-in-bits='64' id='type-id-69'/>
+    <pointer-type-def type-id='type-id-24' size-in-bits='64' id='type-id-70'/>
+    <qualified-type-def type-id='type-id-3' const='yes' id='type-id-71'/>
+    <pointer-type-def type-id='type-id-71' size-in-bits='64' id='type-id-72'/>
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-73'/>
+    <reference-type-def kind='lvalue' type-id='type-id-71' size-in-bits='64' id='type-id-74'/>
+    <reference-type-def kind='lvalue' type-id='type-id-3' size-in-bits='64' id='type-id-75'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-76'/>
+    <typedef-decl name='wint_t' type-id='type-id-76' filepath='/usr/lib/gcc/x86_64-redhat-linux/5.3.1/include/stddef.h' line='357' column='1' id='type-id-77'/>
+    <function-decl name='btowc' filepath='/usr/include/wchar.h' line='353' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <class-decl name='_IO_FILE' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-78'/>
+    <typedef-decl name='__FILE' type-id='type-id-78' filepath='/usr/include/stdio.h' line='64' column='1' id='type-id-79'/>
+    <pointer-type-def type-id='type-id-79' size-in-bits='64' id='type-id-80'/>
+    <function-decl name='fgetwc' filepath='/usr/include/wchar.h' line='745' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <type-decl name='wchar_t' size-in-bits='32' id='type-id-81'/>
+    <pointer-type-def type-id='type-id-81' size-in-bits='64' id='type-id-82'/>
+    <function-decl name='fgetws' filepath='/usr/include/wchar.h' line='774' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-36'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='fputwc' filepath='/usr/include/wchar.h' line='759' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <qualified-type-def type-id='type-id-81' const='yes' id='type-id-83'/>
+    <pointer-type-def type-id='type-id-83' size-in-bits='64' id='type-id-84'/>
+    <function-decl name='fputws' filepath='/usr/include/wchar.h' line='781' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='fwide' filepath='/usr/include/wchar.h' line='587' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='fwprintf' filepath='/usr/include/wchar.h' line='594' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='fwscanf' filepath='/usr/include/wchar.h' line='635' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='getwc' filepath='/usr/include/wchar.h' line='746' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='getwchar' filepath='/usr/include/wchar.h' line='752' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <typedef-decl name='size_t' type-id='type-id-31' filepath='/usr/lib/gcc/x86_64-redhat-linux/5.3.1/include/stddef.h' line='216' column='1' id='type-id-85'/>
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/wchar.h' line='83' column='1' id='type-id-86'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='__count' type-id='type-id-36' visibility='default' filepath='/usr/include/wchar.h' line='84' column='1'/>
+      </data-member>
+    </class-decl>
+    <typedef-decl name='__mbstate_t' type-id='type-id-86' filepath='/usr/include/wchar.h' line='94' column='1' id='type-id-87'/>
+    <typedef-decl name='mbstate_t' type-id='type-id-87' filepath='/usr/include/wchar.h' line='106' column='1' id='type-id-88'/>
+    <pointer-type-def type-id='type-id-88' size-in-bits='64' id='type-id-89'/>
+    <function-decl name='mbrlen' filepath='/usr/include/wchar.h' line='376' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-41'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='mbrtowc' filepath='/usr/include/wchar.h' line='365' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-41'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <qualified-type-def type-id='type-id-88' const='yes' id='type-id-90'/>
+    <pointer-type-def type-id='type-id-90' size-in-bits='64' id='type-id-91'/>
+    <function-decl name='mbsinit' filepath='/usr/include/wchar.h' line='361' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-91'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-41' size-in-bits='64' id='type-id-92'/>
+    <function-decl name='mbsrtowcs' filepath='/usr/include/wchar.h' line='408' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-92'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='putwc' filepath='/usr/include/wchar.h' line='760' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='putwchar' filepath='/usr/include/wchar.h' line='766' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-81'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='swprintf' filepath='/usr/include/wchar.h' line='604' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='swscanf' filepath='/usr/include/wchar.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='ungetwc' filepath='/usr/include/wchar.h' line='789' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <class-decl name='typedef __va_list_tag __va_list_tag' size-in-bits='192' is-struct='yes' visibility='default' id='type-id-93'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='gp_offset' type-id='type-id-76' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <var-decl name='fp_offset' type-id='type-id-76' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='overflow_arg_area' type-id='type-id-48' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='reg_save_area' type-id='type-id-48' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <pointer-type-def type-id='type-id-93' size-in-bits='64' id='type-id-94'/>
+    <function-decl name='vfwprintf' filepath='/usr/include/wchar.h' line='612' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vfwscanf' filepath='/usr/include/wchar.h' line='689' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vswprintf' filepath='/usr/include/wchar.h' line='625' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vswscanf' filepath='/usr/include/wchar.h' line='701' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vwprintf' filepath='/usr/include/wchar.h' line='620' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vwscanf' filepath='/usr/include/wchar.h' line='697' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcrtomb' filepath='/usr/include/wchar.h' line='370' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-6'/>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcscat' filepath='/usr/include/wchar.h' line='155' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcscmp' filepath='/usr/include/wchar.h' line='163' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcscoll' filepath='/usr/include/wchar.h' line='192' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcscpy' filepath='/usr/include/wchar.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcscspn' filepath='/usr/include/wchar.h' line='252' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <class-decl name='tm' size-in-bits='448' is-struct='yes' visibility='default' filepath='/usr/include/time.h' line='133' column='1' id='type-id-95'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='tm_sec' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='135' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <var-decl name='tm_min' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='136' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='tm_hour' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='137' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <var-decl name='tm_mday' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='138' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='tm_mon' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='139' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <var-decl name='tm_year' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='140' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <var-decl name='tm_wday' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='141' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='224'>
+        <var-decl name='tm_yday' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='142' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <var-decl name='tm_isdst' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='143' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <var-decl name='tm_gmtoff' type-id='type-id-62' visibility='default' filepath='/usr/include/time.h' line='146' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <var-decl name='tm_zone' type-id='type-id-41' visibility='default' filepath='/usr/include/time.h' line='147' column='1'/>
+      </data-member>
+    </class-decl>
+    <qualified-type-def type-id='type-id-95' const='yes' id='type-id-96'/>
+    <pointer-type-def type-id='type-id-96' size-in-bits='64' id='type-id-97'/>
+    <function-decl name='wcsftime' filepath='/usr/include/wchar.h' line='855' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-97'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcslen' filepath='/usr/include/wchar.h' line='287' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcsncat' filepath='/usr/include/wchar.h' line='158' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcsncmp' filepath='/usr/include/wchar.h' line='166' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcsncpy' filepath='/usr/include/wchar.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-84' size-in-bits='64' id='type-id-98'/>
+    <function-decl name='wcsrtombs' filepath='/usr/include/wchar.h' line='414' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-6'/>
+      <parameter type-id='type-id-98'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcsspn' filepath='/usr/include/wchar.h' line='256' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <type-decl name='double' size-in-bits='64' id='type-id-99'/>
+    <pointer-type-def type-id='type-id-82' size-in-bits='64' id='type-id-100'/>
+    <function-decl name='wcstod' filepath='/usr/include/wchar.h' line='450' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-99'/>
+    </function-decl>
+    <type-decl name='float' size-in-bits='32' id='type-id-101'/>
+    <function-decl name='wcstof' filepath='/usr/include/wchar.h' line='457' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-101'/>
+    </function-decl>
+    <function-decl name='wcstok' filepath='/usr/include/wchar.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcstol' filepath='/usr/include/wchar.h' line='468' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-62'/>
+    </function-decl>
+    <function-decl name='wcstoul' filepath='/usr/include/wchar.h' line='473' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-31'/>
+    </function-decl>
+    <function-decl name='wcsxfrm' filepath='/usr/include/wchar.h' line='196' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wctob' filepath='/usr/include/wchar.h' line='357' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wmemcmp' filepath='/usr/include/wchar.h' line='325' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wmemcpy' filepath='/usr/include/wchar.h' line='329' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wmemmove' filepath='/usr/include/wchar.h' line='334' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wmemset' filepath='/usr/include/wchar.h' line='338' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wprintf' filepath='/usr/include/wchar.h' line='601' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wscanf' filepath='/usr/include/wchar.h' line='642' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcschr' mangled-name='wcschr' filepath='/usr/include/wchar.h' line='224' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-81'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wcspbrk' mangled-name='wcspbrk' filepath='/usr/include/wchar.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wcsrchr' mangled-name='wcsrchr' filepath='/usr/include/wchar.h' line='234' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-81'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wcsstr' mangled-name='wcsstr' filepath='/usr/include/wchar.h' line='273' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wmemchr' mangled-name='wmemchr' filepath='/usr/include/wchar.h' line='316' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <type-decl name='long double' size-in-bits='128' id='type-id-102'/>
+    <function-decl name='wcstold' filepath='/usr/include/wchar.h' line='459' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-102'/>
+    </function-decl>
+    <type-decl name='long long int' size-in-bits='64' id='type-id-103'/>
+    <function-decl name='wcstoll' filepath='/usr/include/wchar.h' line='483' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-103'/>
+    </function-decl>
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-104'/>
+    <function-decl name='wcstoull' filepath='/usr/include/wchar.h' line='490' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-104'/>
+    </function-decl>
+
+    <function-decl name='setlocale' filepath='/usr/include/locale.h' line='124' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-36'/>
+      <parameter type-id='type-id-41'/>
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <class-decl name='lconv' size-in-bits='768' is-struct='yes' visibility='default' filepath='/usr/include/locale.h' line='53' column='1' id='type-id-105'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='decimal_point' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='thousands_sep' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='grouping' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <var-decl name='int_curr_symbol' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <var-decl name='currency_symbol' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='71' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <var-decl name='mon_decimal_point' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <var-decl name='mon_thousands_sep' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <var-decl name='mon_grouping' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <var-decl name='positive_sign' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <var-decl name='negative_sign' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='76' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <var-decl name='int_frac_digits' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='648'>
+        <var-decl name='frac_digits' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='656'>
+        <var-decl name='p_cs_precedes' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='80' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='664'>
+        <var-decl name='p_sep_by_space' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='672'>
+        <var-decl name='n_cs_precedes' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='680'>
+        <var-decl name='n_sep_by_space' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='688'>
+        <var-decl name='p_sign_posn' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='93' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='696'>
+        <var-decl name='n_sign_posn' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='94' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <var-decl name='int_p_cs_precedes' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='97' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='712'>
+        <var-decl name='int_p_sep_by_space' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='99' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='720'>
+        <var-decl name='int_n_cs_precedes' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='101' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='728'>
+        <var-decl name='int_n_sep_by_space' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='103' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='736'>
+        <var-decl name='int_p_sign_posn' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='110' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='744'>
+        <var-decl name='int_n_sign_posn' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='111' column='1'/>
+      </data-member>
+    </class-decl>
+    <pointer-type-def type-id='type-id-105' size-in-bits='64' id='type-id-106'/>
+    <function-decl name='localeconv' filepath='/usr/include/locale.h' line='127' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <return type-id='type-id-106'/>
+    </function-decl>
+    <typedef-decl name='wctype_t' type-id='type-id-31' filepath='/usr/include/wctype.h' line='52' column='1' id='type-id-107'/>
+    <function-decl name='iswctype' filepath='/usr/include/wctype.h' line='175' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <parameter type-id='type-id-107'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <typedef-decl name='__int32_t' type-id='type-id-36' filepath='/usr/include/bits/types.h' line='40' column='1' id='type-id-108'/>
+    <qualified-type-def type-id='type-id-108' const='yes' id='type-id-109'/>
+    <pointer-type-def type-id='type-id-109' size-in-bits='64' id='type-id-110'/>
+    <typedef-decl name='wctrans_t' type-id='type-id-110' filepath='/usr/include/wctype.h' line='186' column='1' id='type-id-111'/>
+    <function-decl name='towctrans' filepath='/usr/include/wctype.h' line='221' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <parameter type-id='type-id-111'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='wctrans' filepath='/usr/include/wctype.h' line='218' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-41'/>
+      <return type-id='type-id-111'/>
+    </function-decl>
+    <function-decl name='wctype' filepath='/usr/include/wctype.h' line='171' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-41'/>
+      <return type-id='type-id-107'/>
+    </function-decl>
+    <reference-type-def kind='lvalue' type-id='type-id-33' size-in-bits='64' id='type-id-112'/>
+    <qualified-type-def type-id='type-id-33' const='yes' id='type-id-113'/>
+    <reference-type-def kind='lvalue' type-id='type-id-113' size-in-bits='64' id='type-id-114'/>
+    <pointer-type-def type-id='type-id-113' size-in-bits='64' id='type-id-115'/>
+    <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-116'/>
+    <qualified-type-def type-id='type-id-35' const='yes' id='type-id-117'/>
+    <reference-type-def kind='lvalue' type-id='type-id-117' size-in-bits='64' id='type-id-118'/>
+    <qualified-type-def type-id='type-id-37' const='yes' id='type-id-119'/>
+    <reference-type-def kind='lvalue' type-id='type-id-119' size-in-bits='64' id='type-id-120'/>
+    <qualified-type-def type-id='type-id-120' id='type-id-121'/>
+    <function-decl name='foo' mangled-name='_Z3fooRKSs' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='14' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Z3fooRKSs'>
+      <parameter type-id='type-id-121' name='s' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='14' column='1'/>
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-2' size-in-bits='64' id='type-id-122'/>
+    <function-decl name='bar' mangled-name='_Z3barRKSs' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Z3barRKSs'>
+      <parameter type-id='type-id-121' name='str' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='21' column='1'/>
+      <return type-id='type-id-122'/>
+    </function-decl>
+    <var-decl name='__dso_handle' type-id='type-id-48' visibility='default'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-write/test28-without-std-fns.xml b/tests/data/test-read-write/test28-without-std-fns.xml
new file mode 100644 (file)
index 0000000..aca4252
--- /dev/null
@@ -0,0 +1,841 @@
+<abi-corpus path='tests/data/test-read-dwarf/libtest24-drop-fns.so' architecture='elf-amd-x86_64'>
+  <elf-needed>
+    <dependency name='libgcc_s.so.1'/>
+    <dependency name='libc.so.6'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <elf-symbol name='_Z3barRKSs' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_Z3fooRKSs' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_ZNSt11char_traitsIcE6lengthEPKc' type='func-type' binding='weak-binding' is-defined='yes'/>
+    <elf-symbol name='_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_' type='func-type' binding='weak-binding' is-defined='yes'/>
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_init' type='func-type' binding='global-binding' is-defined='yes'/>
+  </elf-function-symbols>
+  <abi-instr version='1.0' address-size='64' path='test24-drop-fns.cc' language='LANG_C_plus_plus'>
+    <namespace-decl name='std'>
+      <namespace-decl name='__debug'>
+      </namespace-decl>
+      <class-decl name='basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-1'/>
+      <typedef-decl name='ostream' type-id='type-id-1' filepath='/usr/include/c++/5.3.1/iosfwd' line='141' column='1' id='type-id-2'/>
+      <var-decl name='cout' type-id='type-id-2' mangled-name='_ZSt4cout' visibility='default' filepath='/usr/include/c++/5.3.1/iostream' line='61' column='1'/>
+      <class-decl name='basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;' size-in-bits='64' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2510' column='1' id='type-id-3'>
+        <member-type access='private'>
+          <class-decl name='_Alloc_hider' size-in-bits='64' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2670' column='1' id='type-id-4'>
+            <base-class access='public' layout-offset-in-bits='0' type-id='type-id-5'/>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='_M_p' type-id='type-id-6' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2675' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-8' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2519' column='1' id='type-id-7'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='allocator_type' type-id='type-id-5' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2518' column='1' id='type-id-9'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-11' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2521' column='1' id='type-id-10'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-13' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2522' column='1' id='type-id-12'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='iterator' type-id='type-id-15' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2525' column='1' id='type-id-14'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_iterator' type-id='type-id-17' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2527' column='1' id='type-id-16'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reverse_iterator' type-id='type-id-19' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2528' column='1' id='type-id-18'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reverse_iterator' type-id='type-id-21' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2529' column='1' id='type-id-20'/>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='_Rep_base' size-in-bits='192' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2546' column='1' id='type-id-22'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='_M_length' type-id='type-id-7' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2548' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='_M_capacity' type-id='type-id-7' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2549' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='_M_refcount' type-id='type-id-23' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2550' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='_Rep' size-in-bits='192' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2553' column='1' id='type-id-24'>
+            <base-class access='public' layout-offset-in-bits='0' type-id='type-id-22'/>
+            <data-member access='public' static='yes'>
+              <var-decl name='_S_max_size' type-id='type-id-25' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='494' column='1'/>
+            </data-member>
+            <data-member access='public' static='yes'>
+              <var-decl name='_S_terminal' type-id='type-id-26' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='499' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <data-member access='public' static='yes'>
+          <var-decl name='npos' type-id='type-id-25' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2683' column='1'/>
+        </data-member>
+        <data-member access='private' layout-offset-in-bits='0'>
+          <var-decl name='_M_dataplus' type-id='type-id-4' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2687' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='allocator&lt;char&gt;' size-in-bits='8' visibility='default' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='92' column='1' id='type-id-5'>
+        <base-class access='public' layout-offset-in-bits='0' type-id='type-id-27'/>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-28' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='95' column='1' id='type-id-8'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-29' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='99' column='1' id='type-id-11'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-30' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='100' column='1' id='type-id-13'/>
+        </member-type>
+      </class-decl>
+      <typedef-decl name='size_t' type-id='type-id-31' filepath='/usr/include/c++/5.3.1/x86_64-redhat-linux/bits/c++config.h' line='1969' column='1' id='type-id-28'/>
+      <class-decl name='reverse_iterator&lt;__gnu_cxx::__normal_iterator&lt;char const*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-19'/>
+      <class-decl name='reverse_iterator&lt;__gnu_cxx::__normal_iterator&lt;char*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-21'/>
+      <class-decl name='char_traits&lt;char&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='233' column='1' id='type-id-32'>
+        <member-type access='public'>
+          <typedef-decl name='char_type' type-id='type-id-34' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='235' column='1' id='type-id-33'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='int_type' type-id='type-id-36' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='236' column='1' id='type-id-35'/>
+        </member-type>
+      </class-decl>
+      <typedef-decl name='string' type-id='type-id-3' filepath='/usr/include/c++/5.3.1/bits/stringfwd.h' line='74' column='1' id='type-id-37'/>
+    </namespace-decl>
+    <namespace-decl name='__gnu_cxx'>
+      <namespace-decl name='__ops'>
+      </namespace-decl>
+      <class-decl name='new_allocator&lt;char&gt;' size-in-bits='8' visibility='default' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='58' column='1' id='type-id-27'>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-28' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='61' column='1' id='type-id-38'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='pointer' type-id='type-id-6' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='63' column='1' id='type-id-39'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_pointer' type-id='type-id-41' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='64' column='1' id='type-id-40'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-29' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='65' column='1' id='type-id-42'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-30' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='66' column='1' id='type-id-43'/>
+        </member-type>
+        <member-function access='public'>
+          <function-decl name='new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcEC4Ev' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='79' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcEC4ERKS1_' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-46'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' destructor='yes'>
+          <function-decl name='~new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcED4Ev' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-36' is-artificial='yes'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='address' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE7addressERc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='89' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-47' is-artificial='yes'/>
+            <parameter type-id='type-id-42'/>
+            <return type-id='type-id-39'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='address' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE7addressERKc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='93' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-47' is-artificial='yes'/>
+            <parameter type-id='type-id-43'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='allocate' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='99' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-38'/>
+            <parameter type-id='type-id-48'/>
+            <return type-id='type-id-39'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='deallocate' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE10deallocateEPcm' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='109' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-38'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='max_size' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE8max_sizeEv' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='113' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-47' is-artificial='yes'/>
+            <return type-id='type-id-38'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='construct' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE9constructEPcRKc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='129' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-30'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='destroy' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE7destroyEPc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+      </class-decl>
+      <class-decl name='__normal_iterator&lt;char*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-15'/>
+      <class-decl name='__normal_iterator&lt;char const*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-17'/>
+      <class-decl name='__numeric_traits_integer&lt;int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-49'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-50' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIiE5__minE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-50' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIiE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;long unsigned int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-52'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-53' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-53' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerImE8__digitsE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;char&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-54'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-26' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-26' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIcE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;short int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-55'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-56' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIsE5__minE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-56' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIsE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;long int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-57'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-58' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIlE5__minE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-58' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIlE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+    </namespace-decl>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-31'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-34'/>
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-6'/>
+    <qualified-type-def type-id='type-id-34' const='yes' id='type-id-26'/>
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-41'/>
+    <reference-type-def kind='lvalue' type-id='type-id-34' size-in-bits='64' id='type-id-29'/>
+    <reference-type-def kind='lvalue' type-id='type-id-26' size-in-bits='64' id='type-id-30'/>
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-44'/>
+    <type-decl name='void' id='type-id-45'/>
+    <qualified-type-def type-id='type-id-27' const='yes' id='type-id-59'/>
+    <reference-type-def kind='lvalue' type-id='type-id-59' size-in-bits='64' id='type-id-46'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-36'/>
+    <pointer-type-def type-id='type-id-59' size-in-bits='64' id='type-id-47'/>
+    <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-48'/>
+    <qualified-type-def type-id='type-id-36' const='yes' id='type-id-50'/>
+    <type-decl name='bool' size-in-bits='8' id='type-id-60'/>
+    <qualified-type-def type-id='type-id-60' const='yes' id='type-id-51'/>
+    <qualified-type-def type-id='type-id-31' const='yes' id='type-id-53'/>
+    <type-decl name='short int' size-in-bits='16' id='type-id-61'/>
+    <qualified-type-def type-id='type-id-61' const='yes' id='type-id-56'/>
+    <type-decl name='long int' size-in-bits='64' id='type-id-62'/>
+    <qualified-type-def type-id='type-id-62' const='yes' id='type-id-58'/>
+    <typedef-decl name='_Atomic_word' type-id='type-id-36' filepath='/usr/include/c++/5.3.1/x86_64-redhat-linux/bits/atomic_word.h' line='32' column='1' id='type-id-23'/>
+    <qualified-type-def type-id='type-id-7' const='yes' id='type-id-25'/>
+    <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-63'/>
+    <qualified-type-def type-id='type-id-5' const='yes' id='type-id-64'/>
+    <reference-type-def kind='lvalue' type-id='type-id-64' size-in-bits='64' id='type-id-65'/>
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-66'/>
+    <reference-type-def kind='lvalue' type-id='type-id-24' size-in-bits='64' id='type-id-67'/>
+    <qualified-type-def type-id='type-id-24' const='yes' id='type-id-68'/>
+    <pointer-type-def type-id='type-id-68' size-in-bits='64' id='type-id-69'/>
+    <pointer-type-def type-id='type-id-24' size-in-bits='64' id='type-id-70'/>
+    <qualified-type-def type-id='type-id-3' const='yes' id='type-id-71'/>
+    <pointer-type-def type-id='type-id-71' size-in-bits='64' id='type-id-72'/>
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-73'/>
+    <reference-type-def kind='lvalue' type-id='type-id-71' size-in-bits='64' id='type-id-74'/>
+    <reference-type-def kind='lvalue' type-id='type-id-3' size-in-bits='64' id='type-id-75'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-76'/>
+    <typedef-decl name='wint_t' type-id='type-id-76' filepath='/usr/lib/gcc/x86_64-redhat-linux/5.3.1/include/stddef.h' line='357' column='1' id='type-id-77'/>
+    <function-decl name='btowc' filepath='/usr/include/wchar.h' line='353' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <class-decl name='_IO_FILE' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-78'/>
+    <typedef-decl name='__FILE' type-id='type-id-78' filepath='/usr/include/stdio.h' line='64' column='1' id='type-id-79'/>
+    <pointer-type-def type-id='type-id-79' size-in-bits='64' id='type-id-80'/>
+    <function-decl name='fgetwc' filepath='/usr/include/wchar.h' line='745' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <type-decl name='wchar_t' size-in-bits='32' id='type-id-81'/>
+    <pointer-type-def type-id='type-id-81' size-in-bits='64' id='type-id-82'/>
+    <function-decl name='fgetws' filepath='/usr/include/wchar.h' line='774' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-36'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='fputwc' filepath='/usr/include/wchar.h' line='759' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <qualified-type-def type-id='type-id-81' const='yes' id='type-id-83'/>
+    <pointer-type-def type-id='type-id-83' size-in-bits='64' id='type-id-84'/>
+    <function-decl name='fputws' filepath='/usr/include/wchar.h' line='781' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='fwide' filepath='/usr/include/wchar.h' line='587' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='fwprintf' filepath='/usr/include/wchar.h' line='594' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='fwscanf' filepath='/usr/include/wchar.h' line='635' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='getwc' filepath='/usr/include/wchar.h' line='746' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='getwchar' filepath='/usr/include/wchar.h' line='752' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <typedef-decl name='size_t' type-id='type-id-31' filepath='/usr/lib/gcc/x86_64-redhat-linux/5.3.1/include/stddef.h' line='216' column='1' id='type-id-85'/>
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/wchar.h' line='83' column='1' id='type-id-86'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='__count' type-id='type-id-36' visibility='default' filepath='/usr/include/wchar.h' line='84' column='1'/>
+      </data-member>
+    </class-decl>
+    <typedef-decl name='__mbstate_t' type-id='type-id-86' filepath='/usr/include/wchar.h' line='94' column='1' id='type-id-87'/>
+    <typedef-decl name='mbstate_t' type-id='type-id-87' filepath='/usr/include/wchar.h' line='106' column='1' id='type-id-88'/>
+    <pointer-type-def type-id='type-id-88' size-in-bits='64' id='type-id-89'/>
+    <function-decl name='mbrlen' filepath='/usr/include/wchar.h' line='376' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-41'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='mbrtowc' filepath='/usr/include/wchar.h' line='365' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-41'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <qualified-type-def type-id='type-id-88' const='yes' id='type-id-90'/>
+    <pointer-type-def type-id='type-id-90' size-in-bits='64' id='type-id-91'/>
+    <function-decl name='mbsinit' filepath='/usr/include/wchar.h' line='361' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-91'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-41' size-in-bits='64' id='type-id-92'/>
+    <function-decl name='mbsrtowcs' filepath='/usr/include/wchar.h' line='408' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-92'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='putwc' filepath='/usr/include/wchar.h' line='760' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='putwchar' filepath='/usr/include/wchar.h' line='766' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-81'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='swprintf' filepath='/usr/include/wchar.h' line='604' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='swscanf' filepath='/usr/include/wchar.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='ungetwc' filepath='/usr/include/wchar.h' line='789' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <class-decl name='typedef __va_list_tag __va_list_tag' size-in-bits='192' is-struct='yes' visibility='default' id='type-id-93'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='gp_offset' type-id='type-id-76' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <var-decl name='fp_offset' type-id='type-id-76' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='overflow_arg_area' type-id='type-id-48' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='reg_save_area' type-id='type-id-48' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <pointer-type-def type-id='type-id-93' size-in-bits='64' id='type-id-94'/>
+    <function-decl name='vfwprintf' filepath='/usr/include/wchar.h' line='612' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vfwscanf' filepath='/usr/include/wchar.h' line='689' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vswprintf' filepath='/usr/include/wchar.h' line='625' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vswscanf' filepath='/usr/include/wchar.h' line='701' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vwprintf' filepath='/usr/include/wchar.h' line='620' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vwscanf' filepath='/usr/include/wchar.h' line='697' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcrtomb' filepath='/usr/include/wchar.h' line='370' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-6'/>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcscat' filepath='/usr/include/wchar.h' line='155' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcscmp' filepath='/usr/include/wchar.h' line='163' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcscoll' filepath='/usr/include/wchar.h' line='192' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcscpy' filepath='/usr/include/wchar.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcscspn' filepath='/usr/include/wchar.h' line='252' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <class-decl name='tm' size-in-bits='448' is-struct='yes' visibility='default' filepath='/usr/include/time.h' line='133' column='1' id='type-id-95'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='tm_sec' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='135' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <var-decl name='tm_min' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='136' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='tm_hour' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='137' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <var-decl name='tm_mday' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='138' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='tm_mon' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='139' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <var-decl name='tm_year' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='140' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <var-decl name='tm_wday' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='141' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='224'>
+        <var-decl name='tm_yday' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='142' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <var-decl name='tm_isdst' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='143' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <var-decl name='tm_gmtoff' type-id='type-id-62' visibility='default' filepath='/usr/include/time.h' line='146' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <var-decl name='tm_zone' type-id='type-id-41' visibility='default' filepath='/usr/include/time.h' line='147' column='1'/>
+      </data-member>
+    </class-decl>
+    <qualified-type-def type-id='type-id-95' const='yes' id='type-id-96'/>
+    <pointer-type-def type-id='type-id-96' size-in-bits='64' id='type-id-97'/>
+    <function-decl name='wcsftime' filepath='/usr/include/wchar.h' line='855' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-97'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcslen' filepath='/usr/include/wchar.h' line='287' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcsncat' filepath='/usr/include/wchar.h' line='158' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcsncmp' filepath='/usr/include/wchar.h' line='166' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcsncpy' filepath='/usr/include/wchar.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-84' size-in-bits='64' id='type-id-98'/>
+    <function-decl name='wcsrtombs' filepath='/usr/include/wchar.h' line='414' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-6'/>
+      <parameter type-id='type-id-98'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcsspn' filepath='/usr/include/wchar.h' line='256' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <type-decl name='double' size-in-bits='64' id='type-id-99'/>
+    <pointer-type-def type-id='type-id-82' size-in-bits='64' id='type-id-100'/>
+    <function-decl name='wcstod' filepath='/usr/include/wchar.h' line='450' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-99'/>
+    </function-decl>
+    <type-decl name='float' size-in-bits='32' id='type-id-101'/>
+    <function-decl name='wcstof' filepath='/usr/include/wchar.h' line='457' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-101'/>
+    </function-decl>
+    <function-decl name='wcstok' filepath='/usr/include/wchar.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcstol' filepath='/usr/include/wchar.h' line='468' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-62'/>
+    </function-decl>
+    <function-decl name='wcstoul' filepath='/usr/include/wchar.h' line='473' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-31'/>
+    </function-decl>
+    <function-decl name='wcsxfrm' filepath='/usr/include/wchar.h' line='196' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wctob' filepath='/usr/include/wchar.h' line='357' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wmemcmp' filepath='/usr/include/wchar.h' line='325' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wmemcpy' filepath='/usr/include/wchar.h' line='329' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wmemmove' filepath='/usr/include/wchar.h' line='334' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wmemset' filepath='/usr/include/wchar.h' line='338' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wprintf' filepath='/usr/include/wchar.h' line='601' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wscanf' filepath='/usr/include/wchar.h' line='642' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcschr' mangled-name='wcschr' filepath='/usr/include/wchar.h' line='224' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-81'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wcspbrk' mangled-name='wcspbrk' filepath='/usr/include/wchar.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wcsrchr' mangled-name='wcsrchr' filepath='/usr/include/wchar.h' line='234' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-81'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wcsstr' mangled-name='wcsstr' filepath='/usr/include/wchar.h' line='273' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wmemchr' mangled-name='wmemchr' filepath='/usr/include/wchar.h' line='316' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <type-decl name='long double' size-in-bits='128' id='type-id-102'/>
+    <function-decl name='wcstold' filepath='/usr/include/wchar.h' line='459' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-102'/>
+    </function-decl>
+    <type-decl name='long long int' size-in-bits='64' id='type-id-103'/>
+    <function-decl name='wcstoll' filepath='/usr/include/wchar.h' line='483' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-103'/>
+    </function-decl>
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-104'/>
+    <function-decl name='wcstoull' filepath='/usr/include/wchar.h' line='490' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-104'/>
+    </function-decl>
+    <namespace-decl name='__gnu_debug'>
+    </namespace-decl>
+    <function-decl name='setlocale' filepath='/usr/include/locale.h' line='124' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-36'/>
+      <parameter type-id='type-id-41'/>
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <class-decl name='lconv' size-in-bits='768' is-struct='yes' visibility='default' filepath='/usr/include/locale.h' line='53' column='1' id='type-id-105'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='decimal_point' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='thousands_sep' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='grouping' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <var-decl name='int_curr_symbol' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <var-decl name='currency_symbol' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='71' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <var-decl name='mon_decimal_point' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <var-decl name='mon_thousands_sep' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <var-decl name='mon_grouping' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <var-decl name='positive_sign' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <var-decl name='negative_sign' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='76' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <var-decl name='int_frac_digits' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='648'>
+        <var-decl name='frac_digits' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='656'>
+        <var-decl name='p_cs_precedes' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='80' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='664'>
+        <var-decl name='p_sep_by_space' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='672'>
+        <var-decl name='n_cs_precedes' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='680'>
+        <var-decl name='n_sep_by_space' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='688'>
+        <var-decl name='p_sign_posn' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='93' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='696'>
+        <var-decl name='n_sign_posn' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='94' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <var-decl name='int_p_cs_precedes' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='97' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='712'>
+        <var-decl name='int_p_sep_by_space' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='99' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='720'>
+        <var-decl name='int_n_cs_precedes' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='101' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='728'>
+        <var-decl name='int_n_sep_by_space' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='103' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='736'>
+        <var-decl name='int_p_sign_posn' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='110' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='744'>
+        <var-decl name='int_n_sign_posn' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='111' column='1'/>
+      </data-member>
+    </class-decl>
+    <pointer-type-def type-id='type-id-105' size-in-bits='64' id='type-id-106'/>
+    <function-decl name='localeconv' filepath='/usr/include/locale.h' line='127' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <return type-id='type-id-106'/>
+    </function-decl>
+    <typedef-decl name='wctype_t' type-id='type-id-31' filepath='/usr/include/wctype.h' line='52' column='1' id='type-id-107'/>
+    <function-decl name='iswctype' filepath='/usr/include/wctype.h' line='175' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <parameter type-id='type-id-107'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <typedef-decl name='__int32_t' type-id='type-id-36' filepath='/usr/include/bits/types.h' line='40' column='1' id='type-id-108'/>
+    <qualified-type-def type-id='type-id-108' const='yes' id='type-id-109'/>
+    <pointer-type-def type-id='type-id-109' size-in-bits='64' id='type-id-110'/>
+    <typedef-decl name='wctrans_t' type-id='type-id-110' filepath='/usr/include/wctype.h' line='186' column='1' id='type-id-111'/>
+    <function-decl name='towctrans' filepath='/usr/include/wctype.h' line='221' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <parameter type-id='type-id-111'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='wctrans' filepath='/usr/include/wctype.h' line='218' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-41'/>
+      <return type-id='type-id-111'/>
+    </function-decl>
+    <function-decl name='wctype' filepath='/usr/include/wctype.h' line='171' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-41'/>
+      <return type-id='type-id-107'/>
+    </function-decl>
+    <reference-type-def kind='lvalue' type-id='type-id-33' size-in-bits='64' id='type-id-112'/>
+    <qualified-type-def type-id='type-id-33' const='yes' id='type-id-113'/>
+    <reference-type-def kind='lvalue' type-id='type-id-113' size-in-bits='64' id='type-id-114'/>
+    <pointer-type-def type-id='type-id-113' size-in-bits='64' id='type-id-115'/>
+    <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-116'/>
+    <qualified-type-def type-id='type-id-35' const='yes' id='type-id-117'/>
+    <reference-type-def kind='lvalue' type-id='type-id-117' size-in-bits='64' id='type-id-118'/>
+    <qualified-type-def type-id='type-id-37' const='yes' id='type-id-119'/>
+    <reference-type-def kind='lvalue' type-id='type-id-119' size-in-bits='64' id='type-id-120'/>
+    <qualified-type-def type-id='type-id-120' id='type-id-121'/>
+    <function-decl name='foo' mangled-name='_Z3fooRKSs' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='14' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Z3fooRKSs'>
+      <parameter type-id='type-id-121' name='s' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='14' column='1'/>
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-2' size-in-bits='64' id='type-id-122'/>
+    <function-decl name='bar' mangled-name='_Z3barRKSs' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Z3barRKSs'>
+      <parameter type-id='type-id-121' name='str' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='21' column='1'/>
+      <return type-id='type-id-122'/>
+    </function-decl>
+    <var-decl name='__dso_handle' type-id='type-id-48' visibility='default'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-write/test28-without-std-vars-ref.xml b/tests/data/test-read-write/test28-without-std-vars-ref.xml
new file mode 100644 (file)
index 0000000..1b6299e
--- /dev/null
@@ -0,0 +1,763 @@
+<abi-corpus path='tests/data/test-read-dwarf/libtest24-drop-fns.so'>
+  <elf-needed>
+    <dependency name='libgcc_s.so.1'/>
+    <dependency name='libc.so.6'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <elf-symbol name='_Z3barRKSs' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_Z3fooRKSs' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_ZNSt11char_traitsIcE6lengthEPKc' type='func-type' binding='weak-binding' is-defined='yes'/>
+    <elf-symbol name='_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_' type='func-type' binding='weak-binding' is-defined='yes'/>
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_init' type='func-type' binding='global-binding' is-defined='yes'/>
+  </elf-function-symbols>
+  <abi-instr version='1.0' address-size='64' path='test24-drop-fns.cc' language='LANG_C_plus_plus'>
+    <namespace-decl name='std'>
+
+      <class-decl name='basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-1'/>
+      <typedef-decl name='ostream' type-id='type-id-1' filepath='/usr/include/c++/5.3.1/iosfwd' line='141' column='1' id='type-id-2'/>
+      <class-decl name='basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;' size-in-bits='64' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2510' column='1' id='type-id-3'>
+        <member-type access='private'>
+          <class-decl name='_Alloc_hider' size-in-bits='64' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2670' column='1' id='type-id-4'>
+            <base-class access='public' layout-offset-in-bits='0' type-id='type-id-5'/>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='_M_p' type-id='type-id-6' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2675' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-8' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2519' column='1' id='type-id-7'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='allocator_type' type-id='type-id-5' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2518' column='1' id='type-id-9'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-11' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2521' column='1' id='type-id-10'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-13' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2522' column='1' id='type-id-12'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='iterator' type-id='type-id-15' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2525' column='1' id='type-id-14'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_iterator' type-id='type-id-17' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2527' column='1' id='type-id-16'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reverse_iterator' type-id='type-id-19' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2528' column='1' id='type-id-18'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reverse_iterator' type-id='type-id-21' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2529' column='1' id='type-id-20'/>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='_Rep_base' size-in-bits='192' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2546' column='1' id='type-id-22'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='_M_length' type-id='type-id-7' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2548' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='_M_capacity' type-id='type-id-7' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2549' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='_M_refcount' type-id='type-id-23' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2550' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='_Rep' size-in-bits='192' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2553' column='1' id='type-id-24'>
+            <base-class access='public' layout-offset-in-bits='0' type-id='type-id-22'/>
+          </class-decl>
+        </member-type>
+        <data-member access='private' layout-offset-in-bits='0'>
+          <var-decl name='_M_dataplus' type-id='type-id-4' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2687' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='allocator&lt;char&gt;' size-in-bits='8' visibility='default' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='92' column='1' id='type-id-5'>
+        <base-class access='public' layout-offset-in-bits='0' type-id='type-id-25'/>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-26' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='95' column='1' id='type-id-8'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-27' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='99' column='1' id='type-id-11'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-28' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='100' column='1' id='type-id-13'/>
+        </member-type>
+      </class-decl>
+      <typedef-decl name='size_t' type-id='type-id-29' filepath='/usr/include/c++/5.3.1/x86_64-redhat-linux/bits/c++config.h' line='1969' column='1' id='type-id-26'/>
+      <class-decl name='reverse_iterator&lt;__gnu_cxx::__normal_iterator&lt;char const*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-19'/>
+      <class-decl name='reverse_iterator&lt;__gnu_cxx::__normal_iterator&lt;char*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-21'/>
+      <class-decl name='char_traits&lt;char&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='233' column='1' id='type-id-30'>
+        <member-type access='public'>
+          <typedef-decl name='char_type' type-id='type-id-32' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='235' column='1' id='type-id-31'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='int_type' type-id='type-id-34' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='236' column='1' id='type-id-33'/>
+        </member-type>
+      </class-decl>
+      <typedef-decl name='string' type-id='type-id-3' filepath='/usr/include/c++/5.3.1/bits/stringfwd.h' line='74' column='1' id='type-id-35'/>
+    </namespace-decl>
+    <namespace-decl name='__gnu_cxx'>
+
+      <class-decl name='new_allocator&lt;char&gt;' size-in-bits='8' visibility='default' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='58' column='1' id='type-id-25'>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-26' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='61' column='1' id='type-id-36'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='pointer' type-id='type-id-6' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='63' column='1' id='type-id-37'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_pointer' type-id='type-id-39' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='64' column='1' id='type-id-38'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-27' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='65' column='1' id='type-id-40'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-28' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='66' column='1' id='type-id-41'/>
+        </member-type>
+        <member-function access='public'>
+          <function-decl name='new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcEC4Ev' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='79' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-42' is-artificial='yes'/>
+            <return type-id='type-id-43'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcEC4ERKS1_' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-42' is-artificial='yes'/>
+            <parameter type-id='type-id-44'/>
+            <return type-id='type-id-43'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' destructor='yes'>
+          <function-decl name='~new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcED4Ev' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-42' is-artificial='yes'/>
+            <parameter type-id='type-id-34' is-artificial='yes'/>
+            <return type-id='type-id-43'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='address' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE7addressERc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='89' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-45' is-artificial='yes'/>
+            <parameter type-id='type-id-40'/>
+            <return type-id='type-id-37'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='address' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE7addressERKc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='93' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-45' is-artificial='yes'/>
+            <parameter type-id='type-id-41'/>
+            <return type-id='type-id-38'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='allocate' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='99' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-42' is-artificial='yes'/>
+            <parameter type-id='type-id-36'/>
+            <parameter type-id='type-id-46'/>
+            <return type-id='type-id-37'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='deallocate' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE10deallocateEPcm' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='109' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-42' is-artificial='yes'/>
+            <parameter type-id='type-id-37'/>
+            <parameter type-id='type-id-36'/>
+            <return type-id='type-id-43'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='max_size' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE8max_sizeEv' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='113' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-45' is-artificial='yes'/>
+            <return type-id='type-id-36'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='construct' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE9constructEPcRKc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='129' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-42' is-artificial='yes'/>
+            <parameter type-id='type-id-37'/>
+            <parameter type-id='type-id-28'/>
+            <return type-id='type-id-43'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='destroy' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE7destroyEPc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-42' is-artificial='yes'/>
+            <parameter type-id='type-id-37'/>
+            <return type-id='type-id-43'/>
+          </function-decl>
+        </member-function>
+      </class-decl>
+      <class-decl name='__normal_iterator&lt;char*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-15'/>
+      <class-decl name='__normal_iterator&lt;char const*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-17'/>
+      <class-decl name='__numeric_traits_integer&lt;int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-47'/>
+      <class-decl name='__numeric_traits_integer&lt;long unsigned int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-48'/>
+      <class-decl name='__numeric_traits_integer&lt;char&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-49'/>
+      <class-decl name='__numeric_traits_integer&lt;short int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-50'/>
+      <class-decl name='__numeric_traits_integer&lt;long int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-51'/>
+    </namespace-decl>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-29'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-32'/>
+    <pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-6'/>
+    <qualified-type-def type-id='type-id-32' const='yes' id='type-id-52'/>
+    <pointer-type-def type-id='type-id-52' size-in-bits='64' id='type-id-39'/>
+    <reference-type-def kind='lvalue' type-id='type-id-32' size-in-bits='64' id='type-id-27'/>
+    <reference-type-def kind='lvalue' type-id='type-id-52' size-in-bits='64' id='type-id-28'/>
+    <pointer-type-def type-id='type-id-25' size-in-bits='64' id='type-id-42'/>
+    <type-decl name='void' id='type-id-43'/>
+    <qualified-type-def type-id='type-id-25' const='yes' id='type-id-53'/>
+    <reference-type-def kind='lvalue' type-id='type-id-53' size-in-bits='64' id='type-id-44'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-34'/>
+    <pointer-type-def type-id='type-id-53' size-in-bits='64' id='type-id-45'/>
+    <pointer-type-def type-id='type-id-43' size-in-bits='64' id='type-id-46'/>
+    <qualified-type-def type-id='type-id-34' const='yes' id='type-id-54'/>
+    <type-decl name='bool' size-in-bits='8' id='type-id-55'/>
+    <qualified-type-def type-id='type-id-55' const='yes' id='type-id-56'/>
+    <qualified-type-def type-id='type-id-29' const='yes' id='type-id-57'/>
+    <type-decl name='short int' size-in-bits='16' id='type-id-58'/>
+    <qualified-type-def type-id='type-id-58' const='yes' id='type-id-59'/>
+    <type-decl name='long int' size-in-bits='64' id='type-id-60'/>
+    <qualified-type-def type-id='type-id-60' const='yes' id='type-id-61'/>
+    <typedef-decl name='_Atomic_word' type-id='type-id-34' filepath='/usr/include/c++/5.3.1/x86_64-redhat-linux/bits/atomic_word.h' line='32' column='1' id='type-id-23'/>
+    <qualified-type-def type-id='type-id-7' const='yes' id='type-id-62'/>
+    <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-63'/>
+    <qualified-type-def type-id='type-id-5' const='yes' id='type-id-64'/>
+    <reference-type-def kind='lvalue' type-id='type-id-64' size-in-bits='64' id='type-id-65'/>
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-66'/>
+    <reference-type-def kind='lvalue' type-id='type-id-24' size-in-bits='64' id='type-id-67'/>
+    <qualified-type-def type-id='type-id-24' const='yes' id='type-id-68'/>
+    <pointer-type-def type-id='type-id-68' size-in-bits='64' id='type-id-69'/>
+    <pointer-type-def type-id='type-id-24' size-in-bits='64' id='type-id-70'/>
+    <qualified-type-def type-id='type-id-3' const='yes' id='type-id-71'/>
+    <pointer-type-def type-id='type-id-71' size-in-bits='64' id='type-id-72'/>
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-73'/>
+    <reference-type-def kind='lvalue' type-id='type-id-71' size-in-bits='64' id='type-id-74'/>
+    <reference-type-def kind='lvalue' type-id='type-id-3' size-in-bits='64' id='type-id-75'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-76'/>
+    <typedef-decl name='wint_t' type-id='type-id-76' filepath='/usr/lib/gcc/x86_64-redhat-linux/5.3.1/include/stddef.h' line='357' column='1' id='type-id-77'/>
+    <function-decl name='btowc' filepath='/usr/include/wchar.h' line='353' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-34'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <class-decl name='_IO_FILE' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-78'/>
+    <typedef-decl name='__FILE' type-id='type-id-78' filepath='/usr/include/stdio.h' line='64' column='1' id='type-id-79'/>
+    <pointer-type-def type-id='type-id-79' size-in-bits='64' id='type-id-80'/>
+    <function-decl name='fgetwc' filepath='/usr/include/wchar.h' line='745' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <type-decl name='wchar_t' size-in-bits='32' id='type-id-81'/>
+    <pointer-type-def type-id='type-id-81' size-in-bits='64' id='type-id-82'/>
+    <function-decl name='fgetws' filepath='/usr/include/wchar.h' line='774' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-34'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='fputwc' filepath='/usr/include/wchar.h' line='759' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <qualified-type-def type-id='type-id-81' const='yes' id='type-id-83'/>
+    <pointer-type-def type-id='type-id-83' size-in-bits='64' id='type-id-84'/>
+    <function-decl name='fputws' filepath='/usr/include/wchar.h' line='781' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <function-decl name='fwide' filepath='/usr/include/wchar.h' line='587' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-34'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <function-decl name='fwprintf' filepath='/usr/include/wchar.h' line='594' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <function-decl name='fwscanf' filepath='/usr/include/wchar.h' line='635' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <function-decl name='getwc' filepath='/usr/include/wchar.h' line='746' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='getwchar' filepath='/usr/include/wchar.h' line='752' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <typedef-decl name='size_t' type-id='type-id-29' filepath='/usr/lib/gcc/x86_64-redhat-linux/5.3.1/include/stddef.h' line='216' column='1' id='type-id-85'/>
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/wchar.h' line='83' column='1' id='type-id-86'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='__count' type-id='type-id-34' visibility='default' filepath='/usr/include/wchar.h' line='84' column='1'/>
+      </data-member>
+    </class-decl>
+    <typedef-decl name='__mbstate_t' type-id='type-id-86' filepath='/usr/include/wchar.h' line='94' column='1' id='type-id-87'/>
+    <typedef-decl name='mbstate_t' type-id='type-id-87' filepath='/usr/include/wchar.h' line='106' column='1' id='type-id-88'/>
+    <pointer-type-def type-id='type-id-88' size-in-bits='64' id='type-id-89'/>
+    <function-decl name='mbrlen' filepath='/usr/include/wchar.h' line='376' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-39'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='mbrtowc' filepath='/usr/include/wchar.h' line='365' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-39'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <qualified-type-def type-id='type-id-88' const='yes' id='type-id-90'/>
+    <pointer-type-def type-id='type-id-90' size-in-bits='64' id='type-id-91'/>
+    <function-decl name='mbsinit' filepath='/usr/include/wchar.h' line='361' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-91'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-39' size-in-bits='64' id='type-id-92'/>
+    <function-decl name='mbsrtowcs' filepath='/usr/include/wchar.h' line='408' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-92'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='putwc' filepath='/usr/include/wchar.h' line='760' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='putwchar' filepath='/usr/include/wchar.h' line='766' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-81'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='swprintf' filepath='/usr/include/wchar.h' line='604' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <function-decl name='swscanf' filepath='/usr/include/wchar.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <function-decl name='ungetwc' filepath='/usr/include/wchar.h' line='789' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <class-decl name='typedef __va_list_tag __va_list_tag' size-in-bits='192' is-struct='yes' visibility='default' id='type-id-93'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='gp_offset' type-id='type-id-76' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <var-decl name='fp_offset' type-id='type-id-76' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='overflow_arg_area' type-id='type-id-46' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='reg_save_area' type-id='type-id-46' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <pointer-type-def type-id='type-id-93' size-in-bits='64' id='type-id-94'/>
+    <function-decl name='vfwprintf' filepath='/usr/include/wchar.h' line='612' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <function-decl name='vfwscanf' filepath='/usr/include/wchar.h' line='689' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <function-decl name='vswprintf' filepath='/usr/include/wchar.h' line='625' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <function-decl name='vswscanf' filepath='/usr/include/wchar.h' line='701' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <function-decl name='vwprintf' filepath='/usr/include/wchar.h' line='620' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <function-decl name='vwscanf' filepath='/usr/include/wchar.h' line='697' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <function-decl name='wcrtomb' filepath='/usr/include/wchar.h' line='370' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-6'/>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcscat' filepath='/usr/include/wchar.h' line='155' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcscmp' filepath='/usr/include/wchar.h' line='163' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <function-decl name='wcscoll' filepath='/usr/include/wchar.h' line='192' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <function-decl name='wcscpy' filepath='/usr/include/wchar.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcscspn' filepath='/usr/include/wchar.h' line='252' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <class-decl name='tm' size-in-bits='448' is-struct='yes' visibility='default' filepath='/usr/include/time.h' line='133' column='1' id='type-id-95'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='tm_sec' type-id='type-id-34' visibility='default' filepath='/usr/include/time.h' line='135' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <var-decl name='tm_min' type-id='type-id-34' visibility='default' filepath='/usr/include/time.h' line='136' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='tm_hour' type-id='type-id-34' visibility='default' filepath='/usr/include/time.h' line='137' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <var-decl name='tm_mday' type-id='type-id-34' visibility='default' filepath='/usr/include/time.h' line='138' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='tm_mon' type-id='type-id-34' visibility='default' filepath='/usr/include/time.h' line='139' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <var-decl name='tm_year' type-id='type-id-34' visibility='default' filepath='/usr/include/time.h' line='140' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <var-decl name='tm_wday' type-id='type-id-34' visibility='default' filepath='/usr/include/time.h' line='141' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='224'>
+        <var-decl name='tm_yday' type-id='type-id-34' visibility='default' filepath='/usr/include/time.h' line='142' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <var-decl name='tm_isdst' type-id='type-id-34' visibility='default' filepath='/usr/include/time.h' line='143' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <var-decl name='tm_gmtoff' type-id='type-id-60' visibility='default' filepath='/usr/include/time.h' line='146' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <var-decl name='tm_zone' type-id='type-id-39' visibility='default' filepath='/usr/include/time.h' line='147' column='1'/>
+      </data-member>
+    </class-decl>
+    <qualified-type-def type-id='type-id-95' const='yes' id='type-id-96'/>
+    <pointer-type-def type-id='type-id-96' size-in-bits='64' id='type-id-97'/>
+    <function-decl name='wcsftime' filepath='/usr/include/wchar.h' line='855' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-97'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcslen' filepath='/usr/include/wchar.h' line='287' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcsncat' filepath='/usr/include/wchar.h' line='158' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcsncmp' filepath='/usr/include/wchar.h' line='166' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <function-decl name='wcsncpy' filepath='/usr/include/wchar.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-84' size-in-bits='64' id='type-id-98'/>
+    <function-decl name='wcsrtombs' filepath='/usr/include/wchar.h' line='414' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-6'/>
+      <parameter type-id='type-id-98'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcsspn' filepath='/usr/include/wchar.h' line='256' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <type-decl name='double' size-in-bits='64' id='type-id-99'/>
+    <pointer-type-def type-id='type-id-82' size-in-bits='64' id='type-id-100'/>
+    <function-decl name='wcstod' filepath='/usr/include/wchar.h' line='450' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-99'/>
+    </function-decl>
+    <type-decl name='float' size-in-bits='32' id='type-id-101'/>
+    <function-decl name='wcstof' filepath='/usr/include/wchar.h' line='457' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-101'/>
+    </function-decl>
+    <function-decl name='wcstok' filepath='/usr/include/wchar.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcstol' filepath='/usr/include/wchar.h' line='468' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-34'/>
+      <return type-id='type-id-60'/>
+    </function-decl>
+    <function-decl name='wcstoul' filepath='/usr/include/wchar.h' line='473' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-34'/>
+      <return type-id='type-id-29'/>
+    </function-decl>
+    <function-decl name='wcsxfrm' filepath='/usr/include/wchar.h' line='196' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wctob' filepath='/usr/include/wchar.h' line='357' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <function-decl name='wmemcmp' filepath='/usr/include/wchar.h' line='325' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <function-decl name='wmemcpy' filepath='/usr/include/wchar.h' line='329' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wmemmove' filepath='/usr/include/wchar.h' line='334' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wmemset' filepath='/usr/include/wchar.h' line='338' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wprintf' filepath='/usr/include/wchar.h' line='601' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <function-decl name='wscanf' filepath='/usr/include/wchar.h' line='642' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <function-decl name='wcschr' mangled-name='wcschr' filepath='/usr/include/wchar.h' line='224' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-81'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wcspbrk' mangled-name='wcspbrk' filepath='/usr/include/wchar.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wcsrchr' mangled-name='wcsrchr' filepath='/usr/include/wchar.h' line='234' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-81'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wcsstr' mangled-name='wcsstr' filepath='/usr/include/wchar.h' line='273' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wmemchr' mangled-name='wmemchr' filepath='/usr/include/wchar.h' line='316' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <type-decl name='long double' size-in-bits='128' id='type-id-102'/>
+    <function-decl name='wcstold' filepath='/usr/include/wchar.h' line='459' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-102'/>
+    </function-decl>
+    <type-decl name='long long int' size-in-bits='64' id='type-id-103'/>
+    <function-decl name='wcstoll' filepath='/usr/include/wchar.h' line='483' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-34'/>
+      <return type-id='type-id-103'/>
+    </function-decl>
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-104'/>
+    <function-decl name='wcstoull' filepath='/usr/include/wchar.h' line='490' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-34'/>
+      <return type-id='type-id-104'/>
+    </function-decl>
+
+    <function-decl name='setlocale' filepath='/usr/include/locale.h' line='124' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-34'/>
+      <parameter type-id='type-id-39'/>
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <class-decl name='lconv' size-in-bits='768' is-struct='yes' visibility='default' filepath='/usr/include/locale.h' line='53' column='1' id='type-id-105'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='decimal_point' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='thousands_sep' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='grouping' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <var-decl name='int_curr_symbol' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <var-decl name='currency_symbol' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='71' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <var-decl name='mon_decimal_point' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <var-decl name='mon_thousands_sep' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <var-decl name='mon_grouping' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <var-decl name='positive_sign' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <var-decl name='negative_sign' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='76' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <var-decl name='int_frac_digits' type-id='type-id-32' visibility='default' filepath='/usr/include/locale.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='648'>
+        <var-decl name='frac_digits' type-id='type-id-32' visibility='default' filepath='/usr/include/locale.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='656'>
+        <var-decl name='p_cs_precedes' type-id='type-id-32' visibility='default' filepath='/usr/include/locale.h' line='80' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='664'>
+        <var-decl name='p_sep_by_space' type-id='type-id-32' visibility='default' filepath='/usr/include/locale.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='672'>
+        <var-decl name='n_cs_precedes' type-id='type-id-32' visibility='default' filepath='/usr/include/locale.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='680'>
+        <var-decl name='n_sep_by_space' type-id='type-id-32' visibility='default' filepath='/usr/include/locale.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='688'>
+        <var-decl name='p_sign_posn' type-id='type-id-32' visibility='default' filepath='/usr/include/locale.h' line='93' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='696'>
+        <var-decl name='n_sign_posn' type-id='type-id-32' visibility='default' filepath='/usr/include/locale.h' line='94' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <var-decl name='int_p_cs_precedes' type-id='type-id-32' visibility='default' filepath='/usr/include/locale.h' line='97' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='712'>
+        <var-decl name='int_p_sep_by_space' type-id='type-id-32' visibility='default' filepath='/usr/include/locale.h' line='99' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='720'>
+        <var-decl name='int_n_cs_precedes' type-id='type-id-32' visibility='default' filepath='/usr/include/locale.h' line='101' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='728'>
+        <var-decl name='int_n_sep_by_space' type-id='type-id-32' visibility='default' filepath='/usr/include/locale.h' line='103' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='736'>
+        <var-decl name='int_p_sign_posn' type-id='type-id-32' visibility='default' filepath='/usr/include/locale.h' line='110' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='744'>
+        <var-decl name='int_n_sign_posn' type-id='type-id-32' visibility='default' filepath='/usr/include/locale.h' line='111' column='1'/>
+      </data-member>
+    </class-decl>
+    <pointer-type-def type-id='type-id-105' size-in-bits='64' id='type-id-106'/>
+    <function-decl name='localeconv' filepath='/usr/include/locale.h' line='127' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <return type-id='type-id-106'/>
+    </function-decl>
+    <typedef-decl name='wctype_t' type-id='type-id-29' filepath='/usr/include/wctype.h' line='52' column='1' id='type-id-107'/>
+    <function-decl name='iswctype' filepath='/usr/include/wctype.h' line='175' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <parameter type-id='type-id-107'/>
+      <return type-id='type-id-34'/>
+    </function-decl>
+    <typedef-decl name='__int32_t' type-id='type-id-34' filepath='/usr/include/bits/types.h' line='40' column='1' id='type-id-108'/>
+    <qualified-type-def type-id='type-id-108' const='yes' id='type-id-109'/>
+    <pointer-type-def type-id='type-id-109' size-in-bits='64' id='type-id-110'/>
+    <typedef-decl name='wctrans_t' type-id='type-id-110' filepath='/usr/include/wctype.h' line='186' column='1' id='type-id-111'/>
+    <function-decl name='towctrans' filepath='/usr/include/wctype.h' line='221' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <parameter type-id='type-id-111'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='wctrans' filepath='/usr/include/wctype.h' line='218' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-39'/>
+      <return type-id='type-id-111'/>
+    </function-decl>
+    <function-decl name='wctype' filepath='/usr/include/wctype.h' line='171' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-39'/>
+      <return type-id='type-id-107'/>
+    </function-decl>
+    <reference-type-def kind='lvalue' type-id='type-id-31' size-in-bits='64' id='type-id-112'/>
+    <qualified-type-def type-id='type-id-31' const='yes' id='type-id-113'/>
+    <reference-type-def kind='lvalue' type-id='type-id-113' size-in-bits='64' id='type-id-114'/>
+    <pointer-type-def type-id='type-id-113' size-in-bits='64' id='type-id-115'/>
+    <pointer-type-def type-id='type-id-31' size-in-bits='64' id='type-id-116'/>
+    <qualified-type-def type-id='type-id-33' const='yes' id='type-id-117'/>
+    <reference-type-def kind='lvalue' type-id='type-id-117' size-in-bits='64' id='type-id-118'/>
+    <qualified-type-def type-id='type-id-35' const='yes' id='type-id-119'/>
+    <reference-type-def kind='lvalue' type-id='type-id-119' size-in-bits='64' id='type-id-120'/>
+    <qualified-type-def type-id='type-id-120' id='type-id-121'/>
+    <function-decl name='foo' mangled-name='_Z3fooRKSs' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='14' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Z3fooRKSs'>
+      <parameter type-id='type-id-121' name='s' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='14' column='1'/>
+      <return type-id='type-id-35'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-2' size-in-bits='64' id='type-id-122'/>
+    <function-decl name='bar' mangled-name='_Z3barRKSs' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Z3barRKSs'>
+      <parameter type-id='type-id-121' name='str' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='21' column='1'/>
+      <return type-id='type-id-122'/>
+    </function-decl>
+    <var-decl name='__dso_handle' type-id='type-id-46' visibility='default'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-write/test28-without-std-vars.xml b/tests/data/test-read-write/test28-without-std-vars.xml
new file mode 100644 (file)
index 0000000..aca4252
--- /dev/null
@@ -0,0 +1,841 @@
+<abi-corpus path='tests/data/test-read-dwarf/libtest24-drop-fns.so' architecture='elf-amd-x86_64'>
+  <elf-needed>
+    <dependency name='libgcc_s.so.1'/>
+    <dependency name='libc.so.6'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <elf-symbol name='_Z3barRKSs' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_Z3fooRKSs' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_ZNSt11char_traitsIcE6lengthEPKc' type='func-type' binding='weak-binding' is-defined='yes'/>
+    <elf-symbol name='_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_' type='func-type' binding='weak-binding' is-defined='yes'/>
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_init' type='func-type' binding='global-binding' is-defined='yes'/>
+  </elf-function-symbols>
+  <abi-instr version='1.0' address-size='64' path='test24-drop-fns.cc' language='LANG_C_plus_plus'>
+    <namespace-decl name='std'>
+      <namespace-decl name='__debug'>
+      </namespace-decl>
+      <class-decl name='basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-1'/>
+      <typedef-decl name='ostream' type-id='type-id-1' filepath='/usr/include/c++/5.3.1/iosfwd' line='141' column='1' id='type-id-2'/>
+      <var-decl name='cout' type-id='type-id-2' mangled-name='_ZSt4cout' visibility='default' filepath='/usr/include/c++/5.3.1/iostream' line='61' column='1'/>
+      <class-decl name='basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;' size-in-bits='64' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2510' column='1' id='type-id-3'>
+        <member-type access='private'>
+          <class-decl name='_Alloc_hider' size-in-bits='64' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2670' column='1' id='type-id-4'>
+            <base-class access='public' layout-offset-in-bits='0' type-id='type-id-5'/>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='_M_p' type-id='type-id-6' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2675' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-8' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2519' column='1' id='type-id-7'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='allocator_type' type-id='type-id-5' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2518' column='1' id='type-id-9'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-11' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2521' column='1' id='type-id-10'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-13' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2522' column='1' id='type-id-12'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='iterator' type-id='type-id-15' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2525' column='1' id='type-id-14'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_iterator' type-id='type-id-17' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2527' column='1' id='type-id-16'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reverse_iterator' type-id='type-id-19' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2528' column='1' id='type-id-18'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reverse_iterator' type-id='type-id-21' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2529' column='1' id='type-id-20'/>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='_Rep_base' size-in-bits='192' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2546' column='1' id='type-id-22'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='_M_length' type-id='type-id-7' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2548' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='_M_capacity' type-id='type-id-7' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2549' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='_M_refcount' type-id='type-id-23' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2550' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='_Rep' size-in-bits='192' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2553' column='1' id='type-id-24'>
+            <base-class access='public' layout-offset-in-bits='0' type-id='type-id-22'/>
+            <data-member access='public' static='yes'>
+              <var-decl name='_S_max_size' type-id='type-id-25' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='494' column='1'/>
+            </data-member>
+            <data-member access='public' static='yes'>
+              <var-decl name='_S_terminal' type-id='type-id-26' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='499' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <data-member access='public' static='yes'>
+          <var-decl name='npos' type-id='type-id-25' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2683' column='1'/>
+        </data-member>
+        <data-member access='private' layout-offset-in-bits='0'>
+          <var-decl name='_M_dataplus' type-id='type-id-4' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2687' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='allocator&lt;char&gt;' size-in-bits='8' visibility='default' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='92' column='1' id='type-id-5'>
+        <base-class access='public' layout-offset-in-bits='0' type-id='type-id-27'/>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-28' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='95' column='1' id='type-id-8'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-29' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='99' column='1' id='type-id-11'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-30' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='100' column='1' id='type-id-13'/>
+        </member-type>
+      </class-decl>
+      <typedef-decl name='size_t' type-id='type-id-31' filepath='/usr/include/c++/5.3.1/x86_64-redhat-linux/bits/c++config.h' line='1969' column='1' id='type-id-28'/>
+      <class-decl name='reverse_iterator&lt;__gnu_cxx::__normal_iterator&lt;char const*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-19'/>
+      <class-decl name='reverse_iterator&lt;__gnu_cxx::__normal_iterator&lt;char*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-21'/>
+      <class-decl name='char_traits&lt;char&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='233' column='1' id='type-id-32'>
+        <member-type access='public'>
+          <typedef-decl name='char_type' type-id='type-id-34' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='235' column='1' id='type-id-33'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='int_type' type-id='type-id-36' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='236' column='1' id='type-id-35'/>
+        </member-type>
+      </class-decl>
+      <typedef-decl name='string' type-id='type-id-3' filepath='/usr/include/c++/5.3.1/bits/stringfwd.h' line='74' column='1' id='type-id-37'/>
+    </namespace-decl>
+    <namespace-decl name='__gnu_cxx'>
+      <namespace-decl name='__ops'>
+      </namespace-decl>
+      <class-decl name='new_allocator&lt;char&gt;' size-in-bits='8' visibility='default' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='58' column='1' id='type-id-27'>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-28' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='61' column='1' id='type-id-38'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='pointer' type-id='type-id-6' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='63' column='1' id='type-id-39'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_pointer' type-id='type-id-41' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='64' column='1' id='type-id-40'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-29' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='65' column='1' id='type-id-42'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-30' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='66' column='1' id='type-id-43'/>
+        </member-type>
+        <member-function access='public'>
+          <function-decl name='new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcEC4Ev' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='79' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcEC4ERKS1_' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-46'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' destructor='yes'>
+          <function-decl name='~new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcED4Ev' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-36' is-artificial='yes'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='address' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE7addressERc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='89' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-47' is-artificial='yes'/>
+            <parameter type-id='type-id-42'/>
+            <return type-id='type-id-39'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='address' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE7addressERKc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='93' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-47' is-artificial='yes'/>
+            <parameter type-id='type-id-43'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='allocate' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='99' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-38'/>
+            <parameter type-id='type-id-48'/>
+            <return type-id='type-id-39'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='deallocate' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE10deallocateEPcm' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='109' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-38'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='max_size' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE8max_sizeEv' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='113' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-47' is-artificial='yes'/>
+            <return type-id='type-id-38'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='construct' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE9constructEPcRKc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='129' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-30'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='destroy' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE7destroyEPc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+      </class-decl>
+      <class-decl name='__normal_iterator&lt;char*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-15'/>
+      <class-decl name='__normal_iterator&lt;char const*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-17'/>
+      <class-decl name='__numeric_traits_integer&lt;int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-49'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-50' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIiE5__minE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-50' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIiE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;long unsigned int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-52'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-53' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-53' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerImE8__digitsE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;char&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-54'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-26' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-26' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIcE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;short int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-55'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-56' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIsE5__minE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-56' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIsE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;long int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-57'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-58' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIlE5__minE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-58' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIlE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+    </namespace-decl>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-31'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-34'/>
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-6'/>
+    <qualified-type-def type-id='type-id-34' const='yes' id='type-id-26'/>
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-41'/>
+    <reference-type-def kind='lvalue' type-id='type-id-34' size-in-bits='64' id='type-id-29'/>
+    <reference-type-def kind='lvalue' type-id='type-id-26' size-in-bits='64' id='type-id-30'/>
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-44'/>
+    <type-decl name='void' id='type-id-45'/>
+    <qualified-type-def type-id='type-id-27' const='yes' id='type-id-59'/>
+    <reference-type-def kind='lvalue' type-id='type-id-59' size-in-bits='64' id='type-id-46'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-36'/>
+    <pointer-type-def type-id='type-id-59' size-in-bits='64' id='type-id-47'/>
+    <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-48'/>
+    <qualified-type-def type-id='type-id-36' const='yes' id='type-id-50'/>
+    <type-decl name='bool' size-in-bits='8' id='type-id-60'/>
+    <qualified-type-def type-id='type-id-60' const='yes' id='type-id-51'/>
+    <qualified-type-def type-id='type-id-31' const='yes' id='type-id-53'/>
+    <type-decl name='short int' size-in-bits='16' id='type-id-61'/>
+    <qualified-type-def type-id='type-id-61' const='yes' id='type-id-56'/>
+    <type-decl name='long int' size-in-bits='64' id='type-id-62'/>
+    <qualified-type-def type-id='type-id-62' const='yes' id='type-id-58'/>
+    <typedef-decl name='_Atomic_word' type-id='type-id-36' filepath='/usr/include/c++/5.3.1/x86_64-redhat-linux/bits/atomic_word.h' line='32' column='1' id='type-id-23'/>
+    <qualified-type-def type-id='type-id-7' const='yes' id='type-id-25'/>
+    <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-63'/>
+    <qualified-type-def type-id='type-id-5' const='yes' id='type-id-64'/>
+    <reference-type-def kind='lvalue' type-id='type-id-64' size-in-bits='64' id='type-id-65'/>
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-66'/>
+    <reference-type-def kind='lvalue' type-id='type-id-24' size-in-bits='64' id='type-id-67'/>
+    <qualified-type-def type-id='type-id-24' const='yes' id='type-id-68'/>
+    <pointer-type-def type-id='type-id-68' size-in-bits='64' id='type-id-69'/>
+    <pointer-type-def type-id='type-id-24' size-in-bits='64' id='type-id-70'/>
+    <qualified-type-def type-id='type-id-3' const='yes' id='type-id-71'/>
+    <pointer-type-def type-id='type-id-71' size-in-bits='64' id='type-id-72'/>
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-73'/>
+    <reference-type-def kind='lvalue' type-id='type-id-71' size-in-bits='64' id='type-id-74'/>
+    <reference-type-def kind='lvalue' type-id='type-id-3' size-in-bits='64' id='type-id-75'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-76'/>
+    <typedef-decl name='wint_t' type-id='type-id-76' filepath='/usr/lib/gcc/x86_64-redhat-linux/5.3.1/include/stddef.h' line='357' column='1' id='type-id-77'/>
+    <function-decl name='btowc' filepath='/usr/include/wchar.h' line='353' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <class-decl name='_IO_FILE' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-78'/>
+    <typedef-decl name='__FILE' type-id='type-id-78' filepath='/usr/include/stdio.h' line='64' column='1' id='type-id-79'/>
+    <pointer-type-def type-id='type-id-79' size-in-bits='64' id='type-id-80'/>
+    <function-decl name='fgetwc' filepath='/usr/include/wchar.h' line='745' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <type-decl name='wchar_t' size-in-bits='32' id='type-id-81'/>
+    <pointer-type-def type-id='type-id-81' size-in-bits='64' id='type-id-82'/>
+    <function-decl name='fgetws' filepath='/usr/include/wchar.h' line='774' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-36'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='fputwc' filepath='/usr/include/wchar.h' line='759' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <qualified-type-def type-id='type-id-81' const='yes' id='type-id-83'/>
+    <pointer-type-def type-id='type-id-83' size-in-bits='64' id='type-id-84'/>
+    <function-decl name='fputws' filepath='/usr/include/wchar.h' line='781' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='fwide' filepath='/usr/include/wchar.h' line='587' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='fwprintf' filepath='/usr/include/wchar.h' line='594' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='fwscanf' filepath='/usr/include/wchar.h' line='635' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='getwc' filepath='/usr/include/wchar.h' line='746' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='getwchar' filepath='/usr/include/wchar.h' line='752' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <typedef-decl name='size_t' type-id='type-id-31' filepath='/usr/lib/gcc/x86_64-redhat-linux/5.3.1/include/stddef.h' line='216' column='1' id='type-id-85'/>
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/wchar.h' line='83' column='1' id='type-id-86'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='__count' type-id='type-id-36' visibility='default' filepath='/usr/include/wchar.h' line='84' column='1'/>
+      </data-member>
+    </class-decl>
+    <typedef-decl name='__mbstate_t' type-id='type-id-86' filepath='/usr/include/wchar.h' line='94' column='1' id='type-id-87'/>
+    <typedef-decl name='mbstate_t' type-id='type-id-87' filepath='/usr/include/wchar.h' line='106' column='1' id='type-id-88'/>
+    <pointer-type-def type-id='type-id-88' size-in-bits='64' id='type-id-89'/>
+    <function-decl name='mbrlen' filepath='/usr/include/wchar.h' line='376' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-41'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='mbrtowc' filepath='/usr/include/wchar.h' line='365' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-41'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <qualified-type-def type-id='type-id-88' const='yes' id='type-id-90'/>
+    <pointer-type-def type-id='type-id-90' size-in-bits='64' id='type-id-91'/>
+    <function-decl name='mbsinit' filepath='/usr/include/wchar.h' line='361' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-91'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-41' size-in-bits='64' id='type-id-92'/>
+    <function-decl name='mbsrtowcs' filepath='/usr/include/wchar.h' line='408' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-92'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='putwc' filepath='/usr/include/wchar.h' line='760' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='putwchar' filepath='/usr/include/wchar.h' line='766' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-81'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='swprintf' filepath='/usr/include/wchar.h' line='604' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='swscanf' filepath='/usr/include/wchar.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='ungetwc' filepath='/usr/include/wchar.h' line='789' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <class-decl name='typedef __va_list_tag __va_list_tag' size-in-bits='192' is-struct='yes' visibility='default' id='type-id-93'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='gp_offset' type-id='type-id-76' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <var-decl name='fp_offset' type-id='type-id-76' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='overflow_arg_area' type-id='type-id-48' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='reg_save_area' type-id='type-id-48' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <pointer-type-def type-id='type-id-93' size-in-bits='64' id='type-id-94'/>
+    <function-decl name='vfwprintf' filepath='/usr/include/wchar.h' line='612' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vfwscanf' filepath='/usr/include/wchar.h' line='689' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vswprintf' filepath='/usr/include/wchar.h' line='625' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vswscanf' filepath='/usr/include/wchar.h' line='701' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vwprintf' filepath='/usr/include/wchar.h' line='620' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vwscanf' filepath='/usr/include/wchar.h' line='697' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcrtomb' filepath='/usr/include/wchar.h' line='370' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-6'/>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcscat' filepath='/usr/include/wchar.h' line='155' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcscmp' filepath='/usr/include/wchar.h' line='163' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcscoll' filepath='/usr/include/wchar.h' line='192' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcscpy' filepath='/usr/include/wchar.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcscspn' filepath='/usr/include/wchar.h' line='252' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <class-decl name='tm' size-in-bits='448' is-struct='yes' visibility='default' filepath='/usr/include/time.h' line='133' column='1' id='type-id-95'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='tm_sec' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='135' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <var-decl name='tm_min' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='136' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='tm_hour' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='137' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <var-decl name='tm_mday' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='138' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='tm_mon' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='139' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <var-decl name='tm_year' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='140' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <var-decl name='tm_wday' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='141' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='224'>
+        <var-decl name='tm_yday' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='142' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <var-decl name='tm_isdst' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='143' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <var-decl name='tm_gmtoff' type-id='type-id-62' visibility='default' filepath='/usr/include/time.h' line='146' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <var-decl name='tm_zone' type-id='type-id-41' visibility='default' filepath='/usr/include/time.h' line='147' column='1'/>
+      </data-member>
+    </class-decl>
+    <qualified-type-def type-id='type-id-95' const='yes' id='type-id-96'/>
+    <pointer-type-def type-id='type-id-96' size-in-bits='64' id='type-id-97'/>
+    <function-decl name='wcsftime' filepath='/usr/include/wchar.h' line='855' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-97'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcslen' filepath='/usr/include/wchar.h' line='287' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcsncat' filepath='/usr/include/wchar.h' line='158' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcsncmp' filepath='/usr/include/wchar.h' line='166' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcsncpy' filepath='/usr/include/wchar.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-84' size-in-bits='64' id='type-id-98'/>
+    <function-decl name='wcsrtombs' filepath='/usr/include/wchar.h' line='414' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-6'/>
+      <parameter type-id='type-id-98'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcsspn' filepath='/usr/include/wchar.h' line='256' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <type-decl name='double' size-in-bits='64' id='type-id-99'/>
+    <pointer-type-def type-id='type-id-82' size-in-bits='64' id='type-id-100'/>
+    <function-decl name='wcstod' filepath='/usr/include/wchar.h' line='450' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-99'/>
+    </function-decl>
+    <type-decl name='float' size-in-bits='32' id='type-id-101'/>
+    <function-decl name='wcstof' filepath='/usr/include/wchar.h' line='457' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-101'/>
+    </function-decl>
+    <function-decl name='wcstok' filepath='/usr/include/wchar.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcstol' filepath='/usr/include/wchar.h' line='468' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-62'/>
+    </function-decl>
+    <function-decl name='wcstoul' filepath='/usr/include/wchar.h' line='473' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-31'/>
+    </function-decl>
+    <function-decl name='wcsxfrm' filepath='/usr/include/wchar.h' line='196' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wctob' filepath='/usr/include/wchar.h' line='357' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wmemcmp' filepath='/usr/include/wchar.h' line='325' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wmemcpy' filepath='/usr/include/wchar.h' line='329' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wmemmove' filepath='/usr/include/wchar.h' line='334' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wmemset' filepath='/usr/include/wchar.h' line='338' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wprintf' filepath='/usr/include/wchar.h' line='601' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wscanf' filepath='/usr/include/wchar.h' line='642' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcschr' mangled-name='wcschr' filepath='/usr/include/wchar.h' line='224' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-81'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wcspbrk' mangled-name='wcspbrk' filepath='/usr/include/wchar.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wcsrchr' mangled-name='wcsrchr' filepath='/usr/include/wchar.h' line='234' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-81'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wcsstr' mangled-name='wcsstr' filepath='/usr/include/wchar.h' line='273' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wmemchr' mangled-name='wmemchr' filepath='/usr/include/wchar.h' line='316' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <type-decl name='long double' size-in-bits='128' id='type-id-102'/>
+    <function-decl name='wcstold' filepath='/usr/include/wchar.h' line='459' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-102'/>
+    </function-decl>
+    <type-decl name='long long int' size-in-bits='64' id='type-id-103'/>
+    <function-decl name='wcstoll' filepath='/usr/include/wchar.h' line='483' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-103'/>
+    </function-decl>
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-104'/>
+    <function-decl name='wcstoull' filepath='/usr/include/wchar.h' line='490' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-104'/>
+    </function-decl>
+    <namespace-decl name='__gnu_debug'>
+    </namespace-decl>
+    <function-decl name='setlocale' filepath='/usr/include/locale.h' line='124' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-36'/>
+      <parameter type-id='type-id-41'/>
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <class-decl name='lconv' size-in-bits='768' is-struct='yes' visibility='default' filepath='/usr/include/locale.h' line='53' column='1' id='type-id-105'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='decimal_point' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='thousands_sep' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='grouping' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <var-decl name='int_curr_symbol' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <var-decl name='currency_symbol' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='71' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <var-decl name='mon_decimal_point' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <var-decl name='mon_thousands_sep' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <var-decl name='mon_grouping' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <var-decl name='positive_sign' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <var-decl name='negative_sign' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='76' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <var-decl name='int_frac_digits' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='648'>
+        <var-decl name='frac_digits' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='656'>
+        <var-decl name='p_cs_precedes' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='80' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='664'>
+        <var-decl name='p_sep_by_space' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='672'>
+        <var-decl name='n_cs_precedes' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='680'>
+        <var-decl name='n_sep_by_space' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='688'>
+        <var-decl name='p_sign_posn' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='93' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='696'>
+        <var-decl name='n_sign_posn' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='94' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <var-decl name='int_p_cs_precedes' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='97' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='712'>
+        <var-decl name='int_p_sep_by_space' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='99' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='720'>
+        <var-decl name='int_n_cs_precedes' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='101' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='728'>
+        <var-decl name='int_n_sep_by_space' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='103' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='736'>
+        <var-decl name='int_p_sign_posn' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='110' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='744'>
+        <var-decl name='int_n_sign_posn' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='111' column='1'/>
+      </data-member>
+    </class-decl>
+    <pointer-type-def type-id='type-id-105' size-in-bits='64' id='type-id-106'/>
+    <function-decl name='localeconv' filepath='/usr/include/locale.h' line='127' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <return type-id='type-id-106'/>
+    </function-decl>
+    <typedef-decl name='wctype_t' type-id='type-id-31' filepath='/usr/include/wctype.h' line='52' column='1' id='type-id-107'/>
+    <function-decl name='iswctype' filepath='/usr/include/wctype.h' line='175' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <parameter type-id='type-id-107'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <typedef-decl name='__int32_t' type-id='type-id-36' filepath='/usr/include/bits/types.h' line='40' column='1' id='type-id-108'/>
+    <qualified-type-def type-id='type-id-108' const='yes' id='type-id-109'/>
+    <pointer-type-def type-id='type-id-109' size-in-bits='64' id='type-id-110'/>
+    <typedef-decl name='wctrans_t' type-id='type-id-110' filepath='/usr/include/wctype.h' line='186' column='1' id='type-id-111'/>
+    <function-decl name='towctrans' filepath='/usr/include/wctype.h' line='221' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <parameter type-id='type-id-111'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='wctrans' filepath='/usr/include/wctype.h' line='218' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-41'/>
+      <return type-id='type-id-111'/>
+    </function-decl>
+    <function-decl name='wctype' filepath='/usr/include/wctype.h' line='171' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-41'/>
+      <return type-id='type-id-107'/>
+    </function-decl>
+    <reference-type-def kind='lvalue' type-id='type-id-33' size-in-bits='64' id='type-id-112'/>
+    <qualified-type-def type-id='type-id-33' const='yes' id='type-id-113'/>
+    <reference-type-def kind='lvalue' type-id='type-id-113' size-in-bits='64' id='type-id-114'/>
+    <pointer-type-def type-id='type-id-113' size-in-bits='64' id='type-id-115'/>
+    <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-116'/>
+    <qualified-type-def type-id='type-id-35' const='yes' id='type-id-117'/>
+    <reference-type-def kind='lvalue' type-id='type-id-117' size-in-bits='64' id='type-id-118'/>
+    <qualified-type-def type-id='type-id-37' const='yes' id='type-id-119'/>
+    <reference-type-def kind='lvalue' type-id='type-id-119' size-in-bits='64' id='type-id-120'/>
+    <qualified-type-def type-id='type-id-120' id='type-id-121'/>
+    <function-decl name='foo' mangled-name='_Z3fooRKSs' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='14' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Z3fooRKSs'>
+      <parameter type-id='type-id-121' name='s' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='14' column='1'/>
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-2' size-in-bits='64' id='type-id-122'/>
+    <function-decl name='bar' mangled-name='_Z3barRKSs' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Z3barRKSs'>
+      <parameter type-id='type-id-121' name='str' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='21' column='1'/>
+      <return type-id='type-id-122'/>
+    </function-decl>
+    <var-decl name='__dso_handle' type-id='type-id-48' visibility='default'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-write/test28.xml b/tests/data/test-read-write/test28.xml
new file mode 100644 (file)
index 0000000..094c0cd
--- /dev/null
@@ -0,0 +1,841 @@
+<abi-corpus path='tests/data/test-read-dwarf/libtest24-drop-fns.so'>
+  <elf-needed>
+    <dependency name='libgcc_s.so.1'/>
+    <dependency name='libc.so.6'/>
+  </elf-needed>
+  <elf-function-symbols>
+    <elf-symbol name='_Z3barRKSs' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_Z3fooRKSs' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_ZNSt11char_traitsIcE6lengthEPKc' type='func-type' binding='weak-binding' is-defined='yes'/>
+    <elf-symbol name='_ZStplIcSt11char_traitsIcESaIcEESbIT_T0_T1_EPKS3_RKS6_' type='func-type' binding='weak-binding' is-defined='yes'/>
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' is-defined='yes'/>
+    <elf-symbol name='_init' type='func-type' binding='global-binding' is-defined='yes'/>
+  </elf-function-symbols>
+  <abi-instr version='1.0' address-size='64' path='test24-drop-fns.cc' language='LANG_C_plus_plus'>
+    <namespace-decl name='std'>
+      <namespace-decl name='__debug'>
+      </namespace-decl>
+      <class-decl name='basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-1'/>
+      <typedef-decl name='ostream' type-id='type-id-1' filepath='/usr/include/c++/5.3.1/iosfwd' line='141' column='1' id='type-id-2'/>
+      <var-decl name='cout' type-id='type-id-2' mangled-name='_ZSt4cout' visibility='default' filepath='/usr/include/c++/5.3.1/iostream' line='61' column='1'/>
+      <class-decl name='basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;' size-in-bits='64' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2510' column='1' id='type-id-3'>
+        <member-type access='private'>
+          <class-decl name='_Alloc_hider' size-in-bits='64' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2670' column='1' id='type-id-4'>
+            <base-class access='public' layout-offset-in-bits='0' type-id='type-id-5'/>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='_M_p' type-id='type-id-6' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2675' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-8' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2519' column='1' id='type-id-7'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='allocator_type' type-id='type-id-5' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2518' column='1' id='type-id-9'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-11' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2521' column='1' id='type-id-10'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-13' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2522' column='1' id='type-id-12'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='iterator' type-id='type-id-15' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2525' column='1' id='type-id-14'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_iterator' type-id='type-id-17' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2527' column='1' id='type-id-16'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reverse_iterator' type-id='type-id-19' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2528' column='1' id='type-id-18'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reverse_iterator' type-id='type-id-21' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2529' column='1' id='type-id-20'/>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='_Rep_base' size-in-bits='192' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2546' column='1' id='type-id-22'>
+            <data-member access='public' layout-offset-in-bits='0'>
+              <var-decl name='_M_length' type-id='type-id-7' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2548' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='64'>
+              <var-decl name='_M_capacity' type-id='type-id-7' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2549' column='1'/>
+            </data-member>
+            <data-member access='public' layout-offset-in-bits='128'>
+              <var-decl name='_M_refcount' type-id='type-id-23' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2550' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <member-type access='private'>
+          <class-decl name='_Rep' size-in-bits='192' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2553' column='1' id='type-id-24'>
+            <base-class access='public' layout-offset-in-bits='0' type-id='type-id-22'/>
+            <data-member access='public' static='yes'>
+              <var-decl name='_S_max_size' type-id='type-id-25' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='494' column='1'/>
+            </data-member>
+            <data-member access='public' static='yes'>
+              <var-decl name='_S_terminal' type-id='type-id-26' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.tcc' line='499' column='1'/>
+            </data-member>
+          </class-decl>
+        </member-type>
+        <data-member access='public' static='yes'>
+          <var-decl name='npos' type-id='type-id-25' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2683' column='1'/>
+        </data-member>
+        <data-member access='private' layout-offset-in-bits='0'>
+          <var-decl name='_M_dataplus' type-id='type-id-4' visibility='default' filepath='/usr/include/c++/5.3.1/bits/basic_string.h' line='2687' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='allocator&lt;char&gt;' size-in-bits='8' visibility='default' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='92' column='1' id='type-id-5'>
+        <base-class access='public' layout-offset-in-bits='0' type-id='type-id-27'/>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-28' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='95' column='1' id='type-id-8'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-29' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='99' column='1' id='type-id-11'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-30' filepath='/usr/include/c++/5.3.1/bits/allocator.h' line='100' column='1' id='type-id-13'/>
+        </member-type>
+      </class-decl>
+      <typedef-decl name='size_t' type-id='type-id-31' filepath='/usr/include/c++/5.3.1/x86_64-redhat-linux/bits/c++config.h' line='1969' column='1' id='type-id-28'/>
+      <class-decl name='reverse_iterator&lt;__gnu_cxx::__normal_iterator&lt;char const*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-19'/>
+      <class-decl name='reverse_iterator&lt;__gnu_cxx::__normal_iterator&lt;char*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-21'/>
+      <class-decl name='char_traits&lt;char&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='233' column='1' id='type-id-32'>
+        <member-type access='public'>
+          <typedef-decl name='char_type' type-id='type-id-34' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='235' column='1' id='type-id-33'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='int_type' type-id='type-id-36' filepath='/usr/include/c++/5.3.1/bits/char_traits.h' line='236' column='1' id='type-id-35'/>
+        </member-type>
+      </class-decl>
+      <typedef-decl name='string' type-id='type-id-3' filepath='/usr/include/c++/5.3.1/bits/stringfwd.h' line='74' column='1' id='type-id-37'/>
+    </namespace-decl>
+    <namespace-decl name='__gnu_cxx'>
+      <namespace-decl name='__ops'>
+      </namespace-decl>
+      <class-decl name='new_allocator&lt;char&gt;' size-in-bits='8' visibility='default' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='58' column='1' id='type-id-27'>
+        <member-type access='public'>
+          <typedef-decl name='size_type' type-id='type-id-28' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='61' column='1' id='type-id-38'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='pointer' type-id='type-id-6' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='63' column='1' id='type-id-39'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_pointer' type-id='type-id-41' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='64' column='1' id='type-id-40'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='reference' type-id='type-id-29' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='65' column='1' id='type-id-42'/>
+        </member-type>
+        <member-type access='public'>
+          <typedef-decl name='const_reference' type-id='type-id-30' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='66' column='1' id='type-id-43'/>
+        </member-type>
+        <member-function access='public'>
+          <function-decl name='new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcEC4Ev' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='79' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcEC4ERKS1_' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='81' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-46'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public' destructor='yes'>
+          <function-decl name='~new_allocator' mangled-name='_ZN9__gnu_cxx13new_allocatorIcED4Ev' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='86' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-36' is-artificial='yes'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='address' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE7addressERc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='89' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-47' is-artificial='yes'/>
+            <parameter type-id='type-id-42'/>
+            <return type-id='type-id-39'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='address' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE7addressERKc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='93' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-47' is-artificial='yes'/>
+            <parameter type-id='type-id-43'/>
+            <return type-id='type-id-40'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='allocate' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE8allocateEmPKv' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='99' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-38'/>
+            <parameter type-id='type-id-48'/>
+            <return type-id='type-id-39'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='deallocate' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE10deallocateEPcm' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='109' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-38'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='max_size' mangled-name='_ZNK9__gnu_cxx13new_allocatorIcE8max_sizeEv' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='113' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-47' is-artificial='yes'/>
+            <return type-id='type-id-38'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='construct' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE9constructEPcRKc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='129' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <parameter type-id='type-id-30'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+        <member-function access='public'>
+          <function-decl name='destroy' mangled-name='_ZN9__gnu_cxx13new_allocatorIcE7destroyEPc' filepath='/usr/include/c++/5.3.1/ext/new_allocator.h' line='133' column='1' visibility='default' binding='global' size-in-bits='64'>
+            <parameter type-id='type-id-44' is-artificial='yes'/>
+            <parameter type-id='type-id-39'/>
+            <return type-id='type-id-45'/>
+          </function-decl>
+        </member-function>
+      </class-decl>
+      <class-decl name='__normal_iterator&lt;char*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-15'/>
+      <class-decl name='__normal_iterator&lt;char const*, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;' visibility='default' is-declaration-only='yes' id='type-id-17'/>
+      <class-decl name='__numeric_traits_integer&lt;int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-49'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-50' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIiE5__minE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-50' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIiE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;long unsigned int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-52'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-53' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-53' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerImE8__digitsE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;char&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-54'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-26' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-26' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIcE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;short int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-55'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-56' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIsE5__minE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-56' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIsE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+      <class-decl name='__numeric_traits_integer&lt;long int&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='55' column='1' id='type-id-57'>
+        <data-member access='public' static='yes'>
+          <var-decl name='__min' type-id='type-id-58' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIlE5__minE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='58' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__max' type-id='type-id-58' mangled-name='_ZN9__gnu_cxx24__numeric_traits_integerIlE5__maxE' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='59' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__is_signed' type-id='type-id-51' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='63' column='1'/>
+        </data-member>
+        <data-member access='public' static='yes'>
+          <var-decl name='__digits' type-id='type-id-50' visibility='default' filepath='/usr/include/c++/5.3.1/ext/numeric_traits.h' line='64' column='1'/>
+        </data-member>
+      </class-decl>
+    </namespace-decl>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-31'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-34'/>
+    <pointer-type-def type-id='type-id-34' size-in-bits='64' id='type-id-6'/>
+    <qualified-type-def type-id='type-id-34' const='yes' id='type-id-26'/>
+    <pointer-type-def type-id='type-id-26' size-in-bits='64' id='type-id-41'/>
+    <reference-type-def kind='lvalue' type-id='type-id-34' size-in-bits='64' id='type-id-29'/>
+    <reference-type-def kind='lvalue' type-id='type-id-26' size-in-bits='64' id='type-id-30'/>
+    <pointer-type-def type-id='type-id-27' size-in-bits='64' id='type-id-44'/>
+    <type-decl name='void' id='type-id-45'/>
+    <qualified-type-def type-id='type-id-27' const='yes' id='type-id-59'/>
+    <reference-type-def kind='lvalue' type-id='type-id-59' size-in-bits='64' id='type-id-46'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-36'/>
+    <pointer-type-def type-id='type-id-59' size-in-bits='64' id='type-id-47'/>
+    <pointer-type-def type-id='type-id-45' size-in-bits='64' id='type-id-48'/>
+    <qualified-type-def type-id='type-id-36' const='yes' id='type-id-50'/>
+    <type-decl name='bool' size-in-bits='8' id='type-id-60'/>
+    <qualified-type-def type-id='type-id-60' const='yes' id='type-id-51'/>
+    <qualified-type-def type-id='type-id-31' const='yes' id='type-id-53'/>
+    <type-decl name='short int' size-in-bits='16' id='type-id-61'/>
+    <qualified-type-def type-id='type-id-61' const='yes' id='type-id-56'/>
+    <type-decl name='long int' size-in-bits='64' id='type-id-62'/>
+    <qualified-type-def type-id='type-id-62' const='yes' id='type-id-58'/>
+    <typedef-decl name='_Atomic_word' type-id='type-id-36' filepath='/usr/include/c++/5.3.1/x86_64-redhat-linux/bits/atomic_word.h' line='32' column='1' id='type-id-23'/>
+    <qualified-type-def type-id='type-id-7' const='yes' id='type-id-25'/>
+    <pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-63'/>
+    <qualified-type-def type-id='type-id-5' const='yes' id='type-id-64'/>
+    <reference-type-def kind='lvalue' type-id='type-id-64' size-in-bits='64' id='type-id-65'/>
+    <pointer-type-def type-id='type-id-4' size-in-bits='64' id='type-id-66'/>
+    <reference-type-def kind='lvalue' type-id='type-id-24' size-in-bits='64' id='type-id-67'/>
+    <qualified-type-def type-id='type-id-24' const='yes' id='type-id-68'/>
+    <pointer-type-def type-id='type-id-68' size-in-bits='64' id='type-id-69'/>
+    <pointer-type-def type-id='type-id-24' size-in-bits='64' id='type-id-70'/>
+    <qualified-type-def type-id='type-id-3' const='yes' id='type-id-71'/>
+    <pointer-type-def type-id='type-id-71' size-in-bits='64' id='type-id-72'/>
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-73'/>
+    <reference-type-def kind='lvalue' type-id='type-id-71' size-in-bits='64' id='type-id-74'/>
+    <reference-type-def kind='lvalue' type-id='type-id-3' size-in-bits='64' id='type-id-75'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-76'/>
+    <typedef-decl name='wint_t' type-id='type-id-76' filepath='/usr/lib/gcc/x86_64-redhat-linux/5.3.1/include/stddef.h' line='357' column='1' id='type-id-77'/>
+    <function-decl name='btowc' filepath='/usr/include/wchar.h' line='353' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <class-decl name='_IO_FILE' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-78'/>
+    <typedef-decl name='__FILE' type-id='type-id-78' filepath='/usr/include/stdio.h' line='64' column='1' id='type-id-79'/>
+    <pointer-type-def type-id='type-id-79' size-in-bits='64' id='type-id-80'/>
+    <function-decl name='fgetwc' filepath='/usr/include/wchar.h' line='745' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <type-decl name='wchar_t' size-in-bits='32' id='type-id-81'/>
+    <pointer-type-def type-id='type-id-81' size-in-bits='64' id='type-id-82'/>
+    <function-decl name='fgetws' filepath='/usr/include/wchar.h' line='774' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-36'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='fputwc' filepath='/usr/include/wchar.h' line='759' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <qualified-type-def type-id='type-id-81' const='yes' id='type-id-83'/>
+    <pointer-type-def type-id='type-id-83' size-in-bits='64' id='type-id-84'/>
+    <function-decl name='fputws' filepath='/usr/include/wchar.h' line='781' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='fwide' filepath='/usr/include/wchar.h' line='587' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='fwprintf' filepath='/usr/include/wchar.h' line='594' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='fwscanf' filepath='/usr/include/wchar.h' line='635' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='getwc' filepath='/usr/include/wchar.h' line='746' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='getwchar' filepath='/usr/include/wchar.h' line='752' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <typedef-decl name='size_t' type-id='type-id-31' filepath='/usr/lib/gcc/x86_64-redhat-linux/5.3.1/include/stddef.h' line='216' column='1' id='type-id-85'/>
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/wchar.h' line='83' column='1' id='type-id-86'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='__count' type-id='type-id-36' visibility='default' filepath='/usr/include/wchar.h' line='84' column='1'/>
+      </data-member>
+    </class-decl>
+    <typedef-decl name='__mbstate_t' type-id='type-id-86' filepath='/usr/include/wchar.h' line='94' column='1' id='type-id-87'/>
+    <typedef-decl name='mbstate_t' type-id='type-id-87' filepath='/usr/include/wchar.h' line='106' column='1' id='type-id-88'/>
+    <pointer-type-def type-id='type-id-88' size-in-bits='64' id='type-id-89'/>
+    <function-decl name='mbrlen' filepath='/usr/include/wchar.h' line='376' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-41'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='mbrtowc' filepath='/usr/include/wchar.h' line='365' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-41'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <qualified-type-def type-id='type-id-88' const='yes' id='type-id-90'/>
+    <pointer-type-def type-id='type-id-90' size-in-bits='64' id='type-id-91'/>
+    <function-decl name='mbsinit' filepath='/usr/include/wchar.h' line='361' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-91'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-41' size-in-bits='64' id='type-id-92'/>
+    <function-decl name='mbsrtowcs' filepath='/usr/include/wchar.h' line='408' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-92'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='putwc' filepath='/usr/include/wchar.h' line='760' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='putwchar' filepath='/usr/include/wchar.h' line='766' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-81'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='swprintf' filepath='/usr/include/wchar.h' line='604' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='swscanf' filepath='/usr/include/wchar.h' line='645' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='ungetwc' filepath='/usr/include/wchar.h' line='789' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <parameter type-id='type-id-80'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <class-decl name='typedef __va_list_tag __va_list_tag' size-in-bits='192' is-struct='yes' visibility='default' id='type-id-93'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='gp_offset' type-id='type-id-76' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <var-decl name='fp_offset' type-id='type-id-76' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='overflow_arg_area' type-id='type-id-48' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='reg_save_area' type-id='type-id-48' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <pointer-type-def type-id='type-id-93' size-in-bits='64' id='type-id-94'/>
+    <function-decl name='vfwprintf' filepath='/usr/include/wchar.h' line='612' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vfwscanf' filepath='/usr/include/wchar.h' line='689' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-80'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vswprintf' filepath='/usr/include/wchar.h' line='625' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vswscanf' filepath='/usr/include/wchar.h' line='701' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vwprintf' filepath='/usr/include/wchar.h' line='620' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='vwscanf' filepath='/usr/include/wchar.h' line='697' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-94'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcrtomb' filepath='/usr/include/wchar.h' line='370' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-6'/>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcscat' filepath='/usr/include/wchar.h' line='155' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcscmp' filepath='/usr/include/wchar.h' line='163' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcscoll' filepath='/usr/include/wchar.h' line='192' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcscpy' filepath='/usr/include/wchar.h' line='147' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcscspn' filepath='/usr/include/wchar.h' line='252' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <class-decl name='tm' size-in-bits='448' is-struct='yes' visibility='default' filepath='/usr/include/time.h' line='133' column='1' id='type-id-95'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='tm_sec' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='135' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <var-decl name='tm_min' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='136' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='tm_hour' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='137' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='96'>
+        <var-decl name='tm_mday' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='138' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='tm_mon' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='139' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='160'>
+        <var-decl name='tm_year' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='140' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <var-decl name='tm_wday' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='141' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='224'>
+        <var-decl name='tm_yday' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='142' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <var-decl name='tm_isdst' type-id='type-id-36' visibility='default' filepath='/usr/include/time.h' line='143' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <var-decl name='tm_gmtoff' type-id='type-id-62' visibility='default' filepath='/usr/include/time.h' line='146' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <var-decl name='tm_zone' type-id='type-id-41' visibility='default' filepath='/usr/include/time.h' line='147' column='1'/>
+      </data-member>
+    </class-decl>
+    <qualified-type-def type-id='type-id-95' const='yes' id='type-id-96'/>
+    <pointer-type-def type-id='type-id-96' size-in-bits='64' id='type-id-97'/>
+    <function-decl name='wcsftime' filepath='/usr/include/wchar.h' line='855' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-97'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcslen' filepath='/usr/include/wchar.h' line='287' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcsncat' filepath='/usr/include/wchar.h' line='158' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcsncmp' filepath='/usr/include/wchar.h' line='166' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcsncpy' filepath='/usr/include/wchar.h' line='150' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-84' size-in-bits='64' id='type-id-98'/>
+    <function-decl name='wcsrtombs' filepath='/usr/include/wchar.h' line='414' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-6'/>
+      <parameter type-id='type-id-98'/>
+      <parameter type-id='type-id-85'/>
+      <parameter type-id='type-id-89'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wcsspn' filepath='/usr/include/wchar.h' line='256' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <type-decl name='double' size-in-bits='64' id='type-id-99'/>
+    <pointer-type-def type-id='type-id-82' size-in-bits='64' id='type-id-100'/>
+    <function-decl name='wcstod' filepath='/usr/include/wchar.h' line='450' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-99'/>
+    </function-decl>
+    <type-decl name='float' size-in-bits='32' id='type-id-101'/>
+    <function-decl name='wcstof' filepath='/usr/include/wchar.h' line='457' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-101'/>
+    </function-decl>
+    <function-decl name='wcstok' filepath='/usr/include/wchar.h' line='282' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wcstol' filepath='/usr/include/wchar.h' line='468' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-62'/>
+    </function-decl>
+    <function-decl name='wcstoul' filepath='/usr/include/wchar.h' line='473' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-31'/>
+    </function-decl>
+    <function-decl name='wcsxfrm' filepath='/usr/include/wchar.h' line='196' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-85'/>
+    </function-decl>
+    <function-decl name='wctob' filepath='/usr/include/wchar.h' line='357' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wmemcmp' filepath='/usr/include/wchar.h' line='325' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wmemcpy' filepath='/usr/include/wchar.h' line='329' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wmemmove' filepath='/usr/include/wchar.h' line='334' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wmemset' filepath='/usr/include/wchar.h' line='338' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-82'/>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-82'/>
+    </function-decl>
+    <function-decl name='wprintf' filepath='/usr/include/wchar.h' line='601' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wscanf' filepath='/usr/include/wchar.h' line='642' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <function-decl name='wcschr' mangled-name='wcschr' filepath='/usr/include/wchar.h' line='224' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-81'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wcspbrk' mangled-name='wcspbrk' filepath='/usr/include/wchar.h' line='262' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wcsrchr' mangled-name='wcsrchr' filepath='/usr/include/wchar.h' line='234' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-81'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wcsstr' mangled-name='wcsstr' filepath='/usr/include/wchar.h' line='273' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-84'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <function-decl name='wmemchr' mangled-name='wmemchr' filepath='/usr/include/wchar.h' line='316' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-81'/>
+      <parameter type-id='type-id-85'/>
+      <return type-id='type-id-84'/>
+    </function-decl>
+    <type-decl name='long double' size-in-bits='128' id='type-id-102'/>
+    <function-decl name='wcstold' filepath='/usr/include/wchar.h' line='459' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <return type-id='type-id-102'/>
+    </function-decl>
+    <type-decl name='long long int' size-in-bits='64' id='type-id-103'/>
+    <function-decl name='wcstoll' filepath='/usr/include/wchar.h' line='483' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-103'/>
+    </function-decl>
+    <type-decl name='long long unsigned int' size-in-bits='64' id='type-id-104'/>
+    <function-decl name='wcstoull' filepath='/usr/include/wchar.h' line='490' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-84'/>
+      <parameter type-id='type-id-100'/>
+      <parameter type-id='type-id-36'/>
+      <return type-id='type-id-104'/>
+    </function-decl>
+    <namespace-decl name='__gnu_debug'>
+    </namespace-decl>
+    <function-decl name='setlocale' filepath='/usr/include/locale.h' line='124' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-36'/>
+      <parameter type-id='type-id-41'/>
+      <return type-id='type-id-6'/>
+    </function-decl>
+    <class-decl name='lconv' size-in-bits='768' is-struct='yes' visibility='default' filepath='/usr/include/locale.h' line='53' column='1' id='type-id-105'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='decimal_point' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='57' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='thousands_sep' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='58' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='grouping' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='64' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <var-decl name='int_curr_symbol' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='70' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <var-decl name='currency_symbol' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='71' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='320'>
+        <var-decl name='mon_decimal_point' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='72' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='384'>
+        <var-decl name='mon_thousands_sep' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='73' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <var-decl name='mon_grouping' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='74' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='512'>
+        <var-decl name='positive_sign' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='75' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='576'>
+        <var-decl name='negative_sign' type-id='type-id-6' visibility='default' filepath='/usr/include/locale.h' line='76' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='640'>
+        <var-decl name='int_frac_digits' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='77' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='648'>
+        <var-decl name='frac_digits' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='78' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='656'>
+        <var-decl name='p_cs_precedes' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='80' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='664'>
+        <var-decl name='p_sep_by_space' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='82' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='672'>
+        <var-decl name='n_cs_precedes' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='84' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='680'>
+        <var-decl name='n_sep_by_space' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='86' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='688'>
+        <var-decl name='p_sign_posn' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='93' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='696'>
+        <var-decl name='n_sign_posn' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='94' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='704'>
+        <var-decl name='int_p_cs_precedes' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='97' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='712'>
+        <var-decl name='int_p_sep_by_space' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='99' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='720'>
+        <var-decl name='int_n_cs_precedes' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='101' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='728'>
+        <var-decl name='int_n_sep_by_space' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='103' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='736'>
+        <var-decl name='int_p_sign_posn' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='110' column='1'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='744'>
+        <var-decl name='int_n_sign_posn' type-id='type-id-34' visibility='default' filepath='/usr/include/locale.h' line='111' column='1'/>
+      </data-member>
+    </class-decl>
+    <pointer-type-def type-id='type-id-105' size-in-bits='64' id='type-id-106'/>
+    <function-decl name='localeconv' filepath='/usr/include/locale.h' line='127' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <return type-id='type-id-106'/>
+    </function-decl>
+    <typedef-decl name='wctype_t' type-id='type-id-31' filepath='/usr/include/wctype.h' line='52' column='1' id='type-id-107'/>
+    <function-decl name='iswctype' filepath='/usr/include/wctype.h' line='175' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <parameter type-id='type-id-107'/>
+      <return type-id='type-id-36'/>
+    </function-decl>
+    <typedef-decl name='__int32_t' type-id='type-id-36' filepath='/usr/include/bits/types.h' line='40' column='1' id='type-id-108'/>
+    <qualified-type-def type-id='type-id-108' const='yes' id='type-id-109'/>
+    <pointer-type-def type-id='type-id-109' size-in-bits='64' id='type-id-110'/>
+    <typedef-decl name='wctrans_t' type-id='type-id-110' filepath='/usr/include/wctype.h' line='186' column='1' id='type-id-111'/>
+    <function-decl name='towctrans' filepath='/usr/include/wctype.h' line='221' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-77'/>
+      <parameter type-id='type-id-111'/>
+      <return type-id='type-id-77'/>
+    </function-decl>
+    <function-decl name='wctrans' filepath='/usr/include/wctype.h' line='218' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-41'/>
+      <return type-id='type-id-111'/>
+    </function-decl>
+    <function-decl name='wctype' filepath='/usr/include/wctype.h' line='171' column='1' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-41'/>
+      <return type-id='type-id-107'/>
+    </function-decl>
+    <reference-type-def kind='lvalue' type-id='type-id-33' size-in-bits='64' id='type-id-112'/>
+    <qualified-type-def type-id='type-id-33' const='yes' id='type-id-113'/>
+    <reference-type-def kind='lvalue' type-id='type-id-113' size-in-bits='64' id='type-id-114'/>
+    <pointer-type-def type-id='type-id-113' size-in-bits='64' id='type-id-115'/>
+    <pointer-type-def type-id='type-id-33' size-in-bits='64' id='type-id-116'/>
+    <qualified-type-def type-id='type-id-35' const='yes' id='type-id-117'/>
+    <reference-type-def kind='lvalue' type-id='type-id-117' size-in-bits='64' id='type-id-118'/>
+    <qualified-type-def type-id='type-id-37' const='yes' id='type-id-119'/>
+    <reference-type-def kind='lvalue' type-id='type-id-119' size-in-bits='64' id='type-id-120'/>
+    <qualified-type-def type-id='type-id-120' id='type-id-121'/>
+    <function-decl name='foo' mangled-name='_Z3fooRKSs' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='14' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Z3fooRKSs'>
+      <parameter type-id='type-id-121' name='s' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='14' column='1'/>
+      <return type-id='type-id-37'/>
+    </function-decl>
+    <pointer-type-def type-id='type-id-2' size-in-bits='64' id='type-id-122'/>
+    <function-decl name='bar' mangled-name='_Z3barRKSs' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='21' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_Z3barRKSs'>
+      <parameter type-id='type-id-121' name='str' filepath='/home/dodji/git/libabigail.git/suppr/tests/data/test-read-dwarf/test24-drop-fns.cc' line='21' column='1'/>
+      <return type-id='type-id-122'/>
+    </function-decl>
+    <var-decl name='__dso_handle' type-id='type-id-48' visibility='default'/>
+  </abi-instr>
+</abi-corpus>
index 689ca8cd6c548018f60690de6d99eb5f1dcfa9a7..1b6315ef23fd9e190acea5c21d6ea4eabc9293b9 100644 (file)
@@ -1618,6 +1618,46 @@ InOutSpec in_out_specs[] =
     "data/test-diff-suppr/test30-report-1.txt",
     "output/test-diff-suppr/test30-report-1.txt"
   },
+  {
+    "data/test-diff-suppr/libtest31-v0.so",
+    "data/test-diff-suppr/libtest31-v1.so",
+    "",
+    "",
+    "data/test-diff-suppr/libtest31.suppr",
+    "--no-default-suppression --no-show-locs --no-redundant",
+    "data/test-diff-suppr/test31-report-0.txt",
+    "output/test-diff-suppr/test31-report-0.txt"
+  },
+  {
+    "data/test-diff-suppr/libtest31-v0.so",
+    "data/test-diff-suppr/libtest31-v1.so",
+    "",
+    "",
+    "",
+    "--no-default-suppression --no-show-locs --no-redundant",
+    "data/test-diff-suppr/test31-report-1.txt",
+    "output/test-diff-suppr/test31-report-1.txt"
+  },
+  {
+    "data/test-diff-suppr/libtest32-v0.so",
+    "data/test-diff-suppr/libtest32-v1.so",
+    "",
+    "",
+    "",
+    "--no-default-suppression --no-show-locs --no-redundant",
+    "data/test-diff-suppr/test32-report-0.txt",
+    "output/test-diff-suppr/test32-report-0.txt"
+  },
+  {
+    "data/test-diff-suppr/libtest32-v0.so",
+    "data/test-diff-suppr/libtest32-v1.so",
+    "",
+    "",
+    "data/test-diff-suppr/libtest32-0.suppr",
+    "--no-default-suppression --no-show-locs --no-redundant",
+    "data/test-diff-suppr/test32-report-1.txt",
+    "output/test-diff-suppr/test32-report-1.txt"
+  },
   // This should be the last entry
   {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}
 };
@@ -1654,9 +1694,13 @@ main()
 
        if (s->headers_dir1 && strcmp(s->headers_dir1, ""))
          headers_dir1 = s->headers_dir1;
+       else
+         headers_dir1.clear();
 
        if (s->headers_dir2 && strcmp(s->headers_dir2, ""))
          headers_dir2 = s->headers_dir2;
+       else
+         headers_dir2.clear();
 
        if (!ensure_parent_dir_created(out_diff_report_path))
          {
index ba23b9c47a12f8b165ac6259d237fca7e47207b7..245a27abc35bd89c50cbebb84d1cc722b8d65a81 100644 (file)
@@ -41,12 +41,16 @@ using std::ofstream;
 using std::cerr;
 using abigail::tests::get_build_dir;
 using abigail::dwarf_reader::read_corpus_from_elf;
+using abigail::dwarf_reader::read_context;
+using abigail::dwarf_reader::read_context_sptr;
+using abigail::dwarf_reader::create_read_context;
 
 /// This is an aggregate that specifies where a test shall get its
 /// input from, and where it shall write its ouput to.
 struct InOutSpec
 {
   const char* in_elf_path;
+  const char* in_suppr_spec_path;
   const char* in_abi_path;
   const char* out_abi_path;
 };// end struct InOutSpec
@@ -56,126 +60,162 @@ InOutSpec in_out_specs[] =
 {
   {
     "data/test-read-dwarf/test0",
+    "",
     "data/test-read-dwarf/test0.abi",
     "output/test-read-dwarf/test0.abi"
   },
   {
     "data/test-read-dwarf/test1",
+    "",
     "data/test-read-dwarf/test1.abi",
     "output/test-read-dwarf/test1.abi"
   },
   {
     "data/test-read-dwarf/test2.so",
+    "",
     "data/test-read-dwarf/test2.so.abi",
     "output/test-read-dwarf/test2.so.abi"
   },
   {
     "data/test-read-dwarf/test3.so",
+    "",
     "data/test-read-dwarf/test3.so.abi",
     "output/test-read-dwarf/test3.so.abi"
   },
   {
     "data/test-read-dwarf/test4.so",
+    "",
     "data/test-read-dwarf/test4.so.abi",
     "output/test-read-dwarf/test4.so.abi"
   },
   {
     "data/test-read-dwarf/test5.o",
+    "",
     "data/test-read-dwarf/test5.o.abi",
     "output/test-read-dwarf/test5.o.abi"
   },
   {
     "data/test-read-dwarf/test6.so",
+    "",
     "data/test-read-dwarf/test6.so.abi",
     "output/test-read-dwarf/test6.so.abi"
   },
   {
     "data/test-read-dwarf/test7.so",
+    "",
     "data/test-read-dwarf/test7.so.abi",
     "output/test-read-dwarf/test7.so.abi"
   },
   {
     "data/test-read-dwarf/test8-qualified-this-pointer.so",
+    "",
     "data/test-read-dwarf/test8-qualified-this-pointer.so.abi",
     "output/test-read-dwarf/test8-qualified-this-pointer.so.abi"
   },
   {
     "data/test-read-dwarf/test9-pr18818-clang.so",
+    "",
     "data/test-read-dwarf/test9-pr18818-clang.so.abi",
-    "output/test-read-dwarf/test9-pr18818-clang.so.abi",
+    "output/test-read-dwarf/test9-pr18818-clang.so.abi"
   },
   {
     "data/test-read-dwarf/test10-pr18818-gcc.so",
+    "",
     "data/test-read-dwarf/test10-pr18818-gcc.so.abi",
-    "output/test-read-dwarf/test10-pr18818-gcc.so.abi",
+    "output/test-read-dwarf/test10-pr18818-gcc.so.abi"
   },
   {
     "data/test-read-dwarf/test11-pr18828.so",
+    "",
     "data/test-read-dwarf/test11-pr18828.so.abi",
     "output/test-read-dwarf/test11-pr18828.so.abi",
   },
   {
     "data/test-read-dwarf/test12-pr18844.so",
+    "",
     "data/test-read-dwarf/test12-pr18844.so.abi",
     "output/test-read-dwarf/test12-pr18844.so.abi",
   },
   {
     "data/test-read-dwarf/test13-pr18894.so",
+    "",
     "data/test-read-dwarf/test13-pr18894.so.abi",
     "output/test-read-dwarf/test13-pr18894.so.abi",
   },
   {
     "data/test-read-dwarf/test14-pr18893.so",
+    "",
     "data/test-read-dwarf/test14-pr18893.so.abi",
     "output/test-read-dwarf/test14-pr18893.so.abi",
   },
   {
     "data/test-read-dwarf/test15-pr18892.so",
+    "",
     "data/test-read-dwarf/test15-pr18892.so.abi",
     "output/test-read-dwarf/test15-pr18892.so.abi",
   },
   {
     "data/test-read-dwarf/test16-pr18904.so",
+    "",
     "data/test-read-dwarf/test16-pr18904.so.abi",
     "output/test-read-dwarf/test16-pr18904.so.abi",
   },
   {
     "data/test-read-dwarf/test17-pr19027.so",
+    "",
     "data/test-read-dwarf/test17-pr19027.so.abi",
     "output/test-read-dwarf/test17-pr19027.so.abi",
   },
   {
     "data/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so",
+    "",
     "data/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so.abi",
     "output/test-read-dwarf/test18-pr19037-libvtkRenderingLIC-6.1.so.abi",
   },
   {
     "data/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so",
+    "",
     "data/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so.abi",
     "output/test-read-dwarf/test19-pr19023-libtcmalloc_and_profiler.so.abi",
   },
   {
     "data/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so",
+    "",
     "data/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so.abi",
     "output/test-read-dwarf/test20-pr19025-libvtkParallelCore-6.1.so.abi",
   },
   {
     "data/test-read-dwarf/test21-pr19092.so",
+    "",
     "data/test-read-dwarf/test21-pr19092.so.abi",
     "output/test-read-dwarf/test21-pr19092.so.abi",
   },
   {
     "data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so",
+    "",
     "data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi",
     "output/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi",
   },
   {
     "data/test-read-dwarf/libtest23.so",
+    "",
     "data/test-read-dwarf/libtest23.so.abi",
     "output/test-read-dwarf/libtest23.so.abi",
   },
+  {
+    "data/test-read-dwarf/libtest24-drop-fns.so",
+    "data/test-read-dwarf/test24-drop-fns-0.suppr",
+    "data/test-read-dwarf/libtest24-drop-fns.so.abi",
+    "output/test-read-dwarf/libtest24-drop-fns.so.abi",
+  },
+  {
+    "data/test-read-dwarf/libtest24-drop-fns.so",
+    "",
+    "data/test-read-dwarf/libtest24-drop-fns-2.so.abi",
+    "output/test-read-dwarf/libtest24-drop-fns-2.so.abi",
+  },
   // This should be the last entry.
-  {NULL, NULL, NULL}
+  {NULL, NULL, NULL, NULL}
 };
 
 // The global pointer to the testsuite paths.
@@ -192,10 +232,39 @@ const string out_abi_base = string(get_build_dir()) + "/tests/";
 const string in_elf_base  = string(abigail::tests::get_src_dir()) + "/tests/";
 const string in_abi_base = in_elf_base;
 
+using abigail::suppr::suppression_sptr;
+using abigail::suppr::suppressions_type;
+using abigail::suppr::read_suppressions;
+
+/// Set the suppression specification to use when reading the ELF binary.
+///
+/// @param read_ctxt the context used to read the ELF binary.
+///
+/// @param path the path to the suppression specification to read.
+static void
+set_suppressions(read_context& read_ctxt, const string& path)
+{
+  suppressions_type supprs;
+  read_suppressions(path, supprs);
+  add_read_context_suppressions(read_ctxt, supprs);
+}
+
+/// Read the current entry of the global in_out_specs variable and
+/// according to the data it contains, read an ELF binary (possibly
+/// taking its accompanying suppression specification into account),
+/// serialize its ABI into the .abi format, compare that .abi against
+/// a reference one using GNU diff.
+///
+/// Also run abidw --abidiff against the ELF binary specified by the
+/// current entry of in_out_specs.
+///
+/// Note that the current entry of in_out_specs is the one pointed to
+/// by the iospec pointer.  This function increments that pointer
+/// after each invocation.
 void
 handle_in_out_spec(void)
 {
-  string in_elf_path, in_abi_path, out_abi_path;
+  string in_elf_path, in_abi_path, in_suppr_spec_path, out_abi_path;
   abigail::ir::environment_sptr env;
   InOutSpec *s;
 
@@ -211,15 +280,22 @@ handle_in_out_spec(void)
     if (!s)
       pthread_exit(NULL);
     in_elf_path = in_elf_base + s->in_elf_path;
+    if (s->in_suppr_spec_path)
+      in_suppr_spec_path = in_elf_base + s->in_suppr_spec_path;
+    else
+      in_suppr_spec_path.clear();
+
     env.reset(new abigail::ir::environment);
     abigail::dwarf_reader::status status =
       abigail::dwarf_reader::STATUS_UNKNOWN;
-    abigail::corpus_sptr corp =
-      read_corpus_from_elf(in_elf_path,
-                          /*debug_info_root_path=*/0,
-                          env.get(),
-                          /*load_all_types=*/false,
-                          status);
+    read_context_sptr ctxt = create_read_context(in_elf_path,
+                                                /*debug_info_root_path=*/0,
+                                                env.get());
+    assert(ctxt);
+    if (!in_suppr_spec_path.empty())
+      set_suppressions(*ctxt, in_suppr_spec_path);
+
+    abigail::corpus_sptr corp = read_corpus_from_elf(*ctxt, status);
     if (!corp)
       {
        cerr << "failed to read " << in_elf_path << "\n";
index 53855800e1fa7b9a4064643adfe3b1e83b0aefdb..014882dc65744eb69d6155be23233f3ae38408d5 100644 (file)
@@ -26,6 +26,7 @@
 #include <fstream>
 #include <iostream>
 #include <cstdlib>
+#include <cstring>
 #include "abg-ir.h"
 #include "abg-reader.h"
 #include "abg-writer.h"
@@ -54,6 +55,8 @@ using abigail::xml_writer::write_corpus_to_native_xml;
 struct InOutSpec
 {
   const char* in_path;
+  const char* in_suppr_spec_path;
+  const char* ref_out_path;
   const char* out_path;
 };// end struct InOutSpec
 
@@ -61,119 +64,187 @@ struct InOutSpec
 InOutSpec in_out_specs[] =
 {
   {
+    "data/test-read-write/test0.xml",
+    "",
     "data/test-read-write/test0.xml",
     "output/test-read-write/test0.xml"
   },
   {
+    "data/test-read-write/test1.xml",
+    "",
     "data/test-read-write/test1.xml",
     "output/test-read-write/test1.xml"
   },
   {
+    "data/test-read-write/test2.xml",
+    "",
     "data/test-read-write/test2.xml",
     "output/test-read-write/test2.xml"
   },
   {
+    "data/test-read-write/test3.xml",
+    "",
     "data/test-read-write/test3.xml",
     "output/test-read-write/test3.xml"
   },
   {
+    "data/test-read-write/test4.xml",
+    "",
     "data/test-read-write/test4.xml",
     "output/test-read-write/test4.xml"
   },
   {
+    "data/test-read-write/test5.xml",
+    "",
     "data/test-read-write/test5.xml",
     "output/test-read-write/test5.xml"
   },
   {
+    "data/test-read-write/test6.xml",
+    "",
     "data/test-read-write/test6.xml",
     "output/test-read-write/test6.xml"
   },
   {
+    "data/test-read-write/test7.xml",
+    "",
     "data/test-read-write/test7.xml",
     "output/test-read-write/test7.xml"
   },
   {
+    "data/test-read-write/test8.xml",
+    "",
     "data/test-read-write/test8.xml",
     "output/test-read-write/test8.xml"
   },
   {
+    "data/test-read-write/test9.xml",
+    "",
     "data/test-read-write/test9.xml",
     "output/test-read-write/test9.xml"
   },
   {
+    "data/test-read-write/test10.xml",
+    "",
     "data/test-read-write/test10.xml",
     "output/test-read-write/test10.xml"
   },
   {
+    "data/test-read-write/test11.xml",
+    "",
     "data/test-read-write/test11.xml",
     "output/test-read-write/test11.xml"
   },
   {
+    "data/test-read-write/test12.xml",
+    "",
     "data/test-read-write/test12.xml",
     "output/test-read-write/test12.xml"
   },
   {
+    "data/test-read-write/test13.xml",
+    "",
     "data/test-read-write/test13.xml",
     "output/test-read-write/test13.xml"
   },
   {
+    "data/test-read-write/test14.xml",
+    "",
     "data/test-read-write/test14.xml",
     "output/test-read-write/test14.xml"
   },
   {
+    "data/test-read-write/test15.xml",
+    "",
     "data/test-read-write/test15.xml",
     "output/test-read-write/test15.xml"
   },
   {
+    "data/test-read-write/test16.xml",
+    "",
     "data/test-read-write/test16.xml",
     "output/test-read-write/test16.xml"
   },
   {
+    "data/test-read-write/test17.xml",
+    "",
     "data/test-read-write/test17.xml",
     "output/test-read-write/test17.xml"
   },
   {
+    "data/test-read-write/test18.xml",
+    "",
     "data/test-read-write/test18.xml",
     "output/test-read-write/test18.xml"
   },
   {
+    "data/test-read-write/test19.xml",
+    "",
     "data/test-read-write/test19.xml",
     "output/test-read-write/test19.xml"
   },
   {
+    "data/test-read-write/test20.xml",
+    "",
     "data/test-read-write/test20.xml",
     "output/test-read-write/test20.xml"
   },
   {
+    "data/test-read-write/test21.xml",
+    "",
     "data/test-read-write/test21.xml",
     "output/test-read-write/test21.xml"
   },
   {
+    "data/test-read-write/test22.xml",
+    "",
     "data/test-read-write/test22.xml",
     "output/test-read-write/test22.xml"
   },
   {
+    "data/test-read-write/test23.xml",
+    "",
     "data/test-read-write/test23.xml",
     "output/test-read-write/test23.xml"
   },
   {
+    "data/test-read-write/test24.xml",
+    "",
     "data/test-read-write/test24.xml",
     "output/test-read-write/test24.xml"
   },
   {
+    "data/test-read-write/test25.xml",
+    "",
     "data/test-read-write/test25.xml",
     "output/test-read-write/test25.xml"
   },
   {
+    "data/test-read-write/test26.xml",
+    "",
     "data/test-read-write/test26.xml",
     "output/test-read-write/test26.xml"
   },
   {
+    "data/test-read-write/test27.xml",
+    "",
     "data/test-read-write/test27.xml",
     "output/test-read-write/test27.xml"
   },
+  {
+    "data/test-read-write/test28.xml",
+    "data/test-read-write/test28-drop-std-fns.abignore",
+    "data/test-read-write/test28-without-std-fns-ref.xml",
+    "output/test-read-write/test28-without-std-fns.xml"
+  },
+  {
+    "data/test-read-write/test28.xml",
+    "data/test-read-write/test28-drop-std-vars.abignore",
+    "data/test-read-write/test28-without-std-vars-ref.xml",
+    "output/test-read-write/test28-without-std-vars.xml"
+  },
   // This should be the last entry.
-  {NULL, NULL}
+  {NULL, NULL, NULL, NULL}
 };
 
 /// Walk the array of InOutSpecs above, read the input files it points
@@ -184,7 +255,7 @@ main()
   unsigned result = 1;
 
   bool is_ok = true;
-  string in_path, out_path;
+  string in_path, out_path, in_suppr_spec_path, ref_out_path;
   for (InOutSpec* s = in_out_specs; s->in_path; ++s)
     {
       string input_suffix(s->in_path);
@@ -194,21 +265,33 @@ main()
       if (!check_file(in_path, cerr))
        return true;
 
+      string ref_out_path_suffix(s->ref_out_path);
+      ref_out_path =
+       string(abigail::tests::get_src_dir())
+       + "/tests/" + ref_out_path_suffix;
+
+      if (!check_file(ref_out_path, cerr))
+       return true;
+
+      if (s->in_suppr_spec_path && strcmp(s->in_suppr_spec_path, ""))
+       {
+         in_suppr_spec_path = string(s->in_suppr_spec_path);
+         in_suppr_spec_path =
+           string(abigail::tests::get_src_dir())
+           + "/tests/"
+           + in_suppr_spec_path;
+       }
+      else
+       in_suppr_spec_path.clear();
+
       environment_sptr env(new environment);
       translation_unit_sptr tu;
       corpus_sptr corpus;
 
-      bool read = false;
       file_type t = guess_file_type(in_path);
-      if (t == abigail::tools_utils::FILE_TYPE_NATIVE_BI)
-       read = (tu = read_translation_unit_from_file(in_path, env.get()));
-      else if (t == abigail::tools_utils::FILE_TYPE_XML_CORPUS)
-       read = (corpus = read_corpus_from_native_xml_file(in_path, env.get()));
-      else
-       abort();
-      if (!read)
+      if (t == abigail::tools_utils::FILE_TYPE_UNKNOWN)
        {
-         cerr << "failed to read " << in_path << "\n";
+         cerr << in_path << "is an unknown file type\n";
          is_ok = false;
          continue;
        }
@@ -223,35 +306,18 @@ main()
          return result;
        }
 
-      ofstream of(out_path.c_str(), std::ios_base::trunc);
-      if (!of.is_open())
-       {
-         cerr << "failed to read " << out_path << "\n";
-         is_ok = false;
-         continue;
-       }
-
-      bool r = false;
-
-      if (t == abigail::tools_utils::FILE_TYPE_XML_CORPUS)
-       r = write_corpus_to_native_xml(corpus, /*indent=*/0, of);
-      else if (t == abigail::tools_utils::FILE_TYPE_NATIVE_BI)
-       r = write_translation_unit(*tu, /*indent=*/0, of);
-      else
-       abort();
-
-      is_ok = (is_ok && r);
-      of.close();
       string abilint = string(get_build_dir()) + "/tools/abilint";
-      abilint += " --noout";
-      string cmd = abilint + " " + out_path;
+      if (!in_suppr_spec_path.empty())
+       abilint +=string(" --suppr ") + in_suppr_spec_path;
+      string cmd = abilint + " " + in_path + " > " + out_path;
+
       if (system(cmd.c_str()))
        {
          cerr << "ABI XML file doesn't pass abilint: " << out_path << "\n";
          is_ok &= false;
        }
 
-      cmd = "diff -u " + in_path + " " + out_path;
+      cmd = "diff -u " + ref_out_path + " " + out_path;
       if (system(cmd.c_str()))
        is_ok &= false;
     }
index 26d9258a3adcdd82209be84c80e7f45256568225..e2f165a5b74d1a276832ee5fe0312f1d64924f6a 100644 (file)
@@ -137,8 +137,8 @@ display_usage(const string& prog_name, ostream& out)
     << " --version|-v  display program version information and exit\n"
     << " --debug-info-dir1|--d1 <path> the root for the debug info of file1\n"
     << " --debug-info-dir2|--d2 <path> the root for the debug info of file2\n"
-    << " --headers-dir1|--hd1 <path>  the path headers of file1\n"
-    << " --headers-dir2|--hd2 <path>  the path headers of file2\n"
+    << " --headers-dir1|--hd1 <path>  the path to headers of file1\n"
+    << " --headers-dir2|--hd2 <path>  the path to headers of file2\n"
     << " --stat  only display the diff stats\n"
     << " --symtabs  only display the symbol tables of the corpora\n"
     << " --no-default-suppression  don't load any "
@@ -566,6 +566,34 @@ set_diff_context_from_opts(diff_context_sptr ctxt,
   ctxt->dump_diff_tree(opts.dump_diff_tree);
 }
 
+/// Set suppression specifications to the @p read_context used to load
+/// the ABI corpus from the ELF/DWARF file.
+///
+/// These suppression specifications are going to be applied to drop
+/// some ABI artifacts on the floor (while reading the ELF/DWARF file
+/// or the native XML ABI file) and thus minimize the size of the
+/// resulting ABI corpus.
+///
+/// @param read_ctxt the read context to apply the suppression
+/// specifications to.  Note that the type of this parameter is
+/// generic (class template) because in practise, it can be either an
+/// abigail::dwarf_reader::read_context type or an
+/// abigail::xml_reader::read_context type.
+///
+/// @param opts the options where to get the suppression
+/// specifications from.
+template<class ReadContextType>
+static void
+set_suppressions(ReadContextType& read_ctxt, const options& opts)
+{
+  suppressions_type supprs;
+  for (vector<string>::const_iterator i = opts.suppression_paths.begin();
+       i != opts.suppression_paths.end();
+       ++i)
+    read_suppressions(*i, supprs);
+  add_read_context_suppressions(read_ctxt, supprs);
+}
+
 /// Set the regex patterns describing the functions to drop from the
 /// symbol table of a given corpus.
 ///
@@ -715,18 +743,22 @@ main(int argc, char* argv[])
                                                         &di_dir1, env.get(),
                                                         /*read_all_types=*/false);
            assert(ctxt);
-           abigail::dwarf_reader::set_show_stats
-             (*ctxt, opts.show_stats);
 
+           abigail::dwarf_reader::set_show_stats(*ctxt, opts.show_stats);
+           set_suppressions(*ctxt, opts);
            abigail::dwarf_reader::set_do_log(*ctxt, opts.do_log);
-
            c1 = abigail::dwarf_reader::read_corpus_from_elf(*ctxt, c1_status);
          }
          break;
        case abigail::tools_utils::FILE_TYPE_XML_CORPUS:
-         c1 =
-           abigail::xml_reader::read_corpus_from_native_xml_file(opts.file1,
+         {
+           abigail::xml_reader::read_context_sptr ctxt =
+             abigail::xml_reader::create_native_xml_read_context(opts.file1,
                                                                  env.get());
+           assert(ctxt);
+           set_suppressions(*ctxt, opts);
+           c1 = abigail::xml_reader::read_corpus_from_input(*ctxt);
+         }
          break;
        case abigail::tools_utils::FILE_TYPE_ZIP_CORPUS:
 #ifdef WITH_ZIP_ARCHIVE
@@ -761,17 +793,22 @@ main(int argc, char* argv[])
                                                         &di_dir2, env.get(),
                                                         /*read_all_types=*/false);
            assert(ctxt);
-           abigail::dwarf_reader::set_show_stats
-             (*ctxt, opts.show_stats);
+           abigail::dwarf_reader::set_show_stats(*ctxt, opts.show_stats);
            abigail::dwarf_reader::set_do_log(*ctxt, opts.do_log);
+           set_suppressions(*ctxt, opts);
 
            c2 = abigail::dwarf_reader::read_corpus_from_elf(*ctxt, c2_status);
          }
          break;
        case abigail::tools_utils::FILE_TYPE_XML_CORPUS:
-         c2 =
-           abigail::xml_reader::read_corpus_from_native_xml_file(opts.file2,
+         {
+           abigail::xml_reader::read_context_sptr ctxt =
+             abigail::xml_reader::create_native_xml_read_context(opts.file2,
                                                                  env.get());
+           assert(ctxt);
+           set_suppressions(*ctxt, opts);
+           c2 = abigail::xml_reader::read_corpus_from_input(*ctxt);
+         }
          break;
        case abigail::tools_utils::FILE_TYPE_ZIP_CORPUS:
 #ifdef WITH_ZIP_ARCHIVE
index 89c7e61afab9cf0c2f134546983089de98d97ced..eea398ba0a3ee437b0e8a09f1fbe9bde4fd65919 100644 (file)
@@ -34,6 +34,7 @@
 #include <string>
 #include <iostream>
 #include <fstream>
+#include <vector>
 #include <tr1/memory>
 #include "abg-config.h"
 #include "abg-tools-utils.h"
@@ -48,10 +49,20 @@ using std::cerr;
 using std::cout;
 using std::ostream;
 using std::ofstream;
+using std::vector;
 using std::tr1::shared_ptr;
 using abigail::tools_utils::emit_prefix;
 using abigail::tools_utils::temp_file;
 using abigail::tools_utils::temp_file_sptr;
+using abigail::tools_utils::check_file;
+using abigail::ir::environment_sptr;
+using abigail::ir::environment;
+using abigail::corpus;
+using abigail::corpus_sptr;
+using abigail::translation_units;
+using abigail::suppr::suppression_sptr;
+using abigail::suppr::suppressions_type;
+using abigail::suppr::read_suppressions;
 using abigail::comparison::corpus_diff;
 using abigail::comparison::corpus_diff_sptr;
 using abigail::comparison::compute_diff;
@@ -59,6 +70,11 @@ using abigail::comparison::diff_context_sptr;
 using abigail::comparison::diff_context;
 using abigail::xml_writer::write_corpus_to_native_xml;
 using abigail::xml_reader::read_corpus_from_native_xml_file;
+using abigail::dwarf_reader::read_context;
+using abigail::dwarf_reader::read_context_sptr;
+using abigail::dwarf_reader::read_corpus_from_elf;
+using abigail::dwarf_reader::create_read_context;
+using namespace abigail;
 
 struct options
 {
@@ -66,6 +82,8 @@ struct options
   string               in_file_path;
   string               out_file_path;
   shared_ptr<char>     di_root_path;
+  string               headers_dir;
+  vector<string>       suppression_paths;
   bool                 display_version;
   bool                 check_alt_debug_info_path;
   bool                 show_base_name_alt_debug_info_path;
@@ -100,8 +118,10 @@ display_usage(const string& prog_name, ostream& out)
     << "  --help|-h  display this message\n"
     << "  --version|-v  display program version information and exit\n"
     << "  --debug-info-dir|-d <dir-path>  look for debug info under 'dir-path'\n"
+    << "  --headers-dir|--hd <patch> the path to headers of the elf file\n"
     << "  --out-file <file-path>  write the output to 'file-path'\n"
     << "  --noout  do not emit anything after reading the binary\n"
+    << "  --suppressions|--suppr <path> specify a suppression file\n"
     << "  --no-architecture  do not emit architecture info in the output\n"
     << "  --no-show-locs  do now show location information\n"
     << "  --check-alternate-debug-info <elf-path>  check alternate debug info "
@@ -147,6 +167,15 @@ parse_command_line(int argc, char* argv[], options& opts)
            abigail::tools_utils::make_path_absolute(argv[i + 1]);
          ++i;
        }
+      else if (!strcmp(argv[i], "--headers-dir")
+              || !strcmp(argv[i], "--hd"))
+       {
+         int j = i + 1;
+         if (j >= argc)
+           return false;
+         opts.headers_dir = argv[j];
+         ++i;
+       }
       else if (!strcmp(argv[i], "--out-file"))
        {
          if (argc <= i + 1
@@ -157,6 +186,15 @@ parse_command_line(int argc, char* argv[], options& opts)
          opts.out_file_path = argv[i + 1];
          ++i;
        }
+      else if (!strcmp(argv[i], "--suppressions")
+              || !strcmp(argv[i], "--suppr"))
+       {
+         int j = i + 1;
+         if (j >= argc)
+           return false;
+         opts.suppression_paths.push_back(argv[j]);
+         ++i;
+       }
       else if (!strcmp(argv[i], "--noout"))
        opts.noout = true;
       else if (!strcmp(argv[i], "--no-architecture"))
@@ -214,6 +252,54 @@ set_diff_context(diff_context_sptr& ctxt)
      | abigail::comparison::HARMLESS_DECL_NAME_CHANGE_CATEGORY);
 }
 
+/// Check that the suppression specification files supplied are
+/// present.  If not, emit an error on stderr.
+///
+/// @param opts the options instance to use.
+///
+/// @return true if all suppression specification files are present,
+/// false otherwise.
+static bool
+maybe_check_suppression_files(const options& opts)
+{
+  for (vector<string>::const_iterator i = opts.suppression_paths.begin();
+       i != opts.suppression_paths.end();
+       ++i)
+    if (!check_file(*i, cerr, "abidiff"))
+      return false;
+
+  return true;
+}
+
+/// Set suppression specifications to the @p read_context used to load
+/// the ABI corpus from the ELF/DWARF file.
+///
+/// These suppression specifications are going to be applied to drop
+/// some ABI artifacts on the floor (while reading the ELF/DWARF file)
+/// and thus minimize the size of the resulting ABI corpus.
+///
+/// @param read_ctxt the read context to apply the suppression
+/// specifications to.
+///
+/// @param opts the options where to get the suppression
+/// specifications from.
+static void
+set_suppressions(read_context& read_ctxt, const options& opts)
+{
+  suppressions_type supprs;
+  for (vector<string>::const_iterator i = opts.suppression_paths.begin();
+       i != opts.suppression_paths.end();
+       ++i)
+    read_suppressions(*i, supprs);
+
+  suppression_sptr suppr =
+    abigail::tools_utils::gen_suppr_spec_from_headers(opts.headers_dir);
+  if (suppr)
+    supprs.push_back(suppr);
+
+  add_read_context_suppressions(read_ctxt, supprs);
+}
+
 int
 main(int argc, char* argv[])
 {
@@ -242,6 +328,9 @@ main(int argc, char* argv[])
   if (!abigail::tools_utils::check_file(opts.in_file_path, cerr, argv[0]))
     return 1;
 
+  if (!maybe_check_suppression_files(opts))
+    return 1;
+
   abigail::tools_utils::file_type type =
     abigail::tools_utils::guess_file_type(opts.in_file_path);
   if (type != abigail::tools_utils::FILE_TYPE_ELF
@@ -252,17 +341,6 @@ main(int argc, char* argv[])
       return 1;
     }
 
-  using abigail::ir::environment_sptr;
-  using abigail::ir::environment;
-  using abigail::corpus;
-  using abigail::corpus_sptr;
-  using abigail::translation_units;
-  using abigail::dwarf_reader::read_context;
-  using abigail::dwarf_reader::read_context_sptr;
-  using abigail::dwarf_reader::read_corpus_from_elf;
-  using abigail::dwarf_reader::create_read_context;
-  using namespace abigail;
-
   char* p = opts.di_root_path.get();
   environment_sptr env(new environment);
   corpus_sptr corp;
@@ -270,7 +348,9 @@ main(int argc, char* argv[])
                                            &p, env.get(),
                                            opts.load_all_types);
   read_context& ctxt = *c;
+
   set_show_stats(ctxt, opts.show_stats);
+  set_suppressions(ctxt, opts);
   abigail::dwarf_reader::set_do_log(ctxt, opts.do_log);
 
   if (opts.check_alt_debug_info_path)
@@ -306,6 +386,7 @@ main(int argc, char* argv[])
 
   dwarf_reader::status s = dwarf_reader::STATUS_UNKNOWN;
   corp = read_corpus_from_elf(ctxt, s);
+  c.reset();
   if (!corp)
     {
       if (s == dwarf_reader::STATUS_DEBUG_INFO_NOT_FOUND)
index 13873611d39e2faf46aee3529b30d6f89e6817fd..e715acdfef268cc0c1dbec3e584855c09bdb95c8 100644 (file)
@@ -1,6 +1,6 @@
 // -*- Mode: C++ -*-
 //
-// Copyright (C) 2013-2015 Red Hat, Inc.
+// Copyright (C) 2013-2016 Red Hat, Inc.
 //
 // This file is part of the GNU Application Binary Interface Generic
 // Analysis and Instrumentation Library (libabigail).  This library is
@@ -34,6 +34,7 @@
 #include <string>
 #include <iostream>
 #include <fstream>
+#include <vector>
 #include "abg-config.h"
 #include "abg-tools-utils.h"
 #include "abg-ir.h"
@@ -41,6 +42,7 @@
 #include "abg-reader.h"
 #include "abg-dwarf-reader.h"
 #include "abg-writer.h"
+#include "abg-suppression.h"
 
 using std::string;
 using std::cerr;
@@ -48,10 +50,14 @@ using std::cin;
 using std::cout;
 using std::ostream;
 using std::ofstream;
+using std::vector;
 using abigail::tools_utils::emit_prefix;
 using abigail::tools_utils::check_file;
 using abigail::tools_utils::file_type;
 using abigail::tools_utils::guess_file_type;
+using abigail::suppr::suppression_sptr;
+using abigail::suppr::suppressions_type;
+using abigail::suppr::read_suppressions;
 using abigail::corpus;
 using abigail::corpus_sptr;
 using abigail::xml_reader::read_translation_unit_from_file;
@@ -74,6 +80,8 @@ struct options
   bool                         diff;
   bool                         noout;
   std::tr1::shared_ptr<char>   di_root_path;
+  vector<string>               suppression_paths;
+  string                       headers_dir;
 
   options()
     : display_version(false),
@@ -93,7 +101,9 @@ display_usage(const string& prog_name, ostream& out)
     << "  --help  display this message\n"
     << "  --version|-v  display program version information and exit\n"
     << "  --debug-info-dir <path> the path under which to look for "
+    << "  --headers-dir|--hd <patch> the path to headers of the elf file\n"
     "debug info for the elf <abi-file>\n"
+    << "  --suppressions|--suppr <path> specify a suppression file\n"
     << "  --diff  for xml inputs, perform a text diff between "
     "the input and the memory model saved back to disk\n"
     << "  --noout  do not display anything on stdout\n"
@@ -138,6 +148,27 @@ parse_command_line(int argc, char* argv[], options& opts)
              abigail::tools_utils::make_path_absolute(argv[i + 1]);
            ++i;
          }
+      else if (!strcmp(argv[i], "--headers-dir")
+              || !strcmp(argv[i], "--hd"))
+       {
+         int j = i + 1;
+         if (j >= argc)
+           return false;
+         opts.headers_dir = argv[j];
+         ++i;
+       }
+      else if (!strcmp(argv[i], "--suppressions")
+              || !strcmp(argv[i], "--suppr"))
+       {
+         int j = i + 1;
+         if (j >= argc)
+           {
+             opts.wrong_option = argv[i];
+             return true;
+           }
+         opts.suppression_paths.push_back(argv[j]);
+         ++i;
+       }
        else if (!strcmp(argv[i], "--stdin"))
          opts.read_from_stdin = true;
        else if (!strcmp(argv[i], "--tu"))
@@ -159,6 +190,59 @@ parse_command_line(int argc, char* argv[], options& opts)
     return true;
 }
 
+/// Check that the suppression specification files supplied are
+/// present.  If not, emit an error on stderr.
+///
+/// @param opts the options instance to use.
+///
+/// @return true if all suppression specification files are present,
+/// false otherwise.
+static bool
+maybe_check_suppression_files(const options& opts)
+{
+  for (vector<string>::const_iterator i = opts.suppression_paths.begin();
+       i != opts.suppression_paths.end();
+       ++i)
+    if (!check_file(*i, cerr, "abidiff"))
+      return false;
+
+  return true;
+}
+
+/// Set suppression specifications to the @p read_context used to load
+/// the ABI corpus from the ELF/DWARF file.
+///
+/// These suppression specifications are going to be applied to drop
+/// some ABI artifacts on the floor (while reading the ELF/DWARF file
+/// or the native XML ABI file) and thus minimize the size of the
+/// resulting ABI corpus.
+///
+/// @param read_ctxt the read context to apply the suppression
+/// specifications to.  Note that the type of this parameter is
+/// generic (class template) because in practise, it can be either an
+/// abigail::dwarf_reader::read_context type or an
+/// abigail::xml_reader::read_context type.
+///
+/// @param opts the options where to get the suppression
+/// specifications from.
+template<class ReadContextType>
+static void
+set_suppressions(ReadContextType& read_ctxt, const options& opts)
+{
+  suppressions_type supprs;
+  for (vector<string>::const_iterator i = opts.suppression_paths.begin();
+       i != opts.suppression_paths.end();
+       ++i)
+    read_suppressions(*i, supprs);
+
+  suppression_sptr suppr =
+    abigail::tools_utils::gen_suppr_spec_from_headers(opts.headers_dir);
+  if (suppr)
+    supprs.push_back(suppr);
+
+  add_read_context_suppressions(read_ctxt, supprs);
+}
+
 /// Reads a bi (binary instrumentation) file, saves it back to a
 /// temporary file and run a diff on the two versions.
 int
@@ -181,6 +265,10 @@ main(int argc, char* argv[])
       cout << major << "." << minor << "." << revision << "\n";
       return 0;
     }
+
+  if (!maybe_check_suppression_files(opts))
+    return true;
+
   abigail::ir::environment_sptr env(new abigail::ir::environment);
   if (opts.read_from_stdin)
     {
@@ -205,7 +293,12 @@ main(int argc, char* argv[])
        }
       else
        {
-         corpus_sptr corp = read_corpus_from_native_xml(&cin, env.get());
+         abigail::xml_reader::read_context_sptr ctxt =
+           abigail::xml_reader::create_native_xml_read_context(&cin,
+                                                               env.get());
+         assert(ctxt);
+         set_suppressions(*ctxt, opts);
+         corpus_sptr corp = abigail::xml_reader::read_corpus_from_input(*ctxt);
          if (!opts.noout)
            write_corpus_to_native_xml(corp, /*indent=*/0, cout);
          return false;
@@ -232,16 +325,28 @@ main(int argc, char* argv[])
          break;
        case abigail::tools_utils::FILE_TYPE_ELF:
        case abigail::tools_utils::FILE_TYPE_AR:
-         di_root_path = opts.di_root_path.get();
-         corp = read_corpus_from_elf(opts.file_path,
-                                     &di_root_path,
-                                     env.get(),
-                                     /*load_all_types=*/false,
-                                     s);
+         {
+           di_root_path = opts.di_root_path.get();
+           abigail::dwarf_reader::read_context_sptr ctxt =
+             abigail::dwarf_reader::create_read_context(opts.file_path,
+                                                        &di_root_path,
+                                                        env.get(),
+                                                        /*load_all_types=*/false);
+           assert(ctxt);
+           set_suppressions(*ctxt, opts);
+           corp = read_corpus_from_elf(*ctxt, s);
+         }
          break;
        case abigail::tools_utils::FILE_TYPE_XML_CORPUS:
-         corp = read_corpus_from_native_xml_file(opts.file_path, env.get());
-         break;
+         {
+           abigail::xml_reader::read_context_sptr ctxt =
+             abigail::xml_reader::create_native_xml_read_context(opts.file_path,
+                                                                 env.get());
+           assert(ctxt);
+           set_suppressions(*ctxt, opts);
+           corp = read_corpus_from_input(*ctxt);
+           break;
+         }
        case abigail::tools_utils::FILE_TYPE_ZIP_CORPUS:
 #if WITH_ZIP_ARCHIVE
          corp = read_corpus_from_file(opts.file_path);