Author: Adrian Prantl Date: 2019-11-15T16:27:14-08:00 New Revision: 0304360a40b45ffcbb040596d2a01733c0103455
URL: https://github.com/llvm/llvm-project/commit/0304360a40b45ffcbb040596d2a01733c0103455 DIFF: https://github.com/llvm/llvm-project/commit/0304360a40b45ffcbb040596d2a01733c0103455.diff LOG: Add a testcase for Clang modules being updated within one LLDB session. This actually works as expected, but wasn't explicitly tested before. Added: lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/Makefile lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/TestClangModulesUpdate.py lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/first.m lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/module.modulemap lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/second.m lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/umbrella.h Modified: lldb/source/Core/ModuleList.cpp Removed: ################################################################################ diff --git a/lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/Makefile b/lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/Makefile new file mode 100644 index 000000000000..5d0a2209ef72 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/Makefile @@ -0,0 +1,3 @@ +CFLAGS_EXTRAS = -I$(BUILDDIR) +USE_PRIVATE_MODULE_CACHE = YES +include Makefile.rules diff --git a/lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/TestClangModulesUpdate.py b/lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/TestClangModulesUpdate.py new file mode 100644 index 000000000000..28e4fe46cb56 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/TestClangModulesUpdate.py @@ -0,0 +1,69 @@ +from __future__ import print_function + +import unittest2 +import os +import shutil + +import lldb +from lldbsuite.test.decorators import * +from lldbsuite.test.lldbtest import * +from lldbsuite.test import lldbutil + + +class TestClangModuleUpdate(TestBase): + mydir = TestBase.compute_mydir(__file__) + + def setUp(self): + TestBase.setUp(self) + + @skipUnlessDarwin + @skipIf(debug_info=no_match(["gmodules"])) + def test_expr(self): + with open(self.getBuildArtifact("module.modulemap"), "w") as f: + f.write(""" + module Foo { header "f.h" } + """) + with open(self.getBuildArtifact("f.h"), "w") as f: + f.write(""" + struct Q { int i; }; + void f() {} + """) + + mod_cache = self.getBuildArtifact("private-module-cache") + if os.path.isdir(mod_cache): + shutil.rmtree(mod_cache) + d = {'OBJC_SOURCES': 'first.m'} + self.build(dictionary=d) + self.assertTrue(os.path.isdir(mod_cache), "module cache exists") + + logfile = self.getBuildArtifact("modules.log") + self.runCmd("log enable -f %s lldb module" % logfile) + target, process, _, bkpt = lldbutil.run_to_name_breakpoint(self, "main") + self.assertIn("int i", str(target.FindTypes('Q').GetTypeAtIndex(0))) + self.expect("image list -g", patterns=[r'first\.o', r'Foo.*\.pcm']) + + # Update the module. + with open(self.getBuildArtifact("f.h"), "w") as f: + f.write(""" + struct S { int i; }; + struct S getS() { struct S r = {1}; return r; } + void f() {} + """) + + # Rebuild. + d = {'OBJC_SOURCES': 'second.m'} + self.build(dictionary=d) + + # Reattach. + process.Kill() + target, process, _, _ = lldbutil.run_to_breakpoint_do_run(self, target, bkpt) + self.assertIn("int i", str(target.FindTypes('S').GetTypeAtIndex(0))) + self.expect("image list -g", patterns=[r'second\.o', r'Foo.*\.pcm']) + + # Check log file. + found = False + with open(logfile, 'r') as f: + for line in f: + if "module changed" in line and "Foo" in line: + found = True + self.assertTrue(found) diff --git a/lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/first.m b/lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/first.m new file mode 100644 index 000000000000..bcc458ffb8ef --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/first.m @@ -0,0 +1,5 @@ +@import Umbrella; +int main(int argc, char **argv) { + f(); // break here + return 0; +} diff --git a/lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/module.modulemap b/lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/module.modulemap new file mode 100644 index 000000000000..c142410cd07f --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/module.modulemap @@ -0,0 +1,4 @@ +module Umbrella { + header "umbrella.h" + export * +} diff --git a/lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/second.m b/lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/second.m new file mode 100644 index 000000000000..bce925cb0578 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/second.m @@ -0,0 +1,5 @@ +@import Umbrella; +int main() { + struct S s = getS(); // break here + return s.i; +} diff --git a/lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/umbrella.h b/lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/umbrella.h new file mode 100644 index 000000000000..375d3ea2a044 --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/objc/modules-update/umbrella.h @@ -0,0 +1 @@ +@import Foo; diff --git a/lldb/source/Core/ModuleList.cpp b/lldb/source/Core/ModuleList.cpp index b0567a902fd7..07100bb81dca 100644 --- a/lldb/source/Core/ModuleList.cpp +++ b/lldb/source/Core/ModuleList.cpp @@ -752,9 +752,10 @@ Status ModuleList::GetSharedModule(const ModuleSpec &module_spec, Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_MODULES)); if (log != nullptr) - LLDB_LOGF(log, - "module changed: %p, removing from global module list", - static_cast<void *>(module_sp.get())); + LLDB_LOGF( + log, "%p '%s' module changed: removing from global module list", + static_cast<void *>(module_sp.get()), + module_sp->GetFileSpec().GetFilename().GetCString()); shared_module_list.Remove(module_sp); module_sp.reset(); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits