blob: 97c0429aeb013e414fd845427989b096a3116e08 [file] [log] [blame]
Michael J. Spencer84487f12015-07-24 21:03:07 +00001//===- Chunks.cpp ---------------------------------------------------------===//
2//
3// The LLVM Linker
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Chunks.h"
Rafael Espindola192e1fa2015-08-06 15:08:23 +000011#include "Error.h"
Michael J. Spencer84487f12015-07-24 21:03:07 +000012
13using namespace llvm;
14using namespace llvm::ELF;
15
16using namespace lld;
17using namespace lld::elf2;
18
19template <class ELFT>
20SectionChunk<ELFT>::SectionChunk(object::ELFFile<ELFT> *Obj,
21 const Elf_Shdr *Header)
Rafael Espindolae7a00e32015-08-05 13:55:34 +000022 : Obj(Obj), Header(Header) {
Michael J. Spencer84487f12015-07-24 21:03:07 +000023 Align = Header->sh_addralign;
24}
25
26template <class ELFT> void SectionChunk<ELFT>::writeTo(uint8_t *Buf) {
27 if (Header->sh_type == SHT_NOBITS)
28 return;
29 // Copy section contents from source object file to output file.
30 ArrayRef<uint8_t> Data = *Obj->getSectionContents(Header);
Rafael Espindola674b5d52015-08-13 15:54:36 +000031 memcpy(Buf + OutputSectionOff, Data.data(), Data.size());
Michael J. Spencer84487f12015-07-24 21:03:07 +000032
33 // FIXME: Relocations
34}
35
Rafael Espindola5d83ccd2015-08-13 19:18:30 +000036template <class ELFT> StringRef SectionChunk<ELFT>::getSectionName() const {
37 ErrorOr<StringRef> Name = Obj->getSectionName(Header);
38 error(Name);
39 return *Name;
40}
41
Michael J. Spencer84487f12015-07-24 21:03:07 +000042namespace lld {
43namespace elf2 {
44template class SectionChunk<object::ELF32LE>;
45template class SectionChunk<object::ELF32BE>;
46template class SectionChunk<object::ELF64LE>;
47template class SectionChunk<object::ELF64BE>;
48}
49}