diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 5bc477d7bcc..f05f6acd632 100644 --- a/lib/MC/MCAssembler.cpp +++ b/lib/MC/MCAssembler.cpp @@ -738,6 +738,7 @@ bool MCAssembler::LayoutOnce(const MCObjectWriter &Writer, bool WasRelaxed = false; for (iterator it = begin(), ie = end(); it != ie; ++it) { MCSectionData &SD = *it; + MCFragment *FirstInvalidFragment = NULL; for (MCSectionData::iterator it2 = SD.begin(), ie2 = SD.end(); it2 != ie2; ++it2) { @@ -762,10 +763,12 @@ bool MCAssembler::LayoutOnce(const MCObjectWriter &Writer, break; } // Update the layout, and remember that we relaxed. - if (relaxedFrag) - Layout.Invalidate(it2); + if (relaxedFrag && !FirstInvalidFragment) + FirstInvalidFragment = it2; WasRelaxed |= relaxedFrag; } + if (FirstInvalidFragment) + Layout.Invalidate(FirstInvalidFragment); } return WasRelaxed; diff --git a/test/MC/MachO/relax-recompute-align.s b/test/MC/MachO/relax-recompute-align.s index 249402502f7..b9734cebf36 100644 --- a/test/MC/MachO/relax-recompute-align.s +++ b/test/MC/MachO/relax-recompute-align.s @@ -3,16 +3,16 @@ // FIXME: This is a horrible way of checking the output, we need an llvm-mc // based 'otool'. -// This is a case where llvm-mc computes a better layout than Darwin 'as'. This -// issue is that after the first jmp slides, the .align size must be -// recomputed -- otherwise the second jump will appear to be out-of-range for a -// 1-byte jump. +// FIXME: PR8467. +// There is an unnecessary relaxation here. After the first jmp slides, +// the .align size could be recomputed so that the second jump will be in range +// for a 1-byte jump. For performance reasons, this is not currently done. // CHECK: # Section 0 // CHECK: (('section_name', '__text\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') // CHECK: ('segment_name', '__TEXT\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') // CHECK: ('address', 0) -// CHECK: ('size', 306) +// CHECK: ('size', 322) // CHECK: ('offset', 324) // CHECK: ('alignment', 4) // CHECK: ('reloc_offset', 0)