Skip to content

Commit 2e889e7

Browse files
authored
Revert "[ELF] Merge verdefIndex into versionId. NFC (#72208)"
This reverts commit 667ea2c.
1 parent ae51ec8 commit 2e889e7

File tree

5 files changed

+21
-16
lines changed

5 files changed

+21
-16
lines changed

lld/ELF/InputFiles.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1546,7 +1546,7 @@ template <class ELFT> void SharedFile::parse() {
15461546
SharedSymbol{*this, name, sym.getBinding(), sym.st_other,
15471547
sym.getType(), sym.st_value, sym.st_size, alignment});
15481548
if (s->file == this)
1549-
s->versionId = ver;
1549+
s->verdefIndex = ver;
15501550
}
15511551

15521552
// Also add the symbol with the versioned name to handle undefined symbols
@@ -1563,7 +1563,7 @@ template <class ELFT> void SharedFile::parse() {
15631563
SharedSymbol{*this, saver().save(name), sym.getBinding(), sym.st_other,
15641564
sym.getType(), sym.st_value, sym.st_size, alignment});
15651565
if (s->file == this)
1566-
s->versionId = idx;
1566+
s->verdefIndex = idx;
15671567
}
15681568
}
15691569

lld/ELF/Relocations.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ static void replaceWithDefined(Symbol &sym, SectionBase &sec, uint64_t value,
309309
size, &sec)
310310
.overwrite(sym);
311311

312+
sym.verdefIndex = old.verdefIndex;
312313
sym.exportDynamic = true;
313314
sym.isUsedInRegularObj = true;
314315
// A copy relocated alias may need a GOT entry.

lld/ELF/SymbolTable.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ Symbol *SymbolTable::insert(StringRef name) {
9292
memset(sym, 0, sizeof(Symbol));
9393
sym->setName(name);
9494
sym->partition = 1;
95+
sym->verdefIndex = -1;
9596
sym->versionId = VER_NDX_GLOBAL;
9697
if (pos != StringRef::npos)
9798
sym->hasVersionSuffix = true;
@@ -234,9 +235,10 @@ bool SymbolTable::assignExactVersion(SymbolVersion ver, uint16_t versionId,
234235
sym->getName().contains('@'))
235236
continue;
236237

237-
// If the version has not been assigned, assign versionId to the symbol.
238-
if (!sym->versionScriptAssigned) {
239-
sym->versionScriptAssigned = true;
238+
// If the version has not been assigned, verdefIndex is -1. Use an arbitrary
239+
// number (0) to indicate the version has been assigned.
240+
if (sym->verdefIndex == uint16_t(-1)) {
241+
sym->verdefIndex = 0;
240242
sym->versionId = versionId;
241243
}
242244
if (sym->versionId == versionId)
@@ -254,8 +256,8 @@ void SymbolTable::assignWildcardVersion(SymbolVersion ver, uint16_t versionId,
254256
// so we set a version to a symbol only if no version has been assigned
255257
// to the symbol. This behavior is compatible with GNU.
256258
for (Symbol *sym : findAllByVersion(ver, includeNonDefault))
257-
if (!sym->versionScriptAssigned) {
258-
sym->versionScriptAssigned = true;
259+
if (sym->verdefIndex == uint16_t(-1)) {
260+
sym->verdefIndex = 0;
259261
sym->versionId = versionId;
260262
}
261263
}

lld/ELF/Symbols.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -313,12 +313,11 @@ class Symbol {
313313
uint32_t auxIdx;
314314
uint32_t dynsymIndex;
315315

316-
// For a Defined symbol, this represents the Verdef index (VER_NDX_LOCAL,
317-
// VER_NDX_GLOBAL, or a named version). For a SharedSymbol, this represents
318-
// the Verdef index within the input DSO, which will be converted to a Verneed
319-
// index in the output.
316+
// This field is a index to the symbol's version definition.
317+
uint16_t verdefIndex;
318+
319+
// Version definition index.
320320
uint16_t versionId;
321-
uint8_t versionScriptAssigned : 1;
322321

323322
void setFlags(uint16_t bits) {
324323
flags.fetch_or(bits, std::memory_order_relaxed);
@@ -358,6 +357,7 @@ class Defined : public Symbol {
358357
}
359358
void overwrite(Symbol &sym) const {
360359
Symbol::overwrite(sym, DefinedKind);
360+
sym.verdefIndex = -1;
361361
auto &s = static_cast<Defined &>(sym);
362362
s.value = value;
363363
s.size = size;

lld/ELF/SyntheticSections.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3140,8 +3140,10 @@ bool VersionTableSection::isNeeded() const {
31403140

31413141
void elf::addVerneed(Symbol *ss) {
31423142
auto &file = cast<SharedFile>(*ss->file);
3143-
if (ss->versionId == VER_NDX_GLOBAL)
3143+
if (ss->verdefIndex == VER_NDX_GLOBAL) {
3144+
ss->versionId = VER_NDX_GLOBAL;
31443145
return;
3146+
}
31453147

31463148
if (file.vernauxs.empty())
31473149
file.vernauxs.resize(file.verdefs.size());
@@ -3150,10 +3152,10 @@ void elf::addVerneed(Symbol *ss) {
31503152
// already allocated one. The verdef identifiers cover the range
31513153
// [1..getVerDefNum()]; this causes the vernaux identifiers to start from
31523154
// getVerDefNum()+1.
3153-
if (file.vernauxs[ss->versionId] == 0)
3154-
file.vernauxs[ss->versionId] = ++SharedFile::vernauxNum + getVerDefNum();
3155+
if (file.vernauxs[ss->verdefIndex] == 0)
3156+
file.vernauxs[ss->verdefIndex] = ++SharedFile::vernauxNum + getVerDefNum();
31553157

3156-
ss->versionId = file.vernauxs[ss->versionId];
3158+
ss->versionId = file.vernauxs[ss->verdefIndex];
31573159
}
31583160

31593161
template <class ELFT>

0 commit comments

Comments
 (0)