Add some limited support for labels in org directives. Hopefully enough to fix
authorRafael Espindola <rafael.espindola@gmail.com>
Sun, 20 Feb 2011 20:20:07 +0000 (20:20 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Sun, 20 Feb 2011 20:20:07 +0000 (20:20 +0000)
PR9245.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126091 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/MCObjectStreamer.cpp
test/MC/ELF/org.s [new file with mode: 0644]

index 035826690cdfaba2c1caa4f975dc47fe22885859..e67d9b03a95a33257557823bbdf132e7aa602e65 100644 (file)
@@ -242,7 +242,23 @@ void MCObjectStreamer::EmitDwarfAdvanceFrameAddr(const MCSymbol *LastLabel,
 
 void MCObjectStreamer::EmitValueToOffset(const MCExpr *Offset,
                                         unsigned char Value) {
-  new MCOrgFragment(*Offset, Value, getCurrentSectionData());
+  int64_t Res;
+  if (Offset->EvaluateAsAbsolute(Res, getAssembler())) {
+    new MCOrgFragment(*Offset, Value, getCurrentSectionData());
+    return;
+  }
+
+  MCSymbol *CurrentPos = getContext().CreateTempSymbol();
+  EmitLabel(CurrentPos);
+  MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
+  const MCExpr *Ref =
+    MCSymbolRefExpr::Create(CurrentPos, Variant, getContext());
+  const MCExpr *Delta =
+    MCBinaryExpr::Create(MCBinaryExpr::Sub, Offset, Ref, getContext());
+
+  if (!Delta->EvaluateAsAbsolute(Res, getAssembler()))
+    report_fatal_error("expected assembly-time absolute expression");
+  EmitFill(Res, Value, 0);
 }
 
 void MCObjectStreamer::Finish() {
diff --git a/test/MC/ELF/org.s b/test/MC/ELF/org.s
new file mode 100644 (file)
index 0000000..c073fa5
--- /dev/null
@@ -0,0 +1,13 @@
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump   | FileCheck %s
+
+        .zero 4
+foo:
+        .zero 4
+        .org foo+16
+
+// CHECK:     (('sh_name', 0x00000001) # '.text'
+// CHECK-NEXT: ('sh_type',
+// CHECK-NEXT: ('sh_flags',
+// CHECK-NEXT: ('sh_addr',
+// CHECK-NEXT: ('sh_offset'
+// CHECK-NEXT: ('sh_size', 0x00000014)