diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2010-12-15 07:39:29 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2010-12-15 07:39:29 +0000 |
commit | f9a447617329186976fe5ab8b48fe3c9c0698bc7 (patch) | |
tree | 8865fd04a7018dd0c101d54457c23fb645166b26 /lib/MC/MCAssembler.cpp | |
parent | 9448184b99b2bbdb9a2107ef12bf4cbff86e684f (diff) |
Patch by David Meyer to avoid a O(N^2) behaviour when relaxing fragments.
Since we now don't update addresses so early, we might relax a bit more than
we need to. This is simillar to the issue in PR8467.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121856 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC/MCAssembler.cpp')
-rw-r--r-- | lib/MC/MCAssembler.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/lib/MC/MCAssembler.cpp b/lib/MC/MCAssembler.cpp index 5bc477d7bc..f05f6acd63 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; |