[lld] 0e47dfe - [ELF] Add isStaticRelSecType to simplify SHT_REL/SHT_RELA testing. NFC
via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 20 09:59:00 PDT 2024
Author: Fangrui Song
Date: 2024-03-20T09:58:56-07:00
New Revision: 0e47dfede468a292dd8cd893d6d0179052501383
URL: https://github.com/llvm/llvm-project/commit/0e47dfede468a292dd8cd893d6d0179052501383
DIFF: https://github.com/llvm/llvm-project/commit/0e47dfede468a292dd8cd893d6d0179052501383.diff
LOG: [ELF] Add isStaticRelSecType to simplify SHT_REL/SHT_RELA testing. NFC
and make it easier to introduce a new relocation format.
https://discourse.llvm.org/t/rfc-relleb-a-compact-relocation-format-for-elf/77600
Pull Request: https://github.com/llvm/llvm-project/pull/85893
Added:
Modified:
lld/ELF/InputFiles.cpp
lld/ELF/InputSection.cpp
lld/ELF/InputSection.h
lld/ELF/LinkerScript.cpp
lld/ELF/MarkLive.cpp
lld/ELF/OutputSections.cpp
lld/ELF/Writer.cpp
Removed:
################################################################################
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index 4a6e691938cf46..4c614c865d24a9 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -835,7 +835,7 @@ void ObjFile<ELFT>::initializeSections(bool ignoreComdats,
// We have a second loop. It is used to:
// 1) handle SHF_LINK_ORDER sections.
- // 2) create SHT_REL[A] sections. In some cases the section header index of a
+ // 2) create relocation sections. In some cases the section header index of a
// relocation section may be smaller than that of the relocated section. In
// such cases, the relocation section would attempt to reference a target
// section that has not yet been created. For simplicity, delay creation of
@@ -845,7 +845,7 @@ void ObjFile<ELFT>::initializeSections(bool ignoreComdats,
continue;
const Elf_Shdr &sec = objSections[i];
- if (sec.sh_type == SHT_REL || sec.sh_type == SHT_RELA) {
+ if (isStaticRelSecType(sec.sh_type)) {
// Find a relocation target section and associate this section with that.
// Target may have been discarded if it is in a
diff erent section group
// and the group is discarded, even though it's a violation of the spec.
diff --git a/lld/ELF/InputSection.cpp b/lld/ELF/InputSection.cpp
index 082e840adde4ab..c34bf08757b156 100644
--- a/lld/ELF/InputSection.cpp
+++ b/lld/ELF/InputSection.cpp
@@ -348,7 +348,7 @@ template <class ELFT> void InputSection::copyShtGroup(uint8_t *buf) {
}
InputSectionBase *InputSection::getRelocatedSection() const {
- if (file->isInternal() || (type != SHT_RELA && type != SHT_REL))
+ if (file->isInternal() || !isStaticRelSecType(type))
return nullptr;
ArrayRef<InputSectionBase *> sections = file->getSections();
return sections[info];
diff --git a/lld/ELF/InputSection.h b/lld/ELF/InputSection.h
index b8af962877b4e9..1fb7077ca435bd 100644
--- a/lld/ELF/InputSection.h
+++ b/lld/ELF/InputSection.h
@@ -448,6 +448,10 @@ class SyntheticSection : public InputSection {
}
};
+inline bool isStaticRelSecType(uint32_t type) {
+ return type == llvm::ELF::SHT_RELA || type == llvm::ELF::SHT_REL;
+}
+
inline bool isDebugSection(const InputSectionBase &sec) {
return (sec.flags & llvm::ELF::SHF_ALLOC) == 0 &&
sec.name.starts_with(".debug");
diff --git a/lld/ELF/LinkerScript.cpp b/lld/ELF/LinkerScript.cpp
index 9e7647f63ca5ae..3af09a32b65113 100644
--- a/lld/ELF/LinkerScript.cpp
+++ b/lld/ELF/LinkerScript.cpp
@@ -740,13 +740,12 @@ static OutputDesc *addInputSec(StringMap<TinyPtrVector<OutputSection *>> &map,
// should combine these relocation sections into single output.
// We skip synthetic sections because it can be .rela.dyn/.rela.plt or any
// other REL[A] sections created by linker itself.
- if (!isa<SyntheticSection>(isec) &&
- (isec->type == SHT_REL || isec->type == SHT_RELA)) {
+ if (!isa<SyntheticSection>(isec) && isStaticRelSecType(isec->type)) {
auto *sec = cast<InputSection>(isec);
OutputSection *out = sec->getRelocatedSection()->getOutputSection();
- if (out->relocationSection) {
- out->relocationSection->recordSection(sec);
+ if (auto *relSec = out->relocationSection) {
+ relSec->recordSection(sec);
return nullptr;
}
diff --git a/lld/ELF/MarkLive.cpp b/lld/ELF/MarkLive.cpp
index 93c66e81d2fa91..45431e44a6c8cc 100644
--- a/lld/ELF/MarkLive.cpp
+++ b/lld/ELF/MarkLive.cpp
@@ -276,8 +276,7 @@ template <class ELFT> void MarkLive<ELFT>::run() {
// collection.
// - Groups members are retained or discarded as a unit.
if (!(sec->flags & SHF_ALLOC)) {
- bool isRel = sec->type == SHT_REL || sec->type == SHT_RELA;
- if (!isRel && !sec->nextInSectionGroup) {
+ if (!isStaticRelSecType(sec->type) && !sec->nextInSectionGroup) {
sec->markLive();
for (InputSection *isec : sec->dependentSections)
isec->markLive();
diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp
index f986aa5f675707..eadab9d745d687 100644
--- a/lld/ELF/OutputSections.cpp
+++ b/lld/ELF/OutputSections.cpp
@@ -615,7 +615,7 @@ void OutputSection::finalize() {
return;
}
- if (!config->copyRelocs || (type != SHT_RELA && type != SHT_REL))
+ if (!config->copyRelocs || !isStaticRelSecType(type))
return;
// Skip if 'first' is synthetic, i.e. not a section created by --emit-relocs.
@@ -750,7 +750,7 @@ std::array<uint8_t, 4> OutputSection::getFiller() {
void OutputSection::checkDynRelAddends(const uint8_t *bufStart) {
assert(config->writeAddends && config->checkDynamicRelocs);
- assert(type == SHT_REL || type == SHT_RELA);
+ assert(isStaticRelSecType(type));
SmallVector<InputSection *, 0> storage;
ArrayRef<InputSection *> sections = getInputSections(*this, storage);
parallelFor(0, sections.size(), [&](size_t i) {
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index d8782affe879ba..4eca7b22e90b52 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -796,7 +796,7 @@ template <class ELFT> void Writer<ELFT>::addSectionSymbols() {
continue;
for (InputSectionBase *s : isd->sections) {
// Relocations are not using REL[A] section symbols.
- if (s->type == SHT_REL || s->type == SHT_RELA)
+ if (isStaticRelSecType(s->type))
continue;
// Unlike other synthetic sections, mergeable output sections contain
@@ -3045,20 +3045,20 @@ template <class ELFT> void Writer<ELFT>::writeSections() {
// section while doing it.
parallel::TaskGroup tg;
for (OutputSection *sec : outputSections)
- if (sec->type == SHT_REL || sec->type == SHT_RELA)
+ if (isStaticRelSecType(sec->type))
sec->writeTo<ELFT>(Out::bufferStart + sec->offset, tg);
}
{
parallel::TaskGroup tg;
for (OutputSection *sec : outputSections)
- if (sec->type != SHT_REL && sec->type != SHT_RELA)
+ if (!isStaticRelSecType(sec->type))
sec->writeTo<ELFT>(Out::bufferStart + sec->offset, tg);
}
// Finally, check that all dynamic relocation addends were written correctly.
if (config->checkDynamicRelocs && config->writeAddends) {
for (OutputSection *sec : outputSections)
- if (sec->type == SHT_REL || sec->type == SHT_RELA)
+ if (isStaticRelSecType(sec->type))
sec->checkDynRelAddends(Out::bufferStart);
}
}
More information about the llvm-commits
mailing list