summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Object/Archive.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-07-10 20:14:22 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-07-10 20:14:22 +0000
commitfbcafc0793e13a51aea3865cc8bda6751056943c (patch)
tree7ddcfd4ffe6b393341bafd1ced03665950baac0c /llvm/lib/Object/Archive.cpp
parent6444653a06c0bbbaf0cbe6db7195942c3c5d3bff (diff)
downloadbcm5719-llvm-fbcafc0793e13a51aea3865cc8bda6751056943c.tar.gz
bcm5719-llvm-fbcafc0793e13a51aea3865cc8bda6751056943c.zip
Don't crash in 'llvm -s' when an archive has no symtab.
llvm-svn: 186029
Diffstat (limited to 'llvm/lib/Object/Archive.cpp')
-rw-r--r--llvm/lib/Object/Archive.cpp8
1 files changed, 7 insertions, 1 deletions
diff --git a/llvm/lib/Object/Archive.cpp b/llvm/lib/Object/Archive.cpp
index 292d50a1763..91cc4efde22 100644
--- a/llvm/lib/Object/Archive.cpp
+++ b/llvm/lib/Object/Archive.cpp
@@ -210,7 +210,7 @@ error_code Archive::Child::getAsBinary(OwningPtr<Binary> &Result) const {
}
Archive::Archive(MemoryBuffer *source, error_code &ec)
- : Binary(Binary::ID_Archive, source) {
+ : Binary(Binary::ID_Archive, source), SymbolTable(end_children()) {
// Check for sufficient magic.
if (!source || source->getBufferSize()
< (8 + sizeof(ArchiveMemberHeader)) // Smallest archive.
@@ -375,6 +375,9 @@ Archive::Symbol Archive::Symbol::getNext() const {
}
Archive::symbol_iterator Archive::begin_symbols() const {
+ if (SymbolTable == end_children())
+ return symbol_iterator(Symbol(this, 0, 0));
+
const char *buf = SymbolTable->getBuffer().begin();
if (kind() == K_GNU) {
uint32_t symbol_count = 0;
@@ -395,6 +398,9 @@ Archive::symbol_iterator Archive::begin_symbols() const {
}
Archive::symbol_iterator Archive::end_symbols() const {
+ if (SymbolTable == end_children())
+ return symbol_iterator(Symbol(this, 0, 0));
+
const char *buf = SymbolTable->getBuffer().begin();
uint32_t symbol_count = 0;
if (kind() == K_GNU) {
OpenPOWER on IntegriCloud