void MCAsmLayout::EnsureValid(const MCFragment *F) const { MCSectionData &SD = *F->getParent(); MCFragment *Cur = LastValidFragment[&SD]; if (!Cur) Cur = &*SD.begin(); else Cur = Cur->getNextNode(); // Advance the layout position until the fragment is up-to-date. while (!isFragmentUpToDate(F)) { const_cast<MCAsmLayout*>(this)->LayoutFragment(Cur); Cur = Cur->getNextNode(); } }
void MCAsmLayout::ensureValid(const MCFragment *F) const { MCSectionData &SD = *F->getParent(); MCFragment *Cur = LastValidFragment[&SD]; if (!Cur) Cur = &*SD.begin(); else Cur = Cur->getNextNode(); // Advance the layout position until the fragment is valid. while (!isFragmentValid(F)) { assert(Cur && "Layout bookkeeping error"); const_cast<MCAsmLayout*>(this)->layoutFragment(Cur); Cur = Cur->getNextNode(); } }
void MCAsmLayout::EnsureValid(const MCFragment *F) const { // Advance the layout position until the fragment is up-to-date. while (!isFragmentUpToDate(F)) { // Advance to the next fragment. MCFragment *Cur = LastValidFragment; if (Cur) Cur = Cur->getNextNode(); if (!Cur) { unsigned NextIndex = 0; if (LastValidFragment) NextIndex = LastValidFragment->getParent()->getLayoutOrder() + 1; Cur = SectionOrder[NextIndex]->begin(); } const_cast<MCAsmLayout*>(this)->LayoutFragment(Cur); } }
MCPFRange &MCCodePadder::getJurisdiction(MCPaddingFragment *Fragment, MCAsmLayout &Layout) { auto JurisdictionLocation = FragmentToJurisdiction.find(Fragment); if (JurisdictionLocation != FragmentToJurisdiction.end()) return JurisdictionLocation->second; MCPFRange Jurisdiction; // Forward scanning the fragments in this section, starting from the given // fragments, and adding relevant MCPaddingFragments to the Jurisdiction for (MCFragment *CurrFragment = Fragment; CurrFragment != nullptr; CurrFragment = CurrFragment->getNextNode()) { MCPaddingFragment *CurrPaddingFragment = dyn_cast<MCPaddingFragment>(CurrFragment); if (CurrPaddingFragment == nullptr) continue; if (CurrPaddingFragment != Fragment && CurrPaddingFragment->isInsertionPoint()) // Found next insertion point Fragment. From now on it's its jurisdiction. break; for (const auto *Policy : CodePaddingPolicies) { if (CurrPaddingFragment->hasPaddingPolicy(Policy->getKindMask())) { Jurisdiction.push_back(CurrPaddingFragment); break; } } } auto InsertionResult = FragmentToJurisdiction.insert(std::make_pair(Fragment, Jurisdiction)); assert(InsertionResult.second && "Insertion to FragmentToJurisdiction failed"); return InsertionResult.first->second; }