[RFC,1/1] Fix decl_base comparison function

Message ID 20200722110736.2550361-2-gprocida@google.com
State Committed, archived
Headers
Series Fix decl_base comparison |

Commit Message

Giuliano Procida July 22, 2020, 11:07 a.m. UTC
  When two decl_base ojects are compared, there are both fast and slow
paths to the name comparison. The latter is roughly equivalent to
comparing names after applying the regex
s/(__anonymous_(?:struct|union|enum)__)\d+/\1/g to the names before
comparing them while the former is a straight string comparison with
some tweaks for detecting anonymous types.

The slow path is taken care of by the helper function
tools_utils::decl_names_equal but unfortunately, there is a missing
negation of the returned bool. This commit fixes this and updates the
few affected tests.

Rather than just adding a '!', this commit replaces the negative
decls_are_different with a positive decls_are_same. I spent far too
long staring at the code before I spotted the mistake and having
positively-named things improves readability.

This commit also adds some TODOs for review around the fast path
logic.

The same helper function is also called by has_harmless_name_change
and that should be reviewed as well.

	* src/abg-ir.cc (equals): In the decl_base overload, note that
	the value returned by decl_names_equal should be negated and
	replace decls_are_different with decls_are_same, negating all
	occurrences.
	* tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt:
	Update tests, removing some spurious anonymous union name change.
	* tests/data/test-diff-filter/test33-report-0.txt: Diff now
	completely empty.
	* tests/data/test-diff-pkg/elfutils-libs-0.170-4.el7.x86_64-multiple-sym-vers-report-0.txt:
	3 functions previously considered to have harmless changes are
	now deemed to have no changes.
	* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt:
	1 struct RedStore data member previously considered to have
	harmless changes is now deemed to have no changes.
	* tests/data/test-read-dwarf/test9-pr18818-clang.so.abi:
	One instance of an anonymous struct removed and a typedef
	repointed at another existing instance; many type ids
	renumbered.

Signed-off-by: Giuliano Procida <gprocida@google.com>
---
 src/abg-ir.cc                                 |  25 +-
 .../PR25058-liblttng-ctl-report-1.txt         |   4 -
 .../data/test-diff-filter/test33-report-0.txt |   3 -
 ....el7.x86_64-multiple-sym-vers-report-0.txt |   2 +-
 ...l7.x86_64-0.12.8-1.el7.x86_64-report-2.txt |   2 +-
 .../test9-pr18818-clang.so.abi                | 236 ++++++++----------
 6 files changed, 127 insertions(+), 145 deletions(-)
  

Comments

Dodji Seketeli Aug. 4, 2020, 3:07 p.m. UTC | #1
Giuliano Procida <gprocida@google.com> a écrit:

[...]

