Add support for assigning to . in AsmParser.
authorAnders Waldenborg <anders@0x63.nu>
Mon, 17 Feb 2014 20:48:32 +0000 (20:48 +0000)
committerAnders Waldenborg <anders@0x63.nu>
Mon, 17 Feb 2014 20:48:32 +0000 (20:48 +0000)
This is implemented by handling assignments to the '.' pseudo symbol
as ".org" directives.

Differential Revision: http://llvm-reviews.chandlerc.com/D2625

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

lib/MC/MCParser/AsmParser.cpp
test/MC/AsmParser/dot-symbol-assignment-backwards.s [new file with mode: 0644]
test/MC/AsmParser/dot-symbol-assignment.s [new file with mode: 0644]
test/MC/AsmParser/dot-symbol-non-absolute.s [new file with mode: 0644]
test/MC/AsmParser/dot-symbol.s
test/MC/ELF/dot-symbol-assignment.s [new file with mode: 0644]

index 4f7734153ace9bda764c05865e61d0ddfe1fd59a..107ae56e91f07f6578e2bade9a13c53412bee31b 100644 (file)
@@ -2119,12 +2119,6 @@ bool AsmParser::parseAssignment(StringRef Name, bool allow_redef,
   if (Lexer.isNot(AsmToken::EndOfStatement))
     return TokError("unexpected token in assignment");
 
-  // Error on assignment to '.'.
-  if (Name == ".") {
-    return Error(EqualLoc, ("assignment to pseudo-symbol '.' is unsupported "
-                            "(use '.space' or '.org').)"));
-  }
-
   // Eat the end of statement marker.
   Lex();
 
@@ -2152,11 +2146,15 @@ bool AsmParser::parseAssignment(StringRef Name, bool allow_redef,
 
     // Don't count these checks as uses.
     Sym->setUsed(false);
+  } else if (Name == ".") {
+    if (Out.EmitValueToOffset(Value, 0)) {
+      Error(EqualLoc, "expected absolute expression");
+      eatToEndOfStatement();
+    }
+    return false;
   } else
     Sym = getContext().GetOrCreateSymbol(Name);
 
-  // FIXME: Handle '.'.
-
   // Do the assignment.
   Out.EmitAssignment(Sym, Value);
   if (NoDeadStrip)
diff --git a/test/MC/AsmParser/dot-symbol-assignment-backwards.s b/test/MC/AsmParser/dot-symbol-assignment-backwards.s
new file mode 100644 (file)
index 0000000..2619788
--- /dev/null
@@ -0,0 +1,12 @@
+# RUN: not llvm-mc -filetype=obj -triple i386-unknown-unknown %s 2> %t
+# RUN: FileCheck -input-file %t %s
+
+. = 0x10
+       .byte 1
+
+. = . + 10
+       .byte 2
+
+# CHECK: LLVM ERROR: invalid .org offset '24' (at offset '28')
+. = 0x18
+       .byte 3
diff --git a/test/MC/AsmParser/dot-symbol-assignment.s b/test/MC/AsmParser/dot-symbol-assignment.s
new file mode 100644 (file)
index 0000000..65651d7
--- /dev/null
@@ -0,0 +1,31 @@
+# RUN: llvm-mc -triple i386-unknown-unknown %s | FileCheck %s
+
+       .extern start
+
+# CHECK: .org 1024, 0
+. = 0x400
+       lgdt    0x400 + 0x100
+
+       ljmpl   $0x08, $(0x400 + 0x150)
+
+
+# CHECK: .org 1280, 0
+. = 0x400 + 0x100
+       .word   (3*8)-1
+       .quad   (0x400 + 0x110)
+
+# CHECK: .org 1296, 0
+. = 0x400 + 0x110
+       .quad   0x0
+       .quad   0x0020980000000000
+       .quad   0x0000900000000000
+
+       .code64
+
+# CHECK: .org 1360, 0
+. = 0x400 + 0x150
+       movabsq $start, %rcx
+       jmp     *%rcx
+
+
+. = 0x300
diff --git a/test/MC/AsmParser/dot-symbol-non-absolute.s b/test/MC/AsmParser/dot-symbol-non-absolute.s
new file mode 100644 (file)
index 0000000..7342365
--- /dev/null
@@ -0,0 +1,9 @@
+# RUN: not llvm-mc -filetype=obj -triple i386-unknown-unknown %s 2> %t
+# RUN: FileCheck -input-file %t %s
+
+
+       .extern foo
+
+# CHECK: error: expected absolute expression
+. = foo + 10
+       .byte 1
index 4a38a4053242082be52939e36be547836ea919b4..4bae3231868c97339bf730719ef830021db6283e 100644 (file)
@@ -1,12 +1,9 @@
 # Historically 'as' treats '.' as a reference to the current location in
-# arbitrary contects. We don't support this in general.
+# arbitrary contexts. We don't support this in general.
 
 # RUN: not llvm-mc -triple i386-unknown-unknown %s 2> %t
 # RUN: FileCheck -input-file %t %s
 
-# CHECK: assignment to pseudo-symbol '.' is unsupported (use '.space' or '.org').
-. = . + 8
-
 # CHECK: invalid use of pseudo-symbol '.' as a label
 .:
         .long 0
diff --git a/test/MC/ELF/dot-symbol-assignment.s b/test/MC/ELF/dot-symbol-assignment.s
new file mode 100644 (file)
index 0000000..00fe205
--- /dev/null
@@ -0,0 +1,22 @@
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | llvm-readobj -sections -section-data | FileCheck %s
+
+one:
+       .quad 0xffffffffffffffff
+
+. = . + 16
+two:
+       .quad 0xeeeeeeeeeeeeeeee
+
+. = 0x20
+three:
+       .quad 0xdddddddddddddddd
+
+// CHECK:        Section {
+// CHECK:          Name: .text
+// CHECK-NEXT:     Type:
+// CHECK-NEXT:     Flags [
+// CHECK:          SectionData (
+// CHECK-NEXT:     0000: FFFFFFFF FFFFFFFF 00000000 00000000
+// CHECK-NEXT:     0010: 00000000 00000000 EEEEEEEE EEEEEEEE
+// CHECK-NEXT:     0020: DDDDDDDD DDDDDDDD
+// CHECK-NEXT:     )