Skip to content

Conversation

Nerixyz
Copy link
Contributor

@Nerixyz Nerixyz commented Jul 21, 2025

Previously, type lookup for types in namespaces didn't work with the native PDB plugin, because FindTypes would only look for types whose base name was equal to their full name. PDB/CodeView does not store the base names in the TPI stream, but the types have their full name (e.g. std::thread instead of thread). So findRecordsByName would only return types in the top level namespace.

This PR changes the lookup to go through all types and check their base name. As that could be a bit expensive, the names are first cached (similar to the function lookup in the DIA PDB plugin). Potential types are checked with TypeQuery::ContextMatches.

To be able to handle anonymous namespaces, I changed TypeQuery::ContextMatches. The TypeQuery constructor inserts all name components as CompilerContextKind::AnyDeclContext. To skip over anonymous namespaces, ContextMatches checked if a component was empty and exactly of kind Namespace. For our query, the last check was always false, so we never skipped anonymous namespaces. DWARF doesn't have this problem, as it constructs the context outside and has proper information about namespaces. I'm not fully sure if my change is correct and that it doesn't break other users of TypeQuery.

This enables type lookup <type> to work on types in namespaces. However, expressions don't work with this yet, because FindNamespace is unimplemented for native PDB.

@Nerixyz Nerixyz requested a review from JDevlieghere as a code owner July 21, 2025 19:13
@llvmbot llvmbot added the lldb label Jul 21, 2025
@llvmbot
Copy link
Member

llvmbot commented Jul 21, 2025

@llvm/pr-subscribers-lldb

Author: nerix (Nerixyz)

Changes

Previously, type lookup for types in namespaces didn't work with the native PDB plugin, because FindTypes would only look for types whose base name was equal to their full name. PDB/CodeView does not store the base names in the TPI stream, but the types have their full name (e.g. std::thread instead of thread). So findRecordsByName would only return types in the top level namespace.

This PR changes the lookup to go through all types and check their base name. As that could be a bit expensive, the names are first cached (similar to the function lookup in the DIA PDB plugin). Potential types are checked with TypeQuery::ContextMatches.

To be able to handle anonymous namespaces, I changed TypeQuery::ContextMatches. The TypeQuery constructor inserts all name components as CompilerContextKind::AnyDeclContext. To skip over anonymous namespaces, ContextMatches checked if a component was empty and exactly of kind Namespace. For our query, the last check was always false, so we never skipped anonymous namespaces. DWARF doesn't have this problem, as it constructs the context outside and has proper information about namespaces. I'm not fully sure if my change is correct and that it doesn't break other users of TypeQuery.

This enables type lookup &lt;type&gt; to work on types in namespaces. However, expressions don't work with this yet, because FindNamespace is unimplemented for native PDB.


Full diff: https://github.com/llvm/llvm-project/pull/149876.diff

5 Files Affected:

  • (modified) lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp (+54-4)
  • (modified) lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h (+4)
  • (modified) lldb/source/Symbol/Type.cpp (+6-2)
  • (added) lldb/test/Shell/SymbolFile/NativePDB/Inputs/namespace-access.lldbinit (+18)
  • (added) lldb/test/Shell/SymbolFile/NativePDB/namespace-access.cpp (+115)
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
index 20d8c1acf9c42..5141632649dd5 100644
--- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
@@ -1630,6 +1630,53 @@ size_t SymbolFileNativePDB::ParseSymbolArrayInScope(
   return count;
 }
 
