summaryrefslogtreecommitdiffstats
path: root/tools/llvm-nm/llvm-nm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/llvm-nm/llvm-nm.cpp')
-rw-r--r--tools/llvm-nm/llvm-nm.cpp40
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";
OpenPOWER on IntegriCloud