[llvm] 9911af4 - WIP: Verify -gsimple-template-names=mangled values

David Blaikie via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 24 14:28:32 PDT 2021


Author: David Blaikie
Date: 2021-09-24T14:28:18-07:00
New Revision: 9911af4b91c670477cf920f168b339bd2f3f307f

URL: https://github.com/llvm/llvm-project/commit/9911af4b91c670477cf920f168b339bd2f3f307f
DIFF: https://github.com/llvm/llvm-project/commit/9911af4b91c670477cf920f168b339bd2f3f307f.diff

LOG: WIP: Verify -gsimple-template-names=mangled values

Clang will encode names that should be able to be simplified as
"_STNname|<template, args>" (eg: "_STNt1|<int>") - this verification
mode will detect these names, decode them, create the original name
("t1<int>") and the simple name ("t1") - letting the simple name run
through the usual rebuilding logic - then compare the two sources of the
full name - the rebuilt and the _STN encoding.

This helps ensure that -gsimple-template-names is lossless.

Added: 
    

Modified: 
    llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h
    llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h
    llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
    llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp
    llvm/test/tools/llvm-dwarfdump/X86/prettyprint_types.s

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h
index 5a3a951623d55..290571b25f89b 100644
--- a/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h
+++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h
@@ -236,6 +236,8 @@ class DWARFDie {
   /// for ShortName if LinkageName is not found.
   /// Returns null if no name is found.
   const char *getName(DINameKind Kind) const;
+  void getFullName(raw_string_ostream &,
+                   std::string *OriginalFullName = nullptr) const;
 
   /// Return the DIE short name resolving DW_AT_specification or
   /// DW_AT_abstract_origin references if necessary. Returns null if no name

diff  --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h
index 5ab216598bb43..d471b80c7fe1f 100644
--- a/llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h
+++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h
@@ -125,6 +125,7 @@ class DWARFVerifier {
   bool verifyUnitHeader(const DWARFDataExtractor DebugInfoData,
                         uint64_t *Offset, unsigned UnitIndex, uint8_t &UnitType,
                         bool &isUnitDWARF64);
+  bool verifyName(const DWARFDie &Die);
 
   /// Verifies the header of a unit in a .debug_info or .debug_types section.
   ///

diff  --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
index eb6758b9725ed..f1a905ebcafbf 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
@@ -175,6 +175,7 @@ struct DWARFTypePrinter {
         OS << ")]";
       }
     }
+    EndedWithTemplate = false;
   }
 
   DWARFDie skipQualifiers(DWARFDie D) {
@@ -197,9 +198,12 @@ struct DWARFTypePrinter {
       OS << '(';
     OS << Ptr;
     Word = false;
+    EndedWithTemplate = false;
   }
 
-  DWARFDie appendUnqualifiedNameBefore(DWARFDie D) {
+  DWARFDie
+  appendUnqualifiedNameBefore(DWARFDie D,
+                              std::string *OriginalFullName = nullptr) {
     Word = true;
     if (!D) {
       OS << "void";
@@ -268,15 +272,54 @@ struct DWARFTypePrinter {
       EndedWithTemplate = false;
       break;
     }
-    default:
+      /*
+    case DW_TAG_structure_type:
+    case DW_TAG_class_type:
+    case DW_TAG_enumeration_type:
+    case DW_TAG_base_type:
+    */
+    default: {
       const char *NamePtr = dwarf::toString(D.find(DW_AT_name), nullptr);
       if (!NamePtr) {
-        appendTypeTagName(D.getTag());
-        break;
+        StringRef TagStr = TagString(D.getTag());
+        static constexpr StringRef Prefix = "DW_TAG_";
+        static constexpr StringRef Suffix = "_type";
+        if (TagStr.startswith(Prefix) && TagStr.endswith(Suffix))
+          OS << TagStr.substr(Prefix.size(),
+                              TagStr.size() - (Prefix.size() + Suffix.size()))
+             << " ";
+        return Inner;
+      }
+      Word = true;
+      StringRef Name = NamePtr;
+      static constexpr StringRef MangledPrefix = "_STN";
+      if (Name.startswith(MangledPrefix)) {
+        Name = Name.drop_front(MangledPrefix.size());
+        auto Separator = Name.find('|');
+        assert(Separator != StringRef::npos);
+        StringRef BaseName = Name.substr(0, Separator);
+        StringRef TemplateArgs = Name.substr(Separator + 1);
+        if (OriginalFullName)
+          *OriginalFullName = (BaseName + TemplateArgs).str();
+        Name = BaseName;
+      } else
+        EndedWithTemplate = Name.endswith(">");
+      OS << Name;
+      // FIXME: This needs to be a bit more narrow, it would fail to
+      // reconstitute a non-operator overload that is a template, like
+      // "operator_thing<int>"
+      if (!Name.endswith(">") && !Name.startswith("operator")) {
+        if (appendTemplateParameters(D)) {
+          if (EndedWithTemplate)
+            OS << ' ';
+          OS << '>';
+          EndedWithTemplate = true;
+          Word = true;
+        }
       }
-      OS << NamePtr;
       break;
     }
+    }
     return Inner;
   }
 
@@ -310,6 +353,13 @@ struct DWARFTypePrinter {
               DW_TAG_ptr_to_member_type);
       break;
     }
+      /*
+    case DW_TAG_structure_type:
+    case DW_TAG_class_type:
+    case DW_TAG_enumeration_type:
+    case DW_TAG_base_type:
+    case DW_TAG_namespace:
+    */
     default:
       break;
     }
@@ -325,6 +375,170 @@ struct DWARFTypePrinter {
       appendScopes(D.getParent());
     return appendUnqualifiedNameBefore(D);
   }
