1c94d393aSSam Clegg //===- SymbolTable.cpp ----------------------------------------------------===//
2c94d393aSSam Clegg //
3c94d393aSSam Clegg //                             The LLVM Linker
4c94d393aSSam Clegg //
5c94d393aSSam Clegg // This file is distributed under the University of Illinois Open Source
6c94d393aSSam Clegg // License. See LICENSE.TXT for details.
7c94d393aSSam Clegg //
8c94d393aSSam Clegg //===----------------------------------------------------------------------===//
9c94d393aSSam Clegg 
10c94d393aSSam Clegg #include "SymbolTable.h"
11c94d393aSSam Clegg #include "Config.h"
125fa274beSSam Clegg #include "InputChunks.h"
1393102974SSam Clegg #include "InputGlobal.h"
14b8621596SSam Clegg #include "WriterUtils.h"
15c94d393aSSam Clegg #include "lld/Common/ErrorHandler.h"
162017d52bSRui Ueyama #include "lld/Common/Memory.h"
177d67dd11SRui Ueyama #include "llvm/ADT/SetVector.h"
18c94d393aSSam Clegg 
19c94d393aSSam Clegg #define DEBUG_TYPE "lld"
20c94d393aSSam Clegg 
21c94d393aSSam Clegg using namespace llvm;
2220db381bSSam Clegg using namespace llvm::wasm;
23c94d393aSSam Clegg using namespace lld;
24c94d393aSSam Clegg using namespace lld::wasm;
25c94d393aSSam Clegg 
26c94d393aSSam Clegg SymbolTable *lld::wasm::Symtab;
27c94d393aSSam Clegg 
28c94d393aSSam Clegg void SymbolTable::addFile(InputFile *File) {
29c94d393aSSam Clegg   log("Processing: " + toString(File));
30c94d393aSSam Clegg   File->parse();
31c94d393aSSam Clegg 
32c729c1b4SSam Clegg   // LLVM bitcode file
33c729c1b4SSam Clegg   if (auto *F = dyn_cast<BitcodeFile>(File))
34c729c1b4SSam Clegg     BitcodeFiles.push_back(F);
35c729c1b4SSam Clegg   else if (auto *F = dyn_cast<ObjFile>(File))
36c94d393aSSam Clegg     ObjectFiles.push_back(F);
37c94d393aSSam Clegg }
38c94d393aSSam Clegg 
39c729c1b4SSam Clegg // This function is where all the optimizations of link-time
40c729c1b4SSam Clegg // optimization happens. When LTO is in use, some input files are
41c729c1b4SSam Clegg // not in native object file format but in the LLVM bitcode format.
42c729c1b4SSam Clegg // This function compiles bitcode files into a few big native files
43c729c1b4SSam Clegg // using LLVM functions and replaces bitcode symbols with the results.
44c729c1b4SSam Clegg // Because all bitcode files that the program consists of are passed
45c729c1b4SSam Clegg // to the compiler at once, it can do whole-program optimization.
46c729c1b4SSam Clegg void SymbolTable::addCombinedLTOObject() {
47c729c1b4SSam Clegg   if (BitcodeFiles.empty())
48c729c1b4SSam Clegg     return;
49c729c1b4SSam Clegg 
50c729c1b4SSam Clegg   // Compile bitcode files and replace bitcode symbols.
51c729c1b4SSam Clegg   LTO.reset(new BitcodeCompiler);
52c729c1b4SSam Clegg   for (BitcodeFile *F : BitcodeFiles)
53c729c1b4SSam Clegg     LTO->add(*F);
54c729c1b4SSam Clegg 
55c729c1b4SSam Clegg   for (StringRef Filename : LTO->compile()) {
56c729c1b4SSam Clegg     auto *Obj = make<ObjFile>(MemoryBufferRef(Filename, "lto.tmp"));
57c729c1b4SSam Clegg     Obj->parse();
58c729c1b4SSam Clegg     ObjectFiles.push_back(Obj);
59c729c1b4SSam Clegg   }
60c729c1b4SSam Clegg }
61c729c1b4SSam Clegg 
62c94d393aSSam Clegg void SymbolTable::reportRemainingUndefines() {
637d67dd11SRui Ueyama   SetVector<Symbol *> Undefs;
6474fe0ba1SSam Clegg   for (Symbol *Sym : SymVector) {
65c729c1b4SSam Clegg     if (!Sym->isUndefined() || Sym->isWeak())
66c729c1b4SSam Clegg       continue;
67c729c1b4SSam Clegg     if (Config->AllowUndefinedSymbols.count(Sym->getName()) != 0)
68c729c1b4SSam Clegg       continue;
69c729c1b4SSam Clegg     if (!Sym->IsUsedInRegularObj)
70c729c1b4SSam Clegg       continue;
71c94d393aSSam Clegg     Undefs.insert(Sym);
72c94d393aSSam Clegg   }
73c94d393aSSam Clegg 
74c94d393aSSam Clegg   if (Undefs.empty())
75c94d393aSSam Clegg     return;
76c94d393aSSam Clegg 
77c94d393aSSam Clegg   for (ObjFile *File : ObjectFiles)
78c94d393aSSam Clegg     for (Symbol *Sym : File->getSymbols())
79c94d393aSSam Clegg       if (Undefs.count(Sym))
80c94d393aSSam Clegg         error(toString(File) + ": undefined symbol: " + toString(*Sym));
81c94d393aSSam Clegg 
82c94d393aSSam Clegg   for (Symbol *Sym : Undefs)
83c94d393aSSam Clegg     if (!Sym->getFile())
84c94d393aSSam Clegg       error("undefined symbol: " + toString(*Sym));
85c94d393aSSam Clegg }
86c94d393aSSam Clegg 
87c94d393aSSam Clegg Symbol *SymbolTable::find(StringRef Name) {
8867d6908fSRui Ueyama   return SymMap.lookup(CachedHashStringRef(Name));
89c94d393aSSam Clegg }
90c94d393aSSam Clegg 
91c94d393aSSam Clegg std::pair<Symbol *, bool> SymbolTable::insert(StringRef Name) {
92a80d94d5SSam Clegg   Symbol *&Sym = SymMap[CachedHashStringRef(Name)];
93c94d393aSSam Clegg   if (Sym)
94c94d393aSSam Clegg     return {Sym, false};
95dfb0b2c7SSam Clegg   Sym = reinterpret_cast<Symbol *>(make<SymbolUnion>());
96c729c1b4SSam Clegg   Sym->IsUsedInRegularObj = false;
9774fe0ba1SSam Clegg   SymVector.emplace_back(Sym);
98c94d393aSSam Clegg   return {Sym, true};
99c94d393aSSam Clegg }
100c94d393aSSam Clegg 
101e3498ec5SRui Ueyama static void reportTypeError(const Symbol *Existing, const InputFile *File,
1023876d89aSSam Clegg                             llvm::wasm::WasmSymbolType Type) {
103e3498ec5SRui Ueyama   error("symbol type mismatch: " + toString(*Existing) + "\n>>> defined as " +
104e3498ec5SRui Ueyama         toString(Existing->getWasmType()) + " in " +
1053876d89aSSam Clegg         toString(Existing->getFile()) + "\n>>> defined as " + toString(Type) +
1063876d89aSSam Clegg         " in " + toString(File));
107e3498ec5SRui Ueyama }
108e3498ec5SRui Ueyama 
109*cefbf9acSSam Clegg static void checkFunctionType(Symbol *Existing, const InputFile *File,
110e3498ec5SRui Ueyama                               const WasmSignature *NewSig) {
11165d6380cSSam Clegg   auto ExistingFunction = dyn_cast<FunctionSymbol>(Existing);
11265d6380cSSam Clegg   if (!ExistingFunction) {
1133876d89aSSam Clegg     reportTypeError(Existing, File, WASM_SYMBOL_TYPE_FUNCTION);
114e3498ec5SRui Ueyama     return;
115e3498ec5SRui Ueyama   }
116e3498ec5SRui Ueyama 
117*cefbf9acSSam Clegg   if (!NewSig)
118*cefbf9acSSam Clegg     return;
119*cefbf9acSSam Clegg 
120*cefbf9acSSam Clegg   const WasmSignature *OldSig = ExistingFunction->FunctionType;
121*cefbf9acSSam Clegg   if (!OldSig) {
122*cefbf9acSSam Clegg     ExistingFunction->FunctionType = NewSig;
123*cefbf9acSSam Clegg     return;
124*cefbf9acSSam Clegg   }
125*cefbf9acSSam Clegg 
126*cefbf9acSSam Clegg   if (*NewSig != *OldSig)
127ffd0aaf8SSam Clegg     warn("function signature mismatch: " + Existing->getName() +
128e3498ec5SRui Ueyama          "\n>>> defined as " + toString(*OldSig) + " in " +
129e3498ec5SRui Ueyama          toString(Existing->getFile()) + "\n>>> defined as " +
130ffd0aaf8SSam Clegg          toString(*NewSig) + " in " + toString(File));
131e3498ec5SRui Ueyama }
132e3498ec5SRui Ueyama 
133b8621596SSam Clegg // Check the type of new symbol matches that of the symbol is replacing.
134b8621596SSam Clegg // For functions this can also involve verifying that the signatures match.
135e3498ec5SRui Ueyama static void checkGlobalType(const Symbol *Existing, const InputFile *File,
136e3498ec5SRui Ueyama                             const WasmGlobalType *NewType) {
137e3498ec5SRui Ueyama   if (!isa<GlobalSymbol>(Existing)) {
1383876d89aSSam Clegg     reportTypeError(Existing, File, WASM_SYMBOL_TYPE_GLOBAL);
139b8621596SSam Clegg     return;
140b8621596SSam Clegg   }
141b8621596SSam Clegg 
142e3498ec5SRui Ueyama   const WasmGlobalType *OldType = cast<GlobalSymbol>(Existing)->getGlobalType();
143e3498ec5SRui Ueyama   if (*NewType != *OldType) {
144e3498ec5SRui Ueyama     error("Global type mismatch: " + Existing->getName() + "\n>>> defined as " +
145e3498ec5SRui Ueyama           toString(*OldType) + " in " + toString(Existing->getFile()) +
146e3498ec5SRui Ueyama           "\n>>> defined as " + toString(*NewType) + " in " + toString(File));
147c94d393aSSam Clegg   }
14824b3dcd4SSam Clegg }
14924b3dcd4SSam Clegg 
150e3498ec5SRui Ueyama static void checkDataType(const Symbol *Existing, const InputFile *File) {
151e3498ec5SRui Ueyama   if (!isa<DataSymbol>(Existing))
1523876d89aSSam Clegg     reportTypeError(Existing, File, WASM_SYMBOL_TYPE_DATA);
153e3498ec5SRui Ueyama }
154e3498ec5SRui Ueyama 
155dfb0b2c7SSam Clegg DefinedFunction *SymbolTable::addSyntheticFunction(StringRef Name,
156ebda41f8SNicholas Wilson                                                    uint32_t Flags,
157ebda41f8SNicholas Wilson                                                    InputFunction *Function) {
158e7245b42SNicola Zaghen   LLVM_DEBUG(dbgs() << "addSyntheticFunction: " << Name << "\n");
159b961abc8SRui Ueyama   assert(!find(Name));
160ebda41f8SNicholas Wilson   SyntheticFunctions.emplace_back(Function);
161ebda41f8SNicholas Wilson   return replaceSymbol<DefinedFunction>(insert(Name).first, Name, Flags,
162ebda41f8SNicholas Wilson                                         nullptr, Function);
16350686856SSam Clegg }
16450686856SSam Clegg 
16500245539SSam Clegg DefinedData *SymbolTable::addSyntheticDataSymbol(StringRef Name,
16600245539SSam Clegg                                                  uint32_t Flags) {
167e7245b42SNicola Zaghen   LLVM_DEBUG(dbgs() << "addSyntheticDataSymbol: " << Name << "\n");
168b961abc8SRui Ueyama   assert(!find(Name));
169b961abc8SRui Ueyama   return replaceSymbol<DefinedData>(insert(Name).first, Name, Flags);
170c94d393aSSam Clegg }
171c94d393aSSam Clegg 
17293102974SSam Clegg DefinedGlobal *SymbolTable::addSyntheticGlobal(StringRef Name, uint32_t Flags,
17393102974SSam Clegg                                                InputGlobal *Global) {
174e7245b42SNicola Zaghen   LLVM_DEBUG(dbgs() << "addSyntheticGlobal: " << Name << " -> " << Global
175e7245b42SNicola Zaghen                     << "\n");
176b961abc8SRui Ueyama   assert(!find(Name));
177ebda41f8SNicholas Wilson   SyntheticGlobals.emplace_back(Global);
178b961abc8SRui Ueyama   return replaceSymbol<DefinedGlobal>(insert(Name).first, Name, Flags, nullptr,
179b961abc8SRui Ueyama                                       Global);
18093102974SSam Clegg }
18193102974SSam Clegg 
182e3498ec5SRui Ueyama static bool shouldReplace(const Symbol *Existing, InputFile *NewFile,
183e3498ec5SRui Ueyama                           uint32_t NewFlags) {
184c03c9040SRui Ueyama   // If existing symbol is undefined, replace it.
185e3498ec5SRui Ueyama   if (!Existing->isDefined()) {
186e7245b42SNicola Zaghen     LLVM_DEBUG(dbgs() << "resolving existing undefined symbol: "
187e3498ec5SRui Ueyama                       << Existing->getName() << "\n");
188c03c9040SRui Ueyama     return true;
189c03c9040SRui Ueyama   }
190c03c9040SRui Ueyama 
191c03c9040SRui Ueyama   // Now we have two defined symbols. If the new one is weak, we can ignore it.
192c03c9040SRui Ueyama   if ((NewFlags & WASM_SYMBOL_BINDING_MASK) == WASM_SYMBOL_BINDING_WEAK) {
193e7245b42SNicola Zaghen     LLVM_DEBUG(dbgs() << "existing symbol takes precedence\n");
194c03c9040SRui Ueyama     return false;
195c03c9040SRui Ueyama   }
196c03c9040SRui Ueyama 
197c03c9040SRui Ueyama   // If the existing symbol is weak, we should replace it.
198e3498ec5SRui Ueyama   if (Existing->isWeak()) {
199e7245b42SNicola Zaghen     LLVM_DEBUG(dbgs() << "replacing existing weak symbol\n");
200c03c9040SRui Ueyama     return true;
201c03c9040SRui Ueyama   }
202c03c9040SRui Ueyama 
203c03c9040SRui Ueyama   // Neither symbol is week. They conflict.
204e3498ec5SRui Ueyama   error("duplicate symbol: " + toString(*Existing) + "\n>>> defined in " +
205e3498ec5SRui Ueyama         toString(Existing->getFile()) + "\n>>> defined in " +
206e3498ec5SRui Ueyama         toString(NewFile));
207c03c9040SRui Ueyama   return true;
208b8621596SSam Clegg }
20993e559b1SSam Clegg 
21093e559b1SSam Clegg Symbol *SymbolTable::addDefinedFunction(StringRef Name, uint32_t Flags,
211e3498ec5SRui Ueyama                                         InputFile *File,
212e3498ec5SRui Ueyama                                         InputFunction *Function) {
213e7245b42SNicola Zaghen   LLVM_DEBUG(dbgs() << "addDefinedFunction: " << Name << "\n");
21493e559b1SSam Clegg   Symbol *S;
21593e559b1SSam Clegg   bool WasInserted;
21693e559b1SSam Clegg   std::tie(S, WasInserted) = insert(Name);
217e3498ec5SRui Ueyama 
218c729c1b4SSam Clegg   if (!File || File->kind() == InputFile::ObjectKind)
219c729c1b4SSam Clegg     S->IsUsedInRegularObj = true;
220c729c1b4SSam Clegg 
221e3498ec5SRui Ueyama   if (WasInserted || S->isLazy()) {
222e3498ec5SRui Ueyama     replaceSymbol<DefinedFunction>(S, Name, Flags, File, Function);
223e3498ec5SRui Ueyama     return S;
224e3498ec5SRui Ueyama   }
225e3498ec5SRui Ueyama 
226c729c1b4SSam Clegg   if (Function)
227e3498ec5SRui Ueyama     checkFunctionType(S, File, &Function->Signature);
228e3498ec5SRui Ueyama 
229e3498ec5SRui Ueyama   if (shouldReplace(S, File, Flags))
230e3498ec5SRui Ueyama     replaceSymbol<DefinedFunction>(S, Name, Flags, File, Function);
23193e559b1SSam Clegg   return S;
23293e559b1SSam Clegg }
23393e559b1SSam Clegg 
23400245539SSam Clegg Symbol *SymbolTable::addDefinedData(StringRef Name, uint32_t Flags,
235e3498ec5SRui Ueyama                                     InputFile *File, InputSegment *Segment,
23693102974SSam Clegg                                     uint32_t Address, uint32_t Size) {
237e7245b42SNicola Zaghen   LLVM_DEBUG(dbgs() << "addDefinedData:" << Name << " addr:" << Address
238e7245b42SNicola Zaghen                     << "\n");
23993e559b1SSam Clegg   Symbol *S;
24093e559b1SSam Clegg   bool WasInserted;
24193e559b1SSam Clegg   std::tie(S, WasInserted) = insert(Name);
242e3498ec5SRui Ueyama 
243c729c1b4SSam Clegg   if (!File || File->kind() == InputFile::ObjectKind)
244c729c1b4SSam Clegg     S->IsUsedInRegularObj = true;
245c729c1b4SSam Clegg 
246e3498ec5SRui Ueyama   if (WasInserted || S->isLazy()) {
247e3498ec5SRui Ueyama     replaceSymbol<DefinedData>(S, Name, Flags, File, Segment, Address, Size);
248e3498ec5SRui Ueyama     return S;
249e3498ec5SRui Ueyama   }
250e3498ec5SRui Ueyama 
251e3498ec5SRui Ueyama   checkDataType(S, File);
252e3498ec5SRui Ueyama 
253e3498ec5SRui Ueyama   if (shouldReplace(S, File, Flags))
254e3498ec5SRui Ueyama     replaceSymbol<DefinedData>(S, Name, Flags, File, Segment, Address, Size);
255c94d393aSSam Clegg   return S;
256c94d393aSSam Clegg }
257c94d393aSSam Clegg 
25893102974SSam Clegg Symbol *SymbolTable::addDefinedGlobal(StringRef Name, uint32_t Flags,
259e3498ec5SRui Ueyama                                       InputFile *File, InputGlobal *Global) {
260e7245b42SNicola Zaghen   LLVM_DEBUG(dbgs() << "addDefinedGlobal:" << Name << "\n");
26193102974SSam Clegg   Symbol *S;
26293102974SSam Clegg   bool WasInserted;
26393102974SSam Clegg   std::tie(S, WasInserted) = insert(Name);
264e3498ec5SRui Ueyama 
265c729c1b4SSam Clegg   if (!File || File->kind() == InputFile::ObjectKind)
266c729c1b4SSam Clegg     S->IsUsedInRegularObj = true;
267c729c1b4SSam Clegg 
268e3498ec5SRui Ueyama   if (WasInserted || S->isLazy()) {
269e3498ec5SRui Ueyama     replaceSymbol<DefinedGlobal>(S, Name, Flags, File, Global);
27093102974SSam Clegg     return S;
27193102974SSam Clegg   }
27293102974SSam Clegg 
273e3498ec5SRui Ueyama   checkGlobalType(S, File, &Global->getType());
274e3498ec5SRui Ueyama 
275e3498ec5SRui Ueyama   if (shouldReplace(S, File, Flags))
276e3498ec5SRui Ueyama     replaceSymbol<DefinedGlobal>(S, Name, Flags, File, Global);
277e3498ec5SRui Ueyama   return S;
278e3498ec5SRui Ueyama }
279e3498ec5SRui Ueyama 
280e3498ec5SRui Ueyama Symbol *SymbolTable::addUndefinedFunction(StringRef Name, uint32_t Flags,
281e3498ec5SRui Ueyama                                           InputFile *File,
282e3498ec5SRui Ueyama                                           const WasmSignature *Sig) {
283e7245b42SNicola Zaghen   LLVM_DEBUG(dbgs() << "addUndefinedFunction: " << Name << "\n");
284c03c9040SRui Ueyama 
285c94d393aSSam Clegg   Symbol *S;
286c94d393aSSam Clegg   bool WasInserted;
28720db381bSSam Clegg   std::tie(S, WasInserted) = insert(Name);
288c03c9040SRui Ueyama 
289c729c1b4SSam Clegg   if (!File || File->kind() == InputFile::ObjectKind)
290c729c1b4SSam Clegg     S->IsUsedInRegularObj = true;
291c729c1b4SSam Clegg 
292e3498ec5SRui Ueyama   if (WasInserted)
293e3498ec5SRui Ueyama     replaceSymbol<UndefinedFunction>(S, Name, Flags, File, Sig);
294e3498ec5SRui Ueyama   else if (auto *Lazy = dyn_cast<LazySymbol>(S))
295b961abc8SRui Ueyama     Lazy->fetch();
296*cefbf9acSSam Clegg   else
297e3498ec5SRui Ueyama     checkFunctionType(S, File, Sig);
298*cefbf9acSSam Clegg 
299c03c9040SRui Ueyama   return S;
300c03c9040SRui Ueyama }
301c03c9040SRui Ueyama 
302e3498ec5SRui Ueyama Symbol *SymbolTable::addUndefinedData(StringRef Name, uint32_t Flags,
303e3498ec5SRui Ueyama                                       InputFile *File) {
304e7245b42SNicola Zaghen   LLVM_DEBUG(dbgs() << "addUndefinedData: " << Name << "\n");
30593102974SSam Clegg 
306e3498ec5SRui Ueyama   Symbol *S;
307e3498ec5SRui Ueyama   bool WasInserted;
308e3498ec5SRui Ueyama   std::tie(S, WasInserted) = insert(Name);
309e3498ec5SRui Ueyama 
310e3498ec5SRui Ueyama   if (WasInserted)
311e3498ec5SRui Ueyama     replaceSymbol<UndefinedData>(S, Name, Flags, File);
312e3498ec5SRui Ueyama   else if (auto *Lazy = dyn_cast<LazySymbol>(S))
313b961abc8SRui Ueyama     Lazy->fetch();
314e3498ec5SRui Ueyama   else if (S->isDefined())
315e3498ec5SRui Ueyama     checkDataType(S, File);
316c94d393aSSam Clegg   return S;
317c94d393aSSam Clegg }
318c94d393aSSam Clegg 
319e3498ec5SRui Ueyama Symbol *SymbolTable::addUndefinedGlobal(StringRef Name, uint32_t Flags,
320e3498ec5SRui Ueyama                                         InputFile *File,
321e3498ec5SRui Ueyama                                         const WasmGlobalType *Type) {
322e7245b42SNicola Zaghen   LLVM_DEBUG(dbgs() << "addUndefinedGlobal: " << Name << "\n");
323e3498ec5SRui Ueyama 
324e3498ec5SRui Ueyama   Symbol *S;
325e3498ec5SRui Ueyama   bool WasInserted;
326e3498ec5SRui Ueyama   std::tie(S, WasInserted) = insert(Name);
327e3498ec5SRui Ueyama 
328c729c1b4SSam Clegg   if (!File || File->kind() == InputFile::ObjectKind)
329c729c1b4SSam Clegg     S->IsUsedInRegularObj = true;
330c729c1b4SSam Clegg 
331e3498ec5SRui Ueyama   if (WasInserted)
332e3498ec5SRui Ueyama     replaceSymbol<UndefinedGlobal>(S, Name, Flags, File, Type);
333e3498ec5SRui Ueyama   else if (auto *Lazy = dyn_cast<LazySymbol>(S))
334b961abc8SRui Ueyama     Lazy->fetch();
335e3498ec5SRui Ueyama   else if (S->isDefined())
336e3498ec5SRui Ueyama     checkGlobalType(S, File, Type);
337e3498ec5SRui Ueyama   return S;
338e3498ec5SRui Ueyama }
339e3498ec5SRui Ueyama 
340e3498ec5SRui Ueyama void SymbolTable::addLazy(ArchiveFile *File, const Archive::Symbol *Sym) {
341e7245b42SNicola Zaghen   LLVM_DEBUG(dbgs() << "addLazy: " << Sym->getName() << "\n");
342c94d393aSSam Clegg   StringRef Name = Sym->getName();
343c03c9040SRui Ueyama 
344c94d393aSSam Clegg   Symbol *S;
345c94d393aSSam Clegg   bool WasInserted;
346c94d393aSSam Clegg   std::tie(S, WasInserted) = insert(Name);
347c03c9040SRui Ueyama 
348c94d393aSSam Clegg   if (WasInserted) {
349e3498ec5SRui Ueyama     replaceSymbol<LazySymbol>(S, Name, File, *Sym);
350c03c9040SRui Ueyama     return;
351c03c9040SRui Ueyama   }
352c03c9040SRui Ueyama 
353c03c9040SRui Ueyama   // If there is an existing undefined symbol, load a new one from the archive.
354c03c9040SRui Ueyama   if (S->isUndefined()) {
355e7245b42SNicola Zaghen     LLVM_DEBUG(dbgs() << "replacing existing undefined\n");
356e3498ec5SRui Ueyama     File->addMember(Sym);
357c94d393aSSam Clegg   }
358c94d393aSSam Clegg }
359e0f6fcd0SSam Clegg 
360c4d9aa1bSNicholas Wilson bool SymbolTable::addComdat(StringRef Name) {
361c4d9aa1bSNicholas Wilson   return Comdats.insert(CachedHashStringRef(Name)).second;
362e0f6fcd0SSam Clegg }
363