[lld] r287191 - Split scanVersionScript. NFC.
Rui Ueyama via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 16 18:09:43 PST 2016
Author: ruiu
Date: Wed Nov 16 20:09:42 2016
New Revision: 287191
URL: http://llvm.org/viewvc/llvm-project?rev=287191&view=rev
Log:
Split scanVersionScript. NFC.
Modified:
lld/trunk/ELF/SymbolTable.cpp
lld/trunk/ELF/SymbolTable.h
Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=287191&r1=287190&r2=287191&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Wed Nov 16 20:09:42 2016
@@ -581,23 +581,6 @@ template <class ELFT> void SymbolTable<E
B->symbol()->ExportDynamic = true;
}
-// A helper function to set a version to a symbol.
-// Essentially, assigning two different versions to the same symbol is an error.
-static void setVersionId(SymbolBody *Body, StringRef VersionName,
- StringRef Name, uint16_t Version) {
- if (!Body || Body->isUndefined()) {
- if (Config->NoUndefinedVersion)
- error("version script assignment of '" + VersionName + "' to symbol " +
- Name + " failed: symbol not defined");
- return;
- }
-
- Symbol *Sym = Body->symbol();
- if (Sym->VersionId != Config->DefaultSymbolVersion)
- warn("duplicate symbol " + Name + " in version script");
- Sym->VersionId = Version;
-}
-
// Initialize DemangledSyms with a map from demangled symbols to symbol
// objects. Used to handle "extern C++" directive in version scripts.
//
@@ -668,6 +651,36 @@ template <class ELFT> void SymbolTable<E
B->symbol()->VersionId = VER_NDX_GLOBAL;
}
+// Set symbol versions to symbols. This function handles patterns
+// containing no wildcard characters.
+template <class ELFT>
+void SymbolTable<ELFT>::assignExactVersion(SymbolVersion Ver, size_t VersionId,
+ StringRef VersionName) {
+ if (Ver.HasWildcards)
+ return;
+
+ // Get a list of symbols which we need to assign the version to.
+ std::vector<SymbolBody *> Syms;
+ if (Ver.IsExternCpp)
+ Syms = findDemangled(Ver.Name);
+ else
+ Syms.push_back(find(Ver.Name));
+
+ // Assign the version.
+ for (SymbolBody *B : Syms) {
+ if (!B || B->isUndefined()) {
+ if (Config->NoUndefinedVersion)
+ error("version script assignment of '" + VersionName + "' to symbol " +
+ Ver.Name + " failed: symbol not defined");
+ continue;
+ }
+
+ if (B->symbol()->VersionId != Config->DefaultSymbolVersion)
+ warn("duplicate symbol " + Ver.Name + " in version script");
+ B->symbol()->VersionId = VersionId;
+ }
+}
+
template <class ELFT>
void SymbolTable<ELFT>::assignWildcardVersion(SymbolVersion Ver,
size_t VersionId) {
@@ -701,26 +714,13 @@ template <class ELFT> void SymbolTable<E
// Each version definition has a glob pattern, and all symbols that match
// with the pattern get that version.
- auto assignVersion = [&](SymbolVersion &Ver, size_t Version,
- StringRef VerName) {
- if (Ver.HasWildcards)
- return;
-
- if (Ver.IsExternCpp) {
- for (SymbolBody *B : findDemangled(Ver.Name))
- setVersionId(B, VerName, Ver.Name, Version);
- return;
- }
- setVersionId(find(Ver.Name), VerName, Ver.Name, Version);
- };
-
// First, we assign versions to exact matching symbols,
// i.e. version definitions not containing any glob meta-characters.
for (SymbolVersion Sym : Config->VersionScriptLocals)
- assignVersion(Sym, VER_NDX_LOCAL, "local");
+ assignExactVersion(Sym, VER_NDX_LOCAL, "local");
for (VersionDefinition &V : Config->VersionDefinitions)
for (SymbolVersion Sym : V.Globals)
- assignVersion(Sym, V.Id, V.Name);
+ assignExactVersion(Sym, V.Id, V.Name);
// Next, we assign versions to fuzzy matching symbols,
// i.e. version definitions containing glob meta-characters.
Modified: lld/trunk/ELF/SymbolTable.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=287191&r1=287190&r2=287191&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.h (original)
+++ lld/trunk/ELF/SymbolTable.h Wed Nov 16 20:09:42 2016
@@ -103,6 +103,8 @@ private:
void initDemangledSyms();
void handleAnonymousVersion();
+ void assignExactVersion(SymbolVersion Ver, size_t VersionId,
+ StringRef VersionName);
void assignWildcardVersion(SymbolVersion Ver, size_t VersionId);
struct SymIndex {
More information about the llvm-commits
mailing list