[lld] [LLD] Implement --enable-non-contiguous-regions (PR #90007)
Peter Smith via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 30 10:28:24 PDT 2024
================
@@ -1364,6 +1432,107 @@ const Defined *LinkerScript::assignAddresses() {
return getChangedSymbolAssignment(oldValues);
}
+static bool isRegionOverflowed(MemoryRegion *mr) {
+ if (!mr)
+ return false;
+ return mr->curPos - mr->getOrigin() > mr->getLength();
+}
+
+// Spill input sections in reverse order of address assignment to (potentially)
+// bring memory regions out of overflow. The size savings of a spill can only be
+// estimated, since general linker script arithmetic may occur afterwards.
+// Under-estimates may cause unnecessary spills, but over-estimates can always
+// be corrected on the next pass.
+bool LinkerScript::spillSections() {
+ if (!config->enableNonContiguousRegions)
+ return false;
+
+ bool spilled = false;
+ for (SectionCommand *cmd : reverse(sectionCommands)) {
+ auto *od = dyn_cast<OutputDesc>(cmd);
+ if (!od)
+ continue;
+ OutputSection *osec = &od->osec;
+ if (!osec->size || !osec->memRegion)
+ continue;
+
+ DenseSet<InputSection *> spills;
+ for (SectionCommand *cmd : reverse(osec->commands)) {
+ if (!isRegionOverflowed(osec->memRegion) &&
+ !isRegionOverflowed(osec->lmaRegion))
+ break;
+
+ auto *is = dyn_cast<InputSectionDescription>(cmd);
+ if (!is)
+ continue;
+ for (InputSection *isec : reverse(is->sections)) {
+ // Potential spill locations cannot be spilled.
+ if (isa<SpillInputSection>(isec))
+ continue;
+
+ // Find the next spill location.
+ auto it = spillLists.find(isec);
+ if (it == spillLists.end())
+ continue;
+
+ spilled = true;
+ SpillList &list = it->second;
+
+ SpillInputSection *spill = list.head;
+ if (!spill->next)
+ spillLists.erase(isec);
+ else
+ list.head = spill->next;
+
+ spills.insert(isec);
+
+ // Replace the next spill location with the spilled section and adjust
+ // its properties to match the new location.
+ *llvm::find(spill->isd->sections, spill) = isec;
+ isec->parent = spill->parent;
+ // The alignment of the spill section may have diverged from the
----------------
smithp35 wrote:
Presumably this might be increased due to some linker script expression like subalign?
https://github.com/llvm/llvm-project/pull/90007
More information about the llvm-commits
mailing list