+  bool appendTemplateParameters(DWARFDie D, bool *FirstParameter = nullptr) {
+    bool FirstParameterValue = true;
+    bool IsTemplate = false;
+    if (!FirstParameter)
+      FirstParameter = &FirstParameterValue;
+    for (const DWARFDie &C : D) {
+      auto Sep = [&] {
+        if (*FirstParameter)
+          OS << '<';
+        else
+          OS << ", ";
+        IsTemplate = true;
+        EndedWithTemplate = false;
+        *FirstParameter = false;
+      };
+      if (C.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {
+        IsTemplate = true;
+        appendTemplateParameters(C, FirstParameter);
+      }
+      if (C.getTag() == dwarf::DW_TAG_template_value_parameter) {
+        DWARFDie T = C.getAttributeValueAsReferencedDie(DW_AT_type);
+        Sep();
+        if (T.getTag() == DW_TAG_enumeration_type) {
+          auto V = C.find(DW_AT_const_value);
+          bool FoundEnumerator = false;
+          for (const DWARFDie &Enumerator : T) {
+            auto EV = Enumerator.find(DW_AT_const_value);
+            if (V && EV &&
+                V->getAsSignedConstant() == EV->getAsSignedConstant()) {
+              if (T.find(DW_AT_enum_class)) {
+                appendQualifiedName(T);
+                OS << "::";
+              } else
+                appendScopes(T.getParent());
+              OS << Enumerator.getShortName();
+              FoundEnumerator = true;
+              break;
+            }
+          }
+          if (FoundEnumerator)
+            continue;
+          OS << '(';
+          appendQualifiedName(T);
+          OS << ')';
+          OS << to_string(*V->getAsSignedConstant());
+          continue;
+        }
+        // /Maybe/ we could do pointer type parameters, looking for the
+        // symbol in the ELF symbol table to get back to the variable...
+        // but probably not worth it.
+        if (T.getTag() == DW_TAG_pointer_type)
+          continue;
+        const char *RawName = dwarf::toString(T.find(DW_AT_name), nullptr);
+        assert(RawName);
+        StringRef Name = RawName;
+        auto V = C.find(DW_AT_const_value);
+        bool IsQualifiedChar = false;
+        if (Name == "bool") {
+          OS << (*V->getAsUnsignedConstant() ? "true" : "false");
+        } else if (Name == "short") {
+          OS << "(short)";
+          OS << to_string(*V->getAsSignedConstant());
+        } else if (Name == "unsigned short") {
+          OS << "(unsigned short)";
+          OS << to_string(*V->getAsSignedConstant());
+        } else if (Name == "int")
+          OS << to_string(*V->getAsSignedConstant());
+        else if (Name == "long") {
+          OS << to_string(*V->getAsSignedConstant());
+          OS << "L";
+        } else if (Name == "long long") {
+          OS << to_string(*V->getAsSignedConstant());
+          OS << "LL";
+        } else if (Name == "unsigned int") {
+          OS << to_string(*V->getAsUnsignedConstant());
+          OS << "U";
+        } else if (Name == "unsigned long") {
+          OS << to_string(*V->getAsUnsignedConstant());
+          OS << "UL";
+        } else if (Name == "unsigned long long") {
+          OS << to_string(*V->getAsUnsignedConstant());
+          OS << "ULL";
+        } else if (Name == "char" ||
+                   (IsQualifiedChar =
+                        (Name == "unsigned char" || Name == "signed char"))) {
+          // FIXME: check T's DW_AT_type to see if it's signed or not (since
+          // char signedness is implementation defined).
+          auto Val = *V->getAsSignedConstant();
+          // Copied/hacked up from Clang's CharacterLiteral::print - incomplete
+          // (doesn't actually support 
diff erent character types/widths, sign
+          // handling's not done, and doesn't correctly test if a character is
+          // printable or needs to use a numeric escape sequence instead)
+          if (IsQualifiedChar) {
+            OS << '(';
+            OS << Name;
+            OS << ')';
+          }
+          switch (Val) {
+          case '\\':
+            OS << "'\\\\'";
+            break;
+          case '\'':
+            OS << "'\\''";
+            break;
+          case '\a':
+            // TODO: K&R: the meaning of '\\a' is 
diff erent in traditional C
+            OS << "'\\a'";
+            break;
+          case '\b':
+            OS << "'\\b'";
+            break;
+          case '\f':
+            OS << "'\\f'";
+            break;
+          case '\n':
+            OS << "'\\n'";
+            break;
+          case '\r':
+            OS << "'\\r'";
+            break;
+          case '\t':
+            OS << "'\\t'";
+            break;
+          case '\v':
+            OS << "'\\v'";
+            break;
+          default:
+            if ((Val & ~0xFFu) == ~0xFFu)
+              Val &= 0xFFu;
+            if (Val < 127 && Val >= 32) {
+              OS << "'";
+              OS << (char)Val;
+              OS << "'";
+            } else if (Val < 256)
+              OS << to_string(llvm::format("'\\x%02x'", Val));
+            else if (Val <= 0xFFFF)
+              OS << to_string(llvm::format("'\\u%04x'", Val));
+            else
+              OS << to_string(llvm::format("'\\U%08x'", Val));
+          }
+        }
+        continue;
+      }
+      if (C.getTag() == dwarf::DW_TAG_GNU_template_template_param) {
+        const char *RawName =
+            dwarf::toString(C.find(DW_AT_GNU_template_name), nullptr);
+        assert(RawName);
+        StringRef Name = RawName;
+        Sep();
+        OS << Name;
+        continue;
+      }
+      if (C.getTag() != dwarf::DW_TAG_template_type_parameter)
+        continue;
+      auto TypeAttr = C.find(DW_AT_type);
+      Sep();
+      appendQualifiedName(TypeAttr
+                              ? C.getAttributeValueAsReferencedDie(*TypeAttr)
+                              : DWARFDie());
+    }
+    if (IsTemplate && *FirstParameter && FirstParameter == &FirstParameterValue)
+      OS << '<';
+    return IsTemplate;
+  }
   void decomposeConstVolatile(DWARFDie &N, DWARFDie &T, DWARFDie &C,
                               DWARFDie &V) {
     (N.getTag() == DW_TAG_const_type ? C : V) = N;
@@ -386,10 +600,11 @@ struct DWARFTypePrinter {
   }
 
   /// Recursively append the DIE type name when applicable.
-  void appendUnqualifiedName(const DWARFDie &D) {
+  void appendUnqualifiedName(DWARFDie D,
+                             std::string *OriginalFullName = nullptr) {
     // FIXME: We should have pretty printers per language. Currently we print
     // everything as if it was C++ and fall back to the TAG type name.
-    DWARFDie Inner = appendUnqualifiedNameBefore(D);
+    DWARFDie Inner = appendUnqualifiedNameBefore(D, OriginalFullName);
     appendUnqualifiedNameAfter(D, Inner);
   }
 
@@ -586,6 +801,14 @@ static void dumpAttribute(raw_ostream &OS, const DWARFDie &Die,
   OS << ")\n";
 }
 
+void DWARFDie::getFullName(raw_string_ostream &OS,
+                           std::string *OriginalFullName) const {
+  const char *NamePtr = getShortName();
+  if (!NamePtr)
+    return;
+  DWARFTypePrinter(OS).appendUnqualifiedName(*this, OriginalFullName);
+}
+
 bool DWARFDie::isSubprogramDIE() const { return getTag() == DW_TAG_subprogram; }
 
 bool DWARFDie::isSubroutineDIE() const {

diff  --git a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp
index 11301175768ee..9da2236a273d9 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp
@@ -7,6 +7,7 @@
 //===----------------------------------------------------------------------===//
 #include "llvm/DebugInfo/DWARF/DWARFVerifier.h"
 #include "llvm/ADT/SmallSet.h"
+#include "llvm/BinaryFormat/Dwarf.h"
 #include "llvm/DebugInfo/DWARF/DWARFCompileUnit.h"
 #include "llvm/DebugInfo/DWARF/DWARFContext.h"
 #include "llvm/DebugInfo/DWARF/DWARFDebugLine.h"
@@ -161,6 +162,26 @@ bool DWARFVerifier::verifyUnitHeader(const DWARFDataExtractor DebugInfoData,
   return Success;
 }
 
+bool DWARFVerifier::verifyName(const DWARFDie &Die) {
+  // FIXME Add some kind of record of which DIE names have already failed and
+  // don't bother checking a DIE that uses an already failed DIE.
+
+  std::string ReconstructedName;
+  raw_string_ostream OS(ReconstructedName);
+  std::string OriginalFullName;
+  Die.getFullName(OS, &OriginalFullName);
+  OS.flush();
+  if (!OriginalFullName.empty() && OriginalFullName != ReconstructedName) {
+    error() << "Simplified template DW_AT_name could not be reconstituted:\n"
+            << formatv("         original: {0}\n"
+                       "    reconstituted: {1}\n",
+                       OriginalFullName, ReconstructedName);
+    dump(Die) << '\n';
+    dump(Die.getDwarfUnit()->getUnitDIE()) << '\n';
+  }
+  return 0;
+}
+
 unsigned DWARFVerifier::verifyUnitContents(DWARFUnit &Unit,
                                            ReferenceMap &UnitLocalReferences,
                                            ReferenceMap &CrossUnitReferences) {
@@ -178,6 +199,8 @@ unsigned DWARFVerifier::verifyUnitContents(DWARFUnit &Unit,
                                            CrossUnitReferences);
     }
 
+    NumUnitErrors += verifyName(Die);
+
     if (Die.hasChildren()) {
       if (Die.getFirstChild().isValid() &&
           Die.getFirstChild().getTag() == DW_TAG_null) {

diff  --git a/llvm/test/tools/llvm-dwarfdump/X86/prettyprint_types.s b/llvm/test/tools/llvm-dwarfdump/X86/prettyprint_types.s
index 6c2dc4d51f9f4..cd62bf9159898 100644
--- a/llvm/test/tools/llvm-dwarfdump/X86/prettyprint_types.s
+++ b/llvm/test/tools/llvm-dwarfdump/X86/prettyprint_types.s
@@ -2,49 +2,74 @@
 # RUN:   | llvm-dwarfdump --name=t1 --show-children - | FileCheck %s
 
 # Assembly generated from the following source:
-# 
-#  struct foo;
-#  template <typename... Ts>
-#  struct t1 {};
-#  namespace ns {
-#  struct inner { };
-#  }
-#  namespace {
-#  struct anon_ns_mem { };
-#  }
-#  t1<
-#      // base type
-#      int,
-#      // nullptr unspecified type
-#      decltype(nullptr),
-#      // reference type
-#      int &,
-#      // rvalue reference type
-#      int &&,
-#      // pointer types
-#      int *, const void *const *, const void *const, int *const volatile,
-#      int *volatile, void *const,
-#      // pointer to member variable
-#      int foo::*,
-#      // pointer to member functions
-#      void (foo::*)(int), void (foo::*const &)() const volatile &&,
-#      // arrays
-#      int *const (&)[1], int *const[1], const int (&)[1], const int[1],
-#      // subroutine types
-#      int(), void(int), void(int, int), void (*)(foo *, int), void (*const)(),
-#      void() const, void() volatile &&, void() const volatile &,
-#      void(const volatile foo *), void (*(int))(float),
-#      // qualified types
-#      ns::inner, ns::inner(), ns::inner[1], ns::inner *, ns::inner ns::inner::*,
-#      const ns::inner, anon_ns_mem>
-#      v1;
-#  // extern function to force the code to be emitted - otherwise v1 (having
-#  // internal linkage due to being of a type instantiated with an internal
-#  // linkage type) would be optimized away as unused.
-#  __attribute__((nodebug)) void*f2() {
-#    return &v1;
-#  }
-# 
+#
+#   struct foo;
+#   template <typename... Ts>
+#   struct t1 {};
+#   namespace ns {
+#   struct inner { };
+#   }
+#   namespace {
+#   struct anon_ns_mem { };
+#   }
+#   template <typename T>
+#   struct t2 { };
+#   enum e1 {
+#     E1
+#   };
+#   enum class e2 {
+#     E2
+#   };
+#   template<typename T, T V>
+#   struct tv { };
+#   template<char ...C>
+#   struct tc { };
+#   t1<
+#       // base type
+#       int,
+#       // nullptr unspecified type
+#       decltype(nullptr),
+#       // reference type
+#       int &,
+#       // rvalue reference type
+#       int &&,
+#       // pointer types
+#       int *, const void *const *, const void *const, int *const volatile,
+#       int *volatile, void *const,
+#       // pointer to member variable
+#       int foo::*,
+#       // pointer to member functions
+#       void (foo::*)(int), void (foo::*const &)() const volatile &&,
+#       // arrays
+#       int *const (&)[1], int *const[1], const int (&)[1], const int[1],
+#       // subroutine types
+#       int(), void(int), void(int, int), void (*)(foo *, int), void (*const)(),
+#       void() const, void() volatile &&, void() const volatile &,
+#       void(const volatile foo *), void (*(int))(float),
+#       // qualified types
+#       ns::inner, ns::inner(), ns::inner[1], ns::inner *, ns::inner ns::inner::*,
+#       ns::inner (ns::inner::*)(ns::inner), const ns::inner, anon_ns_mem,
+#       // templates
+#       t2<t2<int>>,
+#       // enum literals
+#       tv<e1, E1>, tv<e1, (e1)1>, tv<e2, e2::E2>,
+#       // char literals
+#       tv<unsigned char, 'x'>,
+#       tc<'x', '\\', '\'', '\a', '\b', '\f', '\n', '\r', '\t', '\v', (char)127>,
+#       // integral literals
+#       tv<bool, true>, tv<bool, false>, tv<short, 0>, tv<unsigned short, 0>,
+#       tv<int, 0>, tv<long, 0L>, tv<long long, 0LL>, tv<unsigned, 0U>,
+#       tv<unsigned long, 0UL>, tv<unsigned long long, 0ULL>
+#       // end of template parameter list
+#       >
+#       v1;
+#   // extern function to force the code to be emitted - otherwise v1 (having
+#   // internal linkage due to being of a type instantiated with an internal
+#   // linkage type) would be optimized away as unused.
+#   __attribute__((nodebug)) void*f1() {
+#     return &v1;
+#   }
+#
 # With the name of the "t1<...>" type renamed to "t1" (or using
 # -gsimple-template-names) to make it easy to query for.
 # Note that the llvm-dwarfdump command uses --name=t1 --show-children to only
@@ -52,6 +77,7 @@
 # intended and to avoid visiting subtypes that aren't intended to be tested
 # separately.
 
+
 # base_type
 # CHECK:   DW_AT_type{{.*}}"int"
 
@@ -109,6 +135,37 @@
 # CHECK:   DW_AT_type{{.*}}"const ns::inner"
 # CHECK:   DW_AT_type{{.*}}"(anonymous namespace)::anon_ns_mem"
 
+# template types
+# CHECK:   DW_AT_type{{.*}}"t2<t2<int> >"
+
+# enum literals
+# CHECK:   DW_AT_type{{.*}}"tv<e1, E1>")
+# CHECK:   DW_AT_type{{.*}}"tv<e1, (e1)1>")
+# CHECK:   DW_AT_type{{.*}}"tv<e2, e2::E2>")
+
+# char literals
+# CHECK:   DW_AT_type{{.*}}"tv<unsigned char, (unsigned char)'x'>")
+# CHECK:   DW_AT_type{{.*}}"tc<'x', '\\', '\'', '\a', '\b', '\f', '\n', '\r', '\t', '\v', '\x7f'>")
+
+# bool literals
+# CHECK:   DW_AT_type{{.*}}"tv<bool, true>")
+# CHECK:   DW_AT_type{{.*}}"tv<bool, false>")
+
+# int literals - these ones are a bit tricky since Clang is currently
+# transforms integer type names (perhaps originally motivated to match GCC?) at
+# the very end of `CGDebugInfo::CreateType(const BuiltinType *BT)`. The LLVM IR
+# in this test is produced without those transformations. We should either add
+# some code to libDebugInfoDWARF to reverse these transformations, or stop doing
+# this transformation in clang if it's no longer needed.
+# CHECK:   DW_AT_type{{.*}}"tv<short, (short)0>"
+# CHECK:   DW_AT_type{{.*}}"tv<unsigned short, (unsigned short)0>"
+# CHECK:   DW_AT_type{{.*}}"tv<int, 0>"
+# CHECK:   DW_AT_type{{.*}}"tv<long, 0L>"
+# CHECK:   DW_AT_type{{.*}}"tv<long long, 0LL>"
+# CHECK:   DW_AT_type{{.*}}"tv<unsigned int, 0U>"
+# CHECK:   DW_AT_type{{.*}}"tv<unsigned long, 0UL>"
+# CHECK:   DW_AT_type{{.*}}"tv<unsigned long long, 0ULL>"
+
 	.section	.debug_abbrev,"", at progbits
 	.byte	1                               # Abbreviation Code
 	.byte	17                              # DW_TAG_compile_unit
@@ -350,6 +407,105 @@
 	.byte	1                               # DW_CHILDREN_yes
 	.byte	0                               # EOM(1)
 	.byte	0                               # EOM(2)
+	.byte	31                              # Abbreviation Code
+	.byte	19                              # DW_TAG_structure_type
+	.byte	1                               # DW_CHILDREN_yes
+	.byte	3                               # DW_AT_name
+	.byte	14                              # DW_FORM_strp
+	.byte	60                              # DW_AT_declaration
+	.byte	25                              # DW_FORM_flag_present
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	32                              # Abbreviation Code
+	.byte	47                              # DW_TAG_template_type_parameter
+	.byte	0                               # DW_CHILDREN_no
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	3                               # DW_AT_name
+	.byte	14                              # DW_FORM_strp
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	33                              # Abbreviation Code
+	.byte	48                              # DW_TAG_template_value_parameter
+	.byte	0                               # DW_CHILDREN_no
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	3                               # DW_AT_name
+	.byte	14                              # DW_FORM_strp
+	.byte	28                              # DW_AT_const_value
+	.byte	15                              # DW_FORM_udata
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	34                              # Abbreviation Code
+	.byte	4                               # DW_TAG_enumeration_type
+	.byte	1                               # DW_CHILDREN_yes
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	3                               # DW_AT_name
+	.byte	14                              # DW_FORM_strp
+	.byte	11                              # DW_AT_byte_size
+	.byte	11                              # DW_FORM_data1
+	.byte	58                              # DW_AT_decl_file
+	.byte	11                              # DW_FORM_data1
+	.byte	59                              # DW_AT_decl_line
+	.byte	11                              # DW_FORM_data1
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	35                              # Abbreviation Code
+	.byte	40                              # DW_TAG_enumerator
+	.byte	0                               # DW_CHILDREN_no
+	.byte	3                               # DW_AT_name
+	.byte	14                              # DW_FORM_strp
+	.byte	28                              # DW_AT_const_value
+	.byte	15                              # DW_FORM_udata
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	36                              # Abbreviation Code
+	.byte	48                              # DW_TAG_template_value_parameter
+	.byte	0                               # DW_CHILDREN_no
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	3                               # DW_AT_name
+	.byte	14                              # DW_FORM_strp
+	.byte	28                              # DW_AT_const_value
+	.byte	13                              # DW_FORM_sdata
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	37                              # Abbreviation Code
+	.byte	4                               # DW_TAG_enumeration_type
+	.byte	1                               # DW_CHILDREN_yes
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	109                             # DW_AT_enum_class
+	.byte	25                              # DW_FORM_flag_present
+	.byte	3                               # DW_AT_name
+	.byte	14                              # DW_FORM_strp
+	.byte	11                              # DW_AT_byte_size
+	.byte	11                              # DW_FORM_data1
+	.byte	58                              # DW_AT_decl_file
+	.byte	11                              # DW_FORM_data1
+	.byte	59                              # DW_AT_decl_line
+	.byte	11                              # DW_FORM_data1
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	38                              # Abbreviation Code
+	.byte	40                              # DW_TAG_enumerator
+	.byte	0                               # DW_CHILDREN_no
+	.byte	3                               # DW_AT_name
+	.byte	14                              # DW_FORM_strp
+	.byte	28                              # DW_AT_const_value
+	.byte	13                              # DW_FORM_sdata
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
+	.byte	39                              # Abbreviation Code
+	.byte	48                              # DW_TAG_template_value_parameter
+	.byte	0                               # DW_CHILDREN_no
+	.byte	73                              # DW_AT_type
+	.byte	19                              # DW_FORM_ref4
+	.byte	28                              # DW_AT_const_value
+	.byte	13                              # DW_FORM_sdata
+	.byte	0                               # EOM(1)
+	.byte	0                               # EOM(2)
 	.byte	0                               # EOM(3)
 	.section	.debug_info,"", at progbits
 .Lcu_begin0:
@@ -358,7 +514,7 @@
 	.short	4                               # DWARF version number
 	.long	.debug_abbrev                   # Offset Into Abbrev. Section
 	.byte	8                               # Address Size (in bytes)
-	.byte	1                               # Abbrev [1] 0xb:0x266 DW_TAG_compile_unit
+	.byte	1                               # Abbrev [1] 0xb:0x4fd DW_TAG_compile_unit
 	.long	.Linfo_string0                  # DW_AT_producer
 	.short	33                              # DW_AT_language
 	.long	.Linfo_string1                  # DW_AT_name
@@ -368,276 +524,582 @@
 	.long	.Linfo_string3                  # DW_AT_name
 	.long	51                              # DW_AT_type
 	.byte	1                               # DW_AT_decl_file
-	.byte	35                              # DW_AT_decl_line
+	.byte	60                              # DW_AT_decl_line
 	.byte	9                               # DW_AT_location
 	.byte	3
 	.quad	v1
-	.byte	3                               # Abbrev [3] 0x33:0xba DW_TAG_structure_type
+	.byte	3                               # Abbrev [3] 0x33:0x10f DW_TAG_structure_type
 	.byte	5                               # DW_AT_calling_convention
-	.long	.Linfo_string13                 # DW_AT_name
+	.long	.Linfo_string33                 # DW_AT_name
 	.byte	1                               # DW_AT_byte_size
 	.byte	1                               # DW_AT_decl_file
 	.byte	3                               # DW_AT_decl_line
-	.byte	4                               # Abbrev [4] 0x3c:0xb0 DW_TAG_GNU_template_parameter_pack
+	.byte	4                               # Abbrev [4] 0x3c:0x105 DW_TAG_GNU_template_parameter_pack
 	.long	.Linfo_string4                  # DW_AT_name
 	.byte	5                               # Abbrev [5] 0x41:0x5 DW_TAG_template_type_parameter
-	.long	237                             # DW_AT_type
+	.long	322                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0x46:0x5 DW_TAG_template_type_parameter
-	.long	244                             # DW_AT_type
+	.long	329                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0x4b:0x5 DW_TAG_template_type_parameter
-	.long	249                             # DW_AT_type
+	.long	334                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0x50:0x5 DW_TAG_template_type_parameter
-	.long	254                             # DW_AT_type
+	.long	339                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0x55:0x5 DW_TAG_template_type_parameter
-	.long	259                             # DW_AT_type
+	.long	344                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0x5a:0x5 DW_TAG_template_type_parameter
-	.long	264                             # DW_AT_type
+	.long	349                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0x5f:0x5 DW_TAG_template_type_parameter
-	.long	269                             # DW_AT_type
+	.long	354                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0x64:0x5 DW_TAG_template_type_parameter
-	.long	280                             # DW_AT_type
+	.long	365                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0x69:0x5 DW_TAG_template_type_parameter
-	.long	285                             # DW_AT_type
+	.long	370                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0x6e:0x5 DW_TAG_template_type_parameter
-	.long	290                             # DW_AT_type
+	.long	375                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0x73:0x5 DW_TAG_template_type_parameter
-	.long	296                             # DW_AT_type
+	.long	381                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0x78:0x5 DW_TAG_template_type_parameter
-	.long	310                             # DW_AT_type
+	.long	395                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0x7d:0x5 DW_TAG_template_type_parameter
-	.long	336                             # DW_AT_type
+	.long	421                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0x82:0x5 DW_TAG_template_type_parameter
-	.long	377                             # DW_AT_type
+	.long	462                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0x87:0x5 DW_TAG_template_type_parameter
-	.long	382                             # DW_AT_type
+	.long	467                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0x8c:0x5 DW_TAG_template_type_parameter
-	.long	406                             # DW_AT_type
+	.long	491                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0x91:0x5 DW_TAG_template_type_parameter
-	.long	411                             # DW_AT_type
+	.long	496                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0x96:0x5 DW_TAG_template_type_parameter
-	.long	428                             # DW_AT_type
+	.long	513                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0x9b:0x5 DW_TAG_template_type_parameter
-	.long	433                             # DW_AT_type
+	.long	518                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0xa0:0x5 DW_TAG_template_type_parameter
-	.long	440                             # DW_AT_type
+	.long	525                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0xa5:0x5 DW_TAG_template_type_parameter
-	.long	452                             # DW_AT_type
+	.long	537                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0xaa:0x5 DW_TAG_template_type_parameter
-	.long	474                             # DW_AT_type
+	.long	559                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0xaf:0x5 DW_TAG_template_type_parameter
-	.long	485                             # DW_AT_type
+	.long	570                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0xb4:0x5 DW_TAG_template_type_parameter
-	.long	490                             # DW_AT_type
+	.long	575                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0xb9:0x5 DW_TAG_template_type_parameter
-	.long	496                             # DW_AT_type
+	.long	581                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0xbe:0x5 DW_TAG_template_type_parameter
-	.long	507                             # DW_AT_type
+	.long	592                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0xc3:0x5 DW_TAG_template_type_parameter
-	.long	519                             # DW_AT_type
+	.long	604                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0xc8:0x5 DW_TAG_template_type_parameter
-	.long	554                             # DW_AT_type
+	.long	639                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0xcd:0x5 DW_TAG_template_type_parameter
-	.long	560                             # DW_AT_type
+	.long	645                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0xd2:0x5 DW_TAG_template_type_parameter
-	.long	565                             # DW_AT_type
+	.long	650                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0xd7:0x5 DW_TAG_template_type_parameter
-	.long	577                             # DW_AT_type
+	.long	662                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0xdc:0x5 DW_TAG_template_type_parameter
-	.long	582                             # DW_AT_type
+	.long	667                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0xe1:0x5 DW_TAG_template_type_parameter
-	.long	612                             # DW_AT_type
+	.long	676                             # DW_AT_type
 	.byte	5                               # Abbrev [5] 0xe6:0x5 DW_TAG_template_type_parameter
-	.long	618                             # DW_AT_type
+	.long	706                             # DW_AT_type
+	.byte	5                               # Abbrev [5] 0xeb:0x5 DW_TAG_template_type_parameter
+	.long	712                             # DW_AT_type
+	.byte	5                               # Abbrev [5] 0xf0:0x5 DW_TAG_template_type_parameter
+	.long	718                             # DW_AT_type
+	.byte	5                               # Abbrev [5] 0xf5:0x5 DW_TAG_template_type_parameter
+	.long	748                             # DW_AT_type
+	.byte	5                               # Abbrev [5] 0xfa:0x5 DW_TAG_template_type_parameter
+	.long	799                             # DW_AT_type
+	.byte	5                               # Abbrev [5] 0xff:0x5 DW_TAG_template_type_parameter
+	.long	824                             # DW_AT_type
+	.byte	5                               # Abbrev [5] 0x104:0x5 DW_TAG_template_type_parameter
+	.long	868                             # DW_AT_type
+	.byte	5                               # Abbrev [5] 0x109:0x5 DW_TAG_template_type_parameter
+	.long	900                             # DW_AT_type
+	.byte	5                               # Abbrev [5] 0x10e:0x5 DW_TAG_template_type_parameter
+	.long	988                             # DW_AT_type
+	.byte	5                               # Abbrev [5] 0x113:0x5 DW_TAG_template_type_parameter
+	.long	1020                            # DW_AT_type
+	.byte	5                               # Abbrev [5] 0x118:0x5 DW_TAG_template_type_parameter
+	.long	1045                            # DW_AT_type
+	.byte	5                               # Abbrev [5] 0x11d:0x5 DW_TAG_template_type_parameter
+	.long	1077                            # DW_AT_type
+	.byte	5                               # Abbrev [5] 0x122:0x5 DW_TAG_template_type_parameter
+	.long	1109                            # DW_AT_type
+	.byte	5                               # Abbrev [5] 0x127:0x5 DW_TAG_template_type_parameter
+	.long	1134                            # DW_AT_type
+	.byte	5                               # Abbrev [5] 0x12c:0x5 DW_TAG_template_type_parameter
+	.long	1166                            # DW_AT_type
+	.byte	5                               # Abbrev [5] 0x131:0x5 DW_TAG_template_type_parameter
+	.long	1198                            # DW_AT_type
+	.byte	5                               # Abbrev [5] 0x136:0x5 DW_TAG_template_type_parameter
+	.long	1223                            # DW_AT_type
+	.byte	5                               # Abbrev [5] 0x13b:0x5 DW_TAG_template_type_parameter
+	.long	1255                            # DW_AT_type
 	.byte	0                               # End Of Children Mark
 	.byte	0                               # End Of Children Mark
-	.byte	6                               # Abbrev [6] 0xed:0x7 DW_TAG_base_type
+	.byte	6                               # Abbrev [6] 0x142:0x7 DW_TAG_base_type
 	.long	.Linfo_string5                  # DW_AT_name
 	.byte	5                               # DW_AT_encoding
 	.byte	4                               # DW_AT_byte_size
-	.byte	7                               # Abbrev [7] 0xf4:0x5 DW_TAG_unspecified_type
+	.byte	7                               # Abbrev [7] 0x149:0x5 DW_TAG_unspecified_type
 	.long	.Linfo_string6                  # DW_AT_name
-	.byte	8                               # Abbrev [8] 0xf9:0x5 DW_TAG_reference_type
-	.long	237                             # DW_AT_type
-	.byte	9                               # Abbrev [9] 0xfe:0x5 DW_TAG_rvalue_reference_type
-	.long	237                             # DW_AT_type
-	.byte	10                              # Abbrev [10] 0x103:0x5 DW_TAG_pointer_type
-	.long	237                             # DW_AT_type
-	.byte	10                              # Abbrev [10] 0x108:0x5 DW_TAG_pointer_type
-	.long	269                             # DW_AT_type
-	.byte	11                              # Abbrev [11] 0x10d:0x5 DW_TAG_const_type
-	.long	274                             # DW_AT_type
-	.byte	10                              # Abbrev [10] 0x112:0x5 DW_TAG_pointer_type
-	.long	279                             # DW_AT_type
-	.byte	12                              # Abbrev [12] 0x117:0x1 DW_TAG_const_type
-	.byte	11                              # Abbrev [11] 0x118:0x5 DW_TAG_const_type
-	.long	285                             # DW_AT_type
-	.byte	13                              # Abbrev [13] 0x11d:0x5 DW_TAG_volatile_type
-	.long	259                             # DW_AT_type
-	.byte	11                              # Abbrev [11] 0x122:0x5 DW_TAG_const_type
-	.long	295                             # DW_AT_type
-	.byte	14                              # Abbrev [14] 0x127:0x1 DW_TAG_pointer_type
-	.byte	15                              # Abbrev [15] 0x128:0x9 DW_TAG_ptr_to_member_type
-	.long	237                             # DW_AT_type
-	.long	305                             # DW_AT_containing_type
-	.byte	16                              # Abbrev [16] 0x131:0x5 DW_TAG_structure_type
+	.byte	8                               # Abbrev [8] 0x14e:0x5 DW_TAG_reference_type
+	.long	322                             # DW_AT_type
+	.byte	9                               # Abbrev [9] 0x153:0x5 DW_TAG_rvalue_reference_type
+	.long	322                             # DW_AT_type
+	.byte	10                              # Abbrev [10] 0x158:0x5 DW_TAG_pointer_type
+	.long	322                             # DW_AT_type
+	.byte	10                              # Abbrev [10] 0x15d:0x5 DW_TAG_pointer_type
+	.long	354                             # DW_AT_type
+	.byte	11                              # Abbrev [11] 0x162:0x5 DW_TAG_const_type
+	.long	359                             # DW_AT_type
+	.byte	10                              # Abbrev [10] 0x167:0x5 DW_TAG_pointer_type
+	.long	364                             # DW_AT_type
+	.byte	12                              # Abbrev [12] 0x16c:0x1 DW_TAG_const_type
+	.byte	11                              # Abbrev [11] 0x16d:0x5 DW_TAG_const_type
+	.long	370                             # DW_AT_type
+	.byte	13                              # Abbrev [13] 0x172:0x5 DW_TAG_volatile_type
+	.long	344                             # DW_AT_type
+	.byte	11                              # Abbrev [11] 0x177:0x5 DW_TAG_const_type
+	.long	380                             # DW_AT_type
+	.byte	14                              # Abbrev [14] 0x17c:0x1 DW_TAG_pointer_type
+	.byte	15                              # Abbrev [15] 0x17d:0x9 DW_TAG_ptr_to_member_type
+	.long	322                             # DW_AT_type
+	.long	390                             # DW_AT_containing_type
+	.byte	16                              # Abbrev [16] 0x186:0x5 DW_TAG_structure_type
 	.long	.Linfo_string7                  # DW_AT_name
                                         # DW_AT_declaration
-	.byte	15                              # Abbrev [15] 0x136:0x9 DW_TAG_ptr_to_member_type
-	.long	319                             # DW_AT_type
-	.long	305                             # DW_AT_containing_type
-	.byte	17                              # Abbrev [17] 0x13f:0xc DW_TAG_subroutine_type
-	.byte	18                              # Abbrev [18] 0x140:0x5 DW_TAG_formal_parameter
-	.long	331                             # DW_AT_type
+	.byte	15                              # Abbrev [15] 0x18b:0x9 DW_TAG_ptr_to_member_type
+	.long	404                             # DW_AT_type
+	.long	390                             # DW_AT_containing_type
+	.byte	17                              # Abbrev [17] 0x194:0xc DW_TAG_subroutine_type
+	.byte	18                              # Abbrev [18] 0x195:0x5 DW_TAG_formal_parameter
+	.long	416                             # DW_AT_type
                                         # DW_AT_artificial
-	.byte	19                              # Abbrev [19] 0x145:0x5 DW_TAG_formal_parameter
-	.long	237                             # DW_AT_type
-	.byte	0                               # End Of Children Mark
-	.byte	10                              # Abbrev [10] 0x14b:0x5 DW_TAG_pointer_type
-	.long	305                             # DW_AT_type
-	.byte	8                               # Abbrev [8] 0x150:0x5 DW_TAG_reference_type
-	.long	341                             # DW_AT_type
-	.byte	11                              # Abbrev [11] 0x155:0x5 DW_TAG_const_type
-	.long	346                             # DW_AT_type
-	.byte	15                              # Abbrev [15] 0x15a:0x9 DW_TAG_ptr_to_member_type
-	.long	355                             # DW_AT_type
-	.long	305                             # DW_AT_containing_type
-	.byte	20                              # Abbrev [20] 0x163:0x7 DW_TAG_subroutine_type
+	.byte	19                              # Abbrev [19] 0x19a:0x5 DW_TAG_formal_parameter
+	.long	322                             # DW_AT_type
+	.byte	0                               # End Of Children Mark
+	.byte	10                              # Abbrev [10] 0x1a0:0x5 DW_TAG_pointer_type
+	.long	390                             # DW_AT_type
+	.byte	8                               # Abbrev [8] 0x1a5:0x5 DW_TAG_reference_type
+	.long	426                             # DW_AT_type
+	.byte	11                              # Abbrev [11] 0x1aa:0x5 DW_TAG_const_type
+	.long	431                             # DW_AT_type
+	.byte	15                              # Abbrev [15] 0x1af:0x9 DW_TAG_ptr_to_member_type
+	.long	440                             # DW_AT_type
+	.long	390                             # DW_AT_containing_type
+	.byte	20                              # Abbrev [20] 0x1b8:0x7 DW_TAG_subroutine_type
                                         # DW_AT_rvalue_reference
-	.byte	18                              # Abbrev [18] 0x164:0x5 DW_TAG_formal_parameter
-	.long	362                             # DW_AT_type
+	.byte	18                              # Abbrev [18] 0x1b9:0x5 DW_TAG_formal_parameter
+	.long	447                             # DW_AT_type
                                         # DW_AT_artificial
 	.byte	0                               # End Of Children Mark
-	.byte	10                              # Abbrev [10] 0x16a:0x5 DW_TAG_pointer_type
-	.long	367                             # DW_AT_type
-	.byte	11                              # Abbrev [11] 0x16f:0x5 DW_TAG_const_type
-	.long	372                             # DW_AT_type
-	.byte	13                              # Abbrev [13] 0x174:0x5 DW_TAG_volatile_type
-	.long	305                             # DW_AT_type
-	.byte	8                               # Abbrev [8] 0x179:0x5 DW_TAG_reference_type
-	.long	382                             # DW_AT_type
-	.byte	11                              # Abbrev [11] 0x17e:0x5 DW_TAG_const_type
-	.long	387                             # DW_AT_type
-	.byte	21                              # Abbrev [21] 0x183:0xc DW_TAG_array_type
-	.long	259                             # DW_AT_type
-	.byte	22                              # Abbrev [22] 0x188:0x6 DW_TAG_subrange_type
-	.long	399                             # DW_AT_type
+	.byte	10                              # Abbrev [10] 0x1bf:0x5 DW_TAG_pointer_type
+	.long	452                             # DW_AT_type
+	.byte	11                              # Abbrev [11] 0x1c4:0x5 DW_TAG_const_type
+	.long	457                             # DW_AT_type
+	.byte	13                              # Abbrev [13] 0x1c9:0x5 DW_TAG_volatile_type
+	.long	390                             # DW_AT_type
+	.byte	8                               # Abbrev [8] 0x1ce:0x5 DW_TAG_reference_type
+	.long	467                             # DW_AT_type
+	.byte	11                              # Abbrev [11] 0x1d3:0x5 DW_TAG_const_type
+	.long	472                             # DW_AT_type
+	.byte	21                              # Abbrev [21] 0x1d8:0xc DW_TAG_array_type
+	.long	344                             # DW_AT_type
+	.byte	22                              # Abbrev [22] 0x1dd:0x6 DW_TAG_subrange_type
+	.long	484                             # DW_AT_type
 	.byte	1                               # DW_AT_count
 	.byte	0                               # End Of Children Mark
-	.byte	23                              # Abbrev [23] 0x18f:0x7 DW_TAG_base_type
+	.byte	23                              # Abbrev [23] 0x1e4:0x7 DW_TAG_base_type
 	.long	.Linfo_string8                  # DW_AT_name
 	.byte	8                               # DW_AT_byte_size
 	.byte	7                               # DW_AT_encoding
-	.byte	8                               # Abbrev [8] 0x196:0x5 DW_TAG_reference_type
-	.long	411                             # DW_AT_type
-	.byte	11                              # Abbrev [11] 0x19b:0x5 DW_TAG_const_type
-	.long	416                             # DW_AT_type
-	.byte	21                              # Abbrev [21] 0x1a0:0xc DW_TAG_array_type
-	.long	237                             # DW_AT_type
-	.byte	22                              # Abbrev [22] 0x1a5:0x6 DW_TAG_subrange_type
-	.long	399                             # DW_AT_type
+	.byte	8                               # Abbrev [8] 0x1eb:0x5 DW_TAG_reference_type
+	.long	496                             # DW_AT_type
+	.byte	11                              # Abbrev [11] 0x1f0:0x5 DW_TAG_const_type
+	.long	501                             # DW_AT_type
+	.byte	21                              # Abbrev [21] 0x1f5:0xc DW_TAG_array_type
+	.long	322                             # DW_AT_type
+	.byte	22                              # Abbrev [22] 0x1fa:0x6 DW_TAG_subrange_type
+	.long	484                             # DW_AT_type
 	.byte	1                               # DW_AT_count
 	.byte	0                               # End Of Children Mark
-	.byte	24                              # Abbrev [24] 0x1ac:0x5 DW_TAG_subroutine_type
-	.long	237                             # DW_AT_type
-	.byte	17                              # Abbrev [17] 0x1b1:0x7 DW_TAG_subroutine_type
-	.byte	19                              # Abbrev [19] 0x1b2:0x5 DW_TAG_formal_parameter
-	.long	237                             # DW_AT_type
+	.byte	24                              # Abbrev [24] 0x201:0x5 DW_TAG_subroutine_type
+	.long	322                             # DW_AT_type
+	.byte	17                              # Abbrev [17] 0x206:0x7 DW_TAG_subroutine_type
+	.byte	19                              # Abbrev [19] 0x207:0x5 DW_TAG_formal_parameter
+	.long	322                             # DW_AT_type
 	.byte	0                               # End Of Children Mark
-	.byte	17                              # Abbrev [17] 0x1b8:0xc DW_TAG_subroutine_type
-	.byte	19                              # Abbrev [19] 0x1b9:0x5 DW_TAG_formal_parameter
-	.long	237                             # DW_AT_type
-	.byte	19                              # Abbrev [19] 0x1be:0x5 DW_TAG_formal_parameter
-	.long	237                             # DW_AT_type
+	.byte	17                              # Abbrev [17] 0x20d:0xc DW_TAG_subroutine_type
+	.byte	19                              # Abbrev [19] 0x20e:0x5 DW_TAG_formal_parameter
+	.long	322                             # DW_AT_type
+	.byte	19                              # Abbrev [19] 0x213:0x5 DW_TAG_formal_parameter
+	.long	322                             # DW_AT_type
 	.byte	0                               # End Of Children Mark
-	.byte	10                              # Abbrev [10] 0x1c4:0x5 DW_TAG_pointer_type
-	.long	457                             # DW_AT_type
-	.byte	17                              # Abbrev [17] 0x1c9:0xc DW_TAG_subroutine_type
-	.byte	19                              # Abbrev [19] 0x1ca:0x5 DW_TAG_formal_parameter
-	.long	469                             # DW_AT_type
-	.byte	19                              # Abbrev [19] 0x1cf:0x5 DW_TAG_formal_parameter
-	.long	237                             # DW_AT_type
-	.byte	0                               # End Of Children Mark
-	.byte	10                              # Abbrev [10] 0x1d5:0x5 DW_TAG_pointer_type
-	.long	305                             # DW_AT_type
-	.byte	11                              # Abbrev [11] 0x1da:0x5 DW_TAG_const_type
-	.long	479                             # DW_AT_type
-	.byte	10                              # Abbrev [10] 0x1df:0x5 DW_TAG_pointer_type
-	.long	484                             # DW_AT_type
-	.byte	25                              # Abbrev [25] 0x1e4:0x1 DW_TAG_subroutine_type
-	.byte	11                              # Abbrev [11] 0x1e5:0x5 DW_TAG_const_type
-	.long	484                             # DW_AT_type
-	.byte	13                              # Abbrev [13] 0x1ea:0x5 DW_TAG_volatile_type
-	.long	495                             # DW_AT_type
-	.byte	26                              # Abbrev [26] 0x1ef:0x1 DW_TAG_subroutine_type
+	.byte	10                              # Abbrev [10] 0x219:0x5 DW_TAG_pointer_type
+	.long	542                             # DW_AT_type
+	.byte	17                              # Abbrev [17] 0x21e:0xc DW_TAG_subroutine_type
+	.byte	19                              # Abbrev [19] 0x21f:0x5 DW_TAG_formal_parameter
+	.long	554                             # DW_AT_type
+	.byte	19                              # Abbrev [19] 0x224:0x5 DW_TAG_formal_parameter
+	.long	322                             # DW_AT_type
+	.byte	0                               # End Of Children Mark
+	.byte	10                              # Abbrev [10] 0x22a:0x5 DW_TAG_pointer_type
+	.long	390                             # DW_AT_type
+	.byte	11                              # Abbrev [11] 0x22f:0x5 DW_TAG_const_type
+	.long	564                             # DW_AT_type
+	.byte	10                              # Abbrev [10] 0x234:0x5 DW_TAG_pointer_type
+	.long	569                             # DW_AT_type
+	.byte	25                              # Abbrev [25] 0x239:0x1 DW_TAG_subroutine_type
+	.byte	11                              # Abbrev [11] 0x23a:0x5 DW_TAG_const_type
+	.long	569                             # DW_AT_type
+	.byte	13                              # Abbrev [13] 0x23f:0x5 DW_TAG_volatile_type
+	.long	580                             # DW_AT_type
+	.byte	26                              # Abbrev [26] 0x244:0x1 DW_TAG_subroutine_type
                                         # DW_AT_rvalue_reference
-	.byte	11                              # Abbrev [11] 0x1f0:0x5 DW_TAG_const_type
-	.long	501                             # DW_AT_type
-	.byte	13                              # Abbrev [13] 0x1f5:0x5 DW_TAG_volatile_type
-	.long	506                             # DW_AT_type
-	.byte	27                              # Abbrev [27] 0x1fa:0x1 DW_TAG_subroutine_type
+	.byte	11                              # Abbrev [11] 0x245:0x5 DW_TAG_const_type
+	.long	586                             # DW_AT_type
+	.byte	13                              # Abbrev [13] 0x24a:0x5 DW_TAG_volatile_type
+	.long	591                             # DW_AT_type
+	.byte	27                              # Abbrev [27] 0x24f:0x1 DW_TAG_subroutine_type
                                         # DW_AT_reference
-	.byte	17                              # Abbrev [17] 0x1fb:0x7 DW_TAG_subroutine_type
-	.byte	19                              # Abbrev [19] 0x1fc:0x5 DW_TAG_formal_parameter
-	.long	514                             # DW_AT_type
-	.byte	0                               # End Of Children Mark
-	.byte	10                              # Abbrev [10] 0x202:0x5 DW_TAG_pointer_type
-	.long	367                             # DW_AT_type
-	.byte	28                              # Abbrev [28] 0x207:0xb DW_TAG_subroutine_type
-	.long	530                             # DW_AT_type
-	.byte	19                              # Abbrev [19] 0x20c:0x5 DW_TAG_formal_parameter
-	.long	237                             # DW_AT_type
-	.byte	0                               # End Of Children Mark
-	.byte	10                              # Abbrev [10] 0x212:0x5 DW_TAG_pointer_type
-	.long	535                             # DW_AT_type
-	.byte	17                              # Abbrev [17] 0x217:0x7 DW_TAG_subroutine_type
-	.byte	19                              # Abbrev [19] 0x218:0x5 DW_TAG_formal_parameter
-	.long	542                             # DW_AT_type
+	.byte	17                              # Abbrev [17] 0x250:0x7 DW_TAG_subroutine_type
+	.byte	19                              # Abbrev [19] 0x251:0x5 DW_TAG_formal_parameter
+	.long	599                             # DW_AT_type
+	.byte	0                               # End Of Children Mark
+	.byte	10                              # Abbrev [10] 0x257:0x5 DW_TAG_pointer_type
+	.long	452                             # DW_AT_type
+	.byte	28                              # Abbrev [28] 0x25c:0xb DW_TAG_subroutine_type
+	.long	615                             # DW_AT_type
+	.byte	19                              # Abbrev [19] 0x261:0x5 DW_TAG_formal_parameter
+	.long	322                             # DW_AT_type
 	.byte	0                               # End Of Children Mark
-	.byte	6                               # Abbrev [6] 0x21e:0x7 DW_TAG_base_type
+	.byte	10                              # Abbrev [10] 0x267:0x5 DW_TAG_pointer_type
+	.long	620                             # DW_AT_type
+	.byte	17                              # Abbrev [17] 0x26c:0x7 DW_TAG_subroutine_type
+	.byte	19                              # Abbrev [19] 0x26d:0x5 DW_TAG_formal_parameter
+	.long	627                             # DW_AT_type
+	.byte	0                               # End Of Children Mark
+	.byte	6                               # Abbrev [6] 0x273:0x7 DW_TAG_base_type
 	.long	.Linfo_string9                  # DW_AT_name
 	.byte	4                               # DW_AT_encoding
 	.byte	4                               # DW_AT_byte_size
-	.byte	29                              # Abbrev [29] 0x225:0xb DW_TAG_namespace
+	.byte	29                              # Abbrev [29] 0x27a:0xb DW_TAG_namespace
 	.long	.Linfo_string10                 # DW_AT_name
-	.byte	16                              # Abbrev [16] 0x22a:0x5 DW_TAG_structure_type
+	.byte	16                              # Abbrev [16] 0x27f:0x5 DW_TAG_structure_type
 	.long	.Linfo_string11                 # DW_AT_name
                                         # DW_AT_declaration
 	.byte	0                               # End Of Children Mark
-	.byte	24                              # Abbrev [24] 0x230:0x5 DW_TAG_subroutine_type
-	.long	554                             # DW_AT_type
-	.byte	21                              # Abbrev [21] 0x235:0xc DW_TAG_array_type
-	.long	554                             # DW_AT_type
-	.byte	22                              # Abbrev [22] 0x23a:0x6 DW_TAG_subrange_type
-	.long	399                             # DW_AT_type
+	.byte	24                              # Abbrev [24] 0x285:0x5 DW_TAG_subroutine_type
+	.long	639                             # DW_AT_type
+	.byte	21                              # Abbrev [21] 0x28a:0xc DW_TAG_array_type
+	.long	639                             # DW_AT_type
+	.byte	22                              # Abbrev [22] 0x28f:0x6 DW_TAG_subrange_type
+	.long	484                             # DW_AT_type
 	.byte	1                               # DW_AT_count
 	.byte	0                               # End Of Children Mark
-	.byte	10                              # Abbrev [10] 0x241:0x5 DW_TAG_pointer_type
-	.long	554                             # DW_AT_type
-	.byte	15                              # Abbrev [15] 0x246:0x9 DW_TAG_ptr_to_member_type
-	.long	591                             # DW_AT_type
-	.long	554                             # DW_AT_containing_type
-	.byte	28                              # Abbrev [28] 0x24f:0x10 DW_TAG_subroutine_type
-	.long	554                             # DW_AT_type
-	.byte	18                              # Abbrev [18] 0x254:0x5 DW_TAG_formal_parameter
-	.long	607                             # DW_AT_type
+	.byte	10                              # Abbrev [10] 0x296:0x5 DW_TAG_pointer_type
+	.long	639                             # DW_AT_type
+	.byte	15                              # Abbrev [15] 0x29b:0x9 DW_TAG_ptr_to_member_type
+	.long	639                             # DW_AT_type
+	.long	639                             # DW_AT_containing_type
+	.byte	15                              # Abbrev [15] 0x2a4:0x9 DW_TAG_ptr_to_member_type
+	.long	685                             # DW_AT_type
+	.long	639                             # DW_AT_containing_type
+	.byte	28                              # Abbrev [28] 0x2ad:0x10 DW_TAG_subroutine_type
+	.long	639                             # DW_AT_type
+	.byte	18                              # Abbrev [18] 0x2b2:0x5 DW_TAG_formal_parameter
+	.long	701                             # DW_AT_type
                                         # DW_AT_artificial
-	.byte	19                              # Abbrev [19] 0x259:0x5 DW_TAG_formal_parameter
-	.long	554                             # DW_AT_type
+	.byte	19                              # Abbrev [19] 0x2b7:0x5 DW_TAG_formal_parameter
+	.long	639                             # DW_AT_type
 	.byte	0                               # End Of Children Mark
-	.byte	10                              # Abbrev [10] 0x25f:0x5 DW_TAG_pointer_type
-	.long	554                             # DW_AT_type
-	.byte	11                              # Abbrev [11] 0x264:0x5 DW_TAG_const_type
-	.long	554                             # DW_AT_type
-	.byte	30                              # Abbrev [30] 0x269:0x7 DW_TAG_namespace
-	.byte	16                              # Abbrev [16] 0x26a:0x5 DW_TAG_structure_type
+	.byte	10                              # Abbrev [10] 0x2bd:0x5 DW_TAG_pointer_type
+	.long	639                             # DW_AT_type
+	.byte	11                              # Abbrev [11] 0x2c2:0x5 DW_TAG_const_type
+	.long	639                             # DW_AT_type
+	.byte	30                              # Abbrev [30] 0x2c7:0x7 DW_TAG_namespace
+	.byte	16                              # Abbrev [16] 0x2c8:0x5 DW_TAG_structure_type
 	.long	.Linfo_string12                 # DW_AT_name
                                         # DW_AT_declaration
 	.byte	0                               # End Of Children Mark
+	.byte	31                              # Abbrev [31] 0x2ce:0xf DW_TAG_structure_type
+	.long	.Linfo_string14                 # DW_AT_name
+                                        # DW_AT_declaration
+	.byte	32                              # Abbrev [32] 0x2d3:0x9 DW_TAG_template_type_parameter
+	.long	733                             # DW_AT_type
+	.long	.Linfo_string13                 # DW_AT_name
+	.byte	0                               # End Of Children Mark
+	.byte	31                              # Abbrev [31] 0x2dd:0xf DW_TAG_structure_type
+	.long	.Linfo_string14                 # DW_AT_name
+                                        # DW_AT_declaration
+	.byte	32                              # Abbrev [32] 0x2e2:0x9 DW_TAG_template_type_parameter
+	.long	322                             # DW_AT_type
+	.long	.Linfo_string13                 # DW_AT_name
+	.byte	0                               # End Of Children Mark
+	.byte	31                              # Abbrev [31] 0x2ec:0x19 DW_TAG_structure_type
+	.long	.Linfo_string19                 # DW_AT_name
+                                        # DW_AT_declaration
+	.byte	32                              # Abbrev [32] 0x2f1:0x9 DW_TAG_template_type_parameter
+	.long	773                             # DW_AT_type
+	.long	.Linfo_string13                 # DW_AT_name
+	.byte	33                              # Abbrev [33] 0x2fa:0xa DW_TAG_template_value_parameter
+	.long	773                             # DW_AT_type
+	.long	.Linfo_string18                 # DW_AT_name
+	.byte	0                               # DW_AT_const_value
+	.byte	0                               # End Of Children Mark
+	.byte	34                              # Abbrev [34] 0x305:0x13 DW_TAG_enumeration_type
+	.long	792                             # DW_AT_type
+	.long	.Linfo_string17                 # DW_AT_name
+	.byte	4                               # DW_AT_byte_size
+	.byte	1                               # DW_AT_decl_file
+	.byte	12                              # DW_AT_decl_line
+	.byte	35                              # Abbrev [35] 0x311:0x6 DW_TAG_enumerator
+	.long	.Linfo_string16                 # DW_AT_name
+	.byte	0                               # DW_AT_const_value
+	.byte	0                               # End Of Children Mark
+	.byte	6                               # Abbrev [6] 0x318:0x7 DW_TAG_base_type
+	.long	.Linfo_string15                 # DW_AT_name
+	.byte	7                               # DW_AT_encoding
+	.byte	4                               # DW_AT_byte_size
+	.byte	31                              # Abbrev [31] 0x31f:0x19 DW_TAG_structure_type
+	.long	.Linfo_string19                 # DW_AT_name
+                                        # DW_AT_declaration
+	.byte	32                              # Abbrev [32] 0x324:0x9 DW_TAG_template_type_parameter
+	.long	773                             # DW_AT_type
+	.long	.Linfo_string13                 # DW_AT_name
+	.byte	33                              # Abbrev [33] 0x32d:0xa DW_TAG_template_value_parameter
+	.long	773                             # DW_AT_type
+	.long	.Linfo_string18                 # DW_AT_name
+	.byte	1                               # DW_AT_const_value
+	.byte	0                               # End Of Children Mark
+	.byte	31                              # Abbrev [31] 0x338:0x19 DW_TAG_structure_type
+	.long	.Linfo_string19                 # DW_AT_name
+                                        # DW_AT_declaration
+	.byte	32                              # Abbrev [32] 0x33d:0x9 DW_TAG_template_type_parameter
+	.long	849                             # DW_AT_type
+	.long	.Linfo_string13                 # DW_AT_name
+	.byte	36                              # Abbrev [36] 0x346:0xa DW_TAG_template_value_parameter
+	.long	849                             # DW_AT_type
+	.long	.Linfo_string18                 # DW_AT_name
+	.byte	0                               # DW_AT_const_value
+	.byte	0                               # End Of Children Mark
+	.byte	37                              # Abbrev [37] 0x351:0x13 DW_TAG_enumeration_type
+	.long	322                             # DW_AT_type
+                                        # DW_AT_enum_class
+	.long	.Linfo_string21                 # DW_AT_name
+	.byte	4                               # DW_AT_byte_size
+	.byte	1                               # DW_AT_decl_file
+	.byte	15                              # DW_AT_decl_line
+	.byte	38                              # Abbrev [38] 0x35d:0x6 DW_TAG_enumerator
+	.long	.Linfo_string20                 # DW_AT_name
+	.byte	0                               # DW_AT_const_value
+	.byte	0                               # End Of Children Mark
+	.byte	31                              # Abbrev [31] 0x364:0x19 DW_TAG_structure_type
+	.long	.Linfo_string19                 # DW_AT_name
+                                        # DW_AT_declaration
+	.byte	32                              # Abbrev [32] 0x369:0x9 DW_TAG_template_type_parameter
+	.long	893                             # DW_AT_type
+	.long	.Linfo_string13                 # DW_AT_name
+	.byte	33                              # Abbrev [33] 0x372:0xa DW_TAG_template_value_parameter
+	.long	893                             # DW_AT_type
+	.long	.Linfo_string18                 # DW_AT_name
+	.byte	120                             # DW_AT_const_value
+	.byte	0                               # End Of Children Mark
+	.byte	6                               # Abbrev [6] 0x37d:0x7 DW_TAG_base_type
+	.long	.Linfo_string22                 # DW_AT_name
+	.byte	8                               # DW_AT_encoding
+	.byte	1                               # DW_AT_byte_size
+	.byte	31                              # Abbrev [31] 0x384:0x51 DW_TAG_structure_type
+	.long	.Linfo_string25                 # DW_AT_name
+                                        # DW_AT_declaration
+	.byte	4                               # Abbrev [4] 0x389:0x4b DW_TAG_GNU_template_parameter_pack
+	.long	.Linfo_string23                 # DW_AT_name
+	.byte	39                              # Abbrev [39] 0x38e:0x7 DW_TAG_template_value_parameter
+	.long	981                             # DW_AT_type
+	.asciz	"\370"                          # DW_AT_const_value
+	.byte	39                              # Abbrev [39] 0x395:0x7 DW_TAG_template_value_parameter
+	.long	981                             # DW_AT_type
+	.asciz	"\334"                          # DW_AT_const_value
+	.byte	39                              # Abbrev [39] 0x39c:0x6 DW_TAG_template_value_parameter
+	.long	981                             # DW_AT_type
+	.byte	39                              # DW_AT_const_value
+	.byte	39                              # Abbrev [39] 0x3a2:0x6 DW_TAG_template_value_parameter
+	.long	981                             # DW_AT_type
+	.byte	7                               # DW_AT_const_value
+	.byte	39                              # Abbrev [39] 0x3a8:0x6 DW_TAG_template_value_parameter
+	.long	981                             # DW_AT_type
+	.byte	8                               # DW_AT_const_value
+	.byte	39                              # Abbrev [39] 0x3ae:0x6 DW_TAG_template_value_parameter
+	.long	981                             # DW_AT_type
+	.byte	12                              # DW_AT_const_value
+	.byte	39                              # Abbrev [39] 0x3b4:0x6 DW_TAG_template_value_parameter
+	.long	981                             # DW_AT_type
+	.byte	10                              # DW_AT_const_value
+	.byte	39                              # Abbrev [39] 0x3ba:0x6 DW_TAG_template_value_parameter
+	.long	981                             # DW_AT_type
+	.byte	13                              # DW_AT_const_value
+	.byte	39                              # Abbrev [39] 0x3c0:0x6 DW_TAG_template_value_parameter
+	.long	981                             # DW_AT_type
+	.byte	9                               # DW_AT_const_value
+	.byte	39                              # Abbrev [39] 0x3c6:0x6 DW_TAG_template_value_parameter
+	.long	981                             # DW_AT_type
+	.byte	11                              # DW_AT_const_value
+	.byte	39                              # Abbrev [39] 0x3cc:0x7 DW_TAG_template_value_parameter
+	.long	981                             # DW_AT_type
+	.asciz	"\377"                          # DW_AT_const_value
+	.byte	0                               # End Of Children Mark
+	.byte	0                               # End Of Children Mark
+	.byte	6                               # Abbrev [6] 0x3d5:0x7 DW_TAG_base_type
+	.long	.Linfo_string24                 # DW_AT_name
+	.byte	6                               # DW_AT_encoding
+	.byte	1                               # DW_AT_byte_size
+	.byte	31                              # Abbrev [31] 0x3dc:0x19 DW_TAG_structure_type
+	.long	.Linfo_string19                 # DW_AT_name
+                                        # DW_AT_declaration
+	.byte	32                              # Abbrev [32] 0x3e1:0x9 DW_TAG_template_type_parameter
+	.long	1013                            # DW_AT_type
+	.long	.Linfo_string13                 # DW_AT_name
+	.byte	33                              # Abbrev [33] 0x3ea:0xa DW_TAG_template_value_parameter
+	.long	1013                            # DW_AT_type
+	.long	.Linfo_string18                 # DW_AT_name
+	.byte	1                               # DW_AT_const_value
+	.byte	0                               # End Of Children Mark
+	.byte	6                               # Abbrev [6] 0x3f5:0x7 DW_TAG_base_type
+	.long	.Linfo_string26                 # DW_AT_name
+	.byte	2                               # DW_AT_encoding
+	.byte	1                               # DW_AT_byte_size
+	.byte	31                              # Abbrev [31] 0x3fc:0x19 DW_TAG_structure_type
+	.long	.Linfo_string19                 # DW_AT_name
+                                        # DW_AT_declaration
+	.byte	32                              # Abbrev [32] 0x401:0x9 DW_TAG_template_type_parameter
+	.long	1013                            # DW_AT_type
+	.long	.Linfo_string13                 # DW_AT_name
+	.byte	33                              # Abbrev [33] 0x40a:0xa DW_TAG_template_value_parameter
+	.long	1013                            # DW_AT_type
+	.long	.Linfo_string18                 # DW_AT_name
+	.byte	0                               # DW_AT_const_value
+	.byte	0                               # End Of Children Mark
+	.byte	31                              # Abbrev [31] 0x415:0x19 DW_TAG_structure_type
+	.long	.Linfo_string19                 # DW_AT_name
+                                        # DW_AT_declaration
+	.byte	32                              # Abbrev [32] 0x41a:0x9 DW_TAG_template_type_parameter
+	.long	1070                            # DW_AT_type
+	.long	.Linfo_string13                 # DW_AT_name
+	.byte	36                              # Abbrev [36] 0x423:0xa DW_TAG_template_value_parameter
+	.long	1070                            # DW_AT_type
+	.long	.Linfo_string18                 # DW_AT_name
+	.byte	0                               # DW_AT_const_value
+	.byte	0                               # End Of Children Mark
+	.byte	6                               # Abbrev [6] 0x42e:0x7 DW_TAG_base_type
+	.long	.Linfo_string27                 # DW_AT_name
+	.byte	5                               # DW_AT_encoding
+	.byte	2                               # DW_AT_byte_size
+	.byte	31                              # Abbrev [31] 0x435:0x19 DW_TAG_structure_type
+	.long	.Linfo_string19                 # DW_AT_name
+                                        # DW_AT_declaration
+	.byte	32                              # Abbrev [32] 0x43a:0x9 DW_TAG_template_type_parameter
+	.long	1102                            # DW_AT_type
+	.long	.Linfo_string13                 # DW_AT_name
+	.byte	33                              # Abbrev [33] 0x443:0xa DW_TAG_template_value_parameter
+	.long	1102                            # DW_AT_type
+	.long	.Linfo_string18                 # DW_AT_name
+	.byte	0                               # DW_AT_const_value
+	.byte	0                               # End Of Children Mark
+	.byte	6                               # Abbrev [6] 0x44e:0x7 DW_TAG_base_type
+	.long	.Linfo_string28                 # DW_AT_name
+	.byte	7                               # DW_AT_encoding
+	.byte	2                               # DW_AT_byte_size
+	.byte	31                              # Abbrev [31] 0x455:0x19 DW_TAG_structure_type
+	.long	.Linfo_string19                 # DW_AT_name
+                                        # DW_AT_declaration
+	.byte	32                              # Abbrev [32] 0x45a:0x9 DW_TAG_template_type_parameter
+	.long	322                             # DW_AT_type
+	.long	.Linfo_string13                 # DW_AT_name
+	.byte	36                              # Abbrev [36] 0x463:0xa DW_TAG_template_value_parameter
+	.long	322                             # DW_AT_type
+	.long	.Linfo_string18                 # DW_AT_name
+	.byte	0                               # DW_AT_const_value
+	.byte	0                               # End Of Children Mark
+	.byte	31                              # Abbrev [31] 0x46e:0x19 DW_TAG_structure_type
+	.long	.Linfo_string19                 # DW_AT_name
+                                        # DW_AT_declaration
+	.byte	32                              # Abbrev [32] 0x473:0x9 DW_TAG_template_type_parameter
+	.long	1159                            # DW_AT_type
+	.long	.Linfo_string13                 # DW_AT_name
+	.byte	36                              # Abbrev [36] 0x47c:0xa DW_TAG_template_value_parameter
+	.long	1159                            # DW_AT_type
+	.long	.Linfo_string18                 # DW_AT_name
+	.byte	0                               # DW_AT_const_value
+	.byte	0                               # End Of Children Mark
+	.byte	6                               # Abbrev [6] 0x487:0x7 DW_TAG_base_type
+	.long	.Linfo_string29                 # DW_AT_name
+	.byte	5                               # DW_AT_encoding
+	.byte	8                               # DW_AT_byte_size
+	.byte	31                              # Abbrev [31] 0x48e:0x19 DW_TAG_structure_type
+	.long	.Linfo_string19                 # DW_AT_name
+                                        # DW_AT_declaration
+	.byte	32                              # Abbrev [32] 0x493:0x9 DW_TAG_template_type_parameter
+	.long	1191                            # DW_AT_type
+	.long	.Linfo_string13                 # DW_AT_name
+	.byte	36                              # Abbrev [36] 0x49c:0xa DW_TAG_template_value_parameter
+	.long	1191                            # DW_AT_type
+	.long	.Linfo_string18                 # DW_AT_name
+	.byte	0                               # DW_AT_const_value
+	.byte	0                               # End Of Children Mark
+	.byte	6                               # Abbrev [6] 0x4a7:0x7 DW_TAG_base_type
+	.long	.Linfo_string30                 # DW_AT_name
+	.byte	5                               # DW_AT_encoding
+	.byte	8                               # DW_AT_byte_size
+	.byte	31                              # Abbrev [31] 0x4ae:0x19 DW_TAG_structure_type
+	.long	.Linfo_string19                 # DW_AT_name
+                                        # DW_AT_declaration
+	.byte	32                              # Abbrev [32] 0x4b3:0x9 DW_TAG_template_type_parameter
+	.long	792                             # DW_AT_type
+	.long	.Linfo_string13                 # DW_AT_name
+	.byte	33                              # Abbrev [33] 0x4bc:0xa DW_TAG_template_value_parameter
+	.long	792                             # DW_AT_type
+	.long	.Linfo_string18                 # DW_AT_name
+	.byte	0                               # DW_AT_const_value
+	.byte	0                               # End Of Children Mark
+	.byte	31                              # Abbrev [31] 0x4c7:0x19 DW_TAG_structure_type
+	.long	.Linfo_string19                 # DW_AT_name
+                                        # DW_AT_declaration
+	.byte	32                              # Abbrev [32] 0x4cc:0x9 DW_TAG_template_type_parameter
+	.long	1248                            # DW_AT_type
+	.long	.Linfo_string13                 # DW_AT_name
+	.byte	33                              # Abbrev [33] 0x4d5:0xa DW_TAG_template_value_parameter
+	.long	1248                            # DW_AT_type
+	.long	.Linfo_string18                 # DW_AT_name
+	.byte	0                               # DW_AT_const_value
+	.byte	0                               # End Of Children Mark
+	.byte	6                               # Abbrev [6] 0x4e0:0x7 DW_TAG_base_type
+	.long	.Linfo_string31                 # DW_AT_name
+	.byte	7                               # DW_AT_encoding
+	.byte	8                               # DW_AT_byte_size
+	.byte	31                              # Abbrev [31] 0x4e7:0x19 DW_TAG_structure_type
+	.long	.Linfo_string19                 # DW_AT_name
+                                        # DW_AT_declaration
+	.byte	32                              # Abbrev [32] 0x4ec:0x9 DW_TAG_template_type_parameter
+	.long	1280                            # DW_AT_type
+	.long	.Linfo_string13                 # DW_AT_name
+	.byte	33                              # Abbrev [33] 0x4f5:0xa DW_TAG_template_value_parameter
+	.long	1280                            # DW_AT_type
+	.long	.Linfo_string18                 # DW_AT_name
+	.byte	0                               # DW_AT_const_value
+	.byte	0                               # End Of Children Mark
+	.byte	6                               # Abbrev [6] 0x500:0x7 DW_TAG_base_type
+	.long	.Linfo_string32                 # DW_AT_name
+	.byte	7                               # DW_AT_encoding
+	.byte	8                               # DW_AT_byte_size
 	.byte	0                               # End Of Children Mark
 .Ldebug_info_end0:
 	.section	.debug_str,"MS", at progbits,1
 .Linfo_string0:
-	.asciz	"clang version 14.0.0 (git at github.com:llvm/llvm-project.git 559ab58ca57486621857a630d16dcddb6cceedfb)" # string offset=0
+	.asciz	"clang version 14.0.0 (git at github.com:llvm/llvm-project.git e209925a875e1dfa15d5e4ddc3d00f2da4b42de1)" # string offset=0
 .Linfo_string1:
 	.asciz	"test.cpp"                      # string offset=101
 .Linfo_string2:
@@ -663,8 +1125,48 @@
 .Linfo_string12:
 	.asciz	"anon_ns_mem"                   # string offset=220
 .Linfo_string13:
-	.asciz	"t1"                            # string offset=232
-	.ident	"clang version 14.0.0 (git at github.com:llvm/llvm-project.git 559ab58ca57486621857a630d16dcddb6cceedfb)"
+	.asciz	"T"                             # string offset=232
+.Linfo_string14:
+	.asciz	"t2"                            # string offset=234
+.Linfo_string15:
+	.asciz	"unsigned int"                  # string offset=237
+.Linfo_string16:
+	.asciz	"E1"                            # string offset=250
+.Linfo_string17:
+	.asciz	"e1"                            # string offset=253
+.Linfo_string18:
+	.asciz	"V"                             # string offset=256
+.Linfo_string19:
+	.asciz	"tv"                            # string offset=258
+.Linfo_string20:
+	.asciz	"E2"                            # string offset=261
+.Linfo_string21:
+	.asciz	"e2"                            # string offset=264
+.Linfo_string22:
+	.asciz	"unsigned char"                 # string offset=267
+.Linfo_string23:
+	.asciz	"C"                             # string offset=281
+.Linfo_string24:
+	.asciz	"char"                          # string offset=283
+.Linfo_string25:
+	.asciz	"tc"                            # string offset=288
+.Linfo_string26:
+	.asciz	"bool"                          # string offset=291
+.Linfo_string27:
+	.asciz	"short"                         # string offset=296
+.Linfo_string28:
+	.asciz	"unsigned short"                # string offset=302
+.Linfo_string29:
+	.asciz	"long"                          # string offset=317
+.Linfo_string30:
+	.asciz	"long long"                     # string offset=322
+.Linfo_string31:
+	.asciz	"unsigned long"                 # string offset=332
+.Linfo_string32:
+	.asciz	"unsigned long long"            # string offset=346
+.Linfo_string33:
+	.asciz	"t1"                            # string offset=365
+	.ident	"clang version 14.0.0 (git at github.com:llvm/llvm-project.git e209925a875e1dfa15d5e4ddc3d00f2da4b42de1)"
 	.section	".note.GNU-stack","", at progbits
 	.addrsig
 	.addrsig_sym v1


        


More information about the llvm-commits mailing list