> diff --git a/src/abg-ir.cc b/src/abg-ir.cc
> index 1fe6f499..aa2a56fa 100644
> --- a/src/abg-ir.cc
> +++ b/src/abg-ir.cc
> @@ -4067,26 +4067,33 @@ equals(const decl_base& l, const decl_base& r, change_kind* k)
>    /// Otherwise, let's just compare their name, the obvious way.
>    /// That's the fast path because in that case the names are
>    /// interned_string and comparing them is much faster.
> -  bool decls_are_different = (ln != rn);
> -  if (decls_are_different
> +  bool decls_are_same = (ln == rn);
> +  if (!decls_are_same
>        && l.get_is_anonymous()
>        && !l.get_has_anonymous_parent()
>        && r.get_is_anonymous()
>        && !r.get_has_anonymous_parent())
> -    // Both decls are anonymous and their scope are *NOT* anonymous.
> -    // So we consider the decls to have equivalent names (both
> -    // anonymous, remember).  We are still in the fast path here.
> -    decls_are_different = false;
> +    {
> +      // Both decls are anonymous and their scope are *NOT* anonymous.
> +      // So we consider the decls to have equivalent names (both
> +      // anonymous, remember).  We are still in the fast path here.
> +      //
> +      // TODO: Don't conflate anonymous structs, unions and enums?

Yes, we want to compare decls here, irrespective (as much as possible)
of the kind of types they are.  That is precisely the point of this
function.  The specifics of structs, unions and enums are dealt with in
the overloads of the equals functions that are specific to those types.
Those specific overloads use this one, precisely to compare the generic
"decl-related-part" of those types.  That generic part has to do with
the "naming" of those entities.

> +      //
> +      // TODO: Should we really be conflating all foo1::..::fooM::anon
> +      // with all bar1::..::barN::anon?

The reasoning here is that two declarations entities that are anonymous
can not be named, by definition.  And that is irrespective of their
(naming) context.  So, for naming purposes, we can't say for sure that
foo1::..::fooM::anon and bar1::..::barN::anon are different just based
on their name (or the name of their context for that matter).

To tell if these two entities are different, we'd have to look at
something else but their name.  So for now, we assume they are equal.
later down in the function, other properties (related to declarations in
the generic sense) are looked at to try to determine if they are equal.

So I am removing these two TODO comments.

> +      decls_are_same = true;
> +    }
>  
> -  if (decls_are_different
> +  if (!decls_are_same
>        && l.get_has_anonymous_parent()
>        && r.get_has_anonymous_parent())
>      // This is the slow path as we are comparing the decl qualified
>      // names component by component, properly handling anonymous
>      // scopes.
> -    decls_are_different = tools_utils::decl_names_equal(ln, rn);
> +    decls_are_same = tools_utils::decl_names_equal(ln, rn);
>  
> -  if (decls_are_different)
> +  if (!decls_are_same)
>      {
>        result = false;
>        if (k)

[...]


>
> 	* src/abg-ir.cc (equals): In the decl_base overload, note that
> 	the value returned by decl_names_equal should be negated and
> 	replace decls_are_different with decls_are_same, negating all
> 	occurrences.
> 	* tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt:
> 	Update tests, removing some spurious anonymous union name change.
> 	* tests/data/test-diff-filter/test33-report-0.txt: Diff now
> 	completely empty.
> 	* tests/data/test-diff-pkg/elfutils-libs-0.170-4.el7.x86_64-multiple-sym-vers-report-0.txt:
> 	3 functions previously considered to have harmless changes are
> 	now deemed to have no changes.
> 	* tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt:
> 	1 struct RedStore data member previously considered to have
> 	harmless changes is now deemed to have no changes.
> 	* tests/data/test-read-dwarf/test9-pr18818-clang.so.abi:
> 	One instance of an anonymous struct removed and a typedef
> 	repointed at another existing instance; many type ids
> 	renumbered.
>
> Signed-off-by: Giuliano Procida <gprocida@google.com>

Applied to master with the change above and after adjusting the commit
log.

Thanks!

Cheers,
  
Giuliano Procida Aug. 4, 2020, 3:47 p.m. UTC | #2
Thanks for the review and response.

I'd like to check my understanding of something.



On Tue, 4 Aug 2020 at 16:07, Dodji Seketeli <dodji@seketeli.org> wrote:

> Giuliano Procida <gprocida@google.com> a écrit:
>
> [...]
>
> > diff --git a/src/abg-ir.cc b/src/abg-ir.cc
> > index 1fe6f499..aa2a56fa 100644
> > --- a/src/abg-ir.cc
> > +++ b/src/abg-ir.cc
> > @@ -4067,26 +4067,33 @@ equals(const decl_base& l, const decl_base& r,
> change_kind* k)
> >    /// Otherwise, let's just compare their name, the obvious way.
> >    /// That's the fast path because in that case the names are
> >    /// interned_string and comparing them is much faster.
> > -  bool decls_are_different = (ln != rn);
> > -  if (decls_are_different
> > +  bool decls_are_same = (ln == rn);
> > +  if (!decls_are_same
> >        && l.get_is_anonymous()
> >        && !l.get_has_anonymous_parent()
> >        && r.get_is_anonymous()
> >        && !r.get_has_anonymous_parent())
> > -    // Both decls are anonymous and their scope are *NOT* anonymous.
> > -    // So we consider the decls to have equivalent names (both
> > -    // anonymous, remember).  We are still in the fast path here.
> > -    decls_are_different = false;
> > +    {
> > +      // Both decls are anonymous and their scope are *NOT* anonymous.
> > +      // So we consider the decls to have equivalent names (both
> > +      // anonymous, remember).  We are still in the fast path here.
> > +      //
> > +      // TODO: Don't conflate anonymous structs, unions and enums?
>
> Yes, we want to compare decls here, irrespective (as much as possible)
> of the kind of types they are.  That is precisely the point of this
> function.  The specifics of structs, unions and enums are dealt with in
> the overloads of the equals functions that are specific to those types.
> Those specific overloads use this one, precisely to compare the generic
> "decl-related-part" of those types.  That generic part has to do with
> the "naming" of those entities.
>
> > +      //
> > +      // TODO: Should we really be conflating all foo1::..::fooM::anon
> > +      // with all bar1::..::barN::anon?
>
> The reasoning here is that two declarations entities that are anonymous
> can not be named, by definition.  And that is irrespective of their
> (naming) context.  So, for naming purposes, we can't say for sure that
> foo1::..::fooM::anon and bar1::..::barN::anon are different just based
> on their name (or the name of their context for that matter).
>

I thought we could rely on their names (at least as a sufficient condition
for inequality). Here are 3 examples.

1. In plain C, there's a flat namespace.

struct { int x; } a;
struct { int x; } b;

At a language level the types of a and b are distinct and it's illegal to
assign one to the other.

error: incompatible types when assigning to type ‘struct <anonymous>’ from
type ‘struct <anonymous>’

They are structurally the same but if we were treat them as identical then
we'd get somewhat misleading diffs when the code gets changed to:

struct { int x; } a;
struct { long x; } b;

[The compiler has to track the identity of these types separately which is
probably easy enough, but we have a few choices of how to refer to the
type: a) file, line, column (which is a bit fragile), b) with reference to
the entities being given a type, which could be a typedef, c) where they
appear in their scope, whatever that may mean.]

2. In C++, we get namespace and type name scopes.

struct A { struct { int x; } a; struct { int x; } b; };

error: no match for ‘operator=’ (operand types are ‘A::<unnamed struct>’
and ‘A::<unnamed struct>’)

It's illegal to assign A::a to A::b as their types are distinct.

[It's possible to propagate the type's identity to other declarations with
decltype (and auto).]

3.

struct A { struct { int x; } a; };
struct B { struct { int x; } a; };

Similarly, A::a and B::a have distinct types.

error: no match for ‘operator=’ (operand types are ‘A::<unnamed struct>’
and ‘B::<unnamed struct>’)

This last case is what I thought I was addressing with that TODO.

Let me know if we are talking at cross-purposes.

Regards,
Giuliano.

To tell if these two entities are different, we'd have to look at
> something else but their name.  So for now, we assume they are equal.
> later down in the function, other properties (related to declarations in
> the generic sense) are looked at to try to determine if they are equal.
>
> So I am removing these two TODO comments.
>
> > +      decls_are_same = true;
> > +    }
> >
> > -  if (decls_are_different
> > +  if (!decls_are_same
> >        && l.get_has_anonymous_parent()
> >        && r.get_has_anonymous_parent())
> >      // This is the slow path as we are comparing the decl qualified
> >      // names component by component, properly handling anonymous
> >      // scopes.
> > -    decls_are_different = tools_utils::decl_names_equal(ln, rn);
> > +    decls_are_same = tools_utils::decl_names_equal(ln, rn);
> >
> > -  if (decls_are_different)
> > +  if (!decls_are_same)
> >      {
> >        result = false;
> >        if (k)
>
> [...]
>
>
> >
> >       * src/abg-ir.cc (equals): In the decl_base overload, note that
> >       the value returned by decl_names_equal should be negated and
> >       replace decls_are_different with decls_are_same, negating all
> >       occurrences.
> >       * tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt:
> >       Update tests, removing some spurious anonymous union name change.
> >       * tests/data/test-diff-filter/test33-report-0.txt: Diff now
> >       completely empty.
> >       *
> tests/data/test-diff-pkg/elfutils-libs-0.170-4.el7.x86_64-multiple-sym-vers-report-0.txt:
> >       3 functions previously considered to have harmless changes are
> >       now deemed to have no changes.
> >       *
> tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt:
> >       1 struct RedStore data member previously considered to have
> >       harmless changes is now deemed to have no changes.
> >       * tests/data/test-read-dwarf/test9-pr18818-clang.so.abi:
> >       One instance of an anonymous struct removed and a typedef
> >       repointed at another existing instance; many type ids
> >       renumbered.
> >
> > Signed-off-by: Giuliano Procida <gprocida@google.com>
>
> Applied to master with the change above and after adjusting the commit
> log.
>
> Thanks!
>
> Cheers,
>
>
>
> --
>                 Dodji
>
  
Dodji Seketeli Aug. 4, 2020, 5:16 p.m. UTC | #3
Giuliano Procida <gprocida@google.com> a écrit:

> I'd like to check my understanding of something.

[...]

> I thought we could rely on their names (at least as a sufficient condition
> for inequality). Here are 3 examples.
>
> 1. In plain C, there's a flat namespace.
>
> struct { int x; } a;
> struct { int x; } b;
>
> At a language level the types of a and b are distinct and it's illegal to
> assign one to the other.
>
> error: incompatible types when assigning to type ‘struct <anonymous>’ from
> type ‘struct <anonymous>’
>
> They are structurally the same but if we were treat them as identical then
> we'd get somewhat misleading diffs when the code gets changed to:
>
> struct { int x; } a;
> struct { long x; } b;

If both a and b are global variables (if they are part of the ABI) and
we have the change you are referring to, then I don't think it would be
misleading to report that change, would it be?  The layout of the type
of 'b' changed in a way that would warrant a review, at very least, I
would believe.

More generaly, what you are referring to is language-level type
equality.  And that is potentially different from ABI-level equality, I
would say.  I'd say that from an ABI standpoint, the initial types of
'a' and 'b' are compatible and can be used interchangeably.

>
> [The compiler has to track the identity of these types separately which is
> probably easy enough, but we have a few choices of how to refer to the
> type: a) file, line, column (which is a bit fragile), b) with reference to
> the entities being given a type, which could be a typedef, c) where they
> appear in their scope, whatever that may mean.]

In other words, we (post DWARF) cannot infer that the two tapes are
equal or different based on naming, as by definition, they are
anonymous.  And they are structurally equal as you said earlier.  So
yes, from an ABI standpoint, both types are equal by construction.

There are cases, though, were we chose (in libabigail) to be closer to
the language-level meaning of equality, but anonymous types is precisely
one of those cases where we chose to stick more to the binary (or
layout) way of seeing things.

>
> 2. In C++, we get namespace and type name scopes.
>
> struct A { struct { int x; } a; struct { int x; } b; };
>
> error: no match for ‘operator=’ (operand types are ‘A::<unnamed struct>’
> and ‘A::<unnamed struct>’)
>
> It's illegal to assign A::a to A::b as their types are distinct.
>
> [It's possible to propagate the type's identity to other declarations with
> decltype (and auto).]

