<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>