<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Fri, May 27, 2016 at 11:49 AM, Petr Hosek 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:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Author: phosek<br>
Date: Fri May 27 13:49:44 2016<br>
New Revision: 271028<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=271028&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=271028&view=rev</a><br>
Log:<br>
[MC] Support symbolic expressions in assembly directives<br>
<br>
This matches the behavior of GNU assembler which supports symbolic<br>
expressions in absolute expressions used in assembly directives.<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D20656" rel="noreferrer" target="_blank">http://reviews.llvm.org/D20656</a><br>
<br>
Added:<br>
    llvm/trunk/test/MC/AsmParser/symbolic-expression.s<br>
Modified:<br>
    llvm/trunk/include/llvm/MC/MCObjectStreamer.h<br>
    llvm/trunk/include/llvm/MC/MCStreamer.h<br>
    llvm/trunk/lib/MC/MCAsmStreamer.cpp<br>
    llvm/trunk/lib/MC/MCObjectStreamer.cpp<br>
    llvm/trunk/lib/MC/MCParser/AsmParser.cpp<br>
    llvm/trunk/lib/MC/MCStreamer.cpp<br>
    llvm/trunk/test/MC/AsmParser/directive_fill.s<br>
    llvm/trunk/test/MC/AsmParser/directive_space.s<br>
<br>
Modified: llvm/trunk/include/llvm/MC/MCObjectStreamer.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCObjectStreamer.h?rev=271028&r1=271027&r2=271028&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCObjectStreamer.h?rev=271028&r1=271027&r2=271028&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/MC/MCObjectStreamer.h (original)<br>
+++ llvm/trunk/include/llvm/MC/MCObjectStreamer.h Fri May 27 13:49:44 2016<br>
@@ -141,6 +141,11 @@ public:<br>
   bool EmitRelocDirective(const MCExpr &Offset, StringRef Name,<br>
                           const MCExpr *Expr, SMLoc Loc) override;<br>
   void EmitFill(uint64_t NumBytes, uint8_t FillValue) override;<br>
+  void emitFill(const MCExpr &NumBytes, uint64_t FillValue,<br>
+                SMLoc Loc = SMLoc()) override;<br>
+  void emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr,<br>
+                SMLoc Loc = SMLoc()) override;<br>
+<br>
   void FinishImpl() override;<br>
<br>
   /// Emit the absolute difference between two symbols if possible.<br>
<br>
Modified: llvm/trunk/include/llvm/MC/MCStreamer.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=271028&r1=271027&r2=271028&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=271028&r1=271027&r2=271028&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/MC/MCStreamer.h (original)<br>
+++ llvm/trunk/include/llvm/MC/MCStreamer.h Fri May 27 13:49:44 2016<br>
@@ -577,6 +577,28 @@ public:<br>
   /// This implements directives such as '.space'.<br>
   virtual void EmitFill(uint64_t NumBytes, uint8_t FillValue);<br>
<br>
+  /// \brief Emit \p Size bytes worth of the value specified by \p FillValue.<br>
+  ///<br>
+  /// This is used to implement assembler directives such as .space or .skip.<br>
+  ///<br>
+  /// \param NumBytes - The number of bytes to emit.<br>
+  /// \param FillValue - The value to use when filling bytes.<br>
+  /// \param Loc - The location of the expression for error reporting.<br>
+  virtual void emitFill(const MCExpr &NumBytes, uint64_t FillValue,<br>
+                        SMLoc Loc = SMLoc());<br>
+<br>
+  /// \brief Emit \p NumValues copies of \p Size bytes. Each \p Size bytes is<br>
+  /// taken from the lowest order 4 bytes of \p Expr expression.<br>
+  ///<br>
+  /// This is used to implement assembler directives such as .fill.<br>
+  ///<br>
+  /// \param NumValues - The number of copies of \p Size bytes to emit.<br>
+  /// \param Size - The size (in bytes) of each repeated value.<br>
+  /// \param Expr - The expression from which \p Size bytes are used.<br>
+  virtual void emitFill(uint64_t NumValues, int64_t Size, int64_t Expr);<br>
+  virtual void emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr,<br>
+                        SMLoc Loc = SMLoc());<br>
+<br>
   /// \brief Emit NumBytes worth of zeros.<br>
   /// This function properly handles data in virtual sections.<br>
   void EmitZeros(uint64_t NumBytes);<br>
