forked from OSchip/llvm-project
ELF: Reduce the size of InputSectionBase by two words. NFCI.
- The Assigned bit was previously taking a word on its own. Move it into the bit fields in SectionBase. - NumRelocations and AreRelocsRela were previously also taking up a word despite only using half of it. Move them into the alignment gap after SectionBase's fields. Differential Revision: https://reviews.llvm.org/D59044 llvm-svn: 355622
This commit is contained in:
parent
c8955e2293
commit
dfbb9a793e
|
@ -51,13 +51,26 @@ public:
|
|||
|
||||
unsigned SectionKind : 3;
|
||||
|
||||
// The next two bit fields are only used by InputSectionBase, but we
|
||||
// The next three bit fields are only used by InputSectionBase, but we
|
||||
// put them here so the struct packs better.
|
||||
|
||||
// The garbage collector sets sections' Live bits.
|
||||
// If GC is disabled, all sections are considered live by default.
|
||||
unsigned Live : 1;
|
||||
|
||||
// True if this section has already been placed to a linker script
|
||||
// output section. This is needed because, in a linker script, you
|
||||
// can refer to the same section more than once. For example, in
|
||||
// the following linker script,
|
||||
//
|
||||
// .foo : { *(.text) }
|
||||
// .bar : { *(.text) }
|
||||
//
|
||||
// .foo takes all .text sections, and .bar becomes empty. To achieve
|
||||
// this, we need to memorize whether a section has been placed or
|
||||
// not for each input section.
|
||||
unsigned Assigned : 1;
|
||||
|
||||
unsigned Bss : 1;
|
||||
|
||||
// Set for sections that should not be folded by ICF.
|
||||
|
@ -87,8 +100,8 @@ protected:
|
|||
uint64_t Entsize, uint64_t Alignment, uint32_t Type,
|
||||
uint32_t Info, uint32_t Link)
|
||||
: Name(Name), Repl(this), SectionKind(SectionKind), Live(false),
|
||||
Bss(false), KeepUnique(false), Alignment(Alignment), Flags(Flags),
|
||||
Entsize(Entsize), Type(Type), Link(Link), Info(Info) {}
|
||||
Assigned(false), Bss(false), KeepUnique(false), Alignment(Alignment),
|
||||
Flags(Flags), Entsize(Entsize), Type(Type), Link(Link), Info(Info) {}
|
||||
};
|
||||
|
||||
// This corresponds to a section of an input file.
|
||||
|
@ -105,6 +118,11 @@ public:
|
|||
|
||||
static bool classof(const SectionBase *S) { return S->kind() != Output; }
|
||||
|
||||
// Relocations that refer to this section.
|
||||
unsigned NumRelocations : 31;
|
||||
unsigned AreRelocsRela : 1;
|
||||
const void *FirstRelocation = nullptr;
|
||||
|
||||
// The file which contains this section. Its dynamic type is always
|
||||
// ObjFile<ELFT>, but in order to avoid ELFT, we use InputFile as
|
||||
// its static type.
|
||||
|
@ -122,30 +140,12 @@ public:
|
|||
|
||||
uint64_t getOffsetInFile() const;
|
||||
|
||||
// True if this section has already been placed to a linker script
|
||||
// output section. This is needed because, in a linker script, you
|
||||
// can refer to the same section more than once. For example, in
|
||||
// the following linker script,
|
||||
//
|
||||
// .foo : { *(.text) }
|
||||
// .bar : { *(.text) }
|
||||
//
|
||||
// .foo takes all .text sections, and .bar becomes empty. To achieve
|
||||
// this, we need to memorize whether a section has been placed or
|
||||
// not for each input section.
|
||||
bool Assigned = false;
|
||||
|
||||
// Input sections are part of an output section. Special sections
|
||||
// like .eh_frame and merge sections are first combined into a
|
||||
// synthetic section that is then added to an output section. In all
|
||||
// cases this points one level up.
|
||||
SectionBase *Parent = nullptr;
|
||||
|
||||
// Relocations that refer to this section.
|
||||
const void *FirstRelocation = nullptr;
|
||||
unsigned NumRelocations : 31;
|
||||
unsigned AreRelocsRela : 1;
|
||||
|
||||
template <class ELFT> ArrayRef<typename ELFT::Rel> rels() const {
|
||||
assert(!AreRelocsRela);
|
||||
return llvm::makeArrayRef(
|
||||
|
|
Loading…
Reference in New Issue