<p dir="ltr">What happens if you try to print the assembly back out? I.e., if you run llvm-mc with filetype=obj?</p>
<p dir="ltr">Cheers,<br>
Rafael</p>
<div class="gmail_quote">On May 17, 2016 5:48 PM, "Petr Hosek via llvm-commits" <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br type="attribution"><blockquote class="quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">phosek created this revision.<br>
phosek added a subscriber: llvm-commits.<br>
phosek set the repository for this revision to rL LLVM.<br>
<br>
This matches the behavior of GNU assembler which supports symbolic expressions in absolute expressions used in assembly directives.<br>
<br>
Repository:<br>
  rL LLVM<br>
<br>
<a href="http://reviews.llvm.org/D20337" rel="noreferrer" target="_blank">http://reviews.llvm.org/D20337</a><br>
<br>
Files:<br>
  include/llvm/MC/MCObjectStreamer.h<br>
  include/llvm/MC/MCStreamer.h<br>
  lib/MC/MCParser/AsmParser.cpp<br>
  test/MC/AsmParser/symbolic-expression.s<br>
<br>
Index: test/MC/AsmParser/symbolic-expression.s<br>
===================================================================<br>
--- /dev/null<br>
+++ test/MC/AsmParser/symbolic-expression.s<br>
@@ -0,0 +1,18 @@<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>
+  .align (TEST1 - TEST0) * 8<br>
+# CHECK: 00000080         .text           00000000 TEST4<br>
+TEST4:<br>
+# CHECK: 00000015 g       *COM*           00000010 a<br>
+  .comm a, TEST2 - TEST1, TEST1 - TEST0<br>
Index: lib/MC/MCParser/AsmParser.cpp<br>
===================================================================<br>
--- lib/MC/MCParser/AsmParser.cpp<br>
+++ lib/MC/MCParser/AsmParser.cpp<br>
@@ -1131,7 +1131,7 @@<br>
   if (parseExpression(Expr))<br>
     return true;<br>
<br>
-  if (!Expr->evaluateAsAbsolute(Res))<br>
+  if (!getStreamer().evaluateAsAbsolute(Expr, Res))<br>
     return Error(StartLoc, "expected absolute expression");<br>
<br>
   return false;<br>
Index: include/llvm/MC/MCStreamer.h<br>
===================================================================<br>
--- include/llvm/MC/MCStreamer.h<br>
+++ include/llvm/MC/MCStreamer.h<br>
@@ -772,6 +772,11 @@<br>
   void Finish();<br>
<br>
   virtual bool mayHaveInstructions(MCSection &Sec) const { return true; }<br>
+<br>
+  /// \brief Try to evaluate the \p Value as an absolute value.<br>
+  virtual bool evaluateAsAbsolute(const MCExpr *Value, int64_t &Res) {<br>
+    return Value->evaluateAsAbsolute(Res);<br>
+  }<br>
 };<br>
<br>
 /// Create a dummy machine code streamer, which does nothing. This is useful for<br>
Index: include/llvm/MC/MCObjectStreamer.h<br>
===================================================================<br>
--- include/llvm/MC/MCObjectStreamer.h<br>
+++ include/llvm/MC/MCObjectStreamer.h<br>
@@ -154,6 +154,12 @@<br>
                               unsigned Size) override;<br>
<br>
   bool mayHaveInstructions(MCSection &Sec) const override;<br>
+<br>
+  bool evaluateAsAbsolute(const MCExpr *Value, int64_t &Res) override {<br>
+    MCDataFragment *DF = getOrCreateDataFragment();<br>
+    flushPendingLabels(DF, DF->getContents().size());<br>
+    return Value->evaluateAsAbsolute(Res, getAssembler());<br>
+  }<br>
 };<br>
<br>
 } // end namespace llvm<br>
<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>
<br></blockquote></div>