mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 16:33:28 +00:00
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
This commit is contained in:
parent
4788d14b48
commit
67144e37ba
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user