annotate lib/Linker/LinkModules.cpp @ 124:4fa72497ed5d

fix
author mir3636
date Thu, 30 Nov 2017 20:04:56 +0900
parents 803732b1fca8
children c2174574ed3a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 //===- lib/Linker/LinkModules.cpp - Module Linker Implementation ----------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 // This file implements the LLVM module linker.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 //
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 //===----------------------------------------------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
14 #include "LinkDiagnosticInfo.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 #include "llvm-c/Linker.h"
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 #include "llvm/ADT/SetVector.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
17 #include "llvm/IR/Comdat.h"
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
18 #include "llvm/IR/DiagnosticPrinter.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
19 #include "llvm/IR/GlobalValue.h"
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
20 #include "llvm/IR/LLVMContext.h"
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
21 #include "llvm/IR/Module.h"
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
22 #include "llvm/Linker/Linker.h"
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
23 #include "llvm/Support/Error.h"
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 using namespace llvm;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 namespace {
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
27
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
28 /// This is an implementation class for the LinkModules function, which is the
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
29 /// entrypoint for this file.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
30 class ModuleLinker {
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
31 IRMover &Mover;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
32 std::unique_ptr<Module> SrcM;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
33
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
34 SetVector<GlobalValue *> ValuesToLink;
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
35
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
36 /// For symbol clashes, prefer those from Src.
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
37 unsigned Flags;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
38
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
39 /// List of global value names that should be internalized.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
40 StringSet<> Internalize;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
41
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
42 /// Function that will perform the actual internalization. The reason for a
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
43 /// callback is that the linker cannot call internalizeModule without
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
44 /// creating a circular dependency between IPO and the linker.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
45 std::function<void(Module &, const StringSet<> &)> InternalizeCallback;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
46
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
47 /// Used as the callback for lazy linking.
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
48 /// The mover has just hit GV and we have to decide if it, and other members
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
49 /// of the same comdat, should be linked. Every member to be linked is passed
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
50 /// to Add.
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
51 void addLazyFor(GlobalValue &GV, const IRMover::ValueAdder &Add);
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
52
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
53 bool shouldOverrideFromSrc() { return Flags & Linker::OverrideFromSrc; }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
54 bool shouldLinkOnlyNeeded() { return Flags & Linker::LinkOnlyNeeded; }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
55
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
56 bool shouldLinkFromSource(bool &LinkFromSrc, const GlobalValue &Dest,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
57 const GlobalValue &Src);
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
58
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
59 /// Should we have mover and linker error diag info?
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
60 bool emitError(const Twine &Message) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
61 SrcM->getContext().diagnose(LinkDiagnosticInfo(DS_Error, Message));
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
62 return true;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
63 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
64
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
65 bool getComdatLeader(Module &M, StringRef ComdatName,
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
66 const GlobalVariable *&GVar);
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
67 bool computeResultingSelectionKind(StringRef ComdatName,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
68 Comdat::SelectionKind Src,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
69 Comdat::SelectionKind Dst,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
70 Comdat::SelectionKind &Result,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
71 bool &LinkFromSrc);
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
72 std::map<const Comdat *, std::pair<Comdat::SelectionKind, bool>>
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
73 ComdatsChosen;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
74 bool getComdatResult(const Comdat *SrcC, Comdat::SelectionKind &SK,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
75 bool &LinkFromSrc);
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
76 // Keep track of the lazy linked global members of each comdat in source.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
77 DenseMap<const Comdat *, std::vector<GlobalValue *>> LazyComdatMembers;
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
78
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
79 /// Given a global in the source module, return the global in the
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
80 /// destination module that is being linked to, if any.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
81 GlobalValue *getLinkedToGlobal(const GlobalValue *SrcGV) {
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
82 Module &DstM = Mover.getModule();
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
83 // If the source has no name it can't link. If it has local linkage,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
84 // there is no name match-up going on.
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
85 if (!SrcGV->hasName() || GlobalValue::isLocalLinkage(SrcGV->getLinkage()))
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
86 return nullptr;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
88 // Otherwise see if we have a match in the destination module's symtab.
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
89 GlobalValue *DGV = DstM.getNamedValue(SrcGV->getName());
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
90 if (!DGV)
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
91 return nullptr;
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
92
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
93 // If we found a global with the same name in the dest module, but it has
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
94 // internal linkage, we are really not doing any linkage here.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
95 if (DGV->hasLocalLinkage())
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
96 return nullptr;
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
97
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
98 // Otherwise, we do in fact link to the destination global.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
99 return DGV;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
100 }
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
102 /// Drop GV if it is a member of a comdat that we are dropping.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
103 /// This can happen with COFF's largest selection kind.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
104 void dropReplacedComdat(GlobalValue &GV,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
105 const DenseSet<const Comdat *> &ReplacedDstComdats);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
106
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
107 bool linkIfNeeded(GlobalValue &GV);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
108
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
109 public:
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
110 ModuleLinker(IRMover &Mover, std::unique_ptr<Module> SrcM, unsigned Flags,
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
111 std::function<void(Module &, const StringSet<> &)>
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
112 InternalizeCallback = {})
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
113 : Mover(Mover), SrcM(std::move(SrcM)), Flags(Flags),
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
114 InternalizeCallback(std::move(InternalizeCallback)) {}
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
115
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
116 bool run();
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
117 };
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
118 }
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
119
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
120 static GlobalValue::VisibilityTypes
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
121 getMinVisibility(GlobalValue::VisibilityTypes A,
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
122 GlobalValue::VisibilityTypes B) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
123 if (A == GlobalValue::HiddenVisibility || B == GlobalValue::HiddenVisibility)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
124 return GlobalValue::HiddenVisibility;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
125 if (A == GlobalValue::ProtectedVisibility ||
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
126 B == GlobalValue::ProtectedVisibility)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
127 return GlobalValue::ProtectedVisibility;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
128 return GlobalValue::DefaultVisibility;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
129 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
130
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
131 bool ModuleLinker::getComdatLeader(Module &M, StringRef ComdatName,
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
132 const GlobalVariable *&GVar) {
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
133 const GlobalValue *GVal = M.getNamedValue(ComdatName);
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
134 if (const auto *GA = dyn_cast_or_null<GlobalAlias>(GVal)) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
135 GVal = GA->getBaseObject();
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
136 if (!GVal)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
137 // We cannot resolve the size of the aliasee yet.
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
138 return emitError("Linking COMDATs named '" + ComdatName +
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
139 "': COMDAT key involves incomputable alias size.");
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
140 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
141
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
142 GVar = dyn_cast_or_null<GlobalVariable>(GVal);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
143 if (!GVar)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
144 return emitError(
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
145 "Linking COMDATs named '" + ComdatName +
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
146 "': GlobalVariable required for data dependent selection!");
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
147
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
148 return false;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
149 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
150
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
151 bool ModuleLinker::computeResultingSelectionKind(StringRef ComdatName,
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
152 Comdat::SelectionKind Src,
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
153 Comdat::SelectionKind Dst,
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
154 Comdat::SelectionKind &Result,
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
155 bool &LinkFromSrc) {
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
156 Module &DstM = Mover.getModule();
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
157 // The ability to mix Comdat::SelectionKind::Any with
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
158 // Comdat::SelectionKind::Largest is a behavior that comes from COFF.
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
159 bool DstAnyOrLargest = Dst == Comdat::SelectionKind::Any ||
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
160 Dst == Comdat::SelectionKind::Largest;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
161 bool SrcAnyOrLargest = Src == Comdat::SelectionKind::Any ||
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
162 Src == Comdat::SelectionKind::Largest;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
163 if (DstAnyOrLargest && SrcAnyOrLargest) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
164 if (Dst == Comdat::SelectionKind::Largest ||
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
165 Src == Comdat::SelectionKind::Largest)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
166 Result = Comdat::SelectionKind::Largest;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
167 else
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
168 Result = Comdat::SelectionKind::Any;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
169 } else if (Src == Dst) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
170 Result = Dst;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
171 } else {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
172 return emitError("Linking COMDATs named '" + ComdatName +
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
173 "': invalid selection kinds!");
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
174 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
175
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
176 switch (Result) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
177 case Comdat::SelectionKind::Any:
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
178 // Go with Dst.
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
179 LinkFromSrc = false;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
180 break;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
181 case Comdat::SelectionKind::NoDuplicates:
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
182 return emitError("Linking COMDATs named '" + ComdatName +
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
183 "': noduplicates has been violated!");
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
184 case Comdat::SelectionKind::ExactMatch:
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
185 case Comdat::SelectionKind::Largest:
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
186 case Comdat::SelectionKind::SameSize: {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
187 const GlobalVariable *DstGV;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
188 const GlobalVariable *SrcGV;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
189 if (getComdatLeader(DstM, ComdatName, DstGV) ||
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
190 getComdatLeader(*SrcM, ComdatName, SrcGV))
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
191 return true;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
192
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
193 const DataLayout &DstDL = DstM.getDataLayout();
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
194 const DataLayout &SrcDL = SrcM->getDataLayout();
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
195 uint64_t DstSize = DstDL.getTypeAllocSize(DstGV->getValueType());
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
196 uint64_t SrcSize = SrcDL.getTypeAllocSize(SrcGV->getValueType());
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
197 if (Result == Comdat::SelectionKind::ExactMatch) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
198 if (SrcGV->getInitializer() != DstGV->getInitializer())
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
199 return emitError("Linking COMDATs named '" + ComdatName +
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
200 "': ExactMatch violated!");
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
201 LinkFromSrc = false;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
202 } else if (Result == Comdat::SelectionKind::Largest) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
203 LinkFromSrc = SrcSize > DstSize;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
204 } else if (Result == Comdat::SelectionKind::SameSize) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
205 if (SrcSize != DstSize)
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
206 return emitError("Linking COMDATs named '" + ComdatName +
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
207 "': SameSize violated!");
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
208 LinkFromSrc = false;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
209 } else {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
210 llvm_unreachable("unknown selection kind");
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
211 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
212 break;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
213 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
214 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
215
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
216 return false;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
217 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
218
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
219 bool ModuleLinker::getComdatResult(const Comdat *SrcC,
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
220 Comdat::SelectionKind &Result,
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
221 bool &LinkFromSrc) {
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
222 Module &DstM = Mover.getModule();
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
223 Comdat::SelectionKind SSK = SrcC->getSelectionKind();
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
224 StringRef ComdatName = SrcC->getName();
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
225 Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable();
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
226 Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(ComdatName);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
227
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
228 if (DstCI == ComdatSymTab.end()) {
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
229 // Use the comdat if it is only available in one of the modules.
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
230 LinkFromSrc = true;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
231 Result = SSK;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
232 return false;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
233 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
234
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
235 const Comdat *DstC = &DstCI->second;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
236 Comdat::SelectionKind DSK = DstC->getSelectionKind();
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
237 return computeResultingSelectionKind(ComdatName, SSK, DSK, Result,
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
238 LinkFromSrc);
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
239 }
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
240
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
241 bool ModuleLinker::shouldLinkFromSource(bool &LinkFromSrc,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
242 const GlobalValue &Dest,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
243 const GlobalValue &Src) {
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
244
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
245 // Should we unconditionally use the Src?
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
246 if (shouldOverrideFromSrc()) {
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
247 LinkFromSrc = true;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
248 return false;
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
249 }
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
250
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
251 // We always have to add Src if it has appending linkage.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
252 if (Src.hasAppendingLinkage()) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
253 LinkFromSrc = true;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
254 return false;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
255 }
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
256
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
257 bool SrcIsDeclaration = Src.isDeclarationForLinker();
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
258 bool DestIsDeclaration = Dest.isDeclarationForLinker();
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
259
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 if (SrcIsDeclaration) {
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
261 // If Src is external or if both Src & Dest are external.. Just link the
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
262 // external globals, we aren't adding anything.
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
263 if (Src.hasDLLImportStorageClass()) {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
264 // If one of GVs is marked as DLLImport, result should be dllimport'ed.
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
265 LinkFromSrc = DestIsDeclaration;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
266 return false;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
267 }
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
268 // If the Dest is weak, use the source linkage.
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
269 if (Dest.hasExternalWeakLinkage()) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
270 LinkFromSrc = true;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
271 return false;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
272 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
273 // Link an available_externally over a declaration.
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
274 LinkFromSrc = !Src.isDeclaration() && Dest.isDeclaration();
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
275 return false;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
276 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
277
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
278 if (DestIsDeclaration) {
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
279 // If Dest is external but Src is not:
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
280 LinkFromSrc = true;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
281 return false;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
282 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
283
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
284 if (Src.hasCommonLinkage()) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
285 if (Dest.hasLinkOnceLinkage() || Dest.hasWeakLinkage()) {
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
286 LinkFromSrc = true;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
287 return false;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
288 }
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
289
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
290 if (!Dest.hasCommonLinkage()) {
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
291 LinkFromSrc = false;
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
292 return false;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
293 }
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
294
95
afa8332a0e37 LLVM 3.8
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 83
diff changeset
295 const DataLayout &DL = Dest.getParent()->getDataLayout();
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
296 uint64_t DestSize = DL.getTypeAllocSize(Dest.getValueType());
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
297 uint64_t SrcSize = DL.getTypeAllocSize(Src.getValueType());
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
298 LinkFromSrc = SrcSize > DestSize;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
299 return false;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
300 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
301
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
302 if (Src.isWeakForLinker()) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
303 assert(!Dest.hasExternalWeakLinkage());
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
304 assert(!Dest.hasAvailableExternallyLinkage());
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
305
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
306 if (Dest.hasLinkOnceLinkage() && Src.hasWeakLinkage()) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
307 LinkFromSrc = true;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
308 return false;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
309 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
310
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
311 LinkFromSrc = false;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
312 return false;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
313 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
314
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
315 if (Dest.isWeakForLinker()) {
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
316 assert(Src.hasExternalLinkage());
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
317 LinkFromSrc = true;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
318 return false;
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
319 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
320
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
321 assert(!Src.hasExternalWeakLinkage());
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
322 assert(!Dest.hasExternalWeakLinkage());
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
323 assert(Dest.hasExternalLinkage() && Src.hasExternalLinkage() &&
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
324 "Unexpected linkage type!");
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
325 return emitError("Linking globals named '" + Src.getName() +
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
326 "': symbol multiply defined!");
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
327 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
328
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
329 bool ModuleLinker::linkIfNeeded(GlobalValue &GV) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
330 GlobalValue *DGV = getLinkedToGlobal(&GV);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
331
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
332 if (shouldLinkOnlyNeeded()) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
333 // Always import variables with appending linkage.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
334 if (!GV.hasAppendingLinkage()) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
335 // Don't import globals unless they are referenced by the destination
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
336 // module.
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
337 if (!DGV)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
338 return false;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
339 // Don't import globals that are already defined in the destination module
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
340 if (!DGV->isDeclaration())
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
341 return false;
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
342 }
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
343 }
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
344
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
345 if (DGV && !GV.hasLocalLinkage() && !GV.hasAppendingLinkage()) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
346 auto *DGVar = dyn_cast<GlobalVariable>(DGV);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
347 auto *SGVar = dyn_cast<GlobalVariable>(&GV);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
348 if (DGVar && SGVar) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
349 if (DGVar->isDeclaration() && SGVar->isDeclaration() &&
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
350 (!DGVar->isConstant() || !SGVar->isConstant())) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
351 DGVar->setConstant(false);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
352 SGVar->setConstant(false);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
353 }
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
354 if (DGVar->hasCommonLinkage() && SGVar->hasCommonLinkage()) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
355 unsigned Align = std::max(DGVar->getAlignment(), SGVar->getAlignment());
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
356 SGVar->setAlignment(Align);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
357 DGVar->setAlignment(Align);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
358 }
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
359 }
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
360
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
361 GlobalValue::VisibilityTypes Visibility =
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
362 getMinVisibility(DGV->getVisibility(), GV.getVisibility());
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
363 DGV->setVisibility(Visibility);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
364 GV.setVisibility(Visibility);
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
365
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
366 GlobalValue::UnnamedAddr UnnamedAddr = GlobalValue::getMinUnnamedAddr(
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
367 DGV->getUnnamedAddr(), GV.getUnnamedAddr());
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
368 DGV->setUnnamedAddr(UnnamedAddr);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
369 GV.setUnnamedAddr(UnnamedAddr);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
370 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
371
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
372 if (!DGV && !shouldOverrideFromSrc() &&
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
373 (GV.hasLocalLinkage() || GV.hasLinkOnceLinkage() ||
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
374 GV.hasAvailableExternallyLinkage()))
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
375 return false;
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
376
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
377 if (GV.isDeclaration())
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
378 return false;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
379
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
380 if (const Comdat *SC = GV.getComdat()) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
381 bool LinkFromSrc;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
382 Comdat::SelectionKind SK;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
383 std::tie(SK, LinkFromSrc) = ComdatsChosen[SC];
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
384 if (!LinkFromSrc)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
385 return false;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
386 }
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
387
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
388 bool LinkFromSrc = true;
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
389 if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, GV))
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
390 return true;
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
391 if (LinkFromSrc)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
392 ValuesToLink.insert(&GV);
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
393 return false;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
394 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
395
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
396 void ModuleLinker::addLazyFor(GlobalValue &GV, const IRMover::ValueAdder &Add) {
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
397 // Add these to the internalize list
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
398 if (!GV.hasLinkOnceLinkage() && !GV.hasAvailableExternallyLinkage() &&
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
399 !shouldLinkOnlyNeeded())
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
400 return;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
401
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
402 if (InternalizeCallback)
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
403 Internalize.insert(GV.getName());
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
404 Add(GV);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
405
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
406 const Comdat *SC = GV.getComdat();
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
407 if (!SC)
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
408 return;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
409 for (GlobalValue *GV2 : LazyComdatMembers[SC]) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
410 GlobalValue *DGV = getLinkedToGlobal(GV2);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
411 bool LinkFromSrc = true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
412 if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, *GV2))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
413 return;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
414 if (!LinkFromSrc)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
415 continue;
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
416 if (InternalizeCallback)
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
417 Internalize.insert(GV2->getName());
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
418 Add(*GV2);
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
419 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
420 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
421
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
422 void ModuleLinker::dropReplacedComdat(
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
423 GlobalValue &GV, const DenseSet<const Comdat *> &ReplacedDstComdats) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
424 Comdat *C = GV.getComdat();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
425 if (!C)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
426 return;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
427 if (!ReplacedDstComdats.count(C))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
428 return;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
429 if (GV.use_empty()) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
430 GV.eraseFromParent();
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
431 return;
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
432 }
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
433
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
434 if (auto *F = dyn_cast<Function>(&GV)) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
435 F->deleteBody();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
436 } else if (auto *Var = dyn_cast<GlobalVariable>(&GV)) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
437 Var->setInitializer(nullptr);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
438 } else {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
439 auto &Alias = cast<GlobalAlias>(GV);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
440 Module &M = *Alias.getParent();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
441 PointerType &Ty = *cast<PointerType>(Alias.getType());
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
442 GlobalValue *Declaration;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
443 if (auto *FTy = dyn_cast<FunctionType>(Alias.getValueType())) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
444 Declaration = Function::Create(FTy, GlobalValue::ExternalLinkage, "", &M);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
445 } else {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
446 Declaration =
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
447 new GlobalVariable(M, Ty.getElementType(), /*isConstant*/ false,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
448 GlobalValue::ExternalLinkage,
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
449 /*Initializer*/ nullptr);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
450 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
451 Declaration->takeName(&Alias);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
452 Alias.replaceAllUsesWith(Declaration);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
453 Alias.eraseFromParent();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
454 }
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
455 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
456
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
457 bool ModuleLinker::run() {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
458 Module &DstM = Mover.getModule();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
459 DenseSet<const Comdat *> ReplacedDstComdats;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
460
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
461 for (const auto &SMEC : SrcM->getComdatSymbolTable()) {
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
462 const Comdat &C = SMEC.getValue();
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
463 if (ComdatsChosen.count(&C))
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
464 continue;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
465 Comdat::SelectionKind SK;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
466 bool LinkFromSrc;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
467 if (getComdatResult(&C, SK, LinkFromSrc))
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
468 return true;
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
469 ComdatsChosen[&C] = std::make_pair(SK, LinkFromSrc);
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
470
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
471 if (!LinkFromSrc)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
472 continue;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
473
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
474 Module::ComdatSymTabType &ComdatSymTab = DstM.getComdatSymbolTable();
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
475 Module::ComdatSymTabType::iterator DstCI = ComdatSymTab.find(C.getName());
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
476 if (DstCI == ComdatSymTab.end())
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
477 continue;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
478
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
479 // The source comdat is replacing the dest one.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
480 const Comdat *DstC = &DstCI->second;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
481 ReplacedDstComdats.insert(DstC);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
482 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
483
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
484 // Alias have to go first, since we are not able to find their comdats
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
485 // otherwise.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
486 for (auto I = DstM.alias_begin(), E = DstM.alias_end(); I != E;) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
487 GlobalAlias &GV = *I++;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
488 dropReplacedComdat(GV, ReplacedDstComdats);
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
489 }
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
490
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
491 for (auto I = DstM.global_begin(), E = DstM.global_end(); I != E;) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
492 GlobalVariable &GV = *I++;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
493 dropReplacedComdat(GV, ReplacedDstComdats);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
494 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
495
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
496 for (auto I = DstM.begin(), E = DstM.end(); I != E;) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
497 Function &GV = *I++;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
498 dropReplacedComdat(GV, ReplacedDstComdats);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
499 }
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
500
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
501 for (GlobalVariable &GV : SrcM->globals())
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
502 if (GV.hasLinkOnceLinkage())
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
503 if (const Comdat *SC = GV.getComdat())
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
504 LazyComdatMembers[SC].push_back(&GV);
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
505
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
506 for (Function &SF : *SrcM)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
507 if (SF.hasLinkOnceLinkage())
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
508 if (const Comdat *SC = SF.getComdat())
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
509 LazyComdatMembers[SC].push_back(&SF);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
510
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
511 for (GlobalAlias &GA : SrcM->aliases())
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
512 if (GA.hasLinkOnceLinkage())
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
513 if (const Comdat *SC = GA.getComdat())
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
514 LazyComdatMembers[SC].push_back(&GA);
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
515
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
516 // Insert all of the globals in src into the DstM module... without linking
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
517 // initializers (which could refer to functions not yet mapped over).
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
518 for (GlobalVariable &GV : SrcM->globals())
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
519 if (linkIfNeeded(GV))
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
520 return true;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
521
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
522 for (Function &SF : *SrcM)
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
523 if (linkIfNeeded(SF))
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
524 return true;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
525
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
526 for (GlobalAlias &GA : SrcM->aliases())
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
527 if (linkIfNeeded(GA))
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
528 return true;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
529
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
530 for (unsigned I = 0; I < ValuesToLink.size(); ++I) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
531 GlobalValue *GV = ValuesToLink[I];
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
532 const Comdat *SC = GV->getComdat();
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
533 if (!SC)
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
534 continue;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
535 for (GlobalValue *GV2 : LazyComdatMembers[SC]) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
536 GlobalValue *DGV = getLinkedToGlobal(GV2);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
537 bool LinkFromSrc = true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
538 if (DGV && shouldLinkFromSource(LinkFromSrc, *DGV, *GV2))
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
539 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
540 if (LinkFromSrc)
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
541 ValuesToLink.insert(GV2);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
542 }
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
543 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
544
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
545 if (InternalizeCallback) {
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
546 for (GlobalValue *GV : ValuesToLink)
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
547 Internalize.insert(GV->getName());
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
548 }
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
549
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
550 // FIXME: Propagate Errors through to the caller instead of emitting
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
551 // diagnostics.
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
552 bool HasErrors = false;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
553 if (Error E = Mover.move(std::move(SrcM), ValuesToLink.getArrayRef(),
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
554 [this](GlobalValue &GV, IRMover::ValueAdder Add) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
555 addLazyFor(GV, Add);
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
556 },
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
557 /* IsPerformingImport */ false)) {
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
558 handleAllErrors(std::move(E), [&](ErrorInfoBase &EIB) {
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
559 DstM.getContext().diagnose(LinkDiagnosticInfo(DS_Error, EIB.message()));
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
560 HasErrors = true;
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
561 });
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
562 }
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
563 if (HasErrors)
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
564 return true;
120
1172e4bd9c6f update 4.0.0
mir3636
parents: 100
diff changeset
565
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
566 if (InternalizeCallback)
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
567 InternalizeCallback(DstM, Internalize);
77
54457678186b LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
568
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
569 return false;
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
570 }
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
571
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
572 Linker::Linker(Module &M) : Mover(M) {}
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
573
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
574 bool Linker::linkInModule(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
575 std::unique_ptr<Module> Src, unsigned Flags,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
576 std::function<void(Module &, const StringSet<> &)> InternalizeCallback) {
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
577 ModuleLinker ModLinker(Mover, std::move(Src), Flags,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
578 std::move(InternalizeCallback));
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
579 return ModLinker.run();
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
580 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
581
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
582 //===----------------------------------------------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
583 // LinkModules entrypoint.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
584 //===----------------------------------------------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
585
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
586 /// This function links two modules together, with the resulting Dest module
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
587 /// modified to be the composite of the two input modules. If an error occurs,
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
588 /// true is returned and ErrorMsg (if not null) is set to indicate the problem.
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
589 /// Upon failure, the Dest module could be in a modified state, and shouldn't be
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
590 /// relied on to be consistent.
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
591 bool Linker::linkModules(
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
592 Module &Dest, std::unique_ptr<Module> Src, unsigned Flags,
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
593 std::function<void(Module &, const StringSet<> &)> InternalizeCallback) {
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
594 Linker L(Dest);
121
803732b1fca8 LLVM 5.0
kono
parents: 120
diff changeset
595 return L.linkInModule(std::move(Src), Flags, std::move(InternalizeCallback));
83
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
596 }
60c9769439b8 LLVM 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 77
diff changeset
597
0
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
598 //===----------------------------------------------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
599 // C API.
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
600 //===----------------------------------------------------------------------===//
95c75e76d11b LLVM 3.4
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
601
100
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
602 LLVMBool LLVMLinkModules2(LLVMModuleRef Dest, LLVMModuleRef Src) {
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
603 Module *D = unwrap(Dest);
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
604 std::unique_ptr<Module> M(unwrap(Src));
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
605 return Linker::linkModules(*D, std::move(M));
7d135dc70f03 LLVM 3.9
Miyagi Mitsuki <e135756@ie.u-ryukyu.ac.jp>
parents: 95
diff changeset
606 }