Be more strict on when we produce an undefined reference. In gas a file with
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 29 Oct 2010 23:09:31 +0000 (23:09 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 29 Oct 2010 23:09:31 +0000 (23:09 +0000)
just

.type   foo,@object

will produce an undefined reference to foo. On the other hand, a file with
just

.weakref bar, foo

will not. It is somewhat hard to support both in MC since both statements
should create the symbols. It should be possible if we really need to by
adding to the flags, but hopefully that is not necessary.

With this patch we do not produce a undefined reference in any of those cases.
The assembly file needs an actual use for the undefined reference to be
present.

This is in preparation for a patch implementing .weakref.

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

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

index dbe0dd870f69da0ad0f0f1802ffb5edceb22fd31..2fca31104a8914b02cec18703a63d8d8641387ef 100644 (file)
@@ -868,8 +868,11 @@ static bool isInSymtab(const MCAssembler &Asm, const MCSymbolData &Data,
 
   const MCSymbol &Symbol = Data.getSymbol();
 
+  if (Symbol.getName() == "_GLOBAL_OFFSET_TABLE_")
+    return true;
+
   const MCSymbol &A = AliasedSymbol(Symbol);
-  if (&A != &Symbol && A.isUndefined())
+  if (!A.isVariable() && A.isUndefined() && !Data.isCommon())
     return false;
 
   if (!Asm.isSymbolLinkerVisible(Symbol) && !Symbol.isUndefined())
index 84b558822dae00eb0f850531e3b869711677faf0..98ef50b50f5923c6e4817b77dcf24409694c3bb8 100644 (file)
@@ -15,6 +15,7 @@ bar3 = foo3
 foo4:
 bar4 = foo4
 
+        .long foo2
 // CHECK:       # Symbol 0x00000001
 // CHECK-NEXT:  (('st_name', 0x00000005) # 'bar'
 // CHECK-NEXT:   ('st_bind', 0x00000000)
index 7ad13361b7e24d3a95f4162f1120e94d61b1a3c3..ceb9486c302033258752019c809ef772ece1d5d0 100644 (file)
@@ -6,4 +6,5 @@
 // CHECK-NEXT:    (('st_name', 0x00000001) # 'foo'
 // CHECK-NEXT:     ('st_bind', 0x00000001)
 
-       .size   foo, .Lbar-foo
+       .size foo, .Lbar-foo
+        .long foo
index 01aeac664d6364ef6e971ac27e0e96d3832d53d6..cdef5e473931760ce0a53204b31a8df2fa283540 100644 (file)
@@ -10,6 +10,7 @@
 
        .type   .Lsym5,@object
         .type   sym6,@object
+        .long sym6
 
        .section        .rodata.str1.1,"aMS",@progbits,1
 .Lsym7: