Skip to content

Commit 190bac5

Browse files
author
George Rimar
committedJan 23, 2017
[ELF] - Stop handling local symbols in a special way.
Previously we stored kept locals in a KeptLocalSyms arrays, belonged to files. Patch makes SymbolTableSection to store locals in Symbols member, that already present and was used for globals. SymbolTableSection already had NumLocals counter member, so change itself is trivial. That allows to simplify handling of -r, Body::DynsymIndex is no more used as "symbol table index" for relocatable output. Change was suggested during review of D28773 and opens road for D28612. Differential revision: https://reviews.llvm.org/D29021 llvm-svn: 292789
1 parent beb17cc commit 190bac5

File tree

5 files changed

+55
-49
lines changed

5 files changed

+55
-49
lines changed
 

‎lld/ELF/InputFiles.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -180,10 +180,6 @@ template <class ELFT> class ObjectFile : public ELFFileBase<ELFT> {
180180
// R_MIPS_GPREL16 / R_MIPS_GPREL32 relocations.
181181
uint32_t MipsGp0 = 0;
182182

183-
// The number is the offset in the string table. It will be used as the
184-
// st_name of the symbol.
185-
std::vector<std::pair<const DefinedRegular<ELFT> *, unsigned>> KeptLocalSyms;
186-
187183
// Name of source file obtained from STT_FILE symbol value,
188184
// or empty string if there is no such symbol in object file
189185
// symbol table.

‎lld/ELF/InputSection.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,8 @@ void InputSection<ELFT>::copyRelocations(uint8_t *Buf, ArrayRef<RelTy> Rels) {
247247
if (Config->Rela)
248248
P->r_addend = getAddend<ELFT>(Rel);
249249
P->r_offset = RelocatedSection->getOffset(Rel.r_offset);
250-
P->setSymbolAndType(Body.DynsymIndex, Type, Config->Mips64EL);
250+
P->setSymbolAndType(In<ELFT>::SymTab->getSymbolIndex(&Body), Type,
251+
Config->Mips64EL);
251252
}
252253
}
253254

‎lld/ELF/SyntheticSections.cpp