Agreed.  the same holds here.

>
> 3.
>
> struct A { struct { int x; } a; };
> struct B { struct { int x; } a; };
>
> Similarly, A::a and B::a have distinct types.
>
> error: no match for ‘operator=’ (operand types are ‘A::<unnamed struct>’
> and ‘B::<unnamed struct>’)
>
> This last case is what I thought I was addressing with that TODO.

And from a language-centric point of view, you are right.  There are
also cases cases like that where the type of 'a' could become hidden
inside an anonymous namespace.  Because the two types are still binary
compatible, if they are anonymous we chose knowingly to consider their
binary-oriented view of things.

Where does this bias come from?  It was from a class of application
(network related) where they'd use a number of anonymous struct etc to
read network data all around.  They were more interested in the layout
of the type than on its /name/ per se.  And that does make sense, from
an ABI point of view, I think.  If you don't want to name things, then
their name probably doesn't really matter.  If it does, well, we'll find
out structurally.

> Let me know if we are talking at cross-purposes.

No, I think I understood what you meant.  Thank you for taking the time
to clarify.

Cheers,
  

Patch

diff --git a/src/abg-ir.cc b/src/abg-ir.cc
index 1fe6f499..aa2a56fa 100644
--- a/src/abg-ir.cc
+++ b/src/abg-ir.cc
@@ -4067,26 +4067,33 @@  equals(const decl_base& l, const decl_base& r, change_kind* k)
   /// Otherwise, let's just compare their name, the obvious way.
   /// That's the fast path because in that case the names are
   /// interned_string and comparing them is much faster.
-  bool decls_are_different = (ln != rn);
-  if (decls_are_different
+  bool decls_are_same = (ln == rn);
+  if (!decls_are_same
       && l.get_is_anonymous()
       && !l.get_has_anonymous_parent()
       && r.get_is_anonymous()
       && !r.get_has_anonymous_parent())
-    // Both decls are anonymous and their scope are *NOT* anonymous.
-    // So we consider the decls to have equivalent names (both
-    // anonymous, remember).  We are still in the fast path here.
-    decls_are_different = false;
+    {
+      // Both decls are anonymous and their scope are *NOT* anonymous.
+      // So we consider the decls to have equivalent names (both
+      // anonymous, remember).  We are still in the fast path here.
+      //
+      // TODO: Don't conflate anonymous structs, unions and enums?
+      //
+      // TODO: Should we really be conflating all foo1::..::fooM::anon
+      // with all bar1::..::barN::anon?
+      decls_are_same = true;
+    }
 
-  if (decls_are_different
+  if (!decls_are_same
       && l.get_has_anonymous_parent()
       && r.get_has_anonymous_parent())
     // This is the slow path as we are comparing the decl qualified
     // names component by component, properly handling anonymous
     // scopes.
-    decls_are_different = tools_utils::decl_names_equal(ln, rn);
+    decls_are_same = tools_utils::decl_names_equal(ln, rn);
 
-  if (decls_are_different)
+  if (!decls_are_same)
     {
       result = false;
       if (k)
diff --git a/tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt b/tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt
index dc1dff32..71df361e 100644
--- a/tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt
+++ b/tests/data/test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt
@@ -130,10 +130,6 @@  Variables changes summary: 0 Removed, 0 Changed, 3 Added variables
           type of 'union {lttng_event_perf_counter_ctx perf_counter; struct {char* provider_name; char* ctx_name;} app_ctx; char padding[288];} lttng_event_context::u' changed:
             type name changed from '__anonymous_union__4' to '__anonymous_union__5'
             type size hasn't changed
-            3 data member changes:
-              name of '__anonymous_union__4::app_ctx' changed to '__anonymous_union__5::app_ctx'
-              name of '__anonymous_union__4::padding' changed to '__anonymous_union__5::padding'
-              name of '__anonymous_union__4::perf_counter' changed to '__anonymous_union__5::perf_counter'
             type changed from:
               union {lttng_event_perf_counter_ctx perf_counter; struct {char* provider_name; char* ctx_name;} app_ctx; char padding[288];}
             to:
diff --git a/tests/data/test-diff-filter/test33-report-0.txt b/tests/data/test-diff-filter/test33-report-0.txt
index 433f9508..e69de29b 100644
--- a/tests/data/test-diff-filter/test33-report-0.txt
+++ b/tests/data/test-diff-filter/test33-report-0.txt
@@ -1,3 +0,0 @@ 
-Functions changes summary: 0 Removed, 0 Changed (16 filtered out), 0 Added functions
-Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
-
diff --git a/tests/data/test-diff-pkg/elfutils-libs-0.170-4.el7.x86_64-multiple-sym-vers-report-0.txt b/tests/data/test-diff-pkg/elfutils-libs-0.170-4.el7.x86_64-multiple-sym-vers-report-0.txt
index 8ce5aa3c..9d1f078d 100644
--- a/tests/data/test-diff-pkg/elfutils-libs-0.170-4.el7.x86_64-multiple-sym-vers-report-0.txt
+++ b/tests/data/test-diff-pkg/elfutils-libs-0.170-4.el7.x86_64-multiple-sym-vers-report-0.txt
@@ -1,5 +1,5 @@ 
 ================ changes of 'libdw-0.170.so'===============
-  Functions changes summary: 0 Removed, 0 Changed (178 filtered out), 4 Added functions
+  Functions changes summary: 0 Removed, 0 Changed (175 filtered out), 4 Added functions
   Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
 
   4 Added functions:
diff --git a/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt b/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt
index c1aff1c7..a0bfc761 100644
--- a/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt
+++ b/tests/data/test-diff-pkg/spice-server-0.12.4-19.el7.x86_64-0.12.8-1.el7.x86_64-report-2.txt
@@ -630,7 +630,7 @@ 
         in pointed to type 'typedef SpiceServer' at spice-server.h:38:1:
           underlying type 'struct RedsState' at reds-private.h:127:1 changed:
             type size hasn't changed
-            5 data member changes (2 filtered):
+            5 data member changes (1 filtered):
               type of 'SpiceWatch* RedsState::listen_watch' changed:
                 pointed to type 'typedef SpiceWatch' changed at spice.h:61:1, as reported earlier
               type of 'SpiceWatch* RedsState::secure_listen_watch' changed:
diff --git a/tests/data/test-read-dwarf/test9-pr18818-clang.so.abi b/tests/data/test-read-dwarf/test9-pr18818-clang.so.abi
index 8254692e..6ad6cc9c 100644
--- a/tests/data/test-read-dwarf/test9-pr18818-clang.so.abi
+++ b/tests/data/test-read-dwarf/test9-pr18818-clang.so.abi
@@ -6313,7 +6313,7 @@ 
             <typedef-decl name='result' type-id='type-id-474' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/codecvt.h' line='73' column='1' id='type-id-473'/>
           </member-type>
           <member-type access='private'>
-            <typedef-decl name='state_type' type-id='type-id-475' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/codecvt.h' line='76' column='1' id='type-id-469'/>
+            <typedef-decl name='state_type' type-id='type-id-34' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/codecvt.h' line='76' column='1' id='type-id-469'/>
           </member-type>
           <member-type access='private'>
             <typedef-decl name='intern_type' type-id='type-id-19' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/codecvt.h' line='74' column='1' id='type-id-461'/>
@@ -6348,7 +6348,7 @@ 
           </function-decl>
         </member-function>
       </class-decl>
-      <class-decl name='codecvt_base' size-in-bits='8' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/codecvt.h' line='46' column='1' id='type-id-476'>
+      <class-decl name='codecvt_base' size-in-bits='8' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/codecvt.h' line='46' column='1' id='type-id-475'>
           <member-type access='private'>
             <enum-decl name='result' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/codecvt.h' line='49' column='1' id='type-id-474'>
               <underlying-type type-id='type-id-142'/>
@@ -6469,24 +6469,6 @@ 
         </member-function>
       </class-decl>
     </namespace-decl>
-    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' naming-typedef-id='type-id-469' visibility='default' filepath='/usr/include/wchar.h' line='82' column='1' id='type-id-475'>
-      <member-type access='public'>
-        <union-decl name='__anonymous_union__' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='/usr/include/wchar.h' line='85' column='1' id='type-id-477'>
-          <data-member access='private'>
-            <var-decl name='__wch' type-id='type-id-7' visibility='default' filepath='/usr/include/wchar.h' line='88' column='1'/>
-          </data-member>
-          <data-member access='private'>
-            <var-decl name='__wchb' type-id='type-id-3' visibility='default' filepath='/usr/include/wchar.h' line='92' column='1'/>
-          </data-member>
-        </union-decl>
-      </member-type>
-      <data-member access='public' layout-offset-in-bits='0'>
-        <var-decl name='__count' type-id='type-id-11' visibility='default' filepath='/usr/include/wchar.h' line='84' column='1'/>
-      </data-member>
-      <data-member access='public' layout-offset-in-bits='32'>
-        <var-decl name='__value' type-id='type-id-477' visibility='default' filepath='/usr/include/wchar.h' line='93' column='1'/>
-      </data-member>
-    </class-decl>
   </abi-instr>
   <abi-instr version='1.0' address-size='64' path='src/third_party/boost-1.56.0/libs/filesystem/src/portability.cpp' comp-dir-path='/home/andrew/Documents/10gen/dev/src/mongodb' language='LANG_C_plus_plus'>
     <namespace-decl name='std'>
@@ -6526,17 +6508,17 @@ 
     </namespace-decl>
   </abi-instr>
   <abi-instr version='1.0' address-size='64' path='src/third_party/boost-1.56.0/libs/filesystem/src/unique_path.cpp' comp-dir-path='/home/andrew/Documents/10gen/dev/src/mongodb' language='LANG_C_plus_plus'>
-    <reference-type-def kind='lvalue' type-id='type-id-478' size-in-bits='64' id='type-id-479'/>
-    <pointer-type-def type-id='type-id-478' size-in-bits='64' id='type-id-480'/>
-    <pointer-type-def type-id='type-id-481' size-in-bits='64' id='type-id-337'/>
-    <qualified-type-def type-id='type-id-478' const='yes' id='type-id-482'/>
-    <pointer-type-def type-id='type-id-482' size-in-bits='64' id='type-id-483'/>
-    <qualified-type-def type-id='type-id-401' const='yes' id='type-id-484'/>
-    <reference-type-def kind='lvalue' type-id='type-id-484' size-in-bits='64' id='type-id-336'/>
-    <reference-type-def kind='lvalue' type-id='type-id-320' size-in-bits='64' id='type-id-485'/>
-    <reference-type-def kind='lvalue' type-id='type-id-95' size-in-bits='64' id='type-id-486'/>
-    <qualified-type-def type-id='type-id-96' const='yes' id='type-id-487'/>
-    <reference-type-def kind='lvalue' type-id='type-id-487' size-in-bits='64' id='type-id-488'/>
+    <reference-type-def kind='lvalue' type-id='type-id-476' size-in-bits='64' id='type-id-477'/>
+    <pointer-type-def type-id='type-id-476' size-in-bits='64' id='type-id-478'/>
+    <pointer-type-def type-id='type-id-479' size-in-bits='64' id='type-id-337'/>
+    <qualified-type-def type-id='type-id-476' const='yes' id='type-id-480'/>
+    <pointer-type-def type-id='type-id-480' size-in-bits='64' id='type-id-481'/>
+    <qualified-type-def type-id='type-id-401' const='yes' id='type-id-482'/>
+    <reference-type-def kind='lvalue' type-id='type-id-482' size-in-bits='64' id='type-id-336'/>
+    <reference-type-def kind='lvalue' type-id='type-id-320' size-in-bits='64' id='type-id-483'/>
+    <reference-type-def kind='lvalue' type-id='type-id-95' size-in-bits='64' id='type-id-484'/>
+    <qualified-type-def type-id='type-id-96' const='yes' id='type-id-485'/>
+    <reference-type-def kind='lvalue' type-id='type-id-485' size-in-bits='64' id='type-id-486'/>
     <namespace-decl name='boost'>
       <namespace-decl name='filesystem'>
         <namespace-decl name='detail'>
@@ -6548,151 +6530,151 @@ 
         </namespace-decl>
         <namespace-decl name='path_traits'>
           <function-decl name='dispatch&lt;std::basic_string&lt;char&gt; &gt;' mangled-name='_ZN5boost10filesystem11path_traits8dispatchISsEEvRKSbIwSt11char_traitsIwESaIwEERT_RKSt7codecvtIwc11__mbstate_tE' filepath='src/third_party/boost-1.56.0/boost/filesystem/path_traits.hpp' line='177' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZN5boost10filesystem11path_traits8dispatchISsEEvRKSbIwSt11char_traitsIwESaIwEERT_RKSt7codecvtIwc11__mbstate_tE'>
-            <parameter type-id='type-id-485' name='c' filepath='src/third_party/boost-1.56.0/boost/filesystem/path_traits.hpp' line='177' column='1'/>
+            <parameter type-id='type-id-483' name='c' filepath='src/third_party/boost-1.56.0/boost/filesystem/path_traits.hpp' line='177' column='1'/>
             <parameter type-id='type-id-133' name='to' filepath='src/third_party/boost-1.56.0/boost/filesystem/path_traits.hpp' line='177' column='1'/>
             <parameter type-id='type-id-269' name='cvt' filepath='src/third_party/boost-1.56.0/boost/filesystem/path_traits.hpp' line='177' column='1'/>
             <return type-id='type-id-18'/>
           </function-decl>
         </namespace-decl>
       </namespace-decl>
-      <class-decl name='enable_if_c&lt;true, void&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='src/third_party/boost-1.56.0/boost/core/enable_if.hpp' line='28' column='1' id='type-id-489'>
+      <class-decl name='enable_if_c&lt;true, void&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='src/third_party/boost-1.56.0/boost/core/enable_if.hpp' line='28' column='1' id='type-id-487'>
           <member-type access='public'>
-            <typedef-decl name='type' type-id='type-id-18' filepath='src/third_party/boost-1.56.0/boost/core/enable_if.hpp' line='29' column='1' id='type-id-481'/>
+            <typedef-decl name='type' type-id='type-id-18' filepath='src/third_party/boost-1.56.0/boost/core/enable_if.hpp' line='29' column='1' id='type-id-479'/>
           </member-type>
       </class-decl>
     </namespace-decl>
     <namespace-decl name='std'>
-      <class-decl name='allocator&lt;wchar_t&gt;' visibility='default' is-declaration-only='yes' id='type-id-490'>
+      <class-decl name='allocator&lt;wchar_t&gt;' visibility='default' is-declaration-only='yes' id='type-id-488'>
           <member-type access='private'>
             <typedef-decl name='size_type' type-id='type-id-391' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/allocator.h' line='95' column='1' id='type-id-403'/>
           </member-type>
       </class-decl>
-      <class-decl name='iterator_traits&lt;const wchar_t *&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator_base_types.h' line='186' column='1' id='type-id-491'>
+      <class-decl name='iterator_traits&lt;const wchar_t *&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator_base_types.h' line='186' column='1' id='type-id-489'>
           <member-type access='public'>
-            <typedef-decl name='reference' type-id='type-id-486' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator_base_types.h' line='192' column='1' id='type-id-492'/>
+            <typedef-decl name='reference' type-id='type-id-484' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator_base_types.h' line='192' column='1' id='type-id-490'/>
           </member-type>
           <member-type access='public'>
-            <typedef-decl name='pointer' type-id='type-id-96' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator_base_types.h' line='191' column='1' id='type-id-493'/>
+            <typedef-decl name='pointer' type-id='type-id-96' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator_base_types.h' line='191' column='1' id='type-id-491'/>
           </member-type>
           <member-type access='public'>
-            <typedef-decl name='difference_type' type-id='type-id-344' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator_base_types.h' line='190' column='1' id='type-id-494'/>
+            <typedef-decl name='difference_type' type-id='type-id-344' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator_base_types.h' line='190' column='1' id='type-id-492'/>
           </member-type>
       </class-decl>
     </namespace-decl>
     <namespace-decl name='__gnu_cxx'>
-      <class-decl name='__normal_iterator&lt;const wchar_t *, std::basic_string&lt;wchar_t&gt; &gt;' size-in-bits='64' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='709' column='1' id='type-id-478'>
+      <class-decl name='__normal_iterator&lt;const wchar_t *, std::basic_string&lt;wchar_t&gt; &gt;' size-in-bits='64' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='709' column='1' id='type-id-476'>
           <member-type access='private'>
-            <typedef-decl name='reference' type-id='type-id-492' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='721' column='1' id='type-id-495'/>
+            <typedef-decl name='reference' type-id='type-id-490' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='721' column='1' id='type-id-493'/>
           </member-type>
           <member-type access='private'>
-            <typedef-decl name='pointer' type-id='type-id-493' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='722' column='1' id='type-id-496'/>
+            <typedef-decl name='pointer' type-id='type-id-491' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='722' column='1' id='type-id-494'/>
           </member-type>
           <member-type access='private'>
-            <typedef-decl name='difference_type' type-id='type-id-494' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='720' column='1' id='type-id-497'/>
+            <typedef-decl name='difference_type' type-id='type-id-492' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='720' column='1' id='type-id-495'/>
           </member-type>
         <data-member access='protected' layout-offset-in-bits='0'>
           <var-decl name='_M_current' type-id='type-id-96' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='712' column='1'/>
         </data-member>
         <member-function access='public'>
           <function-decl name='__normal_iterator' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='724' column='1' visibility='default' binding='global' size-in-bits='64'>
-            <parameter type-id='type-id-480' is-artificial='yes'/>
+            <parameter type-id='type-id-478' is-artificial='yes'/>
             <return type-id='type-id-18'/>
           </function-decl>
         </member-function>
         <member-function access='public'>
           <function-decl name='__normal_iterator' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='728' column='1' visibility='default' binding='global' size-in-bits='64'>
-            <parameter type-id='type-id-480' is-artificial='yes'/>
-            <parameter type-id='type-id-488'/>
+            <parameter type-id='type-id-478' is-artificial='yes'/>
+            <parameter type-id='type-id-486'/>
             <return type-id='type-id-18'/>
           </function-decl>
         </member-function>
         <member-function access='public'>
           <function-decl name='operator*' mangled-name='_ZNK9__gnu_cxx17__normal_iteratorIPKwSbIwSt11char_traitsIwESaIwEEEdeEv' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='741' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNK9__gnu_cxx17__normal_iteratorIPKwSbIwSt11char_traitsIwESaIwEEEdeEv'>
-            <parameter type-id='type-id-483' is-artificial='yes'/>
-            <return type-id='type-id-495'/>
+            <parameter type-id='type-id-481' is-artificial='yes'/>
+            <return type-id='type-id-493'/>
           </function-decl>
         </member-function>
         <member-function access='public'>
           <function-decl name='operator-&gt;' mangled-name='_ZNK9__gnu_cxx17__normal_iteratorIPKwSbIwSt11char_traitsIwESaIwEEEptEv' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='745' column='1' visibility='default' binding='global' size-in-bits='64'>
-            <parameter type-id='type-id-483' is-artificial='yes'/>
-            <return type-id='type-id-496'/>
+            <parameter type-id='type-id-481' is-artificial='yes'/>
+            <return type-id='type-id-494'/>
           </function-decl>
         </member-function>
         <member-function access='public'>
           <function-decl name='operator++' mangled-name='_ZN9__gnu_cxx17__normal_iteratorIPKwSbIwSt11char_traitsIwESaIwEEEppEv' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='749' column='1' visibility='default' binding='global' size-in-bits='64'>
-            <parameter type-id='type-id-480' is-artificial='yes'/>
-            <return type-id='type-id-479'/>
+            <parameter type-id='type-id-478' is-artificial='yes'/>
+            <return type-id='type-id-477'/>
           </function-decl>
         </member-function>
         <member-function access='public'>
           <function-decl name='operator++' mangled-name='_ZN9__gnu_cxx17__normal_iteratorIPKwSbIwSt11char_traitsIwESaIwEEEppEi' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='756' column='1' visibility='default' binding='global' size-in-bits='64'>
-            <parameter type-id='type-id-480' is-artificial='yes'/>
+            <parameter type-id='type-id-478' is-artificial='yes'/>
             <parameter type-id='type-id-11'/>
-            <return type-id='type-id-478'/>
+            <return type-id='type-id-476'/>
           </function-decl>
         </member-function>
         <member-function access='public'>
           <function-decl name='operator--' mangled-name='_ZN9__gnu_cxx17__normal_iteratorIPKwSbIwSt11char_traitsIwESaIwEEEmmEv' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='761' column='1' visibility='default' binding='global' size-in-bits='64'>
-            <parameter type-id='type-id-480' is-artificial='yes'/>
-            <return type-id='type-id-479'/>
+            <parameter type-id='type-id-478' is-artificial='yes'/>
+            <return type-id='type-id-477'/>
           </function-decl>
         </member-function>
         <member-function access='public'>
           <function-decl name='operator--' mangled-name='_ZN9__gnu_cxx17__normal_iteratorIPKwSbIwSt11char_traitsIwESaIwEEEmmEi' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='768' column='1' visibility='default' binding='global' size-in-bits='64'>
-            <parameter type-id='type-id-480' is-artificial='yes'/>
+            <parameter type-id='type-id-478' is-artificial='yes'/>
             <parameter type-id='type-id-11'/>
-            <return type-id='type-id-478'/>
+            <return type-id='type-id-476'/>
           </function-decl>
         </member-function>
         <member-function access='public'>
           <function-decl name='operator[]' mangled-name='_ZNK9__gnu_cxx17__normal_iteratorIPKwSbIwSt11char_traitsIwESaIwEEEixEl' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='773' column='1' visibility='default' binding='global' size-in-bits='64'>
-            <parameter type-id='type-id-483' is-artificial='yes'/>
-            <parameter type-id='type-id-497'/>
-            <return type-id='type-id-495'/>
+            <parameter type-id='type-id-481' is-artificial='yes'/>
+            <parameter type-id='type-id-495'/>
+            <return type-id='type-id-493'/>
           </function-decl>
         </member-function>
         <member-function access='public'>
           <function-decl name='operator+=' mangled-name='_ZN9__gnu_cxx17__normal_iteratorIPKwSbIwSt11char_traitsIwESaIwEEEpLEl' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='777' column='1' visibility='default' binding='global' size-in-bits='64'>
-            <parameter type-id='type-id-480' is-artificial='yes'/>
-            <parameter type-id='type-id-497'/>
-            <return type-id='type-id-479'/>
+            <parameter type-id='type-id-478' is-artificial='yes'/>
+            <parameter type-id='type-id-495'/>
+            <return type-id='type-id-477'/>
           </function-decl>
         </member-function>
         <member-function access='public'>
           <function-decl name='operator+' mangled-name='_ZNK9__gnu_cxx17__normal_iteratorIPKwSbIwSt11char_traitsIwESaIwEEEplEl' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='781' column='1' visibility='default' binding='global' size-in-bits='64'>
-            <parameter type-id='type-id-483' is-artificial='yes'/>
-            <parameter type-id='type-id-497'/>
-            <return type-id='type-id-478'/>
+            <parameter type-id='type-id-481' is-artificial='yes'/>
+            <parameter type-id='type-id-495'/>
+            <return type-id='type-id-476'/>
           </function-decl>
         </member-function>
         <member-function access='public'>
           <function-decl name='operator-=' mangled-name='_ZN9__gnu_cxx17__normal_iteratorIPKwSbIwSt11char_traitsIwESaIwEEEmIEl' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='785' column='1' visibility='default' binding='global' size-in-bits='64'>
-            <parameter type-id='type-id-480' is-artificial='yes'/>
-            <parameter type-id='type-id-497'/>
-            <return type-id='type-id-479'/>
+            <parameter type-id='type-id-478' is-artificial='yes'/>
+            <parameter type-id='type-id-495'/>
+            <return type-id='type-id-477'/>
           </function-decl>
         </member-function>
         <member-function access='public'>
           <function-decl name='operator-' mangled-name='_ZNK9__gnu_cxx17__normal_iteratorIPKwSbIwSt11char_traitsIwESaIwEEEmiEl' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='789' column='1' visibility='default' binding='global' size-in-bits='64'>
-            <parameter type-id='type-id-483' is-artificial='yes'/>
-            <parameter type-id='type-id-497'/>
-            <return type-id='type-id-478'/>
+            <parameter type-id='type-id-481' is-artificial='yes'/>
+            <parameter type-id='type-id-495'/>
+            <return type-id='type-id-476'/>
           </function-decl>
         </member-function>
         <member-function access='public'>
           <function-decl name='base' mangled-name='_ZNK9__gnu_cxx17__normal_iteratorIPKwSbIwSt11char_traitsIwESaIwEEE4baseEv' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_iterator.h' line='793' column='1' visibility='default' binding='global' size-in-bits='64'>
-            <parameter type-id='type-id-483' is-artificial='yes'/>
-            <return type-id='type-id-488'/>
+            <parameter type-id='type-id-481' is-artificial='yes'/>
+            <return type-id='type-id-486'/>
           </function-decl>
         </member-function>
       </class-decl>
     </namespace-decl>
   </abi-instr>
   <abi-instr version='1.0' address-size='64' path='src/third_party/boost-1.56.0/libs/filesystem/src/utf8_codecvt_facet.cpp' comp-dir-path='/home/andrew/Documents/10gen/dev/src/mongodb' language='LANG_C_plus_plus'>
-    <type-decl name='unsigned char' size-in-bits='8' id='type-id-498'/>
-    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/wchar.h' line='82' column='1' id='type-id-499'>
+    <type-decl name='unsigned char' size-in-bits='8' id='type-id-496'/>
+    <class-decl name='__anonymous_struct__' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/usr/include/wchar.h' line='82' column='1' id='type-id-497'>
         <member-type access='public'>
-          <union-decl name='__anonymous_union__' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='/usr/include/wchar.h' line='85' column='1' id='type-id-500'>
+          <union-decl name='__anonymous_union__' size-in-bits='32' is-anonymous='yes' visibility='default' filepath='/usr/include/wchar.h' line='85' column='1' id='type-id-498'>
             <data-member access='private'>
               <var-decl name='__wch' type-id='type-id-7' visibility='default' filepath='/usr/include/wchar.h' line='88' column='1'/>
             </data-member>
@@ -6705,117 +6687,117 @@ 
         <var-decl name='__count' type-id='type-id-11' visibility='default' filepath='/usr/include/wchar.h' line='84' column='1'/>
       </data-member>
       <data-member access='public' layout-offset-in-bits='32'>
-        <var-decl name='__value' type-id='type-id-500' visibility='default' filepath='/usr/include/wchar.h' line='93' column='1'/>
+        <var-decl name='__value' type-id='type-id-498' visibility='default' filepath='/usr/include/wchar.h' line='93' column='1'/>
       </data-member>
     </class-decl>
-    <pointer-type-def type-id='type-id-501' size-in-bits='64' id='type-id-502'/>
-    <reference-type-def kind='lvalue' type-id='type-id-62' size-in-bits='64' id='type-id-503'/>
-    <qualified-type-def type-id='type-id-501' const='yes' id='type-id-504'/>
-    <pointer-type-def type-id='type-id-504' size-in-bits='64' id='type-id-505'/>
-    <reference-type-def kind='lvalue' type-id='type-id-36' size-in-bits='64' id='type-id-506'/>
-    <qualified-type-def type-id='type-id-11' const='yes' id='type-id-507'/>
+    <pointer-type-def type-id='type-id-499' size-in-bits='64' id='type-id-500'/>
+    <reference-type-def kind='lvalue' type-id='type-id-62' size-in-bits='64' id='type-id-501'/>
+    <qualified-type-def type-id='type-id-499' const='yes' id='type-id-502'/>
+    <pointer-type-def type-id='type-id-502' size-in-bits='64' id='type-id-503'/>
+    <reference-type-def kind='lvalue' type-id='type-id-36' size-in-bits='64' id='type-id-504'/>
+    <qualified-type-def type-id='type-id-11' const='yes' id='type-id-505'/>
+    <qualified-type-def type-id='type-id-506' const='yes' id='type-id-507'/>
     <qualified-type-def type-id='type-id-508' const='yes' id='type-id-509'/>
-    <qualified-type-def type-id='type-id-510' const='yes' id='type-id-511'/>
-    <reference-type-def kind='lvalue' type-id='type-id-96' size-in-bits='64' id='type-id-512'/>
-    <reference-type-def kind='lvalue' type-id='type-id-33' size-in-bits='64' id='type-id-513'/>
-    <reference-type-def kind='lvalue' type-id='type-id-112' size-in-bits='64' id='type-id-514'/>
+    <reference-type-def kind='lvalue' type-id='type-id-96' size-in-bits='64' id='type-id-510'/>
+    <reference-type-def kind='lvalue' type-id='type-id-33' size-in-bits='64' id='type-id-511'/>
+    <reference-type-def kind='lvalue' type-id='type-id-112' size-in-bits='64' id='type-id-512'/>
     <namespace-decl name='boost'>
       <namespace-decl name='filesystem'>
         <namespace-decl name='detail'>
-          <class-decl name='utf8_codecvt_facet' size-in-bits='192' is-struct='yes' visibility='default' filepath='src/third_party/boost-1.56.0/boost/detail/utf8_codecvt_facet.hpp' line='106' column='1' id='type-id-501'>
+          <class-decl name='utf8_codecvt_facet' size-in-bits='192' is-struct='yes' visibility='default' filepath='src/third_party/boost-1.56.0/boost/detail/utf8_codecvt_facet.hpp' line='106' column='1' id='type-id-499'>
             <base-class access='public' layout-offset-in-bits='0' type-id='type-id-334'/>
             <member-function access='public' constructor='yes'>
               <function-decl name='utf8_codecvt_facet' filepath='src/third_party/boost-1.56.0/boost/detail/utf8_codecvt_facet.hpp' line='110' column='1' visibility='default' binding='global' size-in-bits='64'>
-                <parameter type-id='type-id-502' is-artificial='yes'/>
+                <parameter type-id='type-id-500' is-artificial='yes'/>
                 <parameter type-id='type-id-391'/>
                 <return type-id='type-id-18'/>
               </function-decl>
             </member-function>
             <member-function access='protected'>
               <function-decl name='invalid_continuing_octet' mangled-name='_ZNK5boost10filesystem6detail18utf8_codecvt_facet24invalid_continuing_octetEh' filepath='src/third_party/boost-1.56.0/boost/detail/utf8_codecvt_facet.hpp' line='134' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNK5boost10filesystem6detail18utf8_codecvt_facet24invalid_continuing_octetEh'>
-                <parameter type-id='type-id-505' is-artificial='yes'/>
-                <parameter type-id='type-id-498'/>
+                <parameter type-id='type-id-503' is-artificial='yes'/>
+                <parameter type-id='type-id-496'/>
                 <return type-id='type-id-1'/>
               </function-decl>
             </member-function>
             <member-function access='protected'>
               <function-decl name='invalid_leading_octet' mangled-name='_ZNK5boost10filesystem6detail18utf8_codecvt_facet21invalid_leading_octetEh' filepath='src/third_party/boost-1.56.0/boost/detail/utf8_codecvt_facet.hpp' line='138' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNK5boost10filesystem6detail18utf8_codecvt_facet21invalid_leading_octetEh'>
-                <parameter type-id='type-id-505' is-artificial='yes'/>
-                <parameter type-id='type-id-498'/>
+                <parameter type-id='type-id-503' is-artificial='yes'/>
+                <parameter type-id='type-id-496'/>
                 <return type-id='type-id-1'/>
               </function-decl>
             </member-function>
             <member-function access='protected' static='yes'>
               <function-decl name='get_cont_octet_count' mangled-name='_ZN5boost10filesystem6detail18utf8_codecvt_facet20get_cont_octet_countEh' filepath='src/third_party/boost-1.56.0/boost/detail/utf8_codecvt_facet.hpp' line='144' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZN5boost10filesystem6detail18utf8_codecvt_facet20get_cont_octet_countEh'>
-                <parameter type-id='type-id-498'/>
+                <parameter type-id='type-id-496'/>
                 <return type-id='type-id-7'/>
               </function-decl>
             </member-function>
             <member-function access='protected' static='yes'>
               <function-decl name='get_octet_count' mangled-name='_ZN5boost10filesystem6detail18utf8_codecvt_facet15get_octet_countEh' filepath='src/third_party/boost-1.56.0/boost/detail/utf8_codecvt_facet.hpp' line='148' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZN5boost10filesystem6detail18utf8_codecvt_facet15get_octet_countEh'>
-                <parameter type-id='type-id-498'/>
+                <parameter type-id='type-id-496'/>
                 <return type-id='type-id-7'/>
               </function-decl>
             </member-function>
             <member-function access='protected'>
               <function-decl name='get_cont_octet_out_count' mangled-name='_ZNK5boost10filesystem6detail18utf8_codecvt_facet24get_cont_octet_out_countEw' filepath='src/third_party/boost-1.56.0/boost/detail/utf8_codecvt_facet.hpp' line='152' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNK5boost10filesystem6detail18utf8_codecvt_facet24get_cont_octet_out_countEw'>
-                <parameter type-id='type-id-505' is-artificial='yes'/>
+                <parameter type-id='type-id-503' is-artificial='yes'/>
                 <parameter type-id='type-id-19'/>
                 <return type-id='type-id-11'/>
               </function-decl>
             </member-function>
             <member-function access='protected' vtable-offset='2'>
               <function-decl name='do_out' mangled-name='_ZNK5boost10filesystem6detail18utf8_codecvt_facet6do_outER11__mbstate_tPKwS6_RS6_PcS8_RS8_' filepath='src/third_party/boost-1.56.0/boost/detail/utf8_codecvt_facet.hpp' line='124' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNK5boost10filesystem6detail18utf8_codecvt_facet6do_outER11__mbstate_tPKwS6_RS6_PcS8_RS8_'>
-                <parameter type-id='type-id-505' is-artificial='yes'/>
-                <parameter type-id='type-id-513'/>
+                <parameter type-id='type-id-503' is-artificial='yes'/>
+                <parameter type-id='type-id-511'/>
                 <parameter type-id='type-id-96'/>
                 <parameter type-id='type-id-96'/>
-                <parameter type-id='type-id-512'/>
+                <parameter type-id='type-id-510'/>
                 <parameter type-id='type-id-62'/>
                 <parameter type-id='type-id-62'/>
-                <parameter type-id='type-id-503'/>
+                <parameter type-id='type-id-501'/>
                 <return type-id='type-id-474'/>
               </function-decl>
             </member-function>
             <member-function access='protected' vtable-offset='3'>
               <function-decl name='do_unshift' mangled-name='_ZNK5boost10filesystem6detail18utf8_codecvt_facet10do_unshiftER11__mbstate_tPcS5_RS5_' filepath='src/third_party/boost-1.56.0/boost/detail/utf8_codecvt_facet.hpp' line='159' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNK5boost10filesystem6detail18utf8_codecvt_facet10do_unshiftER11__mbstate_tPcS5_RS5_'>
-                <parameter type-id='type-id-505' is-artificial='yes'/>
-                <parameter type-id='type-id-513'/>
+                <parameter type-id='type-id-503' is-artificial='yes'/>
+                <parameter type-id='type-id-511'/>
                 <parameter type-id='type-id-62'/>
                 <parameter type-id='type-id-62'/>
-                <parameter type-id='type-id-503'/>
+                <parameter type-id='type-id-501'/>
                 <return type-id='type-id-474'/>
               </function-decl>
             </member-function>
             <member-function access='protected' vtable-offset='4'>
               <function-decl name='do_in' mangled-name='_ZNK5boost10filesystem6detail18utf8_codecvt_facet5do_inER11__mbstate_tPKcS6_RS6_PwS8_RS8_' filepath='src/third_party/boost-1.56.0/boost/detail/utf8_codecvt_facet.hpp' line='114' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNK5boost10filesystem6detail18utf8_codecvt_facet5do_inER11__mbstate_tPKcS6_RS6_PwS8_RS8_'>
-                <parameter type-id='type-id-505' is-artificial='yes'/>
-                <parameter type-id='type-id-513'/>
+                <parameter type-id='type-id-503' is-artificial='yes'/>
+                <parameter type-id='type-id-511'/>
                 <parameter type-id='type-id-36'/>
                 <parameter type-id='type-id-36'/>
-                <parameter type-id='type-id-506'/>
+                <parameter type-id='type-id-504'/>
                 <parameter type-id='type-id-112'/>
                 <parameter type-id='type-id-112'/>
-                <parameter type-id='type-id-514'/>
+                <parameter type-id='type-id-512'/>
                 <return type-id='type-id-474'/>
               </function-decl>
             </member-function>
             <member-function access='protected' vtable-offset='5'>
               <function-decl name='do_encoding' mangled-name='_ZNK5boost10filesystem6detail18utf8_codecvt_facet11do_encodingEv' filepath='src/third_party/boost-1.56.0/boost/detail/utf8_codecvt_facet.hpp' line='169' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNK5boost10filesystem6detail18utf8_codecvt_facet11do_encodingEv'>
-                <parameter type-id='type-id-505' is-artificial='yes'/>
+                <parameter type-id='type-id-503' is-artificial='yes'/>
                 <return type-id='type-id-11'/>
               </function-decl>
             </member-function>
             <member-function access='protected' vtable-offset='6'>
               <function-decl name='do_always_noconv' mangled-name='_ZNK5boost10filesystem6detail18utf8_codecvt_facet16do_always_noconvEv' filepath='src/third_party/boost-1.56.0/boost/detail/utf8_codecvt_facet.hpp' line='154' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNK5boost10filesystem6detail18utf8_codecvt_facet16do_always_noconvEv'>
-                <parameter type-id='type-id-505' is-artificial='yes'/>
+                <parameter type-id='type-id-503' is-artificial='yes'/>
                 <return type-id='type-id-1'/>
               </function-decl>
             </member-function>
             <member-function access='protected' vtable-offset='7'>
               <function-decl name='do_length' mangled-name='_ZNK5boost10filesystem6detail18utf8_codecvt_facet9do_lengthER11__mbstate_tPKcS6_m' filepath='src/third_party/boost-1.56.0/boost/detail/utf8_codecvt_facet.hpp' line='176' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNK5boost10filesystem6detail18utf8_codecvt_facet9do_lengthER11__mbstate_tPKcS6_m'>
-                <parameter type-id='type-id-505' is-artificial='yes'/>
-                <parameter type-id='type-id-513'/>
+                <parameter type-id='type-id-503' is-artificial='yes'/>
+                <parameter type-id='type-id-511'/>
                 <parameter type-id='type-id-36'/>
                 <parameter type-id='type-id-36'/>
                 <parameter type-id='type-id-391'/>
@@ -6824,7 +6806,7 @@ 
             </member-function>
             <member-function access='protected' vtable-offset='8'>
               <function-decl name='do_max_length' mangled-name='_ZNK5boost10filesystem6detail18utf8_codecvt_facet13do_max_lengthEv' filepath='src/third_party/boost-1.56.0/boost/detail/utf8_codecvt_facet.hpp' line='184' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNK5boost10filesystem6detail18utf8_codecvt_facet13do_max_lengthEv'>
-                <parameter type-id='type-id-505' is-artificial='yes'/>
+                <parameter type-id='type-id-503' is-artificial='yes'/>
                 <return type-id='type-id-11'/>
               </function-decl>
             </member-function>
@@ -6833,18 +6815,18 @@ 
       </namespace-decl>
     </namespace-decl>
     <namespace-decl name='std'>
-      <class-decl name='numeric_limits&lt;wchar_t&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='650' column='1' id='type-id-515'>
+      <class-decl name='numeric_limits&lt;wchar_t&gt;' size-in-bits='8' is-struct='yes' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='650' column='1' id='type-id-513'>
         <data-member access='public' static='yes'>
           <var-decl name='is_specialized' type-id='type-id-221' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='652' column='1'/>
         </data-member>
         <data-member access='public' static='yes'>
-          <var-decl name='digits' type-id='type-id-507' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='665' column='1'/>
+          <var-decl name='digits' type-id='type-id-505' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='665' column='1'/>
         </data-member>
         <data-member access='public' static='yes'>
-          <var-decl name='digits10' type-id='type-id-507' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='666' column='1'/>
+          <var-decl name='digits10' type-id='type-id-505' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='666' column='1'/>
         </data-member>
         <data-member access='public' static='yes'>
-          <var-decl name='max_digits10' type-id='type-id-507' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='669' column='1'/>
+          <var-decl name='max_digits10' type-id='type-id-505' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='669' column='1'/>
         </data-member>
         <data-member access='public' static='yes'>
           <var-decl name='is_signed' type-id='type-id-221' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='671' column='1'/>
@@ -6856,19 +6838,19 @@ 
           <var-decl name='is_exact' type-id='type-id-221' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='673' column='1'/>
         </data-member>
         <data-member access='public' static='yes'>
-          <var-decl name='radix' type-id='type-id-507' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='674' column='1'/>
+          <var-decl name='radix' type-id='type-id-505' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='674' column='1'/>
         </data-member>
         <data-member access='public' static='yes'>
-          <var-decl name='min_exponent' type-id='type-id-507' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='682' column='1'/>
+          <var-decl name='min_exponent' type-id='type-id-505' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='682' column='1'/>
         </data-member>
         <data-member access='public' static='yes'>
-          <var-decl name='min_exponent10' type-id='type-id-507' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='683' column='1'/>
+          <var-decl name='min_exponent10' type-id='type-id-505' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='683' column='1'/>
         </data-member>
         <data-member access='public' static='yes'>
-          <var-decl name='max_exponent' type-id='type-id-507' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='684' column='1'/>
+          <var-decl name='max_exponent' type-id='type-id-505' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='684' column='1'/>
         </data-member>
         <data-member access='public' static='yes'>
-          <var-decl name='max_exponent10' type-id='type-id-507' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='685' column='1'/>
+          <var-decl name='max_exponent10' type-id='type-id-505' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='685' column='1'/>
         </data-member>
         <data-member access='public' static='yes'>
           <var-decl name='has_infinity' type-id='type-id-221' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='687' column='1'/>
@@ -6880,7 +6862,7 @@ 
           <var-decl name='has_signaling_NaN' type-id='type-id-221' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='689' column='1'/>
         </data-member>
         <data-member access='public' static='yes'>
-          <var-decl name='has_denorm' type-id='type-id-509' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='690' column='1'/>
+          <var-decl name='has_denorm' type-id='type-id-507' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='690' column='1'/>
         </data-member>
         <data-member access='public' static='yes'>
           <var-decl name='has_denorm_loss' type-id='type-id-221' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='692' column='1'/>
@@ -6901,7 +6883,7 @@ 
           <var-decl name='tinyness_before' type-id='type-id-221' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='711' column='1'/>
         </data-member>
         <data-member access='public' static='yes'>
-          <var-decl name='round_style' type-id='type-id-511' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='712' column='1'/>
+          <var-decl name='round_style' type-id='type-id-509' visibility='default' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='712' column='1'/>
         </data-member>
         <member-function access='public' static='yes'>
           <function-decl name='min' mangled-name='_ZNSt14numeric_limitsIwE3minEv' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='655' column='1' visibility='default' binding='global' size-in-bits='64'>
@@ -6949,13 +6931,13 @@ 
           </function-decl>
         </member-function>
       </class-decl>
-      <enum-decl name='float_denorm_style' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='171' column='1' id='type-id-508'>
+      <enum-decl name='float_denorm_style' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='171' column='1' id='type-id-506'>
         <underlying-type type-id='type-id-142'/>
         <enumerator name='denorm_indeterminate' value='-1'/>
         <enumerator name='denorm_absent' value='0'/>
         <enumerator name='denorm_present' value='1'/>
       </enum-decl>
-      <enum-decl name='float_round_style' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='156' column='1' id='type-id-510'>
+      <enum-decl name='float_round_style' filepath='/usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/limits' line='156' column='1' id='type-id-508'>
         <underlying-type type-id='type-id-142'/>
         <enumerator name='round_indeterminate' value='-1'/>
         <enumerator name='round_toward_zero' value='0'/>