diff options
author | Douglas Gregor <dgregor@apple.com> | 2013-06-21 00:20:25 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2013-06-21 00:20:25 +0000 |
commit | 600a2f5a215619765d6f9e96e898b8dab43fb039 (patch) | |
tree | 240d12d3bde73ee6c811288b807769ef11e4377e /clang/lib/Sema/SemaDeclObjC.cpp | |
parent | 725de3e14ff288a92bed36241cdc2c22be55ee0e (diff) | |
download | bcm5719-llvm-600a2f5a215619765d6f9e96e898b8dab43fb039.tar.gz bcm5719-llvm-600a2f5a215619765d6f9e96e898b8dab43fb039.zip |
When building a module, keep *all* declared methods in the global method pool.
As an optimization, we only kept declared methods with distinct
signatures in the global method pool, to keep the method lists
small. Under modules, however, one could have two different methods
with the same signature that occur in different (sub)modules. If only
the later submodule is important, message sends to 'id' with that
selector would fail because the first method (the only one that got
into the method pool) was hidden. When building a module, keep *all*
of the declared methods.
I did a quick check of both module build time and uses of modules, and
found no performance regression despite this causing us to keep more
methods in the global method pool. Fixes <rdar://problem/14148896>.
llvm-svn: 184504
Diffstat (limited to 'clang/lib/Sema/SemaDeclObjC.cpp')
-rw-r--r-- | clang/lib/Sema/SemaDeclObjC.cpp | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index 526e479af08..618c9d99e1b 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -2130,6 +2130,10 @@ void Sema::addMethodToGlobalList(ObjCMethodList *List, ObjCMethodDecl *Method) { // signature. ObjCMethodList *Previous = List; for (; List; Previous = List, List = List->getNext()) { + // If we are building a module, keep all of the methods. + if (getLangOpts().Modules && !getLangOpts().CurrentModule.empty()) + continue; + if (!MatchTwoMethodDeclarations(Method, List->Method)) continue; |