diff options
-rw-r--r-- | llvm/include/llvm/IR/GlobalValue.h | 46 | ||||
-rw-r--r-- | llvm/lib/Transforms/IPO/FunctionImport.cpp | 4 | ||||
-rw-r--r-- | llvm/test/Transforms/FunctionImport/Inputs/funcimport.ll | 5 | ||||
-rw-r--r-- | llvm/test/Transforms/FunctionImport/funcimport.ll | 5 |
4 files changed, 22 insertions, 38 deletions
diff --git a/llvm/include/llvm/IR/GlobalValue.h b/llvm/include/llvm/IR/GlobalValue.h index 503023809e3..0d12fe86819 100644 --- a/llvm/include/llvm/IR/GlobalValue.h +++ b/llvm/include/llvm/IR/GlobalValue.h @@ -124,7 +124,26 @@ private: /// non-equivalent at link time. For example, if a function has weak linkage /// then the code defining it may be replaced by different code. bool mayBeOverridden() const { - return isMayBeOverriddenLinkage(getLinkage()); + switch (getLinkage()) { + case WeakAnyLinkage: + case LinkOnceAnyLinkage: + case CommonLinkage: + case ExternalWeakLinkage: + return true; + + case AvailableExternallyLinkage: + case LinkOnceODRLinkage: + case WeakODRLinkage: + // The above three cannot be overridden but can be de-refined. + + case ExternalLinkage: + case AppendingLinkage: + case InternalLinkage: + case PrivateLinkage: + return false; + } + + llvm_unreachable("Fully covered switch above!"); } protected: @@ -266,31 +285,6 @@ public: return Linkage == CommonLinkage; } - /// Whether the definition of this global may be replaced by something - /// non-equivalent at link time. For example, if a function has weak linkage - /// then the code defining it may be replaced by different code. - static bool isMayBeOverriddenLinkage(LinkageTypes Linkage) { - switch (Linkage) { - case WeakAnyLinkage: - case LinkOnceAnyLinkage: - case CommonLinkage: - case ExternalWeakLinkage: - return true; - - case AvailableExternallyLinkage: - case LinkOnceODRLinkage: - case WeakODRLinkage: - // The above three cannot be overridden but can be de-refined. - - case ExternalLinkage: - case AppendingLinkage: - case InternalLinkage: - case PrivateLinkage: - return false; - } - llvm_unreachable("Fully covered switch above!"); - } - /// Whether the definition of this global may be discarded if it is not used /// in its compilation unit. static bool isDiscardableIfUnused(LinkageTypes Linkage) { diff --git a/llvm/lib/Transforms/IPO/FunctionImport.cpp b/llvm/lib/Transforms/IPO/FunctionImport.cpp index d9860a908d0..ec82248d78b 100644 --- a/llvm/lib/Transforms/IPO/FunctionImport.cpp +++ b/llvm/lib/Transforms/IPO/FunctionImport.cpp @@ -156,8 +156,8 @@ selectCallee(const ModuleSummaryIndex &Index, CalleeSummaryList, [&](const std::unique_ptr<GlobalValueSummary> &SummaryPtr) { auto *GVSummary = SummaryPtr.get(); - if (GlobalValue::isMayBeOverriddenLinkage(GVSummary->linkage())) - // There is no point in importing these, we can't inline them + if (GlobalValue::isWeakAnyLinkage(GVSummary->linkage())) + // There is no point in importing weak symbols, we can't inline them return false; if (auto *AS = dyn_cast<AliasSummary>(GVSummary)) { GVSummary = &AS->getAliasee(); diff --git a/llvm/test/Transforms/FunctionImport/Inputs/funcimport.ll b/llvm/test/Transforms/FunctionImport/Inputs/funcimport.ll index fa96b8ea266..03ea3647fd7 100644 --- a/llvm/test/Transforms/FunctionImport/Inputs/funcimport.ll +++ b/llvm/test/Transforms/FunctionImport/Inputs/funcimport.ll @@ -75,11 +75,6 @@ entry: ret void } -define linkonce void @linkoncefunc2() #0 { -entry: - ret void -} - define internal i32 @staticfunc() #0 { entry: ret i32 1 diff --git a/llvm/test/Transforms/FunctionImport/funcimport.ll b/llvm/test/Transforms/FunctionImport/funcimport.ll index 478613a2475..f0df3200555 100644 --- a/llvm/test/Transforms/FunctionImport/funcimport.ll +++ b/llvm/test/Transforms/FunctionImport/funcimport.ll @@ -28,7 +28,6 @@ entry: call void (...) @setfuncptr() call void (...) @callfuncptr() call void (...) @weakfunc() - call void (...) @linkoncefunc2() call void (...) @referencelargelinkonce() ret i32 0 } @@ -95,10 +94,6 @@ declare void @referencelargelinkonce(...) ; CHECK-DAG: declare void @weakfunc(...) declare void @weakfunc(...) #1 -; Won't import linkonce func -; CHECK-DAG: declare void @linkoncefunc2(...) -declare void @linkoncefunc2(...) #1 - ; INSTLIMDEF-DAG: Import funcwithpersonality ; INSTLIMDEF-DAG: define available_externally hidden void @funcwithpersonality.llvm.{{.*}}() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { ; INSTLIM5-DAG: declare hidden void @funcwithpersonality.llvm.{{.*}}() |