add bitcode reading support to llvm-nm

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36847 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner
2007-05-06 05:36:18 +00:00
parent f283a5e53a
commit 4d5aad2d99
2 changed files with 32 additions and 23 deletions

View File

@@ -9,7 +9,6 @@
LEVEL = ../..
TOOLNAME = llvm-nm
LINK_COMPONENTS = archive bcreader
REQUIRES_EH := 1
LINK_COMPONENTS = archive bcreader bitreader
include $(LEVEL)/Makefile.common

View File

@@ -17,19 +17,22 @@
//===----------------------------------------------------------------------===//
#include "llvm/Module.h"
#include "llvm/Bitcode/ReaderWriter.h"
#include "llvm/Bytecode/Reader.h"
#include "llvm/Bytecode/Archive.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/System/Signals.h"
#include <algorithm>
#include <cctype>
#include <cerrno>
#include <cstring>
#include <iostream>
using namespace llvm;
cl::opt<bool> Bitcode("bitcode");
namespace {
enum OutputFormatTy { bsd, sysv, posix };
cl::opt<OutputFormatTy>
@@ -132,6 +135,20 @@ static void DumpSymbolNamesFromFile(std::string &Filename) {
std::cerr << ToolName << ": " << Filename << ": " << ErrorMessage << "\n";
return;
}
} else if (aPath.isBitcodeFile()) {
std::auto_ptr<MemoryBuffer> Buffer(
MemoryBuffer::getFileOrSTDIN(&Filename[0], Filename.size()));
Module *Result = 0;
if (Buffer.get())
Result = ParseBitcodeFile(Buffer.get(), &ErrorMessage);
if (Result)
DumpSymbolNamesFromModule(Result);
else {
std::cerr << ToolName << ": " << Filename << ": " << ErrorMessage << "\n";
return;
}
} else if (aPath.isArchive()) {
std::string ErrMsg;
Archive* archive = Archive::OpenAndLoad(sys::Path(Filename), &ErrorMessage);
@@ -153,7 +170,6 @@ static void DumpSymbolNamesFromFile(std::string &Filename) {
int main(int argc, char **argv) {
llvm_shutdown_obj X; // Call llvm_shutdown() on exit.
try {
cl::ParseCommandLineOptions(argc, argv, " llvm symbol table dumper\n");
sys::PrintStackTraceOnErrorSignal();
@@ -170,10 +186,4 @@ int main(int argc, char **argv) {
std::for_each(InputFilenames.begin(), InputFilenames.end(),
DumpSymbolNamesFromFile);
return 0;
} catch (const std::string& msg) {
std::cerr << argv[0] << ": " << msg << "\n";
} catch (...) {
std::cerr << argv[0] << ": Unexpected unknown exception occurred.\n";
}
return 1;
}