<div dir="ltr">Merged along with dependents in r323735 (PR36139).</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jan 9, 2018 at 11:48 PM, Rafael Espindola via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rafael<br>
Date: Tue Jan  9 14:48:37 2018<br>
New Revision: 322131<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=322131&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=322131&view=rev</a><br>
Log:<br>
Use a MCExpr for the size of MCFillFragment.<br>
<br>
This allows the size to be found during ralaxation. This fixes<br>
pr35858.<br>
<br>
Added:<br>
    llvm/trunk/test/MC/X86/eval-<wbr>fill.s<br>
Modified:<br>
    llvm/trunk/include/llvm/MC/<wbr>MCFragment.h<br>
    llvm/trunk/lib/MC/MCAssembler.<wbr>cpp<br>
    llvm/trunk/lib/MC/<wbr>MCObjectStreamer.cpp<br>
    llvm/trunk/lib/MC/<wbr>WasmObjectWriter.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/MC/<wbr>MCFragment.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCFragment.h?rev=322131&r1=322130&r2=322131&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/include/<wbr>llvm/MC/MCFragment.h?rev=<wbr>322131&r1=322130&r2=322131&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/include/llvm/MC/<wbr>MCFragment.h (original)<br>
+++ llvm/trunk/include/llvm/MC/<wbr>MCFragment.h Tue Jan  9 14:48:37 2018<br>
@@ -422,14 +422,21 @@ class MCFillFragment : public MCFragment<br>
   uint8_t Value;<br>
<br>
   /// The number of bytes to insert.<br>
-  uint64_t Size;<br>
+  const MCExpr &Size;<br>
+<br>
+  /// Source location of the directive that this fragment was created for.<br>
+  SMLoc Loc;<br>
<br>
 public:<br>
-  MCFillFragment(uint8_t Value, uint64_t Size, MCSection *Sec = nullptr)<br>
-      : MCFragment(FT_Fill, false, 0, Sec), Value(Value), Size(Size) {}<br>
+  MCFillFragment(uint8_t Value, const MCExpr &Size, SMLoc Loc,<br>
+                 MCSection *Sec = nullptr)<br>
+      : MCFragment(FT_Fill, false, 0, Sec), Value(Value), Size(Size), Loc(Loc) {<br>
+  }<br>
<br>
   uint8_t getValue() const { return Value; }<br>
