svn commit: r328596 - in head/contrib/llvm: include/llvm/MC lib/MC

Ed Maste emaste at FreeBSD.org
Tue Jan 30 16:43:22 UTC 2018


Author: emaste
Date: Tue Jan 30 16:43:20 2018
New Revision: 328596
URL: https://svnweb.freebsd.org/changeset/base/328596

Log:
  Pull in r322131 from upstream llvm trunk (by Rafael Espíndola):
  
    Use a MCExpr for the size of MCFillFragment.
  
    This allows the size to be found during ralaxation. This fixes
    [LLVM] pr35858.
  
  Requested by:	royger

Modified:
  head/contrib/llvm/include/llvm/MC/MCFragment.h
  head/contrib/llvm/lib/MC/MCAssembler.cpp
  head/contrib/llvm/lib/MC/MCObjectStreamer.cpp
  head/contrib/llvm/lib/MC/WasmObjectWriter.cpp

Modified: head/contrib/llvm/include/llvm/MC/MCFragment.h
==============================================================================
--- head/contrib/llvm/include/llvm/MC/MCFragment.h	Tue Jan 30 16:42:08 2018	(r328595)
+++ head/contrib/llvm/include/llvm/MC/MCFragment.h	Tue Jan 30 16:43:20 2018	(r328596)
@@ -422,14 +422,21 @@ class MCFillFragment : public MCFragment {
   uint8_t Value;
 
   /// The number of bytes to insert.
-  uint64_t Size;
+  const MCExpr &Size;
 
+  /// Source location of the directive that this fragment was created for.
+  SMLoc Loc;
+
 public:
-  MCFillFragment(uint8_t Value, uint64_t Size, MCSection *Sec = nullptr)
-      : MCFragment(FT_Fill, false, 0, Sec), Value(Value), Size(Size) {}
+  MCFillFragment(uint8_t Value, const MCExpr &Size, SMLoc Loc,
+                 MCSection *Sec = nullptr)
+      : MCFragment(FT_Fill, false, 0, Sec), Value(Value), Size(Size), Loc(Loc) {
+  }
 
   uint8_t getValue() const { return Value; }
-  uint64_t getSize() const { return Size; }
+  const MCExpr &getSize() const { return Size; }
+
+  SMLoc getLoc() const { return Loc; }
 
   static bool classof(const MCFragment *F) {
     return F->getKind() == MCFragment::FT_Fill;

Modified: head/contrib/llvm/lib/MC/MCAssembler.cpp
==============================================================================
--- head/contrib/llvm/lib/MC/MCAssembler.cpp	Tue Jan 30 16:42:08 2018	(r328595)
+++ head/contrib/llvm/lib/MC/MCAssembler.cpp	Tue Jan 30 16:43:20 2018	(r328596)
@@ -281,8 +281,18 @@ uint64_t MCAssembler::computeFragmentSize(const MCAsmL
     return cast<MCRelaxableFragment>(F).getContents().size();
   case MCFragment::FT_CompactEncodedInst:
     return cast<MCCompactEncodedInstFragment>(F).getContents().size();
-  case MCFragment::FT_Fill:
-    return cast<MCFillFragment>(F).getSize();
+  case MCFragment::FT_Fill: {
+    auto &FF = cast<MCFillFragment>(F);
+    int64_t Size = 0;
+    if (!FF.getSize().evaluateAsAbsolute(Size, Layout))
+      getContext().reportError(FF.getLoc(),
+                               "expected assembly-time absolute expression");
+    if (Size < 0) {
+      getContext().reportError(FF.getLoc(), "invalid number of bytes");
+      return 0;
+    }
+    return Size;
+  }
 
   case MCFragment::FT_LEB:
     return cast<MCLEBFragment>(F).getContents().size();
@@ -540,7 +550,7 @@ static void writeFragment(const MCAssembler &Asm, cons
     for (unsigned I = 1; I < MaxChunkSize; ++I)
       Data[I] = Data[0];
 
-    uint64_t Size = FF.getSize();
+    uint64_t Size = FragmentSize;
     for (unsigned ChunkSize = MaxChunkSize; ChunkSize; ChunkSize /= 2) {
       StringRef Ref(Data, ChunkSize);
       for (uint64_t I = 0, E = Size / ChunkSize; I != E; ++I)

Modified: head/contrib/llvm/lib/MC/MCObjectStreamer.cpp
==============================================================================
--- head/contrib/llvm/lib/MC/MCObjectStreamer.cpp	Tue Jan 30 16:42:08 2018	(r328595)
+++ head/contrib/llvm/lib/MC/MCObjectStreamer.cpp	Tue Jan 30 16:43:20 2018	(r328596)
@@ -582,19 +582,8 @@ void MCObjectStreamer::emitFill(const MCExpr &NumBytes
   MCDataFragment *DF = getOrCreateDataFragment();
   flushPendingLabels(DF, DF->getContents().size());
 
-  int64_t IntNumBytes;
-  if (!NumBytes.evaluateAsAbsolute(IntNumBytes, getAssembler())) {
-    getContext().reportError(Loc, "expected absolute expression");
-    return;
-  }
-
-  if (IntNumBytes < 0) {
-    getContext().reportError(Loc, "invalid number of bytes");
-    return;
-  }
-
   assert(getCurrentSectionOnly() && "need a section");
-  insert(new MCFillFragment(FillValue, IntNumBytes));
+  insert(new MCFillFragment(FillValue, NumBytes, Loc));
 }
 
 void MCObjectStreamer::emitFill(const MCExpr &NumValues, int64_t Size,

Modified: head/contrib/llvm/lib/MC/WasmObjectWriter.cpp
==============================================================================
--- head/contrib/llvm/lib/MC/WasmObjectWriter.cpp	Tue Jan 30 16:42:08 2018	(r328595)
+++ head/contrib/llvm/lib/MC/WasmObjectWriter.cpp	Tue Jan 30 16:43:20 2018	(r328596)
@@ -528,7 +528,10 @@ static void addData(SmallVectorImpl<char> &DataBytes,
                                              Align->getMaxBytesToEmit());
       DataBytes.resize(Size, Value);
     } else if (auto *Fill = dyn_cast<MCFillFragment>(&Frag)) {
-      DataBytes.insert(DataBytes.end(), Fill->getSize(), Fill->getValue());
+      int64_t Size;
+      if (!Fill->getSize().evaluateAsAbsolute(Size))
+        llvm_unreachable("The fill should be an assembler constant");
+      DataBytes.insert(DataBytes.end(), Size, Fill->getValue());
     } else {
       const auto &DataFrag = cast<MCDataFragment>(Frag);
       const SmallVectorImpl<char> &Contents = DataFrag.getContents();


More information about the svn-src-all mailing list