diff options
Diffstat (limited to 'llvm/lib/MC/MCFragment.cpp')
-rw-r--r-- | llvm/lib/MC/MCFragment.cpp | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/llvm/lib/MC/MCFragment.cpp b/llvm/lib/MC/MCFragment.cpp index a96b8e86aed3..8e90e07a4dbf 100644 --- a/llvm/lib/MC/MCFragment.cpp +++ b/llvm/lib/MC/MCFragment.cpp @@ -48,6 +48,25 @@ bool MCAsmLayout::isFragmentValid(const MCFragment *F) const { return F->getLayoutOrder() <= LastValid->getLayoutOrder(); } +bool MCAsmLayout::canGetFragmentOffset(const MCFragment *F) const { + MCSection *Sec = F->getParent(); + MCSection::iterator I; + if (MCFragment *LastValid = LastValidFragment[Sec]) { + // Fragment already valid, offset is available. + if (F->getLayoutOrder() <= LastValid->getLayoutOrder()) + return true; + I = ++MCSection::iterator(LastValid); + } else + I = Sec->begin(); + + // A fragment ordered before F is currently being laid out. + const MCFragment *FirstInvalidFragment = &*I; + if (FirstInvalidFragment->IsBeingLaidOut) + return false; + + return true; +} + void MCAsmLayout::invalidateFragmentsFrom(MCFragment *F) { // If this fragment wasn't already valid, we don't need to do anything. if (!isFragmentValid(F)) @@ -235,7 +254,7 @@ void ilist_alloc_traits<MCFragment>::deleteNode(MCFragment *V) { V->destroy(); } MCFragment::MCFragment(FragmentType Kind, bool HasInstructions, MCSection *Parent) : Parent(Parent), Atom(nullptr), Offset(~UINT64_C(0)), LayoutOrder(0), - Kind(Kind), HasInstructions(HasInstructions) { + Kind(Kind), IsBeingLaidOut(false), HasInstructions(HasInstructions) { if (Parent && !isa<MCDummyFragment>(*this)) Parent->getFragmentList().push_back(this); } @@ -394,6 +413,7 @@ LLVM_DUMP_METHOD void MCFragment::dump() const { OS << "\n "; OS << " Inst:"; F->getInst().dump_pretty(OS); + OS << " (" << F->getContents().size() << " bytes)"; break; } case MCFragment::FT_Org: { @@ -424,14 +444,9 @@ LLVM_DUMP_METHOD void MCFragment::dump() const { } case MCFragment::FT_BoundaryAlign: { const auto *BF = cast<MCBoundaryAlignFragment>(this); - if (BF->canEmitNops()) - OS << " (can emit nops to align"; - if (BF->isFused()) - OS << " fused branch)"; - else - OS << " unfused branch)"; OS << "\n "; OS << " BoundarySize:" << BF->getAlignment().value() + << " LastFragment:" << BF->getLastFragment() << " Size:" << BF->getSize(); break; } |