+void SymbolFileNativePDB::CacheTypeNames() {
+  if (!m_type_base_names.IsEmpty())
+    return;
+
+  LazyRandomTypeCollection &types = m_index->tpi().typeCollection();
+  for (auto ti = types.getFirst(); ti; ti = types.getNext(*ti)) {
+    CVType cvt = types.getType(*ti);
+    llvm::StringRef name;
+    // We are only interested in records, unions, and enums.
+    // We aren't interested in forward references as we'll visit the actual
+    // type later anyway.
+    switch (cvt.kind()) {
+    case LF_STRUCTURE:
+    case LF_CLASS: {
+      ClassRecord cr;
+      llvm::cantFail(TypeDeserializer::deserializeAs<ClassRecord>(cvt, cr));
+      if (cr.isForwardRef())
+        continue;
+      name = cr.Name;
+    } break;
+    case LF_UNION: {
+      UnionRecord ur;
+      llvm::cantFail(TypeDeserializer::deserializeAs<UnionRecord>(cvt, ur));
+      if (ur.isForwardRef())
+        continue;
+      name = ur.Name;
+    } break;
+    case LF_ENUM: {
+      EnumRecord er;
+      llvm::cantFail(TypeDeserializer::deserializeAs<EnumRecord>(cvt, er));
+      if (er.isForwardRef())
+        continue;
+      name = er.Name;
+    } break;
+    default:
+      continue;
+    }
+    if (name.empty())
+      continue;
+
+    auto base_name = MSVCUndecoratedNameParser::DropScope(name);
+    m_type_base_names.Append(ConstString(base_name), ti->getIndex());
+  }
+
+  m_type_base_names.Sort();
+}
+
 void SymbolFileNativePDB::DumpClangAST(Stream &s, llvm::StringRef filter) {
   auto ts_or_err = GetTypeSystemForLanguage(eLanguageTypeC_plus_plus);
   if (!ts_or_err)
@@ -1720,11 +1767,14 @@ void SymbolFileNativePDB::FindTypes(const lldb_private::TypeQuery &query,
 
   std::lock_guard<std::recursive_mutex> guard(GetModuleMutex());
 
-  std::vector<TypeIndex> matches =
-      m_index->tpi().findRecordsByName(query.GetTypeBasename().GetStringRef());
+  // We can't query for the basename or full name because the type might reside
+  // in an anonymous namespace. Cache the basenames first.
+  CacheTypeNames();
+  std::vector<uint32_t> matches;
+  m_type_base_names.GetValues(query.GetTypeBasename(), matches);
 
-  for (TypeIndex type_idx : matches) {
-    TypeSP type_sp = GetOrCreateType(type_idx);
+  for (uint32_t match_idx : matches) {
+    TypeSP type_sp = GetOrCreateType(TypeIndex(match_idx));
     if (!type_sp)
       continue;
 
diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h
index 9891313f11d0b..457b301c4a486 100644
--- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h
@@ -258,6 +258,8 @@ class SymbolFileNativePDB : public SymbolFileCommon {
 
   void ParseInlineSite(PdbCompilandSymId inline_site_id, Address func_addr);
 
+  void CacheTypeNames();
+
   llvm::BumpPtrAllocator m_allocator;
 
   lldb::addr_t m_obj_load_address = 0;
@@ -278,6 +280,8 @@ class SymbolFileNativePDB : public SymbolFileCommon {
   llvm::DenseMap<lldb::user_id_t, std::shared_ptr<InlineSite>> m_inline_sites;
   llvm::DenseMap<llvm::codeview::TypeIndex, llvm::codeview::TypeIndex>
       m_parent_types;
+
+  lldb_private::UniqueCStringMap<uint32_t> m_type_base_names;
 };
 
 } // namespace npdb
diff --git a/lldb/source/Symbol/Type.cpp b/lldb/source/Symbol/Type.cpp
index 0a886e56100a1..ddb22d611140b 100644
--- a/lldb/source/Symbol/Type.cpp
+++ b/lldb/source/Symbol/Type.cpp
@@ -134,7 +134,9 @@ bool TypeQuery::ContextMatches(
     if (ctx == ctx_end)
       return false; // Pattern too long.
 
-    if (ctx->kind == CompilerContextKind::Namespace && ctx->name.IsEmpty()) {
+    if ((ctx->kind & CompilerContextKind::Namespace) ==
+            CompilerContextKind::Namespace &&
+        ctx->name.IsEmpty()) {
       // We're matching an anonymous namespace. These are optional, so we check
       // if the pattern expects an anonymous namespace.
       if (pat->name.IsEmpty() && (pat->kind & CompilerContextKind::Namespace) ==
@@ -164,7 +166,9 @@ bool TypeQuery::ContextMatches(
   auto should_skip = [this](const CompilerContext &ctx) {
     if (ctx.kind == CompilerContextKind::Module)
       return GetIgnoreModules();
-    if (ctx.kind == CompilerContextKind::Namespace && ctx.name.IsEmpty())
+    if ((ctx.kind & CompilerContextKind::Namespace) ==
+            CompilerContextKind::Namespace &&
+        ctx.name.IsEmpty())
       return !GetStrictNamespaces();
     return false;
   };
diff --git a/lldb/test/Shell/SymbolFile/NativePDB/Inputs/namespace-access.lldbinit b/lldb/test/Shell/SymbolFile/NativePDB/Inputs/namespace-access.lldbinit
new file mode 100644
index 0000000000000..e61ed2e2f453e
--- /dev/null
+++ b/lldb/test/Shell/SymbolFile/NativePDB/Inputs/namespace-access.lldbinit
@@ -0,0 +1,18 @@
+b main
+r
+
+type lookup S
+type lookup ::S
+type lookup Outer::S
+type lookup Outer::Inner1::S
+type lookup Inner1::S
+type lookup Outer::Inner1::Inner2::S
+type lookup Inner2::S
+type lookup Outer::Inner2::S
+type lookup Outer::A
+type lookup A
+type lookup ::A
+expr sizeof(S)
+expr sizeof(A)
+
+quit
diff --git a/lldb/test/Shell/SymbolFile/NativePDB/namespace-access.cpp b/lldb/test/Shell/SymbolFile/NativePDB/namespace-access.cpp
new file mode 100644
index 0000000000000..8dbe062d8240f
--- /dev/null
+++ b/lldb/test/Shell/SymbolFile/NativePDB/namespace-access.cpp
@@ -0,0 +1,115 @@
+// clang-format off
+// REQUIRES: lld, x86
+
+// Test namespace lookup.
+// RUN: %clang_cl --target=x86_64-windows-msvc -Od -Z7 -GS- -c /Fo%t.obj -- %s
+// RUN: lld-link -debug:full -nodefaultlib -entry:main %t.obj -out:%t.exe -pdb:%t.pdb
+// RUN: %lldb -f %t.exe -s \
+// RUN:     %p/Inputs/namespace-access.lldbinit 2>&1 | FileCheck %s
+
+struct S {
+  char a[1];
+};
+
+namespace Outer {
+
+  struct S {
+    char a[2];
+  };
+
+  namespace Inner1 {
+    struct S {
+      char a[3];
+    };
+
+    namespace Inner2 {
+      struct S {
+        char a[4];
+      };
+    } // namespace Inner2
+  } // namespace Inner1
+
+  namespace Inner2 {
+    struct S {
+      char a[5];
+    };
+  } // namespace Inner2
+
+  namespace {
+    struct A {
+      char a[6];
+    };
+  } // namespace
+
+} // namespace Outer
+
+namespace {
+  struct A {
+    char a[7];
+  };
+} // namespace
+
+int main(int argc, char **argv) {
+  S s;
+  Outer::S os;
+  Outer::Inner1::S oi1s;
+  Outer::Inner1::Inner2::S oi1i2s;
+  Outer::Inner2::S oi2s;
+  A a1;
+  Outer::A a2;
+  return sizeof(s) + sizeof(os) + sizeof(oi1s) + sizeof(oi1i2s) + sizeof(oi2s) + sizeof(a1) + sizeof(a2);
+}
+
+
+
+// CHECK:      (lldb) type lookup S  
+// CHECK:      struct S {
+// CHECK:      struct S {
+// CHECK:      struct S {
+// CHECK:      struct S {
+// CHECK:      struct S {
+// CHECK:      }
+// CHECK-NEXT: (lldb) type lookup ::S
+// CHECK-NEXT: struct S {
+// CHECK-NEXT:     char a[1];
+// CHECK-NEXT: }
+// CHECK-NEXT: (lldb) type lookup Outer::S
+// CHECK-NEXT: struct S {
+// CHECK-NEXT:     char a[2];
+// CHECK-NEXT: }
+// CHECK-NEXT: (lldb) type lookup Outer::Inner1::S
+// CHECK-NEXT: struct S {
+// CHECK-NEXT:     char a[3];
+// CHECK-NEXT: }
+// CHECK-NEXT: (lldb) type lookup Inner1::S
+// CHECK-NEXT: struct S {
+// CHECK-NEXT:     char a[3];
+// CHECK-NEXT: }
+// CHECK-NEXT: (lldb) type lookup Outer::Inner1::Inner2::S
+// CHECK-NEXT: struct S {
+// CHECK-NEXT:     char a[4];
+// CHECK-NEXT: }
+// CHECK-NEXT: (lldb) type lookup Inner2::S         
+// CHECK-NEXT: struct S {
+// CHECK:      struct S {
+// CHECK:      }
+// CHECK-NEXT: (lldb) type lookup Outer::Inner2::S        
+// CHECK-NEXT: struct S {
+// CHECK-NEXT:     char a[5];
+// CHECK-NEXT: }
+// CHECK-NEXT: (lldb) type lookup Outer::A        
+// CHECK-NEXT: struct A {
+// CHECK-NEXT:     char a[6];
+// CHECK-NEXT: }
+// CHECK-NEXT: (lldb) type lookup A       
+// CHECK-NEXT: struct A {
+// CHECK:      struct A {
+// CHECK:      }
+// CHECK-NEXT: (lldb) type lookup ::A
+// CHECK-NEXT: struct A {
+// CHECK-NEXT:     char a[7];
+// CHECK-NEXT: }
+// CHECK-NEXT: (lldb) expr sizeof(S) 
+// CHECK-NEXT: (__size_t) $0 = 1
+// CHECK-NEXT: (lldb) expr sizeof(A)
+// CHECK-NEXT: (__size_t) $1 = 7

@Nerixyz Nerixyz force-pushed the fix/lldb-npdb-type-anon-ns branch from 95e8fab to fa3c96b Compare July 21, 2025 19:28
return count;
}

void SymbolFileNativePDB::CacheTypeNames() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, SymbolFileNativePDB::BuildParentMap() already does the tpi stream iteration and it's called at NativePDB plugin initial setup. We could just cache the those base names there instead of iterating it the second time.

expr sizeof(S)
expr sizeof(A)

quit
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lets put these commands into the test file itself. You can use split-file for this. For example:

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do we need this sort?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

m_type_base_names is a UniqueCStringMap which holds a vector<(CString, T)>. To act as a map (i.e. to be able to use binary search), it needs to be sorted. Append(element) only translates to push_back. Once we inserted all elements, the map is unsorted, so we have to sort it to be able to look up elements.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we move this up to just after we appended to the map? And comment why we do this?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Or is this all a giant for-loop? Github makes it hard to make out the scopes involved here

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The Append() is in a big for-loop, but there's a second one after. I moved the sorting after the first one (where we append to the map).

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@labath since you looked at this some time ago, do you see a concern with this? I guess the alternative is to make sure we don't construct the TypeQuery with a AnyDeclContext in PDB-land. @Nerixyz why can't we do that? Is there some PDB limitation?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why can't we do that? Is there some PDB limitation?

We could do that. It would probably replicate the TypeQuery constructor, though (which arguably isn't that large).

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, so the current assumption is that when matching types, the pattern can contain wildcards (you can say "i'm looking for a type or a namespace at a given position"), but the thing you're matching is always precise (it will say "i'm a type" or "I'm a namespace", but it can't say "I don't know"). For DWARF this isn't an issue because we always have that information. I don't know if that's the case for PDB, or if it's just a side-effect of how it performs the query (*). If it's not possible to do it the other way, then we may have to change the way we do matching, but I think it'd be better to not do that.

(*) Currently, the PDB code kind of cheats by taking the type name and parsing it as a type query (SymbolFileNativePDB.cpp:1736 in this patch), but then using the result of that parsing as the thing to match. This is bad for two reasons:

  • if you're parsing from a name, it's clear that you won't be able to see whether enclosing scopes are a type or a namespace. The information just isn't there --Foo::Bar looks the same regardless of whether Foo is a namespace or not.
  • It's going to be slow because this approach requires you to fully materialize the type (and everything it depends on) before knowing if this is even the type you're looking for. This may not be as big of an issue for PDB as it is for DWARF because (so I hear) in doesn't have template information (which is the big source of fanout in this process) and it may have less of these searches internally (because it's already linked, in DWARF we need to do this just to search for a definition DIE), but it still means that a search for foo::iterator will materialize every iterator out there.

For this reason it would be better type context was created differently, without relying on a Type object. For DWARF this happens in DWARFDIE::GetTypeLookupContext, but I don't know if something like that works in PDB. The patch description seems to indicate that this information does not exist, but I don't understand how anything could work in that case. E.g. I don't know what kind of Clang AST would we created for these types. Are they properly nested in their expected namespace? If so how do you figure out that namespace?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a good point. I'll create the context in the PDB plugin. To avoid materializing all types that match the basename, I can see two approaches:

  1. Naively use the type's name (PDB stores the demangled name there). This would essentially do the same as the TypeQuery constructor where it tries to separate the scopes. Every scope/context but the last one would be a namespace. For the last one, we can find the exact type.
  2. PDB also contains a UniqueName field which can contain a mangled type name. Similar to CreateDeclInfoForType, the name could be demangled and each scope could be checked.

In both cases, it's possible to try and get the parent to handle nested structs/enums/unions like in CreateDeclInfoForType.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know which approach is better, but I like the direction of this. I'll just say that if you find yourself needing to parse a type name, don't reimplement that code. I'd rather take the parsing code out of the TypeQuery constructor, and factor it into function that can be called independently.

How expensive is this "get the parent to handle nested structs/enums/unions" operation? I'm asking because I'm wondering if we can just do it all the time, or if we should try to avoid it. If it's cheap, we can just construct the precise context (one where every scope knows whether it's a type or a namespace) every time. The advantage of that is that we can reuse the existing infrastructure and the overall flow will be very similar to how things work in DWARF. However, if it's expensive, then we may want to do something like you've done here, where we first do a "fuzzy" match (just checking whether the names match, not looking at the kinds), and then we confirm the match (if needed) by looking at the kinds.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How expensive is this "get the parent to handle nested structs/enums/unions" operation?

This is only a lookup in a map that we created. But this only works for tag types, not for namespaces. My approach now uses Type::GetTypeScopeAndBasename to split the undecorated name. At first, it assumes everything is a namespace and then walks backwards to find parent types.

I'm not sure what the best way to test this is.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you can identify tag types, then I think it's safe to assume that the rest are namespaces (particularly if that's the same approach we use when constructing the clang AST for these types).

Your test looks reasonable to me. I'd consider using lldb-test (like lldb/test/Shell/SymbolFile/DWARF/x86/find-basic-type.cpp does) instead, mainly because it lets you distinguish multiple instances of S better, but I wouldn't say that's required.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd consider using lldb-test (like lldb/test/Shell/SymbolFile/DWARF/x86/find-basic-type.cpp does) instead, mainly because it lets you distinguish multiple instances of S better

Looks like this doesn't work with the native PDB plugin yet because it's missing the decl:

> lldb-test symbols --name=::S --find=type main.exe
Module: main.exe
Found 1 types:
000001F4D1CB2DC0: Type{0x00024884} , name = "S", size = 1, compiler_type = 0x000001f4d4283d00 struct S {
    char a[1];
}

@Nerixyz Nerixyz force-pushed the fix/lldb-npdb-type-anon-ns branch from 1d99fe1 to 38e1ac7 Compare July 28, 2025 10:15
@Nerixyz Nerixyz force-pushed the fix/lldb-npdb-type-anon-ns branch from 38e1ac7 to 8344a98 Compare July 28, 2025 10:20
Copy link
Collaborator

@labath labath left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks good to me, unless someone has additional comments (?)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you can identify tag types, then I think it's safe to assume that the rest are namespaces (particularly if that's the same approach we use when constructing the clang AST for these types).

Your test looks reasonable to me. I'd consider using lldb-test (like lldb/test/Shell/SymbolFile/DWARF/x86/find-basic-type.cpp does) instead, mainly because it lets you distinguish multiple instances of S better, but I wouldn't say that's required.

return CompilerContextKind::ClassOrStruct;
if (m_kind == Enum)
return CompilerContextKind::Enum;
return CompilerContextKind::Union;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we check (or assert) that the m_kind is in fact a union?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Although the other accessors don't do this, I added an assertion there. Also looks like there's name() accessor accesses the wrong union element if the kind is class. In practice, that isn't an issue because all types inherit from the same base class TagRecord.

JDevlieghere pushed a commit that referenced this pull request Jul 30, 2025
…151190)

From
#149876 (comment):
The `name()` accessor checked for `m_kind == Union` and accessed
`cvclass` instead of `cvunion`. This is technically wrong (maybe UB
even?).
In practice, this wasn't an issue, because all types in the union
(`ClassRecord`/`EnumRecord`/`UnionRecord`) inherit from `TagRecord`.
llvm-sync bot pushed a commit to arm/arm-toolchain that referenced this pull request Jul 30, 2025
…ord::name` (#151190)

From
llvm/llvm-project#149876 (comment):
The `name()` accessor checked for `m_kind == Union` and accessed
`cvclass` instead of `cvunion`. This is technically wrong (maybe UB
even?).
In practice, this wasn't an issue, because all types in the union
(`ClassRecord`/`EnumRecord`/`UnionRecord`) inherit from `TagRecord`.
Copy link
Member

@Michael137 Michael137 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

my comments have been addressed

LGTM, if Pavel has no other concerns

if (scope_name == "(anonymous namespace)")
if (scope_name == "(anonymous namespace)" ||
scope_name == "`anonymous namespace'" ||
scope_name == "`anonymous-namespace'")
Copy link
Member

@Michael137 Michael137 Aug 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if this is how the MS demangler presents anonymous namespaces there's probably some other places where we hardcode this that might need patching up. But that's outside the scope of this PR

@Michael137 Michael137 merged commit d95dadf into llvm:main Aug 4, 2025
9 checks passed
@Nerixyz Nerixyz deleted the fix/lldb-npdb-type-anon-ns branch August 4, 2025 10:23
@gulfemsavrun
Copy link
Contributor

We started seeing a test failure (lldb-api :: tools/lldb-dap/launch/TestDAP_launch.py) after this patch:

1754321883.282107115 (stdio) <-- {"body":{"category":"console","output":"(lldb) image dump sections a.out\n"},"event":"output","seq":0,"type":"event"}
1754321883.282118082 (stdio) <-- {"body":{"category":"console","output":"Sections for '/b/s/w/ir/x/w/llvm_build/lldb-test-build.noindex/tools/lldb-dap/launch/TestDAP_launch.test_failing_launch_commands/a.out' (aarch64):\n"},"event":"output","seq":0,"type":"event"}
1754321883.282129049 (stdio) <-- {"body":{"category":"console","output":"  SectID             Type                   File Address                             Perm File Off.  File Size  Flags      Section Name\n"},"event":"output","seq":0,"type":"event"}
1754321883.282140017 (stdio) <-- {"body":{"category":"console","output":"  ------------------ ---------------------- ---------------------------------------  ---- ---------- ---------- ---------- ----------------------------\n"},"event":"output","seq":0,"type":"event"}
1754321883.282150984 (stdio) <-- {"body":{"category":"console","output":"  0xfffffffffffffffd container              [0x0000000000000000-0x00000000000007b8)  r--  0x00000000 0x000007b8 0x00000000 a.out.PT_LOAD[0]\n"},"event":"output","seq":0,"type":"event"}
1754321883.282160997 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000001 regular                [0x00000000000002a8-0x00000000000002c3)  r--  0x000002a8 0x0000001b 0x00000002 a.out.PT_LOAD[0]..interp\n"},"event":"output","seq":0,"type":"event"}
1754321883.282171011 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000002 regular                [0x00000000000002c4-0x00000000000002e4)  r--  0x000002c4 0x00000020 0x00000002 a.out.PT_LOAD[0]..note.ABI-tag\n"},"event":"output","seq":0,"type":"event"}
1754321883.282181025 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000003 regular                [0x00000000000002e4-0x0000000000000308)  r--  0x000002e4 0x00000024 0x00000002 a.out.PT_LOAD[0]..note.gnu.build-id\n"},"event":"output","seq":0,"type":"event"}
1754321883.282191038 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000004 elf-dynamic-symbols    [0x0000000000000308-0x00000000000003f8)  r--  0x00000308 0x000000f0 0x00000002 a.out.PT_LOAD[0]..dynsym\n"},"event":"output","seq":0,"type":"event"}
1754321883.282201052 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000005 regular                [0x00000000000003f8-0x000000000000040c)  r--  0x000003f8 0x00000014 0x00000002 a.out.PT_LOAD[0]..gnu.version\n"},"event":"output","seq":0,"type":"event"}
1754321883.282212019 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000006 regular                [0x000000000000040c-0x000000000000043c)  r--  0x0000040c 0x00000030 0x00000002 a.out.PT_LOAD[0]..gnu.version_r\n"},"event":"output","seq":0,"type":"event"}
1754321883.282222033 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000007 regular                [0x0000000000000440-0x000000000000045c)  r--  0x00000440 0x0000001c 0x00000002 a.out.PT_LOAD[0]..gnu.hash\n"},"event":"output","seq":0,"type":"event"}
1754321883.282232046 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000008 regular                [0x000000000000045c-0x00000000000004fe)  r--  0x0000045c 0x000000a2 0x00000002 a.out.PT_LOAD[0]..dynstr\n"},"event":"output","seq":0,"type":"event"}
1754321883.282242060 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000009 elf-relocation-entries [0x0000000000000500-0x00000000000005c0)  r--  0x00000500 0x000000c0 0x00000002 a.out.PT_LOAD[0]..rela.dyn\n"},"event":"output","seq":0,"type":"event"}
1754321883.282252073 (stdio) <-- {"body":{"category":"console","output":"  0x000000000000000a elf-relocation-entries [0x00000000000005c0-0x0000000000000698)  r--  0x000005c0 0x000000d8 0x00000042 a.out.PT_LOAD[0]..rela.plt\n"},"event":"output","seq":0,"type":"event"}
1754321883.282273054 (stdio) <-- {"body":{"category":"console","output":"  0x000000000000000b regular                [0x0000000000000698-0x00000000000006c8)  r--  0x00000698 0x00000030 0x00000032 a.out.PT_LOAD[0]..rodata\n"},"event":"output","seq":0,"type":"event"}
1754321883.282284975 (stdio) <-- {"body":{"category":"console","output":"  0x000000000000000c regular                [0x00000000000006c8-0x00000000000006f4)  r--  0x000006c8 0x0000002c 0x00000002 a.out.PT_LOAD[0]..eh_frame_hdr\n"},"event":"output","seq":0,"type":"event"}
1754321883.282294989 (stdio) <-- {"body":{"category":"console","output":"  0x000000000000000d eh-frame               [0x00000000000006f8-0x00000000000007b8)  r--  0x000006f8 0x000000c0 0x00000002 a.out.PT_LOAD[0]..eh_frame\n"},"event":"output","seq":0,"type":"event"}
1754321883.282305956 (stdio) <-- {"body":{"category":"console","output":"  0xfffffffffffffffc container              [0x00000000000107c0-0x0000000000010aa0)  r-x  0x000007c0 0x000002e0 0x00000000 a.out.PT_LOAD[1]\n"},"event":"output","seq":0,"type":"event"}
1754321883.282315969 (stdio) <-- {"body":{"category":"console","output":"  0x000000000000000e code                   [0x00000000000107c0-0x00000000000109c0)  r-x  0x000007c0 0x00000200 0x00000006 a.out.PT_LOAD[1]..text\n"},"event":"output","seq":0,"type":"event"}
1754321883.282325983 (stdio) <-- {"body":{"category":"console","output":"  0x000000000000000f code                   [0x00000000000109c0-0x00000000000109d8)  r-x  0x000009c0 0x00000018 0x00000006 a.out.PT_LOAD[1]..init\n"},"event":"output","seq":0,"type":"event"}
1754321883.282336950 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000010 code                   [0x00000000000109d8-0x00000000000109ec)  r-x  0x000009d8 0x00000014 0x00000006 a.out.PT_LOAD[1]..fini\n"},"event":"output","seq":0,"type":"event"}
1754321883.282346964 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000011 code                   [0x00000000000109f0-0x0000000000010aa0)  r-x  0x000009f0 0x000000b0 0x20000006 a.out.PT_LOAD[1]..plt\n"},"event":"output","seq":0,"type":"event"}
1754321883.282356977 (stdio) <-- {"body":{"category":"console","output":"  0xfffffffffffffffb container              [0x0000000000020aa0-0x0000000000021000)  rw-  0x00000aa0 0x000001e8 0x00000000 a.out.PT_LOAD[2]\n"},"event":"output","seq":0,"type":"event"}
1754321883.282366991 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000012 regular                [0x0000000000020aa0-0x0000000000020aa8)  rw-  0x00000aa0 0x00000008 0x00000003 a.out.PT_LOAD[2]..init_array\n"},"event":"output","seq":0,"type":"event"}
1754321883.282377958 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000013 regular                [0x0000000000020aa8-0x0000000000020ab0)  rw-  0x00000aa8 0x00000008 0x00000003 a.out.PT_LOAD[2]..fini_array\n"},"event":"output","seq":0,"type":"event"}
1754321883.282392979 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000014 elf-dynamic-link-info  [0x0000000000020ab0-0x0000000000020c60)  rw-  0x00000ab0 0x000001b0 0x00000003 a.out.PT_LOAD[2]..dynamic\n"},"event":"output","seq":0,"type":"event"}
1754321883.282403946 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000015 regular                [0x0000000000020c60-0x0000000000020c88)  rw-  0x00000c60 0x00000028 0x00000003 a.out.PT_LOAD[2]..got\n"},"event":"output","seq":0,"type":"event"}
1754321883.282413960 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000016 zero-fill              [0x0000000000020c88-0x0000000000021000)  rw-  0x00000c88 0x00000000 0x00000003 a.out.PT_LOAD[2]..relro_padding\n"},"event":"output","seq":0,"type":"event"}
1754321883.282423973 (stdio) <-- {"body":{"category":"console","output":"  0xfffffffffffffffa container              [0x0000000000030c88-0x0000000000030d41)  rw-  0x00000c88 0x00000070 0x00000000 a.out.PT_LOAD[3]\n"},"event":"output","seq":0,"type":"event"}
1754321883.282439947 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000017 data                   [0x0000000000030c88-0x0000000000030c98)  rw-  0x00000c88 0x00000010 0x00000003 a.out.PT_LOAD[3]..data\n"},"event":"output","seq":0,"type":"event"}
1754321883.282449961 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000018 regular                [0x0000000000030c98-0x0000000000030cf8)  rw-  0x00000c98 0x00000060 0x00000003 a.out.PT_LOAD[3]..got.plt\n"},"event":"output","seq":0,"type":"event"}
1754321883.282459974 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000019 zero-fill              [0x0000000000030cf8-0x0000000000030d41)  rw-  0x00000cf8 0x00000000 0x00000003 a.out.PT_LOAD[3]..bss\n"},"event":"output","seq":0,"type":"event"}
1754321883.282469988 (stdio) <-- {"body":{"category":"console","output":"  0x000000000000001a regular                                                         ---  0x00000cf8 0x000000ea 0x00000030 a.out..comment\n"},"event":"output","seq":0,"type":"event"}
1754321883.282480955 (stdio) <-- {"body":{"category":"console","output":"  0x000000000000001b dwarf-abbrev                                                    ---  0x00000de2 0x00000097 0x00000000 a.out..debug_abbrev\n"},"event":"output","seq":0,"type":"event"}
1754321883.282490969 (stdio) <-- {"body":{"category":"console","output":"  0x000000000000001c dwarf-info                                                      ---  0x00000e79 0x000000da 0x00000000 a.out..debug_info\n"},"event":"output","seq":0,"type":"event"}
1754321883.282502890 (stdio) <-- {"body":{"category":"console","output":"  0x000000000000001d dwarf-str-offsets                                               ---  0x00000f53 0x00000038 0x00000000 a.out..debug_str_offsets\n"},"event":"output","seq":0,"type":"event"}
1754321883.282512903 (stdio) <-- {"body":{"category":"console","output":"  0x000000000000001e dwarf-str                                                       ---  0x00000f8b 0x0000016b 0x00000030 a.out..debug_str\n"},"event":"output","seq":0,"type":"event"}
1754321883.282524109 (stdio) <-- {"body":{"category":"console","output":"  0x000000000000001f dwarf-addr                                                      ---  0x000010f6 0x00000038 0x00000000 a.out..debug_addr\n"},"event":"output","seq":0,"type":"event"}
1754321883.282536030 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000020 dwarf-line                                                      ---  0x0000112e 0x000000ec 0x00000000 a.out..debug_line\n"},"event":"output","seq":0,"type":"event"}
1754321883.282546043 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000021 dwarf-line-str                                                  ---  0x0000121a 0x00000109 0x00000030 a.out..debug_line_str\n"},"event":"output","seq":0,"type":"event"}
1754321883.282556057 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000022 elf-symbol-table                                                ---  0x00001328 0x000005d0 0x00000000 a.out..symtab\n"},"event":"output","seq":0,"type":"event"}
1754321883.282567978 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000023 regular                                                         ---  0x000018f8 0x00000177 0x00000000 a.out..shstrtab\n"},"event":"output","seq":0,"type":"event"}
1754321883.282586098 (stdio) <-- {"body":{"category":"console","output":"  0x0000000000000024 regular                                                         ---  0x00001a6f 0x000001e1 0x00000000 a.out..strtab\n"},"event":"output","seq":0,"type":"event"}
1754321883.282771111 (stdio) <-- {"body":{"category":"console","output":"Running launchCommands:\n"},"event":"output","seq":0,"type":"event"}
1754321883.282795906 (stdio) <-- {"body":{"category":"console","output":"(lldb) target create \"bad/path/b/s/w/ir/x/w/llvm_build/lldb-test-build.noindex/tools/lldb-dap/launch/TestDAP_launch.test_failing_launch_commands/a.out\"\n"},"event":"output","seq":0,"type":"event"}
1754321883.282813072 (stdio) <-- {"body":{"category":"console","output":"error: 'bad/path/b/s/w/ir/x/w/llvm_build/lldb-test-build.noindex/tools/lldb-dap/launch/TestDAP_launch.test_failing_launch_commands/a.out' does not exist\n"},"event":"output","seq":0,"type":"event"}
1754321883.282836914 (stdio) <-- {"body":{"error":{"format":"Failed to run launch commands. See the Debug Console for more details.","id":3,"showUser":true}},"command":"launch","request_seq":2,"seq":0,"success":false,"type":"response"}
1754321883.282847881 (stdio) <-- {"event":"initialized","seq":0,"type":"event"}
1754321883.292226076 (stdio) --> {"command":"disconnect","type":"request","arguments":{"terminateDebuggee":true},"seq":3}
1754321883.294018030 (stdio) <-- {"body":{"$__lldb_statistics":{"commands":"{\"platform list\":1,\"settings clear\":1,\"target create\":1,\"target list\":1,\"target modules dump sections\":1,\"target modules list\":1}","memory":"{\"strings\":{\"bytesTotal\":612520,\"bytesUnused\":597812,\"bytesUsed\":14708}}","plugins":"{\"abi\":[{\"enabled\":true,\"name\":\"SysV-arm64\"},{\"enabled\":true,\"name\":\"ABIMacOSX_arm64\"},{\"enabled\":true,\"name\":\"SysV-arm\"},{\"enabled\":true,\"name\":\"macosx-arm\"},{\"enabled\":true,\"name\":\"sysv-hexagon\"},{\"enabled\":true,\"name\":\"sysv-loongarch\"},{\"enabled\":true,\"name\":\"sysv-mips\"},{\"enabled\":true,\"name\":\"sysv-mips64\"},{\"enabled\":true,\"name\":\"sysv-msp430\"},{\"enabled\":true,\"name\":\"sysv-ppc\"},{\"enabled\":true,\"name\":\"sysv-ppc64\"},{\"enabled\":true,\"name\":\"sysv-riscv\"},{\"enabled\":true,\"name\":\"sysv-s390x\"},{\"enabled\":true,\"name\":\"abi.macosx-i386\"},{\"enabled\":true,\"name\":\"sysv-i386\"},{\"enabled\":true,\"name\":\"sysv-x86_64\"},{\"enabled\":true,\"name\":\"windows-x86_64\"}],\"architecture\":[{\"enabled\":true,\"name\":\"arm\"},{\"enabled\":true,\"name\":\"mips\"},{\"enabled\":true,\"name\":\"ppc64\"},{\"enabled\":true,\"name\":\"aarch64\"}],\"disassembler\":[{\"enabled\":true,\"name\":\"llvm-mc\"}],\"dynamic-loader\":[{\"enabled\":true,\"name\":\"darwin-kernel\"},{\"enabled\":true,\"name\":\"freebsd-kernel\"},{\"enabled\":true,\"name\":\"macosx-dyld\"},{\"enabled\":true,\"name\":\"macos-dyld\"},{\"enabled\":true,\"name\":\"posix-dyld\"},{\"enabled\":true,\"name\":\"static\"},{\"enabled\":true,\"name\":\"hexagon-dyld\"},{\"enabled\":true,\"name\":\"windows-dyld\"},{\"enabled\":true,\"name\":\"wasm-dyld\"}],\"emulate-instruction\":[{\"enabled\":true,\"name\":\"arm\"},{\"enabled\":true,\"name\":\"arm64\"},{\"enabled\":true,\"name\":\"LoongArch\"},{\"enabled\":true,\"name\":\"mips32\"},{\"enabled\":true,\"name\":\"mips64\"},{\"enabled\":true,\"name\":\"ppc64\"},{\"enabled\":true,\"name\":\"riscv\"}],\"instrumentation-runtime\":[{\"enabled\":true,\"name\":\"AddressSanitizer\"},{\"enabled\":true,\"name\":\"Libsanitizers-ASan\"},{\"enabled\":true,\"name\":\"MainThreadChecker\"},{\"enabled\":true,\"name\":\"ThreadSanitizer\"},{\"enabled\":true,\"name\":\"UndefinedBehaviorSanitizer\"}],\"jit-loader\":[{\"enabled\":true,\"name\":\"gdb\"}],\"language\":[{\"enabled\":true,\"name\":\"cplusplus\"},{\"enabled\":true,\"name\":\"objc\"},{\"enabled\":true,\"name\":\"objcplusplus\"}],\"language-runtime\":[{\"enabled\":true,\"name\":\"itanium\"},{\"enabled\":true,\"name\":\"apple-objc-v2\"},{\"enabled\":true,\"name\":\"apple-objc-v1\"},{\"enabled\":true,\"name\":\"gnustep-objc-libobjc2\"}],\"memory-history\":[{\"enabled\":true,\"name\":\"asan\"}],\"object-container\":[{\"enabled\":true,\"name\":\"bsd-archive\"},{\"enabled\":true,\"name\":\"mach-o\"},{\"enabled\":true,\"name\":\"mach-o-fileset\"}],\"object-file\":[{\"enabled\":true,\"name\":\"breakpad\"},{\"enabled\":true,\"name\":\"COFF\"},{\"enabled\":true,\"name\":\"elf\"},{\"enabled\":true,\"name\":\"JSON\"},{\"enabled\":true,\"name\":\"mach-o\"},{\"enabled\":true,\"name\":\"minidump\"},{\"enabled\":true,\"name\":\"pdb\"},{\"enabled\":true,\"name\":\"pe-coff\"},{\"enabled\":true,\"name\":\"xcoff\"},{\"enabled\":true,\"name\":\"wasm\"}],\"operating-system\":[{\"enabled\":true,\"name\":\"python\"}],\"platform\":[{\"enabled\":true,\"name\":\"remote-AIX\"},{\"enabled\":true,\"name\":\"remote-linux\"},{\"enabled\":true,\"name\":\"remote-android\"},{\"enabled\":true,\"name\":\"remote-freebsd\"},{\"enabled\":true,\"name\":\"remote-gdb-server\"},{\"enabled\":true,\"name\":\"darwin\"},{\"enabled\":true,\"name\":\"remote-ios\"},{\"enabled\":true,\"name\":\"remote-macosx\"},{\"enabled\":true,\"name\":\"host\"},{\"enabled\":true,\"name\":\"remote-netbsd\"},{\"enabled\":true,\"name\":\"remote-openbsd\"},{\"enabled\":true,\"name\":\"qemu-user\"},{\"enabled\":true,\"name\":\"remote-windows\"}],\"process\":[{\"enabled\":true,\"name\":\"ScriptedProcess\"},{\"enabled\":true,\"name\":\"elf-core\"},{\"enabled\":true,\"name\":\"mach-o-core\"},{\"enabled\":true,\"name\":\"minidump\"},{\"enabled\":true,\"name\":\"wasm\"},{\"enabled\":true,\"name\":\"gdb-remote\"}],\"register-type-builder\":[{\"enabled\":true,\"name\":\"register-types-clang\"}],\"repl\":[{\"enabled\":true,\"name\":\"ClangREPL\"}],\"script-interpreter\":[{\"enabled\":true,\"name\":\"script-none\"},{\"enabled\":true,\"name\":\"script-python\"}],\"scripted-interface\":[{\"enabled\":true,\"name\":\"OperatingSystemPythonInterface\"},{\"enabled\":true,\"name\":\"ScriptedPlatformPythonInterface\"},{\"enabled\":true,\"name\":\"ScriptedProcessPythonInterface\"},{\"enabled\":true,\"name\":\"ScriptedStopHookPythonInterface\"},{\"enabled\":true,\"name\":\"ScriptedBreakpointPythonInterface\"},{\"enabled\":true,\"name\":\"ScriptedThreadPlanPythonInterface\"}],\"structured-data\":[{\"enabled\":true,\"name\":\"darwin-log\"}],\"symbol-file\":[{\"enabled\":true,\"name\":\"breakpad\"},{\"enabled\":true,\"name\":\"CTF\"},{\"enabled\":true,\"name\":\"dwarf\"},{\"enabled\":true,\"name\":\"dwarf-debugmap\"},{\"enabled\":true,\"name\":\"JSON\"},{\"enabled\":true,\"name\":\"native-pdb\"},{\"enabled\":true,\"name\":\"symtab\"}],\"symbol-locator\":[{\"enabled\":true,\"name\":\"debuginfod\"},{\"enabled\":true,\"name\":\"Default\"}],\"symbol-vendor\":[{\"enabled\":true,\"name\":\"ELF\"},{\"enabled\":true,\"name\":\"PE-COFF\"},{\"enabled\":true,\"name\":\"WASM\"}],\"system-runtime\":[{\"enabled\":true,\"name\":\"systemruntime-macosx\"}],\"trace-exporter\":[{\"enabled\":true,\"name\":\"ctf\"}],\"type-system\":[{\"enabled\":true,\"name\":\"clang\"}],\"unwind-assembly\":[{\"enabled\":true,\"name\":\"inst-emulation\"},{\"enabled\":true,\"name\":\"x86\"}]}","targets":"[{\"breakpoints\":[],\"expressionEvaluation\":{\"failures\":0,\"successes\":0},\"frameVariable\":{\"failures\":0,\"successes\":0},\"moduleIdentifiers\":[187650679689336],\"sourceMapDeduceCount\":0,\"sourceRealpathAttemptCount\":0,\"sourceRealpathCompatibleCount\":0,\"summaryProviderStatistics\":[],\"targetCreateTime\":0.00032600000000000001,\"totalBreakpointResolveTime\":0,\"totalSharedLibraryEventHitCount\":0}]","totalDebugInfoByteSize":1345,"totalDebugInfoEnabled":1,"totalDebugInfoIndexLoadedFromCache":0,"totalDebugInfoIndexSavedToCache":0,"totalDebugInfoIndexTime":0.0063720000000000001,"totalDebugInfoParseTime":7.7000000000000001e-05,"totalDwoFileCount":0,"totalLoadedDwoFileCount":0,"totalModuleCount":1,"totalModuleCountHasDebugInfo":1,"totalModuleCountWithIncompleteTypes":0,"totalModuleCountWithVariableErrors":0,"totalSymbolLocatorTime":"{\"Default\":0.00019999999999999998,\"debuginfod\":0}","totalSymbolTableIndexTime":0.00029300000000000002,"totalSymbolTableParseTime":0.00027,"totalSymbolTableStripped":0,"totalSymbolTableSymbolCount":41,"totalSymbolTablesLoaded":1,"totalSymbolTablesLoadedFromCache":0,"totalSymbolTablesSavedToCache":0}},"event":"terminated","seq":0,"type":"event"}
1754321883.294076920 (stdio) <-- {"command":"disconnect","request_seq":3,"seq":0,"success":true,"type":"response"}

https://logs.chromium.org/logs/fuchsia/buildbucket/cr-buildbucket/8707461172181407569/+/u/test_lldb/check_lldb/stdout

@Nerixyz
Copy link
Contributor Author

Nerixyz commented Aug 4, 2025

We started seeing a test failure (lldb-api :: tools/lldb-dap/launch/TestDAP_launch.py) after this patch:

This failure looks unrelated. This PR changed the native PDB parser, which is used on Windows and currently not used at all in API tests.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants