mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-30 08:24:12 +00:00
82 lines
2.5 KiB
C++
82 lines
2.5 KiB
C++
|
//===- tools/dsymutil/DebugMap.cpp - Generic debug map representation -----===//
|
||
|
//
|
||
|
// The LLVM Linker
|
||
|
//
|
||
|
// This file is distributed under the University of Illinois Open Source
|
||
|
// License. See LICENSE.TXT for details.
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
#include "DebugMap.h"
|
||
|
|
||
|
#include "llvm/ADT/iterator_range.h"
|
||
|
#include "llvm/ADT/STLExtras.h"
|
||
|
#include "llvm/Support/DataTypes.h"
|
||
|
#include "llvm/Support/Format.h"
|
||
|
#include "llvm/Support/raw_ostream.h"
|
||
|
#include <algorithm>
|
||
|
|
||
|
namespace llvm {
|
||
|
namespace dsymutil {
|
||
|
|
||
|
using namespace llvm::object;
|
||
|
|
||
|
DebugMapObject::DebugMapObject(StringRef ObjectFilename)
|
||
|
: Filename(ObjectFilename) {}
|
||
|
|
||
|
bool DebugMapObject::addSymbol(StringRef Name, uint64_t ObjectAddress,
|
||
|
uint64_t LinkedAddress) {
|
||
|
auto InsertResult = Symbols.insert(
|
||
|
std::make_pair(Name, SymbolMapping(ObjectAddress, LinkedAddress)));
|
||
|
return InsertResult.second;
|
||
|
}
|
||
|
|
||
|
void DebugMapObject::print(raw_ostream &OS) const {
|
||
|
OS << getObjectFilename() << ":\n";
|
||
|
// Sort the symbols in alphabetical order, like llvm-nm (and to get
|
||
|
// deterministic output for testing).
|
||
|
typedef std::pair<StringRef, SymbolMapping> Entry;
|
||
|
std::vector<Entry> Entries;
|
||
|
Entries.reserve(Symbols.getNumItems());
|
||
|
for (const auto &Sym : make_range(Symbols.begin(), Symbols.end()))
|
||
|
Entries.push_back(std::make_pair(Sym.getKey(), Sym.getValue()));
|
||
|
std::sort(
|
||
|
Entries.begin(), Entries.end(),
|
||
|
[](const Entry &LHS, const Entry &RHS) { return LHS.first < RHS.first; });
|
||
|
for (const auto &Sym : Entries) {
|
||
|
OS << format("\t%016" PRIx64 " => %016" PRIx64 "\t%s\n",
|
||
|
Sym.second.ObjectAddress, Sym.second.BinaryAddress,
|
||
|
Sym.first.data());
|
||
|
}
|
||
|
OS << '\n';
|
||
|
}
|
||
|
|
||
|
#ifndef NDEBUG
|
||
|
void DebugMapObject::dump() const { print(errs()); }
|
||
|
#endif
|
||
|
|
||
|
DebugMapObject &DebugMap::addDebugMapObject(StringRef ObjectFilePath) {
|
||
|
Objects.emplace_back(new DebugMapObject(ObjectFilePath));
|
||
|
return *Objects.back();
|
||
|
}
|
||
|
|
||
|
const DebugMapObject::SymbolMapping *
|
||
|
DebugMapObject::lookupSymbol(StringRef SymbolName) const {
|
||
|
StringMap<SymbolMapping>::const_iterator Sym = Symbols.find(SymbolName);
|
||
|
if (Sym == Symbols.end())
|
||
|
return nullptr;
|
||
|
return &Sym->getValue();
|
||
|
}
|
||
|
|
||
|
void DebugMap::print(raw_ostream &OS) const {
|
||
|
OS << "DEBUG MAP: object addr => executable addr\tsymbol name\n";
|
||
|
for (const auto &Obj : objects())
|
||
|
Obj->print(OS);
|
||
|
OS << "END DEBUG MAP\n";
|
||
|
}
|
||
|
|
||
|
#ifndef NDEBUG
|
||
|
void DebugMap::dump() const { print(errs()); }
|
||
|
#endif
|
||
|
}
|
||
|
}
|