OLD | NEW |
1 //===- subzero/src/IceELFSection.h - Model of ELF sections ------*- C++ -*-===// | 1 //===- subzero/src/IceELFSection.h - Model of ELF sections ------*- C++ -*-===// |
2 // | 2 // |
3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // Representation of ELF sections. | 10 // Representation of ELF sections. |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 RelatedSection = Section; | 210 RelatedSection = Section; |
211 } | 211 } |
212 | 212 |
213 // Track additional relocations which start out relative to offset 0, | 213 // Track additional relocations which start out relative to offset 0, |
214 // but should be adjusted to be relative to BaseOff. | 214 // but should be adjusted to be relative to BaseOff. |
215 void addRelocations(RelocOffsetT BaseOff, const FixupRefList &FixupRefs); | 215 void addRelocations(RelocOffsetT BaseOff, const FixupRefList &FixupRefs); |
216 | 216 |
217 // Track a single additional relocation. | 217 // Track a single additional relocation. |
218 void addRelocation(const AssemblerFixup &Fixup) { Fixups.push_back(Fixup); } | 218 void addRelocation(const AssemblerFixup &Fixup) { Fixups.push_back(Fixup); } |
219 | 219 |
220 size_t getSectionDataSize(const GlobalContext &Ctx, | 220 size_t getSectionDataSize() const; |
221 const ELFSymbolTableSection *SymTab) const; | |
222 | 221 |
223 template <bool IsELF64> | 222 template <bool IsELF64> |
224 void writeData(const GlobalContext &Ctx, ELFStreamer &Str, | 223 void writeData(const GlobalContext &Ctx, ELFStreamer &Str, |
225 const ELFSymbolTableSection *SymTab); | 224 const ELFSymbolTableSection *SymTab); |
226 | 225 |
227 bool isRela() const { return Header.sh_type == SHT_RELA; } | 226 bool isRela() const { return Header.sh_type == SHT_RELA; } |
228 | 227 |
229 private: | 228 private: |
230 const ELFSection *RelatedSection; | 229 const ELFSection *RelatedSection; |
231 FixupList Fixups; | 230 FixupList Fixups; |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
326 Str.writeLE16(SymInfo.st_shndx); | 325 Str.writeLE16(SymInfo.st_shndx); |
327 } | 326 } |
328 } | 327 } |
329 } | 328 } |
330 | 329 |
331 template <bool IsELF64> | 330 template <bool IsELF64> |
332 void ELFRelocationSection::writeData(const GlobalContext &Ctx, ELFStreamer &Str, | 331 void ELFRelocationSection::writeData(const GlobalContext &Ctx, ELFStreamer &Str, |
333 const ELFSymbolTableSection *SymTab) { | 332 const ELFSymbolTableSection *SymTab) { |
334 for (const AssemblerFixup &Fixup : Fixups) { | 333 for (const AssemblerFixup &Fixup : Fixups) { |
335 const ELFSym *Symbol = SymTab->findSymbol(Fixup.symbol(&Ctx)); | 334 const ELFSym *Symbol = SymTab->findSymbol(Fixup.symbol(&Ctx)); |
336 // TODO(jvoung): Make sure this always succeeds. | 335 if (!Symbol) |
337 // We currently don't track data symbols, so they aren't even marked | 336 llvm::report_fatal_error("Missing symbol mentioned in reloc"); |
338 // as undefined symbols. | 337 |
339 if (Symbol) { | 338 if (IsELF64) { |
340 if (IsELF64) { | 339 Elf64_Rela Rela; |
341 Elf64_Rela Rela; | 340 Rela.r_offset = Fixup.position(); |
342 Rela.r_offset = Fixup.position(); | 341 Rela.setSymbolAndType(Symbol->getNumber(), Fixup.kind()); |
343 Rela.setSymbolAndType(Symbol->getNumber(), Fixup.kind()); | 342 Rela.r_addend = Fixup.offset(); |
344 Rela.r_addend = Fixup.offset(); | 343 Str.writeAddrOrOffset<IsELF64>(Rela.r_offset); |
345 Str.writeAddrOrOffset<IsELF64>(Rela.r_offset); | 344 Str.writeELFXword<IsELF64>(Rela.r_info); |
346 Str.writeELFXword<IsELF64>(Rela.r_info); | 345 Str.writeELFXword<IsELF64>(Rela.r_addend); |
347 Str.writeELFXword<IsELF64>(Rela.r_addend); | 346 } else { |
348 } else { | 347 Elf32_Rel Rel; |
349 Elf32_Rel Rel; | 348 Rel.r_offset = Fixup.position(); |
350 Rel.r_offset = Fixup.position(); | 349 Rel.setSymbolAndType(Symbol->getNumber(), Fixup.kind()); |
351 Rel.setSymbolAndType(Symbol->getNumber(), Fixup.kind()); | 350 Str.writeAddrOrOffset<IsELF64>(Rel.r_offset); |
352 Str.writeAddrOrOffset<IsELF64>(Rel.r_offset); | 351 Str.writeELFWord<IsELF64>(Rel.r_info); |
353 Str.writeELFWord<IsELF64>(Rel.r_info); | |
354 } | |
355 } | 352 } |
356 } | 353 } |
357 } | 354 } |
358 | 355 |
359 } // end of namespace Ice | 356 } // end of namespace Ice |
360 | 357 |
361 #endif // SUBZERO_SRC_ICEELFSECTION_H | 358 #endif // SUBZERO_SRC_ICEELFSECTION_H |
OLD | NEW |