aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2010-10-29 23:09:31 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2010-10-29 23:09:31 +0000
commitd179886f0595eb3564a9edfdfff79def130d89cc (patch)
tree17afffb2eb0e14b45eb9436e6de44bfc48e1e6b5
parente836e5f17485bd884442d7188abeedf6e0b608ff (diff)
Be more strict on when we produce an undefined reference. In gas a file with
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
-rw-r--r--lib/MC/ELFObjectWriter.cpp5
-rw-r--r--test/MC/ELF/alias.s1
-rw-r--r--test/MC/ELF/size.s3
-rw-r--r--test/MC/ELF/undef.s1
4 files changed, 8 insertions, 2 deletions
diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp
index dbe0dd870f..2fca31104a 100644
--- a/lib/MC/ELFObjectWriter.cpp
+++ b/lib/MC/ELFObjectWriter.cpp
@@ -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())
diff --git a/test/MC/ELF/alias.s b/test/MC/ELF/alias.s
index 84b558822d..98ef50b50f 100644
--- a/test/MC/ELF/alias.s
+++ b/test/MC/ELF/alias.s
@@ -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)
diff --git a/test/MC/ELF/size.s b/test/MC/ELF/size.s
index 7ad13361b7..ceb9486c30 100644
--- a/test/MC/ELF/size.s
+++ b/test/MC/ELF/size.s
@@ -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
diff --git a/test/MC/ELF/undef.s b/test/MC/ELF/undef.s
index 01aeac664d..cdef5e4739 100644
--- a/test/MC/ELF/undef.s
+++ b/test/MC/ELF/undef.s
@@ -10,6 +10,7 @@
.type .Lsym5,@object
.type sym6,@object
+ .long sym6
.section .rodata.str1.1,"aMS",@progbits,1
.Lsym7: