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 @@ -1226,7 +1226,10 @@ llvm::StringRef proc_name = proc.Name; proc_name.consume_front(context_name); proc_name.consume_front("::"); - + // Global ctor and dtor are global decls. + if (proc_name.contains("dynamic initializer for") || + proc_name.contains("dynamic atexit destructor for")) + parent = FromCompilerDeclContext(GetTranslationUnitDecl()); 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 -opt:icf -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: struct B { +// CHECK-NEXT: static A glob; +// CHECK-NEXT: }; +// CHECK-NEXT: static void `dynamic initializer for 'glob'(); +// CHECK-NEXT: static void `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: };