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