[llvm] r240870 - [MC] Ensure that pending labels are flushed when -mc-relax-all flag is used
Petr Hosek
phosek at chromium.org
Fri Jun 26 18:54:17 PDT 2015
Author: phosek
Date: Fri Jun 26 20:54:17 2015
New Revision: 240870
URL: http://llvm.org/viewvc/llvm-project?rev=240870&view=rev
Log:
[MC] Ensure that pending labels are flushed when -mc-relax-all flag is used
Summary:
The current implementation doesn't always flush all pending labels
beforeemitting data which can result in an incorrectly placed labels in
case when when instruction bundling is enabled and -mc-relax-all flag is
being used. To address this issue, we always flush pending labels before
emitting data.
The change was tested by running PNaCl toolchain trybots with
-mc-relax-all flag set.
Fixes https://code.google.com/p/nativeclient/issues/detail?id=4063
Test Plan: Regression test attached
Reviewers: mseaborn
Subscribers: jfb, llvm-commits
Differential Revision: http://reviews.llvm.org/D10325
Added:
llvm/trunk/test/MC/X86/AlignedBundling/rodata-section.s
Modified:
llvm/trunk/lib/MC/MCObjectStreamer.cpp
Modified: llvm/trunk/lib/MC/MCObjectStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectStreamer.cpp?rev=240870&r1=240869&r2=240870&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCObjectStreamer.cpp (original)
+++ llvm/trunk/lib/MC/MCObjectStreamer.cpp Fri Jun 26 20:54:17 2015
@@ -124,6 +124,7 @@ void MCObjectStreamer::EmitValueImpl(con
const SMLoc &Loc) {
MCStreamer::EmitValueImpl(Value, Size, Loc);
MCDataFragment *DF = getOrCreateDataFragment();
+ flushPendingLabels(DF, DF->getContents().size());
MCLineEntry::Make(this, getCurrentSection().first);
@@ -362,7 +363,9 @@ void MCObjectStreamer::EmitDwarfAdvanceF
void MCObjectStreamer::EmitBytes(StringRef Data) {
MCLineEntry::Make(this, getCurrentSection().first);
- getOrCreateDataFragment()->getContents().append(Data.begin(), Data.end());
+ MCDataFragment *DF = getOrCreateDataFragment();
+ flushPendingLabels(DF, DF->getContents().size());
+ DF->getContents().append(Data.begin(), Data.end());
}
void MCObjectStreamer::EmitValueToAlignment(unsigned ByteAlignment,
@@ -410,6 +413,7 @@ bool MCObjectStreamer::EmitValueToOffset
// Associate GPRel32 fixup with data and resize data area
void MCObjectStreamer::EmitGPRel32Value(const MCExpr *Value) {
MCDataFragment *DF = getOrCreateDataFragment();
+ flushPendingLabels(DF, DF->getContents().size());
DF->getFixups().push_back(MCFixup::create(DF->getContents().size(),
Value, FK_GPRel_4));
@@ -419,6 +423,7 @@ void MCObjectStreamer::EmitGPRel32Value(
// Associate GPRel32 fixup with data and resize data area
void MCObjectStreamer::EmitGPRel64Value(const MCExpr *Value) {
MCDataFragment *DF = getOrCreateDataFragment();
+ flushPendingLabels(DF, DF->getContents().size());
DF->getFixups().push_back(MCFixup::create(DF->getContents().size(),
Value, FK_GPRel_4));
@@ -428,7 +433,9 @@ void MCObjectStreamer::EmitGPRel64Value(
void MCObjectStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue) {
// FIXME: A MCFillFragment would be more memory efficient but MCExpr has
// problems evaluating expressions across multiple fragments.
- getOrCreateDataFragment()->getContents().append(NumBytes, FillValue);
+ MCDataFragment *DF = getOrCreateDataFragment();
+ flushPendingLabels(DF, DF->getContents().size());
+ DF->getContents().append(NumBytes, FillValue);
}
void MCObjectStreamer::EmitZeros(uint64_t NumBytes) {
Added: llvm/trunk/test/MC/X86/AlignedBundling/rodata-section.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/X86/AlignedBundling/rodata-section.s?rev=240870&view=auto
==============================================================================
--- llvm/trunk/test/MC/X86/AlignedBundling/rodata-section.s (added)
+++ llvm/trunk/test/MC/X86/AlignedBundling/rodata-section.s Fri Jun 26 20:54:17 2015
@@ -0,0 +1,30 @@
+# RUN: llvm-mc -triple=i686-nacl -filetype=obj %s -o - \
+# RUN: | llvm-objdump -disassemble -no-show-raw-insn - | FileCheck %s
+# RUN: llvm-mc -triple=i686-nacl -filetype=obj -mc-relax-all %s -o - \
+# RUN: | llvm-objdump -disassemble -no-show-raw-insn - | FileCheck %s
+
+ .bundle_align_mode 5
+ .text
+ .align 32, 0x90
+# CHECK: 0: movl $14, 8(%esp)
+ movl $.str2, 8(%esp)
+# CHECK: 8: movl $7, 4(%esp)
+ movl $.str1, 4(%esp)
+# CHECK: 10: movl $0, (%esp)
+ movl $.str, (%esp)
+
+ .type .str, at object
+ .section .rodata,"a", at progbits
+.str:
+ .asciz "hello1"
+ .size .str, 7
+
+ .type .str1, at object
+.str1:
+ .asciz "hello2"
+ .size .str1, 7
+
+ .type .str2, at object
+.str2:
+ .asciz "hello3"
+ .size .str2, 7
More information about the llvm-commits
mailing list