aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDerek Schuff <dschuff@chromium.org>2013-02-15 14:54:04 -0800
committerDerek Schuff <dschuff@chromium.org>2013-02-15 14:54:04 -0800
commitde82c04bfc33b44fc650cf7f330dbf26992faf8b (patch)
treed06a2ef7d67d0b97551b9384dd361e6e053f82ec
parent9e1067bd3646621b7691cc3947ca0bd9f087a0af (diff)
Cherry-pick r175316 from upstream
-rw-r--r--lib/MC/MCELFStreamer.cpp7
-rw-r--r--lib/MC/MCObjectStreamer.cpp4
-rw-r--r--test/MC/ARM/AlignedBundling/group-bundle-arm.s15
3 files changed, 20 insertions, 6 deletions
diff --git a/lib/MC/MCELFStreamer.cpp b/lib/MC/MCELFStreamer.cpp
index e5b749e28b..27587d312a 100644
--- a/lib/MC/MCELFStreamer.cpp
+++ b/lib/MC/MCELFStreamer.cpp
@@ -384,7 +384,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
@@ -392,8 +394,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 471170491e..8130c9b532 100644
--- a/lib/MC/MCObjectStreamer.cpp
+++ b/lib/MC/MCObjectStreamer.cpp
@@ -62,7 +62,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;
}
diff --git a/test/MC/ARM/AlignedBundling/group-bundle-arm.s b/test/MC/ARM/AlignedBundling/group-bundle-arm.s
index 823d9e0cb8..1d67353200 100644
--- a/test/MC/ARM/AlignedBundling/group-bundle-arm.s
+++ b/test/MC/ARM/AlignedBundling/group-bundle-arm.s
@@ -5,8 +5,8 @@
# instructions should not be inserted. However, for bundle-locked groups
# it can be.
- .syntax unified
- .text
+ .syntax unified
+ .text
.bundle_align_mode 4
bx lr
@@ -35,3 +35,14 @@
# CHECK-NEXT: 2c: nop
# CHECK-NEXT: 30: bx
+ .align 4
+foo:
+ b foo
+ .long 3892240112
+ .long 3892240112
+ .long 3892240112
+ .long 3892240112
+ .long 3892240112
+ .long 3892240112
+# CHECK: 40: b
+