Update ThinLTO for LLVM 5
This commit is contained in:
parent
90691c8c1f
commit
56f5a19e45
1 changed files with 38 additions and 1 deletions
|
@ -26,11 +26,13 @@
|
|||
#include "llvm/Transforms/IPO/PassManagerBuilder.h"
|
||||
|
||||
#if LLVM_VERSION_GE(4, 0)
|
||||
#include "llvm/Object/ModuleSummaryIndexObjectFile.h"
|
||||
#include "llvm/Transforms/IPO/AlwaysInliner.h"
|
||||
#include "llvm/Transforms/IPO/FunctionImport.h"
|
||||
#include "llvm/Transforms/Utils/FunctionImportUtils.h"
|
||||
#include "llvm/LTO/LTO.h"
|
||||
#if LLVM_VERSION_LE(4, 0)
|
||||
#include "llvm/Object/ModuleSummaryIndexObjectFile.h"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "llvm-c/Transforms/PassManagerBuilder.h"
|
||||
|
@ -888,6 +890,28 @@ addPreservedGUID(const ModuleSummaryIndex &Index,
|
|||
return;
|
||||
Preserved.insert(GUID);
|
||||
|
||||
#if LLVM_VERSION_GE(5, 0)
|
||||
auto Info = Index.getValueInfo(GUID);
|
||||
if (!Info) {
|
||||
return;
|
||||
}
|
||||
for (auto &Summary : Info.getSummaryList()) {
|
||||
for (auto &Ref : Summary->refs()) {
|
||||
addPreservedGUID(Index, Preserved, Ref.getGUID());
|
||||
}
|
||||
|
||||
GlobalValueSummary *GVSummary = Summary.get();
|
||||
if (isa<FunctionSummary>(GVSummary)) {
|
||||
FunctionSummary *FS = cast<FunctionSummary>(GVSummary);
|
||||
for (auto &Call: FS->calls()) {
|
||||
addPreservedGUID(Index, Preserved, Call.first.getGUID());
|
||||
}
|
||||
for (auto &GUID: FS->type_tests()) {
|
||||
addPreservedGUID(Index, Preserved, GUID);
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
auto SummaryList = Index.findGlobalValueSummaryList(GUID);
|
||||
if (SummaryList == Index.end())
|
||||
return;
|
||||
|
@ -919,6 +943,7 @@ addPreservedGUID(const ModuleSummaryIndex &Index,
|
|||
addPreservedGUID(Index, Preserved, GUID);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// The main entry point for creating the global ThinLTO analysis. The structure
|
||||
|
@ -939,6 +964,12 @@ LLVMRustCreateThinLTOData(LLVMRustThinLTOModule *modules,
|
|||
|
||||
Ret->ModuleMap[module->identifier] = mem_buffer;
|
||||
|
||||
#if LLVM_VERSION_GE(5, 0)
|
||||
if (Error Err = readModuleSummaryIndex(mem_buffer, Ret->Index, i)) {
|
||||
LLVMRustSetLastError(toString(std::move(Err)).c_str());
|
||||
return nullptr;
|
||||
}
|
||||
#else
|
||||
Expected<std::unique_ptr<object::ModuleSummaryIndexObjectFile>> ObjOrErr =
|
||||
object::ModuleSummaryIndexObjectFile::create(mem_buffer);
|
||||
if (!ObjOrErr) {
|
||||
|
@ -947,6 +978,7 @@ LLVMRustCreateThinLTOData(LLVMRustThinLTOModule *modules,
|
|||
}
|
||||
auto Index = (*ObjOrErr)->takeIndex();
|
||||
Ret->Index.mergeFrom(std::move(Index), i);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Collect for each module the list of function it defines (GUID -> Summary)
|
||||
|
@ -981,8 +1013,13 @@ LLVMRustCreateThinLTOData(LLVMRustThinLTOModule *modules,
|
|||
StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>> ResolvedODR;
|
||||
DenseMap<GlobalValue::GUID, const GlobalValueSummary *> PrevailingCopy;
|
||||
for (auto &I : Ret->Index) {
|
||||
#if LLVM_VERSION_GE(5, 0)
|
||||
if (I.second.SummaryList.size() > 1)
|
||||
PrevailingCopy[I.first] = getFirstDefinitionForLinker(I.second.SummaryList);
|
||||
#else
|
||||
if (I.second.size() > 1)
|
||||
PrevailingCopy[I.first] = getFirstDefinitionForLinker(I.second);
|
||||
#endif
|
||||
}
|
||||
auto isPrevailing = [&](GlobalValue::GUID GUID, const GlobalValueSummary *S) {
|
||||
const auto &Prevailing = PrevailingCopy.find(GUID);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue