-
Notifications
You must be signed in to change notification settings - Fork 14.4k
[ELF] Add isStaticRelSecType to simplify SHT_REL/SHT_RELA testing. NFC #85893
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[ELF] Add isStaticRelSecType to simplify SHT_REL/SHT_RELA testing. NFC #85893
Conversation
Created using spr 1.3.5-bogner
@llvm/pr-subscribers-lld @llvm/pr-subscribers-lld-elf Author: Fangrui Song (MaskRay) Changesand make it easier to introduce a new relocation format1. Full diff: https://github.com/llvm/llvm-project/pull/85893.diff 7 Files Affected:
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 different 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);
}
}
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Definitely easier to read, especially once there are more cases to check.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM too.
I assume that if there was an isDynamicRelSecType
then SHT_REL
and SHT_RELA
would also be included in that, but also the other compressed dynamic formats too.
Yes. |
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: llvm#85893
and make it easier to introduce a new relocation format.
https://discourse.llvm.org/t/rfc-relleb-a-compact-relocation-format-for-elf/77600