[lld] r274099 - Make SymbolTable::findAll to return only defined symbols.
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 28 21:47:39 PDT 2016
Author: ruiu
Date: Tue Jun 28 23:47:39 2016
New Revision: 274099
URL: http://llvm.org/viewvc/llvm-project?rev=274099&view=rev
Log:
Make SymbolTable::findAll to return only defined symbols.
We allowed the function to return a vector that contains nullptrs
which is weird. This change makes the function to return only
defined symbols.
Differential Revision: http://reviews.llvm.org/D21828
Modified:
lld/trunk/ELF/SymbolTable.cpp
Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=274099&r1=274098&r2=274099&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Tue Jun 28 23:47:39 2016
@@ -457,19 +457,26 @@ template <class ELFT> SymbolBody *Symbol
return SymVector[It->second]->body();
}
+// Returns a list of defined symbols that match with a given glob pattern.
template <class ELFT>
std::vector<SymbolBody *> SymbolTable<ELFT>::findAll(StringRef Pattern) {
// Fast-path. Fallback to find() if Pattern doesn't contain any wildcard
// characters.
- bool HasWildcards = (Pattern.find_first_of("?*") != StringRef::npos);
- if (!HasWildcards)
- return {find(Pattern)};
-
- std::vector<SymbolBody *> Result;
- for (auto &It : Symtab)
- if (matchStr(Pattern, It.first.Val))
- Result.push_back(SymVector[It.second]->body());
- return Result;
+ if (Pattern.find_first_of("?*") == StringRef::npos) {
+ if (SymbolBody *B = find(Pattern))
+ if (!B->isUndefined())
+ return {B};
+ return {};
+ }
+
+ std::vector<SymbolBody *> Res;
+ for (auto &It : Symtab) {
+ StringRef Name = It.first.Val;
+ SymbolBody *B = SymVector[It.second]->body();
+ if (!B->isUndefined() && matchStr(Pattern, Name))
+ Res.push_back(B);
+ }
+ return Res;
}
template <class ELFT>
@@ -572,14 +579,15 @@ template <class ELFT> void SymbolTable<E
size_t I = 2;
for (Version &V : Config->SymbolVersions) {
for (StringRef Name : V.Globals) {
- for (SymbolBody *B : findAll(Name)) {
- if (!B || B->isUndefined()) {
- if (Config->NoUndefinedVersion)
- error("version script assignment of " + V.Name + " to symbol " +
- Name + " failed: symbol not defined");
- continue;
- }
+ std::vector<SymbolBody *> Syms = findAll(Name);
+ if (Syms.empty()) {
+ if (Config->NoUndefinedVersion)
+ error("version script assignment of " + V.Name + " to symbol " +
+ Name + " failed: symbol not defined");
+ continue;
+ }
+ for (SymbolBody *B : Syms) {
if (B->symbol()->VersionId != VER_NDX_GLOBAL &&
B->symbol()->VersionId != VER_NDX_LOCAL)
warning("duplicate symbol " + Name + " in version script");
More information about the llvm-commits
mailing list