summaryrefslogtreecommitdiff
path: root/lib/MC/MCAssembler.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2010-11-23 08:08:33 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2010-11-23 08:08:33 +0000
commita9d4281cc0557ef679b7917e0741ddb01651dab1 (patch)
tree6598f8fbaf56e963ff6342d58e2272c8664a3998 /lib/MC/MCAssembler.cpp
parentd93ceeb125c11a96eb85618bb9a8a7d664a1d8f4 (diff)
downloadllvm-a9d4281cc0557ef679b7917e0741ddb01651dab1.tar.gz
llvm-a9d4281cc0557ef679b7917e0741ddb01651dab1.tar.bz2
llvm-a9d4281cc0557ef679b7917e0741ddb01651dab1.tar.xz
Invalidate the layout on any relaxation, not just Instructions. Bug found by David Meyer.
While here, remove unused argument and rename UpdateForSlide to Invalidate. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@120009 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/MCAssembler.cpp')
-rw-r--r--lib/MC/MCAssembler.cpp20
1 files changed, 11 insertions, 9 deletions
diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp
index a38aa8d8e0..434683868c 100644
--- a/lib/MC/MCAssembler.cpp
+++ b/lib/MC/MCAssembler.cpp
@@ -78,7 +78,7 @@ bool MCAsmLayout::isFragmentUpToDate(const MCFragment *F) const {
F->getLayoutOrder() <= LastValidFragment->getLayoutOrder());
}
-void MCAsmLayout::UpdateForSlide(MCFragment *F, int SlideAmount) {
+void MCAsmLayout::Invalidate(MCFragment *F) {
// If this fragment wasn't already up-to-date, we don't need to do anything.
if (!isFragmentUpToDate(F))
return;
@@ -143,7 +143,7 @@ void MCAsmLayout::CoalesceFragments(MCFragment *Src, MCFragment *Dst) {
Dst->EffectiveSize += Src->EffectiveSize;
} else {
// We don't know the effective size of Src, so we have to invalidate Dst.
- UpdateForSlide(Dst, 0);
+ Invalidate(Dst);
}
// Remove Src, but don't delete it yet.
Src->getParent()->getFragmentList().remove(Src);
@@ -819,7 +819,6 @@ bool MCAssembler::RelaxInstruction(const MCObjectWriter &Writer,
VecOS.flush();
// Update the instruction fragment.
- int SlideAmount = Code.size() - IF.getInstSize();
IF.setInst(Relaxed);
IF.getCode() = Code;
IF.getFixups().clear();
@@ -827,8 +826,6 @@ bool MCAssembler::RelaxInstruction(const MCObjectWriter &Writer,
for (unsigned i = 0, e = Fixups.size(); i != e; ++i)
IF.getFixups().push_back(Fixups[i]);
- // Update the layout, and remember that we relaxed.
- Layout.UpdateForSlide(&IF, SlideAmount);
return true;
}
@@ -894,24 +891,29 @@ bool MCAssembler::LayoutOnce(const MCObjectWriter &Writer,
for (MCSectionData::iterator it2 = SD.begin(),
ie2 = SD.end(); it2 != ie2; ++it2) {
// Check if this is an fragment that needs relaxation.
+ bool relaxedFrag = false;
switch(it2->getKind()) {
default:
break;
case MCFragment::FT_Inst:
- WasRelaxed |= RelaxInstruction(Writer, Layout,
+ relaxedFrag = RelaxInstruction(Writer, Layout,
*cast<MCInstFragment>(it2));
break;
case MCFragment::FT_Org:
- WasRelaxed |= RelaxOrg(Writer, Layout, *cast<MCOrgFragment>(it2));
+ relaxedFrag = RelaxOrg(Writer, Layout, *cast<MCOrgFragment>(it2));
break;
case MCFragment::FT_Dwarf:
- WasRelaxed |= RelaxDwarfLineAddr(Writer, Layout,
+ relaxedFrag = RelaxDwarfLineAddr(Writer, Layout,
*cast<MCDwarfLineAddrFragment>(it2));
break;
case MCFragment::FT_LEB:
- WasRelaxed |= RelaxLEB(Writer, Layout, *cast<MCLEBFragment>(it2));
+ relaxedFrag = RelaxLEB(Writer, Layout, *cast<MCLEBFragment>(it2));
break;
}
+ // Update the layout, and remember that we relaxed.
+ if (relaxedFrag)
+ Layout.Invalidate(it2);
+ WasRelaxed |= relaxedFrag;
}
}