diff options
author | Adrian Prantl <aprantl@apple.com> | 2019-11-22 09:58:16 -0800 |
---|---|---|
committer | Adrian Prantl <aprantl@apple.com> | 2019-11-22 09:58:16 -0800 |
commit | 539117616d7a4c5690f1b9284faf0d282cd79621 (patch) | |
tree | 1683f2d43900d5145cbe9c1d5ef3ecc590669500 /lldb/packages/Python/lldbsuite/test/lang/objc/modules-app-update/TestClangModulesAppUpdate.py | |
parent | c0eeea5d74d979139378660513712e8f33278285 (diff) | |
download | bcm5719-llvm-539117616d7a4c5690f1b9284faf0d282cd79621.tar.gz bcm5719-llvm-539117616d7a4c5690f1b9284faf0d282cd79621.zip |
Complete complete types early when importing types from Clang module DWARF.
This affects -gmodules only.
Under normal operation pcm_type is a shallow forward declaration
that gets completed later. This is necessary to support cyclic
data structures. If, however, pcm_type is already complete (for
example, because it was loaded for a different target before),
the definition needs to be imported right away, too.
Type::ResolveClangType() effectively ignores the ResolveState
inside type_sp and only looks at IsDefined(), so it never calls
ClangASTImporter::ASTImporterDelegate::ImportDefinitionTo(),
which does extra work for Objective-C classes. This would result
in only the forward declaration to be visible.
An alternative implementation would be to sink this into Type::ResolveClangType ( https://github.com/llvm/llvm-project/blob/88235812a71d99c082e7aa2ef9356d43d1f83a80/lldb/source/Symbol/Type.cpp#L5809) though it isn't clear to me how to best do this from a layering perspective.
rdar://problem/52134074
Differential Revision: https://reviews.llvm.org/D70415
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test/lang/objc/modules-app-update/TestClangModulesAppUpdate.py')
-rw-r--r-- | lldb/packages/Python/lldbsuite/test/lang/objc/modules-app-update/TestClangModulesAppUpdate.py | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/lang/objc/modules-app-update/TestClangModulesAppUpdate.py b/lldb/packages/Python/lldbsuite/test/lang/objc/modules-app-update/TestClangModulesAppUpdate.py new file mode 100644 index 00000000000..9aefe1ce24d --- /dev/null +++ b/lldb/packages/Python/lldbsuite/test/lang/objc/modules-app-update/TestClangModulesAppUpdate.py @@ -0,0 +1,61 @@ +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 TestClangModuleAppUpdate(TestBase): + mydir = TestBase.compute_mydir(__file__) + + def setUp(self): + TestBase.setUp(self) + + @skipUnlessDarwin + @skipIf(debug_info=no_match(["gmodules"])) + def test_rebuild_app_modules_untouched(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(""" + @import Foundation; + @interface Foo : NSObject { + int i; + } + +(instancetype)init; + @end + """) + + mod_cache = self.getBuildArtifact("private-module-cache") + import os + if os.path.isdir(mod_cache): + shutil.rmtree(mod_cache) + self.build() + self.assertTrue(os.path.isdir(mod_cache), "module cache exists") + + target, process, _, bkpt = lldbutil.run_to_source_breakpoint( + self, "break here", lldb.SBFileSpec("main.m")) + bar = target.FindTypes('Bar').GetTypeAtIndex(0) + foo = bar.GetDirectBaseClassAtIndex(0).GetType() + self.assertEqual(foo.GetNumberOfFields(), 1) + self.assertEqual(foo.GetFieldAtIndex(0).GetName(), "i") + + # Rebuild. + process.Kill() + os.remove(self.getBuildArtifact('main.o')) + os.remove(self.getBuildArtifact('a.out')) + self.build() + + # Reattach. + target, process, _, _ = lldbutil.run_to_breakpoint_do_run(self, target, bkpt) + bar = target.FindTypes('Bar').GetTypeAtIndex(0) + foo = bar.GetDirectBaseClassAtIndex(0).GetType() + self.assertEqual(foo.GetNumberOfFields(), 1) + self.assertEqual(foo.GetFieldAtIndex(0).GetName(), "i") |