Lines changed: 42 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,22 +1065,19 @@ template <class ELFT> void SymbolTableSection<ELFT>::finalize() {
10651065
this->OutSec->Info = this->Info = NumLocals + 1;
10661066
this->OutSec->Entsize = this->Entsize;
10671067

1068-
if (Config->Relocatable) {
1069-
size_t I = NumLocals;
1070-
for (const SymbolTableEntry &S : Symbols)
1071-
S.Symbol->DynsymIndex = ++I;
1068+
if (Config->Relocatable)
10721069
return;
1073-
}
10741070

10751071
if (!StrTabSec.isDynamic()) {
1076-
std::stable_sort(
1077-
Symbols.begin(), Symbols.end(),
1078-
[](const SymbolTableEntry &L, const SymbolTableEntry &R) {
1079-
return L.Symbol->symbol()->computeBinding() == STB_LOCAL &&
1080-
R.Symbol->symbol()->computeBinding() != STB_LOCAL;
1081-
});
1072+
auto GlobBegin = Symbols.begin() + NumLocals;
1073+
std::stable_sort(GlobBegin, Symbols.end(), [](const SymbolTableEntry &L,
1074+
const SymbolTableEntry &R) {
1075+
return L.Symbol->symbol()->computeBinding() == STB_LOCAL &&
1076+
R.Symbol->symbol()->computeBinding() != STB_LOCAL;
1077+
});
10821078
return;
10831079
}
1080+
10841081
if (In<ELFT>::GnuHashTab)
10851082
// NB: It also sorts Symbols to meet the GNU hash table requirements.
10861083
In<ELFT>::GnuHashTab->addSymbols(Symbols);
@@ -1094,10 +1091,23 @@ template <class ELFT> void SymbolTableSection<ELFT>::finalize() {
10941091
S.Symbol->DynsymIndex = ++I;
10951092
}
10961093

1097-
template <class ELFT> void SymbolTableSection<ELFT>::addSymbol(SymbolBody *B) {
1094+
template <class ELFT> void SymbolTableSection<ELFT>::addGlobal(SymbolBody *B) {
10981095
Symbols.push_back({B, StrTabSec.addString(B->getName(), false)});
10991096
}
11001097

1098+
template <class ELFT> void SymbolTableSection<ELFT>::addLocal(SymbolBody *B) {
1099+
assert(!StrTabSec.isDynamic());
1100+
++NumLocals;
1101+
Symbols.push_back({B, StrTabSec.addString(B->getName())});
1102+
}
1103+
1104+
template <class ELFT>
1105+
size_t SymbolTableSection<ELFT>::getSymbolIndex(SymbolBody *Body) {
1106+
auto I = llvm::find_if(
1107+
Symbols, [&](const SymbolTableEntry &E) { return E.Symbol == Body; });
1108+
return I - Symbols.begin() + 1;
1109+
}
1110+
11011111
template <class ELFT> void SymbolTableSection<ELFT>::writeTo(uint8_t *Buf) {
11021112
Buf += sizeof(Elf_Sym);
11031113

@@ -1113,26 +1123,24 @@ template <class ELFT>
11131123
void SymbolTableSection<ELFT>::writeLocalSymbols(uint8_t *&Buf) {
11141124
// Iterate over all input object files to copy their local symbols
11151125
// to the output symbol table pointed by Buf.
1116-
for (ObjectFile<ELFT> *File : Symtab<ELFT>::X->getObjectFiles()) {
1117-
for (const std::pair<const DefinedRegular<ELFT> *, size_t> &P :
1118-
File->KeptLocalSyms) {
1119-
const DefinedRegular<ELFT> &Body = *P.first;
1120-
InputSectionBase<ELFT> *Section = Body.Section;
1121-
auto *ESym = reinterpret_cast<Elf_Sym *>(Buf);
1122-
1123-
if (!Section) {
1124-
ESym->st_shndx = SHN_ABS;
1125-
ESym->st_value = Body.Value;
1126-
} else {
1127-
const OutputSectionBase *OutSec = Section->OutSec;
1128-
ESym->st_shndx = OutSec->SectionIndex;
1129-
ESym->st_value = OutSec->Addr + Section->getOffset(Body);
1130-
}
1131-
ESym->st_name = P.second;
1132-
ESym->st_size = Body.template getSize<ELFT>();
1133-
ESym->setBindingAndType(STB_LOCAL, Body.Type);
1134-
Buf += sizeof(*ESym);
1126+
1127+
for (auto I = Symbols.begin(); I != Symbols.begin() + NumLocals; ++I) {
1128+
const DefinedRegular<ELFT> &Body = *cast<DefinedRegular<ELFT>>(I->Symbol);
1129+
InputSectionBase<ELFT> *Section = Body.Section;
1130+
auto *ESym = reinterpret_cast<Elf_Sym *>(Buf);
1131+
1132+
if (!Section) {
1133+
ESym->st_shndx = SHN_ABS;
1134+
ESym->st_value = Body.Value;
1135+
} else {
1136+
const OutputSectionBase *OutSec = Section->OutSec;
1137+
ESym->st_shndx = OutSec->SectionIndex;
1138+
ESym->st_value = OutSec->Addr + Section->getOffset(Body);
11351139
}
1140+
ESym->st_name = I->StrTabOffset;
1141+
ESym->st_size = Body.template getSize<ELFT>();
1142+
ESym->setBindingAndType(STB_LOCAL, Body.Type);
1143+
Buf += sizeof(*ESym);
11361144
}
11371145
}
11381146

@@ -1141,7 +1149,9 @@ void SymbolTableSection<ELFT>::writeGlobalSymbols(uint8_t *Buf) {
11411149
// Write the internal symbol table contents to the output symbol table
11421150
// pointed by Buf.
11431151
auto *ESym = reinterpret_cast<Elf_Sym *>(Buf);
1144-
for (const SymbolTableEntry &S : Symbols) {
1152+
1153+
for (auto I = Symbols.begin() + NumLocals; I != Symbols.end(); ++I) {
1154+
const SymbolTableEntry &S = *I;
11451155
SymbolBody *Body = S.Symbol;
11461156
size_t StrOff = S.StrTabOffset;
11471157

‎lld/ELF/SyntheticSections.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -366,23 +366,26 @@ class SymbolTableSection final : public SyntheticSection<ELFT> {
366366
void finalize() override;
367367
void writeTo(uint8_t *Buf) override;
368368
size_t getSize() const override { return getNumSymbols() * sizeof(Elf_Sym); }
369-
void addSymbol(SymbolBody *Body);
369+
void addGlobal(SymbolBody *Body);
370+
void addLocal(SymbolBody *Body);
370371
StringTableSection<ELFT> &getStrTabSec() const { return StrTabSec; }
371-
unsigned getNumSymbols() const { return NumLocals + Symbols.size() + 1; }
372+
unsigned getNumSymbols() const { return Symbols.size() + 1; }
373+
size_t getSymbolIndex(SymbolBody *Body);
372374

373375
ArrayRef<SymbolTableEntry> getSymbols() const { return Symbols; }
374376

375377
static const OutputSectionBase *getOutputSection(SymbolBody *Sym);
376378

377-
unsigned NumLocals = 0;
378-
StringTableSection<ELFT> &StrTabSec;
379-
380379
private:
381380
void writeLocalSymbols(uint8_t *&Buf);
382381
void writeGlobalSymbols(uint8_t *Buf);
383382

384383
// A vector of symbols and their string table offsets.
385384
std::vector<SymbolTableEntry> Symbols;
385+
386+
StringTableSection<ELFT> &StrTabSec;
387+
388+
unsigned NumLocals = 0;
386389
};
387390

388391
// Outputs GNU Hash section. For detailed explanation see:

‎lld/ELF/Writer.cpp

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -466,11 +466,7 @@ template <class ELFT> void Writer<ELFT>::copyLocalSymbols() {
466466
InputSectionBase<ELFT> *Sec = DR->Section;
467467
if (!shouldKeepInSymtab<ELFT>(Sec, B->getName(), *B))
468468
continue;
469-
++In<ELFT>::SymTab->NumLocals;
470-
if (Config->Relocatable)
471-
B->DynsymIndex = In<ELFT>::SymTab->NumLocals;
472-
F->KeptLocalSyms.push_back(std::make_pair(
473-
DR, In<ELFT>::SymTab->StrTabSec.addString(B->getName())));
469+
In<ELFT>::SymTab->addLocal(B);
474470
}
475471
}
476472
}
@@ -1040,10 +1036,10 @@ template <class ELFT> void Writer<ELFT>::finalizeSections() {
10401036
if (!includeInSymtab<ELFT>(*Body))
10411037
continue;
10421038
if (In<ELFT>::SymTab)
1043-
In<ELFT>::SymTab->addSymbol(Body);
1039+
In<ELFT>::SymTab->addGlobal(Body);
10441040

10451041
if (In<ELFT>::DynSymTab && S->includeInDynsym()) {
1046-
In<ELFT>::DynSymTab->addSymbol(Body);
1042+
In<ELFT>::DynSymTab->addGlobal(Body);
10471043
if (auto *SS = dyn_cast<SharedSymbol<ELFT>>(Body))
10481044
if (SS->file()->isNeeded())
10491045
In<ELFT>::VerNeed->addSymbol(SS);

0 commit comments

Comments
 (0)
Please sign in to comment.