diff options
author | dim <dim@FreeBSD.org> | 2011-07-17 15:36:56 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2011-07-17 15:36:56 +0000 |
commit | 1176aa52646fe641a4243a246aa7f960c708a274 (patch) | |
tree | c8086addb211fa670a9d2b1038d8c2e453229755 /tools/llvm-nm/llvm-nm.cpp | |
parent | ece02cd5829cea836e9365b0845a8ef042d17b0a (diff) | |
download | FreeBSD-src-1176aa52646fe641a4243a246aa7f960c708a274.zip FreeBSD-src-1176aa52646fe641a4243a246aa7f960c708a274.tar.gz |
Vendor import of llvm trunk r135360:
http://llvm.org/svn/llvm-project/llvm/trunk@135360
Diffstat (limited to 'tools/llvm-nm/llvm-nm.cpp')
-rw-r--r-- | tools/llvm-nm/llvm-nm.cpp | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index 1afa503..014cb29 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -143,6 +143,14 @@ namespace { StringRef CurrentFilename; typedef std::vector<NMSymbol> SymbolListT; SymbolListT SymbolList; + + bool error(error_code ec) { + if (!ec) return false; + + outs() << ToolName << ": error reading file: " << ec.message() << ".\n"; + outs().flush(); + return true; + } } static void SortAndPrintSymbolList() { @@ -261,23 +269,29 @@ static void DumpSymbolNamesFromModule(Module *M) { } static void DumpSymbolNamesFromObject(ObjectFile *obj) { + error_code ec; for (ObjectFile::symbol_iterator i = obj->begin_symbols(), - e = obj->end_symbols(); i != e; ++i) { - if (!DebugSyms && i->isInternal()) + e = obj->end_symbols(); + i != e; i.increment(ec)) { + if (error(ec)) break; + bool internal; + if (error(i->isInternal(internal))) break; + if (!DebugSyms && internal) continue; NMSymbol s; s.Size = object::UnknownAddressOrSize; s.Address = object::UnknownAddressOrSize; - if (PrintSize || SizeSort) - s.Size = i->getSize(); + if (PrintSize || SizeSort) { + if (error(i->getSize(s.Size))) break; + } if (PrintAddress) - s.Address = i->getAddress(); - s.TypeChar = i->getNMTypeChar(); - s.Name = i->getName(); + if (error(i->getAddress(s.Address))) break; + if (error(i->getNMTypeChar(s.TypeChar))) break; + if (error(i->getName(s.Name))) break; SymbolList.push_back(s); } - CurrentFilename = obj->getFilename(); + CurrentFilename = obj->getFileName(); SortAndPrintSymbolList(); } @@ -317,13 +331,13 @@ static void DumpSymbolNamesFromFile(std::string &Filename) { MultipleFiles = true; std::for_each (Modules.begin(), Modules.end(), DumpSymbolNamesFromModule); } else if (aPath.isObjectFile()) { - std::auto_ptr<ObjectFile> obj(ObjectFile::createObjectFile(aPath.str())); - if (!obj.get()) { - errs() << ToolName << ": " << Filename << ": " - << "Failed to open object file\n"; + OwningPtr<Binary> obj; + if (error_code ec = object::createBinary(aPath.str(), obj)) { + errs() << ToolName << ": " << Filename << ": " << ec.message() << ".\n"; return; } - DumpSymbolNamesFromObject(obj.get()); + if (object::ObjectFile *o = dyn_cast<ObjectFile>(obj.get())) + DumpSymbolNamesFromObject(o); } else { errs() << ToolName << ": " << Filename << ": " << "unrecognizable file type\n"; |