| Index: src/IceELFSection.cpp
|
| diff --git a/src/IceELFSection.cpp b/src/IceELFSection.cpp
|
| index fd49e610924af5d7bef5c46c036fe7b992d9da5c..5dcc206df8d61849ba2cd529ceed6967fa366a23 100644
|
| --- a/src/IceELFSection.cpp
|
| +++ b/src/IceELFSection.cpp
|
| @@ -37,6 +37,29 @@ void ELFDataSection::appendData(ELFStreamer &Str,
|
|
|
| // Relocation sections.
|
|
|
| +void ELFRelocationSection::addRelocations(RelocOffsetT BaseOff,
|
| + const FixupRefList &FixupRefs) {
|
| + for (const AssemblerFixup *FR : FixupRefs) {
|
| + Fixups.push_back(*FR);
|
| + AssemblerFixup &F = Fixups.back();
|
| + F.set_position(BaseOff + F.position());
|
| + }
|
| +}
|
| +
|
| +size_t ELFRelocationSection::getSectionDataSize(
|
| + const GlobalContext &Ctx, const ELFSymbolTableSection *SymTab) const {
|
| + size_t NumWriteableRelocs = 0;
|
| + for (const AssemblerFixup &Fixup : Fixups) {
|
| + const ELFSym *Symbol = SymTab->findSymbol(Fixup.symbol(&Ctx));
|
| + // TODO(jvoung): When the symbol table finally tracks everything,
|
| + // just use the Fixups.size() as the count, and remove the
|
| + // SymTab and Ctx params.
|
| + if (Symbol)
|
| + ++NumWriteableRelocs;
|
| + }
|
| + return NumWriteableRelocs * Header.sh_entsize;
|
| +}
|
| +
|
| // Symbol tables.
|
|
|
| void ELFSymbolTableSection::createDefinedSym(const IceString &Name,
|
| @@ -47,13 +70,13 @@ void ELFSymbolTableSection::createDefinedSym(const IceString &Name,
|
| NewSymbol.Sym.setBindingAndType(Binding, Type);
|
| NewSymbol.Sym.st_value = Offset;
|
| NewSymbol.Sym.st_size = Size;
|
| + NewSymbol.Section = Section;
|
| NewSymbol.Number = ELFSym::UnknownNumber;
|
| - SymtabKey Key = {Name, Section};
|
| bool Unique;
|
| if (Type == STB_LOCAL)
|
| - Unique = LocalSymbols.insert(std::make_pair(Key, NewSymbol)).second;
|
| + Unique = LocalSymbols.insert(std::make_pair(Name, NewSymbol)).second;
|
| else
|
| - Unique = GlobalSymbols.insert(std::make_pair(Key, NewSymbol)).second;
|
| + Unique = GlobalSymbols.insert(std::make_pair(Name, NewSymbol)).second;
|
| assert(Unique);
|
| (void)Unique;
|
| }
|
| @@ -62,16 +85,26 @@ void ELFSymbolTableSection::noteUndefinedSym(const IceString &Name,
|
| ELFSection *NullSection) {
|
| ELFSym NewSymbol = ELFSym();
|
| NewSymbol.Sym.setBindingAndType(STB_GLOBAL, STT_NOTYPE);
|
| + NewSymbol.Section = NullSection;
|
| NewSymbol.Number = ELFSym::UnknownNumber;
|
| - SymtabKey Key = {Name, NullSection};
|
| - GlobalSymbols.insert(std::make_pair(Key, NewSymbol));
|
| + GlobalSymbols.insert(std::make_pair(Name, NewSymbol));
|
| +}
|
| +
|
| +const ELFSym *ELFSymbolTableSection::findSymbol(const IceString &Name) const {
|
| + auto I = LocalSymbols.find(Name);
|
| + if (I != LocalSymbols.end())
|
| + return &I->second;
|
| + I = GlobalSymbols.find(Name);
|
| + if (I != GlobalSymbols.end())
|
| + return &I->second;
|
| + return nullptr;
|
| }
|
|
|
| void ELFSymbolTableSection::updateIndices(const ELFStringTableSection *StrTab) {
|
| SizeT SymNumber = 0;
|
| for (auto &KeyValue : LocalSymbols) {
|
| - const IceString &Name = KeyValue.first.first;
|
| - ELFSection *Section = KeyValue.first.second;
|
| + const IceString &Name = KeyValue.first;
|
| + ELFSection *Section = KeyValue.second.Section;
|
| Elf64_Sym &SymInfo = KeyValue.second.Sym;
|
| if (!Name.empty())
|
| SymInfo.st_name = StrTab->getIndex(Name);
|
| @@ -79,8 +112,8 @@ void ELFSymbolTableSection::updateIndices(const ELFStringTableSection *StrTab) {
|
| KeyValue.second.setNumber(SymNumber++);
|
| }
|
| for (auto &KeyValue : GlobalSymbols) {
|
| - const IceString &Name = KeyValue.first.first;
|
| - ELFSection *Section = KeyValue.first.second;
|
| + const IceString &Name = KeyValue.first;
|
| + ELFSection *Section = KeyValue.second.Section;
|
| Elf64_Sym &SymInfo = KeyValue.second.Sym;
|
| if (!Name.empty())
|
| SymInfo.st_name = StrTab->getIndex(Name);
|
|
|