[PATCH] [MC] Ensure that pending labels are flushed when -mc-relax-all flag is used

Petr Hosek phosek at chromium.org
Wed Jun 17 17:19:26 PDT 2015


- Test added
- Ensure that pending labels are always flushed


http://reviews.llvm.org/D10325

Files:
  lib/MC/MCObjectStreamer.cpp
  test/MC/X86/AlignedBundling/rodata-section.s

Index: lib/MC/MCObjectStreamer.cpp
===================================================================
--- lib/MC/MCObjectStreamer.cpp
+++ lib/MC/MCObjectStreamer.cpp
@@ -127,6 +127,7 @@
                                      const SMLoc &Loc) {
   MCStreamer::EmitValueImpl(Value, Size, Loc);
   MCDataFragment *DF = getOrCreateDataFragment();
+  flushPendingLabels(DF, DF->getContents().size());
 
   MCLineEntry::Make(this, getCurrentSection().first);
 
@@ -365,7 +366,9 @@
 
 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,
@@ -413,6 +416,7 @@
 // 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));
@@ -422,6 +426,7 @@
 // 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));
@@ -431,7 +436,9 @@
 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) {
Index: test/MC/X86/AlignedBundling/rodata-section.s
===================================================================
--- /dev/null
+++ test/MC/X86/AlignedBundling/rodata-section.s
@@ -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

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D10325.27902.patch
Type: text/x-patch
Size: 3132 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150618/69ad1d79/attachment.bin>


More information about the llvm-commits mailing list