Magellan Linux

Contents of /trunk/rust/patches/rust-1.22.1-thinlto-llvm5-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3059 - (show annotations) (download)
Fri Dec 29 10:05:56 2017 UTC (6 years, 4 months ago) by niro
File size: 3106 byte(s)
-added thinlto llvm5 fixes patch
1 --- rustc-1.22.1-src/src/rustllvm/PassWrapper.cpp 2017-11-22 22:33:00.000000000 +0100
2 +++ rustc-1.22.1-src-llvm5/src/rustllvm/PassWrapper.cpp 2017-12-29 11:02:21.761588941 +0100
3 @@ -26,11 +26,13 @@
4 #include "llvm/Transforms/IPO/PassManagerBuilder.h"
5
6 #if LLVM_VERSION_GE(4, 0)
7 -#include "llvm/Object/ModuleSummaryIndexObjectFile.h"
8 #include "llvm/Transforms/IPO/AlwaysInliner.h"
9 #include "llvm/Transforms/IPO/FunctionImport.h"
10 #include "llvm/Transforms/Utils/FunctionImportUtils.h"
11 #include "llvm/LTO/LTO.h"
12 +#if LLVM_VERSION_LE(4, 0)
13 +#include "llvm/Object/ModuleSummaryIndexObjectFile.h"
14 +#endif
15 #endif
16
17 #include "llvm-c/Transforms/PassManagerBuilder.h"
18 @@ -888,6 +890,33 @@
19 return;
20 Preserved.insert(GUID);
21
22 +#if LLVM_VERSION_GE(5, 0)
23 + auto Info = Index.getValueInfo(GUID);
24 + if (!Info) {
25 + return;
26 + }
27 + for (auto &Summary : Info.getSummaryList()) {
28 + for (auto &Ref : Summary->refs()) {
29 + addPreservedGUID(Index, Preserved, Ref.getGUID());
30 + }
31 +
32 + GlobalValueSummary *GVSummary = Summary.get();
33 + if (isa<FunctionSummary>(GVSummary)) {
34 + auto *FS = cast<FunctionSummary>(GVSummary);
35 + for (auto &Call: FS->calls()) {
36 + addPreservedGUID(Index, Preserved, Call.first.getGUID());
37 + }
38 + for (auto &GUID: FS->type_tests()) {
39 + addPreservedGUID(Index, Preserved, GUID);
40 + }
41 + }
42 + if (isa<AliasSummary>(GVSummary)) {
43 + auto *AS = cast<AliasSummary>(GVSummary);
44 + auto GUID = AS->getAliasee().getOriginalName();
45 + addPreservedGUID(Index, Preserved, GUID);
46 + }
47 + }
48 +#else
49 auto SummaryList = Index.findGlobalValueSummaryList(GUID);
50 if (SummaryList == Index.end())
51 return;
52 @@ -917,6 +946,7 @@
53 }
54 }
55 }
56 +#endif
57 }
58
59 // The main entry point for creating the global ThinLTO analysis. The structure
60 @@ -937,6 +967,12 @@
61
62 Ret->ModuleMap[module->identifier] = mem_buffer;
63
64 +#if LLVM_VERSION_GE(5, 0)
65 + if (Error Err = readModuleSummaryIndex(mem_buffer, Ret->Index, i)) {
66 + LLVMRustSetLastError(toString(std::move(Err)).c_str());
67 + return nullptr;
68 + }
69 +#else
70 Expected<std::unique_ptr<object::ModuleSummaryIndexObjectFile>> ObjOrErr =
71 object::ModuleSummaryIndexObjectFile::create(mem_buffer);
72 if (!ObjOrErr) {
73 @@ -945,6 +981,7 @@
74 }
75 auto Index = (*ObjOrErr)->takeIndex();
76 Ret->Index.mergeFrom(std::move(Index), i);
77 +#endif
78 }
79
80 // Collect for each module the list of function it defines (GUID -> Summary)
81 @@ -978,8 +1015,13 @@
82 StringMap<std::map<GlobalValue::GUID, GlobalValue::LinkageTypes>> ResolvedODR;
83 DenseMap<GlobalValue::GUID, const GlobalValueSummary *> PrevailingCopy;
84 for (auto &I : Ret->Index) {
85 +#if LLVM_VERSION_GE(5, 0)
86 + if (I.second.SummaryList.size() > 1)
87 + PrevailingCopy[I.first] = getFirstDefinitionForLinker(I.second.SummaryList);
88 +#else
89 if (I.second.size() > 1)
90 PrevailingCopy[I.first] = getFirstDefinitionForLinker(I.second);
91 +#endif
92 }
93 auto isPrevailing = [&](GlobalValue::GUID GUID, const GlobalValueSummary *S) {
94 const auto &Prevailing = PrevailingCopy.find(GUID);