<br>
Modified: llvm/trunk/lib/MC/MCAsmStreamer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmStreamer.cpp?rev=271028&r1=271027&r2=271028&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmStreamer.cpp?rev=271028&r1=271027&r2=271028&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/MC/MCAsmStreamer.cpp (original)<br>
+++ llvm/trunk/lib/MC/MCAsmStreamer.cpp Fri May 27 13:49:44 2016<br>
@@ -31,6 +31,7 @@<br>
 #include "llvm/Support/LEB128.h"<br>
 #include "llvm/Support/MathExtras.h"<br>
 #include "llvm/Support/Path.h"<br>
+#include "llvm/Support/SourceMgr.h"<br>
 #include <cctype><br>
<br>
 using namespace llvm;<br>
@@ -178,6 +179,14 @@ public:<br>
<br>
   void EmitFill(uint64_t NumBytes, uint8_t FillValue) override;<br>
<br>
+  void emitFill(const MCExpr &NumBytes, uint64_t FillValue,<br>
+                SMLoc Loc = SMLoc()) override;<br>
+<br>
+  void emitFill(uint64_t NumValues, int64_t Size, int64_t Expr) override;<br>
+<br>
+  void emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr,<br>
+                SMLoc Loc = SMLoc()) override;<br>
+<br>
   void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0,<br>
                             unsigned ValueSize = 1,<br>
                             unsigned MaxBytesToEmit = 0) override;<br>
@@ -799,16 +808,41 @@ void MCAsmStreamer::EmitGPRel32Value(con<br>
 void MCAsmStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue) {<br>
   if (NumBytes == 0) return;<br>
<br>
+  const MCExpr *E = MCConstantExpr::create(NumBytes, getContext());<br>
+  emitFill(*E, FillValue);<br>
+}<br>
+<br>
+void MCAsmStreamer::emitFill(const MCExpr &NumBytes, uint64_t FillValue,<br>
+                             SMLoc Loc) {<br>
   if (const char *ZeroDirective = MAI->getZeroDirective()) {<br>
-    OS << ZeroDirective << NumBytes;<br>
+    // FIXME: Emit location directives<br>
+    OS << ZeroDirective;<br>
+    NumBytes.print(OS, MAI);<br>
     if (FillValue != 0)<br>
       OS << ',' << (int)FillValue;<br>
     EmitEOL();<br>
     return;<br>
   }<br>
<br>
-  // Emit a byte at a time.<br>
-  MCStreamer::EmitFill(NumBytes, FillValue);<br>
+  MCStreamer::emitFill(NumBytes, FillValue);<br>
+}<br>
+<br>
+void MCAsmStreamer::emitFill(uint64_t NumValues, int64_t Size, int64_t Expr) {<br>
+  if (NumValues == 0)<br>
+    return;<br>
+<br>
+  const MCExpr *E = MCConstantExpr::create(NumValues, getContext());<br>
+  emitFill(*E, Size, Expr);<br>
+}<br>
+<br>
+void MCAsmStreamer::emitFill(const MCExpr &NumValues, int64_t Size,<br>
+                             int64_t Expr, SMLoc Loc) {<br>
+  // FIXME: Emit location directives<br>
+  OS << "\t.fill\t";<br>
+  NumValues.print(OS, MAI);<br>
+  OS << ", " << Size << ", 0x";<br>
+  OS.write_hex(truncateToSize(Expr, 32));<br></blockquote><div><br></div><div>This makes no sense -- truncateToSize takes a number of bytes. Did you mean 4 here?</div><div><br></div><div>This results in undefined behavior every time this function is called, and causes test/MC/AsmParser/directive_fill.s to fail in optimized bootstraps.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
+  EmitEOL();<br>
 }<br>
