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