diff options
author | Derek Schuff <dschuff@chromium.org> | 2013-02-15 14:54:04 -0800 |
---|---|---|
committer | Derek Schuff <dschuff@chromium.org> | 2013-02-15 14:54:04 -0800 |
commit | de82c04bfc33b44fc650cf7f330dbf26992faf8b (patch) | |
tree | d06a2ef7d67d0b97551b9384dd361e6e053f82ec | |
parent | 9e1067bd3646621b7691cc3947ca0bd9f087a0af (diff) |
Cherry-pick r175316 from upstream
-rw-r--r-- | lib/MC/MCELFStreamer.cpp | 7 | ||||
-rw-r--r-- | lib/MC/MCObjectStreamer.cpp | 4 | ||||
-rw-r--r-- | test/MC/ARM/AlignedBundling/group-bundle-arm.s | 15 |
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 + |