alvinhochun updated this revision to Diff 463458. alvinhochun added a comment.
Updated the patch to be standalone. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D134636/new/ https://reviews.llvm.org/D134636 Files: lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp lldb/test/Shell/Target/Inputs/main.c lldb/test/Shell/Target/Inputs/shlib.c lldb/test/Shell/Target/dependent-modules-nodupe-windows.test Index: lldb/test/Shell/Target/dependent-modules-nodupe-windows.test =================================================================== --- /dev/null +++ lldb/test/Shell/Target/dependent-modules-nodupe-windows.test @@ -0,0 +1,24 @@ +# REQUIRES: system-windows + +# Checks that dependent modules preloaded by LLDB are not duplicated when the +# process actually loads the DLL. + +# RUN: %clang_host -g0 -O0 -shared %S/Inputs/shlib.c -o %t.shlib.dll \ +# RUN: %if windows-msvc %{-Wl,-implib:%t.shlib.lib%} \ +# RUN: %else %{-Wl,--out-implib=%t.shlib.lib%} +# RUN: %clang_host -g0 -O0 %S/Inputs/main.c %t.shlib.lib -o %t.main.exe +# RUN: %lldb -b -o "#before" -o "target modules list" -o "b main" -o run \ +# RUN: -o "#after" -o "target modules list" %t.main.exe | FileCheck %s + +# CHECK-LABEL: #before +# CHECK-NEXT: target modules list +# CHECK-NEXT: .main.exe +# CHECK-NEXT: .shlib.dll + +# CHECK-LABEL: #after +# CHECK-NEXT: target modules list +# CHECK-NEXT: .main.exe +# CHECK-NEXT: ntdll.dll +# CHECK-NEXT: kernel32.dll +# CHECK: .shlib.dll +# CHECK-NOT: .shlib.dll Index: lldb/test/Shell/Target/Inputs/shlib.c =================================================================== --- /dev/null +++ lldb/test/Shell/Target/Inputs/shlib.c @@ -0,0 +1 @@ +__declspec(dllexport) void exportFunc(void) {} Index: lldb/test/Shell/Target/Inputs/main.c =================================================================== --- /dev/null +++ lldb/test/Shell/Target/Inputs/main.c @@ -0,0 +1,2 @@ +__declspec(dllimport) void exportFunc(void); +int main() { exportFunc(); } Index: lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp =================================================================== --- lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp +++ lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp @@ -653,28 +653,26 @@ LLDB_LOG(log, "Debugger connected to process {0}. Image base = {1:x}", debugger->GetProcess().GetProcessId(), image_base); - ModuleSP module = GetTarget().GetExecutableModule(); - if (!module) { - // During attach, we won't have the executable module, so find it now. - const DWORD pid = debugger->GetProcess().GetProcessId(); - const std::string file_name = GetProcessExecutableName(pid); - if (file_name.empty()) { - return; - } - - FileSpec executable_file(file_name); - FileSystem::Instance().Resolve(executable_file); - ModuleSpec module_spec(executable_file); - Status error; - module = - GetTarget().GetOrCreateModule(module_spec, true /* notify */, &error); - if (!module) { - return; - } + ModuleSP module; + // During attach, we won't have the executable module, so find it now. + const DWORD pid = debugger->GetProcess().GetProcessId(); + const std::string file_name = GetProcessExecutableName(pid); + if (file_name.empty()) { + return; + } - GetTarget().SetExecutableModule(module, eLoadDependentsNo); + FileSpec executable_file(file_name); + FileSystem::Instance().Resolve(executable_file); + ModuleSpec module_spec(executable_file); + Status error; + module = + GetTarget().GetOrCreateModule(module_spec, true /* notify */, &error); + if (!module) { + return; } + GetTarget().SetExecutableModule(module, eLoadDependentsNo); + if (auto dyld = GetDynamicLoader()) dyld->OnLoadModule(module, ModuleSpec(), image_base);
Index: lldb/test/Shell/Target/dependent-modules-nodupe-windows.test =================================================================== --- /dev/null +++ lldb/test/Shell/Target/dependent-modules-nodupe-windows.test @@ -0,0 +1,24 @@ +# REQUIRES: system-windows + +# Checks that dependent modules preloaded by LLDB are not duplicated when the +# process actually loads the DLL. + +# RUN: %clang_host -g0 -O0 -shared %S/Inputs/shlib.c -o %t.shlib.dll \ +# RUN: %if windows-msvc %{-Wl,-implib:%t.shlib.lib%} \ +# RUN: %else %{-Wl,--out-implib=%t.shlib.lib%} +# RUN: %clang_host -g0 -O0 %S/Inputs/main.c %t.shlib.lib -o %t.main.exe +# RUN: %lldb -b -o "#before" -o "target modules list" -o "b main" -o run \ +# RUN: -o "#after" -o "target modules list" %t.main.exe | FileCheck %s + +# CHECK-LABEL: #before +# CHECK-NEXT: target modules list +# CHECK-NEXT: .main.exe +# CHECK-NEXT: .shlib.dll + +# CHECK-LABEL: #after +# CHECK-NEXT: target modules list +# CHECK-NEXT: .main.exe +# CHECK-NEXT: ntdll.dll +# CHECK-NEXT: kernel32.dll +# CHECK: .shlib.dll +# CHECK-NOT: .shlib.dll Index: lldb/test/Shell/Target/Inputs/shlib.c =================================================================== --- /dev/null +++ lldb/test/Shell/Target/Inputs/shlib.c @@ -0,0 +1 @@ +__declspec(dllexport) void exportFunc(void) {} Index: lldb/test/Shell/Target/Inputs/main.c =================================================================== --- /dev/null +++ lldb/test/Shell/Target/Inputs/main.c @@ -0,0 +1,2 @@ +__declspec(dllimport) void exportFunc(void); +int main() { exportFunc(); } Index: lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp =================================================================== --- lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp +++ lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp @@ -653,28 +653,26 @@ LLDB_LOG(log, "Debugger connected to process {0}. Image base = {1:x}", debugger->GetProcess().GetProcessId(), image_base); - ModuleSP module = GetTarget().GetExecutableModule(); - if (!module) { - // During attach, we won't have the executable module, so find it now. - const DWORD pid = debugger->GetProcess().GetProcessId(); - const std::string file_name = GetProcessExecutableName(pid); - if (file_name.empty()) { - return; - } - - FileSpec executable_file(file_name); - FileSystem::Instance().Resolve(executable_file); - ModuleSpec module_spec(executable_file); - Status error; - module = - GetTarget().GetOrCreateModule(module_spec, true /* notify */, &error); - if (!module) { - return; - } + ModuleSP module; + // During attach, we won't have the executable module, so find it now. + const DWORD pid = debugger->GetProcess().GetProcessId(); + const std::string file_name = GetProcessExecutableName(pid); + if (file_name.empty()) { + return; + } - GetTarget().SetExecutableModule(module, eLoadDependentsNo); + FileSpec executable_file(file_name); + FileSystem::Instance().Resolve(executable_file); + ModuleSpec module_spec(executable_file); + Status error; + module = + GetTarget().GetOrCreateModule(module_spec, true /* notify */, &error); + if (!module) { + return; } + GetTarget().SetExecutableModule(module, eLoadDependentsNo); + if (auto dyld = GetDynamicLoader()) dyld->OnLoadModule(module, ModuleSpec(), image_base);
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits