mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-13 22:58:50 +00:00
MC: Move Layout{Fragment,Section} into MCAsmLayout, and add LayoutFile().
llvm-svn: 103738
This commit is contained in:
parent
33e9c347bf
commit
86825a9719
@ -50,6 +50,18 @@ public:
|
||||
/// \brief Update the layout because a fragment has been replaced.
|
||||
void FragmentReplaced(MCFragment *Src, MCFragment *Dst);
|
||||
|
||||
/// \brief Perform a full layout.
|
||||
void LayoutFile();
|
||||
|
||||
/// \brief Perform layout for a single fragment, assuming that the previous
|
||||
/// fragment has already been layed out correctly, and the parent section has
|
||||
/// been initialized.
|
||||
void LayoutFragment(MCFragment *Fragment);
|
||||
|
||||
/// \brief Performs layout for a single section, assuming that the previous
|
||||
/// section has already been layed out correctly.
|
||||
void LayoutSection(MCSectionData *SD);
|
||||
|
||||
/// @name Section Access (in layout order)
|
||||
/// @{
|
||||
|
||||
|
@ -656,16 +656,6 @@ private:
|
||||
uint64_t SectionAddress,
|
||||
uint64_t FragmentOffset) const;
|
||||
|
||||
/// LayoutFragment - Performs layout of the given \arg Fragment; assuming that
|
||||
/// the previous fragment has already been layed out correctly, and the parent
|
||||
/// section has been initialized.
|
||||
void LayoutFragment(MCAsmLayout &Layout, MCFragment &Fragment);
|
||||
|
||||
/// LayoutSection - Performs layout of the section referenced by the given
|
||||
/// \arg SectionOrderIndex. The layout assumes that the previous section has
|
||||
/// already been layed out correctly.
|
||||
void LayoutSection(MCAsmLayout &Layout, unsigned SectionOrderIndex);
|
||||
|
||||
/// LayoutOnce - Perform one layout iteration and return true if any offsets
|
||||
/// were adjusted.
|
||||
bool LayoutOnce(MCAsmLayout &Layout);
|
||||
|
@ -69,8 +69,7 @@ void MCAsmLayout::UpdateForSlide(MCFragment *F, int SlideAmount) {
|
||||
// FIXME-PERF: This is O(N^2), but will be eliminated once we get smarter.
|
||||
|
||||
// Layout the sections in order.
|
||||
for (unsigned i = 0, e = getSectionOrder().size(); i != e; ++i)
|
||||
getAssembler().LayoutSection(*this, i);
|
||||
LayoutFile();
|
||||
}
|
||||
|
||||
void MCAsmLayout::FragmentReplaced(MCFragment *Src, MCFragment *Dst) {
|
||||
@ -426,49 +425,52 @@ uint64_t MCAssembler::ComputeFragmentSize(MCAsmLayout &Layout,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void MCAssembler::LayoutFragment(MCAsmLayout &Layout, MCFragment &F) {
|
||||
uint64_t StartAddress = Layout.getSectionAddress(F.getParent());
|
||||
void MCAsmLayout::LayoutFile() {
|
||||
for (unsigned i = 0, e = getSectionOrder().size(); i != e; ++i)
|
||||
LayoutSection(getSectionOrder()[i]);
|
||||
}
|
||||
|
||||
void MCAsmLayout::LayoutFragment(MCFragment *F) {
|
||||
uint64_t StartAddress = getSectionAddress(F->getParent());
|
||||
|
||||
// Get the fragment start address.
|
||||
uint64_t Address = StartAddress;
|
||||
MCSectionData::iterator it = &F;
|
||||
if (MCFragment *Prev = F.getPrevNode())
|
||||
Address = (StartAddress + Layout.getFragmentOffset(Prev) +
|
||||
Layout.getFragmentEffectiveSize(Prev));
|
||||
MCSectionData::iterator it = F;
|
||||
if (MCFragment *Prev = F->getPrevNode())
|
||||
Address = (StartAddress + getFragmentOffset(Prev) +
|
||||
getFragmentEffectiveSize(Prev));
|
||||
|
||||
++stats::FragmentLayouts;
|
||||
|
||||
uint64_t FragmentOffset = Address - StartAddress;
|
||||
Layout.setFragmentOffset(&F, FragmentOffset);
|
||||
// Compute fragment offset and size.
|
||||
uint64_t Offset = Address - StartAddress;
|
||||
uint64_t EffectiveSize =
|
||||
getAssembler().ComputeFragmentSize(*this, *F, StartAddress, Offset);
|
||||
|
||||
// Evaluate fragment size.
|
||||
uint64_t EffectiveSize = ComputeFragmentSize(Layout, F, StartAddress,
|
||||
FragmentOffset);
|
||||
Layout.setFragmentEffectiveSize(&F, EffectiveSize);
|
||||
setFragmentOffset(F, Offset);
|
||||
setFragmentEffectiveSize(F, EffectiveSize);
|
||||
}
|
||||
|
||||
void MCAssembler::LayoutSection(MCAsmLayout &Layout,
|
||||
unsigned SectionOrderIndex) {
|
||||
MCSectionData &SD = *Layout.getSectionOrder()[SectionOrderIndex];
|
||||
void MCAsmLayout::LayoutSection(MCSectionData *SD) {
|
||||
unsigned SectionOrderIndex = SD->getLayoutOrder();
|
||||
|
||||
++stats::SectionLayouts;
|
||||
|
||||
// Compute the section start address.
|
||||
uint64_t StartAddress = 0;
|
||||
if (SectionOrderIndex) {
|
||||
MCSectionData *Prev = Layout.getSectionOrder()[SectionOrderIndex - 1];
|
||||
StartAddress = (Layout.getSectionAddress(Prev) +
|
||||
Layout.getSectionAddressSize(Prev));
|
||||
MCSectionData *Prev = getSectionOrder()[SectionOrderIndex - 1];
|
||||
StartAddress = getSectionAddress(Prev) + getSectionAddressSize(Prev);
|
||||
}
|
||||
|
||||
// Honor the section alignment requirements.
|
||||
StartAddress = RoundUpToAlignment(StartAddress, SD.getAlignment());
|
||||
StartAddress = RoundUpToAlignment(StartAddress, SD->getAlignment());
|
||||
|
||||
// Set the section address.
|
||||
Layout.setSectionAddress(&SD, StartAddress);
|
||||
setSectionAddress(SD, StartAddress);
|
||||
|
||||
for (MCSectionData::iterator it = SD.begin(), ie = SD.end(); it != ie; ++it)
|
||||
LayoutFragment(Layout, *it);
|
||||
for (MCSectionData::iterator it = SD->begin(), ie = SD->end(); it != ie; ++it)
|
||||
LayoutFragment(it);
|
||||
}
|
||||
|
||||
/// WriteFragmentData - Write the \arg F data to the output file.
|
||||
@ -754,8 +756,7 @@ bool MCAssembler::LayoutOnce(MCAsmLayout &Layout) {
|
||||
++stats::RelaxationSteps;
|
||||
|
||||
// Layout the sections in order.
|
||||
for (unsigned i = 0, e = Layout.getSectionOrder().size(); i != e; ++i)
|
||||
LayoutSection(Layout, i);
|
||||
Layout.LayoutFile();
|
||||
|
||||
// Scan for fragments that need relaxation.
|
||||
bool WasRelaxed = false;
|
||||
|
Loading…
Reference in New Issue
Block a user