<div dir="ltr">Commit message is a bit misleading, but not entirely inaccurate - this is still "work in progress", but was intentionally committed. The feature isn't fully robust just yet - couple of quirks in how Clang names integer types and when it uses integer suffixes on non-type template parameters. And something to do with the signedness of the underlying type of enums..</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Sep 24, 2021 at 2:28 PM David Blaikie via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: David Blaikie<br>
Date: 2021-09-24T14:28:18-07:00<br>
New Revision: 9911af4b91c670477cf920f168b339bd2f3f307f<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/9911af4b91c670477cf920f168b339bd2f3f307f" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/9911af4b91c670477cf920f168b339bd2f3f307f</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/9911af4b91c670477cf920f168b339bd2f3f307f.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/9911af4b91c670477cf920f168b339bd2f3f307f.diff</a><br>
<br>
LOG: WIP: Verify -gsimple-template-names=mangled values<br>
<br>
Clang will encode names that should be able to be simplified as<br>
"_STNname|<template, args>" (eg: "_STNt1|<int>") - this verification<br>
mode will detect these names, decode them, create the original name<br>
("t1<int>") and the simple name ("t1") - letting the simple name run<br>
through the usual rebuilding logic - then compare the two sources of the<br>
full name - the rebuilt and the _STN encoding.<br>
<br>
This helps ensure that -gsimple-template-names is lossless.<br>
<br>
Added: <br>
<br>
<br>
Modified: <br>
    llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h<br>
    llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h<br>
    llvm/lib/DebugInfo/DWARF/DWARFDie.cpp<br>
    llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp<br>
    llvm/test/tools/llvm-dwarfdump/X86/prettyprint_types.s<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff  --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h<br>
index 5a3a951623d55..290571b25f89b 100644<br>
--- a/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h<br>
+++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h<br>
@@ -236,6 +236,8 @@ class DWARFDie {<br>
   /// for ShortName if LinkageName is not found.<br>
   /// Returns null if no name is found.<br>
   const char *getName(DINameKind Kind) const;<br>
+  void getFullName(raw_string_ostream &,<br>
+                   std::string *OriginalFullName = nullptr) const;<br>
<br>
   /// Return the DIE short name resolving DW_AT_specification or<br>
   /// DW_AT_abstract_origin references if necessary. Returns null if no name<br>
<br>
diff  --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h<br>
index 5ab216598bb43..d471b80c7fe1f 100644<br>
--- a/llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h<br>
+++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFVerifier.h<br>
@@ -125,6 +125,7 @@ class DWARFVerifier {<br>
   bool verifyUnitHeader(const DWARFDataExtractor DebugInfoData,<br>
                         uint64_t *Offset, unsigned UnitIndex, uint8_t &UnitType,<br>
                         bool &isUnitDWARF64);<br>
+  bool verifyName(const DWARFDie &Die);<br>
<br>
   /// Verifies the header of a unit in a .debug_info or .debug_types section.<br>
   ///<br>
<br>
diff  --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp<br>
index eb6758b9725ed..f1a905ebcafbf 100644<br>
--- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp<br>
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp<br>
@@ -175,6 +175,7 @@ struct DWARFTypePrinter {<br>
         OS << ")]";<br>
       }<br>
     }<br>
+    EndedWithTemplate = false;<br>
   }<br>
<br>
   DWARFDie skipQualifiers(DWARFDie D) {<br>
@@ -197,9 +198,12 @@ struct DWARFTypePrinter {<br>
       OS << '(';<br>
     OS << Ptr;<br>
     Word = false;<br>
+    EndedWithTemplate = false;<br>
   }<br>
<br>
-  DWARFDie appendUnqualifiedNameBefore(DWARFDie D) {<br>
+  DWARFDie<br>
+  appendUnqualifiedNameBefore(DWARFDie D,<br>
+                              std::string *OriginalFullName = nullptr) {<br>
     Word = true;<br>
     if (!D) {<br>
       OS << "void";<br>
@@ -268,15 +272,54 @@ struct DWARFTypePrinter {<br>
       EndedWithTemplate = false;<br>
       break;<br>
     }<br>
-    default:<br>
+      /*<br>
+    case DW_TAG_structure_type:<br>
+    case DW_TAG_class_type:<br>
+    case DW_TAG_enumeration_type:<br>
+    case DW_TAG_base_type:<br>
+    */<br>
+    default: {<br>
       const char *NamePtr = dwarf::toString(D.find(DW_AT_name), nullptr);<br>
       if (!NamePtr) {<br>
-        appendTypeTagName(D.getTag());<br>
-        break;<br>
+        StringRef TagStr = TagString(D.getTag());<br>
+        static constexpr StringRef Prefix = "DW_TAG_";<br>
+        static constexpr StringRef Suffix = "_type";<br>
+        if (TagStr.startswith(Prefix) && TagStr.endswith(Suffix))<br>
+          OS << TagStr.substr(Prefix.size(),<br>
+                              TagStr.size() - (Prefix.size() + Suffix.size()))<br>
+             << " ";<br>
+        return Inner;<br>
+      }<br>
+      Word = true;<br>
+      StringRef Name = NamePtr;<br>
+      static constexpr StringRef MangledPrefix = "_STN";<br>
+      if (Name.startswith(MangledPrefix)) {<br>
+        Name = Name.drop_front(MangledPrefix.size());<br>
+        auto Separator = Name.find('|');<br>
+        assert(Separator != StringRef::npos);<br>
+        StringRef BaseName = Name.substr(0, Separator);<br>
+        StringRef TemplateArgs = Name.substr(Separator + 1);<br>
+        if (OriginalFullName)<br>
+          *OriginalFullName = (BaseName + TemplateArgs).str();<br>
+        Name = BaseName;<br>
+      } else<br>
+        EndedWithTemplate = Name.endswith(">");<br>
+      OS << Name;<br>
+      // FIXME: This needs to be a bit more narrow, it would fail to<br>
+      // reconstitute a non-operator overload that is a template, like<br>
+      // "operator_thing<int>"<br>
+      if (!Name.endswith(">") && !Name.startswith("operator")) {<br>
+        if (appendTemplateParameters(D)) {<br>
+          if (EndedWithTemplate)<br>
+            OS << ' ';<br>
+          OS << '>';<br>
+          EndedWithTemplate = true;<br>
+          Word = true;<br>
+        }<br>
       }<br>
-      OS << NamePtr;<br>
       break;<br>
     }<br>
+    }<br>
     return Inner;<br>
   }<br>
<br>
@@ -310,6 +353,13 @@ struct DWARFTypePrinter {<br>
               DW_TAG_ptr_to_member_type);<br>
       break;<br>
     }<br>
+      /*<br>
+    case DW_TAG_structure_type:<br>
+    case DW_TAG_class_type:<br>
+    case DW_TAG_enumeration_type:<br>
+    case DW_TAG_base_type:<br>
+    case DW_TAG_namespace:<br>
+    */<br>
     default:<br>
       break;<br>
     }<br>
@@ -325,6 +375,170 @@ struct DWARFTypePrinter {<br>
       appendScopes(D.getParent());<br>
     return appendUnqualifiedNameBefore(D);<br>
   }<br>
