void MCELFStreamer::EmitBundleUnlock() { MCSectionData *SD = getCurrentSectionData(); // Sanity checks if (!getAssembler().isBundlingEnabled()) report_fatal_error(".bundle_unlock forbidden when bundling is disabled"); else if (!SD->isBundleLocked()) report_fatal_error(".bundle_unlock without matching lock"); else if (SD->isBundleGroupBeforeFirstInst()) report_fatal_error("Empty bundle-locked group is forbidden"); // When the -mc-relax-all flag is used, we emit instructions to fragments // stored on a stack. When the bundle unlock is emited, we pop a fragment // from the stack a merge it to the one below. if (getAssembler().getRelaxAll()) { assert(!BundleGroups.empty() && "There are no bundle groups"); MCDataFragment *DF = BundleGroups.back(); // FIXME: Use BundleGroups to track the lock state instead. SD->setBundleLockState(MCSectionData::NotBundleLocked); // FIXME: Use more separate fragments for nested groups. if (!SD->isBundleLocked()) { mergeFragment(getOrCreateDataFragment(), DF); BundleGroups.pop_back(); delete DF; } if (SD->getBundleLockState() != MCSectionData::BundleLockedAlignToEnd) getOrCreateDataFragment()->setAlignToBundleEnd(false); } else SD->setBundleLockState(MCSectionData::NotBundleLocked); }
void MCELFStreamer::EmitBundleUnlock() { MCSectionData *SD = getCurrentSectionData(); // Sanity checks if (!getAssembler().isBundlingEnabled()) report_fatal_error(".bundle_unlock forbidden when bundling is disabled"); else if (!SD->isBundleLocked()) report_fatal_error(".bundle_unlock without matching lock"); else if (SD->isBundleGroupBeforeFirstInst()) report_fatal_error("Empty bundle-locked group is forbidden"); SD->setBundleLockState(MCSectionData::NotBundleLocked); }
void MCELFStreamer::EmitBundleLock(bool AlignToEnd) { MCSectionData *SD = getCurrentSectionData(); // Sanity checks // if (!getAssembler().isBundlingEnabled()) report_fatal_error(".bundle_lock forbidden when bundling is disabled"); if (!SD->isBundleLocked()) SD->setBundleGroupBeforeFirstInst(true); SD->setBundleLockState(AlignToEnd ? MCSectionData::BundleLockedAlignToEnd : MCSectionData::BundleLocked); }
void MCELFStreamer::EmitBundleLock(bool AlignToEnd) { MCSectionData *SD = getCurrentSectionData(); // Sanity checks // if (!getAssembler().isBundlingEnabled()) report_fatal_error(".bundle_lock forbidden when bundling is disabled"); if (!SD->isBundleLocked()) SD->setBundleGroupBeforeFirstInst(true); if (getAssembler().getRelaxAll() && !SD->isBundleLocked()) { // TODO: drop the lock state and set directly in the fragment MCDataFragment *DF = new MCDataFragment(); BundleGroups.push_back(DF); } SD->setBundleLockState(AlignToEnd ? MCSectionData::BundleLockedAlignToEnd : MCSectionData::BundleLocked); }