diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp --- a/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/PdbAstBuilder.cpp @@ -534,11 +534,15 @@ std::pair PdbAstBuilder::CreateDeclInfoForUndecoratedName(llvm::StringRef name) { + clang::DeclContext *context = + FromCompilerDeclContext(GetTranslationUnitDecl()); + // Global ctor and dtor are global decls. + if (name.contains("dynamic initializer for") || + name.contains("dynamic atexit destructor for")) + return {context, std::string(name)}; MSVCUndecoratedNameParser parser(name); llvm::ArrayRef specs = parser.GetSpecifiers(); - auto context = FromCompilerDeclContext(GetTranslationUnitDecl()); - llvm::StringRef uname = specs.back().GetBaseName(); specs = specs.drop_back(); if (specs.empty()) @@ -1226,7 +1230,6 @@ llvm::StringRef proc_name = proc.Name; proc_name.consume_front(context_name); proc_name.consume_front("::"); - clang::FunctionDecl *function_decl = CreateFunctionDecl(func_id, proc_name, proc.FunctionType, func_ct, func_type->getNumParams(), storage, false, parent); diff --git a/lldb/test/Shell/SymbolFile/NativePDB/global-ctor-dtor.cpp b/lldb/test/Shell/SymbolFile/NativePDB/global-ctor-dtor.cpp new file mode 100644 --- /dev/null +++ b/lldb/test/Shell/SymbolFile/NativePDB/global-ctor-dtor.cpp @@ -0,0 +1,30 @@ +// clang-format off +// REQUIRES: lld, x86 + +// Global ctor and dtor should be globals decls. +// RUN: %clang_cl --target=x86_64-windows-msvc -Od -Z7 -GS- -fno-addrsig -c /Fo%t.obj -- %s +// RUN: lld-link -debug:full -nodefaultlib -entry:main %t.obj -out:%t.exe -pdb:%t.pdb -force +// RUN: env LLDB_USE_NATIVE_PDB_READER=1 lldb-test symbols --dump-ast %t.exe | FileCheck %s + +struct A { + ~A() {}; +}; +struct B { + static A glob; +}; + +A B::glob = A(); +int main() { + return 0; +} + +// CHECK: static void B::`dynamic initializer for 'glob'(); +// CHECK-NEXT: static void B::`dynamic atexit destructor for 'glob'(); +// CHECK-NEXT: int main(); +// CHECK-NEXT: static void _GLOBAL__sub_I_global_ctor_dtor.cpp(); +// CHECK-NEXT: struct A { +// CHECK-NEXT: ~A(); +// CHECK-NEXT: }; +// CHECK-NEXT: struct B { +// CHECK-NEXT: static A glob; +// CHECK-NEXT: };