| 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 |