-  uint64_t getSize() const { return Size; }<br>
+  const MCExpr &getSize() const { return Size; }<br>
+<br>
+  SMLoc getLoc() const { return Loc; }<br>
<br>
   static bool classof(const MCFragment *F) {<br>
     return F->getKind() == MCFragment::FT_Fill;<br>
<br>
Modified: llvm/trunk/lib/MC/MCAssembler.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAssembler.cpp?rev=322131&r1=322130&r2=322131&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/MC/<wbr>MCAssembler.cpp?rev=322131&r1=<wbr>322130&r2=322131&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/MC/MCAssembler.<wbr>cpp (original)<br>
+++ llvm/trunk/lib/MC/MCAssembler.<wbr>cpp Tue Jan  9 14:48:37 2018<br>
@@ -281,8 +281,18 @@ uint64_t MCAssembler::<wbr>computeFragmentSiz<br>
     return cast<MCRelaxableFragment>(F).<wbr>getContents().size();<br>
   case MCFragment::FT_<wbr>CompactEncodedInst:<br>
     return cast<<wbr>MCCompactEncodedInstFragment>(<wbr>F).getContents().size();<br>
-  case MCFragment::FT_Fill:<br>
-    return cast<MCFillFragment>(F).<wbr>getSize();<br>
+  case MCFragment::FT_Fill: {<br>
+    auto &FF = cast<MCFillFragment>(F);<br>
+    int64_t Size = 0;<br>
+    if (!FF.getSize().<wbr>evaluateAsAbsolute(Size, Layout))<br>
+      getContext().reportError(FF.<wbr>getLoc(),<br>
+                               "expected assembly-time absolute expression");<br>
+    if (Size < 0) {<br>
+      getContext().reportError(FF.<wbr>getLoc(), "invalid number of bytes");<br>
+      return 0;<br>
+    }<br>
+    return Size;<br>
+  }<br>
<br>
   case MCFragment::FT_LEB:<br>
     return cast<MCLEBFragment>(F).<wbr>getContents().size();<br>
@@ -540,7 +550,7 @@ static void writeFragment(const MCAssemb<br>
     for (unsigned I = 1; I < MaxChunkSize; ++I)<br>
       Data[I] = Data[0];<br>
<br>
-    uint64_t Size = FF.getSize();<br>
+    uint64_t Size = FragmentSize;<br>
     for (unsigned ChunkSize = MaxChunkSize; ChunkSize; ChunkSize /= 2) {<br>
       StringRef Ref(Data, ChunkSize);<br>
       for (uint64_t I = 0, E = Size / ChunkSize; I != E; ++I)<br>
<br>
Modified: llvm/trunk/lib/MC/<wbr>MCObjectStreamer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectStreamer.cpp?rev=322131&r1=322130&r2=322131&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/MC/<wbr>MCObjectStreamer.cpp?rev=<wbr>322131&r1=322130&r2=322131&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/MC/<wbr>MCObjectStreamer.cpp (original)<br>
+++ llvm/trunk/lib/MC/<wbr>MCObjectStreamer.cpp Tue Jan  9 14:48:37 2018<br>
@@ -582,19 +582,8 @@ void MCObjectStreamer::emitFill(<wbr>const MC<br>
   MCDataFragment *DF = getOrCreateDataFragment();<br>
   flushPendingLabels(DF, DF->getContents().size());<br>
<br>
-  int64_t IntNumBytes;<br>
-  if (!NumBytes.evaluateAsAbsolute(<wbr>IntNumBytes, getAssembler())) {<br>
-    getContext().reportError(Loc, "expected absolute expression");<br>
-    return;<br>
-  }<br>
-<br>
-  if (IntNumBytes < 0) {<br>
-    getContext().reportError(Loc, "invalid number of bytes");<br>
-    return;<br>
-  }<br>
-<br>
   assert(getCurrentSectionOnly() && "need a section");<br>
-  insert(new MCFillFragment(FillValue, IntNumBytes));<br>
+  insert(new MCFillFragment(FillValue, NumBytes, Loc));<br>
 }<br>
<br>
 void MCObjectStreamer::emitFill(<wbr>const MCExpr &NumValues, int64_t Size,<br>
<br>
Modified: llvm/trunk/lib/MC/<wbr>WasmObjectWriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WasmObjectWriter.cpp?rev=322131&r1=322130&r2=322131&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/lib/MC/<wbr>WasmObjectWriter.cpp?rev=<wbr>322131&r1=322130&r2=322131&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/lib/MC/<wbr>WasmObjectWriter.cpp (original)<br>
+++ llvm/trunk/lib/MC/<wbr>WasmObjectWriter.cpp Tue Jan  9 14:48:37 2018<br>
@@ -528,7 +528,10 @@ static void addData(SmallVectorImpl<char<br>
                                              Align->getMaxBytesToEmit());<br>
       DataBytes.resize(Size, Value);<br>
     } else if (auto *Fill = dyn_cast<MCFillFragment>(&<wbr>Frag)) {<br>
-      DataBytes.insert(DataBytes.<wbr>end(), Fill->getSize(), Fill->getValue());<br>
+      int64_t Size;<br>
+      if (!Fill->getSize().<wbr>evaluateAsAbsolute(Size))<br>
+        llvm_unreachable("The fill should be an assembler constant");<br>
+      DataBytes.insert(DataBytes.<wbr>end(), Size, Fill->getValue());<br>
     } else {<br>
       const auto &DataFrag = cast<MCDataFragment>(Frag);<br>
       const SmallVectorImpl<char> &Contents = DataFrag.getContents();<br>
<br>
Added: llvm/trunk/test/MC/X86/eval-<wbr>fill.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/X86/eval-fill.s?rev=322131&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/llvm/trunk/test/MC/<wbr>X86/eval-fill.s?rev=322131&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- llvm/trunk/test/MC/X86/eval-<wbr>fill.s (added)<br>
+++ llvm/trunk/test/MC/X86/eval-<wbr>fill.s Tue Jan  9 14:48:37 2018<br>
@@ -0,0 +1,17 @@<br>
+// RUN: llvm-mc -filetype=obj %s -o - -triple x86_64-pc-linux | llvm-readobj -s | FileCheck %s<br>
+<br>
+// CHECK:      Name: .text<br>
+// CHECK-NEXT: Type: SHT_PROGBITS<br>
+// CHECK-NEXT: Flags [<br>
+// CHECK-NEXT:   SHF_ALLOC<br>
+// CHECK-NEXT:   SHF_EXECINSTR<br>
+// CHECK-NEXT: ]<br>
+// CHECK-NEXT: Address:<br>
+// CHECK-NEXT: Offset:<br>
+// CHECK-NEXT: Size: 4092<br>
+<br>
+        .globl  foo<br>
+foo:<br>
+        .space 4<br>
+bar:<br>
+        .space  4092 - (bar - foo)<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>