From c16e631e943c3e8460598389c3fff57d1f73c17c Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 31 May 2003 21:57:06 +0000 Subject: [PATCH] Fix bug: FunctionResolve/2003-05-31-AllInternalDecls.ll git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@6486 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/IPO/FunctionResolution.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/Transforms/IPO/FunctionResolution.cpp b/lib/Transforms/IPO/FunctionResolution.cpp index 18a28895fdc..7ec1745ffdd 100644 --- a/lib/Transforms/IPO/FunctionResolution.cpp +++ b/lib/Transforms/IPO/FunctionResolution.cpp @@ -309,6 +309,23 @@ static bool ProcessGlobalsWithSameName(Module &M, } if (Globals.size() > 1) { // Found a multiply defined global... + // If there are no external declarations, and there is at most one + // externally visible instance of the global, then there is nothing to do. + // + bool HasExternal = false; + unsigned NumInstancesWithExternalLinkage = 0; + + for (unsigned i = 0, e = Globals.size(); i != e; ++i) { + if (Globals[i]->isExternal()) + HasExternal = true; + else if (!Globals[i]->hasInternalLinkage()) + NumInstancesWithExternalLinkage++; + } + + if (!HasExternal && NumInstancesWithExternalLinkage <= 1) + return false; // Nothing to do? Must have multiple internal definitions. + + // We should find exactly one concrete function definition, which is // probably the implementation. Change all of the function definitions and // uses to use it instead.