forked from OSchip/llvm-project
Rename SectionChunk to InputSection.
This is more consistent with OutputSection. This is also part of removing the "Chunk" term from the ELF linker, since we just have input/output sections and program headers. llvm-svn: 248183
This commit is contained in:
parent
b9fe44ddb0
commit
53d5cea648
|
@ -18,10 +18,10 @@ using namespace lld;
|
|||
using namespace lld::elf2;
|
||||
|
||||
template <class ELFT>
|
||||
SectionChunk<ELFT>::SectionChunk(ObjectFile<ELFT> *F, const Elf_Shdr *Header)
|
||||
InputSection<ELFT>::InputSection(ObjectFile<ELFT> *F, const Elf_Shdr *Header)
|
||||
: File(F), Header(Header) {}
|
||||
|
||||
template <class ELFT> void SectionChunk<ELFT>::writeTo(uint8_t *Buf) {
|
||||
template <class ELFT> void InputSection<ELFT>::writeTo(uint8_t *Buf) {
|
||||
if (Header->sh_type == SHT_NOBITS)
|
||||
return;
|
||||
// Copy section contents from source object file to output file.
|
||||
|
@ -29,7 +29,7 @@ template <class ELFT> void SectionChunk<ELFT>::writeTo(uint8_t *Buf) {
|
|||
memcpy(Buf + OutputSectionOff, Data.data(), Data.size());
|
||||
}
|
||||
|
||||
template <class ELFT> StringRef SectionChunk<ELFT>::getSectionName() const {
|
||||
template <class ELFT> StringRef InputSection<ELFT>::getSectionName() const {
|
||||
ErrorOr<StringRef> Name = File->getObj()->getSectionName(Header);
|
||||
error(Name);
|
||||
return *Name;
|
||||
|
@ -37,9 +37,9 @@ template <class ELFT> StringRef SectionChunk<ELFT>::getSectionName() const {
|
|||
|
||||
namespace lld {
|
||||
namespace elf2 {
|
||||
template class SectionChunk<object::ELF32LE>;
|
||||
template class SectionChunk<object::ELF32BE>;
|
||||
template class SectionChunk<object::ELF64LE>;
|
||||
template class SectionChunk<object::ELF64BE>;
|
||||
template class InputSection<object::ELF32LE>;
|
||||
template class InputSection<object::ELF32BE>;
|
||||
template class InputSection<object::ELF64LE>;
|
||||
template class InputSection<object::ELF64BE>;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,14 +20,14 @@ template <class ELFT> class ObjectFile;
|
|||
template <class ELFT> class OutputSection;
|
||||
|
||||
// A chunk corresponding a section of an input file.
|
||||
template <class ELFT> class SectionChunk {
|
||||
template <class ELFT> class InputSection {
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Rela Elf_Rela;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::Elf_Rel Elf_Rel;
|
||||
typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
|
||||
|
||||
public:
|
||||
SectionChunk(ObjectFile<ELFT> *F, const Elf_Shdr *Header);
|
||||
InputSection(ObjectFile<ELFT> *F, const Elf_Shdr *Header);
|
||||
|
||||
// Returns the size of this chunk (even if this is a common or BSS.)
|
||||
size_t getSize() const { return Header->sh_size; }
|
||||
|
|
|
@ -119,14 +119,14 @@ template <class ELFT> void elf2::ObjectFile<ELFT>::initializeChunks() {
|
|||
uint32_t RelocatedSectionIndex = Sec.sh_info;
|
||||
if (RelocatedSectionIndex >= Size)
|
||||
error("Invalid relocated section index");
|
||||
SectionChunk<ELFT> *RelocatedSection = Chunks[RelocatedSectionIndex];
|
||||
InputSection<ELFT> *RelocatedSection = Chunks[RelocatedSectionIndex];
|
||||
if (!RelocatedSection)
|
||||
error("Unsupported relocation reference");
|
||||
RelocatedSection->RelocSections.push_back(&Sec);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
Chunks[I] = new (Alloc) SectionChunk<ELFT>(this, &Sec);
|
||||
Chunks[I] = new (Alloc) InputSection<ELFT>(this, &Sec);
|
||||
break;
|
||||
}
|
||||
++I;
|
||||
|
|
|
@ -132,7 +132,7 @@ public:
|
|||
: ObjectFileBase(getStaticELFKind<ELFT>(), M) {}
|
||||
void parse() override;
|
||||
|
||||
ArrayRef<SectionChunk<ELFT> *> getChunks() const { return Chunks; }
|
||||
ArrayRef<InputSection<ELFT> *> getChunks() const { return Chunks; }
|
||||
|
||||
SymbolBody *getSymbolBody(uint32_t SymbolIndex) const {
|
||||
uint32_t FirstNonLocal = this->Symtab->sh_info;
|
||||
|
@ -153,7 +153,7 @@ private:
|
|||
SymbolBody *createSymbolBody(StringRef StringTable, const Elf_Sym *Sym);
|
||||
|
||||
// List of all chunks defined by this file.
|
||||
std::vector<SectionChunk<ELFT> *> Chunks;
|
||||
std::vector<InputSection<ELFT> *> Chunks;
|
||||
|
||||
ArrayRef<Elf_Word> SymtabSHNDX;
|
||||
};
|
||||
|
|
|
@ -197,14 +197,14 @@ template <class ELFT> class DefinedRegular : public Defined<ELFT> {
|
|||
|
||||
public:
|
||||
explicit DefinedRegular(StringRef N, const Elf_Sym &Sym,
|
||||
SectionChunk<ELFT> &Section)
|
||||
InputSection<ELFT> &Section)
|
||||
: Defined<ELFT>(Base::DefinedRegularKind, N, Sym), Section(Section) {}
|
||||
|
||||
static bool classof(const SymbolBody *S) {
|
||||
return S->kind() == Base::DefinedRegularKind;
|
||||
}
|
||||
|
||||
const SectionChunk<ELFT> &Section;
|
||||
const InputSection<ELFT> &Section;
|
||||
};
|
||||
|
||||
// Undefined symbol.
|
||||
|
|
|
@ -96,7 +96,7 @@ template <class ELFT> class SymbolTableSection;
|
|||
|
||||
template <class ELFT> struct DynamicReloc {
|
||||
typedef typename ELFFile<ELFT>::Elf_Rel Elf_Rel;
|
||||
const SectionChunk<ELFT> &C;
|
||||
const InputSection<ELFT> &C;
|
||||
const Elf_Rel &RI;
|
||||
};
|
||||
|
||||
|
@ -225,7 +225,7 @@ public:
|
|||
auto *P = reinterpret_cast<Elf_Rela *>(Buf);
|
||||
bool IsMips64EL = Relocs[0].C.getFile()->getObj()->isMips64EL();
|
||||
for (const DynamicReloc<ELFT> &Rel : Relocs) {
|
||||
const SectionChunk<ELFT> &C = Rel.C;
|
||||
const InputSection<ELFT> &C = Rel.C;
|
||||
const Elf_Rel &RI = Rel.RI;
|
||||
OutputSection<ELFT> *Out = C.getOutputSection();
|
||||
uint32_t SymIndex = RI.getSymbol(IsMips64EL);
|
||||
|
@ -270,7 +270,7 @@ public:
|
|||
: OutputSectionBase<ELFT::Is64Bits>(Name, sh_type, sh_flags),
|
||||
PltSec(PltSec), GotSec(GotSec) {}
|
||||
|
||||
void addChunk(SectionChunk<ELFT> *C);
|
||||
void addChunk(InputSection<ELFT> *C);
|
||||
void writeTo(uint8_t *Buf) override;
|
||||
|
||||
template <bool isRela>
|
||||
|
@ -284,7 +284,7 @@ public:
|
|||
uintX_t BaseAddr, uintX_t SymVA);
|
||||
|
||||
private:
|
||||
std::vector<SectionChunk<ELFT> *> Chunks;
|
||||
std::vector<InputSection<ELFT> *> Chunks;
|
||||
const PltSection<ELFT> &PltSec;
|
||||
const GotSection<ELFT> &GotSec;
|
||||
};
|
||||
|
@ -633,9 +633,9 @@ public:
|
|||
private:
|
||||
void createSections();
|
||||
template <bool isRela>
|
||||
void scanRelocs(const SectionChunk<ELFT> &C,
|
||||
void scanRelocs(const InputSection<ELFT> &C,
|
||||
iterator_range<const Elf_Rel_Impl<ELFT, isRela> *> Rels);
|
||||
void scanRelocs(const SectionChunk<ELFT> &C);
|
||||
void scanRelocs(const InputSection<ELFT> &C);
|
||||
void assignAddresses();
|
||||
void openFile(StringRef OutputPath);
|
||||
void writeHeader();
|
||||
|
@ -711,7 +711,7 @@ template <class ELFT> void Writer<ELFT>::run() {
|
|||
}
|
||||
|
||||
template <class ELFT>
|
||||
void OutputSection<ELFT>::addChunk(SectionChunk<ELFT> *C) {
|
||||
void OutputSection<ELFT>::addChunk(InputSection<ELFT> *C) {
|
||||
Chunks.push_back(C);
|
||||
C->setOutputSection(this);
|
||||
uint32_t Align = C->getAlign();
|
||||
|
@ -728,7 +728,7 @@ void OutputSection<ELFT>::addChunk(SectionChunk<ELFT> *C) {
|
|||
template <class ELFT>
|
||||
static typename ELFFile<ELFT>::uintX_t
|
||||
getSymVA(const DefinedRegular<ELFT> *DR) {
|
||||
const SectionChunk<ELFT> *SC = &DR->Section;
|
||||
const InputSection<ELFT> *SC = &DR->Section;
|
||||
OutputSection<ELFT> *OS = SC->getOutputSection();
|
||||
return OS->getVA() + SC->getOutputSectionOff() + DR->Sym.st_value;
|
||||
}
|
||||
|
@ -832,7 +832,7 @@ void OutputSection<ELFT>::relocate(
|
|||
}
|
||||
|
||||
template <class ELFT> void OutputSection<ELFT>::writeTo(uint8_t *Buf) {
|
||||
for (SectionChunk<ELFT> *C : Chunks) {
|
||||
for (InputSection<ELFT> *C : Chunks) {
|
||||
C->writeTo(Buf);
|
||||
const ObjectFile<ELFT> *File = C->getFile();
|
||||
ELFFile<ELFT> *EObj = File->getObj();
|
||||
|
@ -876,7 +876,7 @@ static bool includeInSymtab(const SymbolBody &B) {
|
|||
|
||||
template <class ELFT> void SymbolTableSection<ELFT>::writeTo(uint8_t *Buf) {
|
||||
const OutputSection<ELFT> *Out = nullptr;
|
||||
const SectionChunk<ELFT> *Section = nullptr;
|
||||
const InputSection<ELFT> *Section = nullptr;
|
||||
Buf += sizeof(Elf_Sym);
|
||||
|
||||
// All symbols with STB_LOCAL binding precede the weak and global symbols.
|
||||
|
@ -898,7 +898,7 @@ template <class ELFT> void SymbolTableSection<ELFT>::writeTo(uint8_t *Buf) {
|
|||
if (SecIndex == SHN_XINDEX)
|
||||
SecIndex = File.getObj()->getExtendedSymbolTableIndex(
|
||||
&Sym, File.getSymbolTable(), File.getSymbolTableShndx());
|
||||
ArrayRef<SectionChunk<ELFT> *> Chunks = File.getChunks();
|
||||
ArrayRef<InputSection<ELFT> *> Chunks = File.getChunks();
|
||||
Section = Chunks[SecIndex];
|
||||
assert(Section != nullptr);
|
||||
Out = Section->getOutputSection();
|
||||
|
@ -1035,7 +1035,7 @@ static bool compSec(OutputSectionBase<Is64Bits> *A,
|
|||
template <class ELFT>
|
||||
template <bool isRela>
|
||||
void Writer<ELFT>::scanRelocs(
|
||||
const SectionChunk<ELFT> &C,
|
||||
const InputSection<ELFT> &C,
|
||||
iterator_range<const Elf_Rel_Impl<ELFT, isRela> *> Rels) {
|
||||
typedef Elf_Rel_Impl<ELFT, isRela> RelType;
|
||||
const ObjectFile<ELFT> &File = *C.getFile();
|
||||
|
@ -1064,7 +1064,7 @@ void Writer<ELFT>::scanRelocs(
|
|||
}
|
||||
|
||||
template <class ELFT>
|
||||
void Writer<ELFT>::scanRelocs(const SectionChunk<ELFT> &C) {
|
||||
void Writer<ELFT>::scanRelocs(const InputSection<ELFT> &C) {
|
||||
const ObjectFile<ELFT> *File = C.getFile();
|
||||
ELFFile<ELFT> *EObj = File->getObj();
|
||||
|
||||
|
@ -1126,7 +1126,7 @@ template <class ELFT> void Writer<ELFT>::createSections() {
|
|||
SymTabSec.addSymbol(*SymName, true);
|
||||
}
|
||||
}
|
||||
for (SectionChunk<ELFT> *C : File.getChunks()) {
|
||||
for (InputSection<ELFT> *C : File.getChunks()) {
|
||||
if (!C)
|
||||
continue;
|
||||
const Elf_Shdr *H = C->getSectionHdr();
|
||||
|
|
Loading…
Reference in New Issue