summaryrefslogtreecommitdiff
path: root/lib/MC
diff options
context:
space:
mode:
authorDerek Schuff <dschuff@google.com>2013-02-15 22:50:52 +0000
committerDerek Schuff <dschuff@google.com>2013-02-15 22:50:52 +0000
commit67144e37ba5cd35ee917daac631e03963b05a674 (patch)
tree0c6baab3975cf0d06248d7eb46d7e4b931fe620c /lib/MC
parent4788d14b484ba9e2fe19855fd6c97a3659980fca (diff)
If bundle alignment is enabled, do not add data to a fragment with instructions
With bundle alignment, instructions all get their own MCFragments (unless they are in a bundle-locked group). For instructions with fixups, this is an MCDataFragment. Emitting actual data (e.g. for .long) attempts to re-use MCDataFragments, which we don't want int this case since it leads to fragments which exceed the bundle size. So, don't reuse them in this case. Also adds a test and fixes some formatting. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175316 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/MC')
-rw-r--r--lib/MC/MCELFStreamer.cpp7
-rw-r--r--lib/MC/MCObjectStreamer.cpp4
2 files changed, 7 insertions, 4 deletions
diff --git a/lib/MC/MCELFStreamer.cpp b/lib/MC/MCELFStreamer.cpp
index c4c8e6e4e7d..8ddbfbbe8a4 100644
--- a/lib/MC/MCELFStreamer.cpp
+++ b/lib/MC/MCELFStreamer.cpp
@@ -386,7 +386,9 @@ void MCELFStreamer::EmitInstToData(const MCInst &Inst) {
if (Assembler.isBundlingEnabled()) {
MCSectionData *SD = getCurrentSectionData();
if (SD->isBundleLocked() && !SD->isBundleGroupBeforeFirstInst())
- DF = getOrCreateDataFragment();
+ // If we are bundle-locked, we re-use the current fragment.
+ // The bundle-locking directive ensures this is a new data fragment.
+ DF = cast<MCDataFragment>(getCurrentFragment());
else if (!SD->isBundleLocked() && Fixups.size() == 0) {
// Optimize memory usage by emitting the instruction to a
// MCCompactEncodedInstFragment when not in a bundle-locked group and
@@ -394,8 +396,7 @@ void MCELFStreamer::EmitInstToData(const MCInst &Inst) {
MCCompactEncodedInstFragment *CEIF = new MCCompactEncodedInstFragment(SD);
CEIF->getContents().append(Code.begin(), Code.end());
return;
- }
- else {
+ } else {
DF = new MCDataFragment(SD);
if (SD->getBundleLockState() == MCSectionData::BundleLockedAlignToEnd) {
// If this is a new fragment created for a bundle-locked group, and the
diff --git a/lib/MC/MCObjectStreamer.cpp b/lib/MC/MCObjectStreamer.cpp
index fe435061eb4..b6c7341469d 100644
--- a/lib/MC/MCObjectStreamer.cpp
+++ b/lib/MC/MCObjectStreamer.cpp
@@ -59,7 +59,9 @@ MCFragment *MCObjectStreamer::getCurrentFragment() const {
MCDataFragment *MCObjectStreamer::getOrCreateDataFragment() const {
MCDataFragment *F = dyn_cast_or_null<MCDataFragment>(getCurrentFragment());
- if (!F)
+ // When bundling is enabled, we don't want to add data to a fragment that
+ // already has instructions (see MCELFStreamer::EmitInstToData for details)
+ if (!F || (Assembler->isBundlingEnabled() && F->hasInstructions()))
F = new MCDataFragment(getCurrentSectionData());
return F;
}