1 //===- SymbolTable.cpp ----------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "SymbolTable.h"
10 #include "InputFiles.h"
12 #include "lld/Common/ErrorHandler.h"
13 #include "lld/Common/Memory.h"
17 using namespace lld::macho
;
19 Symbol
*SymbolTable::find(StringRef name
) {
20 auto it
= symMap
.find(llvm::CachedHashStringRef(name
));
21 if (it
== symMap
.end())
23 return symVector
[it
->second
];
26 std::pair
<Symbol
*, bool> SymbolTable::insert(StringRef name
) {
27 auto p
= symMap
.insert({CachedHashStringRef(name
), (int)symVector
.size()});
29 // Name already present in the symbol table.
31 return {symVector
[p
.first
->second
], false};
33 // Name is a new symbol.
34 Symbol
*sym
= reinterpret_cast<Symbol
*>(make
<SymbolUnion
>());
35 symVector
.push_back(sym
);
39 Symbol
*SymbolTable::addDefined(StringRef name
, InputSection
*isec
,
43 std::tie(s
, wasInserted
) = insert(name
);
45 if (!wasInserted
&& isa
<Defined
>(s
))
46 error("duplicate symbol: " + name
);
48 replaceSymbol
<Defined
>(s
, name
, isec
, value
);
52 Symbol
*SymbolTable::addUndefined(StringRef name
) {
55 std::tie(s
, wasInserted
) = insert(name
);
58 replaceSymbol
<Undefined
>(s
, name
);
59 else if (LazySymbol
*lazy
= dyn_cast
<LazySymbol
>(s
))
60 lazy
->fetchArchiveMember();
64 Symbol
*SymbolTable::addDylib(StringRef name
, DylibFile
*file
) {
67 std::tie(s
, wasInserted
) = insert(name
);
69 if (wasInserted
|| isa
<Undefined
>(s
))
70 replaceSymbol
<DylibSymbol
>(s
, file
, name
);
74 Symbol
*SymbolTable::addLazy(StringRef name
, ArchiveFile
*file
,
75 const llvm::object::Archive::Symbol
&sym
) {
78 std::tie(s
, wasInserted
) = insert(name
);
81 replaceSymbol
<LazySymbol
>(s
, file
, sym
);
82 else if (isa
<Undefined
>(s
))
87 SymbolTable
*macho::symtab
;