<br>
 void MCAsmStreamer::EmitValueToAlignment(unsigned ByteAlignment, int64_t Value,<br>
<br>
Modified: llvm/trunk/lib/MC/MCObjectStreamer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectStreamer.cpp?rev=271028&r1=271027&r2=271028&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectStreamer.cpp?rev=271028&r1=271027&r2=271028&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/MC/MCObjectStreamer.cpp (original)<br>
+++ llvm/trunk/lib/MC/MCObjectStreamer.cpp Fri May 27 13:49:44 2016<br>
@@ -20,6 +20,7 @@<br>
 #include "llvm/MC/MCSection.h"<br>
 #include "llvm/MC/MCSymbol.h"<br>
 #include "llvm/Support/ErrorHandling.h"<br>
+#include "llvm/Support/SourceMgr.h"<br>
 #include "llvm/Support/TargetRegistry.h"<br>
 using namespace llvm;<br>
<br>
@@ -496,6 +497,43 @@ void MCObjectStreamer::EmitFill(uint64_t<br>
   insert(new MCFillFragment(FillValue, NumBytes));<br>
 }<br>
<br>
+void MCObjectStreamer::emitFill(const MCExpr &NumBytes, uint64_t FillValue,<br>
+                                SMLoc Loc) {<br>
+  MCDataFragment *DF = getOrCreateDataFragment();<br>
+  flushPendingLabels(DF, DF->getContents().size());<br>
+<br>
+  int64_t IntNumBytes;<br>
+  if (!NumBytes.evaluateAsAbsolute(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>
+  EmitFill(IntNumBytes, FillValue);<br>
+}<br>
+<br>
+void MCObjectStreamer::emitFill(const MCExpr &NumValues, int64_t Size,<br>
+                                int64_t Expr, SMLoc Loc) {<br>
+  int64_t IntNumValues;<br>
+  if (!NumValues.evaluateAsAbsolute(IntNumValues, getAssembler())) {<br>
+    getContext().reportError(Loc, "expected absolute expression");<br>
+    return;<br>
+  }<br>
+<br>
+  if (IntNumValues < 0) {<br>
+    getContext().getSourceManager()->PrintMessage(<br>
+        Loc, SourceMgr::DK_Warning,<br>
+        "'.fill' directive with negative repeat count has no effect");<br>
+    return;<br>
+  }<br>
+<br>
+  MCStreamer::emitFill(IntNumValues, Size, Expr);<br>
+}<br>
+<br>
 void MCObjectStreamer::FinishImpl() {<br>
   // If we are generating dwarf for assembly source files dump out the sections.<br>
   if (getContext().getGenDwarfForAssembly())<br>
<br>
Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=271028&r1=271027&r2=271028&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=271028&r1=271027&r2=271028&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)<br>
+++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Fri May 27 13:49:44 2016<br>
@@ -2738,8 +2738,9 @@ bool AsmParser::parseDirectiveRealValue(<br>
 bool AsmParser::parseDirectiveZero() {<br>
   checkForValidSection();<br>
<br>
-  int64_t NumBytes;<br>
-  if (parseAbsoluteExpression(NumBytes))<br>
+  SMLoc NumBytesLoc = Lexer.getLoc();<br>
+  const MCExpr *NumBytes;<br>
+  if (parseExpression(NumBytes))<br>
     return true;<br>
<br>
   int64_t Val = 0;<br>
@@ -2754,7 +2755,7 @@ bool AsmParser::parseDirectiveZero() {<br>
<br>
   Lex();<br>
<br>
-  getStreamer().EmitFill(NumBytes, Val);<br>
+  getStreamer().emitFill(*NumBytes, Val, NumBytesLoc);<br>
<br>
   return false;<br>
 }<br>
@@ -2764,17 +2765,11 @@ bool AsmParser::parseDirectiveZero() {<br>
 bool AsmParser::parseDirectiveFill() {<br>
   checkForValidSection();<br>
<br>
-  SMLoc RepeatLoc = getLexer().getLoc();<br>
-  int64_t NumValues;<br>
-  if (parseAbsoluteExpression(NumValues))<br>
+  SMLoc NumValuesLoc = Lexer.getLoc();<br>
+  const MCExpr *NumValues;<br>
+  if (parseExpression(NumValues))<br>
     return true;<br>
<br>
-  if (NumValues < 0) {<br>
-    Warning(RepeatLoc,<br>
-            "'.fill' directive with negative repeat count has no effect");<br>
-    NumValues = 0;<br>
-  }<br>
-<br>
   int64_t FillSize = 1;<br>
   int64_t FillExpr = 0;<br>
<br>
@@ -2806,7 +2801,7 @@ bool AsmParser::parseDirectiveFill() {<br>
<br>
   if (FillSize < 0) {<br>
     Warning(SizeLoc, "'.fill' directive with negative size has no effect");<br>
-    NumValues = 0;<br>
+    NumValues = MCConstantExpr::create(0, getStreamer().getContext());<br>
   }<br>
   if (FillSize > 8) {<br>
     Warning(SizeLoc, "'.fill' directive with size greater than 8 has been truncated to 8");<br>
@@ -2816,15 +2811,7 @@ bool AsmParser::parseDirectiveFill() {<br>
   if (!isUInt<32>(FillExpr) && FillSize > 4)<br>
     Warning(ExprLoc, "'.fill' directive pattern has been truncated to 32-bits");<br>
<br>
-  if (NumValues > 0) {<br>
-    int64_t NonZeroFillSize = FillSize > 4 ? 4 : FillSize;<br>
-    FillExpr &= ~0ULL >> (64 - NonZeroFillSize * 8);<br>
-    for (uint64_t i = 0, e = NumValues; i != e; ++i) {<br>
-      getStreamer().EmitIntValue(FillExpr, NonZeroFillSize);<br>
-      if (NonZeroFillSize < FillSize)<br>
-        getStreamer().EmitIntValue(0, FillSize - NonZeroFillSize);<br>
-    }<br>
-  }<br>
+  getStreamer().emitFill(*NumValues, FillSize, FillExpr, NumValuesLoc);<br>
<br>
   return false;<br>
 }<br>
@@ -4057,8 +4044,9 @@ bool AsmParser::parseDirectiveBundleUnlo<br>
 bool AsmParser::parseDirectiveSpace(StringRef IDVal) {<br>
   checkForValidSection();<br>
<br>
-  int64_t NumBytes;<br>
-  if (parseAbsoluteExpression(NumBytes))<br>
+  SMLoc NumBytesLoc = Lexer.getLoc();<br>
+  const MCExpr *NumBytes;<br>
+  if (parseExpression(NumBytes))<br>
     return true;<br>
<br>
   int64_t FillExpr = 0;<br>
@@ -4076,12 +4064,8 @@ bool AsmParser::parseDirectiveSpace(Stri<br>
<br>
   Lex();<br>
<br>
-  if (NumBytes <= 0)<br>
-    return TokError("invalid number of bytes in '" + Twine(IDVal) +<br>
-                    "' directive");<br>
-<br>
   // FIXME: Sometimes the fill expr is 'nop' if it isn't supplied, instead of 0.<br>
-  getStreamer().EmitFill(NumBytes, FillExpr);<br>
+  getStreamer().emitFill(*NumBytes, FillExpr, NumBytesLoc);<br>
<br>
   return false;<br>
 }<br>
<br>
Modified: llvm/trunk/lib/MC/MCStreamer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCStreamer.cpp?rev=271028&r1=271027&r2=271028&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCStreamer.cpp?rev=271028&r1=271027&r2=271028&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/MC/MCStreamer.cpp (original)<br>
+++ llvm/trunk/lib/MC/MCStreamer.cpp Fri May 27 13:49:44 2016<br>
@@ -135,9 +135,18 @@ void MCStreamer::EmitGPRel32Value(const<br>
 /// EmitFill - Emit NumBytes bytes worth of the value specified by<br>
 /// FillValue.  This implements directives such as '.space'.<br>
 void MCStreamer::EmitFill(uint64_t NumBytes, uint8_t FillValue) {<br>
-  const MCExpr *E = MCConstantExpr::create(FillValue, getContext());<br>
   for (uint64_t i = 0, e = NumBytes; i != e; ++i)<br>
-    EmitValue(E, 1);<br>
+    EmitIntValue(FillValue, 1);<br>
+}<br>
+<br>
+void MCStreamer::emitFill(uint64_t NumValues, int64_t Size, int64_t Expr) {<br>
+  int64_t NonZeroSize = Size > 4 ? 4 : Size;<br>
+  Expr &= ~0ULL >> (64 - NonZeroSize * 8);<br>
+  for (uint64_t i = 0, e = NumValues; i != e; ++i) {<br>
+    EmitIntValue(Expr, NonZeroSize);<br>
+    if (NonZeroSize < Size)<br>
+      EmitIntValue(0, Size - NonZeroSize);<br>
+  }<br>
 }<br>
<br>
 /// The implementation in this class just redirects to EmitFill.<br>
@@ -757,6 +766,9 @@ void MCStreamer::EmitValueImpl(const MCE<br>
 }<br>
 void MCStreamer::EmitULEB128Value(const MCExpr *Value) {}<br>
 void MCStreamer::EmitSLEB128Value(const MCExpr *Value) {}<br>
+void MCStreamer::emitFill(const MCExpr &NumBytes, uint64_t Value, SMLoc Loc) {}<br>
+void MCStreamer::emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr,<br>
+                          SMLoc Loc) {}<br>
 void MCStreamer::EmitValueToAlignment(unsigned ByteAlignment, int64_t Value,<br>
                                       unsigned ValueSize,<br>
                                       unsigned MaxBytesToEmit) {}<br>
<br>
Modified: llvm/trunk/test/MC/AsmParser/directive_fill.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/directive_fill.s?rev=271028&r1=271027&r2=271028&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/directive_fill.s?rev=271028&r1=271027&r2=271028&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/MC/AsmParser/directive_fill.s (original)<br>
+++ llvm/trunk/test/MC/AsmParser/directive_fill.s Fri May 27 13:49:44 2016<br>
@@ -1,66 +1,53 @@<br>
 # RUN: llvm-mc -triple i386-unknown-unknown %s 2> %t.err | FileCheck %s<br>
 # RUN: FileCheck --check-prefix=CHECK-WARNINGS %s < %t.err<br>
+# RUN: llvm-mc -triple i386-unknown-unknown -filetype=obj -o %t.o %s 2> %t.err<br>
+# RUN: FileCheck --check-prefix=OBJ-WARNINGS %s < %t.err<br>
<br>
 # CHECK: TEST0:<br>
-# CHECK: .byte 10<br>
+# CHECK: .fill 1, 1, 0xa<br>
 TEST0:<br>
         .fill 1, 1, 10<br>
<br>
 # CHECK: TEST1:<br>
-# CHECK: .short 3<br>
-# CHECK: .short 3<br>
+# CHECK: .fill 2, 2, 0x3<br>
 TEST1:<br>
         .fill 2, 2, 3<br>
<br>
 # CHECK: TEST2:<br>
-# CHECK: .long 4<br>
-# CHECK: .long 0<br>
+# CHECK: .fill 1, 8, 0x4<br>
 TEST2:<br>
         .fill 1, 8, 4<br>
<br>
 # CHECK: TEST3<br>
-# CHECK: .byte 0<br>
-# CHECK: .byte 0<br>
-# CHECK: .byte 0<br>
-# CHECK: .byte 0<br>
+# CHECK: .fill 4<br>
 TEST3:<br>
        .fill 4<br>
<br>
 # CHECK: TEST4<br>
-# CHECK: .short 0<br>
-# CHECK: .short 0<br>
-# CHECK: .short 0<br>
-# CHECK: .short 0<br>
+# CHECK: .fill 4, 2<br>
 TEST4:<br>
        .fill 4, 2<br>
<br>
 # CHECK: TEST5<br>
-# CHECK: .short  2<br>
-# CHECK: .byte   0<br>
-# CHECK: .short  2<br>
-# CHECK: .byte   0<br>
-# CHECK: .short  2<br>
-# CHECK: .byte   0<br>
-# CHECK: .short  2<br>
-# CHECK: .byte   0<br>
+# CHECK: .fill 4, 3, 0x2<br>
 TEST5:<br>
        .fill 4, 3, 2<br>
<br>
 # CHECK: TEST6<br>
-# CHECK: .long 2<br>
-# CHECK: .long 0<br>
+# CHECK: .fill 1, 8, 0x2<br>
 # CHECK-WARNINGS: '.fill' directive with size greater than 8 has been truncated to 8<br>
 TEST6:<br>
        .fill 1, 9, 2<br>
<br>
 # CHECK: TEST7<br>
-# CHECK: .long 0<br>
-# CHECK: .long 0<br>
+# CHECK: .fill 1, 8, 0x100000000<br>
 # CHECK-WARNINGS: '.fill' directive pattern has been truncated to 32-bits<br>
 TEST7:<br>
        .fill 1, 8, 1<<32<br>
<br>
-# CHECK-WARNINGS: '.fill' directive with negative repeat count has no effect<br>
+# CHECK: TEST8<br>
+# CHECK: .fill -1, 8, 0x1<br>
+# OBJ-WARNINGS: '.fill' directive with negative repeat count has no effect<br>
 TEST8:<br>
        .fill -1, 8, 1<br>
<br>
@@ -69,7 +56,17 @@ TEST9:<br>
        .fill 1, -1, 1<br>
<br>
 # CHECK: TEST10<br>
-# CHECK: .short  22136<br>
-# CHECK: .byte   52<br>
+# CHECK: .fill 1, 3, 0x12345678<br>
 TEST10:<br>
        .fill 1, 3, 0x12345678<br>
+<br>
+# CHECK: TEST11<br>
+# CHECK: .fill TEST11-TEST10, 1, 0x0<br>
+TEST11:<br>
+  .fill TEST11 - TEST10<br>
+<br>
+# CHECK: TEST12<br>
+# CHECK: .fill TEST11-TEST12, 3, 0x12345678<br>
+# OBJ-WARNINGS: '.fill' directive with negative repeat count has no effect<br>
+TEST12:<br>
+  .fill TEST11 - TEST12, 3, 0x12345678<br>
<br>
Modified: llvm/trunk/test/MC/AsmParser/directive_space.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/directive_space.s?rev=271028&r1=271027&r2=271028&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/directive_space.s?rev=271028&r1=271027&r2=271028&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/MC/AsmParser/directive_space.s (original)<br>
+++ llvm/trunk/test/MC/AsmParser/directive_space.s Fri May 27 13:49:44 2016<br>
@@ -14,3 +14,8 @@ TEST1:<br>
 # CHECK: .space 1<br>
 TEST2:<br>
         .skip 1<br>
+<br>
+# CHECK: TEST3<br>
+# CHECK: .space TEST0-TEST1<br>
+TEST3:<br>
+        .space TEST0 - TEST1<br>
<br>
Added: llvm/trunk/test/MC/AsmParser/symbolic-expression.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/symbolic-expression.s?rev=271028&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/AsmParser/symbolic-expression.s?rev=271028&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/MC/AsmParser/symbolic-expression.s (added)<br>
+++ llvm/trunk/test/MC/AsmParser/symbolic-expression.s Fri May 27 13:49:44 2016<br>
@@ -0,0 +1,17 @@<br>
+# RUN: llvm-mc -filetype=obj -triple=i386-unknown-elf %s | llvm-objdump -t - | FileCheck %s<br>
+<br>
+# CHECK: 00000000         .text           00000000 TEST0<br>
+TEST0:<br>
+  .fill 0x10<br>
+# CHECK: 00000010         .text           00000000 TEST1<br>
+TEST1:<br>
+  .fill TEST1 - TEST0 + 0x5<br>
+# CHECK: 00000025         .text           00000000 TEST2<br>
+TEST2:<br>
+  .zero TEST2 - (TEST1 + 0x5)<br>
+# CHECK: 00000035         .text           00000000 TEST3<br>
+TEST3:<br>
+  .skip (TEST1 - TEST0) * 2<br>
+# CHECK: 00000055         .text           00000000 TEST4<br>
+TEST4:<br>
+  .space TEST2 - TEST1, 1<br>
<br>
<br>
_______________________________________________<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/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>