From 56f5a19e4561434919ecda627c5409a3b16ba1d0 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Tue, 10 Oct 2017 12:29:14 -0700 Subject: [PATCH 1/2] Update ThinLTO for LLVM 5 --- src/rustllvm/PassWrapper.cpp | 39 +++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/rustllvm/PassWrapper.cpp b/src/rustllvm/PassWrapper.cpp index 1287b94159a57..c7d966fcdfdd5 100644 --- a/src/rustllvm/PassWrapper.cpp +++ b/src/rustllvm/PassWrapper.cpp @@ -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(GVSummary)) { + FunctionSummary *FS = cast(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> 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> ResolvedODR; DenseMap 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); From 3efa00365fc13f3145b143ee41b90fb5405b334f Mon Sep 17 00:00:00 2001 From: Tatsuyuki Ishi Date: Tue, 17 Oct 2017 14:41:56 +0900 Subject: [PATCH 2/2] Update ThinLTO (internalization) for LLVM 5 Ref: https://github.com/llvm-mirror/llvm/commit/ccb80b9c0f60f33780e5e29bf66a87bb56968b99 --- src/rustllvm/PassWrapper.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/rustllvm/PassWrapper.cpp b/src/rustllvm/PassWrapper.cpp index c7d966fcdfdd5..b397ad1e98f74 100644 --- a/src/rustllvm/PassWrapper.cpp +++ b/src/rustllvm/PassWrapper.cpp @@ -902,7 +902,7 @@ addPreservedGUID(const ModuleSummaryIndex &Index, GlobalValueSummary *GVSummary = Summary.get(); if (isa(GVSummary)) { - FunctionSummary *FS = cast(GVSummary); + auto *FS = cast(GVSummary); for (auto &Call: FS->calls()) { addPreservedGUID(Index, Preserved, Call.first.getGUID()); } @@ -910,6 +910,11 @@ addPreservedGUID(const ModuleSummaryIndex &Index, addPreservedGUID(Index, Preserved, GUID); } } + if (isa(GVSummary)) { + auto *AS = cast(GVSummary); + auto GUID = AS->getAliasee().getOriginalName(); + addPreservedGUID(Index, Preserved, GUID); + } } #else auto SummaryList = Index.findGlobalValueSummaryList(GUID); @@ -997,6 +1002,15 @@ LLVMRustCreateThinLTOData(LLVMRustThinLTOModule *modules, // combined index // // This is copied from `lib/LTO/ThinLTOCodeGenerator.cpp` +#if LLVM_VERSION_GE(5, 0) + computeDeadSymbols(Ret->Index, Ret->GUIDPreservedSymbols); + ComputeCrossModuleImport( + Ret->Index, + Ret->ModuleToDefinedGVSummaries, + Ret->ImportLists, + Ret->ExportLists + ); +#else auto DeadSymbols = computeDeadSymbols(Ret->Index, Ret->GUIDPreservedSymbols); ComputeCrossModuleImport( Ret->Index, @@ -1005,6 +1019,7 @@ LLVMRustCreateThinLTOData(LLVMRustThinLTOModule *modules, Ret->ExportLists, &DeadSymbols ); +#endif // Resolve LinkOnce/Weak symbols, this has to be computed early be cause it // impacts the caching.