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:
Mehdi Amini 2016-05-05 20:05:33 +00:00
parent 62de33c2db
commit 8eb3397a73
2 changed files with 24 additions and 2 deletions

View File

@ -190,6 +190,10 @@ private:
bool compileOptimizedToFile(const char **Name);
void restoreLinkageForExternals();
void applyScopeRestrictions();
void preserveDiscardableGVs(
Module &TheModule,
llvm::function_ref<bool(const GlobalValue &)> mustPreserveGV);
bool determineTarget();
std::unique_ptr<TargetMachine> 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<Module> MergedModule;

View File

@ -351,7 +351,7 @@ std::unique_ptr<TargetMachine> 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<bool(const GlobalValue &)> mustPreserveGV) {
SetVector<Constant *> 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));
}