Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Unified Diff: src/IceELFSection.cpp

Issue 828873002: Subzero: Start writing out some relocation sections (text) (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: review fixes Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/IceELFSection.h ('k') | src/IceFixups.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
« no previous file with comments | « src/IceELFSection.h ('k') | src/IceFixups.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698