Contents of /trunk/rust/patches/rust-1.22.1-thinlto-llvm5-fixes.patch
Parent Directory | Revision Log
Revision 3059 -
(show annotations)
(download)
Fri Dec 29 10:05:56 2017 UTC (6 years, 9 months ago) by niro
File size: 3106 byte(s)
Fri Dec 29 10:05:56 2017 UTC (6 years, 9 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); |