summaryrefslogtreecommitdiff
path: root/lld
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2018-06-22 11:18:11 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2018-06-22 11:18:11 +0000
commit15f957ee5ae1efd6d650b61a63e907809ef59ec6 (patch)
treed96736ebcc1794ee6ac0d7a3375d7551ba43e222 /lld
parent5a7fd2bd3ab6d4c582e54cb1fd50768e1193e850 (diff)
[ELF] - Change how we handle suplicate -wrap. [NFC]
This avoids doing llvm::sort and std::unique for -wrap options. I think it is more clean way.
Diffstat (limited to 'lld')
-rw-r--r--lld/ELF/Driver.cpp7
-rw-r--r--lld/ELF/SymbolTable.cpp7
2 files changed, 9 insertions, 5 deletions
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 7859d4da295..7faf9f181e7 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -1304,11 +1304,8 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &Args) {
Symtab->scanVersionScript();
// Create wrapped symbols for -wrap option.
- std::vector<std::string> Wraps = Args.getAllArgValues(OPT_wrap);
- llvm::sort(Wraps.begin(), Wraps.end());
- Wraps.erase(std::unique(Wraps.begin(), Wraps.end()), Wraps.end());
- for (StringRef Name : Wraps)
- Symtab->addSymbolWrap<ELFT>(Name);
+ for (auto *Arg : Args.filtered(OPT_wrap))
+ Symtab->addSymbolWrap<ELFT>(Arg->getValue());
// Do link-time optimization if given files are LLVM bitcode files.
// This compiles bitcode files into real object files.
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index 00c7f741501..373a894dd60 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -158,6 +158,13 @@ template <class ELFT> void SymbolTable::addSymbolWrap(StringRef Name) {
Symbol *Sym = find(Name);
if (!Sym)
return;
+
+ // Do not wrap the same symbol twice.
+ if (llvm::find_if(WrappedSymbols, [&](const WrappedSymbol &S) {
+ return S.Sym == Sym;
+ }) != WrappedSymbols.end())
+ return;
+
Symbol *Real = addUndefined<ELFT>(Saver.save("__real_" + Name));
Symbol *Wrap = addUndefined<ELFT>(Saver.save("__wrap_" + Name));
WrappedSymbols.push_back({Sym, Real, Wrap});