diff options
author | Derek Schuff <dschuff@google.com> | 2013-02-15 22:50:52 +0000 |
---|---|---|
committer | Derek Schuff <dschuff@google.com> | 2013-02-15 22:50:52 +0000 |
commit | 8878bcc9e7b68158281f251fe664378603d4edb9 (patch) | |
tree | 0fd11e6fff685ee464289c39d520d82347078a35 /llvm/lib/MC/MCELFStreamer.cpp | |
parent | 5a92eeca6b2b769f9ddab026f2db9806879cdf47 (diff) | |
download | bcm5719-llvm-8878bcc9e7b68158281f251fe664378603d4edb9.tar.gz bcm5719-llvm-8878bcc9e7b68158281f251fe664378603d4edb9.zip |
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.
llvm-svn: 175316
Diffstat (limited to 'llvm/lib/MC/MCELFStreamer.cpp')
-rw-r--r-- | llvm/lib/MC/MCELFStreamer.cpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/llvm/lib/MC/MCELFStreamer.cpp b/llvm/lib/MC/MCELFStreamer.cpp index c4c8e6e4e7d..8ddbfbbe8a4 100644 --- a/llvm/lib/MC/MCELFStreamer.cpp +++ b/llvm/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 |