diff options
author | George Rimar <grimar@accesssoftek.com> | 2018-06-22 11:18:11 +0000 |
---|---|---|
committer | George Rimar <grimar@accesssoftek.com> | 2018-06-22 11:18:11 +0000 |
commit | 15f957ee5ae1efd6d650b61a63e907809ef59ec6 (patch) | |
tree | d96736ebcc1794ee6ac0d7a3375d7551ba43e222 /lld | |
parent | 5a7fd2bd3ab6d4c582e54cb1fd50768e1193e850 (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.cpp | 7 | ||||
-rw-r--r-- | lld/ELF/SymbolTable.cpp | 7 |
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}); |