diff --git a/lld/MachO/ConcatOutputSection.cpp b/lld/MachO/ConcatOutputSection.cpp index 46cd15a40025db..9f71e81b073a8f 100644 --- a/lld/MachO/ConcatOutputSection.cpp +++ b/lld/MachO/ConcatOutputSection.cpp @@ -124,13 +124,13 @@ bool ConcatOutputSection::needsThunks() const { if (!target->usesThunks()) return false; uint64_t isecAddr = addr; - for (InputSection *isec : inputs) + for (ConcatInputSection *isec : inputs) isecAddr = alignTo(isecAddr, isec->align) + isec->getSize(); if (isecAddr - addr + in.stubs->getSize() <= std::min(target->backwardBranchRange, target->forwardBranchRange)) return false; // Yes, this program is large enough to need thunks. - for (InputSection *isec : inputs) { + for (ConcatInputSection *isec : inputs) { for (Reloc &r : isec->relocs) { if (!target->hasAttr(r.type, RelocAttrBits::BRANCH)) continue; @@ -143,9 +143,8 @@ bool ConcatOutputSection::needsThunks() const { // might need to create more for this referent at the time we are // estimating distance to __stubs in estimateStubsInRangeVA(). ++thunkInfo.callSiteCount; - // Knowing InputSection call site count will help us avoid work on those - // that have no BRANCH relocs. - ++isec->callSiteCount; + // We can avoid work on InputSections that have no BRANCH relocs. + isec->hasCallSites = true; } } return true; @@ -250,7 +249,7 @@ void ConcatOutputSection::finalize() { isecVA + forwardBranchRange - slop) finalizeOne(inputs[finalIdx++]); - if (isec->callSiteCount == 0) + if (!isec->hasCallSites) continue; if (finalIdx == endIdx && stubsInRangeVA == TargetInfo::outOfRangeVA) { diff --git a/lld/MachO/InputSection.h b/lld/MachO/InputSection.h index 1183e32fbabf97..fa137223c426fa 100644 --- a/lld/MachO/InputSection.h +++ b/lld/MachO/InputSection.h @@ -57,9 +57,8 @@ class InputSection { OutputSection *parent = nullptr; uint32_t align = 1; - uint32_t callSiteCount : 31; // is address assigned? - uint32_t isFinal : 1; + bool isFinal = false; ArrayRef data; std::vector relocs; @@ -86,12 +85,11 @@ class InputSection { InputSection(Kind kind, StringRef segname, StringRef name, InputFile *file, ArrayRef data, uint32_t align, uint32_t flags) - : align(align), callSiteCount(0), isFinal(false), data(data), + : align(align), data(data), shared(make(file, name, segname, flags, kind)) {} InputSection(const InputSection &rhs) - : align(rhs.align), callSiteCount(0), isFinal(false), data(rhs.data), - shared(rhs.shared) {} + : align(rhs.align), data(rhs.data), shared(rhs.shared) {} const Shared *const shared; }; @@ -143,6 +141,7 @@ class ConcatInputSection final : public InputSection { // first and not copied to the output. bool wasCoalesced = false; bool live = !config->deadStrip; + bool hasCallSites = false; // This variable has two usages. Initially, it represents the input order. // After assignAddresses is called, it represents the offset from the // beginning of the output section this section was assigned to.