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