Implement more alias cases.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 5 Oct 2010 22:26:43 +0000 (22:26 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 5 Oct 2010 22:26:43 +0000 (22:26 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115699 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 73362583ce532f23626ed9e2554f953c5a018802..d79029106b0599c7cd296eb3d0e25c1279f458e5 100644 (file)
@@ -807,9 +807,20 @@ void ELFObjectWriterImpl::ComputeSymbolTable(MCAssembler &Asm) {
     MSD.SymbolData = it;
     MSD.StringIndex = Entry;
 
+    // FIXME: There is duplicated code with the local case.
     if (it->isCommon()) {
       MSD.SectionIndex = ELF::SHN_COMMON;
       ExternalSymbolData.push_back(MSD);
+    } else if (Symbol.isVariable()) {
+      const MCExpr *Value = Symbol.getVariableValue();
+      assert (Value->getKind() == MCExpr::SymbolRef && "Unimplemented");
+      const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr*>(Value);
+      const MCSymbol &RefSymbol = Ref->getSymbol();
+      if (RefSymbol.isDefined()) {
+        MSD.SectionIndex = SectionIndexMap.lookup(&RefSymbol.getSection());
+        assert(MSD.SectionIndex && "Invalid section index!");
+        ExternalSymbolData.push_back(MSD);
+      }
     } else if (Symbol.isUndefined()) {
       MSD.SectionIndex = ELF::SHN_UNDEF;
       // FIXME: Undefined symbols are global, but this is the first place we
index 5da8635c1f942be46a7e09e5745a1d331d655444..0f6cce1ca1fc5075a621e20725bdde314e1c6529 100644 (file)
@@ -3,6 +3,13 @@
 foo:
 bar = foo
 
+        .globl foo2
+foo2 = bar2
+
+foo3:
+       .globl  bar3
+bar3 = foo3
+
 // CHECK:       # Symbol 1
 // CHECK-NEXT:  (('st_name', 5) # 'bar'
 // CHECK-NEXT:   ('st_bind', 0)
@@ -20,3 +27,33 @@ bar = foo
 // CHECK-NEXT:   ('st_shndx', 1)
 // CHECK-NEXT:   ('st_value', 0)
 // CHECK-NEXT:   ('st_size', 0)
+// CHECK:       # Symbol 3
+// CHECK-NEXT:  (('st_name', 9) # 'foo3'
+// CHECK-NEXT:   ('st_bind', 0)
+// CHECK-NEXT:   ('st_type', 0)
+// CHECK-NEXT:   ('st_other', 0)
+// CHECK-NEXT:   ('st_shndx', 1)
+// CHECK-NEXT:   ('st_value', 0)
+// CHECK-NEXT:   ('st_size', 0)
+// CHECK:       # Symbol 4
+// CHECK-NEXT:  (('st_name', 0) # ''
+// CHECK:       # Symbol 5
+// CHECK-NEXT:  (('st_name', 0) # ''
+// CHECK:       # Symbol 6
+// CHECK-NEXT:  (('st_name', 0) # ''
+// CHECK:       # Symbol 7
+// CHECK-NEXT:  (('st_name', 24) # 'bar3'
+// CHECK-NEXT:   ('st_bind', 1)
+// CHECK-NEXT:   ('st_type', 0)
+// CHECK-NEXT:   ('st_other', 0)
+// CHECK-NEXT:   ('st_shndx', 1)
+// CHECK-NEXT:   ('st_value', 0)
+// CHECK-NEXT:   ('st_size', 0)
+// CHECK:       # Symbol 8
+// CHECK-NEXT:  (('st_name', 19) # 'bar2'
+// CHECK-NEXT:   ('st_bind', 1)
+// CHECK-NEXT:   ('st_type', 0)
+// CHECK-NEXT:   ('st_other', 0)
+// CHECK-NEXT:   ('st_shndx', 0)
+// CHECK-NEXT:   ('st_value', 0)
+// CHECK-NEXT:   ('st_size', 0)