Jakub Jelinek b750ff
--- valgrind-3.7.0/coregrind/m_debuginfo/tytypes.c	(revision 12361)
Jakub Jelinek b750ff
+++ valgrind-3.7.0/coregrind/m_debuginfo/tytypes.c	(revision 12362)
Jakub Jelinek b750ff
@@ -54,9 +54,10 @@ Bool ML_(TyEnt__is_type)( TyEnt* te )
Jakub Jelinek b750ff
       case Te_EMPTY: case Te_INDIR: case Te_UNKNOWN: 
Jakub Jelinek b750ff
       case Te_Atom:  case Te_Field: case Te_Bound:
Jakub Jelinek b750ff
          return False;
Jakub Jelinek b750ff
-      case Te_TyBase:   case Te_TyPorR: case Te_TyTyDef:
Jakub Jelinek b750ff
-      case Te_TyStOrUn: case Te_TyEnum: case Te_TyArray:
Jakub Jelinek b750ff
-      case Te_TyFn:     case Te_TyQual: case Te_TyVoid:
Jakub Jelinek b750ff
+      case Te_TyBase:   case Te_TyPtr:     case Te_TyRef:
Jakub Jelinek b750ff
+      case Te_TyPtrMbr: case Te_TyRvalRef: case Te_TyTyDef:
Jakub Jelinek b750ff
+      case Te_TyStOrUn: case Te_TyEnum:    case Te_TyArray:
Jakub Jelinek b750ff
+      case Te_TyFn:     case Te_TyQual:    case Te_TyVoid:
Jakub Jelinek b750ff
          return True;
Jakub Jelinek b750ff
       default:
Jakub Jelinek b750ff
          vg_assert(0);
Jakub Jelinek b750ff
@@ -127,10 +128,20 @@ void ML_(pp_TyEnt)( TyEnt* te )
Jakub Jelinek b750ff
                      te->Te.TyBase.name ? te->Te.TyBase.name
Jakub Jelinek b750ff
                                         : (UChar*)"(null)" );
Jakub Jelinek b750ff
          break;
