https://github.com/Nerixyz created 
https://github.com/llvm/llvm-project/pull/159296

When creating LLDB types from `LF_MODIFIER` records, the type name of the 
modified type was used. This didn't include the modifiers 
(`const`/`volatile`/`__unaligned`). With this PR, they're included.

The DIA plugin had a test for this. That test also assumed that function types 
had a name. I removed that check here, because function/procedure types 
themselves in PDB don't have a name:

```
  0x1015 | LF_ARGLIST [size = 20, hash = 0xBCB6]
           0x0074 (int): `int`
           0x1013: `int* __restrict`
           0x1014: `int& __restrict`
  0x1016 | LF_PROCEDURE [size = 16, hash = 0x3F611]
           return type = 0x0003 (void), # args = 3, param list = 0x1015
           calling conv = cdecl, options = None
```

I assume DIA gets the name from the function symbol itself. In the native 
plugin, that name isn't included and multiple functions with the same signature 
will reuse one type, whereas DIA would create a new type for each function. The 
[Shell/SymbolFile/PDB/func-symbols.test](https://github.com/llvm/llvm-project/blob/b29c7ded31d81ca47aed0157c543c8b6a0f5866c/lldb/test/Shell/SymbolFile/PDB/func-symbols.test)
 also relies on this.

>From 8d9993b447114a2c3c9430d977236f42233da2c3 Mon Sep 17 00:00:00 2001
From: Nerixyz <nerix...@outlook.de>
Date: Wed, 17 Sep 2025 11:04:44 +0200
Subject: [PATCH] [LLDB][NativePDB] Add modifiers to modified type name

---
 .../NativePDB/SymbolFileNativePDB.cpp          | 12 ++++++++++--
 lldb/test/Shell/SymbolFile/PDB/type-quals.test | 18 ++++++++++--------
 2 files changed, 20 insertions(+), 10 deletions(-)

diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp 
b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
index cfecda4817976..f081965a76183 100644
--- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
+++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp
@@ -549,10 +549,18 @@ lldb::TypeSP 
SymbolFileNativePDB::CreateModifierType(PdbTypeSymId type_id,
   TpiStream &stream = m_index->tpi();
 
   std::string name;
+
+  if ((mr.Modifiers & ModifierOptions::Const) != ModifierOptions::None)
+    name += "const ";
+  if ((mr.Modifiers & ModifierOptions::Volatile) != ModifierOptions::None)
+    name += "volatile ";
+  if ((mr.Modifiers & ModifierOptions::Unaligned) != ModifierOptions::None)
+    name += "__unaligned ";
+
   if (mr.ModifiedType.isSimple())
-    name = std::string(GetSimpleTypeName(mr.ModifiedType.getSimpleKind()));
+    name += GetSimpleTypeName(mr.ModifiedType.getSimpleKind());
   else
-    name = computeTypeName(stream.typeCollection(), mr.ModifiedType);
+    name += computeTypeName(stream.typeCollection(), mr.ModifiedType);
   Declaration decl;
   lldb::TypeSP modified_type = GetOrCreateType(mr.ModifiedType);
 
diff --git a/lldb/test/Shell/SymbolFile/PDB/type-quals.test 
b/lldb/test/Shell/SymbolFile/PDB/type-quals.test
index e0d79ac0b7529..370c0a21b093a 100644
--- a/lldb/test/Shell/SymbolFile/PDB/type-quals.test
+++ b/lldb/test/Shell/SymbolFile/PDB/type-quals.test
@@ -2,35 +2,37 @@ REQUIRES: target-windows, msvc
 RUN: mkdir -p %t.dir
 RUN: %build --compiler=clang-cl --mode=compile --arch=32 --nodefaultlib 
--output=%t.dir/TypeQualsTest.cpp.obj %S/Inputs/TypeQualsTest.cpp
 RUN: %build --compiler=msvc --mode=link --arch=32 --nodefaultlib 
--output=%t.dir/TypeQualsTest.cpp.exe %t.dir/TypeQualsTest.cpp.obj
-RUN: lldb-test symbols %t.dir/TypeQualsTest.cpp.exe | FileCheck %s
+RUN: env LLDB_USE_NATIVE_PDB_READER=0 lldb-test symbols 
%t.dir/TypeQualsTest.cpp.exe | FileCheck %s
+RUN: env LLDB_USE_NATIVE_PDB_READER=1 lldb-test symbols 
%t.dir/TypeQualsTest.cpp.exe | FileCheck %s
 
 CHECK: Module [[MOD:.*]]
-CHECK-DAG: SymbolFile pdb ([[MOD]])
+CHECK-DAG: SymbolFile {{(native-)?}}pdb ([[MOD]])
 CHECK-DAG:      Type{{.*}} , name = "const int", size = 4, compiler_type = 
{{.*}} const int
 CHECK-DAG:      Type{{.*}} , size = 4, compiler_type = {{.*}} const int *
 CHECK-DAG:      Type{{.*}} , size = 4, compiler_type = {{.*}} const int **const
 CHECK-DAG:      Type{{.*}} , size = 4, compiler_type = {{.*}} const int *const
 CHECK-DAG:      Type{{.*}} , size = 4, compiler_type = {{.*}} const int *const 
*
-CHECK-DAG:      Type{{.*}} , name = "Func1", {{.*}}, compiler_type = {{.*}} 
void (const int *, const int *, const int **const, const int *const *)
+CHECK-DAG:      Type{{.*}} , {{.*}}, compiler_type = {{.*}} void (const int *, 
const int *, const int **const, const int *const *)
 
 CHECK-DAG:      Type{{.*}} , size = 4, compiler_type = {{.*}} volatile int *
-CHECK-DAG:      Type{{.*}} , name = "Func2", {{.*}}, compiler_type = {{.*}} 
void (volatile int *, volatile int *)
+CHECK-DAG:      Type{{.*}} , {{.*}}, compiler_type = {{.*}} void (volatile int 
*, volatile int *)
 
 CHECK-DAG:      Type{{.*}} , size = 4, compiler_type = {{.*}} int *
 CHECK-DAG:      Type{{.*}} , size = 4, compiler_type = {{.*}} int *&
 CHECK-DAG:      Type{{.*}} , size = 4, compiler_type = {{.*}} int &&
 CHECK-DAG:      Type{{.*}} , size = 4, compiler_type = {{.*}} int &
 CHECK-DAG:      Type{{.*}} , size = 4, compiler_type = {{.*}} const int &
-CHECK-DAG:      Type{{.*}} , name = "Func3", {{.*}}, compiler_type = {{.*}} 
void (int *&, int &, const int &, int &&)
+CHECK-DAG:      Type{{.*}} , {{.*}}, compiler_type = {{.*}} void (int *&, int 
&, const int &, int &&)
 
 // FIXME: __unaligned is not supported.
-CHECK-DAG:      Type{{.*}} , name = "Func4", {{.*}}, compiler_type = {{.*}} 
void (int *, int *)
+CHECK-DAG:      Type{{.*}} , {{.*}}, compiler_type = {{.*}} void (int *, int *)
 
 CHECK-DAG:      Type{{.*}} , size = 4, compiler_type = {{.*}} int *__restrict
 CHECK-DAG:      Type{{.*}} , size = 4, compiler_type = {{.*}} int &__restrict
-CHECK-DAG:      Type{{.*}} , name = "Func5", {{.*}}, compiler_type = {{.*}} 
void (int, int *__restrict, int &__restrict)
+CHECK-DAG:      Type{{.*}} , {{.*}}, compiler_type = {{.*}} void (int, int 
*__restrict, int &__restrict)
 
-CHECK-DAG:      Type{{.*}} , name = "Func6", {{.*}}, compiler_type = {{.*}} 
void (const volatile int *__restrict)
+CHECK-DAG:      Type{{.*}} , name = "{{volatile const|const volatile}} int", 
size = 4, compiler_type = {{.*}} {{volatile const|const volatile}} int
+CHECK-DAG:      Type{{.*}} , {{.*}}, compiler_type = {{.*}} void (const 
volatile int *__restrict)
 
 CHECK-DAG:      Type{{.*}} , size = 400, compiler_type = {{.*}} volatile int 
*[100]
 CHECK-DAG:      Type{{.*}} , size = 4000, compiler_type = {{.*}} volatile int 
*[10][100]

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to