1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 19:52:54 +01:00
llvm-mirror/tools/llvm-pdbdump/llvm-pdbdump.cpp
Zachary Turner 473b4aac78 Rewrite llvm-pdbdump in terms of LLVMDebugInfoPDB.
This makes llvm-pdbdump available on all platforms, although it
will currently fail to create a dumper if there is no PDB reader
implementation for the current platform.

It implements dumping of compilands and children, which is less
information than was previously available, but it has to be
rewritten from scratch using the new set of interfaces, so the
rest of the functionality will be added back in subsequent commits.

llvm-svn: 228755
2015-02-10 22:43:25 +00:00

99 lines
3.2 KiB
C++

//===- llvm-pdbdump.cpp - Dump debug info from a PDB file -------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Dumps debug information present in PDB files. This utility makes use of
// the Microsoft Windows SDK, so will not compile or run on non-Windows
// platforms.
//
//===----------------------------------------------------------------------===//
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/DebugInfo/PDB/PDB.h"
#include "llvm/DebugInfo/PDB/IPDBEnumChildren.h"
#include "llvm/DebugInfo/PDB/IPDBSession.h"
#include "llvm/DebugInfo/PDB/IPDBRawSymbol.h"
#include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
#include "llvm/DebugInfo/PDB/PDBSymbolCompiland.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ConvertUTF.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/ManagedStatic.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Process.h"
#include "llvm/Support/PrettyStackTrace.h"
#include "llvm/Support/Signals.h"
#include <Windows.h>
using namespace llvm;
namespace opts {
cl::list<std::string> InputFilenames(cl::Positional,
cl::desc("<input PDB files>"),
cl::OneOrMore);
cl::opt<bool> Compilands("compilands",
cl::desc("Display a list of compilands (e.g. object "
"files) and symbols for each one."));
cl::alias CompilandsShort("c", cl::desc("Alias for --compilands"),
cl::aliasopt(Compilands));
}
static void dumpInput(StringRef Path) {
std::unique_ptr<IPDBSession> Session(
llvm::createPDBReader(PDB_ReaderType::DIA, Path));
if (!Session) {
outs() << "Unable to create PDB reader. Check that a valid implementation";
outs() << " is available for your platform.";
return;
}
auto GlobalScope(Session->getGlobalScope());
GlobalScope->dump(outs(), 0, PDB_DumpLevel::Normal);
outs().flush();
if (opts::Compilands) {
auto Compilands = GlobalScope->findChildren(PDB_SymType::Compiland);
if (Compilands) {
while (auto Compiland = Compilands->getNext()) {
Compiland->dump(outs(), 0, PDB_DumpLevel::Normal);
}
}
}
outs().flush();
}
int main(int argc_, const char *argv_[]) {
// Print a stack trace if we signal out.
sys::PrintStackTraceOnErrorSignal();
PrettyStackTraceProgram X(argc_, argv_);
SmallVector<const char *, 256> argv;
llvm::SpecificBumpPtrAllocator<char> ArgAllocator;
std::error_code EC = llvm::sys::Process::GetArgumentVector(
argv, llvm::makeArrayRef(argv_, argc_), ArgAllocator);
if (EC) {
llvm::errs() << "error: couldn't get arguments: " << EC.message() << '\n';
return 1;
}
llvm_shutdown_obj Y; // Call llvm_shutdown() on exit.
cl::ParseCommandLineOptions(argv.size(), argv.data(), "LLVM PDB Dumper\n");
CoInitializeEx(nullptr, COINIT_MULTITHREADED);
std::for_each(opts::InputFilenames.begin(), opts::InputFilenames.end(),
dumpInput);
CoUninitialize();
return 0;
}