Move getSubsectionInsertionPoint to MCSection.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238320 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola 2015-05-27 13:37:28 +00:00
parent a287fe7fa0
commit 919ce81d38
4 changed files with 36 additions and 35 deletions

View File

@ -33,6 +33,7 @@ class raw_ostream;
class MCSectionData {
friend class MCAsmLayout;
friend class MCSection;
MCSectionData(const MCSectionData &) = delete;
void operator=(const MCSectionData &) = delete;
@ -96,8 +97,6 @@ public:
bool empty() const;
iterator getSubsectionInsertionPoint(unsigned Subsection);
void dump();
/// @}
@ -220,6 +219,8 @@ public:
return const_cast<MCSection *>(this)->rend();
}
MCSectionData::iterator getSubsectionInsertionPoint(unsigned Subsection);
virtual void PrintSwitchToSection(const MCAsmInfo &MAI, raw_ostream &OS,
const MCExpr *Subsection) const = 0;

View File

@ -290,37 +290,6 @@ MCEncodedFragmentWithFixups::~MCEncodedFragmentWithFixups() {
MCSectionData::MCSectionData(MCSection &Section) : Section(&Section) {}
MCSectionData::iterator
MCSectionData::getSubsectionInsertionPoint(unsigned Subsection) {
if (Subsection == 0 && SubsectionFragmentMap.empty())
return end();
SmallVectorImpl<std::pair<unsigned, MCFragment *> >::iterator MI =
std::lower_bound(SubsectionFragmentMap.begin(), SubsectionFragmentMap.end(),
std::make_pair(Subsection, (MCFragment *)nullptr));
bool ExactMatch = false;
if (MI != SubsectionFragmentMap.end()) {
ExactMatch = MI->first == Subsection;
if (ExactMatch)
++MI;
}
iterator IP;
if (MI == SubsectionFragmentMap.end())
IP = end();
else
IP = MI->second;
if (!ExactMatch && Subsection != 0) {
// The GNU as documentation claims that subsections have an alignment of 4,
// although this appears not to be the case.
MCFragment *F = new MCDataFragment();
SubsectionFragmentMap.insert(MI, std::make_pair(Subsection, F));
getFragmentList().insert(IP, F);
F->setParent(&getSection());
}
return IP;
}
/* *** */
MCAssembler::MCAssembler(MCContext &Context_, MCAsmBackend &Backend_,

View File

@ -221,8 +221,7 @@ bool MCObjectStreamer::changeSectionImpl(MCSection *Section,
if (IntSubsection < 0 || IntSubsection > 8192)
report_fatal_error("Subsection number out of range");
CurInsertionPoint =
CurSectionData->getSectionData().getSubsectionInsertionPoint(
unsigned(IntSubsection));
CurSectionData->getSubsectionInsertionPoint(unsigned(IntSubsection));
return Created;
}

View File

@ -52,6 +52,38 @@ void MCSection::setBundleLockState(BundleLockStateType NewState) {
++BundleLockNestingDepth;
}
MCSectionData::iterator
MCSection::getSubsectionInsertionPoint(unsigned Subsection) {
if (Subsection == 0 && Data.SubsectionFragmentMap.empty())
return end();
SmallVectorImpl<std::pair<unsigned, MCFragment *>>::iterator MI =
std::lower_bound(Data.SubsectionFragmentMap.begin(),
Data.SubsectionFragmentMap.end(),
std::make_pair(Subsection, (MCFragment *)nullptr));
bool ExactMatch = false;
if (MI != Data.SubsectionFragmentMap.end()) {
ExactMatch = MI->first == Subsection;
if (ExactMatch)
++MI;
}
MCSectionData::iterator IP;
if (MI == Data.SubsectionFragmentMap.end())
IP = end();
else
IP = MI->second;
if (!ExactMatch && Subsection != 0) {
// The GNU as documentation claims that subsections have an alignment of 4,
// although this appears not to be the case.
MCFragment *F = new MCDataFragment();
Data.SubsectionFragmentMap.insert(MI, std::make_pair(Subsection, F));
getFragmentList().insert(IP, F);
F->setParent(this);
}
return IP;
}
MCSectionData::iterator MCSection::begin() { return Data.begin(); }
MCSectionData::iterator MCSection::end() { return Data.end(); }