diff --git a/include/llvm/LTO/LTOCodeGenerator.h b/include/llvm/LTO/LTOCodeGenerator.h index 4f78d27b10d..edf50f449d0 100644 --- a/include/llvm/LTO/LTOCodeGenerator.h +++ b/include/llvm/LTO/LTOCodeGenerator.h @@ -190,6 +190,10 @@ private: bool compileOptimizedToFile(const char **Name); void restoreLinkageForExternals(); void applyScopeRestrictions(); + void preserveDiscardableGVs( + Module &TheModule, + llvm::function_ref mustPreserveGV); + bool determineTarget(); std::unique_ptr createTargetMachine(); @@ -198,6 +202,7 @@ private: void DiagnosticHandler2(const DiagnosticInfo &DI); void emitError(const std::string &ErrMsg); + void emitWarning(const std::string &ErrMsg); LLVMContext &Context; std::unique_ptr MergedModule; diff --git a/lib/LTO/LTOCodeGenerator.cpp b/lib/LTO/LTOCodeGenerator.cpp index 1980965b169..a7dad55a819 100644 --- a/lib/LTO/LTOCodeGenerator.cpp +++ b/lib/LTO/LTOCodeGenerator.cpp @@ -351,7 +351,7 @@ std::unique_ptr LTOCodeGenerator::createTargetMachine() { // If a linkonce global is present in the MustPreserveSymbols, we need to make // sure we honor this. To force the compiler to not drop it, we add it to the // "llvm.compiler.used" global. -static void preserveDiscardableGVs( +void LTOCodeGenerator::preserveDiscardableGVs( Module &TheModule, llvm::function_ref mustPreserveGV) { SetVector UsedValuesSet; @@ -368,7 +368,17 @@ static void preserveDiscardableGVs( return; if (!mustPreserveGV(GV)) return; - assert(!GV.hasAvailableExternallyLinkage() && !GV.hasInternalLinkage()); + if (GV.hasAvailableExternallyLinkage()) { + emitWarning( + (Twine("Linker asked to preserve available_externally global: '") + + GV.getName() + "'").str()); + return; + } + if (GV.hasInternalLinkage()) { + emitWarning((Twine("Linker asked to preserve internal global: '") + + GV.getName() + "'").str()); + return; + } UsedValuesSet.insert(ConstantExpr::getBitCast(&GV, i8PTy)); }; for (auto &GV : TheModule) @@ -643,3 +653,10 @@ void LTOCodeGenerator::emitError(const std::string &ErrMsg) { else Context.diagnose(LTODiagnosticInfo(ErrMsg)); } + +void LTOCodeGenerator::emitWarning(const std::string &ErrMsg) { + if (DiagHandler) + (*DiagHandler)(LTO_DS_WARNING, ErrMsg.c_str(), DiagContext); + else + Context.diagnose(LTODiagnosticInfo(ErrMsg, DS_Warning)); +}