+  bool appendTemplateParameters(DWARFDie D, bool *FirstParameter = nullptr) {<br>
+    bool FirstParameterValue = true;<br>
+    bool IsTemplate = false;<br>
+    if (!FirstParameter)<br>
+      FirstParameter = &FirstParameterValue;<br>
+    for (const DWARFDie &C : D) {<br>
+      auto Sep = [&] {<br>
+        if (*FirstParameter)<br>
+          OS << '<';<br>
+        else<br>
+          OS << ", ";<br>
+        IsTemplate = true;<br>
+        EndedWithTemplate = false;<br>
+        *FirstParameter = false;<br>
+      };<br>
+      if (C.getTag() == dwarf::DW_TAG_GNU_template_parameter_pack) {<br>
+        IsTemplate = true;<br>
+        appendTemplateParameters(C, FirstParameter);<br>
+      }<br>
+      if (C.getTag() == dwarf::DW_TAG_template_value_parameter) {<br>
+        DWARFDie T = C.getAttributeValueAsReferencedDie(DW_AT_type);<br>
+        Sep();<br>
+        if (T.getTag() == DW_TAG_enumeration_type) {<br>
+          auto V = C.find(DW_AT_const_value);<br>
+          bool FoundEnumerator = false;<br>
+          for (const DWARFDie &Enumerator : T) {<br>
+            auto EV = Enumerator.find(DW_AT_const_value);<br>
+            if (V && EV &&<br>
+                V->getAsSignedConstant() == EV->getAsSignedConstant()) {<br>
+              if (T.find(DW_AT_enum_class)) {<br>
+                appendQualifiedName(T);<br>
+                OS << "::";<br>
+              } else<br>
+                appendScopes(T.getParent());<br>
+              OS << Enumerator.getShortName();<br>
+              FoundEnumerator = true;<br>
+              break;<br>
+            }<br>
+          }<br>
+          if (FoundEnumerator)<br>
+            continue;<br>
+          OS << '(';<br>
+          appendQualifiedName(T);<br>
+          OS << ')';<br>
+          OS << to_string(*V->getAsSignedConstant());<br>
+          continue;<br>
+        }<br>
+        // /Maybe/ we could do pointer type parameters, looking for the<br>
+        // symbol in the ELF symbol table to get back to the variable...<br>
+        // but probably not worth it.<br>
+        if (T.getTag() == DW_TAG_pointer_type)<br>
+          continue;<br>
+        const char *RawName = dwarf::toString(T.find(DW_AT_name), nullptr);<br>
+        assert(RawName);<br>
+        StringRef Name = RawName;<br>
+        auto V = C.find(DW_AT_const_value);<br>
+        bool IsQualifiedChar = false;<br>
+        if (Name == "bool") {<br>
+          OS << (*V->getAsUnsignedConstant() ? "true" : "false");<br>
+        } else if (Name == "short") {<br>
+          OS << "(short)";<br>
+          OS << to_string(*V->getAsSignedConstant());<br>
+        } else if (Name == "unsigned short") {<br>
+          OS << "(unsigned short)";<br>
+          OS << to_string(*V->getAsSignedConstant());<br>
+        } else if (Name == "int")<br>
+          OS << to_string(*V->getAsSignedConstant());<br>
+        else if (Name == "long") {<br>
+          OS << to_string(*V->getAsSignedConstant());<br>
+          OS << "L";<br>
+        } else if (Name == "long long") {<br>
+          OS << to_string(*V->getAsSignedConstant());<br>
+          OS << "LL";<br>
+        } else if (Name == "unsigned int") {<br>
+          OS << to_string(*V->getAsUnsignedConstant());<br>
+          OS << "U";<br>
+        } else if (Name == "unsigned long") {<br>
+          OS << to_string(*V->getAsUnsignedConstant());<br>
+          OS << "UL";<br>
+        } else if (Name == "unsigned long long") {<br>
+          OS << to_string(*V->getAsUnsignedConstant());<br>
+          OS << "ULL";<br>
+        } else if (Name == "char" ||<br>
+                   (IsQualifiedChar =<br>
+                        (Name == "unsigned char" || Name == "signed char"))) {<br>
+          // FIXME: check T's DW_AT_type to see if it's signed or not (since<br>
+          // char signedness is implementation defined).<br>
+          auto Val = *V->getAsSignedConstant();<br>
+          // Copied/hacked up from Clang's CharacterLiteral::print - incomplete<br>
+          // (doesn't actually support <br>
diff erent character types/widths, sign<br>
+          // handling's not done, and doesn't correctly test if a character is<br>
+          // printable or needs to use a numeric escape sequence instead)<br>
+          if (IsQualifiedChar) {<br>
+            OS << '(';<br>
+            OS << Name;<br>
+            OS << ')';<br>
+          }<br>
+          switch (Val) {<br>
+          case '\\':<br>
+            OS << "'\\\\'";<br>
+            break;<br>
+          case '\'':<br>
+            OS << "'\\''";<br>
+            break;<br>
+          case '\a':<br>
+            // TODO: K&R: the meaning of '\\a' is <br>
diff erent in traditional C<br>
+            OS << "'\\a'";<br>
+            break;<br>
+          case '\b':<br>
+            OS << "'\\b'";<br>
+            break;<br>
+          case '\f':<br>
+            OS << "'\\f'";<br>
+            break;<br>
+          case '\n':<br>
+            OS << "'\\n'";<br>
+            break;<br>
+          case '\r':<br>
+            OS << "'\\r'";<br>
+            break;<br>
+          case '\t':<br>
+            OS << "'\\t'";<br>
+            break;<br>
+          case '\v':<br>
+            OS << "'\\v'";<br>
+            break;<br>
+          default:<br>
+            if ((Val & ~0xFFu) == ~0xFFu)<br>
+              Val &= 0xFFu;<br>
+            if (Val < 127 && Val >= 32) {<br>
+              OS << "'";<br>
+              OS << (char)Val;<br>
+              OS << "'";<br>
+            } else if (Val < 256)<br>
+              OS << to_string(llvm::format("'\\x%02x'", Val));<br>
+            else if (Val <= 0xFFFF)<br>
+              OS << to_string(llvm::format("'\\u%04x'", Val));<br>
+            else<br>
+              OS << to_string(llvm::format("'\\U%08x'", Val));<br>
+          }<br>
+        }<br>
+        continue;<br>
+      }<br>
+      if (C.getTag() == dwarf::DW_TAG_GNU_template_template_param) {<br>
+        const char *RawName =<br>
+            dwarf::toString(C.find(DW_AT_GNU_template_name), nullptr);<br>
+        assert(RawName);<br>
+        StringRef Name = RawName;<br>
+        Sep();<br>
+        OS << Name;<br>
+        continue;<br>
+      }<br>
+      if (C.getTag() != dwarf::DW_TAG_template_type_parameter)<br>
+        continue;<br>
+      auto TypeAttr = C.find(DW_AT_type);<br>
+      Sep();<br>
+      appendQualifiedName(TypeAttr<br>
+                              ? C.getAttributeValueAsReferencedDie(*TypeAttr)<br>
+                              : DWARFDie());<br>
+    }<br>
+    if (IsTemplate && *FirstParameter && FirstParameter == &FirstParameterValue)<br>
+      OS << '<';<br>
+    return IsTemplate;<br>
+  }<br>
   void decomposeConstVolatile(DWARFDie &N, DWARFDie &T, DWARFDie &C,<br>
                               DWARFDie &V) {<br>
     (N.getTag() == DW_TAG_const_type ? C : V) = N;<br>
@@ -386,10 +600,11 @@ struct DWARFTypePrinter {<br>
   }<br>
<br>
   /// Recursively append the DIE type name when applicable.<br>
-  void appendUnqualifiedName(const DWARFDie &D) {<br>
+  void appendUnqualifiedName(DWARFDie D,<br>
+                             std::string *OriginalFullName = nullptr) {<br>
     // FIXME: We should have pretty printers per language. Currently we print<br>
     // everything as if it was C++ and fall back to the TAG type name.<br>
-    DWARFDie Inner = appendUnqualifiedNameBefore(D);<br>
+    DWARFDie Inner = appendUnqualifiedNameBefore(D, OriginalFullName);<br>
     appendUnqualifiedNameAfter(D, Inner);<br>
   }<br>
<br>
@@ -586,6 +801,14 @@ static void dumpAttribute(raw_ostream &OS, const DWARFDie &Die,<br>
   OS << ")\n";<br>
 }<br>
<br>
+void DWARFDie::getFullName(raw_string_ostream &OS,<br>
+                           std::string *OriginalFullName) const {<br>
+  const char *NamePtr = getShortName();<br>
+  if (!NamePtr)<br>
+    return;<br>
+  DWARFTypePrinter(OS).appendUnqualifiedName(*this, OriginalFullName);<br>
+}<br>
+<br>
 bool DWARFDie::isSubprogramDIE() const { return getTag() == DW_TAG_subprogram; }<br>
<br>
 bool DWARFDie::isSubroutineDIE() const {<br>
<br>
diff  --git a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp<br>
index 11301175768ee..9da2236a273d9 100644<br>
--- a/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp<br>
+++ b/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp<br>
@@ -7,6 +7,7 @@<br>
 //===----------------------------------------------------------------------===//<br>
 #include "llvm/DebugInfo/DWARF/DWARFVerifier.h"<br>
 #include "llvm/ADT/SmallSet.h"<br>
+#include "llvm/BinaryFormat/Dwarf.h"<br>
 #include "llvm/DebugInfo/DWARF/DWARFCompileUnit.h"<br>
 #include "llvm/DebugInfo/DWARF/DWARFContext.h"<br>
 #include "llvm/DebugInfo/DWARF/DWARFDebugLine.h"<br>
@@ -161,6 +162,26 @@ bool DWARFVerifier::verifyUnitHeader(const DWARFDataExtractor DebugInfoData,<br>
   return Success;<br>
 }<br>
<br>
+bool DWARFVerifier::verifyName(const DWARFDie &Die) {<br>
+  // FIXME Add some kind of record of which DIE names have already failed and<br>
+  // don't bother checking a DIE that uses an already failed DIE.<br>
+<br>
+  std::string ReconstructedName;<br>
+  raw_string_ostream OS(ReconstructedName);<br>
+  std::string OriginalFullName;<br>
+  Die.getFullName(OS, &OriginalFullName);<br>
+  OS.flush();<br>
+  if (!OriginalFullName.empty() && OriginalFullName != ReconstructedName) {<br>
+    error() << "Simplified template DW_AT_name could not be reconstituted:\n"<br>
+            << formatv("         original: {0}\n"<br>
+                       "    reconstituted: {1}\n",<br>
+                       OriginalFullName, ReconstructedName);<br>
+    dump(Die) << '\n';<br>
+    dump(Die.getDwarfUnit()->getUnitDIE()) << '\n';<br>
+  }<br>
+  return 0;<br>
+}<br>
+<br>
 unsigned DWARFVerifier::verifyUnitContents(DWARFUnit &Unit,<br>
                                            ReferenceMap &UnitLocalReferences,<br>
                                            ReferenceMap &CrossUnitReferences) {<br>
@@ -178,6 +199,8 @@ unsigned DWARFVerifier::verifyUnitContents(DWARFUnit &Unit,<br>
                                            CrossUnitReferences);<br>
     }<br>
<br>
+    NumUnitErrors += verifyName(Die);<br>
+<br>
     if (Die.hasChildren()) {<br>
       if (Die.getFirstChild().isValid() &&<br>
           Die.getFirstChild().getTag() == DW_TAG_null) {<br>
<br>
diff  --git a/llvm/test/tools/llvm-dwarfdump/X86/prettyprint_types.s b/llvm/test/tools/llvm-dwarfdump/X86/prettyprint_types.s<br>
index 6c2dc4d51f9f4..cd62bf9159898 100644<br>
--- a/llvm/test/tools/llvm-dwarfdump/X86/prettyprint_types.s<br>
+++ b/llvm/test/tools/llvm-dwarfdump/X86/prettyprint_types.s<br>
@@ -2,49 +2,74 @@<br>
 # RUN:   | llvm-dwarfdump --name=t1 --show-children - | FileCheck %s<br>
<br>
 # Assembly generated from the following source:<br>
-# <br>
-#  struct foo;<br>
-#  template <typename... Ts><br>
-#  struct t1 {};<br>
-#  namespace ns {<br>
-#  struct inner { };<br>
-#  }<br>
-#  namespace {<br>
-#  struct anon_ns_mem { };<br>
-#  }<br>
-#  t1<<br>
-#      // base type<br>
-#      int,<br>
-#      // nullptr unspecified type<br>
-#      decltype(nullptr),<br>
-#      // reference type<br>
-#      int &,<br>
-#      // rvalue reference type<br>
-#      int &&,<br>
-#      // pointer types<br>
-#      int *, const void *const *, const void *const, int *const volatile,<br>
-#      int *volatile, void *const,<br>
-#      // pointer to member variable<br>
-#      int foo::*,<br>
-#      // pointer to member functions<br>
-#      void (foo::*)(int), void (foo::*const &)() const volatile &&,<br>
-#      // arrays<br>
-#      int *const (&)[1], int *const[1], const int (&)[1], const int[1],<br>
-#      // subroutine types<br>
-#      int(), void(int), void(int, int), void (*)(foo *, int), void (*const)(),<br>
-#      void() const, void() volatile &&, void() const volatile &,<br>
-#      void(const volatile foo *), void (*(int))(float),<br>
-#      // qualified types<br>
-#      ns::inner, ns::inner(), ns::inner[1], ns::inner *, ns::inner ns::inner::*,<br>
-#      const ns::inner, anon_ns_mem><br>
-#      v1;<br>
-#  // extern function to force the code to be emitted - otherwise v1 (having<br>
-#  // internal linkage due to being of a type instantiated with an internal<br>
-#  // linkage type) would be optimized away as unused.<br>
-#  __attribute__((nodebug)) void*f2() {<br>
-#    return &v1;<br>
-#  }<br>
-# <br>
+#<br>
+#   struct foo;<br>
+#   template <typename... Ts><br>
+#   struct t1 {};<br>
+#   namespace ns {<br>
+#   struct inner { };<br>
+#   }<br>
+#   namespace {<br>
+#   struct anon_ns_mem { };<br>
+#   }<br>
+#   template <typename T><br>
+#   struct t2 { };<br>
+#   enum e1 {<br>
+#     E1<br>
+#   };<br>
+#   enum class e2 {<br>
+#     E2<br>
+#   };<br>
+#   template<typename T, T V><br>
+#   struct tv { };<br>
+#   template<char ...C><br>
+#   struct tc { };<br>
+#   t1<<br>
+#       // base type<br>
+#       int,<br>
+#       // nullptr unspecified type<br>
+#       decltype(nullptr),<br>
+#       // reference type<br>
+#       int &,<br>
+#       // rvalue reference type<br>
+#       int &&,<br>
+#       // pointer types<br>
+#       int *, const void *const *, const void *const, int *const volatile,<br>
+#       int *volatile, void *const,<br>
+#       // pointer to member variable<br>
+#       int foo::*,<br>
+#       // pointer to member functions<br>
+#       void (foo::*)(int), void (foo::*const &)() const volatile &&,<br>
+#       // arrays<br>
+#       int *const (&)[1], int *const[1], const int (&)[1], const int[1],<br>
+#       // subroutine types<br>
+#       int(), void(int), void(int, int), void (*)(foo *, int), void (*const)(),<br>
+#       void() const, void() volatile &&, void() const volatile &,<br>
+#       void(const volatile foo *), void (*(int))(float),<br>
+#       // qualified types<br>
+#       ns::inner, ns::inner(), ns::inner[1], ns::inner *, ns::inner ns::inner::*,<br>
+#       ns::inner (ns::inner::*)(ns::inner), const ns::inner, anon_ns_mem,<br>
+#       // templates<br>
+#       t2<t2<int>>,<br>
+#       // enum literals<br>
+#       tv<e1, E1>, tv<e1, (e1)1>, tv<e2, e2::E2>,<br>
+#       // char literals<br>
+#       tv<unsigned char, 'x'>,<br>
+#       tc<'x', '\\', '\'', '\a', '\b', '\f', '\n', '\r', '\t', '\v', (char)127>,<br>
+#       // integral literals<br>
+#       tv<bool, true>, tv<bool, false>, tv<short, 0>, tv<unsigned short, 0>,<br>
+#       tv<int, 0>, tv<long, 0L>, tv<long long, 0LL>, tv<unsigned, 0U>,<br>
+#       tv<unsigned long, 0UL>, tv<unsigned long long, 0ULL><br>
+#       // end of template parameter list<br>
+#       ><br>
+#       v1;<br>
+#   // extern function to force the code to be emitted - otherwise v1 (having<br>
+#   // internal linkage due to being of a type instantiated with an internal<br>
+#   // linkage type) would be optimized away as unused.<br>
+#   __attribute__((nodebug)) void*f1() {<br>
+#     return &v1;<br>
+#   }<br>
+#<br>
 # With the name of the "t1<...>" type renamed to "t1" (or using<br>
 # -gsimple-template-names) to make it easy to query for.<br>
 # Note that the llvm-dwarfdump command uses --name=t1 --show-children to only<br>
@@ -52,6 +77,7 @@<br>
 # intended and to avoid visiting subtypes that aren't intended to be tested<br>
 # separately.<br>
<br>
+<br>
 # base_type<br>
 # CHECK:   DW_AT_type{{.*}}"int"<br>
<br>
@@ -109,6 +135,37 @@<br>
 # CHECK:   DW_AT_type{{.*}}"const ns::inner"<br>
 # CHECK:   DW_AT_type{{.*}}"(anonymous namespace)::anon_ns_mem"<br>
<br>
+# template types<br>
+# CHECK:   DW_AT_type{{.*}}"t2<t2<int> >"<br>
+<br>
+# enum literals<br>
+# CHECK:   DW_AT_type{{.*}}"tv<e1, E1>")<br>
+# CHECK:   DW_AT_type{{.*}}"tv<e1, (e1)1>")<br>
+# CHECK:   DW_AT_type{{.*}}"tv<e2, e2::E2>")<br>
+<br>
+# char literals<br>
+# CHECK:   DW_AT_type{{.*}}"tv<unsigned char, (unsigned char)'x'>")<br>
+# CHECK:   DW_AT_type{{.*}}"tc<'x', '\\', '\'', '\a', '\b', '\f', '\n', '\r', '\t', '\v', '\x7f'>")<br>
+<br>
+# bool literals<br>
+# CHECK:   DW_AT_type{{.*}}"tv<bool, true>")<br>
+# CHECK:   DW_AT_type{{.*}}"tv<bool, false>")<br>
+<br>
+# int literals - these ones are a bit tricky since Clang is currently<br>
+# transforms integer type names (perhaps originally motivated to match GCC?) at<br>
+# the very end of `CGDebugInfo::CreateType(const BuiltinType *BT)`. The LLVM IR<br>
+# in this test is produced without those transformations. We should either add<br>
+# some code to libDebugInfoDWARF to reverse these transformations, or stop doing<br>
+# this transformation in clang if it's no longer needed.<br>
+# CHECK:   DW_AT_type{{.*}}"tv<short, (short)0>"<br>
+# CHECK:   DW_AT_type{{.*}}"tv<unsigned short, (unsigned short)0>"<br>
+# CHECK:   DW_AT_type{{.*}}"tv<int, 0>"<br>
+# CHECK:   DW_AT_type{{.*}}"tv<long, 0L>"<br>
+# CHECK:   DW_AT_type{{.*}}"tv<long long, 0LL>"<br>
+# CHECK:   DW_AT_type{{.*}}"tv<unsigned int, 0U>"<br>
+# CHECK:   DW_AT_type{{.*}}"tv<unsigned long, 0UL>"<br>
+# CHECK:   DW_AT_type{{.*}}"tv<unsigned long long, 0ULL>"<br>
+<br>
        .section        .debug_abbrev,"",@progbits<br>
        .byte   1                               # Abbreviation Code<br>
        .byte   17                              # DW_TAG_compile_unit<br>
@@ -350,6 +407,105 @@<br>
        .byte   1                               # DW_CHILDREN_yes<br>
        .byte   0                               # EOM(1)<br>
        .byte   0                               # EOM(2)<br>
+       .byte   31                              # Abbreviation Code<br>
+       .byte   19                              # DW_TAG_structure_type<br>
+       .byte   1                               # DW_CHILDREN_yes<br>
+       .byte   3                               # DW_AT_name<br>
+       .byte   14                              # DW_FORM_strp<br>
+       .byte   60                              # DW_AT_declaration<br>
+       .byte   25                              # DW_FORM_flag_present<br>
+       .byte   0                               # EOM(1)<br>
+       .byte   0                               # EOM(2)<br>
+       .byte   32                              # Abbreviation Code<br>
+       .byte   47                              # DW_TAG_template_type_parameter<br>
+       .byte   0                               # DW_CHILDREN_no<br>
+       .byte   73                              # DW_AT_type<br>
+       .byte   19                              # DW_FORM_ref4<br>
+       .byte   3                               # DW_AT_name<br>
+       .byte   14                              # DW_FORM_strp<br>
+       .byte   0                               # EOM(1)<br>
+       .byte   0                               # EOM(2)<br>
+       .byte   33                              # Abbreviation Code<br>
+       .byte   48                              # DW_TAG_template_value_parameter<br>
+       .byte   0                               # DW_CHILDREN_no<br>
+       .byte   73                              # DW_AT_type<br>
+       .byte   19                              # DW_FORM_ref4<br>
+       .byte   3                               # DW_AT_name<br>
+       .byte   14                              # DW_FORM_strp<br>
+       .byte   28                              # DW_AT_const_value<br>
+       .byte   15                              # DW_FORM_udata<br>
+       .byte   0                               # EOM(1)<br>
+       .byte   0                               # EOM(2)<br>
+       .byte   34                              # Abbreviation Code<br>
+       .byte   4                               # DW_TAG_enumeration_type<br>
+       .byte   1                               # DW_CHILDREN_yes<br>
+       .byte   73                              # DW_AT_type<br>
+       .byte   19                              # DW_FORM_ref4<br>
+       .byte   3                               # DW_AT_name<br>
+       .byte   14                              # DW_FORM_strp<br>
+       .byte   11                              # DW_AT_byte_size<br>
+       .byte   11                              # DW_FORM_data1<br>
+       .byte   58                              # DW_AT_decl_file<br>
+       .byte   11                              # DW_FORM_data1<br>
+       .byte   59                              # DW_AT_decl_line<br>
+       .byte   11                              # DW_FORM_data1<br>
+       .byte   0                               # EOM(1)<br>
+       .byte   0                               # EOM(2)<br>
+       .byte   35                              # Abbreviation Code<br>
+       .byte   40                              # DW_TAG_enumerator<br>
+       .byte   0                               # DW_CHILDREN_no<br>
+       .byte   3                               # DW_AT_name<br>
+       .byte   14                              # DW_FORM_strp<br>
+       .byte   28                              # DW_AT_const_value<br>
+       .byte   15                              # DW_FORM_udata<br>
+       .byte   0                               # EOM(1)<br>
+       .byte   0                               # EOM(2)<br>
+       .byte   36                              # Abbreviation Code<br>
+       .byte   48                              # DW_TAG_template_value_parameter<br>
+       .byte   0                               # DW_CHILDREN_no<br>
+       .byte   73                              # DW_AT_type<br>
+       .byte   19                              # DW_FORM_ref4<br>
+       .byte   3                               # DW_AT_name<br>
+       .byte   14                              # DW_FORM_strp<br>
+       .byte   28                              # DW_AT_const_value<br>
+       .byte   13                              # DW_FORM_sdata<br>
+       .byte   0                               # EOM(1)<br>
+       .byte   0                               # EOM(2)<br>
+       .byte   37                              # Abbreviation Code<br>
+       .byte   4                               # DW_TAG_enumeration_type<br>
+       .byte   1                               # DW_CHILDREN_yes<br>
+       .byte   73                              # DW_AT_type<br>
+       .byte   19                              # DW_FORM_ref4<br>
+       .byte   109                             # DW_AT_enum_class<br>
+       .byte   25                              # DW_FORM_flag_present<br>
+       .byte   3                               # DW_AT_name<br>
+       .byte   14                              # DW_FORM_strp<br>
+       .byte   11                              # DW_AT_byte_size<br>
+       .byte   11                              # DW_FORM_data1<br>
+       .byte   58                              # DW_AT_decl_file<br>
+       .byte   11                              # DW_FORM_data1<br>
+       .byte   59                              # DW_AT_decl_line<br>
+       .byte   11                              # DW_FORM_data1<br>
+       .byte   0                               # EOM(1)<br>
+       .byte   0                               # EOM(2)<br>
+       .byte   38                              # Abbreviation Code<br>
+       .byte   40                              # DW_TAG_enumerator<br>
+       .byte   0                               # DW_CHILDREN_no<br>
+       .byte   3                               # DW_AT_name<br>
+       .byte   14                              # DW_FORM_strp<br>
+       .byte   28                              # DW_AT_const_value<br>
+       .byte   13                              # DW_FORM_sdata<br>
+       .byte   0                               # EOM(1)<br>
+       .byte   0                               # EOM(2)<br>
+       .byte   39                              # Abbreviation Code<br>
+       .byte   48                              # DW_TAG_template_value_parameter<br>
+       .byte   0                               # DW_CHILDREN_no<br>
+       .byte   73                              # DW_AT_type<br>
+       .byte   19                              # DW_FORM_ref4<br>
+       .byte   28                              # DW_AT_const_value<br>
+       .byte   13                              # DW_FORM_sdata<br>
+       .byte   0                               # EOM(1)<br>
+       .byte   0                               # EOM(2)<br>
        .byte   0                               # EOM(3)<br>
        .section        .debug_info,"",@progbits<br>
 .Lcu_begin0:<br>
@@ -358,7 +514,7 @@<br>
        .short  4                               # DWARF version number<br>
        .long   .debug_abbrev                   # Offset Into Abbrev. Section<br>
        .byte   8                               # Address Size (in bytes)<br>
-       .byte   1                               # Abbrev [1] 0xb:0x266 DW_TAG_compile_unit<br>
+       .byte   1                               # Abbrev [1] 0xb:0x4fd DW_TAG_compile_unit<br>
        .long   .Linfo_string0                  # DW_AT_producer<br>
        .short  33                              # DW_AT_language<br>
        .long   .Linfo_string1                  # DW_AT_name<br>
@@ -368,276 +524,582 @@<br>
        .long   .Linfo_string3                  # DW_AT_name<br>
        .long   51                              # DW_AT_type<br>
        .byte   1                               # DW_AT_decl_file<br>
-       .byte   35                              # DW_AT_decl_line<br>
+       .byte   60                              # DW_AT_decl_line<br>
        .byte   9                               # DW_AT_location<br>
        .byte   3<br>
        .quad   v1<br>
-       .byte   3                               # Abbrev [3] 0x33:0xba DW_TAG_structure_type<br>
+       .byte   3                               # Abbrev [3] 0x33:0x10f DW_TAG_structure_type<br>
        .byte   5                               # DW_AT_calling_convention<br>
-       .long   .Linfo_string13                 # DW_AT_name<br>
+       .long   .Linfo_string33                 # DW_AT_name<br>
        .byte   1                               # DW_AT_byte_size<br>
        .byte   1                               # DW_AT_decl_file<br>
        .byte   3                               # DW_AT_decl_line<br>
-       .byte   4                               # Abbrev [4] 0x3c:0xb0 DW_TAG_GNU_template_parameter_pack<br>
+       .byte   4                               # Abbrev [4] 0x3c:0x105 DW_TAG_GNU_template_parameter_pack<br>
        .long   .Linfo_string4                  # DW_AT_name<br>
        .byte   5                               # Abbrev [5] 0x41:0x5 DW_TAG_template_type_parameter<br>
-       .long   237                             # DW_AT_type<br>
+       .long   322                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0x46:0x5 DW_TAG_template_type_parameter<br>
-       .long   244                             # DW_AT_type<br>
+       .long   329                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0x4b:0x5 DW_TAG_template_type_parameter<br>
-       .long   249                             # DW_AT_type<br>
+       .long   334                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0x50:0x5 DW_TAG_template_type_parameter<br>
-       .long   254                             # DW_AT_type<br>
+       .long   339                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0x55:0x5 DW_TAG_template_type_parameter<br>
-       .long   259                             # DW_AT_type<br>
+       .long   344                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0x5a:0x5 DW_TAG_template_type_parameter<br>
-       .long   264                             # DW_AT_type<br>
+       .long   349                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0x5f:0x5 DW_TAG_template_type_parameter<br>
-       .long   269                             # DW_AT_type<br>
+       .long   354                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0x64:0x5 DW_TAG_template_type_parameter<br>
-       .long   280                             # DW_AT_type<br>
+       .long   365                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0x69:0x5 DW_TAG_template_type_parameter<br>
-       .long   285                             # DW_AT_type<br>
+       .long   370                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0x6e:0x5 DW_TAG_template_type_parameter<br>
-       .long   290                             # DW_AT_type<br>
+       .long   375                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0x73:0x5 DW_TAG_template_type_parameter<br>
-       .long   296                             # DW_AT_type<br>
+       .long   381                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0x78:0x5 DW_TAG_template_type_parameter<br>
-       .long   310                             # DW_AT_type<br>
+       .long   395                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0x7d:0x5 DW_TAG_template_type_parameter<br>
-       .long   336                             # DW_AT_type<br>
+       .long   421                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0x82:0x5 DW_TAG_template_type_parameter<br>
-       .long   377                             # DW_AT_type<br>
+       .long   462                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0x87:0x5 DW_TAG_template_type_parameter<br>
-       .long   382                             # DW_AT_type<br>
+       .long   467                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0x8c:0x5 DW_TAG_template_type_parameter<br>
-       .long   406                             # DW_AT_type<br>
+       .long   491                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0x91:0x5 DW_TAG_template_type_parameter<br>
-       .long   411                             # DW_AT_type<br>
+       .long   496                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0x96:0x5 DW_TAG_template_type_parameter<br>
-       .long   428                             # DW_AT_type<br>
+       .long   513                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0x9b:0x5 DW_TAG_template_type_parameter<br>
-       .long   433                             # DW_AT_type<br>
+       .long   518                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0xa0:0x5 DW_TAG_template_type_parameter<br>
-       .long   440                             # DW_AT_type<br>
+       .long   525                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0xa5:0x5 DW_TAG_template_type_parameter<br>
-       .long   452                             # DW_AT_type<br>
+       .long   537                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0xaa:0x5 DW_TAG_template_type_parameter<br>
-       .long   474                             # DW_AT_type<br>
+       .long   559                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0xaf:0x5 DW_TAG_template_type_parameter<br>
-       .long   485                             # DW_AT_type<br>
+       .long   570                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0xb4:0x5 DW_TAG_template_type_parameter<br>
-       .long   490                             # DW_AT_type<br>
+       .long   575                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0xb9:0x5 DW_TAG_template_type_parameter<br>
-       .long   496                             # DW_AT_type<br>
+       .long   581                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0xbe:0x5 DW_TAG_template_type_parameter<br>
-       .long   507                             # DW_AT_type<br>
+       .long   592                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0xc3:0x5 DW_TAG_template_type_parameter<br>
-       .long   519                             # DW_AT_type<br>
+       .long   604                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0xc8:0x5 DW_TAG_template_type_parameter<br>
-       .long   554                             # DW_AT_type<br>
+       .long   639                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0xcd:0x5 DW_TAG_template_type_parameter<br>
-       .long   560                             # DW_AT_type<br>
+       .long   645                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0xd2:0x5 DW_TAG_template_type_parameter<br>
-       .long   565                             # DW_AT_type<br>
+       .long   650                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0xd7:0x5 DW_TAG_template_type_parameter<br>
-       .long   577                             # DW_AT_type<br>
+       .long   662                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0xdc:0x5 DW_TAG_template_type_parameter<br>
-       .long   582                             # DW_AT_type<br>
+       .long   667                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0xe1:0x5 DW_TAG_template_type_parameter<br>
-       .long   612                             # DW_AT_type<br>
+       .long   676                             # DW_AT_type<br>
        .byte   5                               # Abbrev [5] 0xe6:0x5 DW_TAG_template_type_parameter<br>
-       .long   618                             # DW_AT_type<br>
+       .long   706                             # DW_AT_type<br>
+       .byte   5                               # Abbrev [5] 0xeb:0x5 DW_TAG_template_type_parameter<br>
+       .long   712                             # DW_AT_type<br>
+       .byte   5                               # Abbrev [5] 0xf0:0x5 DW_TAG_template_type_parameter<br>
+       .long   718                             # DW_AT_type<br>
+       .byte   5                               # Abbrev [5] 0xf5:0x5 DW_TAG_template_type_parameter<br>
+       .long   748                             # DW_AT_type<br>
+       .byte   5                               # Abbrev [5] 0xfa:0x5 DW_TAG_template_type_parameter<br>
+       .long   799                             # DW_AT_type<br>
+       .byte   5                               # Abbrev [5] 0xff:0x5 DW_TAG_template_type_parameter<br>
+       .long   824                             # DW_AT_type<br>
+       .byte   5                               # Abbrev [5] 0x104:0x5 DW_TAG_template_type_parameter<br>
+       .long   868                             # DW_AT_type<br>
+       .byte   5                               # Abbrev [5] 0x109:0x5 DW_TAG_template_type_parameter<br>
+       .long   900                             # DW_AT_type<br>
+       .byte   5                               # Abbrev [5] 0x10e:0x5 DW_TAG_template_type_parameter<br>
+       .long   988                             # DW_AT_type<br>
+       .byte   5                               # Abbrev [5] 0x113:0x5 DW_TAG_template_type_parameter<br>
+       .long   1020                            # DW_AT_type<br>
+       .byte   5                               # Abbrev [5] 0x118:0x5 DW_TAG_template_type_parameter<br>
+       .long   1045                            # DW_AT_type<br>
+       .byte   5                               # Abbrev [5] 0x11d:0x5 DW_TAG_template_type_parameter<br>
+       .long   1077                            # DW_AT_type<br>
+       .byte   5                               # Abbrev [5] 0x122:0x5 DW_TAG_template_type_parameter<br>
+       .long   1109                            # DW_AT_type<br>
+       .byte   5                               # Abbrev [5] 0x127:0x5 DW_TAG_template_type_parameter<br>
+       .long   1134                            # DW_AT_type<br>
+       .byte   5                               # Abbrev [5] 0x12c:0x5 DW_TAG_template_type_parameter<br>
+       .long   1166                            # DW_AT_type<br>
+       .byte   5                               # Abbrev [5] 0x131:0x5 DW_TAG_template_type_parameter<br>
+       .long   1198                            # DW_AT_type<br>
+       .byte   5                               # Abbrev [5] 0x136:0x5 DW_TAG_template_type_parameter<br>
+       .long   1223                            # DW_AT_type<br>
+       .byte   5                               # Abbrev [5] 0x13b:0x5 DW_TAG_template_type_parameter<br>
+       .long   1255                            # DW_AT_type<br>
        .byte   0                               # End Of Children Mark<br>
        .byte   0                               # End Of Children Mark<br>
-       .byte   6                               # Abbrev [6] 0xed:0x7 DW_TAG_base_type<br>
+       .byte   6                               # Abbrev [6] 0x142:0x7 DW_TAG_base_type<br>
        .long   .Linfo_string5                  # DW_AT_name<br>
        .byte   5                               # DW_AT_encoding<br>
        .byte   4                               # DW_AT_byte_size<br>
-       .byte   7                               # Abbrev [7] 0xf4:0x5 DW_TAG_unspecified_type<br>
+       .byte   7                               # Abbrev [7] 0x149:0x5 DW_TAG_unspecified_type<br>
        .long   .Linfo_string6                  # DW_AT_name<br>
-       .byte   8                               # Abbrev [8] 0xf9:0x5 DW_TAG_reference_type<br>
-       .long   237                             # DW_AT_type<br>
-       .byte   9                               # Abbrev [9] 0xfe:0x5 DW_TAG_rvalue_reference_type<br>
-       .long   237                             # DW_AT_type<br>
-       .byte   10                              # Abbrev [10] 0x103:0x5 DW_TAG_pointer_type<br>
-       .long   237                             # DW_AT_type<br>
-       .byte   10                              # Abbrev [10] 0x108:0x5 DW_TAG_pointer_type<br>
-       .long   269                             # DW_AT_type<br>
-       .byte   11                              # Abbrev [11] 0x10d:0x5 DW_TAG_const_type<br>
-       .long   274                             # DW_AT_type<br>
-       .byte   10                              # Abbrev [10] 0x112:0x5 DW_TAG_pointer_type<br>
-       .long   279                             # DW_AT_type<br>
-       .byte   12                              # Abbrev [12] 0x117:0x1 DW_TAG_const_type<br>
-       .byte   11                              # Abbrev [11] 0x118:0x5 DW_TAG_const_type<br>
-       .long   285                             # DW_AT_type<br>
-       .byte   13                              # Abbrev [13] 0x11d:0x5 DW_TAG_volatile_type<br>
-       .long   259                             # DW_AT_type<br>
-       .byte   11                              # Abbrev [11] 0x122:0x5 DW_TAG_const_type<br>
-       .long   295                             # DW_AT_type<br>
-       .byte   14                              # Abbrev [14] 0x127:0x1 DW_TAG_pointer_type<br>
-       .byte   15                              # Abbrev [15] 0x128:0x9 DW_TAG_ptr_to_member_type<br>
-       .long   237                             # DW_AT_type<br>
-       .long   305                             # DW_AT_containing_type<br>
-       .byte   16                              # Abbrev [16] 0x131:0x5 DW_TAG_structure_type<br>
+       .byte   8                               # Abbrev [8] 0x14e:0x5 DW_TAG_reference_type<br>
+       .long   322                             # DW_AT_type<br>
+       .byte   9                               # Abbrev [9] 0x153:0x5 DW_TAG_rvalue_reference_type<br>
+       .long   322                             # DW_AT_type<br>
+       .byte   10                              # Abbrev [10] 0x158:0x5 DW_TAG_pointer_type<br>
+       .long   322                             # DW_AT_type<br>
+       .byte   10                              # Abbrev [10] 0x15d:0x5 DW_TAG_pointer_type<br>
+       .long   354                             # DW_AT_type<br>
+       .byte   11                              # Abbrev [11] 0x162:0x5 DW_TAG_const_type<br>
+       .long   359                             # DW_AT_type<br>
+       .byte   10                              # Abbrev [10] 0x167:0x5 DW_TAG_pointer_type<br>
+       .long   364                             # DW_AT_type<br>
+       .byte   12                              # Abbrev [12] 0x16c:0x1 DW_TAG_const_type<br>
+       .byte   11                              # Abbrev [11] 0x16d:0x5 DW_TAG_const_type<br>
+       .long   370                             # DW_AT_type<br>
+       .byte   13                              # Abbrev [13] 0x172:0x5 DW_TAG_volatile_type<br>
+       .long   344                             # DW_AT_type<br>
+       .byte   11                              # Abbrev [11] 0x177:0x5 DW_TAG_const_type<br>
+       .long   380                             # DW_AT_type<br>
+       .byte   14                              # Abbrev [14] 0x17c:0x1 DW_TAG_pointer_type<br>
+       .byte   15                              # Abbrev [15] 0x17d:0x9 DW_TAG_ptr_to_member_type<br>
+       .long   322                             # DW_AT_type<br>
+       .long   390                             # DW_AT_containing_type<br>
+       .byte   16                              # Abbrev [16] 0x186:0x5 DW_TAG_structure_type<br>
        .long   .Linfo_string7                  # DW_AT_name<br>
                                         # DW_AT_declaration<br>
-       .byte   15                              # Abbrev [15] 0x136:0x9 DW_TAG_ptr_to_member_type<br>
-       .long   319                             # DW_AT_type<br>
-       .long   305                             # DW_AT_containing_type<br>
-       .byte   17                              # Abbrev [17] 0x13f:0xc DW_TAG_subroutine_type<br>
-       .byte   18                              # Abbrev [18] 0x140:0x5 DW_TAG_formal_parameter<br>
-       .long   331                             # DW_AT_type<br>
+       .byte   15                              # Abbrev [15] 0x18b:0x9 DW_TAG_ptr_to_member_type<br>
+       .long   404                             # DW_AT_type<br>
+       .long   390                             # DW_AT_containing_type<br>
+       .byte   17                              # Abbrev [17] 0x194:0xc DW_TAG_subroutine_type<br>
+       .byte   18                              # Abbrev [18] 0x195:0x5 DW_TAG_formal_parameter<br>
+       .long   416                             # DW_AT_type<br>
                                         # DW_AT_artificial<br>
-       .byte   19                              # Abbrev [19] 0x145:0x5 DW_TAG_formal_parameter<br>
-       .long   237                             # DW_AT_type<br>
-       .byte   0                               # End Of Children Mark<br>
-       .byte   10                              # Abbrev [10] 0x14b:0x5 DW_TAG_pointer_type<br>
-       .long   305                             # DW_AT_type<br>
-       .byte   8                               # Abbrev [8] 0x150:0x5 DW_TAG_reference_type<br>
-       .long   341                             # DW_AT_type<br>
-       .byte   11                              # Abbrev [11] 0x155:0x5 DW_TAG_const_type<br>
-       .long   346                             # DW_AT_type<br>
-       .byte   15                              # Abbrev [15] 0x15a:0x9 DW_TAG_ptr_to_member_type<br>
-       .long   355                             # DW_AT_type<br>
-       .long   305                             # DW_AT_containing_type<br>
-       .byte   20                              # Abbrev [20] 0x163:0x7 DW_TAG_subroutine_type<br>
+       .byte   19                              # Abbrev [19] 0x19a:0x5 DW_TAG_formal_parameter<br>
+       .long   322                             # DW_AT_type<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   10                              # Abbrev [10] 0x1a0:0x5 DW_TAG_pointer_type<br>
+       .long   390                             # DW_AT_type<br>
+       .byte   8                               # Abbrev [8] 0x1a5:0x5 DW_TAG_reference_type<br>
+       .long   426                             # DW_AT_type<br>
+       .byte   11                              # Abbrev [11] 0x1aa:0x5 DW_TAG_const_type<br>
+       .long   431                             # DW_AT_type<br>
+       .byte   15                              # Abbrev [15] 0x1af:0x9 DW_TAG_ptr_to_member_type<br>
+       .long   440                             # DW_AT_type<br>
+       .long   390                             # DW_AT_containing_type<br>
+       .byte   20                              # Abbrev [20] 0x1b8:0x7 DW_TAG_subroutine_type<br>
                                         # DW_AT_rvalue_reference<br>
-       .byte   18                              # Abbrev [18] 0x164:0x5 DW_TAG_formal_parameter<br>
-       .long   362                             # DW_AT_type<br>
+       .byte   18                              # Abbrev [18] 0x1b9:0x5 DW_TAG_formal_parameter<br>
+       .long   447                             # DW_AT_type<br>
                                         # DW_AT_artificial<br>
        .byte   0                               # End Of Children Mark<br>
-       .byte   10                              # Abbrev [10] 0x16a:0x5 DW_TAG_pointer_type<br>
-       .long   367                             # DW_AT_type<br>
-       .byte   11                              # Abbrev [11] 0x16f:0x5 DW_TAG_const_type<br>
-       .long   372                             # DW_AT_type<br>
-       .byte   13                              # Abbrev [13] 0x174:0x5 DW_TAG_volatile_type<br>
-       .long   305                             # DW_AT_type<br>
-       .byte   8                               # Abbrev [8] 0x179:0x5 DW_TAG_reference_type<br>
-       .long   382                             # DW_AT_type<br>
-       .byte   11                              # Abbrev [11] 0x17e:0x5 DW_TAG_const_type<br>
-       .long   387                             # DW_AT_type<br>
-       .byte   21                              # Abbrev [21] 0x183:0xc DW_TAG_array_type<br>
-       .long   259                             # DW_AT_type<br>
-       .byte   22                              # Abbrev [22] 0x188:0x6 DW_TAG_subrange_type<br>
-       .long   399                             # DW_AT_type<br>
+       .byte   10                              # Abbrev [10] 0x1bf:0x5 DW_TAG_pointer_type<br>
+       .long   452                             # DW_AT_type<br>
+       .byte   11                              # Abbrev [11] 0x1c4:0x5 DW_TAG_const_type<br>
+       .long   457                             # DW_AT_type<br>
+       .byte   13                              # Abbrev [13] 0x1c9:0x5 DW_TAG_volatile_type<br>
+       .long   390                             # DW_AT_type<br>
+       .byte   8                               # Abbrev [8] 0x1ce:0x5 DW_TAG_reference_type<br>
+       .long   467                             # DW_AT_type<br>
+       .byte   11                              # Abbrev [11] 0x1d3:0x5 DW_TAG_const_type<br>
+       .long   472                             # DW_AT_type<br>
+       .byte   21                              # Abbrev [21] 0x1d8:0xc DW_TAG_array_type<br>
+       .long   344                             # DW_AT_type<br>
+       .byte   22                              # Abbrev [22] 0x1dd:0x6 DW_TAG_subrange_type<br>
+       .long   484                             # DW_AT_type<br>
        .byte   1                               # DW_AT_count<br>
        .byte   0                               # End Of Children Mark<br>
-       .byte   23                              # Abbrev [23] 0x18f:0x7 DW_TAG_base_type<br>
+       .byte   23                              # Abbrev [23] 0x1e4:0x7 DW_TAG_base_type<br>
        .long   .Linfo_string8                  # DW_AT_name<br>
        .byte   8                               # DW_AT_byte_size<br>
        .byte   7                               # DW_AT_encoding<br>
-       .byte   8                               # Abbrev [8] 0x196:0x5 DW_TAG_reference_type<br>
-       .long   411                             # DW_AT_type<br>
-       .byte   11                              # Abbrev [11] 0x19b:0x5 DW_TAG_const_type<br>
-       .long   416                             # DW_AT_type<br>
-       .byte   21                              # Abbrev [21] 0x1a0:0xc DW_TAG_array_type<br>
-       .long   237                             # DW_AT_type<br>
-       .byte   22                              # Abbrev [22] 0x1a5:0x6 DW_TAG_subrange_type<br>
-       .long   399                             # DW_AT_type<br>
+       .byte   8                               # Abbrev [8] 0x1eb:0x5 DW_TAG_reference_type<br>
+       .long   496                             # DW_AT_type<br>
+       .byte   11                              # Abbrev [11] 0x1f0:0x5 DW_TAG_const_type<br>
+       .long   501                             # DW_AT_type<br>
+       .byte   21                              # Abbrev [21] 0x1f5:0xc DW_TAG_array_type<br>
+       .long   322                             # DW_AT_type<br>
+       .byte   22                              # Abbrev [22] 0x1fa:0x6 DW_TAG_subrange_type<br>
+       .long   484                             # DW_AT_type<br>
        .byte   1                               # DW_AT_count<br>
        .byte   0                               # End Of Children Mark<br>
-       .byte   24                              # Abbrev [24] 0x1ac:0x5 DW_TAG_subroutine_type<br>
-       .long   237                             # DW_AT_type<br>
-       .byte   17                              # Abbrev [17] 0x1b1:0x7 DW_TAG_subroutine_type<br>
-       .byte   19                              # Abbrev [19] 0x1b2:0x5 DW_TAG_formal_parameter<br>
-       .long   237                             # DW_AT_type<br>
+       .byte   24                              # Abbrev [24] 0x201:0x5 DW_TAG_subroutine_type<br>
+       .long   322                             # DW_AT_type<br>
+       .byte   17                              # Abbrev [17] 0x206:0x7 DW_TAG_subroutine_type<br>
+       .byte   19                              # Abbrev [19] 0x207:0x5 DW_TAG_formal_parameter<br>
+       .long   322                             # DW_AT_type<br>
        .byte   0                               # End Of Children Mark<br>
-       .byte   17                              # Abbrev [17] 0x1b8:0xc DW_TAG_subroutine_type<br>
-       .byte   19                              # Abbrev [19] 0x1b9:0x5 DW_TAG_formal_parameter<br>
-       .long   237                             # DW_AT_type<br>
-       .byte   19                              # Abbrev [19] 0x1be:0x5 DW_TAG_formal_parameter<br>
-       .long   237                             # DW_AT_type<br>
+       .byte   17                              # Abbrev [17] 0x20d:0xc DW_TAG_subroutine_type<br>
+       .byte   19                              # Abbrev [19] 0x20e:0x5 DW_TAG_formal_parameter<br>
+       .long   322                             # DW_AT_type<br>
+       .byte   19                              # Abbrev [19] 0x213:0x5 DW_TAG_formal_parameter<br>
+       .long   322                             # DW_AT_type<br>
        .byte   0                               # End Of Children Mark<br>
-       .byte   10                              # Abbrev [10] 0x1c4:0x5 DW_TAG_pointer_type<br>
-       .long   457                             # DW_AT_type<br>
-       .byte   17                              # Abbrev [17] 0x1c9:0xc DW_TAG_subroutine_type<br>
-       .byte   19                              # Abbrev [19] 0x1ca:0x5 DW_TAG_formal_parameter<br>
-       .long   469                             # DW_AT_type<br>
-       .byte   19                              # Abbrev [19] 0x1cf:0x5 DW_TAG_formal_parameter<br>
-       .long   237                             # DW_AT_type<br>
-       .byte   0                               # End Of Children Mark<br>
-       .byte   10                              # Abbrev [10] 0x1d5:0x5 DW_TAG_pointer_type<br>
-       .long   305                             # DW_AT_type<br>
-       .byte   11                              # Abbrev [11] 0x1da:0x5 DW_TAG_const_type<br>
-       .long   479                             # DW_AT_type<br>
-       .byte   10                              # Abbrev [10] 0x1df:0x5 DW_TAG_pointer_type<br>
-       .long   484                             # DW_AT_type<br>
-       .byte   25                              # Abbrev [25] 0x1e4:0x1 DW_TAG_subroutine_type<br>
-       .byte   11                              # Abbrev [11] 0x1e5:0x5 DW_TAG_const_type<br>
-       .long   484                             # DW_AT_type<br>
-       .byte   13                              # Abbrev [13] 0x1ea:0x5 DW_TAG_volatile_type<br>
-       .long   495                             # DW_AT_type<br>
-       .byte   26                              # Abbrev [26] 0x1ef:0x1 DW_TAG_subroutine_type<br>
+       .byte   10                              # Abbrev [10] 0x219:0x5 DW_TAG_pointer_type<br>
+       .long   542                             # DW_AT_type<br>
+       .byte   17                              # Abbrev [17] 0x21e:0xc DW_TAG_subroutine_type<br>
+       .byte   19                              # Abbrev [19] 0x21f:0x5 DW_TAG_formal_parameter<br>
+       .long   554                             # DW_AT_type<br>
+       .byte   19                              # Abbrev [19] 0x224:0x5 DW_TAG_formal_parameter<br>
+       .long   322                             # DW_AT_type<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   10                              # Abbrev [10] 0x22a:0x5 DW_TAG_pointer_type<br>
+       .long   390                             # DW_AT_type<br>
+       .byte   11                              # Abbrev [11] 0x22f:0x5 DW_TAG_const_type<br>
+       .long   564                             # DW_AT_type<br>
+       .byte   10                              # Abbrev [10] 0x234:0x5 DW_TAG_pointer_type<br>
+       .long   569                             # DW_AT_type<br>
+       .byte   25                              # Abbrev [25] 0x239:0x1 DW_TAG_subroutine_type<br>
+       .byte   11                              # Abbrev [11] 0x23a:0x5 DW_TAG_const_type<br>
+       .long   569                             # DW_AT_type<br>
+       .byte   13                              # Abbrev [13] 0x23f:0x5 DW_TAG_volatile_type<br>
+       .long   580                             # DW_AT_type<br>
+       .byte   26                              # Abbrev [26] 0x244:0x1 DW_TAG_subroutine_type<br>
                                         # DW_AT_rvalue_reference<br>
-       .byte   11                              # Abbrev [11] 0x1f0:0x5 DW_TAG_const_type<br>
-       .long   501                             # DW_AT_type<br>
-       .byte   13                              # Abbrev [13] 0x1f5:0x5 DW_TAG_volatile_type<br>
-       .long   506                             # DW_AT_type<br>
-       .byte   27                              # Abbrev [27] 0x1fa:0x1 DW_TAG_subroutine_type<br>
+       .byte   11                              # Abbrev [11] 0x245:0x5 DW_TAG_const_type<br>
+       .long   586                             # DW_AT_type<br>
+       .byte   13                              # Abbrev [13] 0x24a:0x5 DW_TAG_volatile_type<br>
+       .long   591                             # DW_AT_type<br>
+       .byte   27                              # Abbrev [27] 0x24f:0x1 DW_TAG_subroutine_type<br>
                                         # DW_AT_reference<br>
-       .byte   17                              # Abbrev [17] 0x1fb:0x7 DW_TAG_subroutine_type<br>
-       .byte   19                              # Abbrev [19] 0x1fc:0x5 DW_TAG_formal_parameter<br>
-       .long   514                             # DW_AT_type<br>
-       .byte   0                               # End Of Children Mark<br>
-       .byte   10                              # Abbrev [10] 0x202:0x5 DW_TAG_pointer_type<br>
-       .long   367                             # DW_AT_type<br>
-       .byte   28                              # Abbrev [28] 0x207:0xb DW_TAG_subroutine_type<br>
-       .long   530                             # DW_AT_type<br>
-       .byte   19                              # Abbrev [19] 0x20c:0x5 DW_TAG_formal_parameter<br>
-       .long   237                             # DW_AT_type<br>
-       .byte   0                               # End Of Children Mark<br>
-       .byte   10                              # Abbrev [10] 0x212:0x5 DW_TAG_pointer_type<br>
-       .long   535                             # DW_AT_type<br>
-       .byte   17                              # Abbrev [17] 0x217:0x7 DW_TAG_subroutine_type<br>
-       .byte   19                              # Abbrev [19] 0x218:0x5 DW_TAG_formal_parameter<br>
-       .long   542                             # DW_AT_type<br>
+       .byte   17                              # Abbrev [17] 0x250:0x7 DW_TAG_subroutine_type<br>
+       .byte   19                              # Abbrev [19] 0x251:0x5 DW_TAG_formal_parameter<br>
+       .long   599                             # DW_AT_type<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   10                              # Abbrev [10] 0x257:0x5 DW_TAG_pointer_type<br>
+       .long   452                             # DW_AT_type<br>
+       .byte   28                              # Abbrev [28] 0x25c:0xb DW_TAG_subroutine_type<br>
+       .long   615                             # DW_AT_type<br>
+       .byte   19                              # Abbrev [19] 0x261:0x5 DW_TAG_formal_parameter<br>
+       .long   322                             # DW_AT_type<br>
        .byte   0                               # End Of Children Mark<br>
-       .byte   6                               # Abbrev [6] 0x21e:0x7 DW_TAG_base_type<br>
+       .byte   10                              # Abbrev [10] 0x267:0x5 DW_TAG_pointer_type<br>
+       .long   620                             # DW_AT_type<br>
+       .byte   17                              # Abbrev [17] 0x26c:0x7 DW_TAG_subroutine_type<br>
+       .byte   19                              # Abbrev [19] 0x26d:0x5 DW_TAG_formal_parameter<br>
+       .long   627                             # DW_AT_type<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   6                               # Abbrev [6] 0x273:0x7 DW_TAG_base_type<br>
        .long   .Linfo_string9                  # DW_AT_name<br>
        .byte   4                               # DW_AT_encoding<br>
        .byte   4                               # DW_AT_byte_size<br>
-       .byte   29                              # Abbrev [29] 0x225:0xb DW_TAG_namespace<br>
+       .byte   29                              # Abbrev [29] 0x27a:0xb DW_TAG_namespace<br>
        .long   .Linfo_string10                 # DW_AT_name<br>
-       .byte   16                              # Abbrev [16] 0x22a:0x5 DW_TAG_structure_type<br>
+       .byte   16                              # Abbrev [16] 0x27f:0x5 DW_TAG_structure_type<br>
        .long   .Linfo_string11                 # DW_AT_name<br>
                                         # DW_AT_declaration<br>
        .byte   0                               # End Of Children Mark<br>
-       .byte   24                              # Abbrev [24] 0x230:0x5 DW_TAG_subroutine_type<br>
-       .long   554                             # DW_AT_type<br>
-       .byte   21                              # Abbrev [21] 0x235:0xc DW_TAG_array_type<br>
-       .long   554                             # DW_AT_type<br>
-       .byte   22                              # Abbrev [22] 0x23a:0x6 DW_TAG_subrange_type<br>
-       .long   399                             # DW_AT_type<br>
+       .byte   24                              # Abbrev [24] 0x285:0x5 DW_TAG_subroutine_type<br>
+       .long   639                             # DW_AT_type<br>
+       .byte   21                              # Abbrev [21] 0x28a:0xc DW_TAG_array_type<br>
+       .long   639                             # DW_AT_type<br>
+       .byte   22                              # Abbrev [22] 0x28f:0x6 DW_TAG_subrange_type<br>
+       .long   484                             # DW_AT_type<br>
        .byte   1                               # DW_AT_count<br>
        .byte   0                               # End Of Children Mark<br>
-       .byte   10                              # Abbrev [10] 0x241:0x5 DW_TAG_pointer_type<br>
-       .long   554                             # DW_AT_type<br>
-       .byte   15                              # Abbrev [15] 0x246:0x9 DW_TAG_ptr_to_member_type<br>
-       .long   591                             # DW_AT_type<br>
-       .long   554                             # DW_AT_containing_type<br>
-       .byte   28                              # Abbrev [28] 0x24f:0x10 DW_TAG_subroutine_type<br>
-       .long   554                             # DW_AT_type<br>
-       .byte   18                              # Abbrev [18] 0x254:0x5 DW_TAG_formal_parameter<br>
-       .long   607                             # DW_AT_type<br>
+       .byte   10                              # Abbrev [10] 0x296:0x5 DW_TAG_pointer_type<br>
+       .long   639                             # DW_AT_type<br>
+       .byte   15                              # Abbrev [15] 0x29b:0x9 DW_TAG_ptr_to_member_type<br>
+       .long   639                             # DW_AT_type<br>
+       .long   639                             # DW_AT_containing_type<br>
+       .byte   15                              # Abbrev [15] 0x2a4:0x9 DW_TAG_ptr_to_member_type<br>
+       .long   685                             # DW_AT_type<br>
+       .long   639                             # DW_AT_containing_type<br>
+       .byte   28                              # Abbrev [28] 0x2ad:0x10 DW_TAG_subroutine_type<br>
+       .long   639                             # DW_AT_type<br>
+       .byte   18                              # Abbrev [18] 0x2b2:0x5 DW_TAG_formal_parameter<br>
+       .long   701                             # DW_AT_type<br>
                                         # DW_AT_artificial<br>
-       .byte   19                              # Abbrev [19] 0x259:0x5 DW_TAG_formal_parameter<br>
-       .long   554                             # DW_AT_type<br>
+       .byte   19                              # Abbrev [19] 0x2b7:0x5 DW_TAG_formal_parameter<br>
+       .long   639                             # DW_AT_type<br>
        .byte   0                               # End Of Children Mark<br>
-       .byte   10                              # Abbrev [10] 0x25f:0x5 DW_TAG_pointer_type<br>
-       .long   554                             # DW_AT_type<br>
-       .byte   11                              # Abbrev [11] 0x264:0x5 DW_TAG_const_type<br>
-       .long   554                             # DW_AT_type<br>
-       .byte   30                              # Abbrev [30] 0x269:0x7 DW_TAG_namespace<br>
-       .byte   16                              # Abbrev [16] 0x26a:0x5 DW_TAG_structure_type<br>
+       .byte   10                              # Abbrev [10] 0x2bd:0x5 DW_TAG_pointer_type<br>
+       .long   639                             # DW_AT_type<br>
+       .byte   11                              # Abbrev [11] 0x2c2:0x5 DW_TAG_const_type<br>
+       .long   639                             # DW_AT_type<br>
+       .byte   30                              # Abbrev [30] 0x2c7:0x7 DW_TAG_namespace<br>
+       .byte   16                              # Abbrev [16] 0x2c8:0x5 DW_TAG_structure_type<br>
        .long   .Linfo_string12                 # DW_AT_name<br>
                                         # DW_AT_declaration<br>
        .byte   0                               # End Of Children Mark<br>
+       .byte   31                              # Abbrev [31] 0x2ce:0xf DW_TAG_structure_type<br>
+       .long   .Linfo_string14                 # DW_AT_name<br>
+                                        # DW_AT_declaration<br>
+       .byte   32                              # Abbrev [32] 0x2d3:0x9 DW_TAG_template_type_parameter<br>
+       .long   733                             # DW_AT_type<br>
+       .long   .Linfo_string13                 # DW_AT_name<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   31                              # Abbrev [31] 0x2dd:0xf DW_TAG_structure_type<br>
+       .long   .Linfo_string14                 # DW_AT_name<br>
+                                        # DW_AT_declaration<br>
+       .byte   32                              # Abbrev [32] 0x2e2:0x9 DW_TAG_template_type_parameter<br>
+       .long   322                             # DW_AT_type<br>
+       .long   .Linfo_string13                 # DW_AT_name<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   31                              # Abbrev [31] 0x2ec:0x19 DW_TAG_structure_type<br>
+       .long   .Linfo_string19                 # DW_AT_name<br>
+                                        # DW_AT_declaration<br>
+       .byte   32                              # Abbrev [32] 0x2f1:0x9 DW_TAG_template_type_parameter<br>
+       .long   773                             # DW_AT_type<br>
+       .long   .Linfo_string13                 # DW_AT_name<br>
+       .byte   33                              # Abbrev [33] 0x2fa:0xa DW_TAG_template_value_parameter<br>
+       .long   773                             # DW_AT_type<br>
+       .long   .Linfo_string18                 # DW_AT_name<br>
+       .byte   0                               # DW_AT_const_value<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   34                              # Abbrev [34] 0x305:0x13 DW_TAG_enumeration_type<br>
+       .long   792                             # DW_AT_type<br>
+       .long   .Linfo_string17                 # DW_AT_name<br>
+       .byte   4                               # DW_AT_byte_size<br>
+       .byte   1                               # DW_AT_decl_file<br>
+       .byte   12                              # DW_AT_decl_line<br>
+       .byte   35                              # Abbrev [35] 0x311:0x6 DW_TAG_enumerator<br>
+       .long   .Linfo_string16                 # DW_AT_name<br>
+       .byte   0                               # DW_AT_const_value<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   6                               # Abbrev [6] 0x318:0x7 DW_TAG_base_type<br>
+       .long   .Linfo_string15                 # DW_AT_name<br>
+       .byte   7                               # DW_AT_encoding<br>
+       .byte   4                               # DW_AT_byte_size<br>
+       .byte   31                              # Abbrev [31] 0x31f:0x19 DW_TAG_structure_type<br>
+       .long   .Linfo_string19                 # DW_AT_name<br>
+                                        # DW_AT_declaration<br>
+       .byte   32                              # Abbrev [32] 0x324:0x9 DW_TAG_template_type_parameter<br>
+       .long   773                             # DW_AT_type<br>
+       .long   .Linfo_string13                 # DW_AT_name<br>
+       .byte   33                              # Abbrev [33] 0x32d:0xa DW_TAG_template_value_parameter<br>
+       .long   773                             # DW_AT_type<br>
+       .long   .Linfo_string18                 # DW_AT_name<br>
+       .byte   1                               # DW_AT_const_value<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   31                              # Abbrev [31] 0x338:0x19 DW_TAG_structure_type<br>
+       .long   .Linfo_string19                 # DW_AT_name<br>
+                                        # DW_AT_declaration<br>
+       .byte   32                              # Abbrev [32] 0x33d:0x9 DW_TAG_template_type_parameter<br>
+       .long   849                             # DW_AT_type<br>
+       .long   .Linfo_string13                 # DW_AT_name<br>
+       .byte   36                              # Abbrev [36] 0x346:0xa DW_TAG_template_value_parameter<br>
+       .long   849                             # DW_AT_type<br>
+       .long   .Linfo_string18                 # DW_AT_name<br>
+       .byte   0                               # DW_AT_const_value<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   37                              # Abbrev [37] 0x351:0x13 DW_TAG_enumeration_type<br>
+       .long   322                             # DW_AT_type<br>
+                                        # DW_AT_enum_class<br>
+       .long   .Linfo_string21                 # DW_AT_name<br>
+       .byte   4                               # DW_AT_byte_size<br>
+       .byte   1                               # DW_AT_decl_file<br>
+       .byte   15                              # DW_AT_decl_line<br>
+       .byte   38                              # Abbrev [38] 0x35d:0x6 DW_TAG_enumerator<br>
+       .long   .Linfo_string20                 # DW_AT_name<br>
+       .byte   0                               # DW_AT_const_value<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   31                              # Abbrev [31] 0x364:0x19 DW_TAG_structure_type<br>
+       .long   .Linfo_string19                 # DW_AT_name<br>
+                                        # DW_AT_declaration<br>
+       .byte   32                              # Abbrev [32] 0x369:0x9 DW_TAG_template_type_parameter<br>
+       .long   893                             # DW_AT_type<br>
+       .long   .Linfo_string13                 # DW_AT_name<br>
+       .byte   33                              # Abbrev [33] 0x372:0xa DW_TAG_template_value_parameter<br>
+       .long   893                             # DW_AT_type<br>
+       .long   .Linfo_string18                 # DW_AT_name<br>
+       .byte   120                             # DW_AT_const_value<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   6                               # Abbrev [6] 0x37d:0x7 DW_TAG_base_type<br>
+       .long   .Linfo_string22                 # DW_AT_name<br>
+       .byte   8                               # DW_AT_encoding<br>
+       .byte   1                               # DW_AT_byte_size<br>
+       .byte   31                              # Abbrev [31] 0x384:0x51 DW_TAG_structure_type<br>
+       .long   .Linfo_string25                 # DW_AT_name<br>
+                                        # DW_AT_declaration<br>
+       .byte   4                               # Abbrev [4] 0x389:0x4b DW_TAG_GNU_template_parameter_pack<br>
+       .long   .Linfo_string23                 # DW_AT_name<br>
+       .byte   39                              # Abbrev [39] 0x38e:0x7 DW_TAG_template_value_parameter<br>
+       .long   981                             # DW_AT_type<br>
+       .asciz  "\370"                          # DW_AT_const_value<br>
+       .byte   39                              # Abbrev [39] 0x395:0x7 DW_TAG_template_value_parameter<br>
+       .long   981                             # DW_AT_type<br>
+       .asciz  "\334"                          # DW_AT_const_value<br>
+       .byte   39                              # Abbrev [39] 0x39c:0x6 DW_TAG_template_value_parameter<br>
+       .long   981                             # DW_AT_type<br>
+       .byte   39                              # DW_AT_const_value<br>
+       .byte   39                              # Abbrev [39] 0x3a2:0x6 DW_TAG_template_value_parameter<br>
+       .long   981                             # DW_AT_type<br>
+       .byte   7                               # DW_AT_const_value<br>
+       .byte   39                              # Abbrev [39] 0x3a8:0x6 DW_TAG_template_value_parameter<br>
+       .long   981                             # DW_AT_type<br>
+       .byte   8                               # DW_AT_const_value<br>
+       .byte   39                              # Abbrev [39] 0x3ae:0x6 DW_TAG_template_value_parameter<br>
+       .long   981                             # DW_AT_type<br>
+       .byte   12                              # DW_AT_const_value<br>
+       .byte   39                              # Abbrev [39] 0x3b4:0x6 DW_TAG_template_value_parameter<br>
+       .long   981                             # DW_AT_type<br>
+       .byte   10                              # DW_AT_const_value<br>
+       .byte   39                              # Abbrev [39] 0x3ba:0x6 DW_TAG_template_value_parameter<br>
+       .long   981                             # DW_AT_type<br>
+       .byte   13                              # DW_AT_const_value<br>
+       .byte   39                              # Abbrev [39] 0x3c0:0x6 DW_TAG_template_value_parameter<br>
+       .long   981                             # DW_AT_type<br>
+       .byte   9                               # DW_AT_const_value<br>
+       .byte   39                              # Abbrev [39] 0x3c6:0x6 DW_TAG_template_value_parameter<br>
+       .long   981                             # DW_AT_type<br>
+       .byte   11                              # DW_AT_const_value<br>
+       .byte   39                              # Abbrev [39] 0x3cc:0x7 DW_TAG_template_value_parameter<br>
+       .long   981                             # DW_AT_type<br>
+       .asciz  "\377"                          # DW_AT_const_value<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   6                               # Abbrev [6] 0x3d5:0x7 DW_TAG_base_type<br>
+       .long   .Linfo_string24                 # DW_AT_name<br>
+       .byte   6                               # DW_AT_encoding<br>
+       .byte   1                               # DW_AT_byte_size<br>
+       .byte   31                              # Abbrev [31] 0x3dc:0x19 DW_TAG_structure_type<br>
+       .long   .Linfo_string19                 # DW_AT_name<br>
+                                        # DW_AT_declaration<br>
+       .byte   32                              # Abbrev [32] 0x3e1:0x9 DW_TAG_template_type_parameter<br>
+       .long   1013                            # DW_AT_type<br>
+       .long   .Linfo_string13                 # DW_AT_name<br>
+       .byte   33                              # Abbrev [33] 0x3ea:0xa DW_TAG_template_value_parameter<br>
+       .long   1013                            # DW_AT_type<br>
+       .long   .Linfo_string18                 # DW_AT_name<br>
+       .byte   1                               # DW_AT_const_value<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   6                               # Abbrev [6] 0x3f5:0x7 DW_TAG_base_type<br>
+       .long   .Linfo_string26                 # DW_AT_name<br>
+       .byte   2                               # DW_AT_encoding<br>
+       .byte   1                               # DW_AT_byte_size<br>
+       .byte   31                              # Abbrev [31] 0x3fc:0x19 DW_TAG_structure_type<br>
+       .long   .Linfo_string19                 # DW_AT_name<br>
+                                        # DW_AT_declaration<br>
+       .byte   32                              # Abbrev [32] 0x401:0x9 DW_TAG_template_type_parameter<br>
+       .long   1013                            # DW_AT_type<br>
+       .long   .Linfo_string13                 # DW_AT_name<br>
+       .byte   33                              # Abbrev [33] 0x40a:0xa DW_TAG_template_value_parameter<br>
+       .long   1013                            # DW_AT_type<br>
+       .long   .Linfo_string18                 # DW_AT_name<br>
+       .byte   0                               # DW_AT_const_value<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   31                              # Abbrev [31] 0x415:0x19 DW_TAG_structure_type<br>
+       .long   .Linfo_string19                 # DW_AT_name<br>
+                                        # DW_AT_declaration<br>
+       .byte   32                              # Abbrev [32] 0x41a:0x9 DW_TAG_template_type_parameter<br>
+       .long   1070                            # DW_AT_type<br>
+       .long   .Linfo_string13                 # DW_AT_name<br>
+       .byte   36                              # Abbrev [36] 0x423:0xa DW_TAG_template_value_parameter<br>
+       .long   1070                            # DW_AT_type<br>
+       .long   .Linfo_string18                 # DW_AT_name<br>
+       .byte   0                               # DW_AT_const_value<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   6                               # Abbrev [6] 0x42e:0x7 DW_TAG_base_type<br>
+       .long   .Linfo_string27                 # DW_AT_name<br>
+       .byte   5                               # DW_AT_encoding<br>
+       .byte   2                               # DW_AT_byte_size<br>
+       .byte   31                              # Abbrev [31] 0x435:0x19 DW_TAG_structure_type<br>
+       .long   .Linfo_string19                 # DW_AT_name<br>
+                                        # DW_AT_declaration<br>
+       .byte   32                              # Abbrev [32] 0x43a:0x9 DW_TAG_template_type_parameter<br>
+       .long   1102                            # DW_AT_type<br>
+       .long   .Linfo_string13                 # DW_AT_name<br>
+       .byte   33                              # Abbrev [33] 0x443:0xa DW_TAG_template_value_parameter<br>
+       .long   1102                            # DW_AT_type<br>
+       .long   .Linfo_string18                 # DW_AT_name<br>
+       .byte   0                               # DW_AT_const_value<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   6                               # Abbrev [6] 0x44e:0x7 DW_TAG_base_type<br>
+       .long   .Linfo_string28                 # DW_AT_name<br>
+       .byte   7                               # DW_AT_encoding<br>
+       .byte   2                               # DW_AT_byte_size<br>
+       .byte   31                              # Abbrev [31] 0x455:0x19 DW_TAG_structure_type<br>
+       .long   .Linfo_string19                 # DW_AT_name<br>
+                                        # DW_AT_declaration<br>
+       .byte   32                              # Abbrev [32] 0x45a:0x9 DW_TAG_template_type_parameter<br>
+       .long   322                             # DW_AT_type<br>
+       .long   .Linfo_string13                 # DW_AT_name<br>
+       .byte   36                              # Abbrev [36] 0x463:0xa DW_TAG_template_value_parameter<br>
+       .long   322                             # DW_AT_type<br>
+       .long   .Linfo_string18                 # DW_AT_name<br>
+       .byte   0                               # DW_AT_const_value<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   31                              # Abbrev [31] 0x46e:0x19 DW_TAG_structure_type<br>
+       .long   .Linfo_string19                 # DW_AT_name<br>
+                                        # DW_AT_declaration<br>
+       .byte   32                              # Abbrev [32] 0x473:0x9 DW_TAG_template_type_parameter<br>
+       .long   1159                            # DW_AT_type<br>
+       .long   .Linfo_string13                 # DW_AT_name<br>
+       .byte   36                              # Abbrev [36] 0x47c:0xa DW_TAG_template_value_parameter<br>
+       .long   1159                            # DW_AT_type<br>
+       .long   .Linfo_string18                 # DW_AT_name<br>
+       .byte   0                               # DW_AT_const_value<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   6                               # Abbrev [6] 0x487:0x7 DW_TAG_base_type<br>
+       .long   .Linfo_string29                 # DW_AT_name<br>
+       .byte   5                               # DW_AT_encoding<br>
+       .byte   8                               # DW_AT_byte_size<br>
+       .byte   31                              # Abbrev [31] 0x48e:0x19 DW_TAG_structure_type<br>
+       .long   .Linfo_string19                 # DW_AT_name<br>
+                                        # DW_AT_declaration<br>
+       .byte   32                              # Abbrev [32] 0x493:0x9 DW_TAG_template_type_parameter<br>
+       .long   1191                            # DW_AT_type<br>
+       .long   .Linfo_string13                 # DW_AT_name<br>
+       .byte   36                              # Abbrev [36] 0x49c:0xa DW_TAG_template_value_parameter<br>
+       .long   1191                            # DW_AT_type<br>
+       .long   .Linfo_string18                 # DW_AT_name<br>
+       .byte   0                               # DW_AT_const_value<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   6                               # Abbrev [6] 0x4a7:0x7 DW_TAG_base_type<br>
+       .long   .Linfo_string30                 # DW_AT_name<br>
+       .byte   5                               # DW_AT_encoding<br>
+       .byte   8                               # DW_AT_byte_size<br>
+       .byte   31                              # Abbrev [31] 0x4ae:0x19 DW_TAG_structure_type<br>
+       .long   .Linfo_string19                 # DW_AT_name<br>
+                                        # DW_AT_declaration<br>
+       .byte   32                              # Abbrev [32] 0x4b3:0x9 DW_TAG_template_type_parameter<br>
+       .long   792                             # DW_AT_type<br>
+       .long   .Linfo_string13                 # DW_AT_name<br>
+       .byte   33                              # Abbrev [33] 0x4bc:0xa DW_TAG_template_value_parameter<br>
+       .long   792                             # DW_AT_type<br>
+       .long   .Linfo_string18                 # DW_AT_name<br>
+       .byte   0                               # DW_AT_const_value<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   31                              # Abbrev [31] 0x4c7:0x19 DW_TAG_structure_type<br>
+       .long   .Linfo_string19                 # DW_AT_name<br>
+                                        # DW_AT_declaration<br>
+       .byte   32                              # Abbrev [32] 0x4cc:0x9 DW_TAG_template_type_parameter<br>
+       .long   1248                            # DW_AT_type<br>
+       .long   .Linfo_string13                 # DW_AT_name<br>
+       .byte   33                              # Abbrev [33] 0x4d5:0xa DW_TAG_template_value_parameter<br>
+       .long   1248                            # DW_AT_type<br>
+       .long   .Linfo_string18                 # DW_AT_name<br>
+       .byte   0                               # DW_AT_const_value<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   6                               # Abbrev [6] 0x4e0:0x7 DW_TAG_base_type<br>
+       .long   .Linfo_string31                 # DW_AT_name<br>
+       .byte   7                               # DW_AT_encoding<br>
+       .byte   8                               # DW_AT_byte_size<br>
+       .byte   31                              # Abbrev [31] 0x4e7:0x19 DW_TAG_structure_type<br>
+       .long   .Linfo_string19                 # DW_AT_name<br>
+                                        # DW_AT_declaration<br>
+       .byte   32                              # Abbrev [32] 0x4ec:0x9 DW_TAG_template_type_parameter<br>
+       .long   1280                            # DW_AT_type<br>
+       .long   .Linfo_string13                 # DW_AT_name<br>
+       .byte   33                              # Abbrev [33] 0x4f5:0xa DW_TAG_template_value_parameter<br>
+       .long   1280                            # DW_AT_type<br>
+       .long   .Linfo_string18                 # DW_AT_name<br>
+       .byte   0                               # DW_AT_const_value<br>
+       .byte   0                               # End Of Children Mark<br>
+       .byte   6                               # Abbrev [6] 0x500:0x7 DW_TAG_base_type<br>
+       .long   .Linfo_string32                 # DW_AT_name<br>
+       .byte   7                               # DW_AT_encoding<br>
+       .byte   8                               # DW_AT_byte_size<br>
        .byte   0                               # End Of Children Mark<br>
 .Ldebug_info_end0:<br>
        .section        .debug_str,"MS",@progbits,1<br>
 .Linfo_string0:<br>
-       .asciz  "clang version 14.0.0 (git@github.com:llvm/llvm-project.git 559ab58ca57486621857a630d16dcddb6cceedfb)" # string offset=0<br>
+       .asciz  "clang version 14.0.0 (git@github.com:llvm/llvm-project.git e209925a875e1dfa15d5e4ddc3d00f2da4b42de1)" # string offset=0<br>
 .Linfo_string1:<br>
        .asciz  "test.cpp"                      # string offset=101<br>
 .Linfo_string2:<br>
@@ -663,8 +1125,48 @@<br>
 .Linfo_string12:<br>
        .asciz  "anon_ns_mem"                   # string offset=220<br>
 .Linfo_string13:<br>
-       .asciz  "t1"                            # string offset=232<br>
-       .ident  "clang version 14.0.0 (git@github.com:llvm/llvm-project.git 559ab58ca57486621857a630d16dcddb6cceedfb)"<br>
+       .asciz  "T"                             # string offset=232<br>
+.Linfo_string14:<br>
+       .asciz  "t2"                            # string offset=234<br>
+.Linfo_string15:<br>
+       .asciz  "unsigned int"                  # string offset=237<br>
+.Linfo_string16:<br>
+       .asciz  "E1"                            # string offset=250<br>
+.Linfo_string17:<br>
+       .asciz  "e1"                            # string offset=253<br>
+.Linfo_string18:<br>
+       .asciz  "V"                             # string offset=256<br>
+.Linfo_string19:<br>
+       .asciz  "tv"                            # string offset=258<br>
+.Linfo_string20:<br>
+       .asciz  "E2"                            # string offset=261<br>
+.Linfo_string21:<br>
+       .asciz  "e2"                            # string offset=264<br>
+.Linfo_string22:<br>
+       .asciz  "unsigned char"                 # string offset=267<br>
+.Linfo_string23:<br>
+       .asciz  "C"                             # string offset=281<br>
+.Linfo_string24:<br>
+       .asciz  "char"                          # string offset=283<br>
+.Linfo_string25:<br>
+       .asciz  "tc"                            # string offset=288<br>
+.Linfo_string26:<br>
+       .asciz  "bool"                          # string offset=291<br>
+.Linfo_string27:<br>
+       .asciz  "short"                         # string offset=296<br>
+.Linfo_string28:<br>
+       .asciz  "unsigned short"                # string offset=302<br>
+.Linfo_string29:<br>
+       .asciz  "long"                          # string offset=317<br>
+.Linfo_string30:<br>
+       .asciz  "long long"                     # string offset=322<br>
+.Linfo_string31:<br>
+       .asciz  "unsigned long"                 # string offset=332<br>
+.Linfo_string32:<br>
+       .asciz  "unsigned long long"            # string offset=346<br>
+.Linfo_string33:<br>
+       .asciz  "t1"                            # string offset=365<br>
+       .ident  "clang version 14.0.0 (git@github.com:llvm/llvm-project.git e209925a875e1dfa15d5e4ddc3d00f2da4b42de1)"<br>
        .section        ".note.GNU-stack","",@progbits<br>
        .addrsig<br>
        .addrsig_sym v1<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>