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;
// 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;
isecVA + forwardBranchRange - slop)
finalizeOne(inputs[finalIdx++]);
- if (isec->callSiteCount == 0)
+ if (!isec->hasCallSites)
continue;
if (finalIdx == endIdx && stubsInRangeVA == TargetInfo::outOfRangeVA) {
OutputSection *parent = nullptr;
uint32_t align = 1;
- uint32_t callSiteCount : 31;
// is address assigned?
- uint32_t isFinal : 1;
+ bool isFinal = false;
ArrayRef<uint8_t> data;
std::vector<Reloc> relocs;
InputSection(Kind kind, StringRef segname, StringRef name, InputFile *file,
ArrayRef<uint8_t> data, uint32_t align, uint32_t flags)
- : align(align), callSiteCount(0), isFinal(false), data(data),
+ : align(align), data(data),
shared(make<Shared>(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;
};
// 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.