summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2015-08-11 17:57:05 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2015-08-11 17:57:05 +0000
commit76e24ea955b6c4c2b7d49b461dd3e77cd5146747 (patch)
tree90d4c18db00d37791a36eb6044dd4a091f4792bb
parent791e9f9c5928fad353d214baddaa87816b21daa7 (diff)
downloadbcm5719-llvm-76e24ea955b6c4c2b7d49b461dd3e77cd5146747.tar.gz
bcm5719-llvm-76e24ea955b6c4c2b7d49b461dd3e77cd5146747.zip
Add support for weak undefined symbols.
llvm-svn: 244640
-rw-r--r--lld/ELF/InputFiles.cpp3
-rw-r--r--lld/ELF/Symbols.cpp1
-rw-r--r--lld/ELF/Symbols.h12
-rw-r--r--lld/test/elf2/resolution.s3
4 files changed, 17 insertions, 2 deletions
diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp
index 38d9b7ab4c8..0c78b194c51 100644
--- a/lld/ELF/InputFiles.cpp
+++ b/lld/ELF/InputFiles.cpp
@@ -83,7 +83,8 @@ SymbolBody *elf2::ObjectFile<ELFT>::createSymbolBody(StringRef StringTable,
return new (Alloc) Undefined(Name);
return new (Alloc) DefinedRegular(Name);
case STB_WEAK:
- // FIXME: add support for weak undefined
+ if (Sym->isUndefined())
+ return new (Alloc) UndefinedWeak(Name);
return new (Alloc) DefinedWeak(Name);
}
}
diff --git a/lld/ELF/Symbols.cpp b/lld/ELF/Symbols.cpp
index a2cee7f777f..de74e0d4166 100644
--- a/lld/ELF/Symbols.cpp
+++ b/lld/ELF/Symbols.cpp
@@ -42,6 +42,7 @@ int SymbolBody::compare(SymbolBody *Other) {
return 0;
case DefinedWeakKind:
case UndefinedKind:
+ case UndefinedWeakKind:
return 1;
}
llvm_unreachable("unknown symbol kind");
diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h
index 50143660e17..1a60455a0c7 100644
--- a/lld/ELF/Symbols.h
+++ b/lld/ELF/Symbols.h
@@ -39,7 +39,8 @@ public:
DefinedRegularKind = 0,
DefinedWeakKind = 1,
DefinedLast = 1,
- UndefinedKind = 2
+ UndefinedWeakKind = 2,
+ UndefinedKind = 3
};
Kind kind() const { return static_cast<Kind>(SymbolKind); }
@@ -112,6 +113,15 @@ public:
}
};
+class UndefinedWeak : public SymbolBody {
+public:
+ explicit UndefinedWeak(StringRef N) : SymbolBody(UndefinedWeakKind, N) {}
+
+ static bool classof(const SymbolBody *S) {
+ return S->kind() == UndefinedWeakKind;
+ }
+};
+
} // namespace elf2
} // namespace lld
diff --git a/lld/test/elf2/resolution.s b/lld/test/elf2/resolution.s
index a49c7d5a1a5..b78cdb16a5c 100644
--- a/lld/test/elf2/resolution.s
+++ b/lld/test/elf2/resolution.s
@@ -13,3 +13,6 @@ local:
foo:
.long bar
+
+.weak zed
+.long zed
OpenPOWER on IntegriCloud