Jakub Jelinek b750ff
-      case Te_TyPorR:
Jakub Jelinek b750ff
-         VG_(printf)("Te_TyPorR(%d,%c,0x%05lx)",
Jakub Jelinek b750ff
-                     te->Te.TyPorR.szB,
Jakub Jelinek b750ff
-                     te->Te.TyPorR.isPtr ? 'P' : 'R',
Jakub Jelinek b750ff
+      case Te_TyPtr:
Jakub Jelinek b750ff
+         VG_(printf)("Te_TyPtr(%d,0x%05lx)", te->Te.TyPorR.szB,
Jakub Jelinek b750ff
+                     te->Te.TyPorR.typeR);
Jakub Jelinek b750ff
+         break;
Jakub Jelinek b750ff
+      case Te_TyRef:
Jakub Jelinek b750ff
+         VG_(printf)("Te_TyRef(%d,0x%05lx)", te->Te.TyPorR.szB,
Jakub Jelinek b750ff
+                     te->Te.TyPorR.typeR);
Jakub Jelinek b750ff
+         break;
Jakub Jelinek b750ff
+      case Te_TyPtrMbr:
Jakub Jelinek b750ff
+         VG_(printf)("Te_TyMbr(%d,0x%05lx)", te->Te.TyPorR.szB,
Jakub Jelinek b750ff
+                     te->Te.TyPorR.typeR);
Jakub Jelinek b750ff
+         break;
Jakub Jelinek b750ff
+      case Te_TyRvalRef:
Jakub Jelinek b750ff
+         VG_(printf)("Te_TyRvalRef(%d,0x%05lx)", te->Te.TyPorR.szB,
Jakub Jelinek b750ff
                      te->Te.TyPorR.typeR);
Jakub Jelinek b750ff
          break;
Jakub Jelinek b750ff
       case Te_TyTyDef:
Jakub Jelinek b750ff
@@ -237,9 +248,21 @@ void ML_(pp_TyEnt_C_ishly)( XArray* /* o
Jakub Jelinek b750ff
          if (!ent->Te.TyBase.name) goto unhandled;
Jakub Jelinek b750ff
          VG_(printf)("%s", ent->Te.TyBase.name);
Jakub Jelinek b750ff
          break;
Jakub Jelinek b750ff
-      case Te_TyPorR:
Jakub Jelinek b750ff
+      case Te_TyPtr:
Jakub Jelinek b750ff
          ML_(pp_TyEnt_C_ishly)(tyents, ent->Te.TyPorR.typeR);
Jakub Jelinek b750ff
-         VG_(printf)("%s", ent->Te.TyPorR.isPtr ? "*" : "&";;
Jakub Jelinek b750ff
+         VG_(printf)("*");
Jakub Jelinek b750ff
+         break;
Jakub Jelinek b750ff
+      case Te_TyRef:
Jakub Jelinek b750ff
+         ML_(pp_TyEnt_C_ishly)(tyents, ent->Te.TyPorR.typeR);
Jakub Jelinek b750ff
+         VG_(printf)("&";;
Jakub Jelinek b750ff
+         break;
Jakub Jelinek b750ff
+      case Te_TyPtrMbr:
Jakub Jelinek b750ff
+         ML_(pp_TyEnt_C_ishly)(tyents, ent->Te.TyPorR.typeR);
Jakub Jelinek b750ff
+         VG_(printf)("*");
Jakub Jelinek b750ff
+         break;
Jakub Jelinek b750ff
+      case Te_TyRvalRef:
Jakub Jelinek b750ff
+         ML_(pp_TyEnt_C_ishly)(tyents, ent->Te.TyPorR.typeR);
Jakub Jelinek b750ff
+         VG_(printf)("&&";;
Jakub Jelinek b750ff
          break;
Jakub Jelinek b750ff
       case Te_TyEnum:
Jakub Jelinek b750ff
          if (!ent->Te.TyEnum.name) goto unhandled;
Jakub Jelinek b750ff
@@ -503,12 +526,13 @@ Word ML_(TyEnt__cmp_by_all_except_cuOff)
Jakub Jelinek b750ff
       if (r != 0) return r;
Jakub Jelinek b750ff
       r = Asciiz__cmp(te1->Te.TyBase.name, te2->Te.TyBase.name);
Jakub Jelinek b750ff
       return r;
Jakub Jelinek b750ff
-   case Te_TyPorR:
Jakub Jelinek b750ff
+   case Te_TyPtr:
Jakub Jelinek b750ff
+   case Te_TyRef:
Jakub Jelinek b750ff
+   case Te_TyPtrMbr:
Jakub Jelinek b750ff
+   case Te_TyRvalRef:
Jakub Jelinek b750ff
       r = Int__cmp(te1->Te.TyPorR.szB, te2->Te.TyPorR.szB);
Jakub Jelinek b750ff
       if (r != 0) return r;
Jakub Jelinek b750ff
       r = UWord__cmp(te1->Te.TyPorR.typeR, te2->Te.TyPorR.typeR);
Jakub Jelinek b750ff
-      if (r != 0) return r;
Jakub Jelinek b750ff
-      r = Bool__cmp(te1->Te.TyPorR.isPtr, te2->Te.TyPorR.isPtr);
Jakub Jelinek b750ff
       return r;
Jakub Jelinek b750ff
    case Te_TyTyDef:
Jakub Jelinek b750ff
       r = UWord__cmp(te1->Te.TyTyDef.typeR, te2->Te.TyTyDef.typeR);
Jakub Jelinek b750ff
@@ -584,7 +608,10 @@ void ML_(TyEnt__make_EMPTY) ( TyEnt* te
Jakub Jelinek b750ff
       case Te_TyBase:
Jakub Jelinek b750ff
          if (te->Te.TyBase.name) ML_(dinfo_free)(te->Te.TyBase.name);
Jakub Jelinek b750ff
          break;
Jakub Jelinek b750ff
-      case Te_TyPorR:
Jakub Jelinek b750ff
+      case Te_TyPtr:
Jakub Jelinek b750ff
+      case Te_TyRef:
Jakub Jelinek b750ff
+      case Te_TyPtrMbr:
Jakub Jelinek b750ff
+      case Te_TyRvalRef:
Jakub Jelinek b750ff
          break;
Jakub Jelinek b750ff
       case Te_TyTyDef:
Jakub Jelinek b750ff
          if (te->Te.TyTyDef.name) ML_(dinfo_free)(te->Te.TyTyDef.name);
Jakub Jelinek b750ff
@@ -661,7 +688,10 @@ MaybeULong ML_(sizeOfType)( XArray* /* o
Jakub Jelinek b750ff
          if (ent2->tag == Te_UNKNOWN)
Jakub Jelinek b750ff
             return mk_MaybeULong_Nothing(); /*UNKNOWN*/
Jakub Jelinek b750ff
          return ML_(sizeOfType)( tyents, ent->Te.TyTyDef.typeR );
Jakub Jelinek b750ff
-      case Te_TyPorR:
Jakub Jelinek b750ff
+      case Te_TyPtr:
Jakub Jelinek b750ff
+      case Te_TyRef:
Jakub Jelinek b750ff
+      case Te_TyPtrMbr:
Jakub Jelinek b750ff
+      case Te_TyRvalRef:
Jakub Jelinek b750ff
          vg_assert(ent->Te.TyPorR.szB == 4 || ent->Te.TyPorR.szB == 8);
Jakub Jelinek b750ff
          return mk_MaybeULong_Just( ent->Te.TyPorR.szB );
Jakub Jelinek b750ff
       case Te_TyStOrUn:
Jakub Jelinek b750ff
@@ -738,7 +768,10 @@ XArray* /*UChar*/ ML_(describe_type)( /*
Jakub Jelinek b750ff
          case Te_TyEnum:
Jakub Jelinek b750ff
          case Te_TyFn:
Jakub Jelinek b750ff
          case Te_TyVoid:
Jakub Jelinek b750ff
-         case Te_TyPorR:
Jakub Jelinek b750ff
+         case Te_TyPtr:
Jakub Jelinek b750ff
+         case Te_TyRef:
Jakub Jelinek b750ff
+         case Te_TyPtrMbr:
Jakub Jelinek b750ff
+         case Te_TyRvalRef:
Jakub Jelinek b750ff
          case Te_TyBase:
Jakub Jelinek b750ff
             goto done;
Jakub Jelinek b750ff
 
Jakub Jelinek b750ff
--- valgrind-3.7.0/coregrind/m_debuginfo/readdwarf3.c	(revision 12361)
Jakub Jelinek b750ff
+++ valgrind-3.7.0/coregrind/m_debuginfo/readdwarf3.c	(revision 12362)
Jakub Jelinek b750ff
@@ -2221,19 +2221,41 @@ static void parse_type_DIE ( /*MOD*/XArr
Jakub Jelinek b750ff
       goto acquire_Type;
Jakub Jelinek b750ff
    }
Jakub Jelinek b750ff
 
Jakub Jelinek b750ff
+   /*
Jakub Jelinek b750ff
+    * An example of DW_TAG_rvalue_reference_type:
Jakub Jelinek b750ff
+    *
Jakub Jelinek b750ff
+    * $ readelf --debug-dump /usr/lib/debug/usr/lib/libstdc++.so.6.0.16.debug
Jakub Jelinek b750ff
+    *  <1><1014>: Abbrev Number: 55 (DW_TAG_rvalue_reference_type)
Jakub Jelinek b750ff
+    *     <1015>   DW_AT_byte_size   : 4
Jakub Jelinek b750ff
+    *     <1016>   DW_AT_type        : <0xe52>
Jakub Jelinek b750ff
+    */
Jakub Jelinek b750ff
    if (dtag == DW_TAG_pointer_type || dtag == DW_TAG_reference_type
Jakub Jelinek b750ff
-       || dtag == DW_TAG_ptr_to_member_type) {
Jakub Jelinek b750ff
+       || dtag == DW_TAG_ptr_to_member_type
Jakub Jelinek b750ff
+       || dtag == DW_TAG_rvalue_reference_type) {
Jakub Jelinek b750ff
       /* This seems legit for _pointer_type and _reference_type.  I
Jakub Jelinek b750ff
          don't know if rolling _ptr_to_member_type in here really is
Jakub Jelinek b750ff
          legit, but it's better than not handling it at all. */
Jakub Jelinek b750ff
       VG_(memset)(&typeE, 0, sizeof(typeE));
Jakub Jelinek b750ff
       typeE.cuOff = D3_INVALID_CUOFF;
Jakub Jelinek b750ff
-      typeE.tag   = Te_TyPorR;
Jakub Jelinek b750ff
+      switch (dtag) {
Jakub Jelinek b750ff
+      case DW_TAG_pointer_type:
Jakub Jelinek b750ff
+         typeE.tag = Te_TyPtr;
Jakub Jelinek b750ff
+         break;
Jakub Jelinek b750ff
+      case DW_TAG_reference_type:
Jakub Jelinek b750ff
+         typeE.tag = Te_TyRef;
Jakub Jelinek b750ff
+         break;
Jakub Jelinek b750ff
+      case DW_TAG_ptr_to_member_type:
Jakub Jelinek b750ff
+         typeE.tag = Te_TyPtrMbr;
Jakub Jelinek b750ff
+         break;
Jakub Jelinek b750ff
+      case DW_TAG_rvalue_reference_type:
Jakub Jelinek b750ff
+         typeE.tag = Te_TyRvalRef;
Jakub Jelinek b750ff
+         break;
Jakub Jelinek b750ff
+      default:
Jakub Jelinek b750ff
+         vg_assert(False);
Jakub Jelinek b750ff
+      }
Jakub Jelinek b750ff
       /* target type defaults to void */
Jakub Jelinek b750ff
       typeE.Te.TyPorR.typeR = D3_FAKEVOID_CUOFF;
Jakub Jelinek b750ff
-      typeE.Te.TyPorR.isPtr = dtag == DW_TAG_pointer_type
Jakub Jelinek b750ff
-                              || dtag == DW_TAG_ptr_to_member_type;
Jakub Jelinek b750ff
-      /* These three type kinds don't *have* to specify their size, in
Jakub Jelinek b750ff
+      /* These four type kinds don't *have* to specify their size, in
Jakub Jelinek b750ff
          which case we assume it's a machine word.  But if they do
Jakub Jelinek b750ff
          specify it, it must be a machine word :-)  This probably
Jakub Jelinek b750ff
          assumes that the word size of the Dwarf3 we're reading is the
Jakub Jelinek b750ff
@@ -2882,7 +2904,10 @@ static Bool TyEnt__subst_R_fields ( XArr
Jakub Jelinek b750ff
          break;
Jakub Jelinek b750ff
       case Te_TyBase:
Jakub Jelinek b750ff
          break;
Jakub Jelinek b750ff
-      case Te_TyPorR:
Jakub Jelinek b750ff
+      case Te_TyPtr:
Jakub Jelinek b750ff
+      case Te_TyRef:
Jakub Jelinek b750ff
+      case Te_TyPtrMbr:
Jakub Jelinek b750ff
+      case Te_TyRvalRef:
Jakub Jelinek b750ff
          te->Te.TyPorR.typeR
Jakub Jelinek b750ff
             = chase_cuOff( &b, ents, ents_cache, te->Te.TyPorR.typeR );
Jakub Jelinek b750ff
          if (b) changed = True;
Jakub Jelinek b750ff
--- valgrind-3.7.0/coregrind/m_debuginfo/priv_tytypes.h	(revision 12361)
Jakub Jelinek b750ff
+++ valgrind-3.7.0/coregrind/m_debuginfo/priv_tytypes.h	(revision 12362)
Jakub Jelinek b750ff
@@ -45,7 +45,10 @@ typedef
Jakub Jelinek b750ff
       Te_Field,    /* struct/class field defn */
Jakub Jelinek b750ff
       Te_Bound,    /* array bounds indication, for one dimension */
Jakub Jelinek b750ff
       Te_TyBase,   /* base type */
Jakub Jelinek b750ff
-      Te_TyPorR,   /* pointer or reference type */
Jakub Jelinek b750ff
+      Te_TyPtr,    /* pointer type */
Jakub Jelinek b750ff
+      Te_TyRef,    /* reference type */
Jakub Jelinek b750ff
+      Te_TyPtrMbr, /* pointer to member type */
Jakub Jelinek b750ff
+      Te_TyRvalRef,/* rvalue reference type */
Jakub Jelinek b750ff
       Te_TyTyDef,  /* a renaming of some other type */
Jakub Jelinek b750ff
       Te_TyStOrUn, /* structure or union type */
Jakub Jelinek b750ff
       Te_TyEnum,   /* an enum type */
Jakub Jelinek b750ff
@@ -101,7 +104,6 @@ typedef
Jakub Jelinek b750ff
          struct {
Jakub Jelinek b750ff
             Int   szB;
Jakub Jelinek b750ff
             UWord typeR;
Jakub Jelinek b750ff
-            Bool  isPtr;
Jakub Jelinek b750ff
          } TyPorR;
Jakub Jelinek b750ff
          struct {
Jakub Jelinek b750ff
             UChar* name;  /* in mallocville */