forked from OSchip/llvm-project
Degrade assertions to a warning in LTOCodeGenerator for preserved linkonce
The assertions were assuming that the linker will not ask to preserve a global that is internal or available_externally, as it does not really make sense. In practice this break the bootstrap of clang, I degrade to a warning for now. From: Mehdi Amini <mehdi.amini@apple.com> llvm-svn: 268671
This commit is contained in:
parent
62de33c2db
commit
8eb3397a73
|
@ -190,6 +190,10 @@ private:
|
||||||
bool compileOptimizedToFile(const char **Name);
|
bool compileOptimizedToFile(const char **Name);
|
||||||
void restoreLinkageForExternals();
|
void restoreLinkageForExternals();
|
||||||
void applyScopeRestrictions();
|
void applyScopeRestrictions();
|
||||||
|
void preserveDiscardableGVs(
|
||||||
|
Module &TheModule,
|
||||||
|
llvm::function_ref<bool(const GlobalValue &)> mustPreserveGV);
|
||||||
|
|
||||||
bool determineTarget();
|
bool determineTarget();
|
||||||
std::unique_ptr<TargetMachine> createTargetMachine();
|
std::unique_ptr<TargetMachine> createTargetMachine();
|
||||||
|
|
||||||
|
@ -198,6 +202,7 @@ private:
|
||||||
void DiagnosticHandler2(const DiagnosticInfo &DI);
|
void DiagnosticHandler2(const DiagnosticInfo &DI);
|
||||||
|
|
||||||
void emitError(const std::string &ErrMsg);
|
void emitError(const std::string &ErrMsg);
|
||||||
|
void emitWarning(const std::string &ErrMsg);
|
||||||
|
|
||||||
LLVMContext &Context;
|
LLVMContext &Context;
|
||||||
std::unique_ptr<Module> MergedModule;
|
std::unique_ptr<Module> MergedModule;
|
||||||
|
|
|
@ -351,7 +351,7 @@ std::unique_ptr<TargetMachine> LTOCodeGenerator::createTargetMachine() {
|
||||||
// If a linkonce global is present in the MustPreserveSymbols, we need to make
|
// 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
|
// sure we honor this. To force the compiler to not drop it, we add it to the
|
||||||
// "llvm.compiler.used" global.
|
// "llvm.compiler.used" global.
|
||||||
static void preserveDiscardableGVs(
|
void LTOCodeGenerator::preserveDiscardableGVs(
|
||||||
Module &TheModule,
|
Module &TheModule,
|
||||||
llvm::function_ref<bool(const GlobalValue &)> mustPreserveGV) {
|
llvm::function_ref<bool(const GlobalValue &)> mustPreserveGV) {
|
||||||
SetVector<Constant *> UsedValuesSet;
|
SetVector<Constant *> UsedValuesSet;
|
||||||
|
@ -368,7 +368,17 @@ static void preserveDiscardableGVs(
|
||||||
return;
|
return;
|
||||||
if (!mustPreserveGV(GV))
|
if (!mustPreserveGV(GV))
|
||||||
return;
|
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));
|
UsedValuesSet.insert(ConstantExpr::getBitCast(&GV, i8PTy));
|
||||||
};
|
};
|
||||||
for (auto &GV : TheModule)
|
for (auto &GV : TheModule)
|
||||||
|
@ -643,3 +653,10 @@ void LTOCodeGenerator::emitError(const std::string &ErrMsg) {
|
||||||
else
|
else
|
||||||
Context.diagnose(LTODiagnosticInfo(ErrMsg));
|
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));
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue