Set the value of absolute symbols.
authorRoman Divacky <rdivacky@freebsd.org>
Mon, 20 Dec 2010 21:14:39 +0000 (21:14 +0000)
committerRoman Divacky <rdivacky@freebsd.org>
Mon, 20 Dec 2010 21:14:39 +0000 (21:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@122268 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/ELFObjectWriter.cpp
test/MC/ELF/set.s

index 1bb47751ed4d7425bb31979529bf3a2b56835f11..bb523cefedcc6781cdcb3dc06978ef3a53a697ee 100644 (file)
@@ -518,6 +518,15 @@ static uint64_t SymbolValue(MCSymbolData &Data, const MCAsmLayout &Layout) {
     return Data.getCommonAlignment();
 
   const MCSymbol &Symbol = Data.getSymbol();
+
+  if (Symbol.isAbsolute() && Symbol.isVariable()) {
+    if (const MCExpr *Value = Symbol.getVariableValue()) {
+      int64_t IntValue;
+      if (Value->EvaluateAsAbsolute(IntValue, Layout))
+       return (uint64_t)IntValue;
+    }
+  }
+
   if (!Symbol.isInSection())
     return 0;
 
index ddc7c5bb11175f28fec15e264eaaf6785083c434..69d6c910636f87b785186b0d96fd5c1bccc684c8 100644 (file)
@@ -1,5 +1,18 @@
 // RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump  --dump-section-data | FileCheck  %s
 
+// Test that we emit the correct value.
+
+.set kernbase,0xffffffff80000000
+
+// CHECK:         (('st_name', 0x00000001) # 'kernbase'
+// CHECK-NEXT:     ('st_bind', 0x00000000)
+// CHECK-NEXT:     ('st_type', 0x00000000)
+// CHECK-NEXT:     ('st_other', 0x00000000)
+// CHECK-NEXT:     ('st_shndx', 0x0000fff1)
+// CHECK-NEXT:     ('st_value', 0xffffffff80000000)
+// CHECK-NEXT:     ('st_size', 0x0000000000000000)
+// CHECK-NEXT:    ),
+
 // Test that we accept .set of a symbol after it has been used in a statement.
 
         jmp foo
@@ -11,7 +24,7 @@
        .set    foo2,bar2
 
 // Test that there is an undefined reference to bar
-// CHECK:      (('st_name', 0x00000001) # 'bar'
+// CHECK:      (('st_name', 0x0000000a) # 'bar'
 // CHECK-NEXT:  ('st_bind', 0x00000001)
 // CHECK-NEXT:  ('st_type', 0x00000000)
 // CHECK-NEXT:  ('st_other', 0x00000000)